まだコミットしては無いんですが、LokkaのMac用ビルドを作ってみました。Dropboxに置いてあるので、Macをお持ちの方は記をダウンロード・解凍して起動し、http://localhost:9646/ でLokkaが動いてるかどうか試していただけるとありがたいです。

http://dl.dropbox.com/u/188423/Lokka.zip

特にXcodeをインストールしてない方の情報が知りたい!動いた!とか動かねえ!とかあったら@komagataや#lokkacmsにメッセージいただけるとうれしいです。

多分Snow Leopard、あわよくばLeopardで動くかもしれません。

BSD系ではpgrep, pkill, pfindはproctoolsというパッケージ名だそうです。

% brew install proctools
% pgrep ruby 
77785

rubygemsを見ていて、ubygems.rbって変なファイルがあるなと思って開いたら・・・

# This file allows for the running of rubygems with a nice
# command line look-and-feel: ruby -rubygems foo.rb

lib/ubygems.rb at from rubygems/rubygems - GitHub

ナイスハックwww

homebrewは元々自分のディレクトリ以外を汚さないように出来ているので好きな場所に置いてPATHを通す。

% curl http://github.com/mxcl/homebrew/tarball/master -LO
% tar zxf master
% mv mxcl-homebrew-348d28f ~/homebrew
# ~/.zshrc
export PATH=~/homebrew/bin:$PATH
% ls
% GEM_HOME=`pwd` gem list > /dev/null
% ls
cache          doc            gems           specifications

なにそれこわい。

gem environmentとかでも同様。

option + y

Macで動くアプリを作るのに真っさらなMac環境が必要だったのでVirtualboxでMacが動かないか格闘中。

mac_os_x_10_6 [実行中]

"Still waiting for root device"とひたすら出続けるだけで上手く行きませんな。ググッても出てくるのはWindowsでMacを動かそう系ばっかりなのでやり方が違うのかも?

他のソフトだったら動いたりするんですかね?

@dandasoに何故gitを使うのか、svnから移行するコストを払うに見合う嬉しさは何なのか聞かれた。

gitを使いこなしてる方々に取っては噴飯ものの解答だと思うが、俺はこう答えた。

「殆どのトラブルはcommit時に起こる。svnは1ステップで全員共通のリポジトリにcommitされるのでmergeやcommitは怖いが、gitはcommitした後にpushしないと他人に影響が出ない。だから気軽にcommitしたりmerge出来る。その違いが嬉しい。」

Snippet

LokkaにSnippet(スニペット)を追加しました。

Snippetとはテンプレート間で共有したい部品を入れておくものです。Pageも同じ用途に使えるのでWordPressではそれが常套手段っぽいですが、@machidaさんが

「PageはURLが存在するので直接アクセスできるのが気持ち悪い」

と言っていたのでSnippetという名前で別に用意しました。

komagata [p0t]

このブログで言えば、右のプロフィールの部分でSnipetを使っています。今まではPageの機能を使っていたので、プロフィール単体がURLを持っているので妙なページが存在することになっていました。

Snippetは好きに名前を付けられるのでテンプレ内では下記のようにかけます。

<%= Snippet.first(:name => 'about').body %>

モデルのユーティリティメソッド

今回、各モデル用にユーティリティメソッドを用意しました。そのユーティリティメソッドとは"そのクラスで一番使いそうなメソッドをクラス名と同名のメソッドとして用意したもの"です。それを使えば上記は下記のように書けます。

<%= Snippet('about').body %>

要はこれです。

Ruby - クラス名と同名の関数にデフォルト動作をさせるパターン - komagata [p0t]

同じように他のモデルにも用意されています。

<h2><%= Page('inquiry').title %></h2>

DataMapperのAPIを使えば何でも取れますが、テンプレートがスッキリするかなと。

SPAMで大変なことになっていたこのブログのコメントを@yagi_さんのAkismetプラグインをきっかけに整理してみた。とりあえず既存のSPAMを消すが大変だった。そもそもSPAM判定されようがされまいが、コメントがDBに投稿される数が多過ぎるので、

%form
  :javascript
    document.write('<input type="hidden" name="check" value="check" />')

と入れて、checkという値が無かったら404を返すようにした。SPAM BOTがJavascript を理解するかどうかというただそれだけだけど、今までは1日に数百個コメントSPAMが来るとかザラだったので大分違う気がします。何か他に簡単で99%ぐらいのスパムを弾ける方法があればいいなと思います。

Conditional Tagの追加

テーマを書くときに、今どのページなのか(カテゴリー別ページなのか、個別ページなのか等)を判断する関数をWordPressではConditional Tagと言うらしいです。@machidaさんからの要望で、個別ページ(entry?)の中でも投稿(Post)なのかページ(Page)なのかが一発で判断できるConditional Tagが欲しいと言っていたので追加しました。

%w[index search category tag yearly monthly daily post page entry entries].each do |name|                                                                     
  define_method("#{name}?") do    
    @theme_types.include?(name.to_sym)
  end
end

post?とpage?というhelperを追加しただけです。

日本語のtruncate

何文字以上だったら"xxxxxxxxxxxxx..."みたいに縮めるtruncateが日本語文字列の途中でぶった切ってしまうのを直しました。微妙に気になってたんです。

def truncate(text, options = {})                                                                                                                              
  options = {:length => 30, :ommision => '...'}.merge(options)
  if options[:length] < text.split(//u).size
    text.split(//u)[0, options[:length]].to_s + options[:ommision]
  else
    text
  end
end

split(//u)で配列にして文字数を判断するようにしました。何か場当たり的な感じで怒られそうだけど・・・。