2009年12月19日

Javaで日数の計算結果がおかしい?

昨日Javaで2つの日付を指定して日数を計算させるコードを書いていたらちょっとおかしな現象に遭遇。
下記のコードで2010/1/29から2010/2/1までの日数を計算させると日数=0日になってしまう。

--------
import java.util.Calendar;
import java.util.GregorianCalendar;

public class Main {
        public static void main(String[] args) {
                useGregorianCalendar(2010, 1, 29, 2010, 2, 1);
        }
        static void useGregorianCalendar(int year_s, int month_s, int day_s,
                        int year_e, int month_e, int day_e)
        {
                Calendar start = new GregorianCalendar(year_s, month_s, day_s);
                Calendar end = new GregorianCalendar(year_e, month_e, day_e);
                System.out.println(start);
                System.out.println(end);
                long day = (end.getTimeInMillis() -
                                start.getTimeInMillis()) / 1000 / 60 / 60 / 24;
                System.out.println("日数 = " + day + "日");
        }
}
--------
実行結果
java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Tokyo",offset=32400000,dstSavings=0,useDaylight=false,transitions=10,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2010,MONTH=1,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=29,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=?,ZONE_OFFSET=?,DST_OFFSET=?]
java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Tokyo",offset=32400000,dstSavings=0,useDaylight=false,transitions=10,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2010,MONTH=2,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=1,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=?,ZONE_OFFSET=?,DST_OFFSET=?]
日数 = 0日
--------


そこで
++C++;// 未確認飛行 C 「経過日数の計算」
を参考にさせてもらって下記のように変更してみたところ日数=3という計算結果になった。

--------
import java.util.Calendar;
import java.util.GregorianCalendar;

public class Main {
        public static void main(String[] args) {
                System.out.println("日数 = " + (getDays(2010, 2, 1) - getDays(2010, 1, 29)) + "日");
        }
        //http://ufcpp.net/study/algorithm/o_days.html より
        static int getDays(int y, int m, int d)
        {
         // 1・2月 → 前年の13・14月
         if (m <= 2)
         {
         --y;
         m += 12;
         }
         int dy = 365 * (y - 1); // 経過年数×365日
         int c = y / 100;
         int dl = (y >> 2) - c + (c >> 2); // うるう年分
         int dm = (m * 979 - 1033) >> 5; // 1月1日から m 月1日までの日数
         return dy + dl + dm + d - 1;
        }
}
--------
実行結果
日数 = 3日
--------

計算結果がおかしいのはjava.util.GregorianCalendarでgetTimeInMillis()の結果が同じ値を返しているためらしい。
Calendar start = new GregorianCalendar(2010, 1, 29);
Calendar end = new GregorianCalendar(2010, 2, 1);
System.out.println("start.getTimeInMillis = " + start.getTimeInMillis());
System.out.println("end.getTimeInMillis = " + end.getTimeInMillis());
上記の計算結果が次のように同じ値を返している。
start.getTimeInMillis = 1267369200000
end.getTimeInMillis = 1267369200000

なんでかな?

2009年12月17日

OmmWriterが気になるのだが....

フルスクリーンテキストエディタOmmWriter の記事がすごく気になっていた。
<OmmWriter関連記事>
心理ハック 他のものを何も見ない
霊感の世界にいざなうエディタ、Ommwriter
書き物に没頭できるようなシンプルな見た目とBGMまで用意してくれたフルスクリーンテキストエディタ『OmmWriter』
Ommwriter

なんだかすごくカッコいい。
それに心理学的にも集中力が上がるらしい。
試してみたいが私のMacは10.4.11なので無理。
(Ommwriterは10.5以降に対応)
そうなると、どうしてもフルスクリーンテキストエディタを試してみたくなってJDarkRoomを試してみた。
(参考にしたサイト)
シンプルでフルスクリーン表示できるテキストエディタ『JDarkRoom』

WriteRoomも試したがこちらはシェアウェアで起動時に毎回登録の確認が出るみたい。
今後の使用頻度もまだわからないのでとりあえずJDarkRoomで行こうと決めた。

なかなか良いのだけど残念な点はショートカットキーが少ない。
私はよくEmacsを使うのでできればEmacsのCtlr+a(行頭)、d(del)、e(行末)、h(BackSpase)などが使えるとうれしいのだけど、JDarkRoomにはショートカットキーが無くてファンクションキーによる操作のみ。
・・・・なんてことを書きながら、ふとMacジャーナル5のウインドウを見ると

全画面モードあったよ。orz
情けない・・・完全に忘れてました。
Macジャーナル5に全画面モードがあったことを。
そしてそれが当時Macジャーナル5購入を決定した要因の一つでありました。
こっちはCtlr+a、d、e、hなどのショートカットが使えて、それに加えてCommand+a(すべてを選択)、f(文字列検索)、g(次を選択)なども使える。しかもCommand+dで現在日時を挿入してくれる。
これはいいっすね!(何を今更)
必要なときに全画面にできるという機能が選択肢として用意されているのが特にいいです。
私はネットで調べながらテキストを打つこともあるので常に全画面だとわずかにストレスを感じるときがあります。
もちろんCommand+Tabでアプリを切り替えれば済む話ではありますが・・・・。
なんというか、「調べ物中心でちょこっとメモしたい」という場合と、「がっつり書き物する」というときとで利用するツールを使い分けるのもイマイチだなと思ったりするわけです。
てことで、しばらくはテキストの打ち込みはMacジャーナル5の全画面モードでやっていきます。

2009年8月4日

RD-X4強制リセットでデータ真っ白

自宅で使っているRD-X4がフリーズしてHDDが真っ白になった。。。。
頭も真っ白。
長男の2才の記録3ヶ月分(2時間分くらい)くらいが飛んでしまった。
あ〜一番かわいいときの3ヶ月が〜
うわああああん!!。・゚・(*ノД`*)・゚・。

DVDビデオでVRモードで撮影
 ↓
RD-X4にダビング
 ↓
記録用に編集してDVD焼く
 ↓
DVDビデオ用のDVDはフォーマットして再利用

というサイクルでやっていたのだが、うっかり記録用のDVDに焼く前にオリジナルをフォーマットしてしまったので、あわてて記録用に編集して焼こうとしていたらおかしくなった。

データ消失のダメージは最近感じたことがないくらいの挫折感だった。
とりあえずオリジナルの8cmDVD-RWはフォーマットしないで永久保存することにした。
でも撮りっぱなしだとものすごい量になるから保存も大変なんだよな。。。。
それにDVDだって寿命はあるらしいので、数十本保管していて10年後にはその中の数本は寿命がきて再生できないなんてことがあるかもしれないと思うと不安だし。
メディアの寿命はこうして推定する DVDは百年もつか?(1):DVDは百年もつか?
CDやDVDにも寿命がある!?上手に保管しよう! - [オーディオ・ビジュアル]All About

で、もうデータ消失は嫌なので念には念を入れて多少画質が落ちてもいいからバックアップとしてPCに落としておくことにした。
PC側は本体のHDDに保管したものを外付けのHDDにもバックアップしているのでまあ安心。

ところが・・・・VRモードでDVD-RWに焼いた状態だとPCではリッピングできない。。。。
どうやらファイナライズしないとPCで読める状態にはならないらしい。
でもVRモードで焼いたらファイナライズできないし。。。
もうなんだかわからなくなったので面倒だけど次の方法でPCに落とすことにした。
DVD-RかRWにレート変換ダビング
 ↓
ファイナライズ
 ↓
PC側でリッピング

PC(Mac)側ではHandbreakでリッピングできる。
Mac The ripperではリッピングできなかった。

あ〜はやくBru-Ray買いたいな〜。

2009年7月29日

MacbookのCPU熱暴走対策

自宅で使っているMacbookなんですが、チョット重い処理をさせるとCPUをフルに使ってすぐ熱暴走します。
WindowsのノートPCではこんなに頻繁に熱暴走するのを見たことありません。
たとえば、久しぶりに
sudo port upgrade installed
をやったら十分くらいで熱暴走します。

すでにCPUファンコントロールはインストールしていて、ファンは常時Max.6200rpmにしています。
音がうるさいんですが背に腹は代えられません。
今普通にブログを書いてるだけでCPU温度は70℃前後です。
たぶん75-82℃くらいで暴走するでしょう。

以前にも熱暴走対策を調べたのですが、下記のサイトのように外付けの冷却グッズを使うくらいしか対策と呼べるものはありませんでした。
【コラム】OS X ハッキング! (240) あまりに暑いのでMacBookの熱対策を練り直す | パソコン | マイコミジャーナル
熱暴走(フリーズ状態)しなくなった。

机に据え付けで使うなら冷却グッズもいいんですが、机にはPowerMacG4が設置してあるので机でやるならそっちを使えば良いわけです。
でも最近はキッチンなどで子供の相手をしながらチョット使うということが多くなってきました。
普段の使用ではファンがうるさいだけで一応使えるんですが、たまにふと思いついて何かやろうとすると暴走する、という状態なので冷却グッズをいつも装備するのは面倒です。

CoolBookControllerを入れてCPU電圧を下げてクロックダウンさせるしかないのかなと思っていたのですが、先日「macbook cpu 抑制」とかで調べていたら何件か「バッテリー」関係の記事がヒットしているのに気が付きました。

なるほど・・・・そんじゃあとりあえず
「Macbookのバッテリを外してACアダプタのみで使用する。」
というのを試してみるか。
たとえCPUが4割抑制されたって暴走しないほうがいいに決まってます。
・・・・でもそれじゃあやっぱり家の中で持ち歩いて使うのは面倒orz
うっかりACアダプタを抜いてしまうと困るし、移動するときにいちいちシャットダウンしないといけないし・・・・
やっぱり、そのうちゆっくりCoolBookについて調べて購入する方向で考えよう。
またはMacOSXが熱暴走対策されるのを待つか。。。。

 


2009年7月23日

GoogleNotebook 代替サービスを探す

もう世間の話題に上がってだいぶ経ちますが、
米GoogleのリストラによりGoogle Notebookは開発終了という話がありましたね。
私はGoogle NotebookはGoogleのサービスの中では一番愛用していたサービスだったので残念です。

Stopping development on Google Notebook
米Google、「Google Video」のアップロード機能など6サービスを終了

とりあえず現行ユーザーへのサービスは継続されるらしいので私は今まで放置してたんですが、「そろそろネットでも定番サービスの話題が固まってきそうだから代替案を考えてみるかな」ということで調べてみました。

(1)Evernote
(2)Zoho Notebook
(3)紙copi NET
(4)Google推奨代替サービス
SearchWiki、Google Docs、Gmail、Google Bookmarks

ちょっとここで私がGoogleNotebookを好んで使っていた理由をまとめておくと、
•Webサイトの頁の一部をクリップして保存しておける。
•すぐに書き始められるようになっている。
•セクションで複数のノートをグルーピングできる。
というわけで(4)のGoogle推奨代替サービスはどれもピンと来なかったので評価保留です。

紙copiはソフトウェアが必要なので、いつでもどこでも同じ環境で操作できるようにするには多少手間がかかりそうなので今回は検討から除外しました。
Zohoはずいぶんいろいろなサービスがあって途中でわからなくなってしまいました。><
全体的にEvernoteの無料サービスが評判が良さそうです。
そんなわけでEvernoteとZohoに登録してみました。

■Evernoteを使ってみた
Evernoteに登録して使ってみました。
FirefoxのアドオンはちょっとイマイチでScribeFire Blog Editorで投稿の編集中にうっかりEvernoteのプラグインを起動するとScribeFireの編集画面上にブランクのガジェットが配置されてしまって投稿を保存できなくなります。

Windows PCではFirefoxのアドオンは動作するけれど以下のエラーが出ます。
Desktop Versionをインストールしておかないとないといけないのかもしれません。
動作には支障は無いようです。

Failed to load XPCOM component: C:\Documents and Settings\[XXXX]\Application Data\Mozilla\Firefox\Profiles\adqlskl1.default\extensions\{E0B8C461-F8FB-49b4-8373-FE32E9252800}\platform\WINNT_x86-msvc\components\enclip.dll

Failed to load XPCOM component: C:\Documents and Settings\[XXXX]\Application Data\Mozilla\Firefox\Profiles\adqlskl1.default\extensions\{E0B8C461-F8FB-49b4-8373-FE32E9252800}\platform\WINNT_x86-msvc\components\ENImaDLL.dll

Failed to load XPCOM component: C:\Documents and Settings\[XXXX]\Application Data\Mozilla\Firefox\Profiles\adqlskl1.default\extensions\{E0B8C461-F8FB-49b4-8373-FE32E9252800}\platform\WINNT_x86-msvc\components\entbcompose.dll

Zoho Notebookを使ってみた
Firefoxのアドオンが動かない。。。。というかアドオンのアイコンが出ない。。。
Webのページ上に付箋紙のようにぺたぺたノートを貼付けたり、GoogleNotebookと同じようなノートを追加したりできます。
う〜〜ん。。。多機能ですごいんだけどなんというか、操作が混乱する。。。。

今のところ自分の評価ではEvernoteが一番良さそうです。
また使いやすさを優先するならそのうち紙copiも評価してみたいです。

Prismを使って紙copi Netをクライアントアプリケーションのように使おう - Mac編


参考にしたサイト
Google Notebookの代替となるサービスは? | Unofficial DB2 BLOG
Move Your Web Clippings Out of Google Notebook
「Google ノートブック」がなくなったらどうしよう!
終わってしまうgoogle notebookの代わりは2 - セカンドノート
「Zoho」も「Evernote」も、Googleノートブックからインポート可能に - ITmedia Biz.ID




2009年7月20日

ペーパークラフト(1)

「何か作りたい・・・・」
時々そういう強い衝動に駆られる時がある。
本当は模型やミニチュアを作りたいのだけど、子供がまだ小さいので家の中では迂闊なところに刃物を放置できないし、有機溶剤や接着剤も危なくて使えない。
そんなわけで、そこそこ安全で作った後は子供と遊んで不要になれば古紙回収に回せるというメリットからペーパークラフトサイトのブックマークを作っておくことにした。

「ペーパークラフト」でググればものすごいヒット数なので、その中から「子供が好きそうなものを」という条件で良さそうなサイトをピックアップ。

■子供が喜びそうなペーパークラフトサイト

ペーパークラフト - キヤノン クリエイティブパーク
乗り物:うちの小僧は建築車両を喜びそうだ。
おもちゃ:動くおもちゃは難しそうだから創作意欲も満たされそう
クラフタウン:道路や線路をつなげて街を作れるので子供が喜びそう

日産ペーパークラフト
比較的簡単そうなので、手先に自身の無いお父さんでも大丈夫。
子供がまだ小さいうちはスーパーカーとかより身近な車が楽しいみたいです。

JR西日本:鉄道ファンコーナー > ペーパークラフト
新幹線の先頭車両や中間車両はもちろん線路や構造物もある。

hirokato工房
現役消防官の作成したペーパークラフトサイトです。
ポンプ車、はしご車、救急車、ヘリコプターまである。
こりゃうちの子は喜ぶなぁ。

■凄い!そこまでやるか?

子供は喜ばずに親父が喜ぶな、これは。
ペーパークラフト | ヤマハ発動機株式会社
作らなくても超精密ペーパークラフトは必見!
エンジン作るだけでA4用紙で13頁というのは。。。。
もうね、まいりました。
こんなの見たら自分の中途半端な創作意欲なんか萎えてしまいますな。
いや〜甘く見てましたペーパークラフト。
海外のサイトにもこんなすごいのがありました。
トランスフォーマーのペーパークラフト
オプティマス・プライム
バンブルビー

■ペーパークラフトサイトの収集サイト

浜永の特選ペーパークラフト
ペーパークラフト データベース
INTERNET ZERO-ONE 無料ペーパークラフト

■ショップ
ペーパークラフト P.Model
有料型紙を販売しています。
有料なだけあって超絶クオリティ!
左のリンクから「ペーパークラフト作成ちょっとアドバイス」をクリックすると
ペーパークラフトの用紙やテクニックが紹介されています。

2009年7月18日

eclipseでjavadoc作成

eclipseでjavadoc作成するのってどうやるんだったか。。。
eclipseは現在3.4(Ganymede) 。
最近javadocコメント書いてないので忘れてしまった。
いやそもそもjavaでプログラム作ってなかったな。
とりあえず[Project]-[Generate Javadoc…]でやればいいはずだが。。。。

あれ?アレ?なんだこの大量エラーは?
「この文字は、エンコーディング MS932にマップできません。?」
ググってみた・・・・・・・・・・・・・

Eclipse上でUTF-8 のソースから javadoc を生成する方法

そうか!最近やってなかったから忘れてたがプロジェクトのエンコーディングはUTF-8にしてたんだ。

[Project]-[Generate Javadoc…]-[Next]-[Next]で、これをExtra Javadoc Optionsに貼っておけばOK。

-encoding "utf-8"
-charset "utf-8"
-link http://java.sun.com/javase/ja/6/docs/ja/api

ついでにjavadocコメントのフォーマットも貼っておこう。


/**
* 説明文<br />
* <br />
* <pre>使用例:int ans = kasan(1, 2);</pre>
* @param a int 引数a
* @param b int 引数b
* @return int 返り値
*/