itamae 生活 2日目
昨日 に引き続き今日も itamae
Today's Goal
Premise
- itamae が global に install されている
Let's Try
BestPractice をみながらディレクトリ構築
ディレクトリ構成
ココ にある通り
. ├── cookbooks │ └── nginx │ ├── default.rb │ ├── files │ │ └── etc │ │ └── nginx │ │ └── conf.d │ │ └── static.conf │ └── templates │ └── etc │ └── nginx │ └── conf.d │ └── dynamic.conf └── roles └── web.rb
手でペチペチ作るのもなんだなぁと思ってたら、それっぽいのがあった
itamae help
$ itamae -h Commands: itamae destroy [cookbook|role] [NAME] # Undo role or cookbook (short-cut alias: "d") itamae docker RECIPE [RECIPE...] # Create Docker image itamae generate [cookbook|role] [NAME] # Initialize role or cookbook (short-cut alias: "g") itamae help [COMMAND] # Describe available commands or one specific command itamae init NAME # Create a new project itamae local RECIPE [RECIPE...] # Run Itamae locally itamae ssh RECIPE [RECIPE...] # Run Itamae via ssh itamae version # Print version
itamae init
と itamae gemenate
が使えそう
itamae init
$ itamae init itamae-labo create create Gemfile create cookbooks/.keep create roles/.keep run bundle install from "." Could not locate Gemfile or .bundle/ directory $ cd itamae-labo $ ls -la total 8 drwxr-xr-x 5 kawakubox staff 170 12 10 00:51 . drwxr-xr-x 47 kawakubox staff 1598 12 10 00:51 .. -rw-r--r-- 1 kawakubox staff 63 12 10 00:51 Gemfile drwxr-xr-x 3 kawakubox staff 102 12 10 00:51 cookbooks drwxr-xr-x 3 kawakubox staff 102 12 10 00:51 roles
ルートディレクトリと Gemfile, 空ディレクトリ(cookbook, roles)作ってくれる。
cookbook
ミドルウェアやライブラリを取り回しやすい単位でまとめたもの
role
cookbook の利用者。 アプリサーバ、DBサーバなどで構成がガラッと変わるのでそれぞれ app, db といった role を用意してあげる
itamae generate
create cookbook
nginx の cookbook 作ってみる
$ itamae g cookbook nginx create create default.rb create files/.keep create templates/.keep
g は generate のエイリアス、 rails っぽい
create role
続いて role を作る
$ itamae g role web create create default.rb create files/.keep create templates/.keep
Recipe for nginx
昨日のまんまなので省略
Role for web
include_recipe '../../cookbooks/nginx/default.rb'
Execution
$ itamae ssh -i ~/.ssh/hogepiyo.pem -h xx.xx.xx.xx -u ec2-user roles/web/default.rb INFO : Starting Itamae... INFO : Recipe: /../itamae-labo/roles/web/default.rb INFO : Recipe: /../itamae-labo/cookbooks/nginx/default.rb INFO : package[nginx] installed will change from 'false' to 'true' INFO : service[nginx] enabled will change from 'false' to 'true' INFO : service[nginx] running will change from 'false' to 'true'
※動かす前に既に入っていた nginx を削除してから実行した
眠くなったので今日はここまで
Summary
BesstPractice の構成に則って作るには、 itamae init
, itamae generate
を使うのがよい
itamae はじめました
itamae はじめました
Today's Goal
ローカルの recipe.rb
を使って、 EC2 インスタンスに Nginx 立てる
Install into local machine
まず itamae
をローカルマシンにインストール
$ gem install itamae
bundler なんかは使わず、 global に入れてしまうのがよいのかな。
Create recipe
てきとうな場所に recipe.rb を作る
package 'nginx' do action :install end
DSLは、操作したいパッケージの block に書いていく。
action メソッドに symbol を渡すという書式。
Execution
ローカルの recipe を使って EC2 インスタンスに対して dry-run で実行してみる。
$ itamae ssh -u ec2-user -i ~/.ssh/your_keypari.pem -h xx.xx.xx.xx -n recipe.rb INFO : Starting Itamae... INFO : Recipe: /~~/recipe.rb INFO : package[nginx] installed will change from 'false' to 'true'
nginx のインストール状態は false → true になるよって言われる。
-n
を取って実際に動かしてみる。
・ ・ ・
EC2 インスタンスに接続して確認。
$ ssh -i ~/.ssh/your_keypair.pem ec2-user@xx.xx.xx.xx $ which nginx /usr/sbin/nginx
この時点でサービスとして登録されていない。
service 'nginx' do action [:enable, :start] end
$ itamae ssh -u ec2-user -i ~/.ssh/your_keypair.pem -h xx.xx.xx.xx recipe.rb INFO : Starting Itamae... INFO : Recipe: /xx/recipe.rb INFO : service[nginx] enabled will change from 'false' to 'true' INFO : service[nginx] running will change from 'false' to 'true'
すでに package 'nginx' は済んでるので実行されていない。
$ ps aux | grep nginx root 23685 0.0 0.0 58084 1016 ? Ss 15:46 0:00 nginx: master process /usr/sbin /nginx -c /etc/nginx/nginx.conf nginx 23687 0.0 0.3 58456 3924 ? S 15:46 0:00 nginx: worker process
プロセスもしっかり立ってる
Wiki みると、 BestPractice ってのがあるので、もう少し触ったら BestPractice に沿って書いてみよう。
コードリーディングの効能
この記事はSpeee Advent Calendar 20日目の記事です。
前日の記事はコチラ ハリネズミと暮らすエンジニアライフ | CTO.Works
こんにちは、ミドルサーティーエンジニアのkawakuboxです。
2015年もあと残すところ10日ちょい。
あらためて2015年を振り返ると
- 人生初めての転職
- メインで扱う言語がRubyに ― Speeeが創業8年目におこなった開発組織改革のはなし
- 数年ぶりに据え置きハードゲー(Splatoon)にハマり、Splathonにも参加 ― Splathon(企業対抗スプラトゥーン大会)を開催しました
- and more...
などと、直近5,6年の中で最も変化の大きかった年だった。
今日は、10年近くJavaで食ってきた自分が、Rubyへとシフトチェンジした際にコードリーディングを通じて感じた効能を書いていく。
文法が覚えられる
代入系の演算子が多く定義(||=
etc)されていて、初見で??となったり。
<=>
を見て「ナニコレ?」となったりした。
そっから調べてみると「便利!」といったこともあった。
また、繰り返し処理にも学びがあった。
一昔前のプログラム言語だと、while, for あたりを押さえていれば事足りた*1けども、Ruby は更に表現力が増していて、 while
と対になる until
があったり、 イテレーション系のメソッド(each
, map
, times
etc...)が豊富に用意されている。
こんな標準メソッドあったんだという感動
先の繰り返し処理each
するのにインデックス用のカウンタ欲しいなと思ったら、 each_with_index
ってのがあったりと至れり尽くせり。
そんなこんなで、カウンタ用の変数が広めのスコープに定義されていたら、あれっ?と思う感性はついた。
初日に suthio も書いてるとおりで、自分の知っている範疇のメソッドしか使えないので、いくらコード書いてアプリ作れるようにはなっても、いっこうに中身は洗練されてない、、、なんてことになりかねない。
やっぱり他人のコードやリファレンスを読む数をこなさないと身につかないなぁ〜と感じるわけっす。
命名やコメントのセンスを磨ける
英単語語彙や英分作成能力の乏しい自分にとっては、ここを伸ばそうと思ったら他人のコードを見るのが手っ取り早いと思っている。
命名のお作法まとめや、commitコメント検索サービスもあるけど、ロジックの背景を汲んだ活きた単語やコメントに触れるのも大事なんじゃないの? と思う次第。
標準のディレクトリ構成を知れる
Java であれば、maven
で標準的なディレクトリ構成が提示されるよねってのと同じで、 Ruby であれば、rails new
や bundle gem
によって基本となるディレクトリ構成が生成される。
さらには初期生成されるディレクトリに加えて、サービスはテストデータ、デコレーション用のクラスなんかはどこに入れるんだろう?? ってのことも色んなコード見ることでどの辺に置くのが一般的かは見えてくると思う。
例えばRails だと、サービスクラスは app/services
だし、テストデータは spec(or test)/fixtures
に入れましょうといったお作法があったり。
まとめ
リーディングが大事ってのはプログラムに特化した話ではなく、英語・ドイツ語といったような、一般的に言語と呼ばれる学習にも通じることだと思う。
アプリケーションを作るというのはアウトプットする場なので、それの良し悪しを左右するのはインプットの質と量ということになる。
ではそのインプットって何なの? と考えると、コードリーディングがその筆頭になるじゃないかなと考えてる。
追伸
巷にあふれている外国語のすぐれた勉強法を適用するのはとてもよい戦術だと思う。
最短ルートで英語をマスターする現実的かつ効率的な勉強法をまとめてみる
これなんかも、 s/英語/Ruby/g
, s/英語/Go/g
で脳内置換すると、あぁそうだよねぇ とすごく腹落ちする感じ。
明日(12/21)、は Tei1988 のPebble Watchでmrubyを試す(まだ動かせて無いよ編)です。
java.sql.ResultSetMetaData メモ
java.sql.ResultSet のメタデータである java.sql.ResultSetMetaData。
今更感もあるが、何が取得できるのかを調べてみたのでメモとして残しておく。
引数の列番号は、0ではなく1始まり。
メソッド名 | メモ |
getCatalogName(int column) | カタログ名を返却。カタログはh2, MySQLではデータベース名に相当する。 |
getSchemaName(int column) | スキーマ名を返却。CREATE SCHEMA にて作成されたスキーマ名が得られる。 |
getTableName(int column) | テーブル名を返却。 |
getColumnName(int column) | 列名を返却。 |
getColumnLabel(int column) | 列ラベル = AS で付けられたエイリアス名に相当。 |
getColumnDisplaySize(int column) | 表示桁数を返却。DATE型の場合は、yyyy-MM-dd で10が返却される。INTEGERはマイナス符号を含めて11。 |
getColumnType(int column) | java.sql.Typesの定数値を返却。一覧はコチラを確認。 |
getColumnTypeName(int column) | 列の型名を返却。 |
getColumnClassName(int column) | JDBCドライバにてマッピングされたJavaのクラスを返却。 |
getPrecision(int column) | 型の精度を返却する。INTEGERは10, DECIMALは65,535が返却。 |
getScale(int column) | 小数点以下の桁数を返却。VARCHAR, DATEなどの型は0が返却される。 |
※使用したDBMSは、h2 の 1.3.175。