Rubyでアプリケーション以外のコードを書く
Webアプリエンジニア養成読本 Advent Calendar 2014 - Qiita の19日目です。そろそろ書くことなくなってきましたね。
Webアプリエンジニア養成読本[しくみ、開発、環境構築・運用…全体像を最新知識で最初から! ] (Software Design plus)
- 作者: 和田裕介,石田絢一(uzulla),すがわらまさのり,斎藤祐一郎
- 出版社/メーカー: 技術評論社
- 発売日: 2014/03/11
- メディア: 大型本
- この商品を含むブログ (5件) を見る
本書を読んだあなたが
もし、Rubyを気に入ってくれているのだけど、直近のプロジェクトでRubyは使わないんだなーという場合に役立つかもしれません。
プロビジョニングツールを使ってみよう
最近流行ってますよね。DevOpsってヤツ。デブオプス。Ruby製のツールとしてはChefが一世を風靡したことは記憶にあたらしいところです。
しかし、この世はChef疲れを起こす人々であふれています*1。本稿ではもう少しお手軽に使えるツールとして ryotarai/itamae · GitHub について説明していきます。
ChefやitamaeはDSLで設定を書いていくスタイルですが、Rubyの構文が使えますので、本書で手に入れた知識が役に立つ時です!
itamaeをインストールする
前提となる環境は以下のとおりです
まずはGemfileの生成を行います。
$ bundle init Writing new Gemfile to /private/tmp/itamae_sample/Gemfile
おもむろにGemfileを編集します。
# A sample Gemfile source "https://rubygems.org" gem "itamae"
Gemfileの編集を行ったら bundle install
を実行してインストールします。
レシピファイルを作成します
ここでは、自分のOSXの環境構築でインストールするお決まりのツールをitamaeでインストールするようにしてみましょう*2。
recipe.rbというファイルを作成し、下記の内容を記述してみましょう。golangをパッケージングシステムを使ってインストールするための内容です。
package
は実行されるOSによって最適なパッケージシステムが選択されます。つまり、OSX上で実行する場合はHomebrewが選択されます。
package 'go'
これだけ記述したら、itamaeを実行してみます。
itamaeにはlocalモードとsshモードがありますが、今回はローカルに対して実行したいのでlocalという引数を使っています。そして、最後に作成したレシピファイルのパスを指定してあげます。
$ bundle exec itamae local recipe.rb INFO : Starting Itamae... INFO : Recipe: /private/tmp/itamae_sample/recipe.rb INFO : package[go] INFO : action: install
そうすると、goパッケージがインストールされました。
もうちょっとRubyっぽさを……
これだけで「ドヤ?Rubyで掛けて便利やろ?」などと言われても「ハァ、Rubyっすねぇ」というしかないと思うので、もうちょっとRubyっぽい感じでかける例にしてみましょう。例えば、goだけではなく、treeもインストールしたい!!という時、愚直に書くとこんな感じになるでしょう。
package 'go' package 'tree'
しかしここはRubyの世界。このようにも書けます。
%w(go tree).each do |name| package name end
goとtreeをRubyの構文で配列にしてeachで繰り返すようにしました。
$ bundle exec itamae local recipe2.rb INFO : Starting Itamae... INFO : Recipe: /private/tmp/itamae_sample/recipe2.rb INFO : package[go] INFO : action: install INFO : package[tree] INFO : action: install
これを実行すると、複数のファイルが読み込まれているのがわかりますね。
itamae自体は設定ファイルをjsonで外出しにする機構もあるので、あまりこういう使い方はしないかもしれませんが、用途に応じて、簡素に書ける方法を考えていくのが良いですね。
雑なまとめ
- itamaeは便利
- itamaeはRubyが書けるので便利
- itamaeはChefと違って少ない設定でかけるので、ローカルの環境構築とかに便利
- itamaeの詳細はGitHubを見よう!(当たり前ですがpackage以外にもgitとか色々あります!)
- itamae自体はバックエンドに serverspec/specinfra · GitHub を使っているため、RedHatやBSDでも動きます*3
- Serverspecと同じものを使っているということですね
- すぐにRubyを触れない状態でも、Rubyを使う用途はアプリケーション以外にもあるので、そういうところから狙うと良いかもしれません
書かなくてはならない宣伝
itamaeの設定を書くくらいであれば、Rubyを簡単に知っていれば十分なので、↓のRubyの解説を読んだくらいでもなんとかできるんじゃないかなーと思います!!
Webアプリエンジニア養成読本[しくみ、開発、環境構築・運用…全体像を最新知識で最初から! ] (Software Design plus)
- 作者: 和田裕介,石田絢一(uzulla),すがわらまさのり,斎藤祐一郎
- 出版社/メーカー: 技術評論社
- 発売日: 2014/03/11
- メディア: 大型本
- この商品を含むブログ (5件) を見る
次のアドベントカレンダーおじさんは @koemu さんです。
enjoy!
写経のススメ
Webアプリエンジニア養成読本 Advent Calendar 2014 - Qiita の15日です。
本を読み進めるとき
本だけではなく、ステップバイステップで進めていくものなら該当すると思いますが、イマイチ勘所がわからない状態で何かを学ぶとき、おおよそ以下のようなステップを踏むと思います。
- 書いてある事を打ち込んで手元で動かす
- 自分の興味や望んだ挙動になるようにちょっと変更する
言われるがままに写した部分で「はぁ?なんでここでこんなこと書いてんの?」とか、「ちょっと挙動変えたらわけわからんくなった、、、」とかって結構あると思うんですよね。ていうかぼくは結構あるんですよね……。
そんな時は、これがおすすめです*1。
技術書の「写経」の方法。 1.ローカルで使える SCM を用意 2.「ほんたった」などで対象の本を固定 3.ひたすらサンプルコードを写して実行 4.実行するたびにコミット(コミットログにページ番号を含める) 5.疑問点があったらコミットログや本に書き込む 6.章ごとにタグを打つ
— Takuto Wada (@t_wada) February 12, 2010
たとえば、上記の写経ログをGitHubにあげている状態で本の内容でわからない部分を質問すると、質問者に自分が困っている状態のコンテキストがある程度伝わると思うので良い回答が得られるんじゃないかなと思います。
あと、GitHubにあげておくと草が生えるのでぱっと見で「オッ、この人コード書いてるナ!」みたいな印象は得やすいような気がしますね。手を動かしてナンボなところはあるので、それをPCの肥やしにするよりは良いかなーと思います。
ところで、本書Webアプリエンジニア養成読本のプログラミング言語の部分は、写経していけるようなステップバイステップな構成にしています*2。gitの勉強も兼ねて、写経してみてはいかがでしょうか?
enjoy!
しなくてはならない宣伝
そろそろ、本の内容とあんまり関係がなくなってきましたね。キビシイ!
Webアプリエンジニア養成読本[しくみ、開発、環境構築・運用…全体像を最新知識で最初から! ] (Software Design plus)
- 作者: 和田裕介,石田絢一(uzulla),すがわらまさのり,斎藤祐一郎
- 出版社/メーカー: 技術評論社
- 発売日: 2014/03/11
- メディア: 大型本
- この商品を含むブログ (5件) を見る
Gemライブラリ作ってこ!
これはWebアプリエンジニア養成読本 Advent Calendar 2014 - Qiitaの10日目の記事です。下書きに保存のまま一日寝かせてしまいました……。
Gemライブラリを作ってみよう
Webアプリエンジニア養成読本[しくみ、開発、環境構築・運用…全体像を最新知識で最初から! ] (Software Design plus)
- 作者: 和田裕介,石田絢一(uzulla),すがわらまさのり,斎藤祐一郎
- 出版社/メーカー: 技術評論社
- 発売日: 2014/03/11
- メディア: 大型本
- この商品を含むブログ (5件) を見る
この本の中でもSinatraをはじめ、様々なGemライブラリをインストールしています。Gemライブラリ、便利で良いですよね。いやー賢い人が作ってくれた叡智のおかげで我々のような下々の者は楽ができます。すばらしい!
さて、ここでタイトルに戻りますが、いきなりライブラリを作ってみようとか言われても「え、ちょっといきなりは……」ってなりますよね。そうですよね。
一般的に、「Gemライブラリとしてリリースした」というと http://rubygems.org/ に公開している状態を指しますが、ここではもうちょっとお手軽な方法を紹介します。
BundlerとGitHub
BundlerでGemライブラリをインストールする場合、基本的にはrubygems.orgを参照しますが、gemの指定部分にGitHub*1のURLを指定することができます*2。
この指定を利用することで、RubyGemsで公開せずにGitHubに公開しておくだけでBundlerでGemライブラリとしてインストールし、利用できるようになります。
RubyGemsにgemライブラリとして全世界へ公開や!というのよりは、GitHubの自分のリポジトリに公開しておくだけの方が気が楽だと思いますので、最初の一歩としてこちらを試してみると良いでしょう。
どうやってやるの
Bundlerがインストールされているのを前提としますが、Bundlerを使うと、Gemライブラリのひな形が簡単に作れます。
$ bundle gem super_cool_gem
このようにbundle gem
というサブコマンドで、Gemライブラリのひな形を作成することができます。
あとは好きな様にライブラリを書き、コミットし、自分のGitHubへpushすればそれでオーケーです。
ちなみに、Rakeタスクがいくつか登録されており、rake release
とするとRubyGemsにリリースされます(ワオ、親切〜)。
Bundlerからの指定方法
GitHubのリポジトリにsuper_coll_gemというライブラリをpushしたとしましょう。
super_cool_webappというクールなWebアプリケーションを作る際にsuper_cool_gemを使いたい。そんな時はBundlerが使用するGemfileファイルに以下のように書きます。
source "https://rubygems.org" gem 'super_cool_gem', git: 'https://github.com/sugamasao/super_cool_gem.git' :
このように、gem名の後にハッシュ形式でgitというkeyとリポジトリを指定します(super_cool_gemは存在しないのでインストールできません)。
追記:GitHubの場合、以下のようにgithubというkeyを使うことでもうちょっと簡単に指定ができました!!(ありがとうございます)
@sugamasao github: 'sugamasao/super_cool_gem'
— Takafumi ONAKA (@onk) 2014, 12月 11
ちなみにこの指定方法、まだRubyGemsに上がっていない最新版ライブラリを使いたい場合によく利用されます(ブランチの指定もできるので、本流に取り込まれていない特定のブランチを指定する、ということも可能です)。
もっとGemの作り方知りたいってばよ!
そのような場合、ぜひこの書籍をご利用いただければと思います。
- 作者: Rubyサポーターズ,すがわらまさのり,寺田玄太郎,三村益隆,近藤宇智朗,橋立友宏,関口亮一
- 出版社/メーカー: 技術評論社
- 発売日: 2013/08/10
- メディア: 大型本
- この商品を含むブログ (16件) を見る
パーフェクトRuby | Gihyo Digital Publishing
次のアドベントカレンダー執筆者はこえむさんで、 手順で議論白熱? | こえむの編集後記 です。
こちらからは以上です
では、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刷)の内容になっていますので、よろしくお願い致しますですぞ〜〜。