OSXでもstraceしたい?よろしい、ならばdtrussだ
strace便利ですよね。最近もnginxがどのファイル開いてるのか調べるのに使いました。ただ、OSXだとそれに準ずるコマンドってないのかなーと勝手に諦めていたのですが、ありましたね。
dtruss
straceと同じように sudo dtruss -p プロセスID
でシステムコールを確認できる。
例えば、nginxで確認してみよう。
$ ps -ef | grep nginx 501 31223 1 0 6:22PM ?? 0:00.00 nginx: master process nginx 501 31224 31223 0 6:22PM ?? 0:00.00 nginx: worker process 501 31935 31725 0 8:07PM ttys005 0:00.00 grep nginx
ワーカーを見れば良いので、 31224
にアタッチしてみよう。
$ sudo dtruss -p 31224
おもむろにWebページにアクセスしてみる。
SYSCALL(args) = return kevent(0x8, 0x7F91DD005C00, 0x1) = 1 0 recvfrom(0x3, 0x7F91DD005400, 0x400) = 469 0 stat64("/usr/local/Cellar/nginx/1.6.2/html/index.html\0", 0x7FFF5DEEF148, 0x400) = 0 0 open("/usr/local/Cellar/nginx/1.6.2/html/index.html\0", 0x4, 0x0) = 10 0 fstat64(0xA, 0x7FFF5DEEEF08, 0x0) = 0 0 writev(0x3, 0x7FFF5DEEE9D0, 0x1) = 179 0 write(0x4, "127.0.0.1 - - [31/Dec/2014:20:08:35 +0900] \"GET / HTTP/1.1\" 304 0 \"-\" \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36\"\n\0", 0xC1) = 193 0 close(0xA) = 0 0 access("/etc/localtime\0", 0x4, 0x0) = 0 0 open_nocancel("/etc/localtime\0", 0x0, 0x0) = 9 0 fstat64(0x9, 0x7FFF5DEEBFC0, 0x0) = 0 0 read_nocancel(0x9, "TZif\0", 0x2A64) = 126 0 close_nocancel(0x9) = 0 0 accept(0x6, 0x7FFF5DEEF430, 0x7FFF5DEEF42C) = 9 0
標準エラーを標準出力にリダイレクトすればgrepもできるので、ここらへんもstraceと同じですね。
$ sudo dtruss -p 31224 2>&1 | grep open open_nocancel("/etc/localtime\0", 0x0, 0x0) = 10 0 open("/usr/local/Cellar/nginx/1.6.2/html/index.html\0", 0x4, 0x0) = 10 0
ちなみに、Homebrewでインストールしたnginxの何が何だか分からない問題
この検証にあたり、適当なプロセスとしてnginx動かそうと思いました。で、Homebrewでインストールしてみたのですが、どのポートで動いてるかとかぜんぜんよくわからなかったので調べてみましたのメモ(lsofの使い方いつも忘れるのだった)。
ちなみに、起動は単に nginx
と打つだけで良い。
lsofはプロセス名で検索することができるので、今回はnginxを指定して調べる。この場合、-c
オプションを使用する。さらに、-P
オプションを使用することでポート番号を生のまま(数値で)表示するオプションを追加している。
$ lsof -c nginx -P | grep LISTEN nginx 32055 sugamasao 6u IPv4 0xed732b31079edf33 0t0 TCP *:8080 (LISTEN) nginx 32056 sugamasao 6u IPv4 0xed732b31079edf33 0t0 TCP *:8080 (LISTEN)
こうすると、どうやらLISTENしているのは8080ポートらしいということがわかる。
-P
を指定しない場合、こんな感じになってService Nameとやらの値に変換するようになっている(生データをデフォルトにしてほしいなぁ)。
$ lsof -c nginx | grep LISTEN nginx 32055 sugamasao 6u IPv4 0xed732b31079edf33 0t0 TCP *:http-alt (LISTEN) nginx 32056 sugamasao 6u IPv4 0xed732b31079edf33 0t0 TCP *:http-alt (LISTEN)
っていうか、まともにlsof
の結果見るとオープンしてるファイルとかもわかるし結構良いですね、、、。
オマケ
Homebrewでインストールされたnginxが使うconfの場所がパッとわからなくてこんな感じで確認しました(こういう使い方もできるよ、ということで一つ)。
masterプロセス、あるいはプロセス名自体でdtrussでアタッチして、nginx -s reload
で設定ファイルを読み直すことで、どこのファイルを参照しているかを確認できた。
$ sudo dtruss -n nginx 2>&1 | grep conf
こうしてから別ターミナルで nginx -s reload
するとこんな感じのログが表示されていた。
32880/0x641a4: stat64("/usr/lib/system/libsystem_configuration.dylib\0", 0x7FFF54E3E9F8, 0x2) = 0 0 32055/0x6168e: open("/usr/local/etc/nginx/nginx.conf\0", 0x0, 0x0) = 4 0 32880/0x641a4: read_nocancel(0x4, "#\n# OpenSSL example configuration file.\n# This is mostly being used for generation of certificate requests.\n#\n\n# This definition stops the following lines choking if HOME isn't\n# defined.\nHOME\t\t\t= .\nRANDFILE\t\t= $ENV::HOME/.rnd\n\n# Extra OBJECT IDENTIFIER in", 0x1000) = 4096 0 32880/0x641a4: open("/usr/local/etc/nginx/nginx.conf\0", 0x0, 0x0) = 4 0
内容を確認してみると、どうやら /usr/local/etc/nginx/nginx.conf
っぽいなってのがわかった。便利〜〜
忘年会しても忘れてはいけない便利最高grepオプション
grep -o
これです。おじさんになっても恥ずかしがらずにこういうのを書いていくのが重要かなと思うようになりました。
おじさん、grep -oを知りました
— IT業界のマー君 (@sugamasao) 2014, 12月 26
-o
を使うと、その引数にマッチした文字列のみ出力できます。
例えば、こんなアクセスログがあったとして……
xxx.xxx.xxx.xxx - - [26/Dec/2014:18:59:12 +0000] "HEAD /login.do HTTP/1.0" 404 0 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)" xxx.xxx.xxx.xxx - - [26/Dec/2014:18:59:15 +0000] "HEAD /login.action HTTP/1.0" 404 0 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)" xxx.xxx.xxx.xxx - - [26/Dec/2014:18:59:16 +0000] "HEAD /index.action HTTP/1.0" 404 0 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)" xxx.xxx.xxx.xxx - - [26/Dec/2014:18:59:17 +0000] "HEAD /struts2.action HTTP/1.0" 404 0 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)" xxx.xxx.xxx.xxx - - [26/Dec/2014:18:59:18 +0000] "HEAD /root.action HTTP/1.0" 404 0 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)" xxx.xxx.xxx.xxx - - [26/Dec/2014:19:50:15 +0000] "HEAD / HTTP/1.1" 302 0 "-" "Hatena Antenna/0.5 (http://a.hatena.ne.jp/help)" xxx.xxx.xxx.xxx - - [27/Dec/2014:02:18:38 +0000] "HEAD / HTTP/1.1" 302 0 "-" "Hatena Antenna/0.5 (http://a.hatena.ne.jp/help)" xxx.xxx.xxx.xxx - - [27/Dec/2014:08:44:14 +0000] "HEAD / HTTP/1.1" 302 0 "-" "Hatena Antenna/0.5 (http://a.hatena.ne.jp/help)"
UAがHatena Antennaが来ている時のアクセス時間を知りたいぞい!とか思うとするじゃないですか。こんな感じにしたら、grepだけでも十分なのだった……!!!!!!!
$ grep "Hatena Antenna" /var/log/nginx/access.log | grep -Eo [0-9]{2}:[0-9]{2}:[0-9]{2} 14:08:19 14:08:19 14:15:00 14:15:00 :
この例では-E
を併用して正規表現を使っているけど、例えばegrep -o ナントカ
みたいにしても良い。
便利ですね。
grepの戻り値あるいは -q
お恥ずかしながら、grepの戻り値で値が存在するかどうか判断できるのを今になって知りました
— IT業界のマー君 (@sugamasao) 2014, 12月 1
grepって、文字列が引っかかるかどうかで戻り値が変化するんですね。つまり戻り値を確認するだけで値が存在しているか確認できるというわけです。
$ echo foo | grep foo foo $ echo $? 0 $ echo hoge | grep foo $ echo $? 1
さらに、-q
を使うと、ヒットした文字列を出力しないので、より明示的に"このgrepは文字列の存在確認をしているのだ"というのが強調されるのと、自動化するときに標準出力が挟まってきてダルいみたいなことを回避できます。
$ echo foo | grep -q foo $ echo $? 0
便利ですね。
どうしても書かなくてはいけない宣伝
またかって感じかもしれませんが、よろしくお願い致します。
Webアプリエンジニア養成読本[しくみ、開発、環境構築・運用…全体像を最新知識で最初から! ] (Software Design plus)
- 作者: 和田裕介,石田絢一(uzulla),すがわらまさのり,斎藤祐一郎
- 出版社/メーカー: 技術評論社
- 発売日: 2014/03/11
- メディア: 大型本
- この商品を含むブログ (5件) を見る
あと、一時期パーフェクトRubyを始めとするパーフェクトシリーズのKindle版がamazonから姿を消していましたが、今日確認したら掲載されていましたので、買う機会を逃していた皆様はぜひお買い求めください*1。
- 作者: Rubyサポーターズ
- 出版社/メーカー: 技術評論社
- 発売日: 2014/10/31
- メディア: Kindle版
- この商品を含むブログ (1件) を見る
- 作者: すがわらまさのり,前島真一,近藤宇智朗,橋立友宏
- 出版社/メーカー: 技術評論社
- 発売日: 2014/10/31
- メディア: Kindle版
- この商品を含むブログ (1件) を見る
購入の際は紙かKindleか念のため確認してくださいね。
*1:インデントが破滅していた問題の対応をしていたっぽいですね
divergence_meterというgemを作った - Webアプリエンジニア養成読本 Advent Calendar 2014 24日目
Webアプリエンジニア養成読本 Advent Calendar 2014 - Qiita の24日目です。12/24の23:40の時点で書き始めているので許してニャン
Webアプリエンジニア養成読本[しくみ、開発、環境構築・運用…全体像を最新知識で最初から! ] (Software Design plus)
- 作者: 和田裕介,石田絢一(uzulla),すがわらまさのり,斎藤祐一郎
- 出版社/メーカー: 技術評論社
- 発売日: 2014/03/11
- メディア: 大型本
- この商品を含むブログ (5件) を見る
このアドベントカレンダーで Gemライブラリ作ってこ! - すがブロ という話を書きました。 その続きというわけではありませんが、少し前にGemライブラリを作成したのでその話をしたいと思います。
何を作ったのか
レーベンシュタイン距離 - Wikipedia という文字同士の編集距離を調べるアルゴリズムを実装したのでした。
例えば、aaa
と aab
は1文字変更すると同じ文字列を作成できるので、編集距離が1ということになり、 比較的似ている文字列である というのがわかります。
ついでに、編集距離を調べるだけではなく、調べたい単語と、辞書データ(単語群)を引数で渡すと、単語に最も近い辞書データの単語を探してくるという「もしかして?」機能も作ってみました。
$ gem i divergence_meter --no-document Fetching: divergence_meter-1.0.1.gem (100%) Successfully installed divergence_meter-1.0.1 1 gem installed $ pry [1] pry(main)> require 'divergence_meter' => true [2] pry(main)> DivergenceMeter.もしかして('__sand__', %w(send __send__ hoge)) => "__send__"
実装自体は上記のWikipediaに乗っている擬似コードをRubyに読み替えるだけなので大して難しくありません。それどころか、実装した後で気がついたのですが
編集距離が近いメソッドを勝手に呼ぶ - hitode909の日記
とか
編集距離 (Levenshtein Distance) - naoyaのはてなダイアリー
とかで語られていて、もう何周遅れのネタだったんだ、という感じです。テストケースの材料としていくらか参考にさせていただきました。
あ、ちなみにこのアルゴリズムを実装した目的は、この文章のような長文の文字列から誤字脱字を見つけられないかなと思って作ってみたのでした。
すでにあるもの作ってどうするの問題
自分にとっては、このアルゴリズムを実装するのは初めての経験だったので良いのです。いわゆる車輪の再発明ってヤツですが、作る上で学びがあるなら良いじゃないか〜という感じですね。あと、個人的なニーズとして、Gemライブラリになっていると都合が良かったというのもあります*1。
すでにあるものを作ってどうするのかという葛藤、あるにはありますが、その分野で一旗揚げるような野心がある人は別として、自分の経験のために作っても良いと思いますのでカジュアルに作ってみるのが良いのかな、と思います。
ちなみにGemライブラリの名前の由来は
編集距離を世界線変動率*2と置き換えてみたら面白いかなーという思った次第です。
書かなくてはならない宣伝
Webアプリエンジニア養成読本[しくみ、開発、環境構築・運用…全体像を最新知識で最初から! ] (Software Design plus)
- 作者: 和田裕介,石田絢一(uzulla),すがわらまさのり,斎藤祐一郎
- 出版社/メーカー: 技術評論社
- 発売日: 2014/03/11
- メディア: 大型本
- この商品を含むブログ (5件) を見る
この本を読んだあと、何かコードを書いてみたいけどイマイチ書くものが思いつかないよ! という方は、上記のレーベンシュタイン距離のような簡単なアルゴリズムを自分でRubyのコードに翻訳してみる、というのをやってみると意外と面白いかもしれませんね。
enjoy!
Webアプリエンジニア養成読本ではあまり説明できなかったRubyの便利なヤーツ
Webアプリエンジニア養成読本 Advent Calendar 2014 - Qiita の21日目です。ガチで書くことがなくなってきました!恐縮です。
Webアプリエンジニア養成読本[しくみ、開発、環境構築・運用…全体像を最新知識で最初から! ] (Software Design plus)
- 作者: 和田裕介,石田絢一(uzulla),すがわらまさのり,斎藤祐一郎
- 出版社/メーカー: 技術評論社
- 発売日: 2014/03/11
- メディア: 大型本
- この商品を含むブログ (5件) を見る
擬似変数たち
本書ではあまり触れていませんでしたが、Rubyでは擬似変数と呼ばれる、変数のような値がいくつか存在します。例えば、true
やfalse
もそれに該当します。
それ以外で面白いものとして、__FILE__
や__LINE__
等があります。これらは実行した時点でのファイルのパスや行数を取得することができます。
ちなみに、Ruby 2.0.0からは__dir__
というメソッド(これは特殊変数ではないのだった)も追加されていて、これを使うと File.dirname(__FILE__)
相当……つまり、該当のファイルが格納されているディレクトリ部分を取得できます。
こんな感じのコードで試してみましょう。
cat hoge.rb puts "start:hoge" puts __FILE__ puts __LINE__ puts __dir__ puts "end:hoge"
これを実行してみると
$ ruby hoge.rb start:hoge hoge.rb 3 /private/tmp end:hoge
こんな感じで取得できます。
詳しくは 変数と定数 を見てください。
その他によく使うもの
擬似変数のようなくくりではありませんが、例えばコマンドライン引数を扱うための値として、ARGVやARGFがあります。
ARGV.each do |arg| puts arg end
これを引数付きで実行するとこんな感じになります。
$ ruby sample.rb foo bar baz foo bar baz
ARGFを使うと、引数の値をファイルパスとみなして、内容を読み込むことができます。詳しくは constant Object::ARGV と object ARGF を参照してください。
ここらへんのオブジェクトなどを利用できるようになると、ちょっとしたコマンドラインツールを作るときに役に立ちますね。
おまけ
Rubyではputs
等のレシーバを指定しないメソッドはおおよそKernelに定義されているものです。 module Kernel あたりを見ると、例えば exit
や sleep
等のメソッドが定義されているのがわかります。ちょっとしたコードを書くときに知っておくと便利なヤーツがあるので、ここらへんのメソッド・特殊変数は抑えておくと良いでしょう。
書かなくてはいけない宣伝
今回のエントリで書いたようなことは書けていませんが、書店などで見つけたらぜひ立ち読みでもしてみて、あわよくば購入してみてくださいね。
Webアプリエンジニア養成読本[しくみ、開発、環境構築・運用…全体像を最新知識で最初から! ] (Software Design plus)
- 作者: 和田裕介,石田絢一(uzulla),すがわらまさのり,斎藤祐一郎
- 出版社/メーカー: 技術評論社
- 発売日: 2014/03/11
- メディア: 大型本
- この商品を含むブログ (5件) を見る
enjoy!
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
次のアドベントカレンダー執筆者はこえむさんで、 手順で議論白熱? | こえむの編集後記 です。
こちらからは以上です