vagrant package で "A directory was not specified to package..." となったときの対応

vagrant package を実行した際に以下のようなエラーメッセージが出たときの対応を書いておきます。version は 1.4.2 でした。

$ vagrant package
[default] Clearing any previously set forwarded ports...
A directory was not specified to package. This should never happen
and is a result of an internal inconsistency.
$ vagrant -v
Vagrant 1.4.2

結論から書くと bug(?) だったようで、vagrant 1.4.3 で修正されていました。

vagrant 自体の upgrade はとても簡単で、初期インストール時と同様でパッケージをダウンロードしてインストールするだけでした。

$ vagrant -v
Vagrant 1.4.3

これでvagrant package も成功しました :-)

$ vagrant package
[default] Clearing any previously set forwarded ports...
[default] Exporting VM...
[default] Compressing package to: ...

"インフラエンジニアの教科書"を読んで

"インフラエンジニアの教科書" を読み終えての感想です。

インフラエンジニアの教科書

インフラエンジニアの教科書

一言で言うとインフラエンジニアに求められるスキル全体を俯瞰的に網羅した本で、「インフラエンジニアはこういうものか」と思わせてくれる本でした。

サーバからOS、ネットワーク機器やストレージなどのわりと技術的な話から、ライセンスや機器の購入、データセンターの選定などの業務的(?)な話までひと通り網羅されています。普段私はサーバやOS、ネットワークの設定などのソフトウェアを中心とする業務を行っており、購買などの技術に直接的には関わらない、でもインフラエンジニアとして必要(?)な知識やスキルを持っていないので、そういう話が面白かったです。

最近は chef や docker、vagrant、openstack などのインフラを構築するため技術に自身の関心が集まっていたので、そこから改めて自分の視点を一歩引いてみる良いきっかけになったと思います。

Linux」や「ネットワーク」「ストレージ」などのそれぞれの技術にフォーカスした本はたくさんあると思いますが、それらを"インフラエンジニアの教科書"として俯瞰的に見ていて、かつ余り深くまで技術的な話はしないというところがとても稀有でかつ面白い本でした。内容もとてもわかり易かったので、まさに"インフラエンジニアの教科書"でした。

YAPC::Asia Tokyo 2013 に参加してきました

YAPC::Asia Tokyo 2013 に参加してきたので、気持ちが冷めないうちに感想を書きたいと思います。

Perl

私の Perl 歴は「たまーに Perl で短い便利スクリプトを書く」というレベルでほぼ初心者です。業務はインフラエンジニアでちょいちょい (Perlではなく) Ruby を使ったり、プライベートでもプログラミングをするので プログラミング初心者というわけではないですが、Perl に関しては今までノータッチという状態でした。

参加した感想

Talks では色々なテーマで発表がありましたが、スライドなどは後日、続々と公開されると思いますので内容はそちらに譲るとして、ここでは以下の3つの内容で素直な感想を書きたいと思います。(「気持ち」を書いておくと後で振り返った時に面白いと思いますので。。)

  • 雰囲気
  • 面白かったTalks
  • 参加してよかったと思うこと

雰囲気

会場は慶応大学さんの日吉キャンパスの一部の建物を借りた形で、全体的にそこまで大きくないのかな、という印象でした。 でも、カンファレンスはみなそうだと思いますが、とてもワクワクした雰囲気に会場が包まれていて、参加者の皆さんも同様に楽しんでいるんだな、という感じでした。そんな雰囲気を受けてか、私もとても「次はどんな Talk なんだろう」と、常に高揚感に似た気持ちを持って参加していました。

面白かった Talks

色々な Talk を聞いて、みんな面白かったのですが中でも @yusukebe さんのMojoliciousでつくる!Webアプリ入門と @naoya_ito さんが司会を努められた特別座談会 「Rubyの良いところ語ってください 〜そんなPerlで大丈夫か?〜」 が自分の中では印象的でした。

@yusukebe さんのお話は Perl の WAF (Web Application Framework) である Mojolicious についてのもので、Perl で Web アプリの作り方を初心者にもとても分かりやすい形で発表して頂きました。私は RubyRailsSinatra などを使って、Web アプリを書いたことがあったので、その分すっと入ってきたというのもありますが、それを差し引いてもとても話の流れがよく、「自分でも動かしてみたい!」と思うような内容でした。 Perl で Web アプリを書いてみたい、という方は後日公開されるであろう(?)スライドを見るといいと思います。

Rubyの良いところ語ってください」の方は、(超)著名な方々がパネラーとなり、RubyPerl の比較という観点からディスカッションを行うとても豪華なものでした。壇上のパネラーの方々皆さんが凄腕ハッカーでしたが、そこまで言語自体の具体的な比較などはなく、言語を取り巻くコミュニティの違いやそれぞれの言語の考え方の違いなどを話されていて、Perl 初心者の私にもわかり易い内容でした。Rubyのことしかよくわからない私でもPerlの文化などをわかった気になれた(?)セッションでした。司会をされていた @naoya_ito さんのファシリテートが素晴らしかったというのもあると思います。

参加してよかったと思うこと

1つ目には Perl の現状、文化、スタイル、ライブラリ、開発スタイルなどなど「本当の今」を知れたことが良かったです。Perl Monger の方々に怒られそうですが Perl と聞くと「なんとなく古い言語」のようなイメージがあり、いまは RubyPython の時代という考えが少なからずありました。私の周りでも 「Perl を使ってるぜ!」という人は他のLLと比べて少ないような状況です。しかしながら YAPC に参加してみると、会場で発表されている方々の話や会場の雰囲気には勢いのようなものがあり、少なくとも廃れていっている言語のようには全く感じませんでした。開発する上で利用するライブラリも CPAN モジュールとして充実しているようでしたので、普通に開発で使える言語という感じを受けました。「xxxのSDKPerlの選択肢がない」という話も少なからず聞くので、多少なりとも冷遇(?)されているのは事実のようですが、まだまだ発展していくのかな、という印象です。

2つ目はたくさんの著名な方の話を生で直接聞けたことがとても刺激的で良かったです。rebuild.fmPerl Hacker として有名な @miyagawa さんのお話を聞いたり、@naoya_ito さんや @dankogai さんなどなど、その他たくさんの有名人の方目の前にいらっしゃって、少し興奮してました(^_^;) これだけでも YAPC に参加する価値はあると思いますw (@miyagawaさんや@naoya_itoさんがrebuild.fmで話されている感じよりも早口で、それも印象的でした。発表時間の制約もあると思いますが、エンジニアの方はやっぱり早口なのかなと思ったり)

最期に

結果として YAPC::Asia Tokyo 2013 に参加してとても良かったと思っています。来年も機会があれば是非参加したいと思います。 また、発表者の方々ならびに運営の方々、そして参加者の皆さん、ありがとうございました。特に運営の方々は裏方として支えて頂いて、裏方なりの苦労もたくさんあったと思いますが、皆様のお陰でとても貴重な体験が出来ました。重ねて御礼申し上げます。

GitHub Octokit を使ってみた

GitHub が公開している Octokit を使ってみたので、その際のメモをまとめたいと思います。

Octokitとは

GitHub API を使用する際の client ライブラリのようです。Introducing Octokitにてイントロダクションが公開されています。5/31 時点では RubyObjective-Cバインディングが公開されています。ここではRubyのものを触ってみたいと思います。

準備

まずは octokit の gem をインストールします。ちなみに、私の環境は以下のようなものです。

$ gem install octkit

なお、実際に動かしてみた際に下記のようなエラーが出たので、Mountain Lion+rubyでopensslエラーを参考に証明書のダウンロードを行いました。ありがとうございます!

Faraday::Error::ConnectionFailed: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed

絵文字を取得してみる

試しに GitHub で使用出来る絵文字を 10 個取得してみます

#!/usr/bin/env ruby
# octokit.rb

require 'open-uri'
require 'octokit'

emojis = Octokit.emojis.to_a[0...10]

emojis.each do |name, url|
  fname = File.basename(url).sub(/\?.*$/, '')
  File.open(fname, 'wb') do |file|
    open(url) do |content|
      file.write(content.read)
    end
  end
end

下記を実行するとカレントディレクトリにファイルが 10 個ダウンロードされました

$ ./octokit.rb

まとめ

Octokit を使うと GitHub API を簡単に叩けるようになるので、色々なことが簡単にできそうです。ただ「これがやりたい!」という明確なものがなければ、あまり使い道が無いかもしれません(^_^;)

"コーディングを支える技術" を読んで

"コーディングを支える技術" を読みを終えたので、感想を記してみたいと思います。

きっかけ

本書を読むきっかけとなったのは小飼弾さんのブログ記事、言語を支えるコンセプト - 書評 - コーディングを支える技術を読んだことでした。

今までいろいろなプログラミング言語をつまみ食いして、プログラミングの世界によく出てくるキーワード 「継承、型、Mix-in」などなどをわかった気 (?) になっていましたが、「一度振り返りの意味も込めて読んでみよう」と思い、本屋さんで手に取りました。

感想

本書は色々なプログラミングに取り入れられている仕様、仕組み、概念が『なぜこうなっているのか』を学ぶための本だと思います。if 文や for 文などの基本的な制御構文から始まり、コンテナやクラスなどのよく使う機能を「他の言語との比較」や「歴史からの経緯」の二つの観点から解説されています。私としてはこの二つの観点から言語の仕組みを解説されているのが、「とても論理的でかつ面白い!」と思いました。

本書の中では色々なキーワードについて、比較と歴史から解説されていますが私が特に勉強になったことを以下に上げてみます。

当たり前の仕組みの「なぜ」を学ぶ

プログラミングをしていると当たり前のように if 文や for 文、クラスや型を使い、それがあるのが当たり前のように思っていましたが、本書ではそれがどういった経緯で作られたのかが解説されており、とても新鮮で面白かったです。ほとんどのものは何かを楽にするために作られた、というのが主な目的でしたが、それがなかった時との比較がきちんとされていて理解し易かったです。

言語によっての解決方法の違い

プログラミング言語によっての解決方法の違いが、きちんとコードを使って解説されていてとてもわかり易かったです。例えばある機能を再利用したい場合、Java では継承や委譲を使い、Ruby では Mix-in を使う、などそれがコード付きで解説されていたのが良かったです。(すいません、例が微妙かもしれません...)

クラスが持つ複数の役割

3 つ目はクラスがもつ役割の複数の役割についてです。ある言語では主に「振る舞いの仕様」としてクラスを使っていたり、また、ある言語では「コードの再利用の単位」としてクラスを使っていたりと、一言にクラスと言っても複数の役割があるということを意識させられました。また、クラスという概念が複数の役割をもつ事によって、どのような問題があるのか、またそれを解決するためのアプローチが書かれており、面白かったです。

まとめ

あまり長々と書いても疲れるだけなので、上ではなるべく短く書きましたが、言語の色々な仕組みについて書かれていてとても面白く、かつ抽象的な説明と具体的な説明のバランスが良く分かりやすい本だと思います。本書でプログラミングに関することを再勉強、再確認ができたと思います。

何より良かったのはプログラミング言語の概念の「なぜ」を考える意識が、少なからずですが自身のなかにできたことだと思います。是非ご一読されることをおすすめします!

Play framework の設定ファイルで環境変数を読み込む

最近 Play framework で Web アプリケーションを作成していますが、その中で設定ファイル (conf/application.conf など) の中で環境変数を読み込みたい場面がありました。例えば、OAuth 認証を使って twitter などのアプリケーションとの連携をする場合に、設定ファイルに直接 consumer key を記述するのははばかれるので、『環境変数に設定しておきそれを読み込む』といった感じです。

やり方

play framework のドキュメント にやり方が書いてありました :-)

具体的には application.conf の中で以下のように環境変数${? } で囲ってあげると良いようです。 (ENV_VARIABLE環境変数です。)

hoge=${?ENV_VARIABLE}

あとは、下記のように環境変数を設定しておくと読み込むことが出来ました。

$ export ENV_VARIABLE=jojo

ちなみに application.conf 内で include したファイル内でも正しく環境変数を読み込むことができました。

こうすることによって、git などでバージョン管理下にあるファイルでもコミットしたくない情報を隠すことが出来ます。

Heroku にデプロイする場合

以下のように Heroku での環境変数を設定してあげると、ちゃんと動きました。

$ heroku config:add ENV_VARIABLE=jojo

ちなみに application.conf 内で ${ENV_VARIABLE} のように ? を抜かしてもローカル環境では動きましたが、Heroku では上手く動きませんでした。 (詳しい方、教えていただけると幸いです)

gcc コンパイルで規格を指定するとき

久々に C を書いていて、以下のような for 文を書くとコンパイルの際に怒られたので、調べてみました。 忘れないようにメモ。(ファイル名は適当です)

  // hoge.c
  for (int i = 0; i < N; ++i) {
    // do something
  }

以下のようなエラーが。。。

$ gcc hoge.c -o hoge 
hoge.c:8: error: ‘for’ loop initial declaration used outside C99 mode
解法

gcc の -std オプションを指定するといいみたいです。

$ gcc hoge.c -o hoge -std=c99
// エラー無し