enchantMOONをブックリーダーにする

enchantMOONでPDFを読みたかったのだがPDFファイルを直で扱うのは敷居が高そうなので、PDFをjpegに変換してindexページを付与するrubyツールと、簡単な画面遷移処理を行うjavascriptを作ってみた。

自炊した技術書等をenchantMOONに入れて読んでると、気になった所を切り取ってメモしておけるのでかなり便利!

とりあえず公式ページで配布してるenchantMOONCrewDevConf1.zipの資料を変換して、WEB経由で参照できるシールを作ってみたので、興味のある方は試してみてください。

http://ahinore-em.org/enchantmoon/bookreader/sample/bookreader_sample.moon.zip

ツールは下記で公開してますが、かなり手抜き実装なので自己責任でご利用ください。

https://github.com/ahinore/bookreader-em

■bookreader-emの中身

├── bookreader.moon.zip ←ローカルファイルを開くシール

├── books ←こいつをenchantMOONのDataにそのままコピー

│   ├── data ←ツール実行するとここに変換されたjpegが格納される

│   ├── index.html←ツールを実行すると生成される。これをeMから開くだけ。

│   └── js

│       ├── bookreader.js←画面遷移の制御とか。超手抜き

│       ├── jquery-1.10.2.min.js

│       └── jquery.cookie.js

├── pdf ←ここに変換したいファイルを置く

│   ├── XXX.pdf

│   └── YYY.pdf

└── pdf_converter.rb ←変換ツール。index.htmlのテンプレートも入ってる

■変換ツールを使うためにセットアップが必要な物

  1. ruby1.9 or ruby2.0
  2. ImageMagic
  3. RMagic(gem)
  4. systemu(gem)

windows+cygwinとCentOS6で動作する事を確認してますが、CentOS6の方がセットアップが楽です。

■ツールの使い方

  1. git clone https://github.com/ahinore/bookreader-em
  2. cd bookreader-em
  3. mkdir pdf
  4. pdfディレクトリ 配下に変換したいPDFを配置(複数可)
  5. ruby pdf_converter.rb
    ※結構時間がかかる。ImageMagicの中間ファイルとして1ページ当たり300MB位のファイルが作られるので注意
  6. booksディレクトリをenchantMOONのDataディレクトリにコピー
  7. bookreader.moon.zipをenchantMOONにインストールして実行
    https://github.com/ahinore/bookreader-em/raw/master/bookreader.moon.zip
    ※単に「MOON.openUrl("file:///mnt/extsd/Data/books/index.html");」してるだけ

■ブックリーダーの使い方

  • ブックリスト ⇔ ページリスト ⇔ jpeg画像 のように遷移できる
  • jpeg画像の右側をタップすると次頁、左側をタップすると前頁、上部をタップするとページリストに遷移 

■独り言

  • ブックリーダーはenchant.jsでシールとして実装しようとも思ったが、そうするとページの切り抜きとか一筋縄でいかなそうなので普通のWebページ+jQueryで実装した。
  • ブックリストとかページリストとか超ショボイ。そのうちcssで綺麗にしたい。
  • ブラウザを閉じても再度開いた時に最後に見てたページを表示したいのだが、ローカルファイルだとクッキーが使えなかった。HTML5のローカルファイルも使えない模様。どうにかしたいが、まぁしおり的に切り抜いて置けばOKな気もしている。
  • HTMLの遷移はしたくなかったので画像のみを入れ替えるようにしているが、そうするとURLが変わらなくて切抜きから元ページに戻れなくなってしまうので、URLのハッシュ値を変更するようにしている。ホントはpushStateとか使うべきなのかもしれない。
  • index.htmlにブックリストのjsonデータを埋め込んでるが、これはajaxでローカルファイルにアクセスできないので仕方なく。。。
  • ピンチイン、アウトで拡大縮小とかも実装したい。
  • jpegリーダー的なjavascriptは色々公開されてるようなので、良いのあったら入れ替えたい。

enchantMoonで下書きシールを作ってみた

ラフにメモを取ったり絵を描いた後にその上から清書したかったので、書いた絵を下書きにできるシールを作ってみた。

鉛筆で書く、ボールペンで清書、最後に消しゴム掛けのような感じを再現できます。

  1. 絵を描いた後にこのシールをタップする
  2. 線の色が変わるのでその上に清書する
  3. 清書が終わったあとこのシールをはがすと、下書きの絵が消える

やってる事は簡単で、シールがタップされた時に線の色の変更とストロークの最終インデックスの保存を行い、シールがはがされた時に保存した位置より前のストロークを削除してます。

 ソースは下記。

importJS(["lib/MOON.js"

        , "lib/enchant.js"

        , "lib/ui.enchant.js"

        , "lib/color.enchant.js"

        , "lib/stylus.enchant.js"

        , "lib/puppet.enchant.js"

        , "lib/moon.puppet.enchant.js"], function() {

 

    var LAST_INDEX_KEY="lastIndex";

    var DRAFT_COLOR=-5002905;

 

    enchant();

    enchant.puppet.prepareTheatre({

        assets: []

    });

    StickerPuppet.create("シール", {

        behavior: [{

            stickertap: function(event) {

                var page = MOON.getCurrentPage();

                var backing = page.backing;

                var paper = MOON.getPaperJSON(backing);

                var strokes = paper.strokes;

                var lastIndex = strokes.length;

 

                stickerStorage.setItem(LAST_INDEX_KEY, lastIndex);

                for(var i=0; i<lastIndex; i++){

                    strokes[i].color = DRAFT_COLOR;

                }

                paper.strokes = strokes;

                MOON.setPaperJSON(backing,paper);

                enchant.puppet.stopTheatre();

            },

            stickerattach: function(event) {

                enchant.puppet.stopTheatre();

            },

            stickerdetach: function(event) {

                var page = MOON.getCurrentPage();

                var backing = page.backing;

                var paper = MOON.getPaperJSON(backing);

                var strokes = paper.strokes;

                var index = stickerStorage.getItem(LAST_INDEX_KEY);

 

                strokes.splice(0, index);

                paper.strokes = strokes;

                MOON.setPaperJSON(backing,paper);

 

                enchant.puppet.stopTheatre();

            }

        }]

    });

});

 

本当はシールを貼った時に色変更とインデックス保存を行いたかったのだけど、stickerattachに処理を記述するとなぜかうまく動かなかった。。。

それにしても enchantMoon楽し〜。

 

Rails4でtd-loggerが動かない原因

ログ収集処理をfluentdに統一しようと思ってbundleでtd-loggerを入れてみたのだが、Rail4のサーバが起動し無くなった。

エラーメッセージは下記。

/home/ahinore/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/railties-4.0.0/lib/rails.rb:32:in `configuration': undefined method `config' for nil:NilClass (NoMethodError)

        from /home/ahinore/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/td-logger-0.3.21/lib/td/logger/agent/rails.rb:50:in `<module:Rails>'

        from /home/ahinore/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/td-logger-0.3.21/lib/td/logger/agent/rails.rb:3:in `<module:Logger>'

        from /home/ahinore/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/td-logger-0.3.21/lib/td/logger/agent/rails.rb:2:in `<module:TreasureData>'

        from /home/ahinore/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/td-logger-0.3.21/lib/td/logger/agent/rails.rb:1:in `<top (required)>'

        from /home/ahinore/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/td-logger-0.3.21/lib/td/logger.rb:98:in `require'

        from /home/ahinore/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/td-logger-0.3.21/lib/td/logger.rb:98:in `<module:Agent>'

        from /home/ahinore/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/td-logger-0.3.21/lib/td/logger.rb:96:in `<top (required)>'

        from /home/ahinore/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/td-logger-0.3.21/lib/td-logger.rb:1:in `require'

        from /home/ahinore/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/td-logger-0.3.21/lib/td-logger.rb:1:in `<top (required)>'

 

td-loggerの 周辺のソースを読んでみた所、どうも「td-logger-0.3.21/lib/td/logger/agent/rails.rb:43」の所で、初期化方法がRailsのバージョン3とそれ以外で切り替えているのだが、Rail4はそれ以外に含まれてしまっている模様。

下記のようにRails4も3と同じ初期化方法になる様に修正してみた所、うまく動くようになった。

- if ::Rails.respond_to?(:version) && ::Rails.version =~ /^3/

+ if ::Rails.respond_to?(:version) && ::Rails.version =~ /^[34]/

めでたしめでたし。

 

knife-soloで非管理者ユーザのローカルruby環境にrailsを入れたい

rbenvを使って非管理者ユーザのローカにrubyを入れているが、knife-soloで接続するユーザはsudoできる管理者ユーザなので、ふつうにgem_packageリソースを使うと管理者のrubyでgemをインストールしちゃう。

仕方ないのでexecuteリソース使ってsuでユーザ指定して実行する事で回避。

rails_version="4.0.0"

execute "install rails" do

  cwd "/home/#{user_name}"

  command "su #{user_name} -l -c 'gem install rails --version \">=#{rails_version}\"'"

end 

 うーん、美しくない。

 

Vagrantでbox作成時にふと思った事

とある手順でbox作ってたら、途中でauthorized_keysにvagrantの公開鍵登録してた。

これってvagrantで作ったサーバには誰もが自由にアクセスできちゃうって事か。

マニュアルを見るとprivateで使う場合は自分でキー作って使えと書いてあった。

http://docs-v1.vagrantup.com/v1/docs/base_boxes.html

なにも考えずにvagrantで作ったサーバをネットに公開しちゃダメだね!