mumumu の日記

Development, Translation, daily life, thoughts, and so on.

2013-05-31 10:44:00 +0900

Date Calculation

http://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html

以下のように日付を足したり引いたりして、その参照を使い回すと極めて危険である。
... っていうネタはあるあるだと思うんですけど、今日そのワナを踏んでしまって泣きそう( ;´Д⊂ヽ
これは Java の例だけれども、当然 Java に限った話ではない。

Calendar now = Calendar.getInstance();  // instance of 5/31
now.add(Calendar.MONTH, -3);           // 3 month before -> 2/28

//  some processing...

now.add(Calendar.MONTH, +3);           // not 5/31, but 5/28 !!!

要するに、たまたま3ヶ月前が2月末だったので、ずれるという話です。
こんな馬鹿なことするのは俺だけだって? デスヨネー(´ー`; )

2013-05-30 21:02:00 +0900

Firefox profile setting on Selenium

http://stackoverflow.com/questions/2405714/selenium-and-https-ssl

Selenium を最近テストに愛用している。ただ、https な通信のときにオレオレ証明書を使っている場合、毎回ブラウザが立ち上がるたびに以下のような警告が出て非常にうざいのが問題だった。「危険性を理解した上で接続する」をクリックして例外サイトに加えても結果は同じだったので、これはプロファイルが適用されていないんだな、と気付いた。

firefox ssl warning

自分は Selenium Server を以下のような Java のコードで起動し、Firefox をコントロールしていた。これにプロファイルを適用すれば良いことになる。

protected SeleniumServer seleniumServer;
protected Selenium selenium;

protected void setUp() throws Exception { 

    String testUrl = "http://example.com/foo/bar";
    String testBrowser = "*firefox";

    seleniumServer = new SeleniumServer();
    seleniumServer.start();

    selenium = new DefaultSelenium(
            "localhost", seleniumServer.getPort(),
            testBrowser, testUrl
           );
    selenium.start();

}

上記はコマンドラインで Selenium Server を起動せずに Java から起動しているので、Java からプロファイル設定を渡す方法ってなんだろうと思っていろいろ調べた。だが、コマンドラインから Selenium Server を起動した場合とごっちゃになっていて結論がよくわからなかった。結局以下のように SeleniumServer のコンストラクタに RemoteControlConfiguration オブジェクトを渡せばうまくいった。

RemoteControlConfiguration rcc = new RemoteControlConfiguration();
rcc.setFirefoxProfileTemplate(new File("/path/to/firefox_profile_dir"));
seleniumServer = new SeleniumServer(rcc);

Firefox のプロファイルのディレクトリはプラットフォームによって異なる。Windows であれば、%AppData%/Roaming/Mozilla/Firefox/Profiles/xxxxxxxxxx となる。

これでプロファイルを Selenium Server に渡せるようになったのはいいのだが、Firefox の起動が極めて重かったので参った。プロファイルを渡さなかったときは重くなかったので、別に空のプロファイルを作り、そのプロファイルにオレオレ証明書を受け入れさせたら軽くなった。 Firefox で新しいプロファイルを作るには、以下のコマンドを使う。

firefox -P

そうすれば以下のようなウィンドウが起動するので、プロファイルを設定し、Java 側で新たに指定すればよい。

firefox profile window

Selenium Server をコマンドラインから起動する場合は、以下のやり方でプロファイルを渡すことが出来る。このやり方なら、 Java 側で SeleniumServerクラスをインスタンス化して start する必要はない。

java -jar selenium-server-standalone-2.31.0.jar -firefoxProfileTemplate /path/to/firefox_profile_dir

ヤレヤレ。少し面倒だが、だいぶ楽になった(´ー`; )

2013-05-19 23:19:00 +0900

Password Change Festival

http://keepass.info/
ヤフー、最大2200万件のIDが流出の可能性--確認ツールも公開

Yahoo Japan ID が2200万件も流出したとの報を受けた。直ちに認証情報流出に繋がるとは限らないが、これを機にパスワード管理もきちんとせなあかんな、ということでいろいろなサイトのパスワードを変更してまわった。

パスワード管理には KeePass Password Safe を使う。これは Windows Only だと最初思っていたのだが、よく調べてみると mono が動く環境であれば動くとのこと。よく見てみると、Debian 系でも 以下のコマンドで一発インストールが可能だった。自分の環境は Kubuntu なので、楽ちん楽ちん。

sudo apt-get install keepass2

いくつかのサイトはパスワードが同じものがあった。強度が高いパスワードを生成するようにしてそれらを全て置き換えた。あと、Yahoo Japan の ID は実質未使用だったので全て削除した。数はできるだけ減らすに限る。

管理対象のサービスやサーバを数えてみたら、合計24あった。まあ、そんなものか。

2013-05-19 23:00:00 +0900

Crossed the Rubicon river(3)

ルビコン川(Wikipedia)

不退転の決意で臨む。

以前そんな決意をしたのは 2010年の9月 だった。その動機になった軸、そして目的は今も変わっていない。これで3度目になる。

その軸があるからこそ、周囲の人にも応援して貰える。そんな気がしている。
いつもそんなことを思い、前に進む毎日だ。

2013-05-15 00:26:00 +0900

Rotate Image depending on exif:orientation value

http://beradrian.wordpress.com/2008/11/14/rotate-exif-images/

スマートフォンで写真を撮り、それをクラウドに保存するということはよくある。だが、意図的にではないにせよ、その写真の天地や縦横が逆になったりすることがある。これは特に「+」のボリュームボタンでシャッターが切れるようになった iPhone5 から顕著だ

画像自体がどのような方向で保存されているのかは、EXIF(Exchangeable Image File Format) に保存されているのが普通だ。最近の画像処理ライブラリは、こういうことも EXIF:Orientation の値を見て手当てするようになっている。

自分もたまたまそういう処理を Java で書いていて、「iPhone で写真を撮ると写真が逆さまにアップロードされる」というトラブルに出会った。jMagick を使って画像をいったんある一定の大きさに変換してファイルに保存していたのだが、このプログラムは古かったため EXIF を見ることはしていなかったのが原因だった。画像の方向とEXIF の関係は一番はじめに示したリンクに詳しいが、jMagick の場合必要な処理を自前でやらなければならない。

一番はじめに示したリンク はまさに同じケースを扱っており大いに参考になった。しかし、あいにくとここに載っているコードには以下の問題があった。

a) 複数回同じ画像で変換が走った場合のことを全く考慮していない。

EXIF の値を見て変換するのはよいのだが、いったん変換した後にまた同じ回転や反転処理が走ってしまうと元に戻ってしまったりする。これを防ぐためには、EXIF の値を更新し、2度同じ処理が起こらないようにする必要がある。

b) jMagick のバックエンドである ImageMagick は EXIF の更新に対応していない

これも残念ながら自前で書かねばならない。EXIF を更新するためのライブラリは様々なものがあるので好きに使うと良い。自分は apache-sanselan (現在は commons Imaging) を使った。



これらを踏まえて、一番はじめに示したリンク に示されているコードを書き直したの以下である。EXIF の更新コードを Java で書く場合って、Web を調べても割と中途半端にしか載っていないことが多かった。その意味では、完全なコードを書き残しておくことは意味があるだろう。