GemCasts.orgというRubyGemsプログラミング実況動画サイトを作ったんですが、そもそも、「RubyGemsって何?」という方のために、

「RubyとRubyGemsのWindowsへのインストール方法」

「最も簡単で下らないRailsチュートリアル」

の動画を作りました。

一応、何も知らなくてもRuby、RubyGems、Railsが出来るはずッス。

参照: GemCasts

GemCasts

GemCasts.org

Gem実況動画、3個程追加して専用のブログ用意してみました。

動画でやったpassenger + typoで動かしてるんですけど、エラーとか謎のセッション切れとか起こりまくって不安定です。頑張って自分で直さないと駄目かな。

これ系は今後こっちにアップしていきます。

旧約聖書 創世記1

神は言われた。「光あれ。」こうして、光があった。 神は光を見て、良しとされた。

(略)

この日に神はすべての創造の仕事を離れ、安息なさったので、第七の日を神は祝福し、聖別された。

神:「6日働いたら1日休んで良し。俺もそうだったし。」

これが民衆に大ヒット。多くの人の心を鷲掴みにし、あっというまにキリスト教は普及しました。

・・・かどうかは知らないけど、適度な休息と規則正しい生活は大事ですな。

個人事業主、komagata商店(そんな屋号じゃないけど)も規則正しい生活を目指そうかなと。

というか、2008年の仕事スケジュールが埋まった。4つのサイトを立て続けに作り終えると、大晦日になることが判明した。というかRedmineのマイルストーンがそうなっとる・・・。

基本、レベニューシェア型のサイト構築のみ受けてます。(顧客と製作者の利害の不一致の矛盾からSIer辞めたわけで、当然そうなる)

でも自サービスとか一銭にもならない頭のおかしいプロジェクト(GemCasts等)とかもやっていきたいので、キリスト教をみならって曜日を決めました。

木曜日に自サービス(お金につながるやつ)、土日は休み!それ以外は通常業務!

謎のプロジェクトとかは土日にやるならOK!

これ破ってるの見つけたらイナズマレッグラリアートくれて下さい。

動画でもやったShouldaのshould_be_restfulが糞便利。

should_be_restful do |resource|
  resource.create.params = { :title => "first post", :body => 'blah blah blah'}
  resource.update.params = { :title => "changed" }
end

とか書くだけでresourceに対するCRUDのテスト(つまりrestfulかどうか)のテストを40個ぐらい生成してくれます。

これはうまい!テーレッテレー!

・・・と思ったらnamespaceを使ったときのxmlの方のテストにバグが。

thoughtbot – shoulda: #29 Broken with namespaced controllers

Reported by Tammer Saleh | April 5th, 2008 @ 07:47 AM

should_be_restful breaks with namespaced controllers.

See google group message threads here and here

If someone could submit a new patch with tests, then we can get it included in trunk

くっ、作者は他人任せにしてはや3ヶ月・・・。

ここでパッチ送ればヒーローですよ!(他力本願)

まあAPIとか使わないから、

should_be_restful do |resource|
  <strong>resource.formats = [:html]</strong>
  resource.create.params = { :title =&gt; "first post", :body =&gt; 'blah blah blah'}
  resource.update.params = { :title =&gt; "changed" }
end

って書けばhtmlの方だけテストしてくれるので問題ないんですが。

季節はまさに夏!

「稲川淳二 恐怖の現場」

IEでしか見れないけどイナジュンが見放題だぜえ

便利そうなRubyGemsをぶっつけで使ってみる実況動画GemCasts。3回目はRSSやAtomのAutoDiscoveryをやってくれるrFeedFinderを試してみました。

3分です。短いッス。

何かよさそうなGemあったら教えてくださいー。

追記:

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

MovableTypeは4.1でさらに高機能になり、テンプレートが高度に構造化されたため、徹底的にDRYにテンプレートを書けるようになっています。さらにCMS的にブログ記事以外のページも自由に作れるようになり、そちらにも構造化されたテンプレートが利用できます。

僕は大東亜戦争従軍記というブログを次のようにしたいと考えました。

  1. デフォルトじゃないデザインにしたい
  2. 老人にも読めるように文言はなるべく平易に(カテゴリ → 目次とか)、文字は大きくしたい
  3. 完結している手記なので古い方から順番に表示したい
  4. 漢数字のカテゴリーを正しくソートしたい(第三章、第四章とか)
  5. タグとかいろんな老人にはわからない文言を削除したい
  6. 携帯にも対応したい

手持ちのMovableType4.1で実現しようと思いました。別のブログを4.1にバージョンアップした経験から、「これは容易ならざる事になった」と思い、4.1対応の書籍を買ってきました。

1時間後、その書籍はゴミ箱の中に納まっていた。

この構造化されたテンプレート、CSSクラス、MTテンプレート記法を覚えた上で、おそらく本体かプラグインのあの懐かしい(しかし昔とは違って進化したモダンな)Perlの海に潜らなければならないだろう。

MTには元StyleCatcherと呼ばれた、他人の作ったテンプレートとスタイルを簡単に自分のブログに当てはめる機能がある。CMS化した4.1に対応したテーマを血眼で捜したが、無かった。

やはりデザイナーにとってもあの高度化したテンプレートに対応したテーマを作るのは容易ならざることに違いない。

次の日、デザイナーの人に相談すると、WordPressをすすめられ、簡単な使い方を習った。

次の日、1人月はかかると思っていたブログのリニューアルが完成した。(趣味なのでかかってもいいんだけど)

特にテンプレートのsql文字列と思われるところに”order by xxx_id”“を追加しただけで記事が古い順に並んだのは痛快だった。

またK-tai styleというプラグインを入れただけで僕のE-Mobileも含めた全キャリア対応になったのにはびっくりした。

sideber.php, footer.php, category.php、実に分かりやすい。

WordPressが大好きになってしまった。

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

そうなると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 =&gt; "%m月%d日",
  :long_jp =&gt; "%Y年%m月%d日" 
)
ActiveSupport::CoreExtensions::Time::Conversions::DATE_FORMATS.merge!(
  :short_jp =&gt; "%m月%d日 %H時%M分",
  :long_jp =&gt; "%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 &lt; 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だけど)