83's

Top > Archives > 2006 > November

November 01, 2006

サーバ買った 01:12

以前サーバの調子が悪いと言っていたけども、 このブログがメモリを食いつくして他のプロセスが殺されていたようです。 どっかでメモリリークしてる。ブログはそのうちなんとかする。

まーそもそもkatamayu.netのサーバはRailsを動かすにはスペック的にあれだったんで、 新しくサーバを買いました。 HPのML110 G3、2万円で。 こいつでいっぱい遊ぶよ!(`・ω・´) こいつもスペック貧弱だけど。

とりあえずこのブログを新サーバに移したので、katamayuサーバのほうには穏やかな日々が戻ったと思います。 これでなぜかことあるごとに殺されまくっていたmysqldも長生きするはず。 よくよく考えてみれば前の調子でsshdまで殺されたらいろいろ生活に支障が出るもんなぁ。 Webサーバも落とされたら困るし。Railsアプリがkatamayuから追い出されるのは必然だったわ。

今はkatamayuサーバでlighttpdが、新サーバでブログのプロセスが動いてます。 やり方はライド・オン・Railsに載ってるよ。 作業は非常にあっけなく終わった。いやー、良くできてるなー。

ライド・オン・Rails Ruby on Railsを徹底攻略
吉田 和弘 馬場 道明
ソフトバンククリエイティブ

November 03, 2006

ファイルアップロードのテスト 17:15

あとで「なんだっけ」になること確実なのでメモ。

ファイルのアップロードをテストで書きたいときにはActionController::TestUploadedFileを使う。

ActionController::TestUploadedFile.new(path, content_type)

をfunctional testならpostとかでわたしてやればよい。

こんなのも。

Shortcut for ActionController::TestUploadedFile.new(Test::Unit::TestCase.fixture_path + path, type). Example:

  post :change_avatar, :avatar => fixture_file_upload('/files/spongebob.png', 'image/png')

あー、あとはblobなデータをfixtureに書く方法がわかんない。 テストの前にちまちまとデータ突っ込んでるんだけど、憎いし苦痛。

config/mongrel_cluster.ymlの書き方、とか 20:17

Railsプロセス(FastCGI)だけ別サーバにわけたのはいいんだけど、 これじゃ静的ファイルは依然としてlighttpdの動いてるサーバから返されるわけか。 一方でRailsがページキャッシュしたRSSとかアップロードしたファイルとかは Railsのサーバにできるわけだから、なるほどRSSが更新されないわけだわ。

この場合FastCGIのプロセスじゃなくてwebサーバごと一緒に引越ししなくちゃいけなかった。 てことでmongrel cluster。

設定ファイルconfig/mongrel_cluster.ymlの書き方がイミフなのでmongrel_cluster/init.rbをのぞく。

        argv = [ "mongrel_rails" ]
        argv << "start"
        argv << "-d"
        argv << "-e #{@options["environment"]}" if @options["environment"]
        argv << "-p #{port+i}"
        argv << "-a #{@options["address"]}"  if @options["address"]
        argv << "-l #{@options["log_file"]}" if @options["log_file"]
        argv << "-P #{pid[0]}.#{port+i}.#{pid[1]}"
        argv << "-c #{@options["cwd"]}" if @options["cwd"]
        argv << "-t #{@options["timeout"]}" if @options["timeout"]
        argv << "-m #{@options["mime_map"]}" if @options["mime_map"]
        argv << "-r #{@options["docroot"]}" if @options["docroot"]
        argv << "-n #{@options["num_procs"]}" if @options["num_procs"]
        argv << "-B" if @options["debug"]
        argv << "-S #{@options["config_script"]}" if @options["config_script"]
        argv << "--user #{@options["user"]}" if @options["user"]
        argv << "--group #{@options["group"]}" if @options["group"]
        cmd = argv.join " "

        puts cmd if @verbose
        output = `#{cmd}`

mongrel_cluster.ymlはmongrel_rails startに渡すオプションを書くところだったんだなー。 mongrel_rails startのヘルプ見れば対応が分かる。

$ mongrel_rails start -h
Usage: mongrel_rails <command> [options]
    -e, --environment ENV            Rails environment to run as
    -d, --daemonize                  Whether to run in the background or not
    -p, --port PORT                  Which port to bind to
    -a, --address ADDR               Address to bind to
    -l, --log FILE                   Where to write log messages
    -P, --pid FILE                   Where to write the PID
    -n, --num-procs INT              Number of processors active before clients denied
    -t, --timeout TIME               Timeout all requests after 100th seconds time
    -m, --mime PATH                  A YAML file that lists additional MIME types
    -c, --chdir PATH                 Change to dir before starting (will be expanded)
    -r, --root PATH                  Set the document root (default 'public')
    -B, --debug                      Enable debugging mode
    -C, --config PATH                Use a config file
    -S, --script PATH                Load the given file as an extra config script.
    -G, --generate CONFIG            Generate a config file for -C
        --user USER
                                     User to run as
        --group GROUP
                                     Group to run as
        --prefix PATH
                                     URL prefix for Rails app
    -h, --help                       Show this message
        --version                    Show version

こうなった。

---
port: 8000
pid_file: log/mongrel.pid
servers: 3
mime_map: config/mongrel_mime_type.yml
environment: production

サーバは3つもあればこんなブログ十二分にさばけるお!

mongrelがrdfのcontent typeをしっかり返さないので、mongrel_mime_type.ymlに書いた。

.rdf: text/xml; charset=UTF-8

application/rdf+xmlはどうなったんだろう。なんかそれにするとオレのFirefox 1.5は xmlとして見てない感じだよ。

あとはlighttpdでやってたrewriteをどうすっかなんだけど、

Mongrel (as of 0.3.7) by default supports Rails style page caching in the RailsHandler it uses to serve your applications. What this means is that if you do a page cached action (which writes a .html file as well as respond) then Mongrel will just serve up the cached page instead of bug Rails.

mongrelは.htmlを付けるのはやってくれるらしいことが書かれている。

そのほかのrewriteはLuaでpower-magnet.cmlてのをlighttpd用に書くみたいだけど、 とりあえずいいや。今回は必要ない。

November 05, 2006

\と_をスワップ 20:09

macでアンダースコア打つのにshiftがいらなかったんで、 Linuxでもそうしてみる。

xmodmap -pke

とすると一覧が出てくるので、

keycode 211 = backslash underscore kana_RO

を見付けて~/.Xmodmapに

keycode 211 = underscore backslash kana_RO

と書いてみた。kana_ROはなんだRO。どうやったらそれ打てるの? ctrl押しながらじゃないしなぁ。 参考にしたUNIXの部屋のxmodmapのページには 2つめはshift同時押しって書いてあったけど、3つめは知らんよ。

バックスラッシュは主には正規表現で使うくらいで圧倒的にアンダースコアを打つケースのほうが 多いような気がする(当社比)ので、しばらくこれで試す。

macでバックスラッシュの打ち方をoption + \ って教わったけど、ないなと思った。 ほかに打ち方ないのかな。

November 07, 2006

URIのタイトル 04:56

こういうの↓よくあるけど、

<h2><a id="xxx" href="#xxx">■</a>雨降ってるし、学校行く気しない</h2>

そこ(#xxx)にブックマークしようとすると大抵タイトルを編集しなくちゃいけなくなる。

以下のようにしたら、http://〜〜#xxxのタイトル抽出を自動化できるよな?  はてブしたときにタイトル編集しなくて済むよ('∀`)ノ

<h2><a id="xxx" href="#xxx" title="83's : 雨降ってるし、学校行く気しない">■</a>雨降ってるし、学校行く気しない</h2>

そもそも考えてみればtitle要素というのはHTML文書のタイトルなんであって、 その文書内のある部分を指してるURIの説明(タイトル)としてtitle要素の内容持ってくるのは ちと理屈的に無理がありゃしませんか。URIが指してる要素が説明するべきじゃないかと。

でもみんなやらないと意味ないなー。

そう言えば最近はRSSリーダから直でそのフラグメントに飛んでくることが多いので、

<h2 id="xxx" title="83's : 雨降ってるし、学校行く気しない">雨降ってるし、学校行く気しない</h2>

でいい気がしなくもない。めんどいか。■みたいの用意しなきゃいけないのはブラウザが悪いよな。 あ、それGre(ry

idつきheadingへのリンクを追加するgreasemonkey 05:49

■みたいの用意しなきゃいけないのはブラウザが悪いよな。 あ、それGre(ry

てことでしょーもないけどGreasemonkeyスクリプトを作ってみた。 1日1回はプログラミングしないと!

h1〜h5でidがついてるとその要素の始めのところに「_」っていうリンクを追加するだけ。 こういうのやっぱりページ作成者じゃなくてブラウザ側でやるべきだね。 だってそうしないとインタフェース統一されんもん。

なんかgetElementsByTagNameが返すのはArrayじゃないね? はまっちった。 JavaScriptでオブジェクトのクラス名を知るにはどうしたらいいんだろう。

で、ときどき

Component returned failure code: 0x80520012 (NS_ERROR_FILE_NOT_FOUND) [nsIChannel.open]

てゆうエラーになるんだけど、とりあえず深追いするのはやめた……。

あとspidermonkeyはなんで

js> [1,2,3]
1,2,3
js> "1,2,3"
1,2,3

配列と文字列で表示が同じなんだろう。誤解するだろ……。

November 08, 2006

10月に読んだ本とか 05:02

ちと遅くなったけど。

( ´∀`)つ ライド・オン・Rails Ruby on Railsを徹底攻略

本番サーバへの設置の話とか、Rails周りのところを見たくて購入。 lighttpdの設定とか書いてあるから!  「ググれカス」に理不尽さを覚えたあなたはこれを買うといいよ。 あとHyper Estraierとかruby-gettextとか携帯の話とか。これはいつかきっと御世話になる。

前に読んだRailsの育て方とか AWDwRとは 半分くらい話がかぶらないんでお徳な感じ。

( ´∀`)つ パターン指向リファクタリング入門~ソフトウエア設計を改善する27の作法

リファクタリングの 下巻とも言うべき本。こういういつ読んでも味がするようなスルメな本は貴重。 設計が汚いなと思ったときの改善のヒントとして傍らに置いておきたいような本だが、 これが必要になるようなものをなかなか作る機会がない(´・ω・`)

( ´∀`)つ MySQLによる最速RDBMS構築ガイド

enibloで定期的にバックアップとんないといけないんで、そこはとても役に立った。 分からないところも多数orz  やっぱ中途半端にSQLiteとか使うよりもしっかりMySQLを使うことにする。

なんかバイト先にある本ばっかなんだけど、必要な時に手元あってほしいので購入。 11月はこんなペースじゃ読めないなー。10月の1週目は授業初日にも関らずオレは大学にいなかったけど、 これらを読んで夜更ししてました。

自分の興味あることに投資できるようになったんで、バイトさせてもらってホント最近は良い感じです。 ネットにごろごろいるスーパーハカー大学生の数百分の一の生産性もありませんが、 就職までの間どうかよろしくお願いしますm(_ _)m

質問とかするためにも知識をつけなくては。 ハカーへの道は興味と好奇心によって駆動される問題解決と知識獲得の行ったり来たりと見た!  なかなか知識獲得できない金銭的負け組だったり、興味駆動じゃなくて義務駆動だったりするとどこかで止まってしまうのだ。世の中金! と時間!

自分の心に従え。夢をいくつか持て。自分自身を知れ。他人に自分の道を指示させるな。「これが人生を成功に導く。」「これらの学校に進んで、これらの講義を取れ。」「こういう種類の仕事をするべきだった。」「人生の階段はこのように上らなければならない。」そういうことは言わせるな。何であれやりたいことがあり、それをやり成功する情熱があれば、成功する。

ウォズニアックかこいいよウォズニアック '`ァ,、ァ(*´Д`*)'`ァ,、ァ 学校さぼる言い訳に使えそうですw よーし、積ん読片付けるぞー。

November 09, 2006

Googleにdelタグが効かない 16:17

サイドバーのとこのdelタグで括ってる「出席したら負けかなと思っ(ry」が Googleにしっかりキャッチされてる件。

検索する人にとって取り消した情報も役に立つんだろうか。 それとも取り消したものもひっくるめて検索なんだろうか。

November 12, 2006

Firefox 2.0入れたぞーーーーやったーーーーーっっ!!1 21:02

くそう。Firefox 2.0にしたらmozlessが動かない。 相当この拡張(2.0的にはアドオン)に依存していたのでツラス(ノД`) マウスでポチポチやってらんねー。

あとCopy URL+もダメだ。

November 13, 2006

作文能力がない 00:34

ちゃっちゃと作文系のレポートを片付ける能力が欲しい。 オレはこういう「A4で○枚書け」とかいうレポートが大の苦手。 書くことがない。

途中でネットしたり集中してないのも原因だろうけど、2枚書くのにも何時間もかかるよ。

ホント院に来てから宿題が多くて時間とられるもんで困る。 もっと自由な時間が多いのかと思ってた。 サクサク課題片付けられる人がウラヤマシス。

書けた 02:37

2842文字。正味3時間くらいか? オレしょぼすぎ。でも疲れた……寒い。

とりあえずお腹が空いたからコンビニ行ってくるー。 明日午後の授業遅刻しませんように……コアタイムは朝からだが、知らん。 無理して起きると眠くてパフォーマンスが落ちる。先生にはそれがわからんのです。

和訳… 22:29

今日は昼に起きて授業2コマ出て明日の授業で使う和訳をして終わっちまうYO!

あー、ニートになりてぇ。

November 17, 2006

絵を晒す 18:25

enibloのブログパーツを作ったのでブログのトップページに貼ってみた。

enibloブログパーツ

まだ公開していないが、実装80%のまま出してしまうつもり。

IEで見たら 20:35

このブログのトップページのレイアウトが崩壊していることに気がついた。 7月からずっとこの状態だったのか……。どんだけ気づくの遅いんだ……。

教えてくれる人がいなかったあたりがとても鬱です。 あ、一応いた

ほんとIE 6はいい加減死に絶えて下さいお願いします。 Netscape 6使ってたころにIE 6のCSSで悩んだ記憶がある。 どんだけ長生きなんだよ。

って、IE7でもレイアウト壊れてるのか。んもう。

November 20, 2006

大学発ベンチャーだそうで 09:45

なんか学内MLに、4年生が作った大学発ベンチャーが大学内SNS作ったんで参加してねっていう 宣伝メールがきたよ。

3年4年でそういうことができるのが羨ましくてしょうがない。 大学内SNSなんていらねと思うし、mixiあるだろと思うし、これが直接金になるとも思えないけど、 やっぱ手を動かすことが大事なんだよね。で、オレがどう思ってもユーザがつくわけだ。 enibloにもついているように。

まあ金が続く限りっていう厳しい現実がベンチャーにはあるだろうけど、 ベンチャーは一発目で大当たりするわけじゃないって聞くし、まずやるだけやって、 少なくともSNS作る技術つけてそれを他人に納得させることができるんだから、 教室で座って話聞いてレポート量産して単位が出る授業の数千倍、 本で猛烈に独学する数百倍もの知識と経験がつくに違いない。

大学生には保険があって、在学中に会社がつぶれても普通に新卒で就職できる。 または卒業と同時にやめてもいい。 それは確かにネガティブに受け止められがちで、 実際責任や本気さが伴わなければたいした経験にはならないだろうな。 オレは起業とかまったく無知だけど、友人見ててそう思っていたもんだ。 でも短期間でも本気でやれば、普通に就職するにしたってポテンシャルが違う。 いろいろ知ってるし、いろいろできる。そして自分から選べる。

オレは4年の時、恥ずかしながらどう企業を選んでいいのかわからないので院進学に傾いたという経緯がある。 まるで履修計画でもたてるかのように学校が推薦する企業の中から選んで、 それまでとるべき授業が義務として与えられていたように職業を与えてもらってそのまま進むってのは、 はっきり言って大半だろうと思うけども、オレは嫌だった。 自分で選びたかったけど、自分が何をしたいのかわからなかったし、 当時のオレの情報収集力では見本となる人もたいして見付けられなかった。 もっと知るため、見極めるために技術と知識をつけなければ、と思って就職する気0→院進学ってことになった。 だからそれがオレの何倍もの早さでできる彼らが羨ましい。

ほんと、就職そろそろ考えないといけないな。 若者はなぜ3年で辞めるのか? 年功序列が奪う日本の未来読んで かなり鬱になったが、選ぶ基準が一つ自分の中で出来た気がする。

gemがまた 19:36

gem使おうとしたらまたRubyforgeが落ちてる。

オレのタイミングが悪いのか、 それとも頻繁に落ちてるのか……。

ミラーサーバってないんだろうか。

November 24, 2006

$break, $continue 07:28

ん、prototype.jsのeachとかでbreakとかすんのはどうすんのかとか思ったら、 $breakとか$continueをthrowするのか。とかいうメモ。

フリースペース 10:56

ブログによくある、自由にHTML貼れるフリースペースを enibloにも早くつけろと 社長(個人事業者をそう呼ぶのかどうかはともかく)から言われているんだけど、 どうしたもんかな。

要はブログパーツとかアクセスカウンタとか自由に貼りたいってことなんだけど、 scriptタグを自由に書けるようにすると余裕でセッションID引っこ抜いてどっかに送信、 なんて出来てしまうから簡単に実装するわけにもいかず。 もっと言うとaタグでも、まずクリックさせる必要があるものの同じことが出来てしまうもんねー。

試してみるとはてなはscriptは禁止、aタグもJavaScriptを仕込んどくとそれが消されるようで、 対策がされているのがわかる。 livedoorブログはscriptタグが使える。 ただ、編集と公開でホストが違うので、セッションIDを別にしておけば 問題ないってことなんだろう。 にしてもRailsのデフォの_session_idみたいなわかりやすいキーじゃないのね……。 何が何なのかわからん。あーわからん。プロの世界へはまだまだ遠いなぁ。

とりあえずホストわけることにするか。それが一番確実な気がしてきた。 ちとめんどいけど、まーデザイン考えるよりは何倍も楽な作業だわ(´・ω・`)

November 26, 2006

言うこと聞かないfixtureとモデルを手で対応させる 01:40

# dvd.rb
class DVD < ActiveRecord::Base
  ...
end
# dvds.yml
secret_dvd:
  id: 1
  ...

なんてのがあったとして、

# dvd_test.rb

fixtures :dvds

としても

@secret_dvd #=> nil

て感じでフツーにだめー。

fixtures :dvds
set_fixture_class :dvds => DVD  # or :DVD or "DVD"

これでおk。DVD! DVD!

script/generateで生成したファイルを自動でsvk add 05:03

script/generateに-cオプションをつけると生成されたファイルやディレクトリを 自動でsvn addしてくれるのは有名な話ですが、svkはどーしたんだってことで、 先にググれば良かったけど最近慢性的に眠いせいで頭が働かず、手が先に出た。

他にスマートな方法があるといいなぁ。 けだるすぎてググる気にならん。動悸がするお……。 寝たほうがいいんだろうけど特に眠くないしなーどうしよ。

以下のように#{RAILS_ROOT}/script/generateをいじってたら動いたみたい。

#!/usr/bin/env ruby
require File.dirname(__FILE__) + '/../config/boot'
#require 'commands/generate'

require "#{RAILS_ROOT}/config/environment"
require 'rails_generator'
require 'rails_generator/scripts/generate'

module Rails::Generator::Options
  alias _add_general_options! add_general_options!

  protected
  def add_general_options!(opt)
    _add_general_options!(opt)
    opt.on("-S", "--svk", "Modify files with svk.") { options[:svk] = true }
  end
end

class Rails::Generator::Commands::Create
  alias _file file

  def file(relative_source, relative_destination, file_options = {}, &block)
    destination = destination_path(relative_destination)

    _file(relative_source, relative_destination, file_options, &block)

    system("svk add #{destination}") if options[:svk]
  end

  alias _directory directory

  def directory(relative_path)
    path = destination_path(relative_path)

    _directory(relative_path)

    unless File.exists?(path)
      system("svk add #{path}") if options[:svk]
    end
  end
end

ARGV.shift if ['--help', '-h'].include?(ARGV[0])
Rails::Generator::Scripts::Generate.new.run(ARGV)

-hで見ればわかるけど、svk addするには-Sオプションをつけます。

% ./script/generate model -S a
      exists  app/models/
      exists  test/unit/
      exists  test/fixtures/
      create  app/models/a.rb
A   script/../config/../app/models/a.rb
      create  test/unit/a_test.rb
A   script/../config/../test/unit/a_test.rb
      create  test/fixtures/as.yml
A   script/../config/../test/fixtures/as.yml
      exists  db/migrate
      create  db/migrate/005_create_as.rb
A   script/../config/../db/migrate/005_create_as.rb

ktkr!!!!!!!

といってもgrepかけてそれらしいところを追ってって変更しただけなんで結構怪しい。

rails.vimでRgenerateでsvk add 05:19

rails.vimでは:Rgenerate model Bookとかやると./script/generate model Bookが走る上に .svnがあると-cオプションをつけてくれるのでsubversionにファイルを追加してくれて 激しく便利なんだけど、これがsvkだとそうはいかないのでrails.vimをちと変えるよ!

1062     let file = ""
1063   endif
1064   if !s:rubyexe("script/generate ".target.(s:usesubversion()?' -c':' -S').str) && file != ""
1065     exe "edit ".s:ra()."/".file
1066   endif

3項演算子らしきものがあるのでそこに-Sを追加。 オレオレscript/generateとの併用でsvk addしてくれます。

これ、.svnがないと無条件でsvk使おうとするんだけど、 svnもsvkも使わないのが許されるのは確か小学生までなんで大丈夫だろうきっと。 vimスクリプトには突撃したくないのでとりあえずいいよオレはこれで。 あーでもちょっとRailsった場合はウザいかも。

ちょっと元気になってきた。オレはいつ寝たらいいんだろう。 とりあえずベッドに横たわってみる。

忘れてた 06:28

あーscript/destroy忘れてたよ。 そのうちやろう。

頭痛くなってきた。

script/destroyと同時にsvk rmとかsvk revert 09:51

少々てこずったYO! 保証はしません。

./script/destroyを以下で置き換え。

#!/usr/bin/env ruby
require File.dirname(__FILE__) + '/../config/boot'
#require 'commands/destroy'
require "#{RAILS_ROOT}/config/environment"
require 'rails_generator'
require 'rails_generator/scripts/destroy'

module Rails::Generator::Options
  alias _add_general_options! add_general_options!

  protected
  def add_general_options!(opt)
    _add_general_options!(opt)
    opt.on("-S", "--svk", "Modify files with svk.") do
      options[:svk] = `svk status`.inject({}) do |opt, e|
        opt[e.split(/\s+/)[1]] = true
        opt
      end
    end
  end
end

class Rails::Generator::Commands::Destroy
  def file(relative_source, relative_destination, file_options = {})
    destination = destination_path(relative_destination)
    if File.exists?(destination)
      logger.rm relative_destination
      unless options[:pretend]
        if options[:svn]
          # If the file has been marked to be added
          # but has not yet been checked in, revert and delete
          if options[:svn][relative_destination]
            system("svn revert #{destination}")
            FileUtils.rm(destination)
          else
            # If the directory is not in the status list, it
            # has no modifications so we can simply remove it
            system("svn rm #{destination}")
          end
        elsif options[:svk]
          # If the file has been marked to be added
          # but has not yet been checked in, revert and delete
          if options[:svk][relative_destination]
            system("svk revert #{destination}")
            FileUtils.rm(destination)
          else
            # If the directory is not in the status list, it
            # has no modifications so we can simply remove it
            system("svk rm #{destination}")
          end
        else
          FileUtils.rm(destination)
        end
      end
    else
      logger.missing relative_destination
      return
    end
  end

  alias_method :template, :file

  def directory(relative_path)
    parts = relative_path.split('/')
    until parts.empty?
      partial = File.join(parts)
      path = destination_path(partial)
      if File.exists?(path)
        if Dir[File.join(path, '*')].empty?
          logger.rmdir partial
          unless options[:pretend]
            if options[:svn]
              # If the directory has been marked to be added
              # but has not yet been checked in, revert and delete
              if options[:svn][relative_path]
                system("svn revert #{path}")
                FileUtils.rmdir(path)
              else
                # If the directory is not in the status list, it
                # has no modifications so we can simply remove it
                system("svn rm #{path}")
              end
            elsif options[:svk]
              # If the directory has been marked to be added
              # but has not yet been checked in, revert and delete
              if options[:svk][relative_path]
                system("svk revert #{path}")
                FileUtils.rmdir(path)
              else
                # If the directory is not in the status list, it
                # has no modifications so we can simply remove it
                system("svk rm #{path}")
              end
            else
              FileUtils.rmdir(path)
            end
          end
        else
          logger.notempty partial
        end
      else
        logger.missing partial
      end
      parts.pop
    end
  end
end

ARGV.shift if ['--help', '-h'].include?(ARGV[0])
Rails::Generator::Scripts::Destroy.new.run(ARGV)

まんま上書きな感じ。

-Sオプションをつけるとsvk rmとかします。

% ./script/destroy model -S AA
    notempty  db/migrate
    notempty  db
          rm  db/migrate/001_create_aas.rb
D   script/../config/../db/migrate/001_create_aas.rb
          rm  test/fixtures/aas.yml
D   script/../config/../test/fixtures/aas.yml
          rm  test/unit/aa_test.rb
D   script/../config/../test/unit/aa_test.rb
          rm  app/models/aa.rb
D   script/../config/../app/models/aa.rb
       rmdir  test/fixtures
D   script/../config/../test/fixtures/aas.yml
D   script/../config/../test/fixtures
    notempty  test
       rmdir  test/unit
D   script/../config/../test/unit/aa_test.rb
D   script/../config/../test/unit
    notempty  test
       rmdir  app/models
D   script/../config/../app/models/aa.rb
D   script/../config/../app/models
    notempty  app

ありゃ、aliasとalias_methodがごちゃまぜだ。 動作確認めんどいからそのままにしておこう。

alias_methodは初めて知った。そうするとaliasはキモいね。もうalias使うのやめよっと。