2007年12月27日

Ruby入門とか読むくらいならコレを読め

[ Ruby ]

いまさら気がついたことに激しく後悔しています。もっとずっと早く読めばよかった...。

Rubyソースコード完全解説: 第1章 Ruby言語ミニマム
http://i.loveruby.net/ja/rhg/book/minimum.html

このページでは冒頭でこんなことが書いてあります。

Ruby言語について、当面第一部を理解するのに必要な知識だけ簡単に解説しておく。プログラミング上のテクニックであるとか注意すべきところなんてものは全く指摘しないので、この章を読んだからと言ってRubyプログラムが書けるようになるわけではない。既にRuby言語の経験がある読者はこの章は飛ばして問題ないだろう。

とばして読んではいけません、もしあなたがRubyを手足のように使いこなせるのではなければ。とわたしは感じました。それはわたしのレベルが低すぎるのでしょうか。

この第1章、「ミニマム」というだけあって短いです。しかし、ユーザから見えるRubyの仕組みが簡潔にまとまっています。メカニズムの原則がわかります。メカニズムの原則がわかることが、そのメカニズムでかたちづくられたものを使いこなすのに、どれだけ重要かはいうまでもないでしょう。

プログラミングそのものはわかっていて、でもRubyはどう使えばいいんだろう? と思っているひとは、誰でもRHG第1章は読むべきです。と思います。

すくなくともわたしはもっと前によむべきだった、と思いました。クラス定義と定数定義、includeとnew、などが示唆的でした。はい。

2007年12月 1日

アルゴリズム

[ Ruby ]

http://blog.livedoor.jp/dankogai/archives/50957658.htmlをよんで。

メルセンヌ・ツイスタ以外は理解してたはずなのにけっこう忘れてる。ということで思い出すために実装してみます。Rubyで。

続きを読む "アルゴリズム" »

2007年11月25日

mixi-photo.rb

[ atom Ruby ]

さきほどからなんだかとまらなくなって、rubyでmixi用写真アップロードのライブラリ作ってみました。ドキュメンテーションもエラー処理もテストも皆無ですが一応置いておきます。

激しく添削希望です。

mixi-photo.rb

MixiPhoto.newすると既存のアルバム情報をとってきて、albumsに入れます。MixiPhoto#createAlbumで新規アルバムが作成できます。このとき、MixiPhoto#albumsは更新されません(ってよくないですね)。MixiPhotoAlbum#uploadPhotoするとアルバムの写真が更新されます。

超簡単な使い方例。

#!/usr/bin/ruby
$KCONV='u'
require 'mixi-photo'

user='foo@bar.com'  # mixi登録メールアドレス
pass='foobar'             # mixiパスワード

mixi = MixiPhoto.new(user, pass)

# 既存のアルバムに写真追加
mixi.albums.each { |x|
  x.uploadPhoto("./test.jpg")
}

# 新規アルバム作成、写真を追加
mixi.createAlbum("テストアルバム", "説明文").uploadPhoto("./someimage.jpg")

2007/11/26 0:59 version 0.0.2 createAlbumで説明文を必須にしました

2007/11/27 21:00 version 0.0.3 ちょっと手直し

2007/12/08 02:30 version 0.0.4 nonce生成方法のバグを、指摘に従い修正(ありがとうございます)

mixi 写真アップロードAPI

[ atom Ruby ]

このあたりを参考に、mixiのatom ppでの写真アップロードをちまちまRubyで検証してました。

ちょっとだけ自分用にメモ。

  • 今日現在では、リクエストのURLがhttp://photo.mixi.jp/atom/r=4になってるみたい。
  • アルバムのアクセス制御は
    • 公開: <permit:access>public</permit:access>
    • 友達まで: <permit:access>friends</permit:access>
    • 非公開: <permit:access>protected</permit:access>、このときは<permit:token>に閲覧キーを入れる

まだアルバム生成のとこまでしかできてない上になんだか恥ずかしいコードですが一応貼ってみます。検証用につくったんで、写真アップロードまで入れるかどうかはわかりませんが、もし変更したらここに反映させてきます。

追記: 一応ひととおり作りましたので、新しいほうをご参照ください。古いほうはひっこめました

Module#===

[ Ruby ]

RubyリファレンスマニュアルのNet::HTTPまわりをみていたら、こんな例がありました。

  response = Net::HTTP.get_response(URI.parse(uri_str))
  case response
  when Net::HTTPSuccess     then response
  when Net::HTTPRedirection then fetch(response['location'], limit - 1)
  else
    response.error!
  end
型チェックでcaseが使えるのか...? と不審に思い。caseの比較は===演算子だよな。
String === "foo" # ==> true
"foo" === String # ==> false
Object == "foo" # ==> true
Integer === "foo" # ==> false
Numeric === 1 # ==> true

クラスオブジェクトの===ってこういうふうに使えるようですが、どこで定義されてるんだ...?

と思ったら、Module#===が働いているようです。メカニズムまだ理解できません。

追記: あ、ClassがModuleのサブクラスだったのか! なるほど。っていうか、この疑問はそもそも恥ずかしい疑問だったんだな...。