akadama

そこらへんにいるプログラマが適当にやってます

Vagrant-awsを使う際はuser_dataを設定してみよう

流行りのVagrantでEC2インスタンスを制御できるvagrant-awsプラグインを使ったときの小ネタ

環境は以下の通り

* MacOSX
* Vagrant 1.2.2
* vagrant-aws 0.2.2
* AmazonLinux(ami-173fbf16)

基本的な使い方はid:naoyaさんのブログとかGitHubを参考に。
Vagrantfileの書き方に関してはnaoyaさんが試した時点から、SSH関連の設定方法に変更があったのでGitHubのほうも参照したほうがいいです。

Vagrant 1.1 で EC2 を vagrant up - naoyaのはてなダイアリー
mitchellh/vagrant-aws · GitHub

で、起動してみると最後に↓こんなエラーがでます。

[default] Rsyncing folder: /Users/chiastolite/workspace/vagrant/ec2/ => /vagrant
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!

mkdir -p '/vagrant'

なんだろ? と思ったら /etc/sudoersDefaults requirettyが設定されているのがエラーが出ている原因らしい

さて、これをどう直すか? ということなんだけど、sshで入って直すのはVagrant使ってる意味がないなと。 じゃあ、chefで直すか?と思ってもcookbooksのsyncがコケるしそもそもchefが入ってない。 ということでuser_dataを使ってみることにした。

Vagrantfileはこんな感じ

Vagrant.configure("2") do |config|
  config.vm.box = "dummy"

  config.vm.provider :aws do |aws, override|
    # 中略

    # sedでrequitettyのとこをコメントアウト
    aws.user_data = <<-USER_DATA
#!/bin/sh
sed -i -e 's/^\\(Defaults.*requiretty\\)/#\\1/' /etc/sudoers
    USER_DATA
  end
end

設定はこのプルリクを参考にした

で、vagrant upし直すと

[default] Rsyncing folder: /Users/chiastolite/workspace/vagrant/ec2/ => /vagrant
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!

mkdir -p '/vagrant'

まだエラー…

でもvagrant provisonし直すとエラーが起きない。
多分、user_dataが設定される前にmkdirをしちゃっているのでエラーになってるんだと認識。
ちょっと気になるけどこれでしかたないかな。

ついでにuser_data使えば↓こんな感じでchef clientを入れることも出来ることを確認。

Vagrant.configure("2") do |config|
  config.vm.box = "dummy"

  config.vm.provider :aws do |aws, override|
    # 中略

    aws.user_data = <<-USER_DATA
#!/bin/sh
curl -L https://www.opscode.com/chef/install.sh | bash
    USER_DATA
  end
end

これでEC2をvagrant経由で制御することが可能になった。
インスタンスの立ち上げ、廃止、プロビジョニングが簡単なのはすごい捗るなぁ。

Vagrant + Chef 勉強会を開催してきた

詳しくは↓

参加者の方のブログ

会場は万葉さん。初めて伺いましたがアットホームな感じですてきな職場でした。

ちなみに開催してきたとか言ってるけど、@hokkai7goさん、@joker1007さんの話に乗っかった形で 主催者とか名乗るのはおこがましい(^^;

自己紹介をしてからはVagrant+Chefを使ってのセットアップとプロビジョニングとか、 もくもくと作業したり、気になる話題を話したり、すごい勉強になりました。
最後は噂のpivotal/pivotal_workstationを見て、みんなで大笑い。

思ったこと

孤独のChef

みなさんの共通の悩みっぽいのが職場でのChef/Vagrant仲間がいない(少ないこと)
興味をもってくれる人はいるけど、そこまで踏み込んでくれる人がいない…

一人でやってるとなかなか学習進まない→なかなか現場に導入できない→人増えない→最初に戻る

こんな感じになりそうなので打開したいところですね

(主に)コミュニティのcookbookが使われてた

なんとなく自前のcookbook作って育ててる感じなのかなぁと思っていたんですが、コミュニティのcookbookを使ってるという話が多かった。
あんまりコミュのほうは調べてなかったので、使いそうなのは追っていこうと思いました。

rbenvとかは↓この人のがいいかもとのこと。

fnichol (Fletcher Nichol)

その他

@shimizukawaさんとRedmineに関して話をできたり、@tk0miyaさんのroundsmanの話を聞いたり、@joker1007さんたちとBerkshelfの話をしたり。
あと今回のイベントはishikitakai.comに立てられてたんだけど、「ishikitakai」「ishikitakai」って口に出すたび笑いが起きて、不思議と意識高くなってくるような気がするのでオススメです

最後に

発起人の@hokkai7goさん、@joker1007さん、ありがとうございました!
ぜひ次回もやりましょう!

Chefの勉強会に行ってきた

naoyaさんのブログだったり、AmazonのOpsWorksだったりで最近Chef熱が上がって来てるとこに素敵な勉強会が開催されるということで行ってきた。

イベント内容に関してはUstやTogetterで空気を掴んでいただければ。

気になったトピックとか

Chef11での変更に関して

Ruby -> Erlangになってたのは聞いていたがその他にも変更がいろいろあったらしい。

  • Private Chefのライセンス形態が永久からサブスクリプションへ
  • サーバもクライアントもインストールが簡単になったらしい

Install Chef | Opscode

インストールが楽になった(ぽい)というのはかなり嬉しいニュース。 Chef Serverはセットアップが辛い辛いとよく言われていたが、11では2行のコマンドで実行できるとかなんとか。ミドルウェア周りで必要な手順はないのかな? ほんとに2行で出来るなら本当にうれしい

Vagrantが当たり前になってきそう

以前@ryuzeeさんのセッションを聞いてから使うようになったVagrant。 ThoughtWorksのTechnology Radarでの位置付けもドンドン上がってるし、これはブレイクするかな。

ということで自分が思うVagrantが便利だなと思うところ

  • Chefのレシピの検証
  • スナップショットプラグイン(sahara)を使ってロールバックがしやすい
  • 開発メンバー間での環境の統一できる
  • 特に開発機のOSが統一されてない時は必須
  • 開発環境と公開環境の統一
  • Vagrant+Chefのレシピで(理論上)同じ環境で開発ができるので、不要なトラブルが発生しない

AWS OpsWorksおもしろそう

内部の仕組みでちょっと気になるとこあるけど(既存インスタンスへのレシピの反映とか、インスタンス生成タイミングの違いによる構成の差が出ないかとか)WebでぽちぽちしてAutoScaleとか、起動時間の設定とかできるのはいいなぁと思った。 SSHも出来てブラックボックスにもならないし、これも要調査

その他

発表が一通り終わってからnaoyaさんにVagrantのboxは何を使ってますか?と聞いてきた。 (↓ここにあるのを使ってるとのこと)

A list of base boxes for Vagrant - Vagrantbox.es

そこで話になったのが理想はAmazonLinuxのイメージ使えること。 自分もAMIをVirtualBoxで使えないか調べていたので、考えてることは間違ってなかったみたい。

その点で言うとEngine Yard Localはすごいいいと思う。 昨日ここの話聞けばよかったなぁ。

ローカル クラウド コンピューティング: Engine Yard Cloud でローカル クラウド環境を作成

最後に

こんなおもしろい勉強会を開催・会場を提供してくださったEngine Yardのみなさま、発表者のみなさまありがとうございました。

会場にはアプリ/インフラの有名人がいたりして、Chefはどちらのポジションにいても重要になってきてるんだなぁというのが印象的でした。 今年はしっかり使いこなせるように頑張ろうと思います。

env_http_proxy.gem をリリースしました

env_http_proxy | RubyGems.org | your community gem host
chiastolite/env_http_proxy · GitHub

簡単に言うと「環境変数にhttp_proxyが設定されていた場合、Net::HTTP.newが呼ばれた際にはそのプロキシを利用するように強制するライブラリ」です。

会社ではプロキシを設定しないと外に出れないのですが、そのせいでプロキシを考慮してないプログラムが動かなくストレスフルな生活をしていました。これで平穏な日常に戻れる気がします。

Padrinoで使ってみる

Padrinoでプロキシ対応してないのはプラグインリストの表示

1
2
3
4
bundle exec padrino gem plugin -l

/Users/chiastolite/.rbenv/versions/1.9.3-p385/lib/ruby/1.9.1/net/http.rb:762:in `initialize': Operation timed out - connect(2) (Errno::ETIMEDOUT)
()

Gemfileに以下の行を追加してbundle installを実行

1
gem 'env_http_proxy', group: 'development'

環境変数 http_proxyを設定

1
export http_proxy=http://proxy.example.com:8080/

再度プラグインリストの表示を行います

1
2
3
4
5
6
7
8
9
10
11
bundle exec padrino gem plugin -l

Available plugins:
  - ["960"]
  - ["access"]
  - ["ar_permalink_i18n"]
  - ["ar_permalink"]
  - ["ar_textile"]
  - ["ar_translate"]
  - ["auto_locale"]
  (以下略)

動いてますね
プロキシが対応していないライブラリ/プロダクトってのは結構多く、毎回PullRequest出すのも大変なのでとりあえずこれでしのげればいいなと思います

Rbenv-default-gemsを試してみた

会社に行くと毎朝必ずbrew updateをしてるのですが、rbenv-default-gemsというFormulaが追加されてるのに気づきました。

sstephenson/rbenv-default-gems · GitHub

作者はrbenvのsstephenson
ruby-buildを実行した際に指定したgemを同時に入れてくれるプラグインのようです

さっそく試してみます

READMEを参考に ~/.rbenv/default-gems に以下のような内容を書きます

1
2
bundler
pry

あとはいつも通りrbenv installをするだけ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ CONFIGURE_OPTS="--with-readline-dir=/usr/local --with-openssl-dir=/usr/local --enable-shared" rbenv install 1.9.3-p385

Downloading yaml-0.1.4.tar.gz...
-> http://dqw8nmjcqpjn7.cloudfront.net/36c852831d02cf90508c29852361d01b
Installing yaml-0.1.4...
Installed yaml-0.1.4 to /Users/morita/.rbenv/versions/1.9.3-p385

Downloading ruby-1.9.3-p385.tar.gz...
-> http://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.3-p385.tar.gz
Installing ruby-1.9.3-p385...
Installed ruby-1.9.3-p385 to /Users/morita/.rbenv/versions/1.9.3-p385

Fetching: bundler-1.2.3.gem (100%)
Successfully installed bundler-1.2.3
1 gem installed
Fetching: coderay-1.0.8.gem (100%)
Fetching: slop-3.4.3.gem (100%)
Fetching: method_source-0.8.1.gem (100%)
Fetching: pry-0.9.11.4.gem (100%)
Successfully installed coderay-1.0.8
Successfully installed slop-3.4.3
Successfully installed method_source-0.8.1
Successfully installed pry-0.9.11.4
4 gems installed

おぉ入ってる入ってる
毎回 gem install bundlerやるのも面倒だなと思っていたので、これはいい拡張ですね

「「コードゴルフに挑戦! in 東京Ruby会議10」に挑戦してみた」にさらに挑戦してみた

先日のエントリ、最終結果を見たら78バイトは13位だった。

なんかくやしかったからShibuya.rbでもくもくしてみた

元のはこれ

1
eval('%d.upto(%d){|x|puts ("FizzBuzz "[n=x**4%%-15,n+13]||x.to_s).strip}'%$*)

FizzBuzz判定のロジックは@mametterさんのこのスライドを読んだときに知ったものだったが、行末の空白のためにバイト数を使ってしまっている
ここは判定にバイト数を使ってもいいかもしれないと3項演算子やらを使ってみた

1
eval('%d.upto(%d){|x|puts "FizzBuzz"[n=(z=x**4%%-15)<0?z+1:z,n+12]||x}'%$*)

2バイトの削減に成功

@tyabeさんに「スペース無ければシンボルに出来るのに…」と言われていたのでそれを試してみる

1
eval('%d.upto(%d){|x|puts :FizzBuzz[n=(z=x**4%%-15)<0?z+1:z,n+12]||x}'%$*)

1バイトの削減に成功

そういえばevalにつけてるカッコはいらないのでは?と試してみた

1
eval'%d.upto(%d){|x|puts :FizzBuzz[n=(z=x**4%%-15)<0?z+1:z,n+12]||x}'%$*

動いた!! 2バイトの削減に成功

もしかしたらputsの前のスペースもいらない?と試してみた

1
eval'%d.upto(%d){|x|puts:FizzBuzz[n=(z=x**4%%-15)<0?z+1:z,n+12]||x}'%$*

動いた!!!! 1バイトの削減に成功

これで72バイト!!
今のロジック的にはここが限界かなぁ…?

東京Ruby会議10に参加してきた

会場は千葉市美浜文化ホール
最寄りが検見川浜というとで移動時間片道2時間オーバー…

カっとなってホテル取った!しかも前泊!!
(聞いた感じホテル取った人ほとんどいなかった。みんな都会人だな)

発表内容に関してはすでにいろんな方が上げてるようなので割愛。

個人的には前からお話を聞きたいと思っていたcookpadの井原(@ihara2525)さん、永和の田垣(@akiinyo)さんのを一緒に聞けたのが嬉しかった
(井原さんは札幌Ruby会議、田垣さんはオブラブ収穫祭のスライド等々を見て気になってた)


運営のほうを見ると、いろんなコミュニティを運営している人がいるからか、すごい気配りが効いていたなぁと思う。

ノベルティのバッチを使ってみたり、アンチぼっち(ランチ|ディナー)を開催してみたり。
正直アンチぼっち(ランチ|ディナー)が無ければぼっち飯確定だった人はいるはず(オレ、オレだよ!!)
ああいう場で発表聞くだけだともったいないし、感じた熱を周りの人と共有するという意味でもすごいいい取り組みだった気がする。

そして、2日目の雪による影響を考えての英断。
運営側としては苦渋の決断だったろうなぁと思うのですが、各種路線の状況を見るとあれが無ければ家に帰れなかったかもしれなかったので、ほんとに感謝しています。


今月末には事後懇親会(通称:Q)が控えている。
また楽しい時間を過ごせるといいなぁ。

「コードゴルフに挑戦! in 東京Ruby会議10」に挑戦してみた

東京Ruby会議10にてささたつくろたつさんからCodeIQでのコードゴルフの告知があった

挑戦者求む!【Ruby】コードゴルフに挑戦! by 東京Ruby会議10 佐々木 達也│CodeIQ

コードゴルフとは特定の動作をするプログラムのソースコードを、可能な限り短いバイト数で記述するプログラミング・コンテスト(by Wikipedia)だそうだ

今回は問題がFizzBuzzだったので、前にとあるQuineを読んだときに知ったロジックを使って書いてみた

wcで測ってみたら78バイトだったのでまぁまぁかなーと思ってたら、どうもトップは65とからしい。さて、どこを削ったらいいものやら

Zshを導入してみる

正月ということで前から気になっていたzshを試してみることにした zshのインストール === メイン環境はMacなのでhomebrewで入れることに とりあえずinfoを見てみる “` sh brew info zsh “` If you have administrator privileges, you must fix an Apple miss configuration in Mac OS X 10.7 Lion by renaming /etc/zshenv to /etc/zprofile, or Zsh will have the wrong PATH when executed non-interactively by scripts. Alternatively, install Zsh with /etc disabled: brew install –disable-etcdir zsh よくわからないけどLionの/etc/zshenvは設定がおかしいらしいから/etc/zprofileにリネームしろみたいな? もしくは/etcを見ないようにオプションをつけろって感じだろうか あんまシステム側のファイルに手を出したくないので今回は後者を試してみる “` sh brew install –disable-etcdir zsh “` zshが起動できることを確認したので次は設定に antigenを入れてみる === [oh-my-zsh](https://github.com/robbyrussell/oh-my-zsh)といういろいろ設定をしてくれるツールがあるらしいのだが ちょっと過剰な気もしたので、@glidenote さんのブログを元に[antigen](https://github.com/zsh-users/antigen)を試してみることに 参考元ではgit cloneをしていたが、自分は設定ファイルはgithubで一括管理したいので今回はsubmoduleを使って入れてみる “` sh cd $HOME/dotfiles # 自分の設定ファイルがいろいろ入ってるとこ mkdir -p $HOME/dotfiles/zsh git submodule add https://github.com/zsh-users/antigen.git zsh/antigen “` 設定ファイルを追加 — ### .zshrc @glidenoteさんの設定方法を参考に antigenの設定ファイルは分離することに “` source ~/dotfiles/zsh/antigenrc “` ### ~/dotfiles/zsh/antigenrc antigenの設定ファイルを作る “` source ~/dotfiles/zsh/antigen/antigen.zsh antigen-lib antigen-bundle git antigen-bundle autojump antigen-bundle ruby antigen-bundle rbenv antigen-bundle bundler antigen-bundle zsh-users/zsh-syntax-highlighting antigen-theme gallois antigen-apply “` zshを起動してみるとgit cloneとかが走って、プラグインが有効になったzshが起動した 細かい設定は後々詰めるとして今日のところはこの辺で終了

Githugをやってみたついでに問題を意訳してみた その2

引き続きgithugの超意訳の続きです

8. There are some files in this repository, one of the files is untracked, which file is it?

このディレクトリ内のいくつのファイルはリポジトリに登録されています。1つだけ登録されていないファイルはどれでしょうか

9. A file has been removed from the working tree, however the file was not removed from the repository. Find out what this file was and remove it.

あるファイルはワーキングツリーからは削除されていますがリポジトリからは消されていません
あるファイルを見つけてリポジトリからも削除してください

10. A file (deleteme.rb) has accidentally been added to your staging area, find out which file and remove it from the staging area. NOTE Do not remove the file system, only from git.

deleteme.rb が間違ってステージングエリアに登録されてしまいました。ステージングエリアから削除してください
注! 実ファイルは消さないでください。gitからだけ消してください。

11. We have a file called oldfile.txt. We want to rename it to newfile.txt and stage this change.

oldfile.txtというファイルをnewfile.txtにリネームしてステージングエリアに登録してください

12. You will be asked for the first 7 chars of the hash of most recent commit. You will need to investigate the logs of the repository for this.

よくコミットのハッシュ値(7文字)を聞かれることがあります。リポジトリから最新のコミットのハッシュ値(7文字)を調べてください

13. We have a git repo and we want to tag the current commit with new_tag.

リポジトリの最新コミットにnew_tagという名前でタグをつけてください

14. The README file has been committed, but it looks like the file forgotten_file.rb was missing from the commit. Add the file and amend your previous commit to include it.

現在READMEというファイルがコミットされていますが一緒にforgotten_file.rbをコミットするのを忘れてしまいました
forgotten_file.rbをREADMEファイルと同じコミットに入れてください。

15. There are two files to be committed. The goal was to add each file as a separate commit, however both were added by accident. Unstage the file to_commit_second using the reset command (don’t commit anything)

これからコミットしようとしているファイルが2つあります。 別のコミットにしたいのですが、間違って一緒にaddを行ってしまいました
to_commit_second ファイルをresetコマンドを使ってステージングから削除してください
(コミットを行う必要はありません)

16. A file has been modified, but you don’t want to keep the files. Checkout the config.rb file from the last commit.

あるファイルに変更を加えたのですがどうもこの変更は不要になったようです。config.rbを最後のコミットの状態に戻してください。

17. This projects has a remote repository. Identify it.

このプロジェクトにはリモートリポジトリが存在します。その名前を答えてください。

18. The remote repositories have a url associated to them. Please enter the url of remote_location

リモートリポジトリにはURLが関連付けられています。リモートリポジトリremote_locationのURLを答えてください。

19. You need to pull changes from your origin repository.

origin リポジトリの変更を取り込んでください

20. Add a remote repository called origin with the url https://github.com/githug/githug

リモートリポジトリ origin を登録してください。 URLは https://github.com/githug/githug になります

21. There have been modifications to the app.rb file since your last commit. Find out which line has changed.

app.rbには最後のコミットからの変更があります。どの行が変更されたか行番号を答えてください

22. Someone has put a password inside the file ‘config.rb’ find out who it was

config.rbにパスワードを書いてしまった人がいるようです。その人はだれでしょうか?