今日は一人合宿ではありませんでした。@jishihaさんからアカデミーヒルズで作業してるので来ませんかというメッセージをもらったので行ってきました。(アカデミーヒルズは会員の同伴者として行くと安く使える)

以前も使わせていただいて快適だったので行くと、土日は同伴者駄目らしい。

ということで、Twitterでの@milkcocoaさん情報により、六本木地下鉄出口付近のルノアールに移動。無茶苦茶空いてるし、電源は使えるしで最高。

というか、お盆で、今日は花火という時に誰も仕事などしないのでルノアールはすいていた。

皆がお盆休みを満喫している間に僕らはモクモクとプログラミングした・・・。

CMSの進捗

昨日、面倒だったユーザー認証を終わらせたので、次に面倒だと思っていたツリー構造を持つカテゴリー機能を作った。幸いdm-is-treeというdatamapperのプラグインが殆どの面倒な部分を片付けてくれた。(DOMのように、parent, children, siblings, ancestorsなどのメソッドがある。特にancestorsがあればパンくずリストが簡単に出来る)

ついでに年別アーカイブ、月別アーカイブ、日別アーカイブも作った。group byなどのSQLを使ったらKVSにも対応してる意味が無くなるのでちょっと面倒。

デザイナーに使ってもらう工夫について

WordPressにある機能の実装にはさして問題なさそうだが、@jishihaさんとどうやったらエンジニア以外に使ってもらえるかについて色々話した。

WordPressのテーマをこのCMSを用に変換できるようにしたらどうか、とか、GUIインストーラーを作ったらどうかなど。

尖ったプログラマーがやらない地味なサイトやドキュメント整備が大事だという点は頑張ろうと思いました。

テストサイト:http://pyha.heroku.com/

ソース:komagata's pyha at master - GitHub

標準ライブラリのDateで月の加減計算が出来るって知ってました?

Ruby、3年以上はやってるはずなのに知りませんでした…orz

+, -で日の加減が出来るのは直感的にわかるけど、月に対しても出来るとはびっくりしました。

% irb -r date
>> (Date.today).to_s
=> "2010-08-15"
>> (Date.today << 2).to_s
=> "2010-06-15"
>> (Date.today >> 5).to_s
=> "2011-01-15"

サブクラスのDateTimeでもモチロン出来ます。

オーマイガッ!

サインアップとログインを作った。

Admin Loginからuser:pass = test1:testで入れる。

ユーザー認証にはsinatara-authenticationというgemがあるが、100行足らずで実装できる部分だし、DataMapperの時点であらゆるDBに対応してるのにそのORM自体を差し替えられるというのはCMSにはオーバースペックなので外した。

sinatra自身もそうだが、ライブラリやフレームワークの癖が強すぎるとCMSとして一貫したAPIを作るのにどうしても思想的な偏りが出来てしまって良くないように思う。(例えばRailsをベースにCMSを作るとRails流儀に合わせようという心的姿勢が無意識に出来てしまう。)

sinatraはそういった癖がかなり少ない方だが、極限までミニマルなCMSを作りたくなる衝動を抑えるのは難しい。

何度かsinatraアプリを作った経験とミニマルになりすぎて実用的でないアプリを量産した苦い思いがなければまた同じ過ちを犯したに違いない・・・。

sinatraも1.0.0が出て、そろそろコミッタもユーザーもクールダウンしているのであくまで裏方として使う良い頃合いなのかもしれない。

管理画面をちょこっと作ってみて、イケそうなので細部はほっておいて、表側のテーマ作成者向けのAPIをきちんとつくっていきたい。

WordPressのデザイナーから見た利点は@machidaさんに事あるごとに質問して来たんだが、下記のサイトを見て、「WordPressでイケル!」と確信を持ったそうです。

WordPressテーマ(テンプレート)カスタマイズのまとめ(日本語訳) - TRANS

これを参考に、「クラウド対応の一貫したテンプレートAPIを持つCMS」というコンセプトが達成できるように作って行こうと思います。

とりあえずHerokuで動かしてみた。

Test Site

Herokuのbundlerが1.0.0.rc.2に上がってて糞ハマる。

CMS本体のコードよりも、テーマ作成者向けのAPIを慎重に吟味する。

テーマファイルは下記のような構成にした。

  • posts.erb --- 複数の投稿を表示するページ。(トップページ、アーカイブ、検索結果など)
  • post.erb --- ひとつの投稿を表示するページ。(個別ページ)
  • index.erb(必須でない)--- トップページ。このファイルが無い場合はposts.erbが使われる。
  • layout.erb(必須でない)--- レイアウトファイル。このファイルが無い場合はレイアウト機能は使われない。
  • style.css(必須でない)--- CSS。

RubyでJavaScriptみたいにアクセサが自動定義されてるHashみたいのって何を使えばいいのかなと思ってたんですが、標準ライブラリにOpenStructなんてのがあるんですね。

% irb -r ostruct
>> hash = {:foo => 1, :bar => 2}
=> {:foo=>1, :bar=>2}
>> hash.foo
NoMethodError: undefined method `foo' for {:foo=>1, :bar=>2}:Hash
        from (irb):2
>> ostruct = OpenStruct.new(hash)
=> #<OpenStruct foo=1, bar=2>
>> ostruct.foo
=> 1

便利ー!

参照:ostruct - Rubyリファレンスマニュアル

DataMapperに手こずってあんまり進みませんでした。今のとこ、テーマディレクトリのインデックスページが表示できたってだけです・・・。

管理画面とテーマでviewsのディレクトリを変える必要があるのをどうしようかなというとこで今日はタイムアップ。

http://localhost:9393/

リポジトリは下記。名前はPyha(ピュハ)FJORD絡みで北欧の方の湖の名前です。特に意味は無いです。

komagata's pyha at master - GitHub

何でCMS作りたいかというと、WordPressが凄い便利だなーと思うからです。

デザイナー(@machidaさん)とプログラマー(俺)で会社をやってますが、デザインがメインの会社なので当然デザインの案件が多いです。そうすると、WordPressがあればプログラマーは何もしなくていいという案件がとても多いんです。

@machidaさんがWordPressを使い込んでるということもあるんですが、プログラマー無しでまともなWebサイトが作れるとかWordPress凄いなー。嫌だなー 怖いなー 怖いなー って思ってたんです。(褒め言葉)

でもまあ、時々はそのサイト向けに特化した機能や動きが必要になって、既存のプラグインでは対応出来ない時、プログラマー(俺)がプラグインをPHPで書くんですが、これが辛い・・・。

また、既存のプラグインで対応できるかの調査でそのプラグインのコードを全部読んだりするんですが、これもシンドイ・・・。(プラグインの作者がヘボイとかそういうわけでは全然無く、PHPとWordPressのルールと流儀をしっかり守ると逆にシンドイコードになるのです・・・)

それは我慢しろって話ですが、PaaS環境(GAE, Heroku)で動かないのがかなりダルイ。

WordPress用にさくらインターネットの500円の共有レンタルサーバーを借りるのがお決まりのコースなんですが、WordPress以外は全部Herokuに置くようになってから、@machidaさんが、

「何でWordPress、Herokuで動かないんですかねえ」

と、キレそうになっているのでHerokuで動くWordPress的な物が欲しいのでCMSを作ります。

一人合宿1日目。CMS、とにかく作り始めました。

目標はデザイナーの方でも使える、クラウド環境対応(要はGAEとHeroku)のCMSです。

要はWordPressです。WordPressをクラウド対応(要はRDB、KVS、noSQL他DB対応)するのは相当難しい(出来てもデザイナーが使えるようなものにならなさそう)という結論からRubyで作ることにしました。

ツール自体はほぼ使ったことあるのを使うので技術的なチャレンジはしない予定です。Sinatra, DataMapperとかを使って、テーマ・プラグイン機構のあるCMSを地味に作る感じ。Windowsでの動作も必須で行きたい。

僕個人の趣味はなるべく我慢して、面倒な機能も頑張って実装しようと思います。

明日11日から15日まで5日間の夏休みに入ります。

しかし、僕は夏休みを全て投げ売って一人合宿をすることにしました。(自宅で)

Herokuでも動くRubyのCMSを作りたいと思います。一人合宿ですが、毎日経過報告をブログに書こうと思います。

こういうことをブログに書くことで自らを追い込みたいと思います。

ハッシュタグ:#1mancamp

インストール

% gem install sqlite3-ruby rails --pre
% rails new foo
% cd foo
% rails generate scaffold Club name:string exclusive:boolean
% rake db:migrate
% rails server

komagata

ガチ鬱プログラマーです。
FJORD, LLC所属。

詳細