2014年10月18日土曜日

ruby入門 ~開発環境構築編~

私は主にC#でWindows GUIアプリケーションを開発する仕事をしている。
サーバーサイドスクリプト言語はPHPを学生の頃に少しと最近はNode.jsを使った仕事もしている。
rubyは構文を一目見てスコープをend句で記述するpascalライクな文法が好きになれず敬遠していた。

が、ちょいと将来的にrubyスキルが必要になってきそうなので導入部分をメモってみる。
対象読者は他の言語を普通に扱えるがrubyには一切触れたことが無い人。


さて、C#というか.NET環境はVisual Studioをインストールするだけで実行環境から優れたエディタ・デバッガがあっという間に構築できる。未だにテキストエディタをドン引きするほど使いこなしてるのも硬派で格好いい気もするし否定はしないけれど初めて触るのに環境構築だけで数日かかりかねない場合、それだけで心が折れかねない。スクリプトなりインストーラーなりyumやaptでさっくりと構築したい。

とりあえず触りだけなのでVisual Studio使いの自分はWindows上に環境を構築することにする。
rubyの統合開発環境を調べるとEclipseまたはそれらの派生品、有償であればRubyMineあたりが候補になりそうだ。
エンバカデロが3rd Rails というものを出しているが現在は開発が止まっているようだ。
Eclipse系もデバッグ環境を整えるまでに相当苦労している、動いたとしても一部機能は動作させれていないような情報が多く目に付く。
有償ではあるがRubyMineが最も手堅そうだ。30日の試用期間もあるようなのでコレに決めた。
ちなみに購入するならパーソナルライセンスで$98のようだ。

Visual Studioのように実行環境まで構築してくれるわけではなくRubyのインストールなどは事前に自分でやっておかなければならないらしい。それくらい自動でやって欲しいものだが・・・

まずRubyInstallerを下記からダウンロードする。
http://rubyinstaller.org/downloads/

最新安定版らしいRuby 2.1.3 (x64)を選択した。特に困ることなくインストール完了。
続いてDevKitが必要らしいのでDevKit-mingw64-64-4.7.2-20130224-1432-sfx.exeをダウンロード。
DevKitのインストールはコマンドプロンプトからinstallスクリプトを走らせる必要があるらしい。
http://www.rubylife.jp/railsinstall/rails/index4.html
を参考にインストールした。

最後にRubyMineをインストール。公式サイトからわかりやすくダウンロードできたしインストールも簡単だった。起動することまで確認。
New Projectを起動してmain.rbというファイルを追加してとりあえずHello World!をやってみる。
puts("Hello World!")
 この一行でとりあえず動いた。
続いてデバッガの動作を確認したいので簡単な計算をさせてみる。
x = 3
y = 4
z = x * y
puts(z)
puts("Hello World!日本語")
3行目あたりにブレークポイントをはってデバッグ実行してみるがデバッグモジュールが足りないという。
モジュールを追加するのはgemというパッケージマネージャーを使う必要があるらしい。
gem
http://rubygems.org/

下記を参考にgemをインストール
http://www.rubylife.jp/railsinstall/rubygems/index1.html

RubyMineのコンソールにはruby-debug-ideというパッケージが見つからないとあったので
> gem install ruby-debug-ide
とするとインストールできた。
一応RubyMineを再起動してデバッグ実行するとブレークポイントでちゃんと止まった。
変数の中身も見れる。右クリックでSet Valueを選ぶと値も書き変えれる。

統合開発環境としての基本動作は問題ないみたい。
エディター部に行番号表示は欲しいのでFile>Settings>Editor>Appearanceに「Show line numbers」にチェックを入れる。
うん、$98くらいの価値は十分にあるんじゃないかな。

2014年8月4日月曜日

RaspberryPiにSubversionのコードをAmazon Elastic Beanstalkにナイトリーデプロイさせる

社内のコード管理はsubversionを使っており
Amazon Elastic Beanstalkにデプロイするアプリもそれで管理している。

Beanstalkは開発環境と本番環境を別々に用意しているが
開発環境にはナイトリービルドならぬナイトリーデプロイさせたくなった。

subversionが動いているLinuxサーバーにシェルスクリプトをcron実行させればいいのだけど
あいにくOSのバージョンが古くデプロイに必要なgitのバージョンをインストールできなかった。
OSのバージョンアップは面倒なのでやりたくないと管理者に言われてしまう。
余っているPCはあるのだけど会社からの節電要求が厳しく24時間365日稼働させると怒られそうだ。
この程度の処理ならRaspberryPiで十分なのでB型を購入した。消費電力3.5Wなら許されると信じたい。

RaspberryPiにRaspbianをインストールする手順までは解説サイトが無数にあるので省略。
主にsubversionとgitとebコマンドラインツール、それらの依存モジュールが必要。
SSHで接続して
$ sudo apt-get update
$ sudo apt-get install python
$ sudo apt-get install ruby
$ sudo apt-get install subversion
$ sudo apt-get install git
$ wget https://s3.amazonaws.com/elasticbeanstalk/cli/AWS-ElasticBeanstalk-CLI-2.6.3.zip
$ unzip AWS-ElasticBeanstalk-CLI-2.6.3.zip
$ sudo mv AWS-ElasticBeanstalk-CLI-2.6.3 /opt/
$ sudo apt-get install vim
$ export PATH=$PATH:/opt/AWS-ElasticBeanstalk-CLI-2.6.3/eb/linux/python2.7/
$ vim .bashrc #上記exportを.bashrcにも書いとく
$ source .bashrc
$ svn checkout svn://hoge.com/piyo /piyo
$ cd piyo
$ git init
$ git add .
$ git --global user.email "hoge@piyo.com"
$ git --global user.name "hogepiyo" 
$ git commit -m "comment"
$ eb init
$ git aws.push

これで行けるかと思いきやpushに失敗する。botoモジュールが無いとか言われる。
$ sudo apt-get install python-pip
$ pip install boto
$ git aws.push
解決しない。

自分でbotoを入れてみる。
$ cd ..
$ git clone git://github.com/boto/boto.git
$ cd boto
$ sudo python setup.py install
$ cd ../piyo
$ git aws.push
上手くいった。botoが何なのかは興味無いので知らん。

あとはsvn updateからgit aws.pushまでの流れをシェルスクリプトに書く。
#!/bin/sh
logger "Started nightly deploy"
cd ~/piyo/
svn update
revision=$(svn info svn://hoge.com/piyo | grep "Last Changed Rev: " | cut -c 19-)
sed -i -e "s/revision/$revision\-nightly/" ~/piyo/.ebextensions/version.config
git add .
git commit -m "nightly-$revision"
git aws.push
logger "Exited nightly deploy"

大体こんな感じ。独自の工夫点としては
svn infoの出力からgrepやらcutでリビジョン番号を抽出して
バージョン番号の一部として使用している。
sedコマンドの置換処理の部分は各自のアプリに構造に合わせてね。
バージョン番号にリビジョン番号を入れておくと
不具合を指摘されたときに該当ソースコードの取得が簡単になる。tagsを作成してなくてもよくなる。
このスクリプトをcronに登録して毎日深夜に実行させる。

RaspberryPiのコストはケース・SDカード・充電器・microUSBケーブルを含めれば8000円くらいはかかってる。
この程度の処理だけだと割に合わないので他用途でも活用していきたいね。