古いMechanizeスクリプトを少しモダンにする

まずは定義

古い
Ruby 1.8.5 + Mechanize 0.8 + Hpricot 前提のもの
モダン
Ruby 1.9 + Mechanize 1.0 + Nokogiri 前提のもの

Mechanize 2.0 は新しすぎるので手を出しません。

WWW::Mechanize -> Mechanize 変更

Mechanize は 1.0 で WWW ネームスペースがなくなりました。これは機械的に置き換えます。個人的には常に以下のような subclass を用意していたので、この作業はそれほど大変ではありませんでした。

Bundler でまとめて gem のバージョンを管理

gem のバージョンを gem メソッドで指定できることを知って以降、とにかくあの面倒くさい時期の Mechanize に触れないように

gem 'mechanize', '< 0.9'
require 'mechanize'
require 'hpricot'

とかやっていたのですが、個々のファイルでこのように書いていると書き直しや gem のインストールが面倒なので Bundler でまとめてしまいます。具体的には

Gemfile

を用意して、

gem 'mechanize', '< 2'

などとします。で、

bundle install

します。

system の gem を汚さない方法

もし system wide な gem に変更を加えるのが難しい場合1

bundle install --path vendor

のようにして、変更を加えるコードの場所に gem をインストールします。これ以降の作業は全部

bundle exec ./script

みたいな形で行います。この場合は利用する gem は基本的に全部 Gemfile に書いておく必要があるので、

gem 'rake'

などを書き足す必要があるかもしれません。

最初のネック - Hpricot と Nokogiri の encoding の扱いの違い

  1. Hpricot ベースの Mechanize はパース時にもページの encoding はそのままスルー
    • form や link の検索時には "ラベル".tosjis などのように変換が必要
  2. Nokogiri ベースの Mechanize はパース時の encoding はすべて UTF-8 に統一
    • UTF-8 でコードを書いている場合は form や link の検索時には何も考える必要なし ex) link_with( "ラベル" ).click
    • ただしパース前の Mechanize#page は元の encoding のまま保存されている。

到達したページから何らかの情報を取得したい場合は一度手で UTF-8 に変換しないとややこしいです。特に Nokogiri に渡し直す場合は UTF-8 への変換が必須になります。

Hpricot から Nokogiri に切り替える

  • 何はともあれ全部 UTF-8 化する
# -*- coding: utf-8 -*-
$KCODE='u' unless defined? ::Encoding

を付けて回りましょう。もちろん関連ファイルは全部 UTF-8 に統一します。もうさすがに ja_JP.eucJP な環境はない…ですよね?

  • 文字コード変換をどんどん削除
link_with( :text => 'ラベル'.tosjis ).click
-> link_with( :text => 'ラベル' ).click

これで内部で UTF-8 のパース済みデータを持っている Mechanize と比較的仲良くできます。

恐らく、当初思っていたよりは面倒は起きずになんとかなると思います。

パースに失敗する場合

もっと詳しいところがあるのでどうぞ!

Ruby 1.9 対応

上の作業だけで Mechanize 1.0 + Nokogiri 1.5 に対応できていたら、そのまま Ruby 1.9 に対応できる可能性は比較的高いです。ぜひ rvm などから ruby のバージョンを切り替えてテストしてみることをお勧めします。

ただし、1.9 ではどうしてもうまく動かない場合もあります。(いま実際にそれでハマっているコードも手元にあります。これをどうするかは今後考えます。)

  1. そんなことあるのかな? 

iTunesムービーのオプションと同期

オプション

ムービーとミュージックビデオ

今回初めて iPod にムービーを取り込んでみて気がついたことが、

アルバム単位にまとまってくれない

ってこと。不便だ。不便すぎる。と思っていたら Twitter で教えてもらった。

08:07:40 <hsbt> @wtnabe ビデオの種類をミュージックビデオにしてプレイリ
ストかするんだ
08:08:03 >wtnabe< @hsbt おぉ。あざっす。帰ったらやってみるっす!

iTunesのビデオのオプション

とは言っても実際はこれ8月6日の話。

ムービーの [ 情報を見る ] -> [ オプション ] の中で

  • メディアの種類

を変更する。

再生位置の記憶

先ほどの画像を見てもらうと分かるけど、

  • 再生位置を記憶する

というオプションもこの中に入っている。どうやらデフォルトでは再生位置を記憶してしまうらしい。映画とか長いビデオならともかく、普通の楽曲よりも短いくらいのビデオの再生位置を覚えられるとかえって邪魔なので外しておく。

メタデータだけの変化は同期対象にならないらしい

Twitter / wtnabe: 全部同期やめて消して、もう一度同期取るようにして転送 …

一回同期設定をオフにして全部消して、もう一回同期し直したらちゃんと転送された。面倒くさいというか、これちょっとバグくさい気がするなぁ。

※ 最新の iTunes 9.x 以降では試していないので動作変わってるかも。

Perl で引数の解釈と Usage の作成、のオレ流まとめ

※ 最近 Perl の話題が多いのは昔のスクリプトをいじっているからー。

先に結論を書くと、

  • Getopt::Long
  • Pod::Usage

を使う。

ベストプラクティスから外れているのは CPAN そのものを積極的に利用する気がないから。実質標準あるいはまさに標準であり、Perl 以外に特別なものが必要ないか、あるいは OS というかディストリビューションのパッケージシステムに組み込まれているケースが多く、導入が楽であるということが極めて重要。

Getopt::Long

Ruby の optparse ほど賢くないので、usage の自動生成とかできない。しかし何はともあれ引数の取得だけはかなり楽なので、そこだけに期待して利用する。

Pod::Usage

まず最初に

POD はちゃんと書け。

で、基本的には

  • -verbose の値によって表示するドキュメントのボリュームを設定
  • -input によって利用する pod の収まっているファイルを指定

くらいを使う。

日本語も書ける。ただしどのバージョンから公式に利用できるのかはよく分からない。1OSX 10.3 に入っている Perl 5.8.1 RC3 では日本語は化けたが、Debian etch(4.0) に入っている 5.8.8 では問題なく扱える。

=encoding

で Encode の解釈できるエンコーディング名を書いておけと言われているが、たぶん locale とか terminal とかその辺のエンコーディングが統一されていれば、書かれていなくても問題なく解釈、表示できるっぽい。

  1. あちこちの blog などで自力でパッチを当てたりして日本語を利用している人を見ることができる。 

Realforce91U 3日目

ディスコンになったのでリンクは別な商品です。

※ 実際に手に入れたのはもっとずっと前なんだけど、フルタイムで使うようになってから3日目という意味です。

意外とすぐに慣れ、PageUp, PageDown なんかもフツーに使える。これは SpaceSaver とか ThinkPad とか使ってたときの感触を手が覚えているからか。ただモバイルノート使いのサガとしてまだ押下量が足りないらしく、スイッチが入らない場合がチラホラ。command

  • w のつもりで w が入る、C-x o のつもりが C-o になるなど下の方のキーを押す力がどうも弱いらしい。これはチルトしてて、上の方のキーにより力が入りやすくなってるからかもしんない。やめてみよう。

あと、ちょっとマウスが遠い。テンキーレスなのでずいぶんマシなんだけど、カーソルキーなどの分、気持ち遠い。

そんなところ。

もちろん今までに買ったキーボードの中では最高値であり、使い心地がいいのは言うまでもないんだけど、とりあえず現状の問題点をあえて挙げてみる遊びをしているわけです。別に本気で文句言ってるわけじゃないです。以前大騒ぎした けれども OSX 10.3 でも問題なく使えます。

Realforce は音が控えめというところも気に入っていたんだけど、いざ実際に使い始めてみるとさすがにノートのペチペチよりはるかに音が大きい。おかげでいかに自分がたくさんキーを叩いているかがよく分かってきた。昔、Project Orca だの Dolphin だのと言っていた頃を思い出した。まぁ結局こういう日記を含めて考えごとをほとんどそのまま Wiki やら YAML やコードやらに叩きつけているからなんだな、きっと。

久しぶりに朝まで寝た

ぐっすり、かなぁたぶん。

最近途中でよく目が覚めていたので、今日は朝まで寝れてとても気分がいい。いやー睡眠てほんと大事。やっと調子戻るかな。

一区切りぃー

普段はあまり区切りがないんだけど、今回は珍しく分かりやすい区切りを迎えた。細かい不満はなくはないけど、目をつぶれる範囲なので、まぁ上出来なのではないかと自己採点しつつ、もっと力をつけないとなぁとも思うのであった。

夏休みは終わったけど、今からやっと休みって感じだ。

About

例によって個人のなんちゃらです