2014年11月30日日曜日

【Berkshelf】The resource at 'hoge' does not appear to be a valid cookbook. Does it have a metadata.rb?

まだまだエラーは続くよー。
この本の通り書いててこの本の通り書いててvendoring cookbookしたらエラーした。
CakePHPで学ぶ継続的インテグレーションCakePHPで学ぶ継続的インテグレーション
渡辺 一宏,吉羽 龍太郎,岸田 健一郎,穴澤 康裕,丸山 弘詩

エラー

デプロイツール?のCapistrano3っていうのを開発用仮想マシンに入れるところ。
下記コマンドでcookbookのひな形を作って
bundle exec knife cookbook create capistrano -o site-cookbooks
できたフォルダのrecipes/default.rbを変更、
Vagrantfileのrun_listに追記して、
Berksfileを修正。
source "http://api.berkshelf.com"

cookbook "apt"
cookbook "phpenv", path: "./site-cookbooks/phpenv"
cookbook "hostsfile"
cookbook "capistrano", path: "./site_cookbooks/capistrano"
で、cookbooksをvendoringしたらエラーした。

naichilabmba:vagrant_book hu$ bundle exec berks vendor cookbooks
Resolving cookbook dependencies...
Fetching 'phpenv' from source at site-cookbooks/phpenv
Fetching 'capistrano' from source at site_cookbooks/capistrano
The resource at '/Users/hu/Documents/vagrant_book/site_cookbooks/capistrano' does not appear to be a valid cookbook. Does it have a metadata.rb?

metadata.rb?

metadata.rbはどう見てもあるんだよなぁ。
naichilabmba:vagrant_book hu$ ls site-cookbooks/capistrano/
CHANGELOG.md README.md attributes definitions files  libraries metadata.rb providers recipes  resources templates
なぜだ…
phpenvの方のvendoringは問題なく成功してるし…。うーむ。

phpenvの方

capistranoの方

phpenvの方は1行追加してあるけど他は全く一緒だよなぁ。
そもそも「knife cookbook create」で作ったテンプレートのままだし。

ためしにphpenvの方のmetadata.rbをリネームしてberks vendorしてみた。
naichilabmba:vagrant_book hu$ bundle exec berks vendor cookbooks
/Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/ridley-4.1.0/lib/ridley/chef/cookbook.rb:40:in `from_path': no metadata.json or metadata.rb found at /Users/hu/Documents/vagrant_book/site-cookbooks/phpenv (IOError)
 from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/berkshelf-3.1.5/lib/berkshelf/locations/path.rb:21:in `cached_cookbook'
 from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/berkshelf-3.1.5/lib/berkshelf/dependency.rb:126:in `cached_cookbook'
 from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/berkshelf-3.1.5/lib/berkshelf/lockfile.rb:387:in `block in reduce!'
 from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/berkshelf-3.1.5/lib/berkshelf/lockfile.rb:372:in `each'
 from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/berkshelf-3.1.5/lib/berkshelf/lockfile.rb:372:in `reduce!'
 from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/berkshelf-3.1.5/lib/berkshelf/installer.rb:32:in `run'
 from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/berkshelf-3.1.5/lib/berkshelf/berksfile.rb:371:in `install'
 from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/berkshelf-3.1.5/lib/berkshelf/berksfile.rb:590:in `vendor'
 from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/berkshelf-3.1.5/lib/berkshelf/cli.rb:387:in `vendor'
 from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/thor-0.19.1/lib/thor/command.rb:27:in `run'
 from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/thor-0.19.1/lib/thor/invocation.rb:126:in `invoke_command'
 from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/thor-0.19.1/lib/thor.rb:359:in `dispatch'
 from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/berkshelf-3.1.5/lib/berkshelf/cli.rb:52:in `dispatch'
 from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/thor-0.19.1/lib/thor/base.rb:440:in `start'
 from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/berkshelf-3.1.5/lib/berkshelf/cli.rb:27:in `execute!'
 from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/berkshelf-3.1.5/bin/berks:5:in `<top (required)>'
 from /Users/hu/.rbenv/versions/1.9.3-p547/bin/berks:23:in `load'
 from /Users/hu/.rbenv/versions/1.9.3-p547/bin/berks:23:in `<main>'
naichilabmba:vagrant_book hu$ 
IOエラーに変わっただと…?
一旦phpenvの方のmetadata.rbを戻してcapistrano側のmetadata.rbをリネームしてみた。
naichilabmba:vagrant_book hu$ bundle exec berks vendor cookbooks
Resolving cookbook dependencies...
Fetching 'phpenv' from source at site-cookbooks/phpenv
Fetching 'capistrano' from source at site_cookbooks/capistrano
The resource at '/Users/hu/Documents/vagrant_book/site_cookbooks/capistrano' does not appear to be a valid cookbook. Does it have a metadata.rb?
naichilabmba:vagrant_book hu$ 
結果変わらず。 どういう状態だろ。
metadata.rbを読み込みに行く前に無いと判断されてる?
設定ファイルミスったかなぁ。

原因発見

改めてBerksfile眺めてたら見つけた。
ひどいミス。
source "http://api.berkshelf.com"

cookbook "apt"
cookbook "phpenv", path: "./site-cookbooks/phpenv"
cookbook "hostsfile"
#cookbook "capistrano", path: "./site_cookbooks/capistrano"
cookbook "capistrano", path: "./site-cookbooks/capistrano"
まぁそんなもんだよね…。
pathが含まれるエラーはとりあえずそのpathの存在見ないとな…すぐ分かったはずなのに。

2014年11月29日土曜日

【nginx】nginxがうまく起動しなくてログおっかけて修正するだけで数時間かかった。


相変わらず下記の本を読みながらCI環境構築を進めてるんだけどnginxがうまく起動しなかった。
CakePHPで学ぶ継続的インテグレーションCakePHPで学ぶ継続的インテグレーション
渡辺 一宏,吉羽 龍太郎,岸田 健一郎,穴澤 康裕,丸山 弘詩

エラー

本では vagrant provision するとChefがnginxの設定や起動までやってくれてすぐにindex.phpに繋がるよ!って書いてあるんだけどどうにもこうにも繋がらない。

vagrant sshで対象の仮想マシンに繋いでnginxの状態を調べてみると…
vagrant@develop:~$ service nginx status
 * nginx is not running
nginx起動してないじゃん…
あと良くわからないのがstartしても何も応答がないんだよね・・・
vagrant@develop:~$ service nginx start
vagrant@develop:~$ service nginx start
vagrant@develop:~$ service nginx status
 * nginx is not running
vagrant@develop:~$ 

ログ確認

じゃあnginxの起動ログ見てみようってことで探した。
参考:http://heartbeats.jp/hbblog/2012/02/nginx03.html
エラーログは「/var/log/nginx/error.log」ってとこにあるらしい。

ログを見ると…ファイルはあるけど現在時刻では何も残ってない…
もしかしてssh接続したユーザーって起動コマンド打てない?って思ってsudoで再実行。
vagrant@develop:~$ sudo service nginx start
vagrant@develop:~$ 
そうしたらログに行が増えてた
2014/11/29 09:20:15 [emerg] 12499#0: invalid number of arguments in "root" directive in /etc/nginx/sites-enabled/test:5

testって設定ファイルがおかしーよ!って言われてるっぽいなぁ。

原因

testってファイルは
VagrantからChef経由でサーバーに作ったファイル。
見てみる。

test
server {
        listen 80;

        root /var/www/application/current/app/webroot
        index index.php index.html index.htm;

        server_name test.localhost;

        location / {
                try_files $uri $uri/ /index.php?$args;
        }

        location ~ \.php$ {
                try_files $uri =404;
                include /etc/nginx/fastcgi_params;
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                fastcgi_intercept_errors on;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_param CAKE_ENV test;
        }
}
4行目…セミコロンないよねorz

修正

ホストマシンのtest.erbを修正し、
「rm -rf cookbooks」でcookbooksフォルダを一旦削除、
「bundle exec berks vendor ./cookbooks」でBerkshelfを使ってcookbookを再作成
「vagrant provision」で仮想マシンへ再度反映

結果

動いたーーーーーーーー
こんな凡ミスで数時間持ってかれた…。
まぁコマンド試行錯誤しててちょっとUNIXに慣れた気がするしいいか。

【MVNO】docomoを辞めてIIJmioに乗り換えました。乗り換え前後の料金とか公開。

長い事使ってきた(13年ぐらい?)docomoをやめてIIJmioに乗り換えました。
乗り換えるにあたって調べたことをメモしておきます。

この記事を書いたのは 2014/11/28 です。
もし乗り換えを検討してる方がいれば参考にどうぞ。

乗り換え理由

まぁ当たり前ですけど料金ですね。あまりにも高い。マンション光が2500円/月なのにスマホに1万円ってどうかしてる。もっと早く乗り換えとけばよかった。
後述しますけど最近iPadMiniを買ったんで2台持ち運用の料金を比較したら乗り換え一択でした。

料金

スマホ+iPadMiniの2台運用を前提に下記料金比較を行いました。
①docomo継続(スマホのみ)
②docomo継続(iPad用にSIM追加)
③IIJmioにMNP(SIM2枚契約)

①docomo継続(スマホのみ)

だいたい月8000円+端末代2000円で10000円ちょいぐらい。

ざっくり内訳。
まずは定額分が
 ・基本使用料+Xiカケホーダイ1500円
 ・SPモード+パケット定額6000円
従量課金が
 ・通話料500〜1000円
端末代が
 ・端末代(分割) 2000円ぐらい
こんな感じ。

これで受けられるサービスは
 ・無料通話なし(docomoへの通話は無料)
 ・通信量7G
ですね。

端末代はいいとして
電話しないし7Gの通信量で8000円は高いなぁ。

②docomo継続(iPad用にSIM追加)

docomoが(というかS社もA社もだけど)新料金プランを発表して、通信有無にかかわらず端末1台で3000円(タブレットなら大体2000円)かかるようになりましたね。
 参考:3社出揃う!ドコモに追随したauとソフトバンク新料金プランの違いとは?

ちょうどdocomoのサイトにシミュレータがありました。
「カケホーダイ&パケあえる」かんたんシミュレーション 家族でご利用の場合
・スマホ基本使用料3000円
 ・タブレット基本使用料2000円
 ・通信量10G(シェア) 9200円

サービスは
 ・docomoだけでなく他社・固定電話にもカケホーダイ
 ・通信量10G

合計14200円
た、高い、、、かけホーダイとかいらないし…
ちょっとボリすぎじゃないですかね

③IIJmioにMNP(SIM2枚契約)

最後はIIJmioのみおふぉん
(他にもMVNOいっぱいあるけど評判とか見てったら自然とIIJに落ち着きました)

いろいろプランあるけどちょうど良さそうな組み合わせはこんな感じ。

 ・ファミリーシェアプラン 2560円/月
  ↑通信量7G、SIM最大3枚
・音声通話機能付きSIMを追加 700円/月
  ↑スマホ用
 ・SMS機能付きSIMを追加 140円/月
  ↑iPadMini用

  合計 3400円 安い。

これでサービスは
 ・無料通話無し(30秒20円)
 ・通信量7G(SIM2枚で共有)

十分すぎる…
インフラはドコモを使ってるらしく、ドコモのスマホならSIMロック気にせず使えるようです。ドコモの回線ならエリア気にせず使えていいですねー。
これに決めた!

乗り換え前後の料金

月々10000円(端末代含む)→3400円なので6600円安くなった。
docomoの端末代が残り3回残ってて、違約金かからず解約できるのが来年4月だった。
無理にやめると端末サポートも切れるから22000円ぐらい払うことになるけど4ヶ月で元が取れる計算。
テザリング運用よりも楽だし今乗り換えた方がお得と判断して乗り換え決行。

MNPの流れ

自分の行った手続きとスケジュール感をざっくり。

11/20(木)
 ・ドコモのサイトでMNP番号発行しようとしたが蹴られる
  どうも主回線(親と家族契約してた)だとダメみたい。
 ・ドコモに電話してどうやったら主回線切り替えられるか質問
  ドコモショップに出向く以外に方法はないらしい。めんどい。
11/22(土)
 ・ドコモショップへ
 ・1時間ぐらい待ってから手続き開始。簡単に主回線の変更&MNP発行できた。
 ・正直に高いからMNPするって言ってしまったけどニコニコ対応してくれて好印象だった。
11/25(火)
 ・13:00ごろ
  ・IIJmioのサイトで申し込み開始
  ・始めてなのでmioIDっていうものを新規に取得。
  ・プランとSIMの形態を選んで申し込み完了。
  ・すぐにメールが来た。本人確認できる写真を送ってくれって。
 ・13:05ごろ
  ・スマホで免許証の写真とってそのままアップロード
  ・めっちゃ簡単
  ・すぐにメールが来た。受付完了したよって。
 ・18:45
  ・メール来た。本人確認完了したよって。
   ・到着予定日が決まり次第再度メールしますって書かれてた。
 ・22:09
  ・またメール来た。転入手続き進めるから数時間〜1日以内に今の電話番号は使えなくなるよって。
11/26(水)
 ・11:00ごろ
  ・気づいたら圏外になってた。docomo解約されたのね。
 ・21:00帰宅
  ・ちょっと期待してたけどやっぱり届いてなかった。
11/27(木)
 ・06:12
  ・メール来た。利用開始&お届け予定日のお知らせ。
   ・音声SIMは27日
   ・SMSSIMは28日
 ・23:00帰宅
  ・嫁に聞いたら22:00すぎに届けにきたらしい。がんばるねヤマトさん。
  ・スマホにSIMさしてなんなく開通。
11/28(金)
 ・22:00帰宅
  ・SMSSIMも届いてた。お知らせ通り。
  ・iPadにSIMさして接続確認完了

スマホが使えなかったのは30時間ぐらい。
郵送の時間も入ってることを考えても結構速いんじゃないかな。
どうしても使えないと困るって人は店頭でやってもらうといいかも。

このまましばらく使ってみよ。
もし質問とかあればTwitterでもコメントでもお気軽にどうぞー。

追記

Twitterとかで質問あった内容を書いておきます。

2014/11/29 どうしてみおふぉんにしたの?

たくさんあるMVNO業者の中で最初にIIJに目をつけた理由は自分の中でほかの業者に比べて企業イメージがよかったから。それだけ。
少し調べたら通信料シェアや翌月繰り越し、高速・低速通信の切り替えアプリとか十分すぎるサービスだったのであまりほかの業者は調べてない。
ちゃんと調べればもっとお得なMVNO業者はあるかもですね~。

2014年11月26日水曜日

【Vagrant、Chef-Solo】The cookbook path 'hogehoge/.cookbooks' doesn't exist. Ignoring...


この本の通り書いててvagrantからchef-soloを呼び出したんだけどエラーした。
CakePHPで学ぶ継続的インテグレーションCakePHPで学ぶ継続的インテグレーション
渡辺 一宏,吉羽 龍太郎,岸田 健一郎,穴澤 康裕,丸山 弘詩

エラー

naichimba:vagrant_book hu$ vagrant provision develop
==> develop: The cookbook path '/Users/hu/Documents/vagrant_book/.cookbooks' doesn't exist. Ignoring...

エラー全文

naichimba:vagrant_book hu$ vagrant provision develop
==> develop: The cookbook path '/Users/hu/Documents/vagrant_book/.cookbooks' doesn't exist. Ignoring...
==> develop: Chef 11.16.4 Omnibus package is already installed.
==> develop: Configuring cache buckets...
==> develop: Running provisioner: chef_solo...
Generating chef JSON and uploading...
==> develop: Running chef-solo...
==> develop: stdin: is not a tty
==> develop: [2014-11-25T16:30:57+00:00] INFO: Forking chef instance to converge...
==> develop: [2014-11-25T16:30:57+00:00] DEBUG: Fork successful. Waiting for new chef pid: 2306
==> develop: [2014-11-25T16:30:57+00:00] DEBUG: Forked instance now converging
==> develop: [2014-11-25T16:30:57+00:00] WARN: 
==> develop: * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
==> develop: SSL validation of HTTPS requests is disabled. HTTPS connections are still
==> develop: encrypted, but chef is not able to detect forged replies or man in the middle
==> develop: attacks.
==> develop: 
==> develop: To fix this issue add an entry like this to your configuration file:
==> develop: 
==> develop: ```
==> develop:   # Verify all HTTPS connections (recommended)
==> develop:   ssl_verify_mode :verify_peer
==> develop: 
==> develop:   # OR, Verify only connections to chef-server
==> develop:   verify_api_cert true
==> develop: ```
==> develop: 
==> develop: To check your SSL configuration, or troubleshoot errors, you can use the
==> develop: `knife ssl check` command like so:
==> develop: 
==> develop: ```
==> develop:   knife ssl check -c /tmp/vagrant-chef-2/solo.rb
==> develop: ```
==> develop: 
==> develop: * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
==> develop: [2014-11-25T16:30:57+00:00] INFO: *** Chef 11.16.4 ***
==> develop: [2014-11-25T16:30:57+00:00] INFO: Chef-client pid: 2306
==> develop: [2014-11-25T16:30:57+00:00] DEBUG: Chef-client request_id: 45494694-3ef0-4c40-abfc-faa48c83b4b8
==> develop: [2014-11-25T16:31:03+00:00] DEBUG: Building node object for develop
==> develop: [2014-11-25T16:31:03+00:00] DEBUG: Extracting run list from JSON attributes provided on command line
==> develop: [2014-11-25T16:31:03+00:00] INFO: Setting the run_list to ["recipe[apt]", "recipe[phpenv::default]"] from CLI options
==> develop: [2014-11-25T16:31:03+00:00] DEBUG: Applying attributes from json file
==> develop: [2014-11-25T16:31:03+00:00] DEBUG: Platform is ubuntu version 14.04
==> develop: [2014-11-25T16:31:03+00:00] INFO: Run List is [recipe[apt], recipe[phpenv::default]]
==> develop: [2014-11-25T16:31:03+00:00] INFO: Run List expands to [apt, phpenv::default]
==> develop: [2014-11-25T16:31:03+00:00] INFO: Starting Chef Run for develop
==> develop: [2014-11-25T16:31:03+00:00] INFO: Running start handlers
==> develop: [2014-11-25T16:31:03+00:00] INFO: Start handlers complete.
==> develop: [2014-11-25T16:31:03+00:00] DEBUG: Re-raising exception: ArgumentError - You must specify at least one cookbook repo path
==> develop: /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/cookbook_loader.rb:43:in `initialize'
==> develop:   /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/policy_builder/expand_node_object.rb:60:in `new'
==> develop:   /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/policy_builder/expand_node_object.rb:60:in `setup_run_context'
==> develop:   /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/client.rb:265:in `setup_run_context'
==> develop:   /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/client.rb:429:in `do_run'
==> develop:   /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/client.rb:213:in `block in run'
==> develop:   /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/client.rb:207:in `fork'
==> develop:   /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/client.rb:207:in `run'
==> develop:   /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/application.rb:236:in `run_chef_client'
==> develop:   /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/application/solo.rb:226:in `block in run_application'
==> develop:   /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/application/solo.rb:218:in `loop'
==> develop:   /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/application/solo.rb:218:in `run_application'
==> develop:   /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/application.rb:55:in `run'
==> develop:   /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/bin/chef-solo:25:in `<top (required)>'
==> develop:   /usr/bin/chef-solo:23:in `load'
==> develop:   /usr/bin/chef-solo:23:in `<main>'
==> develop: [2014-11-25T16:31:03+00:00] ERROR: Running exception handlers
==> develop: [2014-11-25T16:31:03+00:00] ERROR: Exception handlers complete
==> develop: [2014-11-25T16:31:03+00:00] FATAL: Stacktrace dumped to /var/chef/cache/chef-stacktrace.out
==> develop: [2014-11-25T16:31:03+00:00] DEBUG: ArgumentError: You must specify at least one cookbook repo path
==> develop: /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/cookbook_loader.rb:43:in `initialize'
==> develop: /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/policy_builder/expand_node_object.rb:60:in `new'
==> develop: /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/policy_builder/expand_node_object.rb:60:in `setup_run_context'
==> develop: /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/client.rb:265:in `setup_run_context'
==> develop: /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/client.rb:429:in `do_run'
==> develop: /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/client.rb:213:in `block in run'
==> develop: /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/client.rb:207:in `fork'
==> develop: /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/client.rb:207:in `run'
==> develop: /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/application.rb:236:in `run_chef_client'
==> develop: /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/application/solo.rb:226:in `block in run_application'
==> develop: /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/application/solo.rb:218:in `loop'
==> develop: /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/application/solo.rb:218:in `run_application'
==> develop: /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/application.rb:55:in `run'
==> develop: /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/bin/chef-solo:25:in `<top (required)>'
==> develop: /usr/bin/chef-solo:23:in `load'
==> develop: /usr/bin/chef-solo:23:in `<main>'
==> develop: [2014-11-25T16:31:04+00:00] ERROR: You must specify at least one cookbook repo path
==> develop: [2014-11-25T16:31:04+00:00] FATAL: Chef::Exceptions::ChildConvergeError: Chef run process exited unsuccessfully (exit code 1)
Chef never successfully completed! Any errors should be visible in the
output above. Please fix your recipes so that they properly complete.

対応

なんのこっちゃない、自分の書いたVagrantfileにミスがありました。
  config.vm.define :develop do |develop|
    develop.omnibus.chef_version = :latest
    develop.vm.hostname = "develop"
    develop.vm.box = "opscode-ubuntu-14.04"
    develop.vm.box_url = "http://opscode-vm-bento.s3.amazonaws.com/vagrant/virtualbox/opscode_ubuntu-14.04_chef-provisionerless.box"
    develop.vm.network :private_network, ip: "192.168.33.10"

    develop.vm.synced_folder "application", "/var/www/application/current",
      id: "vagrant-root", :nfs => false,
      :owner => "vagrant",
      :group => "www-data",
      :mount_options => ["dmode=775,fmode=775"]

    develop.vm.provision :chef_solo do |chef|
      chef.log_level = "debug"
#      chef.cookbooks_path = ".cookbooks"
      chef.cookbooks_path = "./cookbooks"
      chef.json = {
        nginx: {
          docroot: {
            owner: "vagrant",
            group: "vagrant",
            path: "/var/www/application/current/app/webroot",
            force_create: true
          },
          default: {
            fastcgi_params: { CAKE_ENV: "development" }
          },
          test: {
            available: true,
            fastcgi_params: { CAKE_ENV: "test" }
          }
        }
      }
      chef.run_list = %w[
        recipe[apt]
        recipe[phpenv::default]
      ]
    end
  end
16行目のスラッシュが抜けてただけっていうね。凡ミスでした。

【Vagrant、Ubuntu】stdin: is not tty


vagrantでubuntu立ち上げてchef-soloでprovisionしたときにエラーした。

エラー

==> develop: stdin: is not a tty

対応

ここに載ってた
https://github.com/mitchellh/vagrant/issues/1673

Yeah this is a known "thing."
It is not really a problem because it doesn't really cause a problem.
Actually, the reason this error message even appears is due to a bug
in Ubuntu not checking whether stdin is a TTY, and just assuming it is.
ほっとけばよさそうね。

2014年11月21日金曜日

【Vagrant】Failed to mount folders in Linux guest.


vagrant upしたときにこんなエラーがでることがある。

エラー

Failed to mount folders in Linux guest.

エラー全文

c:\vm\vagrant>vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'centos7'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: vagrant_default_1416540764834_66350
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 22 => 2222 (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Warning: Connection timeout. Retrying...
    default: Warning: Connection timeout. Retrying...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
==> default: Mounting shared folders...
    default: /vagrant => C:/vm/vagrant
Failed to mount folders in Linux guest. This is usually because
the "vboxsf" file system is not available. Please verify that
the guest additions are properly installed in the guest and
can work properly. The command attempted was:

mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group vagrant | cut -d: -f3` vagrant /vagrant
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant` vagrant /vagrant

The error output from the last command was:

/sbin/mount.vboxsf: mounting failed with the error: No such device

対応

下記記事を参考に
http://qiita.com/osamu1203/items/10e19c74c912d303ca0b

すでに仮想環境’default’は起動しているようで、
$ vagrant ssh
で起動した仮想マシンへ接続
[vagrant@localhost ~]$ sudo /etc/init.d/vboxadd setup
これがリビルドなのかな?

[vagrant@localhost ~]$ exit
sshを抜けて
Connection to 127.0.0.1 closed.
naichilabmba:vagrant hu$ vagrant halt
==> default: Attempting graceful shutdown of VM...
vagrant haltで仮想マシン停止。もう一度vagrant upで成功した。

2014年11月20日木曜日

【Vagrant】仮想環境構築が超絶簡単になる(らしい)Vagrantを試してみた。

vagrantのロゴ。かっこいい。

はじめに

お久しぶりです。@naichilabです。
最近「けいぞくてきいんてぐれーしょん」ってのに興味を持ったので下記本を買ってみました。
CakePHPで学ぶ継続的インテグレーションCakePHPで学ぶ継続的インテグレーション
渡辺 一宏,吉羽 龍太郎,岸田 健一郎,穴澤 康裕,丸山 弘詩
少しずつ読み進めてたんですが知らん言葉やソフトが出てくる出てくる。

・バージョン管理システム - Git
・デプロイツール - Capistrano
・プロビジョニングツール - Chef
・サーバ仮想化ツール - VirtualBox
・環境構築ツール - Vagrant
・テストツール - PHPUnit
・インスペクションツール - PHP_CodeSniffer
・ドキュメント自動生成ツール - phpDocumentor
・継続的インテグレーションツール - Jenkins
・パッケージ管理ツール - Composer

設定はRubyで書いたり(Ruby触った事ない)仮想環境はUNIXだったり(UNIX触った事ない)と頭パンクしそう。
でもなんとなくVagrantが重要そうだなーと思ったのでさきにそっちで遊んでみました。


参考

ぐぐって見つけた下記本を購入。
Vagrant入門ガイドVagrant入門ガイド
新原雅司
400円!!52ページ!!なんと手頃な。
とても分かりやすかったしオススメ。

Vagrantって?


  • 開発環境を自動で構築するためのツール
  • OSXやWindows、Linuxなど幅広い環境で動く
  • VirtualBoxやVMWareといった仮想化ツールへの環境構築を自動化する
  • ChefやPuppetといったプロビジョニングツールも組み合わせる事で極端な話コマンド1行で環境構築終わり。といったことが可能になる。
っていう夢のようなソフト。らしい。実際まだ良くわかってない。

やってみる

環境

2014/11/19現在
MacBookAir 2013モデル
MacOSX 10.9.4
VirtualBox 4.3.18(最新版)
Vagrant 1.6.5(最新版)

インストール

以下からVirtualBoxをインストール
  https://www.virtualbox.org/wiki/Downloads
以下からVagrantをインストール
  https://www.vagrantup.com/
RubyはVagrantのパッケージに付いてくるらしい。

Vagrantのバージョンの確認

ターミナルで下記を実行。バージョンが出ればOK。
$ vagrant -v
Vagrant 1.6.5

Vagrantのコマンド

Vagrantは
$ vagrant ○○
というコマンドで操作する。
コマンド一覧は
$ vagrant -h
で確認できる。少ないし使ってればすぐに覚えられそう。

Boxファイル

Vagrantでは仮想マシンのベースとなるイメージファイル(Boxファイル)を使う。
やさしい人たちが色んなパターンを用意してくれてるみたい。

http://www.vagrantbox.es/
とりあえずぐぐって見つけたこのサイトからCentOSの一番新しそうなのを使ってみる。
CentOS7.0 x86_64 minimal (VirtualBoxGuestAddtions 4.3.14)ってやつ

Boxファイルの追加

$ vagrant box add [名前] [BOXファイルのURL]
これでvagrantがboxファイルをダウンロードしてくれて付けた名前で記憶してくれる。
こんな感じ
$ vagrant box add centos70 https://f0fff3908f081cb6461b407be80daf97f07ac418.googledrive.com/host/0BwtuV7VyVTSkUG1PM3pCeDJ4dVE/centos7.box
==> box: Adding box 'centos70' (v0) for provider: 
    box: Downloading: https://f0fff3908f081cb6461b407be80daf97f07ac418.googledrive.com/host/0BwtuV7VyVTSkUG1PM3pCeDJ4dVE/centos7.box
==> box: Successfully added box 'centos70' (v0) for 'virtualbox'!

Boxファイルの確認

vagrant box listコマンドで追加されているBOX一覧を確認できる。
$ vagrant box list
centos70             (virtualbox, 0)
ちゃんと出てくる。あら素敵。


基準となるフォルダを決める

適当にフォルダを作る。
適当な場所に"vagrant"ってフォルダを用意した。
ターミナルのカレントフォルダをそこに移動しておく。
naichilabmba:vagrant hu$ 
PC名やユーザー名は適当に読み替えて。

Vagrantfileの作成

VagrantではVagrantfileというファイルに起動する仮想マシンの構成などを記載する。
とりあえずboxだけを指定したシンプルなVagrantfileを生成する。
$ vagrant init [box名]
これでVagrantfileが作られる。
$ vagrant init centos70
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
できたVagrantfileはこんな感じ。(長いrubyファイルなんだけどコメント部分を削除するとこれだけ)
# -*- mode: ruby -*-
# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "centos70"
end
boxファイルの名前を指定してるだけですね。

仮想マシンの起動

ではお待ちかね。起動してみます。
$ vagrant up
これだけ。これだけで起動する…はずがエラーした。

エラー対処

別記事にまとめました。
【Vagrant】Failed to mount folders in Linux guest.

これで起動完了。

SSH接続

作成した仮想マシンへのSSH接続するのは
$ vagrant ssh
これだけ。仮想マシン側にsshdが起動している必要があるらしいけどたぶんboxファイルにする前に設定済みなんだろうね。
naichilabmba:vagrant hu$ vagrant ssh
Last login: Wed Nov 19 11:15:42 2014 from 10.0.2.2
[vagrant@localhost ~]$ exit
ログアウト
Connection to 127.0.0.1 closed.
めっちゃ楽。

状態確認

仮想マシンがどういう状態かは
$ vagrant status
で確認可能。
vagrant upした後ならこんな感じ。
$ vagrant status
Current machine states:
default      running (virtualbox)

仮想マシンの停止と破棄

upした仮想マシンを停止したければ
$ vagrant halt
これだけ。またupすれば使える。
もし完全に破棄したければ
$ vagrant destroy
こんな感じ。
破棄してもまたupすればすぐに使えるんだけどね。

まとめ

とりあえずboxの追加とそれを使った仮想マシンの作成・起動・停止・破棄だけやってみた。Vagrantfileさえ用意しておけば数個のコマンドを覚えるだけで仮想マシンの使い捨てができる。すげー楽。ほんと楽。

Vagrantfileを編集すれば複数の仮想マシンを一気に起動したり(webサーバ、dbサーバ、開発サーバとか)、起動後の更新を自動化したり、色々できるらしい。

ぼっちCI(継続的インテグレーション)を回せるように少しずつ覚えよう。

とりあえず今日はここまで。

2014年11月10日月曜日

【Unity、UniRx、Photon】PUNをRx対応してみた


@Baiteen

↓のツイートを見て、気になったので作ってみた。

やりたいこと

ReactiveExtensionsを使ってPhotonのコールバック地獄から脱出する。

環境

Unity(v4.6 beta)
UniRx(v4.5)
PUN(v1.28.3)

やったこと

1.UniRxインポート。
2.【Unity,Photon】PhotonCloudでオンラインゲームつくっちゃおーを参考にPUNをインポート&設定
3.PhotonRx.ObservableMonoBehaviourクラス作成。
これだけ。
ソースコードは長いので一番下。
ホントはGuthubとかに上げれればいんだけど、時代の流れについていけれない。

(追記 ここから)

GithubにGistっていうお手軽なのがあったので、そっちにあげてみました。

(追記 ここまで)

一応使ってみて機能としてはできたっぽいんだけど、Photonの使い方を知らないので確認できず。。。
誰か使ってみてくれたら嬉しいな。。。

参考サイト

neuecc/UniRx - Github
Photon Cloudのイベント一覧 - テラシュールブログ
Public API - Photon Unity Networking v1.27


ソースコードと使い方はUniRx.ObservableMonoBehaviourを真似してこんな感じ。



2014年11月1日土曜日

【Unity、UniRx】クリック回数が偶数なら赤を、奇数なら青を動かす


@Baiteen

ReactiveExtensionsがUnityでも使えるってのを今更知ったので、今更ながら使ってみた。その8。

やりたいこと

ReactiveExtensionsを使ってクリック回数が偶数なら赤のCubeを、奇数なら青のCubeを動かす。
前回の記事からちょっとしか変わってないので、変更分だけ書くことにした。

変更したところ

SphereScriptのOnMouseDownAsObservableの文を以下のように変更する。
    //クリック回数のストリームとして変数に保持
    var clickCountStream = OnMouseDownAsObservable ()
      .Buffer (OnMouseDownAsObservable ().Throttle (System.TimeSpan.FromMilliseconds (250)))
      .Select (xs => xs.Count);

    //クリック回数が偶数なら、クリック回数に比例した右向きの力を赤い四角に加える
    clickCountStream
      .Where(cnt => cnt % 2 == 0)
      .Do(cnt => redRigidbody.AddForce(Vector3.right * cnt * 10))
      .Subscribe (t=>Debug.Log(t));

    //クリック回数が奇数なら、連打イベントを発生させる
    clickCountStream
      .Where(cnt => cnt % 2 != 0)
      .Do(cnt => OnBarrage(new BarrageEventArgs(cnt)))
      .Subscribe (t=>Debug.Log(t));
    
    //クリック回数をテキストにセット
    clickCountStream
      .Do(cnt => text.text = string.Format ("{0} clicks", cnt))
      .SelectMany(cnt => 
        //1秒かけて0→1、また1秒かけて1→0ってなってほしいんだけど、0→1、1→2ってなる。意味不明。
        TakeSec(1).Do(t=>text.setA(t)).Last().SelectMany(_=>TakeSec(1).Do(t=>text.setA(1-t)))
        )
      .Subscribe (t=>Debug.Log(t));

これで完成。
今回はうに部屋に投稿するのは辞めました。ランキングにノイズが入ってしまうので。。。
適当に実行してください。


Related Posts Plugin for WordPress, Blogger...