2014年4月6日日曜日

MacでChef + Vagrant 環境構築メモ

環境だけを手っ取り早く整えたい方用

用語などは別サイトで学んでください。


Chefのインストール
OfsCodeが提供しているChef配布用スクリプト

$ curl -L https://www.opscode.com/chef/install.sh | sudo bash


knifeの設定
色々聞かれるがとりあえず全部Enterで良い

$ knife configure


VirtualBoxのインストール
サイトから入手
[VirtualBox download]


Vagrantのインストール
gemでの配布は更新されていないのでサイトから入手
[Vagrant download]


VagrantでVM初期設定
VagrantloudからOSイメージを探す
[Vagrantcloud]

例:centos-6.5の場合
vmの設定を置きたいディレクトリで下記のコマンドを入力

$ vagrant init chef/centos-6.5


作成されたVagrantfileを編集
コメントアウトを外す
➡ Vagrantを入れた環境からアクセスできるようにし、VMのIPを192.168.33.10に設定

config.vm.network "private_network", ip: "192.168.33.10"


VM起動
Vagrantfileがあるディレクトリで

$ vagrant up


ssh接続
~/.ssh/config に下記を追加編集
sshコマンドでvmへ接続できるように

HOST 192.168.33.*

 IdentityFile ~/.vagrant.d/insecure_private_key

 User vagrant


下記のコマンドでも可
ssh設定を出力して書き出し

vagrant ssh-config --host 192.168.33.* >> ~/.ssh/config


内容は以下

Host 192.168.33.∗

  HostName 127.0.0.1

  User vagrant

  Port 2222

  UserKnownHostsFile /dev/null

  StrictHostKeyChecking no

  PasswordAuthentication no

  IdentityFile /Users/$HOST_NAME/.vagrant.d/insecure_private_key

  IdentitiesOnly yes

  LogLevel FATAL


ssh接続(まだしなくても良い)

$ ssh 192.168.33.10


knife-soloインストール
gemコマンド

$ sudo gem install knife-solo


XCode5.1でClangエラーが出る場合は以下のコマンドを用いる

$ sudo ARCHFLAGS=-Wno-error=unused-command-line-argument-hard-error-in-future gem install knife-solo


~/.chef/knife.rb に下記を追加編集
tmpディレクトリの設定とCookbookをインポートする際の設定

knife[:solo_path] = '/tmp/chef-solo'

cookbook_path            ['./cookbooks']


knife-soloでChef Solo環境を生成
Chefレポジトリを作成
レポジトリを管理したいディレクトリで実行
下記だと chef-repoレポジトリが作成される

$ knife solo init chef-repo


合わせてgit管理
Chefレポジトリ直下で以下のコマンドを入力
 
$ git init

$ git add .

$ git commit -m "first commit"


Chefレポジトリ直下で以下のコマンドを入力
vmにChefをインストール

$ knife solo prepare vagrant@192.168.33.10


作成されたjsonファイルをコミット

$ git add nodes/

$ git commit -m "add node json file"


Cookbook作成
nginx というCookbook作成
Chefレポジトリ直下で以下のコマンドを入力

$ knife cookbook create nginx -o site-cookbooks


Recipe編集
site-cookbooks/nginx/recipes/default.rb を編集

package "nginx" do

  action :install

end



service "nginx" do

  supports :status => true, :restart => true, :reload => true

  action [ :enable, :start ]

end



template "nginx.conf" do

  path "/etc/nginx/nginx.conf"

  source "nginx.conf.erb"

  owner "root"

  group "root"

  mode 0644

  notifies :reload, 'service[nginx]'

end




上記recipeで使うtemplate(nginx.conf.erb)を作成
site-cookbooks/nginx/templates/default/ に作成

user nginx;

worker_processes 1;

error_log /var/log/nginx/error.log;

pid /var/run/nginx.pid;



events {

  worker_connections 1024;

}



http {

  include /etc/nginx/mime.types;

  default_type application/octet-stream;



  server {

    listen <%=node['nginx']['port']%>;

    server_name localhost;

    location /{

      root /usr/share/nginx/html;

      index index.html index.htm;

    }

  }

}


Cookbookをインポートする
centosでnginxを取得するにはyumのEPELというアドオンパッケージのyumレポジトリを有効にする必要がある
yumのCookbookを取得

$ knife cookbook site vendor yum

$ knife cookbook site vendor yum-epel


Nodeの設定
jsonファイルはサーバ(node)の状態を示す
nodes/192.168.33.10.json
下記のように編集

{

  "nginx":{

    "port":80

  },

  "run_list":[

    "yum-epel", "nginx"

  ]

}


vmへChef Soloを実行
実行後、http://192.168.33.10 へアクセスし、nginxが起動しているか確認

$ knife solo cook vagrant@192.168.33.10


以上。お疲れさまでした。

参考
Amazon.co.jp 入門Chef Solo
Qiita 「入門 Chef Solo」 on MacOSX ではまったこと
2noの日記 【Mac】clang によるビルドエラー【Xcode 5.1】

2014年3月18日火曜日

ダイアログのレイアウトをカスタムできる、DialogFragmentを呼ぶライブラリ (Android)

DialogFragment

ダイアログのレイアウトをカスタムする機会があったので、なるべく使い回しができるようライブラリを作成しました。
APIレベル13から、showDialogは非推奨となってますので、DialogFragmentで実装しました。

android-library-dialog-DialogHelper



設定

ライブラリプロジェクトとして取り込んでください。
APIレベル10以上じゃないと動作しません。



ソース

一行で呼べます。
カスタムレイアウトも利用できるメソッドを用意してあります。
DialogHelper.callDialog(this, "title", "message", "positive", "negative", "neutral", "tag");



今後

キャンセルの有効無効や、その他のオプションを追加していくといたずらに引数が増えていくのでオプションを作成したい。
Builderで組み立てられるようにしたい。
テーマも変更できるといいな。
pull requestや要望があると喜びます。



参考

Y.A.Mの雑記帳 / Android DialogFragmentを使うときの注意点。
Y.A.Mの雑記帳 / Fragment から Activity にコールバックする方法
暇なメモ帳 / DialogFragmentでのカスタムダイアログ実装方法
ケーワン・エンタープライズのエンジニアメモ(`・ω・´)ゞビシッ!! / Fragmentを使ってみる(画面回転時のライフサイクルについて)