では、Sinatraの使いどころとは一体
Webアプリエンジニア養成読本 Advent Calendar 2014 - Qiita
これの6日目です。すでに7日になってしまい大変恐縮です。
ところで、この書籍(みなさん100万回読んでいると思うので蛇足だと思っていますが!!)では、Sinatraを使って簡単なWebアプリケーションを作成しています。ちなみに、書籍で作成するWebアプリケーションのソースコードは sugamasao/Shiori · GitHub にあります。
なぜSinatraなのか
Sinatra自体は非常に手軽で学習コストが低いこと、その上で一歩ずつ組み立てていくのでWebアプリケーションとは?みたいな題材だとかなり良いと思っているのですよね。Webアプリケーションに必要な構成要素と必要な要素の説明がしやすいんです。
とは言え、カッチリつくろうと思うとファイル数が増えても破綻しないようなディレクトリ構成等を始め、いくつか考えていく必要がでてきます。
SinatraベースのWebフレームワーク
Sinatraベースで、ModelやViewがセット*1になっていて、ディレクトリ構成等がある程度整備されているWebフレームワークとしてPadorinoがあります。
Padrino で素敵なウェブ開発を - Padrino Ruby Web Framework
これを使うと、Sinatraの使い勝手を維持しつつ、ある程度の整備されたレールに乗ることができます。例えば、ジェネレータやコマンドラインベースで実行できるようなrunner等が用意されていて、必須ではないけどあると助かるなぁという部分が補えて良いと思います。
いやしかし……
そう、ここまでやるならRailsで良いのでは。みなさんも思うでしょう。私もそう思います*2。 もちろん、Padrinoにも良さはありますし、自分でコントロールできる幅が広いので、こちらを好む人もいらっしゃるとは思います。ただ、漠然と選択するというよりは、「Padrinoが使いたいんだ!」という気持ちで使って行ったほうが良いのかな、と思います。
では、Sinatraの使いどころとは一体
あまり凝ったことはせず、なんなら1ファイルでも完結するくらい単純なWebアプリケーションを使う場合はとても良いでしょう。例えば、Twitterのとあるキーワードを集めたクローラーを作ったとして、それを閲覧するためのView用のアプリケーションとかですかね。
実際、本書で書いているWebアプリケーションはほぼCRUD操作をする程度のもので、雑に書いてしまえば1ファイルにおさめてしまっても良いくらいの規模ですしね。
まずはお手軽なSinatraを使ってWebアプリケーションを書いて、複雑になって行きそうな規模になったら、その時はRailsやPadrinoを検討してみるのが良いでしょう*3。そうすることで、Sinatraを使う上で検討してきたこと、自分が選んだ選択肢に対して、別のフレームワークがどのような選択をしているのかがわかって情報の洪水に溺れなくて済むのかな、なんて思います。
しなくてはならない宣伝
僕の担当した部分としては、簡単なRubyでのプログラムの書き方からSinatraでのWebアプリケーションまで書いています。どんなもんか興味がある人は書店で立ち読みでもしてみてください*4。
Webアプリエンジニア養成読本[しくみ、開発、環境構築・運用…全体像を最新知識で最初から! ] (Software Design plus)
- 作者: 和田裕介,石田絢一(uzulla),すがわらまさのり,斎藤祐一郎
- 出版社/メーカー: 技術評論社
- 発売日: 2014/03/11
- メディア: 大型本
- この商品を含むブログ (5件) を見る
しなくてはならない宣伝2
もっとRubyにいて知りてーんだよって人にはこちらをおすすめします。
- 作者: Rubyサポーターズ,すがわらまさのり,寺田玄太郎,三村益隆,近藤宇智朗,橋立友宏,関口亮一
- 出版社/メーカー: 技術評論社
- 発売日: 2013/08/10
- メディア: 大型本
- この商品を含むブログ (16件) を見る
あるいは、Railsについて知りたい方はこちら……と言いたいところですが、初めてRailsを触る人向けではないので、その点だけご注意ください。
- 作者: すがわらまさのり,前島真一,近藤宇智朗,橋立友宏
- 出版社/メーカー: 技術評論社
- 発売日: 2014/06/06
- メディア: 大型本
- この商品を含むブログ (6件) を見る
Markdownで執筆をした話
Webアプリエンジニア養成読本 Advent Calendar 2014 - Qiita
これの1日目です。
Webアプリエンジニア養成読本は みんなで「Webアプリエンジニア養成読本」を書きました! - ゆーすけべー日記 でも書いてある通り、Github上のMarkdownを使って執筆しました。
ここでは、パーフェクトRuby / パーフェクトRuby on Railsを執筆する際はRe:VIEW*1を使っていた、という経験を踏まえた上での所感を書きます。
圧倒的メリット
閲覧がメチャクチャ楽という点に尽きます。とにかく、Github上で原稿を見るというのが非常に楽だし、マークアップも僕らの大好きなGithubフレーバーです。
ちょっとしたデメリット
致命的ではないけれど、以下の点はちょっと気をつける必要があります。
- 注釈やコードブロックなど、書籍用のマークアップはないので表現力に限界があります。そこら辺は編集者さんとの協調を得ながらやっていく必要があります
- 各章への参照*2やリスト番号*3等をいい感じにしてくれるような機構はないため、場合によってはそういうのを手動で頑張る必要があるかもしれない
- 本書ではそういうのはほとんどなかった
所感
各章が数万文字、かつ各章ごとにほとんど関連がないようなものだと、MarkdownをpushするあるいはMarkdwonエディタで参照すればすぐに完成形が見れるというのはこの上もないメリットです。
執筆当時はなかなか良いMarkdownエディタに巡りあえず苦労しました*4。Markdあたりを使ってましたが、いまならAtomとかが良いんでしょうね、たぶん……。
はい
Webアプリエンジニア養成読本[しくみ、開発、環境構築・運用…全体像を最新知識で最初から! ] (Software Design plus)
- 作者: 和田裕介,石田絢一(uzulla),すがわらまさのり,斎藤祐一郎
- 出版社/メーカー: 技術評論社
- 発売日: 2014/03/11
- メディア: 大型本
- この商品を含むブログ (5件) を見る
よろしくお願いいたします
mecabにwikipediaとhatenaキーワードのユーザ辞書を適用する(ついでに、辞書にない場合はそれもわかるようにするオプション付き)
mecabのインストール
$ brew install mecab $ brew install mecab-ipadic
wikipediaとhatenaのキーワードファイルの取得
$ curl -L http://d.hatena.ne.jp/images/keyword/keywordlist_furigana.csv | iconv -f euc-jp -t utf-8 > keywordlist_furigana.csv $ curl -L http://dumps.wikimedia.org/jawiki/latest/jawiki-latest-all-titles-in-ns0.gz | gunzip > jawiki-latest-all-titles-in-ns0
辞書作成コードを用意する(make_dict.rb)
$ ruby make_dict.rb
辞書を作成する
$ /usr/local/Cellar/mecab/0.996/libexec/mecab/mecab-dict-index -d /usr/local/Cellar/mecab/0.996/lib/mecab/dic/ipadic -u onomasticon.dic -f utf-8 -t utf-8 onomasticon.csv
試してみる
作成したユーザ辞書を -u
で指定すると、有効になる。ちなみに、 --unk-feature
を指定すると、判定できなかった言葉に対して指定した文言を割り付けることができる
$ echo 'レーベンシュタイン距離' | mecab --unk-feature "未知語" レーベンシュタイン 未知語 距離 名詞,一般,*,*,*,*,距離,キョリ,キョリ EOS $ echo 'レーベンシュタイン距離' | mecab -u onomasticon.dic --unk-feature "未知語" レーベンシュタイン距離 名詞,一般,*,*,*,*,レーベンシュタイン距離,*,*,wikipedia EOS
前者では レーベンシュタイン
を未知語として判定しているのに対し、後者では レーベンシュタイン距離
で一語として判定していて、かつwikipediaに登録されているデータということもわかる。
パーフェクトシリーズが電子書籍になりました
11/1より発売
完全に出遅れましたが、パーフェクトシリーズが電子書籍化されました。
シリーズと書いてるくらいで、RubyやRailsだけではなく、PythonやPHP等も一挙同時リリースです。
- 作者: Rubyサポーターズ
- 出版社/メーカー: 技術評論社
- 発売日: 2014/10/31
- メディア: Kindle版
- この商品を含むブログを見る
- 作者: すがわらまさのり,前島真一,近藤宇智朗,橋立友宏
- 出版社/メーカー: 技術評論社
- 発売日: 2014/10/31
- メディア: Kindle版
- この商品を含むブログを見る
また、技術評論社さんの電子書籍ストアからはEPUB形式が購入できます。
なお、技評さんのEPUB版の書籍の詳細画面に行くとアナウンスがありますが、現時点ではソースコード内のインデントに問題があるそうなので、その点だけご留意いただければと思います(修正されたらそのバージョンが取得できるそうです)。
補足
現在、パーフェクトRubyは3刷目が、パーフェクトRuby on Railsは2刷目が出版されています*1。これらは増刷がはいるタイミングで誤字脱字など*2の修正を行っています。
そして、電子書籍はそれらの最新版相当(Rubyなら3刷、Railsなら2刷)の内容になっていますので、よろしくお願い致しますですぞ〜〜。
Yosemiteでgit pullすると git-sh-setup: No such file or directory って言われてしまった
どうもiTerm2のバージョンによって(古いと)遭遇するっぽい。 git側にパッチ当てたりする方法もあるらしいけど、iTerm2のバージョンを上げるのが正しい方法っぽいかな?
アップデート前のバージョンをメモするの忘れたけど、 Buiild 2.0.0.20141022
で解消していることを確認できた。
rack-lineprofをSinatraアプリに使う
ISUCONでたぶん使うであろう自分の作業メモです。
サンプルアプリとして sugamasao/Shiori · GitHub を使ってみるよ。
気になった人はこの本を買ってね!!!!1
Webアプリエンジニア養成読本[しくみ、開発、環境構築・運用…全体像を最新知識で最初から! ] (Software Design plus)
- 作者: 和田裕介,石田絢一(uzulla),すがわらまさのり,斎藤祐一郎
- 出版社/メーカー: 技術評論社
- 発売日: 2014/03/11
- メディア: 大型本
- この商品を含むブログ (5件) を見る
それでは実際の作業をしていくよ。
% git clone git@github.com:sugamasao/Shiori.git
ディレクトリを移動する
% cd Shiori
Gemfileに rack-lineprof を入れる。
group :development do
+ gem 'rack-lineprof'
gem 'pry'
end
bundle installする。
% bundle install --without production
SQLite3にスキーマを作る
% cd db % sqlite3 sqlite.db < schema.sqlite3.sql
上位ディレクトリに移動してbundle exec rackup
する。
これで通常の動きを確認できる。
次に、rack-lineprofを導入する。
+require 'rack-lineprof' require 'rack/protection' require './app/shiori' +use Rack::Lineprof
これで http://localhost:9292/?lineprof=shiori.rb
にアクセスすると、ターミナルに以下のように出力される。
app/shiori.rb | 29 | 30 get '/' do 0.4ms 3 | 31 @bookmarks = Bookmark.order('id DESC').page(params[:page]) 5.4ms 1 | 32 erb :index | 33 end | 34 127.0.0.1 - - [28/Sep/2014 00:21:17] "GET /?lineprof=shiori.rb HTTP/1.1" 200 1079 0.0089
なお、パラメータで shiori.rb と指定しているが、app/shiori.rb としても大丈夫。なので、複数で同じ名前のファイル名があったりする場合はディレクトリ名を含めたパスを指定すれば良さそう。 同じように、パラメータ部分をindex.erbにすると以下のように、viewファイルのプロファイルも取れる
[Rack::Lineprof] =============================================================== app/views/index.erb | 1 <h1>登録したURL一覧</h1> 1.0ms 3 | 2 <%= will_paginate @bookmarks %> | 3 <div> | 4 <a href='/new'>新規登録</a> ....... | 13 </thead> | 14 <tbody> 1.1ms 4 | 15 <% @bookmarks.each do |bookmark| %> | 16 <tr> | 17 <td><%= h bookmark.id %></td> 127.0.0.1 - - [28/Sep/2014 00:21:26] "GET /?lineprof=index.erb HTTP/1.1" 200 1079 0.0084
ちなみに、これはrack-lineprofの問題ではないけれど、unicornをインストールする際に利用される wsylvest/kgio · GitHub が2.2.0-preview1でビルドでエラーになってしまう……。
Gem::Ext::BuildError: ERROR: Failed to build gem native extension. /Users/sugamasao/.rbenv/versions/2.2.0-preview1/bin/ruby -r ./siteconf20140928-35901-blyemq.rb extconf.rb checking for CLOCK_MONOTONIC in time.h... no checking for CLOCK_MONOTONIC() in time.h... no checking for clockid_t in time.h... no checking for clock_gettime() in -lrt... no checking for t_open() in -lnsl... no checking for socket() in -lsocket... no checking for poll() in poll.h... yes checking for getaddrinfo() in sys/types.h,sys/socket.h,netdb.h... yes checking for getnameinfo() in sys/types.h,sys/socket.h,netdb.h... yes checking for struct sockaddr_storage in sys/types.h,sys/socket.h... yes checking for accept4() in sys/socket.h... no checking for sys/select.h... yes checking for writev() in sys/uio.h... yes checking for ruby/io.h... yes checking for rb_io_t.fd in ruby.h,ruby/io.h... yes checking for rb_io_t.mode in ruby.h,ruby/io.h... yes checking for rb_io_t.pathv in ruby.h,ruby/io.h... yes checking for struct RFile in ruby.h,ruby/io.h... yes checking size of struct RFile in ruby.h,ruby/io.h... 24 checking for struct RObject... yes checking size of struct RObject... 40 checking size of int... 4 checking for rb_io_ascii8bit_binmode()... yes checking for rb_update_max_fd()... yes checking for rb_fd_fix_cloexec()... yes checking for rb_cloexec_open()... yes checking for rb_thread_blocking_region()... no checking for rb_thread_io_blocking_region()... yes checking for rb_str_set_len()... yes checking for rb_time_interval()... yes checking for rb_wait_for_single_fd()... yes checking for rb_str_subseq()... yes checking for rb_ary_subseq()... yes creating Makefile make "DESTDIR=" clean make "DESTDIR=" compiling accept.c In file included from accept.c:90: /Users/sugamasao/.rbenv/versions/2.2.0-preview1/include/ruby-2.2.0/ruby/backward/rubysig.h:14:2: warning: rubysig.h is obsolete [-W#warnings] #warning rubysig.h is obsolete ^ accept.c:101:2: error: use of undeclared identifier 'TRAP_BEG' TRAP_BEG; ^ accept.c:103:2: error: use of undeclared identifier 'TRAP_END' TRAP_END; ^ 1 warning and 2 errors generated. make: *** [accept.o] Error 1 make failed, exit code 2 Gem files will remain installed in /Users/sugamasao/.rbenv/versions/2.2.0-preview1/lib/ruby/gems/2.2.0/gems/kgio-2.8.1 for inspection. Results logged to /Users/sugamasao/.rbenv/versions/2.2.0-preview1/lib/ruby/gems/2.2.0/extensions/x86_64-darwin-13/2.2.0-static/kgio-2.8.1/gem_make.out An error occurred while installing kgio (2.8.1), and Bundler cannot continue. Make sure that `gem install kgio -v '2.8.1'` succeeds before bundling.
基本的には以下のブログをなぞるだけで大丈夫でした。ありがとうございます〜。
RubyKaigi 2014 で出会った神ツールのメモ
RubyKaigi 2014、楽しかったし、学びがあって行って良かったなぁと思いました(小並感すぎる)。
淡々とメモしておくよ
- benchmark-ips
- ベンチマークの高機能版。ウォームアップとして何回か走らせてから実行したり、5秒とか100msで何回実行できるかとかを計測できるっぽい
- synvert
- peek-performance_bar
- View や SQL等でかかった時間を表示するプロファイラ rack-mini-profilerと似てる気がするけど、こっちも試してみたい
- stackprof
- Ruby 2.1で追加された
rb_profile_frames
を使ってどのメソッド呼び出しでどのくらい処理が掛かってるかわかる - 日本語だと http://spring-mt.hatenablog.com/entry/2014/09/21/014930 とかに説明が書いてある
- Ruby 2.1で追加された
- peek-rblineprof
- コードに対して、どの行がどのくらいの回数呼び出されているか、そしてどのくらい時間が掛かっているかを測定できる
- 内部で使ってるrblineprofというのはRubyスクリプトに対する処理を測定できる
- rack-lineprofというRackミドルウェア版もある模様
- rackミドルウェア版はこちらで使い方について説明がある http://k0kubun.hatenablog.com/entry/2014/09/22/020942
- asciiflow
- AAを書くツール
- @sonotsさんのエントリで知った