すがブロ

sugamasaoのhatenablogだよ

では、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)

Webアプリエンジニア養成読本[しくみ、開発、環境構築・運用…全体像を最新知識で最初から! ] (Software Design plus)

しなくてはならない宣伝2

もっとRubyにいて知りてーんだよって人にはこちらをおすすめします。

パーフェクトRuby (PERFECT SERIES 6)

パーフェクトRuby (PERFECT SERIES 6)

あるいは、Railsについて知りたい方はこちら……と言いたいところですが、初めてRailsを触る人向けではないので、その点だけご注意ください。

パーフェクト Ruby on Rails

パーフェクト Ruby on Rails

*1:これらのライブラリはデフォルトで用意されているもの以外に変更することが可能だ

*2:いくら変化が早いと言われてもユーザ数が多い分、情報のでかたに違いがあります

*3:そういう呑気なものが許されるのであれば、、、

*4:気に入ったら買ってね!!

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)

Webアプリエンジニア養成読本[しくみ、開発、環境構築・運用…全体像を最新知識で最初から! ] (Software Design plus)

よろしくお願いいたします

*1:https://github.com/kmuto/review

*2:X章 xxxxみたいなヤツ

*3:リスト 2.10みたいなヤツ

*4:Mowとかでは文字数が多すぎてまったく役に立たない

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)

gist88bfb2936690d5508a8c

$ 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より発売

完全に出遅れましたが、パーフェクトシリーズが電子書籍化されました。

シリーズと書いてるくらいで、RubyRailsだけではなく、PythonPHP等も一挙同時リリースです。

Amazonでは、以下のkindle版が購入できます。

パーフェクトRuby

パーフェクトRuby

パーフェクトRuby on Rails

パーフェクトRuby on Rails

また、技術評論社さんの電子書籍ストアからはEPUB形式が購入できます。

なお、技評さんのEPUB版の書籍の詳細画面に行くとアナウンスがありますが、現時点ではソースコード内のインデントに問題があるそうなので、その点だけご留意いただければと思います(修正されたらそのバージョンが取得できるそうです)。

補足

現在、パーフェクトRubyは3刷目が、パーフェクトRuby on Railsは2刷目が出版されています*1。これらは増刷がはいるタイミングで誤字脱字など*2の修正を行っています。

そして、電子書籍はそれらの最新版相当(Rubyなら3刷、Railsなら2刷)の内容になっていますので、よろしくお願い致しますですぞ〜〜。

*1:いわゆる増刷というやつです

*2:修正する必要がなければそれに越したことはないですが、、、

Yosemiteでgit pullすると git-sh-setup: No such file or directory って言われてしまった

どうもiTerm2のバージョンによって(古いと)遭遇するっぽい。 git側にパッチ当てたりする方法もあるらしいけど、iTerm2のバージョンを上げるのが正しい方法っぽいかな?

アップデート前のバージョンをメモするの忘れたけど、 Buiild 2.0.0.20141022 で解消していることを確認できた。

f:id:seiunsky:20141029234245p:plain

rack-lineprofをSinatraアプリに使う

ISUCONでたぶん使うであろう自分の作業メモです。

サンプルアプリとして sugamasao/Shiori · GitHub を使ってみるよ。

気になった人はこの本を買ってね!!!!1

Webアプリエンジニア養成読本[しくみ、開発、環境構築・運用…全体像を最新知識で最初から! ] (Software Design plus)

Webアプリエンジニア養成読本[しくみ、開発、環境構築・運用…全体像を最新知識で最初から! ] (Software Design plus)

それでは実際の作業をしていくよ。

% 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、楽しかったし、学びがあって行って良かったなぁと思いました(小並感すぎる)。

淡々とメモしておくよ