フリーになるとオープンソースをちょっとカスタマイズとか出来ると楽できていいですよね。

そうなるとPHPは外せないわけで、ちょこちょこPHPで出来たオープンソースソフトウェアを弄るわけですが、大規模開発とかSIer向けとかとは違った、OSSのWebアプリに向いた設計があることに気が付きました。

具体的にはWordPressの作者の人(?)がもっと設計を洗練させて作ったというbbPressというフォーラムのソフトがあるんですが、これのソースを見たとき、

「うは、なるほど。やられた。この人はわかっちょる。」

とちょっとショックを受けました。

とりあえずタイトルに対する結論から列挙しますと、(bbPressですが)

  1. 言語はPHPしかありえない
  2. インストールに黒い画面(ターミナル)を使う必要があってはいけない
  3. FrontControllerを使わない。(URL見たまんまのファイルがあること)
  4. クラスを使わない。functions.phpとかにbb_xxxxとかいう関数を列挙する。
  5. テンプレート言語はPHP。theme/default/以下とかに置いて、前述のURL見たまんまファイルと同名にする。(register.phpとか)
  6. ディレクトリ構造はフラットに近くする
  7. gettextを使っておくと自然と翻訳してくれる人が現れる

作者はとにかく「サードパーティー開発者」と「ユーザー」に奉仕して、DRYに反していても誰にでもわかりやすいまま頑張ってスパゲッティにならないようにします。

より多くの「サードパーティー開発者」に気に入ってもらえるようにすることがひいてはプラグインの増加、ソフト自身の価値向上につながるんですね。

この構造の明快さだけでこのアプリのファンになってしまいました。

ただ、裾野が広すぎると、実際に何度も起こっているようにプラグインでSQL Injectionを作りこんでしまう可能性が高いのは何とかしないとまずいですね。プラグインの中でプレースフォルダ使ってない部分があったら警告表示するとか、できないかな?

ActiveRecord拡張とかRails系の

「プラグインにする程でもないけどいつも使う奴」

を2.xからはconfig/initializers/に置いとけば良くなって、みんな多分、rails_ext.rbとか名前付けてんじゃないかな?

何か、すげー便利なrails_ext.rbを隠し持ってる人が全国に沢山いるような気がしてならない!

みなさん自分のrails_ext.rb(に類する奴)を公開してくれませんかー! もしよければトラックバックかコメントください。

おれのはまだヘボイんですが参考までに置いておきます。

module ActiveRecord::ConnectionAdapters::SchemaStatements
  def foreign_key(from_table, from_column, to_table)
    constraint_name = "fk_#{from_table}_#{to_table}" 
    execute "alter table #{from_table} add constraint \
      #{constraint_name} foreign key (#{from_column}) references #{to_table}(id)" 
  end

  def set_autoincrement_number(table_name, number)
    execute "ALTER TABLE #{quote_table_name(table_name)} AUTO_INCREMENT=#{number}" 
  end

  def load_fixture(fixture, dir = "test/fixtures")
    require "active_record/fixtures" 
    Fixtures.create_fixtures(dir, fixture)
  end
end

ActiveSupport::CoreExtensions::Date::Conversions::DATE_FORMATS.merge!(
  :short_jp => "%m月%d日",
  :long_jp => "%Y年%m月%d日" 
)
ActiveSupport::CoreExtensions::Time::Conversions::DATE_FORMATS.merge!(
  :short_jp => "%m月%d日 %H時%M分",
  :long_jp => "%Y年%m月%d日 %H時%M分" 
)

ちょっとRailsのオープンソース系の漁ってきます。

fixtureがcsvでも良いことをしったのでmigration内で初期データをfixtureからロードできるようにしました。(見ての通りFixtures.create_fixturesってのがあるんだけどrequireとかが面倒なので。

config/initializers/rails_ext.rbとかに下記を書く。

module ActiveRecord::ConnectionAdapters::SchemaStatements
  def load_fixture(fixture, dir = "test/fixtures")
    require "active_record/fixtures" 
    Fixtures.create_fixtures(dir, fixture)
  end
end

これでこんな感じで書ける。

class CreatePrefectures < ActiveRecord::Migration
  def self.up
    create_table :prefectures do |t|
      t.references :region
      t.string :name
      t.string :reading
      t.string :roman
    end

    <strong>load_fixture :prefectures</strong>
  end

  def self.down
    drop_table :prefectures
  end
end

やっぱり都道府県名とか、csvで管理したほうが絶対良くない?(load_fixtureはymlでもOKだけど)

Shouldaをautotestで使ったときがっかりなエラーが出る問題は、

# /usr/lib/ruby/1.8/test/unit/autorunner.rb:138
              #@filters << proc{|t| n =~ t.method_name ? true : nil}
              @filters << proc{|t| n =~ t.method_name.to_s ? true : nil}

で直るみたいです。

参照:Autotest compatiable? – shoulda | Google グループ

test_helper.rb見てて知ったんだけど、fixtureってcsvでも良いって知ってた?

  # Setup all fixtures in test/fixtures/*.(yml|csv) for all tests in alphabetical order.
  #
  # Note: You'll currently still have to declare fixtures explicitly in integration tests
  # -- they do not yet inherit this setting

おいおいおいおーい、知ってたんだったら早く言ってくれよ! テストデータってExcelやCalcの方が絶対書きやすいよね。

っていうかさ、凄い遅くていいんだけどCSVへのSQLのインターフェースって無いかな?

いえね、さっき(27時過ぎ)家に向かって初台の方から帰ってきたんですよ。

細い裏道なんで本当に真っ暗で。でも慣れた道なんで特に気にもせず歩いてたんですが、いきなり目の前に北欧系の男女が。

男の方は細くてかなりの長身。女の方はEvanescenceみたいな顔して凄い怖いんですよ。

本当に何にもない路地の壁に寄りかかって座ってる。男の方はめっちゃ俺の方みながら何か喋ってるし、女の方はあぐらかいて黒いノートパソコンをじっと見てる。二人ともラフな格好なんだけど真っ黒い服きてるからノートパソコンのライトに照らされてる顔の辺り以外よく見えない。かなり近づくまで気付かなかったのでビビッた。

結構でかかったから黒のMacBookかもしれない。

初台・幡ヶ谷近辺って新宿中央公園からそれほど遠くないので深夜から朝方にかけて浮浪者がかなりうろつく。女性の一人歩きとかはマジお勧めできない。

そんな中、何やってんだよあのユニット!深夜にあそこでノートパソコンで作業する意味がわかんねーよ!!

・・・・・・。

ところでおまえ、スポーツはやるのか? スポーツはいいぞ。 おれの話はこれで終わりだ。

Railsで ./script/plugin install will_paginate したらこんなメッセージが、

WILL PAGINATE MOVED TO GITHUB. This repository is no longer updated.
It's recommended that you install the gem instead of a Rails plugin:

  gem install will_paginate

The new repository is at: http://github.com/mislav/will_paginate

We have some wiki documentation, also: http://github.com/mislav/will_paginate/wikis

There you can find extensive installation instructions. Have a nice day!

-- Mislav

GITHUBに移ったんすね。アップとかしたこと無いけど最近の使われっぷり、どんだけ魅力的なんだよ!GITHUB。

それと、gemでrails plugin入るの?すごい楽でいいんだけどRaPTの(まだよくわかってないけど)の存在意義は?

利用するplugin gemのバージョンとかはどうやって指定すんだろ。どっちにしろ喜ばしいッス。

たけくまメモ : あなたはどの女性がお好みですか?

ネットサーフィンしていて見つけたイスラム教のお見合いサイトの写真です。俺は、中段右から2番目の女性が好みです。はっきりと断定することはできませんが、もしかするとリア・ディゾンに似ているような気がしないでもありません。

わかんねーよwww

全員アサシンにしか見えない!!

RubyGems使ってみた実況動画、2個目をアップしてみました。

シンプルなTDDライブラリShouldaのGemとRailsでのモデルのテストをやってみました。

身近な知り合いには「つまらん」の一言で終わらせられたりしてヘコんだりしましたが、のんびり続けたいと思います。

追記:

実況動画はこっち(GemCasts.org)へ移しました

rocketstarter 0.0.3になって好きな感じになってきたので現時点での要望をなどを。

  • ディレクトリ構成を変えたい。
    たとえば今は””#{project_name}/rails/#{project_name}”“となっているけど、設定で””#{project_name}”“に変えたい。
  • いつも使うファイルを簡単に置きたい。
    例えば、~/skel/rails 以下をrailsプロジェクトに上書きするとか。lib以下とかconfig/initializer以下とかapplication.html.erbとかがいつもの場所に入れば楽だなあ。

やっぱりgemになってると導入が楽でいいですな。(typoしたけど・・・)