メモ: なぜローカル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のバージョンを使って実行しないようにするため、という理解です。違っていたら教えてください。

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

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

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

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

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

どう書く: 参考問題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は便利

火星年代記

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

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

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

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

新春座談会 このコンピュータ書がすごい! 2016年版

「新春座談会 このコンピュータ書がすごい! 2016年版」の配信を聴いたので登場した本をメモ(数冊聞き漏らしたと思う)。

強調は、自分が昨年までに読んだ or これから読みたい本です。

年間1〜5位

  • 5位: 暗号技術入門 第3版
  • 4位: リーダブルコード
  • 3位: すっきりわかるJava入門 第2版
  • 2位: 人工知能は人間を超えるか
  • 1位: たった1日で即戦力になれるExelの教科書

ランキング外の注目シリーズ

  • 角川インターネット講座 全15巻
    • 村井先生の1巻だけ読んだ
  • 講談社機械学習プロフェッショナルシリーズ

各月のランク入り本

第2レベル以下のリスト項目は、第1レベルの本の説明か、ランク外の関連本の紹介です。

1月
  • たった1日で即戦力になれるExcelの教科書
  • ファンタジーの世界観を描く
    • コンセプトから描き方までを説明
  • リーダブルコード
  • 伝わるデザインの基本
    • デザインの専門家でなくても良いデザインを作るための方法
  • Webエンジニアが知っておきたいインフラの基本
  • すっきりわかるJava入門 第2版
  • ブラザーエッグ? ブラウザエッジ?(聞き取れず)ジョナサン・アイブ
  • ネットワークエンジニアのためのネットワーク技術&設計入門
  • LEAN ANALYTICS
  • Python言語によるプログラミングインストラクション
    • MITのテキスト。Pythonを題材にしたプログラミング教科書
  • Unreal Engine 4 超入門 第2版
    • 1月に第1版が出て、8月に第2版。UE4を初めて使う人向け
  • Serverspec
  • ろごたいぷっ!
    • 書体の研究の増補改訂版
2月
  • デジタルイラストの「背景」描き方事典
  • Maya実践ハードサーフェスモデリング
  • ディープラーニングビッグデータ機械学習 あるいはその心理学
    • Splunkではじめるビッグデータ分析
    • HBase徹底入門
    • はじめてのSpark
    • Google BigQuery
    • オープンデータ時代の標準Web API SPARQL
  • ハッカーの学校
    • ネットワークコマンドの使い方をまとめた感じの本
    • ハッカーの学校 個人情報調査の教科書
    • データ匿名化手法
  • 融けるデザイン ハード×ソフト×ネット時代の新たな設計論
    • UIデザイナー、UXにかかわる人向け。モバイル時代に変化したインタラクション設計について
  • Androidプログラミングバイブル
3月
  • 人工知能は人間を超えるか
    • 東大准教授に教わる「人工知能って、そんなことまでできるんですか?」
    • これまでの人工知能ブームとの違いなど説明
  • 理論から学ぶデータベース実践入門
    • RDBの理論が実際のDBMSにどう反映されているか
  • はじめよう! 要件定義
    • リーン顧客開発
  • Unity ゲームUI 実践ガイド
  • 絵で見てわかるIoTセンサの仕組みと活用
    • iOS×BLE Core Bluetoothプログラミング
    • ボクのLPC810工作ノート
    • 東京モノ作りスペース巡り
    • ハッカソンの作り方
    • ROSではじめるロボットプログラミング―フリーのロボット用「フレームワーク
    • Pepperプログラミング 基本動作からアプリの企画・演出まで
    • 確率ロボティクス
  • 実践ドメイン駆動設計
    • DDD本を読んでいる人向けに、どうすれば上手くいくかを解説した本
  • コンピュータシステムの理論と実装
    • ハロー“Hello,World"OSと標準ライブラリのシゴトとしくみ
    • CUDA C プロフェッショナル プログラミング
  • 本格ビジネスサイトを作りながら学ぶ WordPressの教科書
  • Unity5 3Dゲーム開発講座
  • MikuMikuDanceスターターパック2015
    • ボカロPの中の人
  • AWSクラウドデザインパターン実装ガイド改訂版
4月
5月
  • デジタル原型師養成講座
  • シェルプログラミング実用テクニック
  • すべてのUNIXで20年動くプログラムはどう書くべきか
  • 誰のためのデザイン? 増補・改訂版
  • その数式、プログラムできますか?
6月
読み物系

上半期が終わったところで、読み物系書籍の紹介がありました。

  • 会社でビリのサラリーマンが1年でエリートになれるかもしれない話
  • エンジニアとして世界の最前線で働く選択肢
  • 稼げるSNS tsū(スー)最速攻略ガイド
  • アプリビジネス成功への法務戦略
  • スパム[spam]:インターネットのダークサイド
  • iモードの猛獣使い
  • 日本インターネット書紀
  • AIは「心」を持てるのか 脳に近いアーキテクチャ
  • ビッグデータ・コネクト
  • 故人サイト
  • エニグマ アラン・チューリング伝 (上下巻)
  • マンガ エニグマに挑んだ天才数学者 チューリング
  • Failing Fast
  • 圏論の歩き方
  • コンピュータは数学者になれるのか?
  • スマホに満足してますか? ユーザインタフェースの心理学
  • ニッポンの個人情報
  • HARD THINGS
  • 仮想通貨―技術・法律・制度
  • エクサスケールの衝撃
  • 魔法の世紀
7月
  • おうちで学べるセキュリティのきほん
  • データ解析の実務プロセス入門
  • Unityで神になる本。
  • CSS3開発ガイド
  • スクラム 仕事が4倍速くなる“世界標準”のチーム戦術
8月
  • 暗号技術入門 第3版
  • 最速の仕事術はプログラマーが知っている
  • 文系でも知っておきたいプログラミングとプログラマーのこと
    • プログラミングバカ一代
  • Unity5 3D/2Dゲーム開発 実践入門
  • ヘルシープログラマ
  • Unreal Engine 4で極めるゲーム開発
  • ファンタジー背景画 パーツ編
9月
  • データサイエンティスト養成読本 機械学習入門編
  • JS+Node.jsによるWebクローラー/ネットエージェント開発テクニック
    • 明解WebGL
    • HTML5+Web Audio APIによるオーディオデータプロセッシング
  • Effective Modern C++
  • あなたの知らない超絶技巧プログラミングの世界
  • ゲームグラフィックス 2015 CGWORLD特別編集版
  • たのしいインフラの歩き方
    • ネットワークエンジニアの教科書
    • 絵で見てわかるWindowsインフラの仕組み
    • まんがでわかるLinux シス管系女子 2
    • コンピュータネットワークとインターネット 第6版
    • DevOpsを支えるHashiCorpツール大全
    • 詳説 イーサネット 第2版
    • Nginx ポケットリファレンス
  • 人工知能入門
  • PHPはどのように動くのか
10月
11月
  • Amazon Web Services実践入門
    • OpenStack Swift―Swiftオブジェクトストレージの管理と開発
    • OpenStackクラウドインテグレーション
  • 深層学習: Deep Learning
    • 進化計算と深層学習
  • Swiftではじめる iPhoneアプリ開発の教科書
    • 詳解 Swift 改訂版
    • Android開発者のためのSwift入門
  • コンピューター&テクノロジー解体新書 ビジュアル版
  • HTML5/CSS3モダンコーディング
12月
  • APIデザインケーススタディ
  • 入門Python3
    • Cython
  • アニメCGの現場 2016
  • インフラエンジニア教本2
  • ランディングページ・デザインメソッド
  • レスポンシブEメールデザイン

以上でした。今年も面白かったです。ありがとうございました。

2015年4月から12月に会社ブログに書いた記事の振り返り

今年は勉強会やイベントにあまり参加しませんでした。そこで、1年の個人的な振り返りとして、いつものイベント参加の記録を書くのはやめて、4月以降に会社ブログに書いた記事を振り返ります。

全部で43本、年間で51本でした。読んでくださった方に感謝です。

自選1位と2位の記事

自分で納得のいった記事はこちら。こういうアイデア勝負の記事をもっと書きたいです。

次点はこちら。AWSさんに怒られないレベルの抽象度で、がっつり書きました。

以下では、適当にカテゴリ分けして振り返ります。

セキュリティ関連記事

2月に社内で発足したセキュリティチームで、今年はいろいろ仕事をしました。「何か作業する時は検証して手順をブログに書く」という文化は、ここでも社内のほかの場面と同じです。そんな事情と自分の嗜好も相まって、セキュリティ絡みの記事を結構書きました。

Deep Security

トレンドマイクロ社のDeep Securityに、この1年でずいぶん親しみました。統合IDS/IPS製品なので、本当に多機能ですね。

製品セミナーに参加して、関連資格も取りました (TCSE for Trend Micro Deep Securityの基礎編、実践編、運用編) 。このセミナーはいわゆる高速道路なので、Deep Securityを触るなら、さっさと受けたほうが効率的です。

サーバ手順書記事

社内向けまたは自分用に作ったメモを、ブログで公開したものです。

イベントレポート記事

AWS Black Belt Tech Webinar

ここ半年くらいは音質が安定するようになって素晴らしいですね。

業務外のイベント

LINEさんのイベントは刺激的でした。

次世代Webカンファレンスも刺激的でした。

その他の記事

便利ツール紹介

以上でした。

2016年は、2015年よりももっと驚くような面白い技術やサービスに出会って興奮できるように、自分の感受性をメンテナンスするとともに、技術面で精進したいと思います。

今年もありがとうございました。よいお年をお迎えください。