| @技術/プログラミング

CakePHPで作ってたプロジェクトのDBのフィールド名にスペルミスを発見したので( longitudelongtitude としていた)、それを修正するためにDBの構造をいじった。このとき、Cakeは普通にやってたらSchemaとかの概念に触れる機会がないことに気がついて急に怖くなった(ここんとこRailsばっかり触っていたので)。いや、CakePHPにもSchemaの概念はあるんだけど、普通にサイト作るだけだったら世話になる機会がない。というか俺がCakeの底本にしてた公式ガイドにSchemaの項目がない!

これじゃあgitとかでバージョン管理しててもDBの論理構造が置いてけぼりになって、分散管理とかできないじゃん。SQLite使ってたらバイナリファイルをgitでtrackすればまぁ分散開発でけそうだけど、MySQLとかだったら死ぬよね。

確かにCakePHPでサイト作るのは楽だったし早かった。ほぼ何もできない状態の自分が数ヶ月でCMS作れたのはCakePHPのおかげなんだけど、CakePHPは何でもテケトーな感じがする。対してRailsは厳格だ。楽するためのフレームワークというより、よりStrictにサイトを構築するためのフレームワークという感じがする。だから慣れるまでは時間がかかる面があるのは否めないんだけど、SchemaにしろTestにしろ、Railsやってて勉強になることはたくさんあります。はやく皆と同じようにrailsの手術を受けたい。

| @技術/プログラミング

このブログのCMSをMephistoからjekyllに変えてみた。

Mephistoは公式サイトつながらないし、Mephisto使ってた外国のGeek連中がここ一年くらいでこぞってJekyllに移行してるみたいなのでこのビッグウェーブに乗ってみた。

Jekyll = 静的CMS

しばらくJekyllの使い方が分からなくて格闘してたけど、やっと使い方が分かった。これは静的なCMSであって動的なCMSではない。Movable Typeに似てる。それをGeekなスタイルでやる感じ。

Rubyが入ってるサーバーはいらない

コメント機能とかはないのでサーバーでRubyが動く必要はナッシング。DBも使わないのでMySQLの設定とかSQL分との格闘も必要ナッシング。コメント欄が欲しい場合は DISQUS とかに外注すればOK。

ちょっと話題がずれるけど、DISQUSって便利そうですよね。他人のブログにコメント書いたあとってそのコントロール権みたいのはブログの持ち主に移行するけど、DISQUSみたいなサービスを利用すればコメントを書いた本人が過去の自分のコメントをトラックしやすくなる。ブログ主にしたってスパム対策とかもやりやすくなる。自前で自分のブログにコメント欄を持つって時代は終わったのかもね。いまはTwitterとかもあるし。

Mephistoからの移行について

Jekyllのgithubのwikiに移行方法が載っけてあるけど(Blog Migrations - jekyll - GitHub)、これわかりにくい。というかMephistoをMySQLで運用してないとスクリプトをそのまんまでは利用できない。結果から書くと僕はMephistoはSQLite3で運用してたので移行スクリプトを使えなかった。

一応MephistoのDBをSQLite3からMySQLに変更してコンバートすることも試してみたけど、DreamHost上では gem install mysqlplussudo 権限がないために実行できず(なぜかユーザーディレクトリへのインストールもはねられる)、ローカルのMacBook上ではActiveRecordとかその辺でエラーが出て(MephistoはRails 2.2.2以下じゃないと動かないみたい)、Railsのバージョンを下げるとかも試してみたんだけどエラーが出続けるので諦めてしまった。

そういうわけでして、記事数が16本と少なかったこともあり、ちまちま手書きでMephistoからJekyllに移行しました。

コメント欄の設置(DISQUSを利用)とかフィードの生成とかカテゴリーの表示とかができてないけど、暇を見つけていじっていく予定です。

全般的なJekyllの使用感

DBいらずだしシンプルでいいっすわ。XML-RPCとかAPIを使ってどうのこうのとかいった機能はないけど、テキストファイルをしこしこ書いて、 .markdown か .textile みたいな拡張子で保存して、 jekyll コマンドを実行するだけでhtmlファイルが _site ディレクトリに生成されて、これをアップロードするだけ。この手順を自動化するシェルスクリプト(tasks/deploy at master from henrik's henrik.nyh.se - GitHub)も公開されているので、これを使えばectoとか使うのと変わらん感じでお手軽にブログ記事を投稿できます。

Terminalからコマンドライン打つの好きな人とか、軽くてシンプルなブログを求めてる人にはうってつけだと思いますね。

| @技術/プログラミング

ポータルシットがクソ重くて、なんか対策ないかなーとか仕事をさぼりながらときどき調べてた。

おおよその原因は掴んでいた。それはアクセス解析プラグイン。MySQLのデータ容量がでかくなるとページの表示が遅くなる。アクセス解析プラグインを無効にした状態でページの表示速度はだいたい0.05秒くらいなんだけど、アクセス解析プラグインを有効にすると表示速度は1秒台とかまで悪化する。アクセス解析に使うテーブル( p_page_analyze )をDROPするとまた速さが回復するので時々空にしていた。

しかしよくよくアクセス解析プラグインのコードを覗いてみると、ヴュー部分で使っていないSQLクエリが発行されており、このせいでクエリの回数が必要な回数の何倍にもなっていた。ポータルシットのアクセスなんて大したことないんだから、DBのサイズがちょっとでかくなっただけでこんなに遅くなるはずがないのだ。

そういうわけで不必要なクエリのトリガーになるコードをコメントアウトしてみた。すると1秒台だった表示速度は0.2秒から0.5秒程度に収まるようになった。しかしそれでもなんか遅く感じる。

それでキャッシュを効かせることにしてみた。使ったのはPecl APC。DreamHostはなんでもやらせてくれるのでほんと助かる。

Pecl APC - DreamHost を見ながらシェルスクリプトをコピペして走らせ、php.iniにAPCの設定を書き加えて終了。僕はPHPのバージョンを5.3.1に上げているのでコピペしたシェルスクリプトのまんまではきちんと入らなかった。最新版のAPC(APC-3.1.3p1)にバージョン情報を書き換えてインストールしたところうまくいった。またDreamHost Wikiではキャッシュファイルのパスが /home/username/tmp/apc.*XXXXXX* だったり /home/username/tmp/apc.*XXXXX* だったりばらついてるけど、Xの数は6個じゃないと500エラーが出るのでご注意を。

キャッシュを効かせて見た結果、フッターのPage Generationはあまり変化がないが、体感速度は十分に速くなった。

| @技術/プログラミング

CakePHPには Media Plugin というのがあって、これがすこぶる便利。画像や文書の他に、動画ファイルまで扱うことができる。PHPではファイルアップロードのところにセキュリティリスクが潜んでいそうなイメージだし、自分のような素人に毛が生えたようなレベルの人間は素直にこういう便利なプラグインを使った方がいい。

しかしこのMedia Plugin、設置が少々面倒だ。情報も英語のものも含めて少ない。僕は二つのプロジェクトでこのMedia Pluginを使ったけど、とても設置に苦労した。はまるポイントはいくつかあるんだけど、今日はDBについて書いておこうと思う。

Media Pluginは attachments というテーブルをつくり、ここにファイルのメタデータを格納していく。これはアプリケーションのルート( APP ディレクトリ)で cake media init というコマンドをTerminalで打ってやると(ただし /cake/console にパスを通しておく必要あり)、Bakeのときのような画面が出てきて初期設定をやってくれる( app/config/database.php の情報にあわせてテーブルも作ってくれる)。しかしCakePHPのデフォルトDBがMySQLであるためMedia PluginもMySQLを想定しているのか、 app/plugins/media/config/sql/media.sql のSQL文を単純に実行してしまうと不具合が生じる。実は僕はここで結構はまってた。僕は全部のプロジェクトでSQLiteを使っているので、単純にこのSQLを実行すると、 attachments.id のデータ型が INT(10) とかになってしまい、エラーに遭遇し続けることになってしまった。SQLiteの場合、idカラムのデータ型は INTEGER でなければならないのだ。

これはMedia Pluginに限らないけど、Convention Over Configuration なフレームワークを使うときは、DBのテーブル名に注意をはらわなければならない。否、先にも書いたとおりそれだけでは不十分で、さらにカラムのデータ型とかも規約に沿ったものにしないと、原因不明の謎のエラーに遭遇して開発が停滞する。おっちょこちょいな人(僕も含めて)はその辺の基本的な部分をおろそかにしない方がいいと思った

| @技術/プログラミング

昨夜寝る前にダメ元でスクリプト動かして寝たところ、朝起きてTerminalを覗くと

INSTALL COMPLETE

の文字が。

そういうわけでAmazon乞食エイトできるようになりました。

が、XMLRPC経由で投稿できなくなった。これは地味に困る。 :-!

とりあえず以下が僕が使ったシェルスクリプトです。どうしても入んなかったのはいくつかコメントアウトしてあります。DreamHostへのPHPインストールで困っている方、良かったら参考になさってください。

更新

XML-RPC経由で投稿できました。良かった良かった。

Continue reading...

| @ブログ

可能な範囲でデータを元に戻しました。記事の過去ログは11月末までのやつのSQLファイルをエクスポートしてたのでそれで対応。コメントの過去ログはXREAのサーバーに中途半端にデータが残ってたのでそれをインポートしました。ここ10ヶ月間くらいのコメントはサルベージできませんでした。MySQLのバックアップもせめて週一くらいでやらないとダメだな。

jQueryのスクリプトがいくつか動かなくなってたのがあってそれもだいたい直したつもりだけど、いっぺん作ったプラモデルがぶっ壊れて最初からやり直しな感じで疲れた。

いまんとこAmazonのISBNプラグインが動かないです。DreamHost、SOAPがインストールされてないらしい。使いたいならPHPをカスタムインストールしろってさ。昨夜、何回か試してみたけど途中でこける。

でも良いですね、DreamHost。SSHでつなぐとさすがにとろい感じはしますが、コマンドラインでMySQLにもアクセスできるし、いろいろ勉強させてもらえそうです。

ただ国内のレンタルサーバーと違ってサーバーのTimezoneがPSTなので、SQL文とかでMySQLの now() 関数とかを使っちゃうと支障が出ます。

一年目は年額27ドルくらいで使えるけど、来年から120ドル弱になっちゃうのがネックかな。容量も転送料も無制限だから、機能を考えたらそれでも十分安いと思いますけどね。

| @ブログ

ポータルシットはXREAのレンタルサーバーで動いてたんですけど、1月2日からのサーバー障害から復帰すると、なんとデータが全部吹っ飛んでました。参ったなこりゃ。

障害情報

[2010/01/05 01:00] 復旧いたしました。ディスクチェックの際、データの整合性が取れず、、ディレクトリ・パス情報が欠損したファイル郡が出ており、お客様によってはファイル が異常になっている場合があります。それらの情報は管理ディレクトリに格納しておりますが、ファイル名、上位ディレクトリ名がわかれば、復旧可能な場合が あります。現在も作業中ではございますが、ご確認のほど、よろしくお願い申し上げます。ご連絡いただければ、復旧可能な場合は、別の場所にコピーさせてい ただきます。

とあるのでサポートに問い合わせてみたのですが、いきなり「障害時のデータ復旧は免責事項」という返信がやってきてびっくりしました。ごねる隙すら与えてもらえませんでした。

XREA相手に文句を言ってもデータは戻ってこないし、かといってこのままXREAを使い続けるのは癪なのでレンタルサーバーを引っ越すことにしました。hetimaさんのブログで読んで良さそうだなぁと思っていたDreamHostにしてみました。sshでサーバーに接続できて、MySQLにもコマンドラインでアクセスでき、さらにはPHPを自分でカスタムインストールできるらしい。至れり尽くせりです。

XREAは安かろう悪かろうなサーバーだとは聞いてはいたんですが、自分はこれまでトラブルにあうことなく3年近く使っていたので油断していました。MySQLのデータもカスタマイズしたP_BLOGのファイルもろくすっぽバックアップとってなかった。夏頃、githubにちらっとソースをアップしてたときのファイルが残っててそれを元にサイトを構築しなおしたので、夏頃の外観・サイト構成になっております。というわけでお見苦しいところも多々ありますがご了承ください。

なおDreamHostにはgitもインストールされてるので、これに懲りて今度はちゃんとバージョン管理とバックアップを行おうと思った次第です。