itamae 生活 2日目

昨日 に引き続き今日も itamae

Today's Goal

  • itamae の BestPractice の沿った構成で Nginx x Unicorn x Rails の構成を作る
  • Ruby は rbenv 環境下で入れたい

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 inititamae 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

プロセスもしっかり立ってる

f:id:kawakubox:20161209005955p:plain


Wiki みると、 BestPractice ってのがあるので、もう少し触ったら BestPractice に沿って書いてみよう。

社内でぷちLT大会があったので、Neo4jの話をしてきた

2016年8月17日に、社内でソニックガーデンさんを招いてのぷちLT大会があったので、エントリーしました。

最近、Neo4j がお気に入りで業務でも社内向けツールに導入を図るなどをしたので、今回のLTでもNeo4jをテーマにしたものを用意しました

スライドの最後にもありますが、サービスへの本格導入などをするに向けて、クラスタ構成やHA構成なんかを抑えておくと強力な説得材料になるので、触れていこうと思います。

コードリーディングの効能

この記事はSpeee Advent Calendar 20日目の記事です。

前日の記事はコチラ ハリネズミと暮らすエンジニアライフ | CTO.Works


こんにちは、ミドルサーティーエンジニアのkawakuboxです。

2015年もあと残すところ10日ちょい。

あらためて2015年を振り返ると

などと、直近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 newbundle gem によって基本となるディレクトリ構成が生成される。

さらには初期生成されるディレクトリに加えて、サービスはテストデータ、デコレーション用のクラスなんかはどこに入れるんだろう?? ってのことも色んなコード見ることでどの辺に置くのが一般的かは見えてくると思う。

例えばRails だと、サービスクラスは app/services だし、テストデータは spec(or test)/fixtures に入れましょうといったお作法があったり。

まとめ

リーディングが大事ってのはプログラムに特化した話ではなく、英語・ドイツ語といったような、一般的に言語と呼ばれる学習にも通じることだと思う。

アプリケーションを作るというのはアウトプットする場なので、それの良し悪しを左右するのはインプットの質と量ということになる。

ではそのインプットって何なの? と考えると、コードリーディングがその筆頭になるじゃないかなと考えてる。

追伸

巷にあふれている外国語のすぐれた勉強法を適用するのはとてもよい戦術だと思う。

 最短ルートで英語をマスターする現実的かつ効率的な勉強法をまとめてみる

 これなんかも、 s/英語/Ruby/g, s/英語/Go/g で脳内置換すると、あぁそうだよねぇ とすごく腹落ちする感じ。


明日(12/21)、は Tei1988Pebble Watchでmrubyを試す(まだ動かせて無いよ編)です。

*1:Java もバージョン重ねるごとに、 Iterator や 拡張 for が導入されたりした

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。