kaeruspoon

サーバがまた止まる。そしてgoogleがまたすごいものを

 昨日は夕方に雷をともなう大雨が降ったようです(ぼくは仕事中で知らなかった)。そのせいか、雷のなっていた時間帯に一瞬だけ停電になったみたいで、サーバがまた落ちました。ユルさんが電源を入れてくれたのだけど、なんだか途中で引っかかっていてMySQLが起動しておらず。ぼくが家に帰ってきて復旧させるまで、しばらく500エラーが出ていたりしました。やっぱり個人管理のサーバはいろいろと不安定で大変です。ユーザのコンテンツを保持するようなサービスを避けるようにしているのはこのためなのです。せめて短時間の停電に耐えられるよう、ノートPCをサーバにしたいところ。

 「Googleマップに平面視点で地図を見られる新機能「Street View」追加」という記事にあるように、googleがまたすごいものを作り上げました。これ、おもしろいなあ。サンフランシスコとかニューヨークとかどんどん歩けるし、これだけで数日遊べそう。地図好きな人の夢みたいなサービスですね。google本社前に、たくさん人がいて集合写真を撮っているみたいに並んでいるのがおもしろいです。開発者たちなのかな。

酔っ払いのケンカ

 地下鉄に乗っているとき、酔っ払いが殴りあいのケンカをしているのを見ました。四十代のいいおっさんと二十代前半の若者でした。子供みたいなケンカでしたが、殴りあいのケンカをするのは子供だけなのでこれは当然というものでしょう。恥ずかしいよね。

上野のバイク街と秋葉原に行ってきました

 昨日は上野のバイク街と秋葉原に行ってきました。最初は六本木の東京ミッドタウンにでも行こうと思っていたのですが、ユルさんがあまり乗り気ではなかったのです。彼女は(ぼくもですが)、表参道ヒルズのつまらなさを覚えていて、それの二の舞になるのがイヤなのでした。
 上野のバイク街に来たのは10年ぶりくらいでしたが、あまりの寂れ具合にびっくりしました。当時は路肩にずらりとあちらこちらからやってきたいろいろな種類のバイクがずらりと止まっていて、それを眺めているだけでも飽きないものでしたが、今となっては店も少なく、人も少なく、光輪はなにやら揉めごとが勃発している様子でした。もう来ることはないでしょう。
 秋葉原ではヨドバシカメラで液晶ディスプレイやプリンタを見て二階の喫茶店でマンゴーソフトクリームを食べたりしました。マンガがいっぱい置かれているお店に、ユルさんに連れられて行ったりしましたが、ちょっとツラかったです。道端でたこ焼を一緒に食べました。

Asobozeをはじめました。そして今さらFizz-Buzz問題

 Railsで作るサービス第二弾は、WebカレンダーのAsobozeです。ユルさんに頼まれて、仲間内だけで使えるものを作ったのですが、複数のカレンダーをいくらでもつくれるようにして、誰でも使えるものにしてみました。今後の課題はサイトデザインです(今はノータッチ)。

 今さらですが、Fizz-Buzz問題をやってみました。「2分とかからずにできるはずだ」とあるので、とにかく直観のままに1分で書いてみたのが以下のコード。

1.upto(100) do |i|
  output = ''
  if i % 3 == 0
    output << 'Fizz'
  end

  if i % 5 == 0
    output << 'Buzz'
  end

  if output.empty?
    output << i.to_s
  end

  puts output
end

 もうちょっとイジくってみよう。

1.upto(100) do |i|
  output = ''
  output << 'Fizz' if i % 3 == 0
  output << 'Buzz' if i % 5 == 0
  output << i.to_s if output.empty?
  puts output
end

 なんとなくoutputという文字列オブジェクトを使うのが納得いかない気がする。わかりやすいけど洗練されていませんね。
 ちなみにワンライナでいくとこんな風になりました。

(1..100).to_a.map{ |i| i % 15 == 0 ? 'FizzBuzz' : i }.map{ |i| i % 3 == 0 ? 'Fizz' : i}.map{ |i| i % 5 == 0 ? 'Buzz' : i }.each{ |i| puts i }

 きたねー。

 日曜の夜はなんだかゆったり時間があったので、溜っていたメールやRSSリーダの記事を消化したりしてました。こういうのって、溜りすぎるともう読めなくなっちゃうから注意が必要です。

Asobozeにユーザ登録機能を追加しました

 Asobozeにユーザ登録機能を追加しました。ユーザ登録をしておくと、他人があなたの名前を勝手に使えなくなるし、参加者を限定して非公開のカレンダーを作ることもできます。カレンダーの管理機能(カレンダー名を変えたり、参加者や公開・非公開を選んだり)は次の実装です。その前にデザインをなんとかしたいです。今はただ部品を置いているだけだもの。その次はリファクタリングでしょうか。

Asobozeのデザインをちょっとだけ

 Asobozeのデザインがちょっとだけまともになりました。そうそう、せっかく遊びの予定を決める掲示板なのだから、食べログとか楽天とかのグルメ情報や宿情報が簡単に載せられたらいいなあと思いつつ、WebAPIを調べようと考えています。kaeruspoonのかえる記法とAmazon検索機能もまるまる移植しちゃおうかな。

Rubyを仕事で使う

 会社の開発マシンにRubyがインストールされていることに気づきました。わざわざ入れることは考えられないから、ディストリビューションにデフォルトで入っていたものみたい。バージョンは1.6.8とかだったかな(古)。
 この前の文字処理ツールですが、ちょっと複雑な処理が必要になって、Cなんかで書いてられなくてRubyでささっと作りました。やっぱりRubyは楽しいや。必要にかられてクロージャを使ってみました。勉強以外の目的で、実際に必要になってクロージャを書いたのは初めてだったのですが、これって便利だなあ。いまさら実感です。やっぱり必要になんないとちゃんと覚えないよね。ますますRubyが好きになりました。

 そうしてRubyの楽しさを再認識したところで明日はRubyKaigiです。めちゃくちゃ楽しみだ。今日は早く寝ようっと。

RubyKaigi一日目にいってきました

100
会場から携帯でアップしています。今はお昼。ロビーにmap派、collect派のアンケートがあったので「場合による派」にしておきました。
会場のマック率が超高い!見える範囲にはマックしかありません。日本にはマックしか存在しないみたいです。
セッション.午後.firstはまつもとゆきひろさんです。楽しみ!

99
 帰ってきました。とりあえず、map vs collect アンケートの写真と会場の写真をアップです。map派がほとんどだったのでちょっと驚いた。ぼくは「場合による派」にしたと上で書いたけど、本音をいうとこだわりは全然なくて、そのときそのときで気が向いたほうを使っています。

101
 参加者みんなが、こんなものをもらいました。「No Ruby, No Life」の文字がクールなトートバックがけっこうカッコいいです。でも、会場から出ると当然ながら参加者400人みんなが持っていたので、ちょっと恥ずかしかったです。個人的には全然使えるものなのでこれはうれしい(明日は持っていかないけど)。あとは、スポンサーのパンフなどがいろいろと。アメはユルさんが食べています。

 セッションの内容についていろいろと書こうかと思っていましたが、たぶん、みなさんブログに書くだろうし、なにより本家サイトに素晴らしいログがアップされていました。
 発表者の方たちはみんなプレゼンがすごくうまくて、もうあれはなんだかエンターテインメントですね。笑いが絶えませんでした。はじめて生で高橋メソッドを拝見しました。JRubyは予想外に使えそうです。Charles Nutterさん と Thomas Eneboさん のおふたりは英語でのプレゼンでしたが、ワンセンテンスごとに数秒の時間をあけてくれたし、単語のひとつひとつも発音がわかりやすくて、ぼくでも内容が理解できたし、笑えるところでちゃんと笑えました。楽しいなあ。
 まつもとゆきひろさんのお話は愛について。楽天で何をなさるのか、ご本人もよくわかっていないご様子でした。朴 芝印さんのお話も楽しかった。日本語がうまくて聞き取りやすかったです。XMLとかHTMLのパースとか、kaeruspoonやはてブメールでも使っているし今後もよく使いそうなところなので興味深かった。FireBugでXPathが拾い出せるのは知らなかった。scRUBYtは今度使ってみよう。
 LTはテンポがよくてどの発表も楽しくてエキサイティングでした。米澤 直記さんの発表で、Rubyで一時間かかった処理がC言語で12秒で終わったというのがありましたけど、これはいかにRubyでもないんじゃないの、と思わないでもなかったり。野田 哲夫さんのお話にあったMatz江市に笑った。

 あっという間にすぎた一日でした。400人ものRubyistを見たのも初めてでした。こんなにいるんだなあ(もっといるに決まっている)。Railsを仕事で使っている人が2割以上もいました。羨ましいかぎり。ぼくも来年のRubyKaigiでは手をあげられるようになりたいものです。
 まだまだ明日も続きます。楽しみだ。

RubyKaigi2007 二日目にいってきました

 午前中のセッションが終わったところです。まじろうがおもしろかった。それにとても使いやすそうでした。かくたにさんの本があっという間に売り切れになってます。本といえばレシピブックがよさそうです。今度買おう。外は雨でしかも寒いです。

102
あんなに楽しみにしていたRubyKaigi2007も、もう終わってしまいました。すごく楽しい2日間でした。楽天のセッションで、「楽天は技術な会社だと思っている人」「技術に貢献していると思う人」の質問に、会場の誰一人として手をあげなかったのがおもしろかった。でも、今後はそういうところを払拭していきたいそうです。ちょっと期待してもいいかもしれません。

103
NaClがRubyに関して "Do not Control" なものとして、Spec、Source、そしてMatzを挙げていました。どちらかというと、Matzに関しては "Cannot Control" だそうです。

104
使っているOSは何か、のアンケート。ぼくらのubuntuもなかなかがんばっています。でも、Macにはおよばず(当り前か)。ここでは、Windowsは完全にアウェイですね。ちなみにぼくも次はMacにしようかと思います。

105
今日はなんといってもDave Thomasの日でした。いろいろと印象深い言葉が今も頭に残っています。"You have to love what you do"、 "I Love Ruby"、 "Ruby does not wear a suit"、"Ruby is Ruby. Ruby is ours" などなど。
ぼくらが聞きたがっている言葉を口にしてくれる、といった感じで、会場がすごい一体感に包まれた感じでした。最後にはスタンディングオベーション。もちろん、本当に宗教的にRuby教徒と化しているのは極一部の人たちだけでしょうけど。プレゼンがすごくうまかったです。スティーブ・ジョブズのプレゼンもこんな感じなのかもしれないな、と思いました。

ロビーから会場まで

始まる前

JRuby on WebServer

RubyCocoa

Dave Thomas

Rubyでの非同期処理

 kaeruspoonで、ブログ更新pingを打つときの待ち時間が長いことがあるので、スレッドを使って非同期処理にしてみた。

  def ping_check
    if request.remote_ip == '(サーバのIPアドレス)'
      diary = Diary.find(:first, :conditions => ["open_date = ?", Date.today])
      Thread.start(diary) {|d| ping_send(d) if d}
      render(:text => 'ping_check end', :layout => false)
    else
      redirect_to(unknown_url)
    end
  end

これだけ。これは単純な処理だから、何も考えなくても作れる。まじろうみたいに素晴らしいものではないけれど。
 [追記]全然速くならなかった。どうもスレッド切替えが行われなかったように見える。うーむ。

 ユルさんが今日から仕事です。彼女の仕事では土日にはあまり休みがありません。一緒に遊べなくてつまらないので、日曜日はRails勉強会@東京第19回に参加することにしました。ポジション・ペーパを作っとかなきゃ。何もネタがないのだけれども。

スレッドの続き、子プロセスも

昨日の続き。更新ping全体ではなく、ひとつひとつのXML-RPCをスレッドにしてみました。

    thread_list = Array.new
    ping_uris.each do |ping_uri|
      uri = URI.parse(ping_uri)
      thread_list << Thread.new(uri) do |u|
          connection = XMLRPC::Client.new(u.host, u.path, u.port)
          connection.call('weblogUpdates.ping', name, url)
       end
    end
    thread_list.each {|t| t.join}

うーん、これならたしかに並列処理できるけど、結局は待たなきゃいけないんだな。更新ping処理全体を子プロセスとかにしたほうがいいかも。

RubyのThreadとforkについて

 スレッドについてもうすこし調べてみました。

thread_list = Array.new
2.times do |i|
  thread_list << Thread.new(i) do |m|
    1000000.times do |a|
      if a % 200000 == 0
        if m == 0
          puts "one"
        else
          puts "   two"
        end
      end
    end
  end
end
thread_list.each {|t| t.join}

1000000.times do |a|
  if a % 200000 == 0
    puts "      three"
  end
end

puts "--end--"

これの結果は

one
   two
one
   two
one
   two
one
   two
one
   two
      three
      three
      three
      three
      three
--end--

 joinで子スレッドが終了するのを待っていますね。これでは更新pingの速度も劇的に速くなるとはちょっと言いがたい。
ちなみにスレッド内の例外を処理したいときは、スレッド単位でrescueして安心してはいけなくて、なぜかといえばjoinで待っているスレッドでも例外が発生するからなのです。なので注意が必要です。

thread_list = Array.new
begin
2.times do |i|
  thread_list << Thread.new(i) do |m|
    1000000.times do |a|
      if a % 200000 == 0
        if m == 0
          puts "one"
        else
          puts "   two"
        end
      end
      raise "test e"
    end
  end
end

thread_list.each {|t| t.join}
rescue
  p $!
end

1000000.times do |a|
  if a % 200000 == 0
    puts "      three"
  end
end

puts "--end--"

結果は

one
   two
#<RuntimeError: test e>
      three
      three
      three
      three
      three
--end--

こんな感じ。

 さらに子プロセスでやってみる。

fork do
  2.times do |m|
    1000000.times do |a|
      if a % 200000 == 0
        if m == 0
          puts "one"
        else
          puts "   two"
        end
      end
    end
  end
end

1000000.times do |a|
  if a % 200000 == 0
    puts "      three"
  end
end

puts "--end--"

結果は

one
      three
      three
      three
      three
      three
--end--
[tsukasa@] $ one                                                     [~/lesson]
one
one
one
   two
   two
   two
   two
   two

 お、ぼくがやりたかった流れの処理になったようです。よかったよかった。というわけでkaeruspoonもfork doを使って子プロセスを作り、ブログ更新ping送信を発信するという処理にします。

 継続とかFiberとかもちょっと調べてみようかな(まだよくわかっていない)。

AP4Rよさげ

 RubyKaigiで、AP4Rがエンタープライズ向けだけじゃなくて、ぼくみたいなサンデープログラマにも使えそうだ、というところに魅力を感じたのだけど、AP4R on Rails はじめの一歩という記事にあるようにさっそく試している人がいた。
 シンプルですごくよさそう。今のところ、ぼくが使うシーンはイメージできないけれけれど(ブログ更新pingの非同期処理に使うには大げさすぎるでしょう?)。今後、使いたいときが出てくるかもしれない。

自転車 > プログラミング >>>>>>>> バイク > スノボー

 この日記を書いている今時点での気持ちはタイトルみたいな感じ。バイクがここまで落ちるなんて、10年前のぼくが知ったら激怒するかもしれません。あのころはバイクが最高ダントツでぼくの中のほとんどを占めていたのですが。
 ユルさんが言うには、ぼくが欲しいものはだいたい20万円なのだそうです。MacBookも、VAIO typeS も、チネリのエクスペリエンスもだいたい同じくらい。
 特に、最近は自転車がぼくの中でぐんぐん頭角を表しつつあって、今20万円手元にあったら、中古のNSR250ではなくてチネリを買ってしまうと思います。そのことに今日、自分で気づいて驚愕してみたりしなかったり。

Apple MacBook Black 2.16GHz Core 2 Duo/13.3/1G/160G/8x SuperDrive DL/Gigabit/BT/DVI MB063J/A

 PCに関しては、MacVAIOの間で揺れ動いている感じです。Mac OS Xはデスクトップ用途では間違いなく最高のOSだと思いますが、やや劣るもののUbuntuだって負けてはいません。そしてハードウェアとしてのデザインの好みは、ぼくにとってMacBookよりもVAIOの方なのです。うーん、悩む。VAIO typeSにMacOSXが入っていれば文句ないのですが。

Asobozeにホットペッパーがやってきました。

 金曜日からちょっと熱っぽかったのですが、大事をとって日曜日のRails勉強会は欠席させていただきました。で、なにをしていたかというと、Asobozeにホットペッパー検索機能をつけたりしてました。google mapも使っています。マッシュアップってやつでしょうか。特におれってすげー感は味わえなかったような。当たり前か。そろそろデザインをなんとかしないといけません。洗練されたデザインとかすごく興味があるのに、ぼくにはセンスがないのでデザインはいつも後回しです。誰かがやってくれないかな。

 その手の雑誌を見ていると、デザインは芸術系の仕事として社会に認識されているのを感じます。もちろんそのとおりなんだけど、プログラミングも実は芸術系の仕事なんだけどな。と、ぼくは常々思っているわけで。小説家に近いですよね。書いているときの感覚はどちらもとても近いし。

 テクノラティランキングにもランクアップされていたけど、竹原慎二 オフィシャルブログがすごくおもしろい。
 じゃあの。

Internet Explorerにまたやられています

 Asobozeにホットペッパーとgoogle map機能を付けたのですが、google map機能のところでエラーダイアログが出てしまっています。これはInternet Explorerだけに出現する問題です。ほんとにもう、なにかと問題を起こしてくれるブラウザだよ。メジャーじゃなければ捨てておきたいところですが、そうもいかない。原因はわかっていて(google検索で山のように情報が見つかります)、ようはロードのタイミングみたいです。
 で、解決できたと思ったら、やっぱりうまくいかなかった。うーん、なんでだろう。今日はもう遅いので続きはまた明日です。最悪、iframeを使う技で逃げようかとも思っています。

google map使用時にIEから見ると「開けません」というダイアログが出現する、の解決法

 問題は解決しました。どう解決したかはソースを見てください。ようは、loadイベント時にgoogle map関数を呼ぶようにしただけ。簡単でしたね。

 といっているけど、実はprototypeでクラスみたいなのを作ろうとしてうまくいかなかったりしました。Javascriptはまだまだだ。もっと勉強しよう。しばらく、Javascriptで遊んでみることにします。

一緒に帰宅する日々

 最近、帰りに駅で仕事帰りのユルさんと一緒によくなります。駅で待ち合わせてスーパーでお買い物して一緒に家に帰るのが、なんだかほのぼのとして楽しいものです。

 Asobozeにぐるなび検索機能もつけようかと考えています。これでグルメ系の検索はとりあえず大丈夫かなと。あとはじゃらん検索機能もつけて、宿関係の検索もできるようにしようと思います。機能面はとりあえずこれくらいで一段落かな。あとはリファクタリングとデザインを納得いくところまでやって、また別のサービスを考えようと思います。

サーバメンテナンス

 22時から22時半くらいの間、サーバメンテナンスをやってました。ホコリを取り除いたくらいのことで、メンテナンスというよりクリーニングです。すでに筐体もかなりの熱を持つようになっています。また今年の夏もハードディスクがやられてしまいそうです。エアコンが効きまくった凍えそうなサーバルームでもあればいいのですが、個人ではそうもいきません。

週末は何もなく

 なんだかずっと体調が悪い週末でした。プログラミングも一切せず、だらだらと何もせずに過ごしてしまった。不毛だ。でもたまには不毛もいいでしょう。まったく無駄なく生きてもしかたがない。無駄がなければ侘寂も生まれない。少なくとも脳も体もすっかり休めた週末であったことは確かです。そんな今日この頃。