ITコンサルの日常

ITコンサル会社に勤務する普通のITエンジニアの日常です。

「山椒大夫・高瀬舟」読了

山椒大夫・高瀬舟 (新潮文庫)

山椒大夫・高瀬舟 (新潮文庫)

森鴎外の短編集。
森鴎外も相当有名ですが、やっぱり読んだことはありませんでした。
有名なのは「舞姫」でしょうか。


山椒大夫は、感動の再開を描いた物語。
高瀬舟(いわゆる島流しの刑で使われた舟のことらしい)は、経済観念と安楽死の是非を問うた物語で、短いながら、結構読み応えがあります。
他にもいくつか面白いところがあります。


カズイスチカより

自分が遠い向うに或物を望んで、目前の事を好い加減に済ませて行くのに反して、父はつまらない日常の事にも全幅の精神を傾注しているということに気がついた。宿場の医者たるに安んじている父のresignation(訳注:諦念)の態度が、有道者の面目に近いということが、朧気ながら見えてきた。

この文などは、どこかでもっと自分にあった仕事が他にもあるのではないかと思っているか、あるいは、これが自分の進むべき道と腹をくくったかの違いでしょう。


妄想(もうぞう)より

生まれてから今日まで、自分は何をしているか。始終何物かに策うたれ駆られているように学問ということにあくせくしている。これは自分に或働きが出来るように、自分を仕上げるのだと思っている。その目的は幾分か達せられるかも知れない。しかし自分のしている事は、役者が舞台へ出て或る役を勤めているに過ぎないように感ぜられる。その勤めている役の背後に、別に何物かが存在していなくてはならないように感ぜられる。策うたれ駆られてばかりいる為めに、その何物かが醒覚する暇がないように感ぜられる。

これも上と同じようなことを言っているような気がします。
ただ、結局のところ、「今」を一番大事にすべきだと言われているような気がします。

「RESTful Webサービス」読了

RESTful Webサービス

RESTful Webサービス

読み終わってから随分経ってしまったので、印象に残っていることだけ羅列する。

  • RESTful Webサービスとは何か、リソース指向アーキテクチャとは何か、どのように設計・実装すべきかが知りたい人向け。
  • RESTとうたいつつ、RESTful Webサービスになっていないものが多数ある。例えば、リソースを取得するだけなのにPOSTメソッドを使っていたり、リソースを更新するのにGETメソッドを使っているなど。
  • Webサービス開発の流れは、RESTfulの方向に流れつつある。それを裏付けるかのようにHTML5の新しい仕様の策定が行われていたり、RailsなどのWebフレームワークでリソース指向アーキテクチャがサポートされるようになってきている。
  • 現時点で有力なRESTfulなフレームワークは、Rails(ruby)、Restlet(java)、Django(python)といったところらしい。

個人的には、HTML5がどんな感じなのか知りたいなと思ったのと、HTTPをもう少し深く理解したいなと思いました。(リクエスト/レスポンスヘッダや、レスポンスコードが重要なので)

「RailsによるアジャイルWebアプリケーション開発」21章読み中

ActionControllerの続き。

コントローラクラス内のpublicメソッドをactionとして使わない方法。

通常であれば、privateメソッド、もしくは、protectedメソッドとして隠します。

private
  # DELETE /products/1
  # DELETE /products/1.xml
  def destroy
    @product = Product.find(params[:id])
    @product.destroy

    respond_to do |format|
      format.html { redirect_to(products_url) }
      format.xml  { head :ok }
    end
  end

この状態で、destoryアクションを呼ぶと、Unknown action (No action responded to destory)となります。


じゃあ、publicのままで、でも、アクションとして使いたくない場合は、hide_actionを使います。

  hide_action :destroy

  # DELETE /products/1
  # DELETE /products/1.xml
  def destroy
    @product = Product.find(params[:id])
    @product.destroy

    respond_to do |format|
      format.html { redirect_to(products_url) }
      format.xml  { head :ok }
    end
  end

同じく、Unknown actionとなります。
ただ、本書中にもあるように、コントローラ中にアクションでないpublicメソッドがある場合は、リファクタリングを検討した方が良さそうです。

Unknown actionが発生した時にデバッグ情報を出力する

render(:inline => string, [:type => "rhtml"|"rxml"|"rjs"], [:locals => hash])
を使うとできます。

  if RAILS_ENV == "development"
    def method_missing(name, *args)
      render(:inline => %{
        <h2>Invalid Action: #{name}</h2>
        request parameter is :<br/>
        <%= debug(params) %> })
    end
  end

if RAILS_ENV == "development"は、開発モードのみという判定。

上記のコードをコントローラ(products_controller.rb)の一番下に入れて、
試しにhttp://localhost:3000/products/hoge/1にアクセスしてみると、以下のように表示されました。

Invalid Action: hoge
request parameter is :

--- !map:HashWithIndifferentAccess 
action: hoge
id: "1"
controller: products

デバッグに役立ちそうですね。

ファイルをダウンロード

send_dataとか、send_fileというのを使うらしい。

試しに、products_controller.rbに以下のようなメソッドを追加。

  def index_download
    @products = Product.find(:all)
  
    send_data(@products, :filename => "products.txt")
  end

で、
http://localhost:3000/products/index_download/1
にアクセス。
すると、



おお!出た出た。
割りと簡単なのね。
で、早速ダウンロードしたファイルを開いてみる。

#<Product:0xb7798cb0>

...全く面白くないが、ダウンロードさせるっていう目的はいいみたい。


つまらないので、CSV形式(タイトル,URL)にしてみる。
products_controller.rbを以下のように修正。

  def index_download
    @products = Product.find(:all)

    data = ""
    @products.each { |p|
      data = data + p.title + "," + p.image_url
      data = data + "\n"
    }

    send_data(data, :filename => "products.txt")
  end

別にどうってことはないのですが、ちょっとは実用的になったかも。
URLはちょっとヘンですが。。


(2008/07/24 追記)
routes.rbに以下の行を追加。

  map.connect ':controller/index_download', :action => "index_download"

map.resources :products
の行の前に入れないとダメです。
これで、
http://localhost:3000/products/index_download
と、/1なしのURLでもindexをダウンロードすることが出来るようになりました。

301 Moved Permanentlyを返す(つもりが出来てない?)

products_controller.rbにこんなアクションを追加。

  def moved
   headers["Status"] = "301 Moved Permanently"
   redirect_to("http://www.yahoo.co.jp/")
  end

で、
http://localhost:3000/products/moved/1
にアクセス。
すると、Yahoo Japanのホームページに飛びました。


一見うまくいったように見えるものの、Live HTTP Headersで見てみると、
なぜか
HTTP/1.x 302 Found

が返ってきてる。なんでだろ。
Rails的に301よりも302の方が適切っていう判断なのかしら。

(2008/07/24 追記)
コメント欄で指摘いただきましたが、

  def moved
#   headers["Status"] = "301 Moved Permanently"
   redirect_to("http://www.yahoo.co.jp/", :status => 301)
  end

でうまくいきました。