Hatena::ブログ(Diary)

虎塚 このページをアンテナに追加 RSSフィード Twitter

2016-07-23

メモ: なぜローカルgemをインストールする前に.ruby-versionを消すのか

今日、上の記事があって助かったのだけど、手順の一部の意味がわからなかったのでメモ。記事から手順を引用する。

git clone git://github.com/berkshelf/berkshelf
cd berkshelf
rm .ruby-version
gem build berkshelf.gemspec
gem install berkshelf-3.0.0.beta4.gem
rbenv rehash
疑問

なぜ.ruby-versionファイルを消す必要があるのか? .ruby-versionを残すと、どんな不都合が発生するのか?

前提知識

OSは、RubyRubyを使うツールを実行する際に、PATHの先頭に記述されたディレクトリから順にrubyを探す。rbenvは、PATHの先頭に小細工をして、システムにインストールされたRubyと異なるバージョンのRubyを参照するように仕向ける。

rbenvは、使用するRubyのバージョンを次のように決める。

  1. 環境変数RBENV_VERSIONが定義されていれば使う
  2. 実行したスクリプトが存在するディレクトリから親ディレクトリに遡り、ファイルシステムのルートに至るまでに最初に見つけた.ruby-versionファイルの設定。
  3. カレントディレクトリから親ディレクトリに遡り、ファイルシステムのルートに至るまでに最初に見つけた.ruby-versionファイルの設定。なおカレントディレクトリの.ruby-versionの設定は、rbenv localコマンドで上書きできる
  4. ~/.rbenv/versionの設定。なおこの設定はrbenv globalコマンドで上書きできる。globalバージョンのファイルがなければ、rbenvはシステムにインストールされたRubyを使おうとしているとみなす。

rbenv rehashは、すべての実行可能なRubyに対して、PATH先頭の小細工を (rbenvのドキュメントの言葉にしたがうとshimを) 改めて挿入する。そのため、新しいバージョンのRubyをインストールした場合や、コマンドが提供されるようなgemをインストールした場合(つまり、実行にあたってPATHをたどって実行される場合)、rbenv rehashする必要がある。

結論

というわけで、上の手順で.ruby-versionファイルを消す理由は、rbenv rehashを実行する際に、rbenv自体もRubyで動くので、予期しないRubyのバージョンを使って実行しないようにするため、という理解です。違っていたら教えてください。

2016-03-31

PileMdを使いはじめた

PileMd: Think with you

使いはじめました。

  • エディタ画面がきれい
    • プレビュー画面を見にいかなくていいくらい
  • 書式なしのテキストを貼りつけできる
    • Evernoteとくらべてこの点が最高

会社のブログ (Developers.IO) を書くのにしばらく使ってみます。

2016-02-21

分散と並列計算は解こうとする問題領域が違うよのメモ

http://kuenishi.hatenadiary.jp/entry/2016/02/19/174254

元ネタの記事について身近でも話題になりましたが、関連領域についてど素人なので、上の記事の内容を理解するために勝手に図解。

f:id:torazuka:20160221210536p:image

冪等性ってスケールのためのものという認識だった。横っちょに書いた注釈(「ただし」の部分)は余計かも。

下より上のほうが大事になってくるという話だったけど、どっちの話も難しそうですね。詳しい人に頼って生きていきたいものです。

2016-01-12

どう書く: 参考問題1「ポーカー」

来月はひさしぶりにどう書くに参加するので、リハビリに参考問題1を解きました。Rubyで。

#!/usr/bin/ruby

def is_fourcards (cs)
    return cs.has_value?(4)
end

def is_threecards (cs)
    return cs.has_value?(3)
end

def cnt_pairs (cs)
    return cs.select {|k,v| v == 2}.length
end

input = ARGV[0]
ws = input.gsub(/10/,"T").split("")
cs = []
ws.each { |w| cs.push(w) unless /S|H|D|C/ =~ w }

nums = { }
(2..9).each { |n|
    nums[n.to_s] = 0
}
nums.update({"T" => 0, "J" => 0, "Q" => 0, "K" => 0, "A" => 0})
cs.each { |c|
    nums[c] = nums[c] + 1
}

result = "--"
if is_fourcards(nums) then
    rsult = "4K"
elsif is_threecards(nums) && cnt_pairs(nums) == 1 then
    result = "FH"
elsif is_threecards(nums) then
    result = "3K"
elsif cnt_pairs(nums) == 2 then
    result = "2P"
elsif cnt_pairs(nums) == 1 then
    result = "1P"
end
print result

最初、配列のeachメソッドを呼んでブロックを引数に渡し、ブロック外で定義したhashをブロック内で更新しようとしたら、毎回hashがリセットされてしまって悩みました。スコープ周りを理解してないかも。というか何も理解してないかも。

それはそうと、nidoさんの解答が3行だったので、ひっくり返りました。(ATNDのコメント欄で読めます)

以下、勉強になった点。

  • hashのキーに配列を使うという発想はなかった
  • トランプのsuitを区切り文字としてsplitするという発想はなかった
  • arrayオブジェクトのインデックスをrangeにするのはイディオム?
    • [1..-1]にしているのは、区切り文字が先頭にある場合に先頭要素が空白になるから? これって仕様?
  • group_byは便利

2016-01-10

火星年代記

読みました。楽しかった。

火星年代記 ハヤカワ文庫SF

火星年代記 ハヤカワ文庫SF

1つ前の日記でこのコンピュータ書がすごい!のメモなんて取ってましたが、今年最初の本の感想はこれっていう。近年cover to coverで通読する技術書がめっきり減ってしまいました。で、通読していない本の感想を書くのは気が引けるなあというわけで、この日記でも技術書の話はご無沙汰です。

それはともかく『火星年代記』。去年の夏に買って、最初の章を読んだ時点で、ちょっと叙情的すぎてついていけないなと感じて放置していました。年の暮れにふと手を出したら、今度は面白く読めました。前回はクラーク先生を読んだ直後で、アドレナリンが出ている時に手に取ったのがいけなかったようです。つまりこの本は疲れている時にオススメですね(?)

寓話的な短い話の集合で、先を読むのが恐ろしいような気がするところも含めて、日本のショートショート作家のあの人みたいだけど、そこまでドライでもないかんじ。絵画的なイメージの浮かぶ、不思議な物語でした。