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。