37signalsといえば、Getting Realにこんな一節がある:
まだ発生してもいない問題のために時間を費やすな
ユーザーが10万人に達するのに2年かかると予想されるのに、今日10万人のユーザーを想定する必要があるのだろうか?今は3人のプログラマーがいれば事足りるのに、8人を雇う必要があるだろうか?
今は2台のサーバーでまかなえているのに、12台を準備する意味があるのだろうか?
とにかく進めよう
起こってもいない問題の解決方法を考えるために、人は時間を費やしがちです。そんなことに意味があるか! 私達がBasecampを開始したときは、顧客に請求書を送る手はずすら整っていませんでした。しかし1ヶ月サイクルで請求を行うことになっていたので、(サービスが開始してから)30日間の猶予があることはわかっていました。もっと緊急な問題を解決するためにサービス開始までの時間を費やし、私達が請求書の問題に取り組み始めたのはサービス開始後でした。 請求書の発行はうまくいきました(それにこのおかげで、シンプルな解決策をとることができたわけです)。
そして、いまや同社のサービスはBasecampのアカウントが200万、ユーザのアップロードしたファイルが5.9テラバイトという規模になった。つまり、問題は発生したわけで、じゃあどんな対応をしたのかというのが上の記事なわけだ。そう考えるとなんだか興味深い。
Popularity: 4% [?]
さて、Railsでアプリケーションのひな形を作成したら、まずはgenerateを試してみたくなるのが人情というものだ。
$ rails test --database=mysql $ cd test $ ruby ./script/generate --help
ここでもヘルプをいちいちみていくことにしよう。
おっと、その前に。ここではデータベースにMySQLを指定したけれど、別に本格的なものを作るわけではないのでデフォルトのSQLite3でも問題はなかった。そもそもMySQLをセットアップしないといけないので、むしろMySQLの方が面倒かもしれない。
MySQLを指定すると、conf/database.ymlにそれっぽい設定が作られる。
$ cat config/database.yml # On Mac OS X Leopard: # sudo env ARCHFLAGS="-arch i386" gem install mysql -- --with-mysql-config=/usr/local/mysql/bin/mysql_config # This sets the ARCHFLAGS environment variable to your native architecture # On Windows: # gem install mysql # Choose the win32 build. # Install MySQL and put its /bin directory on your path. # # And be sure to use new-style password hashing: # http://dev.mysql.com/doc/refman/5.0/en/old-client.html development: adapter: mysql encoding: utf8 database: test_development username: root password: socket: /tmp/mysql.sock # Warning: The database defined as 'test' will be erased and # re-generated from your development database when you run 'rake'. # Do not set this db to the same as development or production. test: adapter: mysql encoding: utf8 database: test_test username: root password: socket: /tmp/mysql.sock production: adapter: mysql encoding: utf8 database: test_production username: root password: socket: /tmp/mysql.sock
で、この設定で接続可能な状態にMySQLがセットアップされている必要がある。
さて、話を戻そう。
といっても、railsコマンドと基本的には全く同じなので、細かいオプションは飛ばして、利用できるGeneratorについて調べてみよう。Generatorというのは、実際にgenerateコマンドが作成するファイルの内容を定義しているもので、組み込みのもの以外も後から入手可能になっている。下のコマンドであれこれ探しまわることができる。
$ gem search -r generator
ずらずらとたくさん表示される。面白そうだが、ここではビルトインのGeneratorのみ確認する。
controller
使い方:$ ruby script/generator controller ControllerName [options]
新しいコントローラとビューのスタブを作成する。コントローラの名前はキャメルケース(CamelCase)やアンダースコアで繋げたものが使える。引数としてビューの名前を渡す。
Railsのコントローラは、本来のMVC構造でいうところのCはRails自体が処理しているので、いうなればコントローラから呼び出されるアクションのコントローラみたいなものになる。つまり、http://example.com/test/にアクセスすると、Rails側でこのリクエストを処理するアクションはtestであると判定して、testというコントローラに処理が引き渡される。testはこのアクションのコントローラとして振る舞う。こういうこと自体を引き受けている上位のコントローラはRailsが持っている、ということだ。通常、コントローラはapps/controllers以下に配置される。この場合、apps/controllers/test_controller.rbというファイルになる。
また、Railsにはモジュールという概念もあって、http://example.com/module_name/test/へのリクエストはapps/controllers/module_name/以下に配置されたtest_controller.rbというファイルがコントローラに指定される。アクションをジャンルで分けたり、なにかと整理が大変な大規模なシステムなんかで重宝するだろう。この場合は、引数をクォートで囲んで指定するようだ。
$ ruby script/generator controller 'module_name/test' list new delete
ちょっと動かしてみよう。とりあえず、listという名前のコントローラを作ってみる。何かの一覧だから、これに付随する機能としては、インデックスと新規作成、編集、削除があればいいとしよう。
$ ruby script/generate controller list index create edit delete
exists app/controllers/
exists app/helpers/
create app/views/list
exists test/functional/
create app/controllers/list_controller.rb
create test/functional/list_controller_test.rb
create app/helpers/list_helper.rb
create app/views/list/index.html.erb
create app/views/list/create.html.erb
create app/views/list/edit.html.erb
create app/views/list/delete.html.erb
確かにcontrollerとview以下にファイルが作成された。generateに渡した引数の最初はコントローラの作成を指示するもの、次は作成するコントローラの名前、以降は全部作成するviewの名前だ。これでちょっとブラウザから結果を見てみよう。ruby scritp/serverでウェブサーバを起動したら、http://localhost:3000/list/にアクセスしてみる。すると、画面には
こんなメッセージが表示されている。この画面表示を担当しているビューのファイル名が記されているのがわかる。この場合はapp/views/list/index.html.erbがビュー用のファイルだ。
List#indexというのは、コントローラクラスのList(正確にはListController)の中のメソッドとして定義されているindexが実行されているという意味になる。Rubyではクラス名の最初は大文字なので、コントローラの名前としてlistを指定してもクラス名はListContorllerになる。
先ほど実行したコマンドでは、同じくhttp://localhost:3000/list/create/やhttp://localhost:3000/list/edit/、http://localhost:3000/list/delete/にアクセスすると、それぞれ似たような画面が表示される。後でみるscaffoldほど細かい内容のスクリプトは作成されない。
長くなったのでここでいったん切ろう。
Popularity: 4% [?]
仕事中にかみさんから電話があり、なにかあったのかと急いでかけ直したら、なんと我が家にもようやく振り込め詐欺の電話がかかってきたのだというではないか。これでようやく大人の階段をひとつ昇れた気がする。
かみさんによれば、若い男の声で
「もしもし、お母さん?オレ、○○だけど」←○○は俺の本名
「はい?」
「お母さん?オレ、○○だよ」
と、ちゃんと名前を名乗ったらしい。オレも一回だけだし、これじゃオレオレ詐欺にならない。2年前に亡くなったお袋もカンカンですよ。
かみさんとしてはもうちょっといろいろしゃべらせたかったのだが、ここまできてプーッと噴き出してしまい、相手にガチャっと電話を切られてしまった。素人くさいことに、電話は非通知ではなかったので、番号を控えて警察に連絡しておいたとのこと。
そこから先が実にかみさんらしいのだが、さっそく非通知にしてこの電話番号にかけ直した。本人いわく、ギャルっぽい感じで「あのー、なんかぁ、着信あったみたいですけどぉ、どちらでしたっけぇ?」と相手の素性を尋ねると、どうやらその場に複数の人間がいたような気配で、株式会社ボルビックなる社名を名乗ったそうな。「この番号から振り込め詐欺の電話があったんで、警察に通報しときましたよ」と伝えるとまたガチャリと切られてしまった。
ちなみに電話番号は
090-9109-0842
半角で検索している人のために
090-9109-0842
ハイフンだけ全角にしてしまった人のために
090-9109-0842
だった。きっとどこかの多重債務者から取り上げたか加入させた携帯の番号なのだろうが、とりあえず晒しておく。
#update
練馬警察署の発表によると、この電話は次のようなシナリオの詐欺なんだとか。
ボルビックなる浄水器の販売会社がある。
「息子」なる人物はこの会社に就職した。
「息子」は、電話で会社の営業ノルマが大変で、達成できないと酷い目にあうといった話をする。
「息子」は、ノルマ達成のために浄水器を買ってほしいと涙ながらに訴える。
「母さん」が騙されて浄水器を買う。
法的にグレーゾーンになりそうなシナリオを考えたつもりなんだろうけれども、
まあアウトだわな。
Popularity: 3% [?]
誰もが知っているRailsの、誰もが知っているので誰もいちいち書かないようなことを書いてみた。先日ちょっと借りてきた書籍があつかっているRailsのバージョンが古くていまいち役に立たなかった腹いせだ。
動作環境はMac OS X Leopard(10.5.1)。
まずはインストールと作業環境の設定。
$ sudo port install ruby $ sudo port install rb-rubygems $ sudo port install rb-sqlite3 $ sudo port install sqlite3 $ sudo gem install rails
*MySQLのサポートって入れてなかったっけ?記録なし。
$ cd $ mkdir -p Ruby/rails/demo $ cd Ruby/rails/demo
これでとりあえずの準備は完了。
そうそう。portsで入れたMySQLだと、起動スクリプトをいじってMySQLのソケットを/tmp/以下に作るように指示してあげないといけないのが面倒くさい。一度書いてしまえば上書きされることもないのだろうが、なんとなく後で面倒になりそうなので、portsからではなくwww.mysql.comから落として/usr/local/mysql以下にインストールした。
まずは使い方チェック。
$ rails --help
最近の若者はヘルプを読まないからいかん。
railsコマンドはRailsで作成するアプリケーションに必要なひな形をそろえてくれるもので、使い方は
rails アプリケーションの設置場所 オプション
になる。オプションは以下の通り:
-rまたは–ruby=path
railsコマンドで実行されるスクリプトが使うRubyインタプリタの場所をpathで指定することができる。何か特別な理由でもない限りは使わないだろうけれども、デフォルトのRubyのパスが気に入らないときに利用できる。ちなみに作成されたアプリケーションの方はenvを使ってRubyの場所を参照するので、まあなんだかなあという感じだ。これが便利になる局面を知らないだけかもしれないが。
-dまたは–database=name
作成するアプリケーションが利用するデータベースサーバを指定することができる。選択肢はMySQL、Oracle、PostgreSQL、SQLite2、SQLite3。ちなみに指定するときは小文字で書いた方がいいのかな。普通どっちにも対応しているか。まさかね。きっとね。
じゃあ試してみよう。
$ rails test --database=PostgreSQL
あれ?ヘルプが表示された。もしかして…
$ rails test --database=postgresql
あ、ちゃんと作成された。というわけで、データベース名は小文字で(mysql、oracle、postgresql、sqlite2、sqlite3)指定しよう。
-fまたは–freeze
なんだろう。直訳すると「Railsを/vendor/railsに凍結する」とあるのだが。ちなみに通常は/vendor以下にはpluginというディレクトリが作られるのだが、これを指定すると変わるのだろうか。
試してみよう。
$ rails test
これでカレントディレクトリにtestというディレクトリが作成される。
$ ls -lF ./test/vendor/ total 0 drwxr-xr-x 2 user user 68 12 29 11:42 plugins/
vendorディレクトリにはpluginがあるだけだ。今度は-fを指定してみる。
$ rails test -f $ ls -lF ./test/vendor/ total 0 drwxr-xr-x 2 user user 68 12 29 11:37 plugins/ drwxr-xr-x 8 user user 272 12 29 11:37 rails/
おお、確かにrailsというディレクトリが増えた。中身は
$ ls -lF ./test/vendor/rails/ total 0 drwxr-xr-x 9 user user 306 12 29 11:46 actionmailer/ drwxr-xr-x 10 user user 340 12 29 11:46 actionpack/ drwxr-xr-x 10 user user 340 12 29 11:46 activerecord/ drwxr-xr-x 7 user user 238 12 29 11:46 activeresource/ drwxr-xr-x 5 user user 170 12 29 11:46 activesupport/ drwxr-xr-x 16 user user 544 12 29 11:46 railties/
これらは、どうやらRuby on Railsのキモになっているファイル群のようだ。つまり、-fまたは–freezeオプションを指定すると、現在のRailsをそのまま凍結してアプリケーション配下に置いてくれるらしい。もしそうだとしたら、システムにインストールされたRails自体をアップグレードしても作成されたアプリケーションには影響が出ないということになる。なるほど。
-vまたは–version
これがないアプリケーションは礼儀作法がなっていない。Railsのバージョン番号を表示して終了する。
-hまたは–help
ヘルプを表示して終了する。
-pまたは–pretend
みんなと仲良しのふりをする。ではなく、実行時の挙動を表示して何かしらのエラー確認が出来る。実際には変更は行われない。
–force
にっちもさっちもいかないときに、フォースの力を借りて既存のファイルを上書きする。デフォルトでは既存ファイルは上書きしないのか。でも、それなら次のオプションがあるのが不可解だ。
-sまたは–skip
既存のファイルをスキップする、とある。でも、–forceで強制上書きなら、デフォルトの挙動はどっちなんだ?
$ rails test
まずは実験台を作成。
$ rails test -s
スキップで実行。同じファイルが作成されるはずだ。
$ rails test -s exists exists app/controllers 中略 identical Rakefile identical README skip app/controllers/application.rb identical app/helpers/application_helper.rb 中略 identical log/server.log identical log/production.log identical log/development.log identical log/test.log
ディレクトリについては既存のものはexistsとなって飛ばすようだ。これは当然として、他に2種類の実行結果(というのか)があることがわかる。identicalとskipで、skipはその名の通り既存ファイルをスキップしたということなのだろう。じゃあidenticalってなんだ?
今度は上書きモードで実験してみよう。
$ rails test -f exists exists app/controllers 中略 identical Rakefile identical README force app/controllers/application.rb identical app/helpers/application_helper.rb 中略 identical log/server.log identical log/production.log identical log/development.log identical log/test.log
さっきスキップされたのと同じファイルがforceで上書きされたことがわかる。identicalとされたファイルも変わらない。identicalの問題は後で調べるとして、じゃあデフォルトの動作はというと
$ rails test 中略 overwrite app/controllers/application.rb? (enter “h” for help) [Ynaqdh]
ああ、なるほど、対話モードになるのね。想像してなかった自分が間抜けでした。
でも、identilcalってなんだろう。同じファイルということ(コメントでご指摘いただきました。お恥ずかしい)だから、更新の必要なしと判断されたのだろうか。語義からすると、アプリケーション固有のファイルということだろうか。実用上、ログファイルを上書きしないというのはわかる。READMEとかもまあいい。じゃあ、Rakefileとかapplication_helper.rbは更新される必要がないファイルなのだろうか。中身を拝見。
$ cat ./test/Rakefile # Add your own tasks in files placed in lib/tasks ending in .rake, # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. require(File.join(File.dirname(__FILE__), 'config', 'boot')) require 'rake' require 'rake/testtask' require 'rake/rdoctask' require 'tasks/rails'
うーん、lib/tasks以下に何らかのファイルを置いて、それをrequireで呼び出して何かをさせるときに利用されるファイルらしい。Railsのアプリケーションを実際のサーバにディプロイする時なんかに使われるCapistranoと連携したりするのか。アプリケーション固有の設定情報だから、特に上書きしてしまう必要はないということなのだろう。
$ cat ./test/app/helpers/application_helper.rb # Methods added to this helper will be available to all templates in the application. module ApplicationHelper end
あれ、空っぽだ。アプリケーションのテンプレートから呼び出せるメソッドを記述できるとのことなので、これも上書きする必要はないだろうな。
なるほど。というわけで、Railsを使ったアプリケーション作成では通常いじらない、いわゆるフレームワーク側のファイルとして扱うapp/controllers/application.rbなどは–forceで上書きされるけれども、アプリケーション固有のヘルパー関数などが記述されているファイルは–skipを指定しなくてもちゃんと飛ばしてくれるということか。
-qまたは–quiet
ディレクトリの作成やら何やらの情報を出力しないモード。携帯電話をBluetoothモデムにしてパケット単位で課金されている状態で緊急の作業をしていて、lsに-lオプションを付けるだけで悲鳴を上げているような人には重宝する。
–tまたは–backtrace
エラー発生時にバックトレースを出力してくれる。試してみよう。
$ sudo mkdir test $ sudo chown root:wheel test
オプションなしで書き込み権限のないディレクトリに書き込みを試みる。
$ rails ./test/test create Permission denied - ./test/test
じゃあ同じことをバックトレース付きで。
$ rails ./test/test -t create Permission denied - ./test/test /opt/local/lib/ruby/1.8/fileutils.rb:243:in `mkdir' /opt/local/lib/ruby/1.8/fileutils.rb:243:in `fu_mkdir' /opt/local/lib/ruby/1.8/fileutils.rb:217:in `mkdir_p' /opt/local/lib/ruby/1.8/fileutils.rb:215:in `reverse_each' /opt/local/lib/ruby/1.8/fileutils.rb:215:in `mkdir_p' /opt/local/lib/ruby/1.8/fileutils.rb:201:in `each' /opt/local/lib/ruby/1.8/fileutils.rb:201:in `mkdir_p' /opt/local/lib/ruby/gems/1.8/gems/rails-2.0.2/bin/../lib/rails_generator/commands.rb:314:in `directory' /opt/local/lib/ruby/gems/1.8/gems/rails-2.0.2/bin/../lib/rails_generator/manifest.rb:47:in `send' /opt/local/lib/ruby/gems/1.8/gems/rails-2.0.2/bin/../lib/rails_generator/manifest.rb:47:in `send_actions' /opt/local/lib/ruby/gems/1.8/gems/rails-2.0.2/bin/../lib/rails_generator/manifest.rb:46:in `each' /opt/local/lib/ruby/gems/1.8/gems/rails-2.0.2/bin/../lib/rails_generator/manifest.rb:46:in `send_actions' /opt/local/lib/ruby/gems/1.8/gems/rails-2.0.2/bin/../lib/rails_generator/manifest.rb:31:in `replay' /opt/local/lib/ruby/gems/1.8/gems/rails-2.0.2/bin/../lib/rails_generator/commands.rb:42:in `invoke!' /opt/local/lib/ruby/gems/1.8/gems/rails-2.0.2/bin/../lib/rails_generator/scripts/../scripts.rb:31:in `run' /opt/local/lib/ruby/gems/1.8/gems/rails-2.0.2/bin/rails:17 /opt/local/bin/rails:16:in `load' /opt/local/bin/rails:16
こんな感じ。
-cまたは–svn
説明を読んでもわからない。Subversionを利用してファイルを修正する、とのこと。svnコマンドにpathが通っていること、と注意書きもある。
$ which svn /opt/local/bin/svn $ rails test -c svn: 警告: '.' は作業コピーではありません svn: 警告: '.' は作業コピーではありません 中略 svn: ファイル '.svn/entries' を開けません: No such file or directory 後略
いきなりエラーの連続だ。とりあえずファイルは作成された。これではいったい何のことやらさっぱりわからないが、svn addを実行しているらしいエラーメッセージなので、どうやら既にSubversionの作業コピーとなっている場所を前提にしているようだ。
$ rm -rf ./test
$ mkdir test
$ svn import ./test/ file:///Users/user/svn/rails/test -m 'rails test'
$ rm -rf test
$ svn co file:///Users/user/svn/rails/test
$ rails test -c
svn: 警告: '.' は作業コピーではありません
svn: 警告: '.' は作業コピーではありません
exists
create app/controllers
A test/app
後略
こんな感じで、railsコマンドで作成されるスケルトンをsvn addしてくれた。あとはコミットして作業を続けるだけ。なるほど。
とりあえず、以上、railsコマンドのヘルプの中身拝見でした。
Popularity: 6% [?]
マット・キーオといえば阪神が優勝した1985年以降の低迷期に来日、弱小阪神の先発として活躍していたピッチャーなので、日本でも名前はよく知られている。もっとも、一説によればボールにツバをつけたりヤスリで磨いたりするインチキだったようで、故障の後は再契約されなかった。その後、メジャーリーグ復帰を目指すも頭部に打球を受けて危篤状態になるなど成功せず、引退してオークランド・アスレティックスのスカウトになっていた。ちなみに“マネー・ボール “でもスカウトたちの中で唯一の元メジャーリーガーとして登場している。
オークランド・アスレティックスで飲酒といえば、サイ・ヤング賞にも輝いたことのあるボブ・ウェルチというピッチャーがいた。高校生の頃に何度かウェルチのピッチングを観たことがあるのだが、とにかくスピードがあって投球間隔が異様に短く、投球モーションに入った後からバッターにタイムを取られてそのままマウンドでずっこけ、それでも気にする素振りさえ見せずにまたどんどん投げ込んでいた姿が印象的だった。そんな彼も、自伝によれば相当なアルコール中毒だったらしい。1990年には27勝を挙げ、これは70年代にスティーヴ・カールトンが達成して以来というとんでもない記録だったのだが、その年のオークランド・アスレティックスのリーグ優勝に貢献している。当時は地球で一番強いチームに見えたオークランドだったが、ワールドシリーズではシンシナティに四連敗してあっさりと負けてしまった。
まあ、こんな乱痴気騒ぎの毎日(ビデオ)では仕方がないだろう。当時はまだメジャーリーガーがそんなにアホばっかりだとは思っていなかったので。このビデオでベラベラしゃべっているのは、無名時代に読売ジャイアンツが手を出そうとして買春疑惑で断念したデイヴ・ステュワート、「カーニー」とは当時カービー・パケットに次ぐ打率二位だった三塁手のカーニー・ランスフォードだ。
当時のオークランドには、盗塁の世界記録保持者にして48歳になった今でも現役復帰を狙っているリッキー・ヘンダーソンを筆頭に、ステロイドは素晴らしいと自伝に書いて騒動になったらついでに元妻が暴露本を出版してプレイボーイで脱いだというキューバ人右翼手ホセ・カンセコ、バリー・ボンズと並ぶステロイド使用者の代表的人物マーク・マグワイヤ、シーズン24ホームランでも打った試合ではチームが23勝1敗だったり逆転ホームランを打った相手のピッチャーが身を持ち崩して最後には口論となった妻を射殺しようとして失敗した後に自殺したことがあったりと業の深いデイヴ・ヘンダーソン、99年まで現役だった名選手のわりには地味なキャッチャーのスタインバック、攻撃は出来ないが守るのは上手という自衛隊みたいなウォルト・ワイス、ウィキペディア日本語版ではボブ・ウェルチのページに名前はあるものの同名の政治家にリンクされててしまっている(もっと有名なドキュメンタリー作家マイケル・ムーアじゃないのが救いか)地味なマイク・ムーアなどなどがいて、ついでにいうと今のジェネラルマネージャにして前述のマネー・ボール で一躍有名になったビリー・ビーンも控え選手としてベンチにいたこともある。右中間の外野フェンスから楽々とセカンドベースまで返球するカンセコの姿を見るだけでも楽しいのに、観戦すれば毎試合がオールスターというそれはもう豪華なチームだった。サンフランシスコの地震の時は、同じベイエリアのサンフランシスコを相手に1、2戦目をスチュワートとムーアで勝つと、地震で中断した後にまた同じピッチャーで連勝して終わるというひどいことをやっている。そういえば、911テロの時も被災したニューヨークがワールドシリーズでは負けているので、そういうものなのかもしれない。
そんなオークランド・アスレティックスも、球場周辺の治安の悪さやフットボールと兼用グランドの不便さから近く(といっても45キロ離れている)のフレモントへの移転計画が持ち上がっている。新しい球場はシスコ・システムズが売却した土地に建設され、名称はシスコ・フィールドになるのだが、サンフランシスコにより近くなる上にこの名前で本当にいいのかとは思う。
Popularity: 3% [?]
リスは蛇の脱皮した皮を拾ってかみかみしてから自分の体をぺろぺろすることで外敵から臭いをごまかすのだそうな。
Popularity: 3% [?]
ええと、Railsがデフォルトで利用するデータベースがMySQLからSQLiteになったということは、MacPortsでrb-sqlite3を入れておかないと、解説書の最初に載っているようなデモ用のなんでもないアプリケーションでいきなりドバドバとエラーが出てしまうってことだよな。特にRailsをアップグレードした人なんかは。
Popularity: 3% [?]
クリスマスに実家へ。手みやげにスコッチを2本購入。
Glendronach Original 12年(2007/12/23現在、リンク先の画像がちょうど同じもの)は、製法はTraditionalと同じでオーク樽とシェリー樽で熟成させたもの。このあたり、どうなっているのかよくわからない。
Glenlivet 15年はまだ飲んでいない。
Popularity: 3% [?]

