*1  USB Net Power 8800 Single Outlet Network AC Power Controller

以前から自宅のルータがインターネットに繋らなくなることがしばしばあり、ルータのファームをあげたり交換したり幾つか方法を試してみたのだがどうもうまくいかない。恐らくISPであるComcast側の問題なのだろう。
幸い殆どの場合は電源をOff/Onすれば繋がるのだが、最近頻度が高くなってきたのとなんにせよ面倒、かつ外から自宅への接続などは自宅にいないと復帰できない事もあり、なにか解決方法が無いかと思って見つけたのがこれ。 端的に言えばUSBからオン・オフを制御できるAC電源のソケットである。 この手のものはサーバ管理用として幾つもあるが大抵は高価でサイズも大きい。これはそこまで多げさではなく、送料を入れても30ドル程度とお手軽である。基本は Windows 用の付属ソフトからの操作になるが、ちょっと調べてみると Linux からも Python で制御するコード usbnetpower8800.py を見つけた。 Ruby から使いたかったので ruby-usb を使ってポートした。 ステータスを取るコードがどうも動かないのだが、とりあえず用途には足りるので置いておく。

うちではこのアダプタにルータの電源を繋ぎ、自宅の Debian から外の4,5箇所に 10分おきに Ping をうち、全てが Timeout した場合にルータの電源をオフ→オンして再起動する、というのを仕込んで以降、数日に1度くらい再接続しているようだが、こちらは殆どそれを意識せずに生活している。大変よい買い物をした。

基本的にはUSB経由で電源を操作できるということなので、なにかの監視系ソフトと組み合わせてアラートが出たら電源をONにして繋いだ回転灯をつける、なんて事もできるわけで、30ドルくらいで意外と使いでのあるデバイスである。日本でも取扱いがあればいいのに。唯一残念なのはUSB接続が切れた際の挙動が電源オフ固定であることくらいか。これを選べれば完璧なのだが。

*1  Amazon Product Advertising API の Signature 対応

この blog でも使っている Amazon A2S(ECS4.0) 呼び出し用の ruby library だが、5月15日から名称を Amazon Product Advertising API と変更するのに伴い、リクエストに秘密鍵を用いた署名が必要となり、現在の形式は8月15日までで使えなくなるらしい。
有料サービス提供を見据えてのアクションなのか、他のEC2とインターフェイスを合わせたいのかが理由かと思うが、現状広く使われているAPIをたった3ヶ月で書き換えないとすべて無効にしてしまうというのは、なかなか豪胆なことだ。しかも ECS3.0 から 4.0 にしたのもまだ去年だと言うのに。

私個人としては個人で使う分をどうにかすればいいだけではあるので、取り合えずどうにかした。一応、このblogに出ているAmazonのリンクはほとんどがこれ経由なので、問題なく動いていると思う。更新したファイルは CodeRepos に置かせてもらった。以下からどうぞ。以前と違うのは、上記の、ないし誰が書いた Amazon の API を利用する公開されたライブラリを使おうと思った場合、Amazon.comサイトで Product Advertising API アカウントを作成 し、Accesss Key ID と共に Secret Access Key を取得する必要がある。Secret Key は非公開前提なため、上記の公開ファイルからは ID と Key は省いている。

API 呼び出し側の実装としては、この Secret Key を用いてリクエストを正規化→HMAC::Sha256のSignatureをTimestampとともに渡すと言うことをやらないといけない。

この辺の処理はAmazon Product Advertising APIの認証の件 - zorioの日記を参考に、と言うかほとんどそのまま使っている。何故か openssl の OpenSSL::HMAC::digest を使った SHA256 Hash は不正といわれて通らず、digest/sha2 を使って計算した HMAC では大丈夫だった。

それにしてもこの秘密鍵、OSSでソースを配布するなんて場合には非常に不便。たださんがAmazon.co.jp のフォーラムでOSSからの認証利用について質問しているようだが、そもそもこんなのはAmazonにとっても使われてなんぼなものなはずであり、どうしたいのかがよくわからん。あと、JavaScript から呼ぶのがすごい困難な気がする。どうやって Secret Key を隠せばいいんだろう?

*1  $ python -m SimpleHTTPServer

Command-line Fu の Popular で見つけた。
$ python -m SimpleHTTPServer
と実行するだけで、実行したディレクトリを root とした http サーバが 8000 番で立ち上がる。http://$HOSTNAME:8000/ でディレクトリのファイル一覧にアクセス可能。アクセスするとアクセスログも STDERR に出力される。ちょっとしたファイルの受け渡しなどに便利かもしれない。

*2  ruby WEBrick でワンライナー

ついでにrubyで同じ事をする one liner 。webrick を使ってこんな感じか。
$ ruby -r webrick -e 'WEBrick::HTTPServer.new({:DocumentRoot => "./", :Port=>8000}).start'
デフォルト値があるかどうかだけの違いではある。

mixi2gmail の修正をしていただいた

Posted by yoosee on Web at 2009-03-31 17:42 JST

*1  mixi2gmail

去年に書き直した、mixiの日記を取得してgmailアカウントにメールとして送信するツール mixi2gmail が最新の gmail で表示がおかしくなっていたのだが、時間がとれずに放置していたら たださんが修正してくださった。ありがたい。最新版は以下の CodeRepos.org よりどうぞ。
http://svn.coderepos.org/share/lang/ruby/mixi2gmail/
と言いつつ、法事のために日本に来る必要があったりして未だに試せてもいないのであるが…。

twitlogger.rb 更新 (rev.13)

Posted by yoosee on Web at 2008-04-22 20:00 JST

*1  twitlogger.rb 更新

Twitter のタイムラインログ記録スクリプト twitlogger.rb の更新。ダウンロードは前回記事、ないし twitlogger.rb より。

変更内容としては、since=... の時刻を「前回取得したタイムライン中の最新更新時刻」にしてもまだ取りこぼしが出るケースがあるようなので、since の時刻に since_margin と言うパラメータでマージンを与えた上で取得したタイムラインがログ上で重複しないような処理を入れた。狭間の取りこぼしが気になる人はこの値を適当な秒数、例えば 30 くらいにしてみると少しマシになるかもしれない。

正直なところ個人的には「取りこぼし無く取得しよう」と言うモチベーションは高くないし、Twitter API 自体がよくエラーを吐いたりおかしなタイムラインを返したりするので、あくまで出来る限りの努力をするというスタンスで。

twitlogger.rb 更新

Posted by yoosee on Web at 2008-04-09 18:00 JST

*1  twitlogger.rb 更新

少し前に書いた twitter のログ取りツール twitlogger.rb を走らせているが、どうも timeline の取得に抜けがよく発生していた。見てみたら 304 Not Modified エラーが頻発していたようだ。恐らくこれは API に since=... の形で送信している前回取得時刻がよろしくないのだろうと思い、現状の「前回取得時刻」から「前回取得した timeline の created から最新時刻のもの」を送るようにように修正。修正後に数時間走らせてみた感じでは取りこぼしは無くなった。

どうも API で取得できるタイムラインは「現在時刻の数分前」程度な事があるようで(DBレプリケーションの都合?)、単純に前回取得した時刻を since で投げてしまうと 304 Not modified エラーが結構な頻度で発生してしまうみたい。修正したものは前記事、ないし twitlogger.rb からどうぞ。これも近いうちに CodeRepos に置く予定。

*1  mixi2gmail

mixi2gmail少し前から mixi のちょこちょこした変更もあって以前書いたmixi2gmail.rb の挙動が怪しくなっていたので、WWW::Mechanize 0.7.5 への対応も兼ねてコードを書き直した。最近のバージョンでは取得結果を Hpricot::Doc で返すようになり、XPath での検索も出来るようなので、以前の正規表現で切り出す形から XPath で抜き出す形に変更。画像の扱いもHTMLの中にインラインで表示されるよう、mixiアルバム画像貼り付けへの対応も含めて少しマシにした。
また Mechanize が Net::* を上書きする挙動も無くなったようなので、ちゃんとNet::SMTP を使って送信する形に書き換えた。数日試したが、ちゃんと動いているっぽいので公開。(最新版はCodeReposより)挙動としては、基本的に Linux 前提で、~/.mixi/mixirc に幾つか設定を入れて実行すると、友達の日記を画像を含めて(添付として)指定したメールアドレスに 1日記 1 HTML メールとして送信する。次回実行は新しいものだけを対象にし、また除外リスト、ウォッチリストなどの設定も出来る。

WWW::Mechanize は以前にも書いたが、ログインが必要なウェブサービスからコンテンツを持ってくるなんて言う用途には手軽で便利だ。Hpricot は Htree を改良したっぽいコンセプトだが、そこそこ高速になっているし、non well-formed な HTML 相手に Xpath や css 指定が出来るのは便利。

この手の小物は trac を直してそっちで公開したいが、どうも腰が重い。

*2  (追記ないし注意書)

初回挙動は new_friend_diary にいる全ユーザの list_diary から全日記を引っ張るので処理が相当長くなってしまう。時間が長すぎると、メモリを圧迫したり、画像取得に失敗する可能性がある。
動作としては ~/.mixi/lastid.log にある数字より大きい view_diary.pl?id=.... の id の日記のみ取るようになるので、初回も適当な数字を入れておくのが無難かも…。ファイルが無いとエラーになるのはとりあえず 0 入れておいた。

ちなみにこういう挙動にしたのは、以前 mixi が new_friend_diary に 1ユーザ 1日記しか載せなかった期間があった(ので単純にそこから取ると2個以上書いているユーザの日記で取りこぼしが発生した)からなので、現状では挙動変えてもいいかもなと思わないでもないんだけど、初回以外は問題でないだろうしなぁ。

*3  再追記: たださんからもらったpatchを適用

たださんがpatchを作って送ってくれたので適用しました。テスト足りてなくてすいません。頂いたメールを引用すると以下のような変更・修正になってます。
  • rubygems対応 (Mechanaizeをgemで入れてる人向け)
  • lastid.logの初期値対応
  • HTTP_PROXY対応
  • 空のexcludelistとwatchlist対応
他にも幾つかコメント頂いたんだけど、近いうちに coderepos に置いておくのでその後追々。

*4  再追記: 日記トップ画像を1つしかfetchしない問題のfix

T/O。XPath の指定をミスってました。

*5  再追記: GmailのMultipart取扱い変更への対応とCoderepos.orgへの移動

たださんの修正を受けた最新コードをCodeReposに移動
http://svn.coderepos.org/share/lang/ruby/mixi2gmail/

*1  twitlogger.rb - friends_timeline を logging

そういうもの。基本的には Basic 認証をかませつつ決まった URI を叩いて戻り値の XML を REXML に食わせているだけ。ログファイルは日毎に YYYYMMDD.log として分けるようにしている。
まぁ GTalk に全部吐き出させて置けば Gmail に全部溜まるし表示はBitlbee+IRCクライアントで出来るよという話もあるけど。

*2  twittail.rb - twitlogger のログを装飾表示

output of twittail更にそのログをコンソール上で tail -f の代わりに表示するスクリプト。すごくニッチなツールだけど個人的には割と便利。特徴としては
  • 実行するとログ最後尾に移動して更新があったもののみ表示
  • VT100用コンソール文字修飾(太字・下線・色付け)
  • URLのタイトルを展開して付与表示
  • @reply があった場合、先頭の reply ユーザの過去ログを展開して表示
ちなみに reply 展開は Auth付きAPIの制約条件(60分内に70アクセスまで)を避けるため、認証無しで取得しているので Protected の Timeline は表示できない。

入力欄とか Notify を固定表示する部分も作りたいような気はするんだけど、 ncurses に手を出すのはちょっと憂鬱のような。

*3  4月9日追記: twitlogger.rb 更新

API に since=... の形で送信する前回取得時刻を、timeline の created 時刻の最新のものにするように修正。どうも API で取得できるタイムラインは「現在時刻の数分前」程度な事があるようで(DBレプリケーションの都合?)、単純に前回取得した時刻を since で投げてしまうと 304 Not modified エラーが結構な頻度で発生してしまうみたい。修正後に数時間走らせてみた感じでは殆ど取りこぼしは無いようだ。

*4  4月22日追記: twitlogger.rb 更新

since=... で渡す最終取得日時に、since_margin と言うパラメータでマージンを持たせることが出来るように変更。初期値は 0 (since は前回取得したタイムラインの最新時刻)で単位は秒数。

Ruby から Amazon A2S (ECS 4.0) を使う

Posted by yoosee on Web at 2008-03-27 09:00 JST

*1  Amazon ECS 4.0 への対応

Amazon Web Servicesblogを含むサイト内の幾つかのコンテンツで AWS (Amazon Web Service) を使っているが、ECS3.0 が今月末で廃止という事で現行バージョンの ECS4.0 への対応をした。今までAWSへのアクセスに使っていた ruby-amazon は ECS4 非対応なので ruby-aws を使えとのことだが、手元で使うのは ASIN からの lookup 程度なのでお手軽に自前実装。

基本は REST でリクエストして帰ってきた XML を REXML に食わせ、XPath で指定して必要な部分を切り出すだけ。そのまま使うには微妙かもしれないし、ライブラリとしては前述の ruby-aws を使えばいいと思うが、参考になる人がいるかもしれないので公開しておく。今のところ自分では使ってないが、キーワード検索も一応実装してある。REST のパラメータや戻り値については Amazon Web サービス入門 等を参考にした。

mixi の html/css リニューアル

Posted by yoosee on Web at 2007-10-01 22:00 JST

*1  mixi の html/css リニューアルと mixi2gmail.rb のアップデート

予告されていたとおり、mixi の html/css が今日付けで大幅に更新された。私の回りでは概ね不評のようだが、table を駆使したレイアウトだったのが xhtml 的にだいぶましになったのはよいことじゃないかな (と言いつつ well-formed ですらないけど)。そこかしこに id が設定してあるので xpath での scrape は楽になったと思う。不満がある人は user css なりで勝手にレイアウトしなおすのがいいのかも。w3m で見難くなったのは個人的には辛い所だけど、直接アクセスする機会はそう多くないのでまぁいい。

例によって mixi日記→Gmail が動かなくなっていたので、parse 部分だけ改変した mixi2gmail.rb を置いとく。html が比較的素直なので20分くらいの作業で済んだ。10月1日深夜の html で動くのを確認。Trac 直さないとな。

ちなみに Plagger は WWW::Mixi::ScraperCustomFeed::MixiScraper の組み合わせで使うのがいいらしい。

*1  ニュース記事の title 要素内容の変化

IRC の bot に、出された URL のタイトルを取得して NOTICE で出力する機能を持たせている。最近は title 要素に見出しが入っているので難なくそうした情報を得ることが出来るが、これは当初からこうだったわけでは無く、ここ数年の傾向である。

昔の新聞系ニュースサイトでは、個別記事の title でも
<title>asahi.com - 朝日新聞社のニュースサイト</title>
のようなものであり、記事の見出しを取得するには以下のようにして、 html の body から特定箇所を狙って文字列を抜き出す必要があった。
....
  if(/<meta name="TITLE" CONTENT="(.+?)">/im =~ page)
     title = $1.gsub(/<[^>]+?>/, '').gsub(/[\r\n]/,'').toeuc
  elsif(/be\.asahi\.com/ =~ @uri &&
        /<!-- FJZONE START NAME="MIDASHI" -->(.+)<!-- FJZONE END NAME="MIDASHI" -->/im =~ page)
     title = $1.gsub(/<br>/, ' ').gsub(/<[^>]+>/,'').
        gsub(/[\r\n]/,'') 
....
その見出しすら <h1> などの見出し要素ではなく、見ての通り、特定のコメントで囲まれて区別された部分になっていて、文字の大きさ変更や強調には <FONT> が多用されていた。さらに言えばそうしたルールすら、同じ新聞社のサイトでもカテゴリによって違うなんてことはざらだった。昔の、と言っても、この処理を書いたのは 2004年前半で、せいぜい 3年前の事だ。

今になって見てみれば、ニュースサイトに限らず個別記事の title 要素に個別の見出しタイトルが入るのは極普通の事になっている。まぁ今でも ZAKZAK のように<title>ZAKZAK</title> と言うスタイルを貫いているサイトもあるが、今ではむしろこちらが例外だろう。

こうした title の使われ方の変遷には幾つか原因があるのだろうが、「CMSツール (Blogツールを含む) の普及と機能改善」「SEO に対する認識」「ソーシャルブックマークによるタイトルの可視化」あたりが影響をあたえているんじゃなかろうかと思う。

CMS ツールによって「見出し」を1度入力すれば必要な場所に配置されるようになったし、Blog ではそうした「title == 見出し」が当然のこととして扱われた。RSS/Atom フィードと言う「見出し」が要となるサービスも知名度を得た。SEO 意識の向上によって「html 的に正しい文書構造」を意識して出力用テンプレートが作られるようになった。更にソーシャルブックマークは title にある情報をそのまま再利用するため、title の持つ重要度が再認識される切っ掛けになったのではあるまいか。

*2  セマンティックウェブの将来像

ともあれ html 的に正しい位置、構文としての意味が与えられた場所にリッチな情報が入るのが常識として扱われる事は、いわゆる「自律的なWebシステム」にとってもありがたいことだ。次は全ての HTML が、同時にそれに対応した標準化されたデータ形式を持つ事、例えば個別記事が個別記事のみを含む別々の RSS フィードを持つことを妄想するが(一部の blog tool では trackback auto discovery のためにコメントアウトされた XML が埋め込みされるが、通常は全文がはいらないし標準化されたものでも無い)、今後そうした方向に進むと言う気配はあまりない。

現実としては、そうした話を個別の html 作成者側では無く「Web情報の再利用者」側で行うのが Plagger のようなWebスクレイピングツール であるわけなので、方向性としては当分はこちらなのだろうね。

What happened on Ruby, Where Ruby goes

Posted by yoosee on Clip at 2006-12-04 23:42 JST

*1  mput's diary - 2006-12-04

This entry is rough translation of mput's diary - 2006-12-04. 'I' on this document is 'mput', who is a maintainer of ruby_1_8_5 branch. Please gime me a comment when you find anything wrong.

*2  What happened on Ruby

Short Summary: Maintenance branch based on ruby 1.8.5 was created after many twists and turns. Bug fixes for 1.8.5 will be under the branch. 1.8.5.2 has been released as a first release.

Details: Roughly to say, there were two branches on Ruby; trunk and the others. We planned to develop on trunk branch, and the others are for maintenance. But practically speaking, we developed on both of them. We've added new functionalities and major changes that affects backyard compatibility not only to trunk but also to maintenance-branches. We've left it as it was since there were few committers*1 who annoyed about it.

Security vulnerability CVE-2006-5467 was reported on such situation. Just one-line patch was able to fix it, but it's difficult since ruby 1.8 branches had a lot of changes form 1.8.5 - it was released more than 10 months ago. It's heavy request for most of ruby users to version up just for bugfix. We discussed about this issue in ML begun from [ruby-dev:29726]. As a result, we fixed bug as like [ruby-dev:29751].

Few months before, some Rubyist come together and discussed in RubyConf with eating chocolate*2. We've concerned that I'll take care of Maintenance branch. So I suggested on [ruby-dev:29767] to freeze ruby 1.8 that is not stable at all even if it's called Maintenance version. No new functions and major changes to 1.8, just bug fix and maintenance on it. Contrary to my expectation, there were not a few objections for this idea. As a result of discussion in ML, We continue to develop on ruby 1.8, and to create maintenance branch under 1.8.5.

On 1.8.5 branch, we were ready to release 1.8.5.1 that has fix of CVE-2006-5467 (tag exists on CVS repository). But new vulnerability was reported to security@ ML before we released it. Someone suggests that it's not good idea to release two different versions in such short term. So that we released 1.8.5.2 without 1.8.5.1.

*3  Where Ruby goes

Now, we have at least three branches; trunk, ruby_1_8, ruby_1_8_5. These branches will coexist until some later date.

We might create four new branches from ruby_1_8; ruby_1_8_6, ruby_1_8_7, ruby_1_8_8 and ruby_1_8_9 (I'm not sure 1.8.9 really released or not). They (and ruby_1_8_5) will be disposed on some conditions: for example, ruby_1_8_N branch will be deleted when ruby_1_8_(N+2) will be created. By technical constraint*3, we'll delete when we reached a branch 1.8.N.4999. Also we still don't have clear plan about whole ruby_1_8 trees after a branch ruby_1_8_9 created.

We plan to release Ruby version 1.9.1 from trunk branch at Xmas 2007. If there will be no paradigm shift, branch ruby_1_9 and ruby_1_9_1 will be created in similar fashion of 1.8.

I draw a picture of branch tree based on the policy I wrote above. By the policy (N+2) branch will be deleted, there are maximum 7 branches available at the same timing. 4 branches are on maintenance, trunk for development, and 2 are middle of them*4.

We have several undecided things like this:
  • Who will maintain new branches?
  • When a branch will be created (ahead or after preview) ?
  • How to hand over each branch-manager's responsibilities when a new branch created?
these topics are still under discussion.
Ruby 1.8 to 1.9 branching plan

*1 Since ruby 1.7 is enough stable, many ruby users used 1.7 even if it's unstable branch. It might make committers to do anything on trunk.
*2 I consumed for the most part of chocolate. Be careful to take chocolate in midnight, because it easily changes into your weight.
*3 It's very rare case. If we released 1.8.5.x every day, .4999 will be released at Aug 2020. 1.8.6 may be released until then.
*4 Maybe as you can read from my wrotes, I unconvinced STABLE branch by technical reason. On the other hand, I understood it should good for motive.

mixi2gmail.rb が動かなくなっていた

Posted by yoosee on Web at 2006-10-21 23:42 JST

*1  mixi2gmail.rb が動かなくなっていた

どうも mixi.jp で login.pl の html が変わったらしく、email field に type=text の記述が無くなったようだ。それだけなら問題ないはずが、WWW::Mechanize では input に type 指定が無いと skip してしまう仕様だったらしく form fields を正しく拾えていなかった。とりあえず WWW::Mechanize::GlobalForm#parse の case 文に else で default behavior を突っ込んでおく。しかし WWW::Mechanize 自体があまりメンテナンスされていないようだし、Plagger に移行するなり他のツールを使うなり自分でメンテナンスするなりしたほうがよい感じ。どうしようかな。

*1  「Perlベストプラクティス」一通り読んだのでまとめ

えーと、先日 Ruby信奉者の本拠地サイトってどこにあるんだろう と書いた上に Ruby もきちんと知っているとは言いがたいんだけど、これを読んで「Ruby 使えばいいのに」と思ってしまった。
参照の変数名は_ref付きに。
そもそも参照渡しが大量に必要になる時点で不便。Perl の getter/setter に参照を入れる場合にいつも悩んでしまう (ObjectTemplate 使う際は結局 ref で入れることが多いけど) 。Ruby のように配列やハッシュもオブジェクトとして渡せればいいのに。
if-efsif-efsif-elseの連鎖は止めてテーブル参照に。
これは Perl4 の頃から不思議なんだけど、何故 case が使えるようにしないんだろう?
エラー発生でundefを返さずに例外を出す。
Perl の例外って言語仕様にきちんと無いので使いにくい気がするけど最近のはそうでもないのだろうか。Ruby では標準で begin ... raise ... rescue が使える。
is_validやhas_foundなど真偽値にちなんだ名前にする。
foo.valid? や bar.found? と書ければ一目瞭然。
サブルーチン、メソッド、変数、ラベル付き引数の名前は小文字のみ。パッケージ、クラスには大文字と小文字を。
Rubyだと自然にそうなる。賛否ありそうだけど。
モジュールやクラスの内部専用のサブルーチン名には、先頭に_を付ける。
命名方針はともかく、Perl の場合にはそもそも package に隠蔽という概念が無かったので、その部分はいかんともしがたかった。今は private pragma があるんだっけ?
どうしても必要なとき以外はmyによるレキシカル変数だけを使う。
なぜ標準が lexical にならないんですかね(もちろん過去互換性のためだろうけど)。いや単に毎回 my を書くのが面倒だというだけの話なんだけど、use strict; したら lexical じゃないと怒られるのになぁと。
ループで配列やハッシュのインデックスを使わない。配列を直接ループさせる。
こんなのや、 keys %hash は遅いから values %hash を使う なんてのは Bad Know-how 以外の何者でもないな。Ruby なら hash.each do |key, value| .... end と明瞭にかける。
$_の乱用は混乱の元。
for, whileは$_ではなくmy $hogeで名前付きレキシカル変数を使う。
$_ は Perl 習いたての頃は凄い仕組みだと思っていたけど、今となっては混乱の元でしかないというのが悲しい。

Perl の There are many ways to do it. と言う考え方は好きだけど、実際には too many ways だったり、後から小声で But, the best way is only one. だなんて言われそうな気がするのがなぁ、と思ってしまう。

いやもちろん、こんな事だけで「Perl よりも Ruby の方がいいよ!」などと言いたいわけではないので念のため。所詮は言語なんて、使えるなら好きな方を、制約条件があるなら使わなければならない方を使うしかないんだし。でも上記のような部分は、個人的には Ruby の方が楽だなと思う。

それはともかく「Perlベストプラクティス」は読んでみようと思った。*::Util とか全然使ってなかったけど便利そう。結局は「不便な事も少なくないけど捨てがたい」というのが Perl の罪深いところなのかも。

*1  劇場管理人のコメント - bewaad氏のサイトは、Ruby信奉者のサイトと同じ香ばしさがある件

うーん、本文自体はあまり興味が無いんだけどこのあたり。
Ruby信奉者のサイトに集まる人たちのサイトの空気にどこか似ているところがあるという点です。
(中略)
一方で、そういうプログラマーたちは、やたらと一般人には意味不明のIT用語をこねくり回し、Railsで作ればいいのに、バカだなぁ。という議論をしたりします。
「Ruby信者は○○だから」云々と言うセリフをたまに見掛けるんだけど、正直そういう類の Ruby 信者って出会ったことが無いので不思議に思っている。個人的には言語として Ruby は使いやすくて好きだし、 ruby で書かれたソフトや ruby 自体の開発者もいくらか知ってるんだけど、そういう人達が盲信しているようには全く見えない。Railsは好きじゃないと言う人も少なくないし。

巷で言われるような「信者」が全くいないとも思っていないんだけど(比較的マイノリティの言語利用者は信者呼ばわりされやすいものだし、実際に布教してしまう傾向もある)、Ruby信奉者のサイトに集まる人たちのサイト って一体どこにあるんだろう? サイトと言っているけどWebサイトでは無い? そう言う会員制のクラブでもあるんだろうか。

あ、すぐ「それPla(ry」と言う人達なら知ってます。

*1  getmovie.rb - youtube の動画をダウンロードする ruby script

google videoやyoutubeとかの動画を落して保存。 を参考に ruby で youtube の flv をダウンロードするものを書いた。youtube 以外にも色々対応していて高機能な php をそのまま使えば良い気もするが、半分趣味と言うことで。

youtube の url を引数に与えるとタイトルをファイル名にしてダウンロードする。気が向いたら svn/trac にも登録するかも、程度で。

Amazon Wishlist が複数リスト対応

Posted by yoosee on Web at 2006-02-23 23:42 JST

*1  amazonwishlist.rb

Amazon wishlist に複数リストの管理機能が追加されたようで、Wishlist を複数使い分けたり自分のお勧めリストとして使うことも出来るようだ。既存の Wishlist は Recommendation として、新規に Wishlist を別途作ってみた。

以前に書いた Amazon wishlist 公開スクリプトEWS での WishlistSearch が動かなかったので Webページから情報を取得するようにしていたのだが、相変わらず EWS 経由ではデータが取れなかったのと Wishlist ページの URL が変更されていたので追従して変更。アイテムについて書いたコメントをうまく引っ張れるといいんだけど、EWS からはやはり取れないな。

*1  multipart mail 添付の zip ファイルの中身の csv ファイルを読む ruby スクリプト

なんとなく用途は想像が付くのではなかろうかと思うが、ちょっと欲しくなって作った。こんな感じ。
require 'rmail'
require 'tempfile'
require 'zip/zip'

mail = RMail::Parser.read(STDIN.read)
if mail.multipart?
  mail.each_part do |part|
    if /\.zip$/ =~ part.header['Content-Disposition']
      tempfile = Tempfile.new('maildecoded')
      tempfile.write part.decode
      tempfile.close

      zipfile = Zip::ZipFile.new(tempfile.path)
      zipfile.each_with_index do |entry, index|
        if /\.csv$/ =~ entry.name
          csvdata = zipfile.get_input_stream(entry).read
          # do something with csvdata
        end
      end
    end
  end
end
ZipFile はどうも一度ファイルに吐き出さないと使えないっぽいので tempfile を使った。

W-ZERO3発売, Ruby on Rails 1.0 リリース

Posted by yoosee on Clip at 2005-12-14 23:42 JST

*1  W-ZERO3 本日発売

今日も量販店には長い行列が出来たらしい。私は少なくとも 1台目の携帯(PHS)としては買わないことにしたので茅の外から眺めるのみなのだけど、周りでも数人手にいれていて楽しそうだ。曰く「ハードウェアとしては素晴らしいが UI が使いづらい」とのこと。Treo(略)

*2  Ruby on Rails 1.0 リリース

これでしばらくは仕様変更とかに悩まずに作れるだろうか。

mecanize.rb で mixi diary を自動取得する

Posted by yoosee on Web at 2005-09-02 23:42 JST

*1  WWW::Mechanize alike in ruby

WWW::Mechanize は Webページに対して、ブラウザからのアクセス的な処理を自動化して行える ruby library。例えば
http://example.com にアクセス → 1番目の form の各フィールドに foo, bar, baz を入力して submit → ページ内の "foo" を含む link を列挙してクリック → ページを取得
と言ったアクセスの動作を記述できる Ruby library 。元は Perl に同名の WWW::Mechanize があり、それの ruby 版と言った立ち位置のようだ。Web Test フレームワークで同様の機能を持つものは結構あるが、それをプログラム内から使えるようにライブラリ化したものと考えればいいかも。

*2  WWW::Mechanize alike in ruby を使って mixi にアクセス

mixi へ login した後に新着日記の URL 一覧をとるには、以下のようにすればいい。
require 'mechanize'
username = 'foobar@example.com'
password = 'foobarbaz'

agent = WWW::Mechanize.new {|a| a.log = Logger.new('access.log') }
page = agent.get('http://mixi.jp/')
form = page.forms[0]
form.fields.find {|f| f.name == 'email'}.value = username
form.fields.find {|f| f.name == 'password'}.value = password
form.fields.find {|f| f.name == 'next_url'}.value = '/home.pl'
page = agent.submit(form, form.buttons.first)

if /url=([^"])"/ =~ page.body
  link = 'http://mixi.jp' + $1.to_s
  agent.get(link)
end

diarylist = agent.get('http://mixi.jp/new_friend_diary.pl')
diarylist.links.each do |link|
  diaryurl = link.href # => 'view_diary.pl?id=12345&owner_id=2345'
end
といった感じ。page.body が html text を持つので文字列操作などをしたいときはこれを使うと良い。

*3  mechanize.rb と net/smtp を同時に require → トラブル

しかし便利なだけかと思ったら微妙な落とし穴と言うか不具合が。mechanize を使いつつ net/smtp を使うと、Net::SMTP.start(host) ... が
/usr/lib/ruby/1.8/net/smtp.rb:393:in `do_start':
private method `open' called for Net::InternetMessageIO:Class (NoMethodError)
などというエラーを吐くんである。net/smtp のみを使った場合はなんの問題もなく、mechanize を require すると発生する問題のようだ (さらっと書いているが突き止めるのに数時間かかった…)。

調べてみると、mechanize には mechanize/net-overrides/protocols.rb と言うファイルがあり、mechanize.rb の先頭で load-path に上記を追加している。これにより純正の net/protocols.rb が上書きされており、Net::InternetMessageIO を全く完全に再実装しているのがトラブルの元らしい。どうやら経過措置のつもりのようだが、少なくとも ruby1.8.2 の標準 net/protocols との組合わせでは mechanize は動作しない。結局 system から mailx を呼ぶという逃げを打ってしまったが、こんなのどう解決するのが正しいんだろう? 恐らくこのままだと net/smtp だけでなく、net/protocols を使う他の net/* ライブラリも影響を受けるだろうし、load-path をいじられてると分離も難しそう。mechanize 内部の require や Net::* を色々いじれば逃げられるだろうか。

About W.W.Walker

World Wide Walker は yoosee による blog です。PDA, Web・サーバ技術, 美味しい食べ物などの話題を取り上げています... read more

Monthly Archives

Select Month to read
  

Ads

Recent Entries

Related Sites