転職します

今月末付で、現在の会社を退職することになり、今日が最終出社日でした。
来月からは、株式会社ドワンゴにてお世話になります。

入社までに勉強しといたほうがいいこととか、読んでおいた方がいい本とかありましたら教えてください。
あと、ドワンゴで働くにあたっての心得みたいなものも、あったら教えてください!

その場でいい感じに英英辞典を参照できるGreasemonkeyスクリプト(追記あり)

普段英語のサイトを閲覧していてわからない単語があったりしたら、SPACE ALCの英辞朗 on the WEBで調べたりしてました。
その「調べる」手間を楽にするために、Useful_ejrなどのGreasemonkeyスクリプトがあったわけですが、英辞朗 on the WEBは利用規約でそういったスクリプトの利用を禁じています。で、それを受けてUseful_ejrも公開を停止しています。
ちなみに利用規約で禁じているのは「メタサーチや、検索結果画面の改変を伴う利用」を「許諾なく行うこと」なので、「メタサーチや、検索結果画面の改変を」行うスクリプトの作成と公開自体は問題ないと思われます(僕の個人的な判断なので、責任は持てませんが)。
Useful_ejrも、(作者は公開停止しましたが)未だに例えばこことかで公開されてたりします(英辞朗 on the WEBのURL構造が変わったのでこのままでは使えません。URLをちょこちょこっと変えればいいだけですが)。

で、話は変わって、英語の勉強のためには、英英辞典を使うのがいいよねってのは昔から言われてる話でして、英辞朗のような英和辞典で調べちゃうと理解は出来るんだけど勉強にはならないんだよねって思ってました。
なので、LongmanとかCambridgeとかをFirefoxの検索ボックスから検索できるようにしてたんだけど、いまいち使い勝手が悪いのでついつい英辞朗してしまう。

というわけで、英英辞典をUseful_ejrのように選択するだけでその場でいい感じに表示するグリモンを作りました。
作りましたというか、Useful_ejrのソースをほぼそのまま流用させていただき(ライセンス不明だったので問題があったら言ってください)、英英辞典としてWordWeb Online Dictionaryを参照するようにしただけです。


EclispeじゃないよEclipseだよ!

オンラインで引ける英英辞典はいっぱいあるんですが、その中でもWordWeb Onlineにしたのは、
1. 単語の全ての意味が一発で一覧できる構造になっている。例えば「spring」を検索したときに「春(名詞)」と「バネ(名詞)」と「飛び跳ねる(動詞)」が別々の見出しになっていて、その見出し一覧から調べたいリンクを選んでクリックという形式ではない。
2. 発音記号が載っている(ただしこのグリモン上では一部文字化けしますorz)。
3. 例文が載っている(ことが多い)。
4. 類語が載っている(ことが多い)。
5. 他の英英辞典と比べて比較的レスポンスがいい。
6. http://www.wordwebonline.com/en/○○○というURL構造。
7. スクレイピングのしやすさ。
8. (恐らく)こういう使い方してもOK。
といったような理由からです。

というわけで、このスクリプトはgistにおいてあるんで、ご自由にどうぞ。
インストールはこちらから。

追記:アップデートしました。

paddingが0なページだと上記スクリーンショットみたいにペッタリな感じだったのを、どんなページでもよりいい感じに表示するようにしました。

よりいい感じに

Dropboxで特定のディレクトリを特定のマシンとだけ同期させる方法

前回のお話で、Dropboxを使ってバックアップを取ろうってことになったんですが、それを見て
「いやいやいや、音楽とか画像とか数GBあるよなデータを同期して容量の小さいNetbook上に置きたくねーよ!」
とか
「既に設定ファイルとかメモとかを家と会社で同期するのに使ってるけど、会社のマシンに音楽とか画像データを入れたくないんだけど!」
とか言う感想をお持ちの方もいらっしゃると思います。

でも、そんなこと心配することないんですよ、実は。

Dropboxは、マシンごとに同期したいディレクトリ(フォルダ)としたくないディレクトリを選ぶってことができません。
できないので、上記のような感想を抱くんだと思うんです。僕もそう思いました。

だがしかし。

Dropboxでマシンごとに同期したいディレクトリとしたくないディレクトリを設定する方法がありましたのでそれをご紹介します。

・目的
- マシンAにある音楽・画像・設定メモなどをDropbox上にバックアップする。
- マシンA,B,Cの間で設定メモを同期させ、マシンBとCの間だけで作業中のデータを同期させる。

・準備
まず、マシンの台数分Dropboxのアカウントを用意します。
すなわち、マシンA,B,Cがあるとしたらアカウントを3つ取得し、それぞれ別のDropboxアカウントとLinkするように設定します。
ちなみに現在Dropboxは紹介キャンペーン中なので、上のリンクから登録すれば僕と貴方の容量が250MB増えます。
また、自分で既に1アカウント持っているなら、2アカウント目は自分で(ry

次に、音楽やら画像やらをマシンAからDropbox内に置きます。
Music,Photosとかいうディレクトリに置いたとします。
また、設定ファイルやらメモやらを同じくマシンAからDropbox内に置きます。
memoっていうディレクトリに置いたとします。

・作業
まず、マシンAのDropboxアカウントのWeb画面でmemoのディレクトリを表示します。
すると、ファイル一覧の上にShare thisというリンクがあるのでそれをクリックします。
そうすると、Invite Othersって書いてあって招待したい相手のメールアドレスを書く欄があるので、そこにmemoを同期させたいマシンBとCのアカウント登録時に使ったメールアドレスを入力します。
その後マシンB,CのアカウントでDropboxのWeb画面にログインすると、inboxに招待が届いており、Acceptをクリックするとmemoディレクトリが作成され中身が同期されます。
同様に、BからCへworkをshareするよう招待しCでAcceptすれば、BとCの間だけでworkを同期することができます。そこに作業中のデータを置けばOKです。

以上で、音楽や画像などの重いデータは母艦とDropbox上だけに存在し、設定ファイルは全マシンで同期、作業中のデータは作業で使うマシンだけで同期といった使い方が可能になります。

Dropboxすごいね!

というわけで、Dropbox上にgitのリモートリポジトリを作ろうかと思います。
そうすると更に便利に使えそう。

Amazon S3を使ってデータのバックアップができるサービスの比較みたいなもの

HDDに初めて触ったのは、中学2年生のときだろうか。

当時、私は事実上つぶれていたコンピュータプログラミングサークル(C.P.C.)というクラブを友人に誘われて再興し、PC-8001, MZ-2000, PC-8801, PC-6001などを白黒(もっと正確に言えば緑黒だったりもする)のディスプレイに繋ぎ、BASICでプログラミングを楽しんでいた。
共にサークルを立ち上げた友人の父親の会社からお下がりのパソコンをもらえるということで、IBM製の機種は忘れたがマシンをもらった。OSにはWindows3.0Aか何かが入っていたと思う。
そのマシンにHDDが入っていた。
それまで8インチと5インチのフロッピーディスク、及びテープレコーダにプログラムやデータを保存してきた身としては、HDDの容量の大きさや早さに驚いたものだ。
その容量たるや40MB。笑ってはいけない。これでも革新的だったのだ。

それから1年ほど経った中3の冬。阪神淡路大震災の直前に私はお金をため、自分のPCを購入することができた。
 PC-9821Ce2/S2 HDD容量170MB
とうとう憧れのHDDが我が家にもやってきた瞬間である。

それ以来、私とHDDとの付き合いは続いている。
PC-98用としては初めてのHDD専用のゲームソフト、ルナティックドーンの無限のマップに感動したことはとても鮮明に覚えている(ルナドン2にはかなりはまった。セーブデータも改造しやすかったし・・・)。
それから15年余り。
現在、自宅にあるPC(7台)の容量は全て足すと恐らく1TBを超えるだろう。
職場でメインに使ってるPCに至っては容量80GBのうち70GBほどが使用済みだ(これはただ単に使い方が悪い)。

これだけHDDとの付き合いが長く密度も濃いのだが、幸運なことに今までHDDが故障したことが一度もない。
ただの一度も、である。ライトユーザである奥さんのHDDは壊れたと言うのに。

これだけ多くのHDDトラブル報告がある昨今において、これは珍しいことではないだろうか。
恐らくHDDと私は、きっと特別な縁で結ばれているのであろう。

そんなわけで、私はHDDのバックアップをとるという習慣がなかった(もちろん仕事上は別。今回はプライベートの話)。
ただ、上述したように奥さんPCのHDDが壊れ、中のデータを復旧できなかったりしたのを目の当たりにすると、やっぱりバックアップ必要かもなと思ったりした。

どうせ取るならバックアップは物理的距離の離れたところに置いた方がよい。
LAN上のNASにバックアップをとっていたとしても、「地震・雷・火事・奥さん」によって全てが破壊されることがあり得ることは容易に想像できる。
というわけで、Amazon S3にバックアップを置こうと考えた。

とは言ったものの、私のHDD上にそれほどの価値のある情報はあまりない。
なくなるとちょっと悲しいのは、デジカメで取った写真と再度CDから取り込むのがめんどい音楽データぐらいのものだ。
他のデータと言えば、メールはずいぶん前からGmailのみだし、住所録はRipplexだし、ふと思い返してみれば個人データをずいぶんとネット上に置いているもんだ。
画像も、フォト蔵とかにおいてたりするんだけど、フォト蔵は一括ダウンロードがないので、バックアップと呼ぶにはちょっと不適合である。

というわけで、Amazon S3に画像や音楽のデータを置くに当たってどのようなサービスが使えるかを調べてみた。
Windows XP, Mac OS X, Linux(Ubuntu 9.04)の全てで扱えることを前提としている。

以上が、現状で選びうる方法だと思う。

これらのサービスを評価選択する上で、

  • 出来るだけ安価なこと
  • そのサービスが予告なく終了しても(Doblogしても)データが取り出せること
  • iTunes Musicフォルダを置いた際、iTunesでそのままライブラリとして使うことができること
  • を重点に調べてみた。

まず、値段に関して。
基準となるのはAmazon S3をそのまま使う場合の値段。
で、JungleDiskはAmazon S3の課金+最初に20ドルもしくは月々2ドルという課金体制。
これは十分許容範囲。
Dropboxは現在使ってるのが5GBまで無料(普通は2GBだがたぶんβから参加してたおかげで5GB)。それじゃ足りないだろうから課金するとして、50GBで10ドル/月。
ZumoDriveも50GBとすると、12ドル/月。
単純な値段だけで比較すれば
S3 < JungleDisk < Dropbox < ZumoDrive
だが、DropboxとZumoDriveは転送量がいくら増えても値段が一定というメリットがある。
例えば、iTunesのライブラリを置く場合を想定してみよう。
Genius機能などを用いて、ユーザの好みの音楽がどういうものかをiTunesが判断するとき、恐らく(想像ではあるが)ライブラリ内の音楽ファイルを網羅的にアクセスして、どのような音楽ファイルが存在するのかを横断的に調べるのではなかろうか。
JungleDiskの場合、こういったプログラムが勝手に行うバックグラウンドのアクセスであっても、それがキャッシュ上になければその分課金がプラスされるということになると思われる。

次に、サービスが予告なく終了しても(つまりDoblog状態になっても)データが取り出せるかどうか。
Amazon S3をそのまま使う場合は、Amazon S3が突如死んだらどうしようもない。
Dropboxの場合は、データはローカルにも存在するので安全。
ZumoDriveの場合は、データはローカルには存在せず(キャッシュはあるが)、またAmazon S3のアカウントも自分のアカウントを使うわけでもないので、ZumoDriveが死んだ時点でアウト。もちろんAmazon S3が死んでもアウト。
JungleDiskの場合は、使い方次第だが私が想定しているネットワークドライブとして利用する場合、データはローカルには存在しない(キャッシュはある)が、Amazon S3は自分個人のアカウントなため、他のツールを使って救済が可能。JungleDiskの古い紹介記事にはよく「独自形式のため他のツールと互換性がない」と書かれているが、現在のJungleDiskは独自形式と互換形式を選択できる。もちろんAmazon S3が死んだらアウトだが。
よって、比較してみると
Dropbox > S3 == JungleDisk > ZumoDrive
となる。

最後にiTunesでの使い勝手。
Amazon S3をそのまま使う場合、iTunesはS3上にあるライブラリをそのまま利用することはできない。
Dropboxは完全にローカル上にデータがあるので、もちろんDropbox内にiTunes Musicフォルダを置いてそのままライブラリとして利用できる。
ZumoDriveでは、iTunesでZumoDrive上にあるライブラリをそのまま利用できる。・・・と公式サイトで謳っているので恐らくできるのであろう。実際には試していない。
JungleDiskでは、iTunesでJungleDisk上にあるライブラリをそのまま利用できる。・・・と書きたかったのだが、何故かiTunesからライブラリを読み込めない。詳細設定で、iTunes MusicフォルダをJungleDisk上にコピーしたiTunes Musicフォルダを指すように指定しても、そこにある音楽ファイルがiTunes上に現れてくれない。実際には出来ているという報告もブログであがっていたりする(ちょっと古く独自形式しかない時代の記事)し、理論上できそうな気がするのだが。もしかしたら、JungleDiskの独自形式を使ったらできるのかもしれない。
よって、比較してみると
Dropbox > ZumoDrive > JungleDisk >= S3
となる。

で、実際の使い勝手等の総括。
当初は、「Dropboxみたいにローカルに容量必要とするのってもう時代遅れだよね」とかって考えてて、互換モードのできたJungleDiskを使う気満々だったのだが、実際に画像数百枚と音楽1千ファイルぐらい置いて使ってみた感じ、やっぱりモッサリしすぎだなーって思った。
画像ってやっぱり次の写真とかがスムーズに見えた方がいいよね。ためしに奥さんに昔行ったシベリア鉄道旅行の写真見せてたら、写真読み込み遅すぎて苛立ってた。
音楽もたぶんそうなんだろうな。今回は成功しなかったけど、iTunesでS3上にある音楽ファイルをそのままライブラリとして読めるとして、パーティシャッフルとかで次のファイルに行ったときにいちいちダウンロードする間待たされることになりそう。iTunesのプラグインとしてS3用のがあってStreaming再生できたり先読みする機能あったりすれば話は別になるんだけど。

というわけで、今回はDropboxに課金してバックアップ取ることにする。
もちろん、これは私個人にとっての選択であって、万人にとってこの選択が正しいというつもりは毛頭ない。

また、この記事を書いている途中に、JungleDiskの代替になりそうなオープンソースソフトs3DAVを発見してしまった。
こちらはこれから試すが、よさそうならよく使うデータはDropboxに、殆ど使いそうにないが一応取っておきたいデカイデータはS3にという使い分けをするのもいいかもしれない。

追記:

JungleDisk上のデータをそのままiTunesでライブラリとして読み込むのはできた・・・と思う。「と思う」というのは、「読み込み中」と出たまま全音楽ファイルをDLしていたため、時間がかかるのでキャンセルしちゃったから。たぶんあのまま待ってれば出来るんでしょう。

s3DAVはプロキシを超えられないっぽい?Java製なんでhttp.proxyHostとhttp.proxyPortを指定してやってみたけどダメっぽかった。

第2回Wicket勉強会とWicket本

更新遅れました。

3/7に行われた第2回Wicket勉強会に参加してまいりました。
総勢80人オーバー。
懇親会は会社の忘年会かと見紛うような宴会場。

1フレームワークに対する勉強会で、これほどの人数が集まるというのはちょっとあまりないことだと思います。
それだけWicketに対する期待が高まっている証でしょう。

Wicket-jaとしても、もっと精力的に活動したほうがいいのかしらん。
とりあえず、公開してもいいコンポーネントもってる人は、Wicket-jaのsourceforgeのリポジトリにコミットしちゃったりできるようにしたいなーって思ってたり。
Wicket-stuffみたいな感じでWicket-jaがコンポーネント提供の場にもなれたらいいなーとか(一人で)妄想してます。

で、そんなこんなで矢野さんのWicket本も発売になりました!
WicketによるWebアプリケーション開発―オープンソース徹底活用
僕の名前もバッチリレビュアーとして載ってるはず!

会社でもWicket勉強会開催できたし、WicketがもっとSIerの業務として使われるようになればいいなぁ。

Restlet1.1.2でProxyを経由するのがめんどい

Restletをクライアントとして使う場合、Commons-HttpClientと組み合わせて使うんだけど、そんときにProxy通さなきゃいけない場合にめんどかったのでメモ。

まず、普通にhttp.proxyHostとhttp.proxyPortにProxyのホスト名とポート番号設定するだけじゃ動きません。
それってCommons-HttpClient使うときも同じで、HostConfigurationのsetProxyメソッドで設定してやる必要がある。
だけど、RestletをCommons-HttpClientと組み合わせる場合、Commons-HttpClientは完全に隠蔽されていて直接Commons-HttpClientのクラスにアクセスすることができません。

ってなわけで、なんかやり方ないかと思いググってみた。そしたら

Webサービス プログラミング総合スレッド

794 :デフォルトの名無しさん[]:2008/01/16(水) 21:18:52
restletクライアントのHTTPプロキシ設定でどうやるんですか?
ぐぐってもドキュメントみても何も出てこないです
795 :794[]:2008/01/17(木) 01:04:12
出来たけど難しかった。

うがー、なんか書いといてよー!
気を取り直して他の情報見ると、どうやらバグ報告があり、1.2で直る予定っぽい。
しょうがないので自分で改造するかってことで、RestletのClientクラスの代わりにMyClientクラスを作成することに。

ホントは、Clientクラスの中身コピってMyClientにしようと思ったんだけど、Clientクラス内で呼び出しているEngine#createHelperがどうしても引数にClientクラスのインスタンスを必要とするので、Clientクラスを継承してMyClientクラスを作ります。Engineクラスまで書き換えるのめんどいし。

Clientクラスのhandleメソッドは以下のようになっています。

    @Override
    public void handle(Request request, Response response) {
        super.handle(request, response);

        if (getHelper() != null) {
            getHelper().handle(request, response);
        }
    }

ここで、if文の中のgetHelper().handle(request, response)を実行すると、Proxyが超えられなくてエラーになります。
でも、super.handle(request, response)の呼び出しはやっとかないといけません。
そこで、handleメソッドを次のようにオーバーライドしました。

    @Override
    public void handle(Request request, Response response) {
        super.init(request, response);

        if (getHelper() != null) {
            HostConfiguration hostConfig = new HostConfiguration();
            hostConfig.setProxy(System.getProperty("http.proxyHost"), Integer
                    .parseInt(System.getProperty("http.proxyPort")));
            ((HttpClientHelper) helper).getHttpClient().setHostConfiguration(
                    hostConfig);
            getHelper().handle(request, response);
        }
    }

1行目がsuper.handle(request, response)じゃなくて、super.init(request, response)なのがミソ。
このinitメソッドはClientの親のConnectorの親のRestletクラスのメソッド。結局、Clientクラスのhandleメソッド内のsuper.handle(request, response)はこのinitメソッドを実行するだけなので、これで大丈夫。
このメソッドは、実はdeprecatedで次バージョンではなくなるよ!って書いてあるんだけど、次バージョンではこんな改造いらなくなるはずだからまあいいでしょう。

第2回Wicket勉強会

Wicket-ja主催による第2回Wicket勉強会の開催概要が決定しました。
http://www.javelindev.jp/wicketkaigi/registerから申し込みいただけます。
今回はMAX80人までOKとのことなので、皆さんガンガン参加してください。

と、矢野さんが告知する前に抜け駆けで告知してみる。
なんか手伝えることあったらなんでも言ってくださいね。>やんやん
確定申告もあることでしょうし、負荷は分散していきましょう。

いまさらながら

あけましておめでとうございます。

近況をいくつか。

ただいま「ぶっこめ!」が、トラックバックスパムに襲われたためはてなid:bukkomeのはてブ使用が規制されてしまった影響で、はてなIDによるIDコール機能が動作しない状態になっています。
余力ができたらなんとかします。

先日、CodeRepos新年会に参加させていただきました。
cojiさんの恋バナ聞けたし、グニャラくんに大学の同窓生だよね!って言えたし、個人的には大変有意義でした。

21日から28日まで、ヨーロッパに新婚旅行に行ってまいります。
PCも持参するので、現地からmixiの日記を更新していくと思います。
興味のある方は、上メニューのWHOからお気軽にマイミク申請してください。

以上です。
相変わらずあまり更新されないブログですが、本年もよろしくお願いいたします。

新はてブを体験するために

はてなアカウント作りました。
t_43z

とりあえずは、ブックマークとスターぐらいしか使ってないけど、そのうちダイアリーとかも使おうかなー。

ってか、livedoorクリップとはてブのクロスポスト用にTombloo使い出したんだけど、めっちゃ便利だね、これ。
もっと早くから使っとけばよかったー。

ActiveObjectsでH2を使うには

DatabaseProvider#getInstance()を参照すると以下の記述が。

SupportedDBProvider provider = SupportedDBProvider.getProviderForURI(uri);
if (provider == null) {
	throw new RuntimeException("Unable to locate a valid database provider for URI: " + uri);
}

つまり、SupportedDBProviderがちゃんと取れてないんですね。
じゃぁ、そっちを見ましょう、と言うことで見てみます。SupportedDBProviderではEnumを拡張して対応しているDBかどうかをチェックしている模様。
その中にH2が含まれていないのですね。結果、DatabaseProvider様が「んなDB知るか!!!」とのたまっているのですね。お気持ちはわかります。
Wicket + Guice + ActiveObjects + H2ができない - kirikenの日記

このエントリに対し、僕はLDCで「SupoprtedDBProvider自体も書き換えたような記憶が」って書きました

気になったので、もっかい見なおしてみたら、そんなこともする必要なくて、

new EntityManager(H2DatabaseProvider.getInstance("jdbc:h2:file:hogehoge", "sa", ""))

を、

new EntityManager(new H2DatabaseProvider("jdbc:h2:file:hogehoge", "sa", ""))

にすればいいだけっぽい。

どういうことかというと、DatabaseProvider#getInstanceは、上で引用してる部分で、サポートしてるDBかどうかチェックしたあとにSupportedDBProvider#createInstanceを呼んでるんだけど、こいつが実際に使用しようとしてるDatabaseProviderをインスタンス化してる。

Constructor constructor = type.getDeclaredConstructor(new Class[] {
    java/lang/String, java/lang/String, java/lang/String
});
constructor.setAccessible(true);
back = (DatabaseProvider)constructor.newInstance(new Object[] {
    uri, username, password
});

こんな感じでね。これって要は、コンストラクタ呼びだしてるだけだよね。んでこのbackを呼びだし元に返してるだけなので、結局はnewしてるのと変わらない。
ま、poolingするときは、このbackを利用可能なpoolProviderに入れて返してるんで、poolingしたい場合にはSupoprtedDBProviderを書き換えるしかないかもだけど。

というわけで、

new EntityManager(new H2DatabaseProvider("jdbc:h2:file:hogehoge", "sa", ""))

でやってみてくださいな。

ってか、H2使うなら、ActiveObjectsよりもJaQu(H2に付属のORM)使うほうが楽しいと思うけどねー。

次のページ »