Ruby
Rails
Backbone.js
wripe

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

More than 3 years have passed since last update.


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で

動作させるとノートのセーブ時に必ず、エラーでおちます。

この理由は2つあるんだけど、1つめはDBまわり(AcrtiveRecord)の

非同期実行を行うためにAmazonSQSを利用しているためにasync.yml

に設定を記述しておかないとAmazonSQSに接続できずエラーになる点、

こちらについては後述、2つめは単純で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に登録するのが

正道ではありますが、英語前提?となっているので、英語で書く

度胸がなければ、避けておいたほうが無難かもしれません。

度胸がある方は下手な(稚拙な?)英語でも書いてみること

をオススメします、書かないよりは書くほうがずっといいハズです。

(そういう自分も英語は下手ですが、意味が通じればいいやで

書いています。)

英語をで書く度胸がない場合には、不具合と思われる場合や導入に

詰まった場合には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!

この文章がたくさん読まれれば、本編を書くかもしれません、

というか、書く可能性が高まります。

それでは。