2011-04-02 [長年日記]
_ Ruby 1.9の高速化の恩恵はWindowsでこそ大きい
The Great Ruby Shootout (July 2010)
個人的には文字列処理の資産が多い Ruby はなかなか 1.9 に移行するのが難しかったりするのですが、Windows + Ruby 1.9 から入った人が 1.8 を試したところその遅さにかなりビックリしてしまったようです。
上のリンク先のページ中ほどに Windows 版と Linux 版の比較があるのですが、当然のように Windows 版が遅いのはともかく、その差が 1.8 と 1.9 では大きく違います。そういや昔 RubyInstaller で 1.8 を入れようとしてあまりの遅さにイヤになったことがあったっけか。
とりあえず
- 過去の資産がない
- Windows で使う
場合はもはや 1.9 一択と考えてもよいのかもしれません。
2011-04-08 [長年日記]
_ RubyのHash式の { } は省略もできるけど完全に同一ではない
まぁ当たり前の話なんですけど。
Ruby の Hash は
{
key1 => val1,
key2 => val2,
...
}
と書くのだけれど、メソッドの最後の引数にする場合にはこの { } を省略することができる。つまり
method( { key1 => val1, key2 => val2 } )
これを
method( key1 => val1, key2 => val2 )
のように書けるということ。実際には ( ) も省略できるので
method key1 => val1, key2 => val2
こうでもよい。これがよく Rails で使われている記法で、メソッド呼び出しのように見えず、何かの宣言を書いているように見える。これだけでも今までのプログラムの書き方と違う感じがする*1。
しかしこの { } の省略をすると末尾の , を余計に付けることができない。当たり前といえば当たり前なんだけど、
method key1 => val1,
key2 => val2,
と書いてしまうと val2 で値が終わったことが分からずに syntax error になってしまう。
{ } をちゃんと書いているときについ末尾の , を残す書き方をしているとハマる。Hash定義が何行にも渡るものを書いていて、かつまだ変更の可能性があるときに , を付けて書くクセがあったのでハマってしまった。
*1 個人的にはあまりこの書き方ばかり押すのは好きじゃないんだけど
2011-04-16 [長年日記]
_ kanazawa.js v1.2 に参加してきた
あるいは HTTP と Firebug について喋ってきたよ。
今回は v1.0 以来のセミナー形式ということだったけど、やっぱセミナーの方が人くるね。30人の定員以上に参加希望があったのは正直驚いた。
内容などはリンク先の atnd を確認してもらうとして、自分は
Webそのものの基本と確認用のツール - Firebugを中心に -
というテーマで話させてもらった。
当初は Firebug の使いこなし的な話をしてほしいという風に言われていたんだけど、正直それほど凝った使い方というか裏技的な使い方はしていない*1し、かといって一通り使い方を説明するだけだったら、それこそ firebug のサイト見ればいいだけなので、あえてスライド作って喋るほどじゃないよなぁと思っていた。
しばらく待っていたら他の人のテーマに
- パフォーマンスチューニング
- Dynamic Loading
というものが上がってきたので、
そうすると [ 接続 ] パネルが中心になるなぁ
と、ぼんやり思い始めて、接続パネルは最初のうちはあまり使わないかもしれないけど面白い機能だよね、と思ったところでハタと気がついた。
てゆーか HTTP 分かってないと [ 接続 ] パネルって意味なくね?
ということで今回は
- HTTP半分
- Firebug半分
という構成にしてみた。フタを開けたら高速化の話はなくなっていたんだけど、まぁそれは次回以降に持ち越しということでいいかな。とりあえず
Web に関わるなら HTTP は分かっていて欲しい
というメッセージは伝えることができたと思う。みんな RFC 読もうね :-)
あとは「consoleが便利すぎるので震えてくれ」ということでデモを少々。内容が多かったのであまりデモる時間がなかったのと、最後 Firefox というか Mac 全体の調子が悪くなってしまった*2ので、ちょっとだけ尻切れとんぼになってしまったけど、言いたいことは言い終わっていたので良しとした*3。
ちなみに、会場での握手はすっかり忘れてて、誰とも握手しませんでした。ダメじゃん。
cf.
2011-04-18 [長年日記]
_ ezweb.ne.jp非対応端末でezweb.ne.jpアドレスを使う
Twitter でチラリと教えてもらったので調べてみた。
結論
- ezweb.ne.jp 非対応端末は ezweb.ne.jp のサーバに繋がらないだけで ezweb.ne.jp アドレスは必ずある
- 対応端末で「転送」や「auone.jp へ保存」オプションを「使っておけば」非対応端末でも「受信」可能
- つまり機種変の場合は ezweb.ne.jp アドレスは受信用に使える
- 送信はある程度諦める
auoneの使い方
- auone ID を取得(これは料金確認などに使うサポートIDとはベツモノ)
- auone メールアドレスの POP/IMAP アクセス用パスワード作成
- auone はまんま Gmail のシステム(インターフェイスはちょっと古い)
- gmail の設定で POP/IMAP アクセスを許可
- サーバ設定は gmail.com のまま
- gmail の仕組みで from の偽装などを行う
- 真面目になりすまし防止してるspamフィルタは騙せないので、送信についてはある程度諦めるしかない
[追記] ビックリしたのは auone.jp は spam フィルタとしてほとんど機能しないってこと。これでは gmail のシステムを使ってるメリットがかなり薄れる。
ということで auone はアドレスにだけ使って実際にはメインの gmail の方で POP 受信してしまうことにした。こっちでも最初は結構 spam をスルーしてしまったが学習させているうちにだいぶ良くなってきた。どうも自分の gmail アカウントは日本語の spam はほとんど学習していなかったようだ。
フィルタは全部解除しておく
- ezweb.ne.jp非対応端末からはspamフィルタなど一切設定できない。つまり指定受信なども設定できない。
- したがってフィルタは全部解除しておかないと受信したいメールを永久に受信できない可能性がある
まぁ非対応端末もそのうち対応するようになるような気がするけど。
ついでにCメールも
Cメールへも「電話番号を使ったDIONのeメールとして」転送可能
- gmail の push よりも早く受信できるんだと思う、たぶん。
- 「契約エリア」によってドメインが違うので注意
- spamも全部転送されるとヒドい目に遭うので注意!!
2011-04-23 [長年日記]
_ 携帯をHTC Evoにした

これまでは re を使っていて、また PocketWiFi と iPod touch も持っていた。
2009年末から PocketWiFi + iPod touch の体制だったんだけど、これに終止符を打って
- ガラケーをやめて携帯を Android ( hTC Evo ) に
- PocketWiFi をやめて Evo のテザリングに
変更した。理由はいろいろあるんだけど、大きなものは
- セカンドバッグ的なものに iPod touch と PocketWiFi とそれぞれのケーブル、およびケータイを USB で充電するためのケーブル、これらをいつも入れておくのが邪魔
- iPod touch でイマドキの面白いアプリを試すことはできるがいざ通信しようと思って PocketWiFi を立ち上げると起動に10秒とか待たなきゃいけないのがダルい
- PocketWifi の電波が意外に弱い
辺り。
PocketWiFi + e-mobileの残念感
もともと USB スティックで e-mobile を契約した当初はどうしても必要なときだけ使うことを想定していたし、たまたま電波状態の良い地域で使うことが多かったので気にならなかったけど、e-mobile の電波の問題なのか PocketWiFi という端末の問題なのか、意外に状態が良くない。明らかに範囲内なのにエアポケットのように繋がらない場所があったり、100kbps 程度しか速度が出なかったりする。
またこれは個人的な事情だが、北陸の勉強会会場として石川高専や金沢工大が協力してくれるのだけど両者ともに電波状態が良くない。場所によってかろうじて繋がる程度。
こういうことはケータイの3キャリアである docomo, SoftBank, au ではちょっと考えにくい(SoftBank の電波はあまり評判が良くないようだが)。こうなるとやはり e-mobile 自体に否定的な気持ちにならざるを得ない。
EvoのWiFiテザリング + WiMAXのコンボが決め手
もともと iPod touch を使いながらいずれ必ずこっち側の世界が主流になると感じていたので、今までガラケーでいたことの方が不自然に思われていたクチなんだけど、
もう3Gじゃないよなぁ
と、ずっと感じていた。端末開発競争は激化する一方で回線に関しては 3G が地味に地味に改善される程度で、しかも田舎ではすぐにその恩恵に与れない。どうせ 4G がくるのは見えているのに 3G にバインドされたまま細かい改善に付き合うのはバカバカしく感じていた。
ということで実は以前から
4Gとテザリングが来たらそれにする
と周りには公言していたのだ。別に Android だからとか WiMAX だからとか hTC だからとかそんな理由じゃない。言い換えると、これが au じゃなくて docomo の 4G + テザリングが先に来てもそっちにしてた。たまたま今回も au の打つ手が自分にマッチしただけ。(前回の re への機種変は単に使っていた端末が壊れたためで積極的な理由は何もない。)思えばいちばん最初にセルラーに変更したときの
どうしてもcdmaOneが使いたい!
という理由と同じだ。つくづく自分はそういう人間なんだと思った。
Evoとau 3Gの感想
正直かなり面倒くさい。いろいろノウハウを探してためていく必要がある。これは iPod touch のときにはまったく感じなかったこと。まぁ使える電波の種類が一気に増えたし、au のケータイ的にはメガネケース並みに仲間はずれだし、仕方ないんだろうけど、標準アプリのデキもやはり全然違う。また店頭でも関連グッズを見かけることはないし、日本では出たばかりなので情報も少なめ。
とは言え WiMAX はまともな状態で使えればかなり速いし、入らなくても au の 3G 回線は意外なほど速い。これは e-mobile が貧弱すぎただけなのかもしれないけど、3G だけでも十分に快適。そしてやはり荷物が減るのはとても嬉しい。携帯一つ持って出かけて気軽に Twitter や 4sq が使えるのはかなり心が軽い。iPhone ユーザーは(電波を除けば)こんなに快適な心理状態だったのか。
標準状態ではバカみたいに音がうるさいが iPod touch よりかなりまともな画素数になったカメラも便利だし、明らかに他の端末よりでかい本体も持ちやすいし画面が大きいのは単純に見やすくて良い。設定などの文字のでかさはかなりダサイ感じがして仕方ないが、普段はそういうのを目にせずに使えるようにさえできればそこそこ快適。書体は予想していたよりはずっときれいで見やすい*1。
基本的には iOS でしか使えないサービスには依存していなかったので移行はまだ楽な方。iTunes には依存していたが、自分で rip したものか PLUS で購入した楽曲しかないので iPhone でなきゃいけない理由もない。この辺はいつも割と注意して手を出してるクチなので、ちゃんと実践できていたということか。
使いこなしはまだこれから。とりあえず悪くはない。
おまけ
実は契約段階で割とすったもんだした。というのも、
- Evoは ezweb.ne.jp に対応していない
- でも auone への保存とか転送を使えば少なくとも ezweb.ne.jp 宛のメールを受け取ることはできる
という話を聞いていたので、実は事前にメールの転送を設定していた。しかしこれが大変裏目に出た。実は
- 全部のメールをCメールにも転送する設定にもなっていた
ため
spamも含めてすべてのメールが通知される。しかも ezweb.ne.jp 非対応端末なので、もう設定を変更できない。
という大変な事態に。仕方ないので
当日中に一度機種変をキャンセルして、以前の端末で設定を変更して、再度機種変
というかなりのドタバタがあった。情けない…。
おまけ2
てっきりフラットしか契約できないのかと思ったけど、従来のダブル定額でもいいらしい。ということは最低2100円/月でも契約できて、新規だと毎月端末代のキャッシュバックが2000円あって、ほぼ分割料金のみで持てるのか。持つだけなら。
まぁこれ買う人は端末そのものの魅力ではなく WiMAX とテザリング目当てだろうからあんまり意味ない計算だけど。
*1 もちろんiOSにはかなうはずもないが
2011-04-24 [長年日記]
_ Evoのムービーを扱う
モノ
- Evo をメモリーカードモードにして SD から引っこ抜いた
- Evo で撮影したムービーは 3gpp フォーマットらしい。そらそうか。拡張子は .3gp
- 3gpp の対応コーデックは
- 映像 H.263(必須), MPEG4, H.264(オプション)
- 音声 AMR, MPEG-4 AAC
再生
Mac 上ではとりあえず
- QuickTime で普通に再生できる
編集
- そのままだと iMovie では開けない
- 拡張子を .mov に変えれば iMovie でも扱える
メタデータ
- USB接続できるカメラから転送で iMovie に持って来るわけではないのでメタデータは何もない
- そもそもムービーのデータは Exif のようにメタデータの規格が決まってない
ということで潔く諦める。すぐに処理できる範囲内の短いムービー以外は基本的に撮っちゃダメだと思う。
2011-04-26 [長年日記]
_ 電話しながら端末の画面を見る
以前から思ってたんだけど、
Evernoteとか便利だからこれ「見ながら」電話するよね
ってことを実際にやった。
これまでは iPod touch + ガラケーだったので iPod touch 上のメモや資料を見るのはまったく苦労がなかった。しかし Android に一本化したらそうもいかない。耳のそばに端末を持っていくと画面が消える。なんか聞くと iPhone もそうらしい。で、顔から端末を離しても一瞬画面が現れるまでタメがある。うむ。ちょっと使いにくい。
というか端末を耳に付けたり離したりしながら話すのってこれハタから見たらすごく変だよな、きっと。
ということで以前 Skype を使った勉強会に参加するために買ったヘッドセットをペアリングしてバッグインバッグに放り込んでおくことにした。充電のことは考えてないし、まぁ普段は普通に持って電話するけどね。
※ Simplenote クライアントである Flick Note は電話番号がリンクにならずに電話掛ける手間が省けなかった。こういう細かいところでやはり Evernote には一日の長があるのぉ。
2011-04-29 [長年日記]
_ Evo標準のiWnnとOpenWnnとSimejiとSocialIME
- Android 端末では iWnn を搭載しているものが多い
- iWnn でフリック対応している端末も多い
- Evo も iWnn を採用している
- Evo の iWnn はフリック対応していない(!)
ということで
- OpenWnn フリック対応
- OpenWnn PLUS
- Simeji
を入れた。
最終的に
- 四方向のカーソルキーを持つ Simeji
を採用した。Evo はすべてソフトキーでカーソルの移動に便利なトラックボールなどは搭載していない。
ところがどうもこの Simeji がおバカさんでとてもイライラする。具体的には連文節変換ができない。
自分には Android の先輩が何人かいるんだけど話を聞いていると
要するに辞書がバカ
ということらしい。現行バージョンの Simeji の変換エンジンは OpenWnn + SocialIME なんだけど、この OpenWnn 部分の辞書が弱いのではないかという結論に達した。iWnn では楽々変換できる日本語が OpenWnn 系のものでは軒並み変換できない。なるほど。
対策としては
どんどん SocialIME の候補を学習させる
ということになるらしい。SocialIME での変換結果も学習したものはローカルに保存されるので次回以降はネットに繋がなくても変換できるということのようだ。
ということは本当は普段から SocialIME を鍛えるべく PC(Mac) での変換も SocialIME を積極的に採用していった方がいいんだろうなと思いつつまだそこまでできていない。とりあえず遅いのを我慢して Evo からは積極的に SocialIME の候補を呼び出して学習させているところ。
2011-04-30 [長年日記]
_ iCalからGoogle Calendarへ同期をとるツール書いた
何ができるか
- iCalendar 形式のデータを指定の Google Calendar へ同期させる*1
- 複数の iCalendar データを一つの Google Calendar にまとめることができる
なぜ必要か
- Android の少なくとも 2.3 までのカレンダーは「照会」を使えないから
- 個人的には Google Calendar は使っていないが「照会」したいカレンダーがいくつもあり、それらをいちいち手作業でインポートしたりせずに Android 上で確認したいから
どうやって動かすか
準備するもの
- Ruby
- gem install ical2gcal
- googleアカウント
- 同期をとるカレンダーのURL(またはパス)
- 同期先のカレンダーとその名前
あとは
ical2gcal --help でなんとなく察して。
使用例
こんなことができます。
- RTM のプライベートアドレスから Google Calendar への同期を明示的に行える
- Google Calendar で直接参照すると反映がとても遅く、使いものにならない
- Trac の milestone の締め日を iCalendar 形式で取得して Google Calendar 上で確認可能
その他、URL やパスのある iCalendar 形式のデータであればなんでも Google Calendar と同期できる。
自分の場合はこれを自宅サーバや社内のサーバで cron で定期実行して Android のカレンダー上で気にしなければいけない日時を俯瞰できるようにしている。
制限
- 「1実行 : 1Google Calendar」の対応なので、同期したいカレンダーが複数ある場合は何回も実行しなければいけない
ただ、このおかげで同期頻度を調整もしやすいので、これでいいかなと思っている*2。
できあがった Google Calendar を Android 端末で利用する際の問題
このツールを使って Google Calendar を別なツールやプログラムから更新することができる。しかしこれを Android で同期しようとすると問題になる場合がある。
どうも Android のカレンダープログラムは外部のカレンダーデータについては Google Calendar との同期しかできないのにその同期が正しく動作しないというバグがあるらしい。
手元で確認したおかしな動作は以下の通り。
- Google Calendar に正しく反映されていても Android のカレンダープログラム上で再現されない
- そもそも Mobile の Google Calendar は終日のイベントを表示してくれない
2 については Google のサーバ側の挙動なのでどうにもならないけれど 1 については
- 同期に失敗しているカレンダーを Android 上で削除
- いったん更新(同期)して
- 再度同期したいカレンダーを追加
すると正しく反映されるようだ。こちらのアプリだとダメであちらのアプリだと大丈夫、という話もフォーラムなどでは見かけるが、手元の環境では一切そういうことはなかった。
とにかく
削除 -> 追加
を行う。
Andorid 上の削除は Google Calendar からの削除にはならず、あくまで Android とのリンクを切る、という感じで動作するらしい。
しかもこの問題、必ず反映されなくなるかというとそうでもない、とてもいやらしい発現具合。結局、
終日のイベントが表示されないのを分かったうえでブラウザで Google Calendar を開くのがいちばん確実
という状態。
しかし、かなり有名なバグっぽいんだけど全然直ってないのね。
cf.
- Androidでマイカレンダーの同期が不完全になる - Googleカレンダー 公式ヘルプフォーラム
- PCでの予定変更がandroidに反映されない - Googleカレンダー 公式ヘルプフォーラム
- android とGoogleカレンダーとの同期について - Googleカレンダー 公式ヘルプフォーラム
- Android端末とPCのGoogleカレンダーの同期バグ - Googleカレンダー 公式ヘルプフォーラム
- ジョルテ公式ページ - Googleアカウント同期設定
開発時に気づいたこと
- Ruby で書いたわけだが、意外なことに Google Calendar 上の event を削除できないライブラリが多い
- 必ずしも event の削除に成功するわけではない
- 全イベントを削除するのが面倒、あるいはできないからってカレンダーを削除して作り直しちゃダメ*3
2 については実は今も解決はしていない。個人的には cron で定期実行しているうちになんとなく解決するので良しとしている*4。
1 については一度 event を削除できないライブラリを採用して作り始めてしまい、仕方なく googlecl という Python でできたコマンドラインで Calendar などを管理できるツールで削除を行ってみたがこれを cron で自動実行することができなかった。*5
結局ライブラリを置き換えて Google Calendar へ投げる部分はすべて作り直した。また iCal のライブラリでパースして Google Calendar のライブラリでイベントを作成するわけだけど、
- Google Calendar ライブラリが end time を必要とするが元の iCal が終日イベントの場合に end time がないことがある
- Google Calendar ライブラリには「終日」を明示するメソッドがあるが iCal をパースするライブラリにはこれを取得する方法がない*6
- DateTime オブジェクトと Time オブジェクトの違い
- timezone が合わない*7
など、実際にいじってみて初めて知った細かい差異にいちいち引っ掛かった。
課題
API 呼び出しについてはテストがなんにもない。まさにレガシーコード。
当初は Google Calendar の情報を解釈するのに標準の rss/atom モジュールを使おうかと思っていたんだけど、これで Atom を解釈する例が見つからなかったので simple-rss を利用している。標準のライブラリが Atom に対応していなかった時代が続いてるうちに gem のライブラリで処理するのがフツーになってしまったようだ。ちょっと残念。まぁ依存も少なくていいんだけど、少しだけ標準添付のライブラリで処理できた方が嬉しいなと思った。
まとめ
Twitter でも結構長いこと不満を並べていたが、これでようやく RTM を起点にカレンダーで予定を俯瞰できるようになった。Android と Google Calendar との同期についての不満は解消されていないが、時が解決するかブラウザでの閲覧にだんだん慣れていくか、呼吸するようにカレンダーの削除 -> 追加が行えるようになるかのいずれかだろうと思っている。
ちなみに、今カレンダーアプリは
を使っている。もっと有名なものもあるんだけど iOS のカレンダーのように一覧上である程度情報が見えて、Evo の画面をちゃんと使い切るアプリがあまりなくてこれになった。ただし、カレンダーの追加/削除にはどうしても標準の「カレンダー」を使わなくちゃダメで、かつ最新の状態はブラウザで見るのが確実なので、結局
- ホーム画面に Google Calendar のブックマークを置く
- ホーム画面にフォルダを作って今挙げた二つのカレンダーを登録
という、なんだかなーという状態になっている。
*1 1回だけインポートできるツールはいくつかあるけど、このツールなら何回でも同期させられる
*2 例えば毎日同期をとるもの、毎時同期をとるもの、など。
*3 IDが変わり、URIが変わるので「照会」や「同期」している側で認識できなくなる
*4 真面目に対応するならエラーがゼロになるまで retry した方がいいんだろうけど、ダメなときはしばらくダメだったりするので対応は難しいんじゃないかなとなんとなく思っている。
*5 削除時に y/N で確認を求められるが、これをうまく制御できなかった。cron でなく手で起動した場合には動作したが、それでは自分の目的を達成できなかった。
*6 開始時刻が 0:00 で終了時刻がない場合に終日と判断するようにした。
*7 無理矢理削って処理したらlocaltimeになった
_ mitukiii [JavaScriptだとObjectの末尾に,があるとIEでエラーになるので大体ハッシュは末尾の,付けないようにして..]
_ wtnabe [原則的には付けない方がいいと思ってます。でも PHP と Ruby を書いてるときは残すことがそれなりにありますね。..]