open-wripeを動かしてみる(その０)

##open-wripe とは

masuidrive氏により開発されたオンライン・テキストエディタ
wri.peのOSS版です。Rails(ruby)とBackbone.js+JQuery(JS)
で書かれています。

wri.pe
http://wri.pe/

masuidrive/open-wripe
https://github.com/masuidrive/open-wripe

##イントロダクション
open-wripeを実際にローカル・サーバで動かしている人は何人いるんだろう。

公式に書いてあるとおりにやってみると確かに動作はするんだけど
不具合？はやっぱりある。

そこで、open-wripeをローカル・サーバで動かす際に初心者or素人が
行き詰まると思う点(ログイン除く)とその対処法を書いてみます。

##ローカル・サーバで動作させるにあたっての問題

### SQLiteにまつわる問題

公式にはSQLiteで動作させるように書かれているけど、実はSQLiteで
動作させるとノートのセーブ時に必ず、エラーでおちます。

この理由は２つあるんだけど、１つめはDBまわり(AcrtiveRecord)の
非同期実行を行うためにAmazonSQSを利用しているためにasync.yml
に設定を記述しておかないとAmazonSQSに接続できずエラーになる点、
こちらについては後述、２つめは単純でSQLiteで動かすことを前提に
コーディングされてはいないので、レコードの登録・更新時にSQLite
のBusyExceptionでおちてしまう点。

対処法は簡単で、SQLiteではなく、MySQL or PostgreSQL等の
リレーショナルDBを利用すること。

他にはSQLite用の処理をプラガブルな形で追加する方法もあるけど、
こちらはopen-wripe自体がSQLiteで本番稼働する類のアプリでは
ないので、やっても、あまり意味はないと思う。

SQLiteのBusyExceptionへの対処法は次のページを読めば
(なんとなく)わかるはず。

SQLiteのBUSY問題
http://aru-and-dhi.blogspot.com/2009/08/sqlitebusy.html

### DBまわり(AcrtiveRecord)の非同期化処理の問題

open-wripeはDBまわり(AcrtiveRecord)の非同期実行用に
AmazonSQSを使っていますが、これはローカル・サーバでは
大げさすぎるので、AmazonSQSの設定ファイルasync.ymlを
適切に設定する方法ではなくAmazonSQSへのアクセスを
回避する方向でいきます。

ソースコードを読んでみるとApplicationContyrollerにフィルター
の形でDBまわりの非同期化処理を実装してあるので、このフィルター
を無効化(around_filterをコメントアウト)することでAmazonSQSを
利用しないようにすることが可能です、developmentでだけ上記フィルター
が動作するように修正するでもいけます。

上記のフィルターの無効化やdevelopmentのみでの動作もアレなので、
DBまわり(AcrtiveRecord)の非同期実行のon/offをYAMLファイル
(config/application.yml)で設定できるようにするプルリクエストを
投げてみました。

https://github.com/masuidrive/open-wripe/pull/5

先日、上記プルリクエストがマージされ、config/application.ymlで

```
defaults: &defaults
  flags:
    disable_ar_async: on
```
にすることで、ソースコードの変更なしにDBまわりの非同期化処理を
offできるようになりました。


###Powにまつわる問題

公式の起動手順はOS X用ゼロ設定RackサーバPowで動作させる
ことを前提に記述されているため、Linux等ではどうすればいいのか
等が初心者や初学者の方にはわかりにくいという問題があります。

また、最近のGoogle Chromeではドメイン名の名前解決の
仕方が変わったらしく、.devドメインのURLにはアクセス
できなくなっています。
※Amazonが.devをICANNにトップレベルドメイン申請？していることが
　影響しているのかもしれません。
　(http://jp.techcrunch.com/2012/06/14/httptechcrunch-com20120613how-tech-giants-are-playing-the-icann-domain-game/)

Powは.devドメインでアクセスされたサイトをlocalhost(127.0.0.1)
に結びつける機能を内包していますが、ChromeではPowの機能を経由せずに
.devドメインをDNSサーバに問い合わせにいってしまうために名前解決に
失敗し、アクセス・エラーになってしまっているようです。

そこで、.devドメインではなく、lvh.meドメイン、Powではなく、
Rails標準添付のRackサーバであるWEBrickを使うようにします。

lvh.meはローカル(127.0.0.1)へのループバック・ドメインと
なっています。
http://asciicasts.com/episodes/221-subdomains-in-rails-3

open-wripeの起動手順にlvh.meを利用する場合の手順を追加して、
プルリクエストしたところ、マージしていただけましたので、
lvh.meを用いたopen-wripeの起動手順については上記公式
Githibリポジトリをご覧ください。

##open-wripeで遭遇するエラーの分析法
open-wripeの吐くログが log/development.log なので、
基本的には、このログを読んで、原因を探るしかありません。

素人や初心者の方は読んでも何のことやらさっぱりだと
思います。

画面ではエラーがあるとJavascriptでエラーダイアログが
表示されるだけなので、画面からではエラーの内容が
更に全くわかりません。

不具合？があった場合には、公式githubのIssueに登録するのが
正道ではありますが、英語前提？となっているので、英語で書く
度胸がなければ、避けておいたほうが無難かもしれません。
度胸がある方は下手な(稚拙な？)英語でも書いてみること
をオススメします、書かないよりは書くほうがずっといいハズです。
(そういう自分も英語は下手ですが、意味が通じればいいやで
書いています。)

英語をor英語で書く度胸がない場合には、不具合と思われる場合や導入に
詰まった場合にはmasuidrive氏のtwitterアカウントに質問・報告
してみるくらいしか手はありません。

##open-wripeのソースコードについて

open-wripeのソースコードはRails中級者？以上で
Javascript(JS)に素養のあるもののフロントエンドJSに
精通しているわけではない人にとっては読む価値がある
とは思いますが、Rails初心者やJSに素養のない人にとっては、
読んでもチンプンカンプンなのではないかと思います、ソース
をみた印象では初学者の勉強材料には全くといっていいほど
向いていません。(誰か手とり足取りに近いレベルで解説しながら
教えてくれる人間がいれば別ですが。。。)

schooの講座でmasuidriveさんに何故AngularJSではないのかと
質問されている方がいましたが、open-wripeのソースコードの
構成をみると、AngularJSで書くには向いていない、と感じます。

open-wripeはエディターやサイドバー等をUIコンポーネントとして
定義し、その集合としてページを構成する設計となっています。

この構成にAngularJSを適用すると、UIコンポーネント毎にコントローラが
必要となり、コントローラ同士のイベント通信もしくはUIコンポーネント毎に
あるコントローラをコントロールするスーパー・コントローラ？(コントローラ
のネスト？)が必要で、ソースコードがムダに複雑になり読み解きにくいコードと
なる可能性が高いと思います。

AngularJSはUIコンポーネント指向での開発には向いていないと
感じています。

Onsen UIのようなAngularJSベースのUIコンポーネントで構成される
UIフレームワークもあるにはありますが、学習コスト高めでカスタマイズは
相当のスキルがないと難しい印象です。

少なくとも、AngularJSがmasuidrive氏のお気に召さなかったのは確かです。

AngularJSが一番という方は是非open-wripeのAngularJS化にトライしてみて
ください、masuidrive氏がその実装を気に入れば本採用となるかもしれません。
※Angular化を行うにはBackbone.jsとAngularJSの両方を理解している必要があります。
(masuidrive氏はcoffee scriptを採用されていることからもわかるように、
Class指向？の方です、AngularJS化に成功しても本採用は難しいかもしれません。。。)

##最後に
駄文をお読みいただき、ありがとうございました。

上記の不具合？に対応し、facebook.yml、github.yml
(ログイン用設定ファイル)を適切に設定すれば、
open-wripeがローカル・サーバ上でひととおり動作する
ようになるはずです。

ぜひ、open-wripeをローカル・サーバで起動し、楽しんで？
みて下さい。

レッツ・トライ、open-wripe！

この文章がたくさん読まれれば、本編を書くかもしれません、
というか、書く可能性が高まります。

それでは。