• ブログ
  • 写真
  • キーワード
  • ブックマーク
  • ログイン

Title

« 2007年10月 | 2007年12月 »
  • 「百番目の男」を読みました 2007-11-01 00:00:00

    • 百番目の男 (文春文庫)
    • 作者/アーティスト: Jack Kerley,三角 和代
    • 出版社/メーカー: 文藝春秋
    • メディア: 文庫
    • 発売日: 2005-04

    「百番目の男 (文春文庫)」を読みました。タイトルで損をしているなあ(翻訳ものにはありがちだけど)。おもしろかった。

    Commentコメント(0) Pageリンク元(11) Append
  • 風の大陸 最終章 祈り (富士見ファンタジア文庫)
    メディア: 文庫
    ライツアウト (講談社文庫)
    作者/アーティスト: Peter Abrahams,矢沢 聖子
    メディア: 文庫
  • AWDwR2を買う 2007-11-03 00:00:00

    • RailsによるアジャイルWebアプリケーション開発 第2版
    • 作者/アーティスト: 前田 修吾
    • 出版社/メーカー: オーム社
    • メディア: 大型本
    • 発売日: 2007-10-26

     風邪をひいてしまった。せっかく「RailsによるアジャイルWebアプリケーション開発 第2版」を買ったのだけど、頭が痛くて内容が入ってこない。パラ読みした感じではよさそうでワクワクしています。

    • 涼宮ハルヒの退屈 (角川スニーカー文庫)
    • 出版社/メーカー: 角川書店
    • メディア: 文庫
    • 発売日: 2003-12

    「涼宮ハルヒの退屈 (角川スニーカー文庫)」を読みました。

    Commentコメント(0) Pageリンク元(7) Append
  • ニコニコ動画に対応してみた 2007-11-04 00:00:00

     ユルさんに、「ニコニコ動画好きだよね」と言われてしまったので、勢いでkaeruspoonにニコニコ動画をはれるようにしてみました。

    Commentコメント(1) Pageリンク元(11) Append
  • Rails2.0のインストール 2007-11-07 00:00:00

     Rails2.0のPRが出たので、いろいろと試してみました。まずはインストール。

    sudo gem install rails --source http://gems.rubyonrails.org
    

    あとは適当にrailsアプリを作って、Rails2.0PRをfreezeします。

    rails rails2_test
    rake rails:freeze:edge TAG=rel_2-0-0_PR
    

    これで vender/railsにRails2.0PRが入れられて、rails2_testアプリはここのRailsを使うようになります。

    Commentコメント(0) Pageリンク元(171) Append
  • sexy migrationを試してみる 2007-11-07 00:00:00

     sexy migrationを試してみました(すごい名前だ)。
     migrationを以下のように書けます。

        create_table :users do |t|
          t.string :name, :email
          t.text :introduction
          t.integer :age
        end
    
    Commentコメント(0) Pageリンク元(43) Append
  • map.resourcesを試してみる 2007-11-07 00:00:00

    Userモデルと、index(一覧表示)、show(ひとつの表示)、new,create(新規作成)、edit,update(更新)、destroy(削除)のアクションを持つコントローラがあったとすると、config/routes.rbに

    map.resources :users
    

    と書くだけでカッコいいURIを自動で作ってくれます。その確認はrake routesコマンドでOK。

                  users GET    /users                           {:action=>"index", :controller=>"users"}
        formatted_users GET    /users.:format                   {:action=>"index", :controller=>"users"}
                        POST   /users                           {:action=>"create", :controller=>"users"}
                        POST   /users.:format                   {:action=>"create", :controller=>"users"}
               new_user GET    /users/new                       {:action=>"new", :controller=>"users"}
     formatted_new_user GET    /users/new.:format               {:action=>"new", :controller=>"users"}
              edit_user GET    /users/:id/edit                  {:action=>"edit", :controller=>"users"}
    formatted_edit_user GET    /users/:id/edit.:format          {:action=>"edit", :controller=>"users"}
                   user GET    /users/:id                       {:action=>"show", :controller=>"users"}
         formatted_user GET    /users/:id.:format               {:action=>"show", :controller=>"users"}
                        PUT    /users/:id                       {:action=>"update", :controller=>"users"}
                        PUT    /users/:id.:format               {:action=>"update", :controller=>"users"}
                        DELETE /users/:id                       {:action=>"destroy", :controller=>"users"}
                        DELETE /users/:id.:format               {:action=>"destroy", :controller=>"users"}
    

     左から、名前、メソッド、URI、実際のアクション、になります。/usersに対してGETメソッドでアクセスすると一覧表示、同じURIに対してPOSTメソッドでデータを送ると、新しいモデルオブジェクトが作成されます。/users/:idに対してGETメソッドでひとつのデータの表示、PUTメソッドで更新、DELETEメソッドで削除されます。RESTfulでカッコいい。

     さらにUserモデルに1対多でひもつくCarモデルがあった場合、config/routes.rbに

     map.resources :users, :has_many => :cars
    

    と書いてやることで、

    .....省略......
                  user_cars GET    /users/:user_id/cars                  {:action=>"index", :controller=>"cars"}
        formatted_user_cars GET    /users/:user_id/cars.:format          {:action=>"index", :controller=>"cars"}
                            POST   /users/:user_id/cars                  {:action=>"create", :controller=>"cars"}
                            POST   /users/:user_id/cars.:format          {:action=>"create", :controller=>"cars"}
               new_user_car GET    /users/:user_id/cars/new              {:action=>"new", :controller=>"cars"}
     formatted_new_user_car GET    /users/:user_id/cars/new.:format      {:action=>"new", :controller=>"cars"}
              edit_user_car GET    /users/:user_id/cars/:id/edit         {:action=>"edit", :controller=>"cars"}
    formatted_edit_user_car GET    /users/:user_id/cars/:id/edit.:format {:action=>"edit", :controller=>"cars"}
                   user_car GET    /users/:user_id/cars/:id              {:action=>"show", :controller=>"cars"}
         formatted_user_car GET    /users/:user_id/cars/:id.:format      {:action=>"show", :controller=>"cars"}
                            PUT    /users/:user_id/cars/:id              {:action=>"update", :controller=>"cars"}
                            PUT    /users/:user_id/cars/:id.:format      {:action=>"update", :controller=>"cars"}
                            DELETE /users/:user_id/cars/:id              {:action=>"destroy", :controller=>"cars"}
                            DELETE /users/:user_id/cars/:id.:format      {:action=>"destroy",  :controller=>"cars"}
    

    といったURIが作られます。

    名前つきrouteは、モデルのインスタンスを指定してあげるだけ。

    @user = User.find(1)
    user_url(@user)  #=> http://localhost:3000/users/1
    user_path(@user) #=> /users/1
    
    @car = @user.find(2)
    user_car_path(@user, @car)  #=> /users/1/cars/2
    

    さらにすごいのは、link_toとかredirect_toとかform_for

    @user = User.find(1)
    link_to(h(@user.name), @user)  #=> link_to h(@user.name), :controller => "users", :action => "show", :id => 1
    redirect_to(@user) #=> redirect_to "/users/1"
    form_for(@user)  #=> action="/users/1" method="PUT"
    
    @user = User.new
    redirect_to(@user) #=> redirect_to "/users"
    form_for(@user)  #=> action="/users" method="POST"
    

    オブジェクトの状態を見て、空のときとそうでないときとで、URIが変化するのだ。これはすごい。
     ちなみに、carsのようなhas_many状態のrouteでは、単純にオブジエクトを指定するのではなくて名前つきroutesを使用したほうがよさそう。

    Commentコメント(0) Pageリンク元(85) Append
  • render の collection は遅かった 2007-11-08 00:00:00

     viewの中で、render :partial を使うことはよくあるけど、コレクションのデータを表示するときにぼくは今までcollectionを使ってました。

    <%= render :partial => "item", :collection => @items %>
    

     partialの先でループで回すやり方もありますけど、

    <%= render partial => "item_list", :object => @items %>
    

    どちらが速いのか調べてみました。

    Rendered _item (0.00498)
    Rendered _item (0.00248)
    Rendered _item (0.00150)
    Rendered _item (0.00149)
    Rendered _item (0.00148)
    Rendered _item_list (0.00158)
    

    というわけで、partial先でループで回したほうが圧倒的に速かったです。

    Commentコメント(0) Pageリンク元(90) Append
  • Rails2.0PRでRspecが走らない 2007-11-09 00:00:00

     朝、ちょっとRails2.0PRでRspecを走らせてみたらこんなエラーが出た。

    vendor/rails/activerecord/lib/../../activesupport/lib/active_support/dependencies.rb:263:in `load_missing_constant': uninitialized constant ActionView::Helpers::JavaScriptMacrosHelper (NameError)
    

     今日、仕事から帰ってきたら調べよう。<自分メモ

    Commentコメント(0) Pageリンク元(25) Append
  • 複数のファイルに対して、文字置換をする 2007-11-09 00:00:00

    複数のファイルに対して文字置換を実行するやり方

     for i in * ; do cat "$i" | sed 's/AAA/BBB/g' > "$i.tmp"; cat "$i.tmp" > "$i"; rm -f "$i.tmp"; done  
    

    自分メモですね、これ。

    (追記)
    さらにzshだと

      for i in * ; do cat =( cat "$i" | sed 's/AAA/BBB/g') > "$i"; done
    
    Commentコメント(0) Pageリンク元(23) Append
  • Rails2.0PRでRspecを走らせる 2007-11-09 00:00:00

     朝のエラーの原因は、JavaScriptMacrosHelperがRails2.0からpluginにキックアウトされるようになったため。Railsコアはできるだけシンプルにするつもりみたい。というわけで、単純だけどRspecの該当モジュールを呼ぶところでコメントアウトしてみた。
     ……んだけどまだうまく動かない。どうも、Rspecもedge版を使わないといけないようだ。なので、edge版を入れてみる。

    ruby script/plugin install svn://rubyforge.org/var/svn/rspec/trunk/rspec
    ruby script/plugin install svn://rubyforge.org/var/svn/rspec/trunk/rspec_on_rails 
    

     script/generate rspec を忘れずに。これで動きました。

    Commentコメント(0) Pageリンク元(22) Append
  • Rspecでコントローラのspecファイルを書く 2007-11-10 00:00:00

     Rspecを超いまさらながらやっています。Rspecで一番よくわからないのがMoc
    k とstubで、いまでも両者の違いがよくわかっていないし、mockはあるオブジェクトのフリをする仮想的なオブジェクトで、stubはあるインターフェースを偽装するボックスなのかなあとも考えたりしていますが、はっきりと理解していません。
     今、趣味でとあるwebアプリを作っていて、そのログイン処理の部分の仕様をRspecで書いてみました。

      before(:each) do
        @user = mock("user")
      end
    

    まずはUserモデルのインスタンスのフリをするmockオブジェクトをbeforeで作っておきます。Rspecの例などを見てみると、そのmockオブジェクトやPersonクラスにとstubを定義したりしていますが、今回のログイン仕様ではUserモデルのインスタンスは作らないので用意していません。
     で、ログインが成功する部分の仕様を書きます。

      it "should log in" do
        User.should_receive(:authenticate).with("abe@mail.com", "abe_pass").and_return(@user)
        post "login", {:email => "abe@mail.com", :password => "abe_pass"}
        response.should be_redirect
        response.should redirect_to(index_url)
        assigns[:current_user].should == @user
      end
    

     まずはUserモデルにstubを定義します。それぞれのitブロックの中で、それに関係するstubを宣言するのが、Rspecのやりかたみたいです。before部では全体に関係するようなstubだけを定義するらしい。しかも、そのときはshould_receiveメソッドではなくstub!メソッドを使って、検証はさせないようにするようです(こんな理解でいいのかな?)。
     これで、正当なメールアドレスとパスワードをPOSTメソッドで送ると、indexへリダイレクトされてログイン状態になるという仕様が定義されました。あとはこれを通るようにコードを書くだけです。
     ログインに失敗する部分の仕様は下記のとおり。

      it "shouldn't log in" do
        User.should_receive(:authenticate).with("itou@mail.com", "invalid_pass").and_return(nil)
        post "login", {:email => "itou@mail.com", :password => "invalid_pass"}
        response.should be_success
        response.should render_template("account/login")
        assigns[:current_user].should be_nil
      end
    
    Commentコメント(0) Pageリンク元(256) Append
  • Rspecではそれぞれの検証が分離している 2007-11-10 00:00:00

     言葉にすると至極あたりまえの話のような気もしますが、Rspecでは、モデルとコントローラとビューのテストはそれぞれ分離されています(Rspecでも、should have_tagでビューの検証ができてしまいますが、結合度が密になりやすそうなのであまり使わないほうがいいかもです)。結合度を疎にすることによって、コントローラの仕様を考えるときはそれに専念することができます。そして、どこかのエラーが他に影響を及ぼすのを防いでいます。例えば、ビューの仕様を変更してエラーが出たとき、そのビューの仕様をコントローラに書いているとコントローラでもエラーが出る(当たり前すぎることを書いていますね)のです。
     とはいえ、Test::Unitのfunctionテストとかだと、結構普通にコントローラとビューのテストを一緒に書いちゃってます。

      def test_diary
        get "diary", {:id => diaries(:abe_1).id}
        assert_response :success
        assert_template "diary/show"
        assert_select "#diary_#{diaries(:abe_1).id}" do
          assert_select "#title", diaries(:abe_1).title
          assert_select "#body", diaries(:abe_1).body
        end
      end
    

     ここでデザイナさんが、日記の内容のIDを"#message"に変えたりすると、このテストはエラーになってしまいます。しかし、コントローラがおかしくてエラーになるわけではないのです。
     さらにいうと、ここでDiaryモデルがid値からインスタンスを取得する部分の仕様を変えたときに、エラーになる可能性があります。
     ここで疎結合を保つために登場するのがmockとstubなのですね。なるほど。

    Commentコメント(0) Pageリンク元(31) Append
  • このためだけにPS3が欲しい 2007-11-11 00:00:00

    やべー、バンピートロット2やりてー

    Commentコメント(2) Pageリンク元(10) Append
  • Rails2.0RC1のインストール 2007-11-12 00:00:00

     Rails2.0RC1が出たみたいなのでインストールしてみました。
     まずはPRのunfreeze。

    rake rails:unfreeze TAG=rel_2-0-0_PR
    

     そしてRC1。

    rake rails:freeze:edge TAG=rel_2-0-0_RC1
    
    Commentコメント(0) Pageリンク元(21) Append
  • Rails2.0のmigrationで使えるtimestamps 2007-11-12 00:00:00

     Rails2.0のmigrationでは、以下のように timestamps を書くと、

      create_table :user do |t|
        t.string :name
        t.timestamps
      end
    

     自動的に created_atとupdated_at を作ってくれます。

    Commentコメント(0) Pageリンク元(163) Append
  • YSlowを教えてもらった 2007-11-15 00:00:00

    FirefoxのpluginでYSlowなるものを教えてもらった。これはおもしろい。

    Commentコメント(0) Pageリンク元(7) Append
  • alias_method_chainを使ってみる 2007-11-15 00:00:00

     会社の同僚の方に一度教えてもらったのですが、うろ覚えだったので復習しておきます。
    alias_method_chainは、既存のメソッドを継承クラスなんて作らなくてもオーバーライドしてくれます。メソッドの再定義と違うのは、オーバーライド前のメソッドも呼べてしまうところ。
     まずは、メソッドを定義します。

    class Integer
      def next_with_goodby
        next_without_goodby.to_s + ", and goodby"
      end
      alias_method_chain :next, :goodby
    end
    

    こうしておくと、

    3.next #=> "4, and goodby"
    

    となります。ポイントはnext_without_goodbyというメソッド。これがオーバーライド前のメソッドになります。

    Commentコメント(0) Pageリンク元(42) Append
  • バーベキューがおもしろかった 2007-11-18 00:00:00

     土曜日は葛西臨海公園で、みんなとバーベキューにいきました。寒かったけど、豚汁とワインであったまったら寒さは感じなくなります。途中で記憶がなくなったため、最後がどうなったのかよく覚えていません。とても楽しかったことだけは覚えているのだけど。ステーキや焼きそばも食べたらしいのですが、全然覚えていません(もったいないことをした)。どうもユルさんの話によると、みんなにご迷惑をおかけしたようです。いけませんいけません。もう大人なんだから自重しなくては。帰りはユルさんに嘘のルートを教えたらしく、気がついたら新松戸にいました。すげえ。

     今日は二日酔いと謎の筋肉痛で、ずっと家にいました。ニコニコとプログラミングだけで一日が終わってしまった。

    Commentコメント(2) Pageリンク元(6) Append
  • アルゴリズム超重要 2007-11-22 00:00:00

     はてなダイアリーには、あるキーワードに対して自動的にリンクがはられる機能があります(ユルさんはこの機能が嫌いなのだそうです)。キーワードがはてなでは20万以上も存在しているので、ブログの記事の中にその20万のキーワードのどれかが存在しているかどうかを調べるなんてすごく大変そう(というか時間がすごくかかりそう)な印象を受けます。
     で、はてなではキーワード検索用の正規表現を公開していたりします。ためしに6000文字程度の記事に検索をかけてみます。

    #!/usr/bin/perl
    use strict;
    use warnings;
    use IO::File;
    use Time::HiRes;
    
    my $k_f = IO::File->new("hatena_keywordlist", "r") or die $!;
    my $keyword = $k_f->getline;
    $k_f->close;
    
    my $fh = IO::File->new("blog.txt", "r") or die $!;
    my @f_lines = $fh->getlines;
    $fh->close;
    
    my $str = "";
    $str .= $_ for (@f_lines);
    
    my @list;
    my $s_time = Time::HiRes::time();
    $str =~ s|
        ($keyword)
    |
        push @list, $1;
    |egiox;
    my $e_time = Time::HiRes::time();
    
    print "$_ " for @list;
    print "\n";
    print "time: ", $e_time - $s_time, "\n";
    

    ひさしぶりに稚拙なPerlです(はてなの正規表現がRubyで使えなかったので)。で、計測結果は、

    time: 0.810735940933228
    

    でした。
    正規表現は非決定性有限オートマトンを使っているそうなので、DFAで検索するようにすれば速くなりそうです。
    で、Rubyで作ってみました。仕事で使うことになりそうなので、とりあえずソースの公開はやめておきます。別にすごいことをやっているわけじゃなくて、ただの決定性オートマトンだけど。20万件のキーワード、6000字ほどの記事という、Perlと同条件でやってみた計測結果は

    time: 0.010049
    

    となりました。めちゃめちゃ速くなって一安心。
    たぶん、はてなも正規表現は使ってないんじゃないかなあ、という気もします。

    Commentコメント(2) Pageリンク元(15) Append
  • 簡単サーバー監視ツールを書いてみた 2007-11-23 00:00:00

     サーバーの生き死にを監視するツールをRubyで書いてみました。いちよ、L3層とL7層の監視ができます。

    #!/usr/local/bin/ruby
    require 'ping'
    require 'net/smtp'
    require 'net/http'
    
    unless Ping.pingecho("www.server.com", 3, "80")
      Net::SMTP.start('mail.server.com', 25) {|s| s.send_mail "Subject:Server Down!!(L3)", 'kanshi-24@mail.server.com', 'oishi@example.com'}
    end
    
    begin
      Net::HTTP.start("www.server.com")
    rescue
      Net::SMTP.start('mail.server.com', 25) {|s| s.send_mail "Subject:Server Down!!(L7)", 'kanshi-24@mail.server.com', 'oishi@example.com'}
    end
    
    Commentコメント(0) Pageリンク元(54) Append
  • PS3すげー 2007-11-23 00:00:00

    Commentコメント(0) Pageリンク元(4) Append
  • サーバーが壊れた 2007-11-25 00:00:00

    サーバーが壊れました。
    この連休でサーバーのOSをCentOSからDebianに移行しようとしたのですが、CD-Rの読み込みがおかしくなり、電源も入らなくなってしまいました。どうも復活は無理のようです。kaeruspoonとmilookのデータはバックアップを取っておいたので、復活はできるのですが、ちょっと今はやる気がない状態。

    というわけで、しばらく日記は、開発環境上で更新することになりそうです。誰かがここをいつか見ることがあるのでしょうか…。まいいや。nowaをつかって日記を書いていこうかとも思ったのだけど、どうも使う気がせず。すごくいいブログだとは思うんだけど。

    Commentコメント(0) Pageリンク元(5) Append
  • 「チルドレン」を読みました 2007-11-28 00:00:00

    • チルドレン (講談社文庫 (い111-1))
    • 出版社/メーカー: 講談社
    • メディア: 文庫
    • 発売日: 2007-05-15

    「チルドレン (講談社文庫 (い111-1))」を読みました。やっぱり伊坂幸太郎さんはいいなあ。

    Commentコメント(0) Pageリンク元(2) Append
  • 「死神の精度」を読みました 2007-11-28 00:00:00

    • 死神の精度
    • 出版社/メーカー: 文藝春秋
    • メディア: 単行本(ソフトカバー)
    • 発売日: 2005-06-28

    「死神の精度」を読みました。すごくおもしろかった。素敵だ。

    Commentコメント(0) Pageリンク元(6) Append
« 2007年10月 | 2007年12月 »

Twitterでのひとりごと

  • コードギアスはもうなんだかどうでもいい感じのお話になっている(09/07 22:37)
  • ターミナルを見た。いまいちかな。(09/06 23:58)
  • アップルから帰ってきました(09/05 23:00)
  • パナップを食べた。会社のパナップのほとんどをぼくが食べている気がする。(09/05 12:54)
  • photohito 見てたらカメラがほしくなってきた。http://photohito.com/(09/04 22:49)
  • 交通警察24時をやっているらしい。見たいなあ(09/04 20:42)
  • 超不毛な作業をしたので、自分へのご褒美にパナップを食べている(09/04 20:14)

プロフィール

おおいしつかさ

Amazon商品の一覧

人気の記事ベスト10

  • 1.apache+mod_proxy_balancer+mongrelでRailsを動かす方法
  • 2.Perlでevalを使ってみる
  • 3.バージョン管理をsubversionからgitに移行してみた
  • 4.tokyobikeのドロップハンドル化
  • 5.URLなど、長い英字を折り返して表示する方法
  • 6.ubuntu8.04でデュアルディスプレイを使う
  • 7.restful_authenticationを使ってみた
  • 8.Rspecでコントローラのspecファイルを書く
  • 9.Amazonの商品を手軽に扱えるプラグイン、AmazonResourcesをつくりました
  • 10.RailsとPostfixで受信メールを処理する方法

コメント

  • 武石(人に喜ばれること)
  • おおいしつかさ(googleからの本当のメール)
  • 武石(googleからの本当のメール)
  • ユル(日本酒と魚があれば何もいらない)
  • おおいしつかさ(日本酒と魚があれば何もいらない)
  • 武石(しつこい)(日本酒と魚があれば何もいらない)
  • 武石(日本酒と魚があれば何もいらない)

過去の記事

2006年
12月
2007年
1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2008年
1月 2月 3月 4月 5月 6月 7月 8月 9月

キーワード一覧

ActionScript AmazonResources git javascript kaeruspoon milook NSR Objective-C Rails Ruby Ruby on Rails subversion Thin tokyobike ubuntu VAIO VAIO typeZ Waves Xen ぐりぐり カンタロー スノボー ドトール ドライブ バイク プログラミング ユルさん 執筆 日本酒 模型 真中洋嗣 自転車

Youtube

ニコニコ動画