Thursday 27 September 2012

EC2 バックアップをRuby のAWS SDKとHerokuを用いて構築

EC2が運用ベースに乗ってきたので日ごとのバックアップ環境を構築しました。こんな方法もあるのだという参考にしてください。

バックアップスクリプトはAmazonが提供しているRubyのAWS SDKを用いて作成。これはgem が提供されているので、Gemfileに

gem 'aws-sdk'

の一行を書くだけで利用できます。

毎日一度バックアップスクリプトを動作させて、7日分のバックアップを取っておく内容です。バックアップスクリプトはローカルに置くと恒常的に実行できないのでHerokuを利用させてもらいました(こんな使い方はHerokuもあまりありがたくないでしょうけど、利用するリソールは限りなくゼロに近いので許してください)。Herokuのweb workerを0にして毎日1回実行するSchedulerを登録。Herokuの無料利用枠に収まると思います。

自動バックアップツールはAmazonが提供してくれていると便利なのですが、見つかりませんでした。他にバックアップスクリプトを書いている人はいるのですが、やはり自分の環境にカスタマイズするとなると結局手間なので、使い慣れたRubyとAWS SDKの組み合わせを利用しました。

質問がある方は気軽に連絡してもらえば歓迎です。

Thursday 20 September 2012

Apache mod_rewrite 文法

Apacheの設置で、www有りと無しのURIが同一のドキュメントを参照するためにmod_rewriteの設定をしていました。Google で検索すればこの類いのhowtoはいくらでも出て来るのですが、例えば下のようなコードを見てもむしろ[NC]って何?%1って何?などなど疑問は増すばかり。Apacheのドキュメントにあたってみました。


RewriteCond %{HTTP_HOST} ^www\.(.+) [NC]
RewriteRule ^ http://%1%{REQUEST_URI} [L,R=301]


"PCRE regular-expression"という言葉が出てきて調べたところこれは"Perl Compatible Regular Expressions"のことでした。ただ文章の書き方が妙に厳密なので嫌な予感がしたのですが、やはり形式言語の類いの話がでてきました。この辺りのフィールドは定義が大切なので、一つの単語の定義を調べるのにリンクを辿り、更にそのリンクの中に分からない使い方の言葉がいくつか出てきてそれぞれリンクを辿って調べていくというとても面倒なリーディングになってしまいました。ただ形式言語とかメタ言語とか、それぞれ面白そうなので始めてしまったらはまりそうだなと思います。プログラムを書いたりサーバの構築・運用をする際にこのようなエンジニアリングとサイエンスの狭間で仕事をするのは個人的にとても面白く感じます。

ここで例えば [NC] はcase insensitiveのフラッグだとか[L]はここでrewriteの書き換えをストップするとか、[R]は強制的に外部リダイレクトさせるとか書いた方がこのブログの読者(がいれば)には役に立つかもしれないのですが、個人的にはそれぞれがApache本家のサイトに当たって楽しんでほしいです。専門知識に乏しい私は最初の30分は1行読み進むごとにいやになって、その後の2時間ぐらいは楽しめました。

Tuesday 18 September 2012

Google Map API を使ってフロント開発

久しぶりにRailsを使ってフロント開発です。Google Maps APIを使用した地図上に会社の位置を表示する内容です。

コントローラのコードは1行だけで

class MyController < ApplicationController
  def map
    @companies = Company.all
  end
end

モデルも今回は大して触りません。

あとはひたすらテンプレートとJavaScriptの編集作業です。

Google Maps APIはバージョン3になってかなりできることの範囲が広がったようで、特にRails用のプラグインなど使用しなくても大きな幅でカスタマイズが可能です。ただコマーシャルユースの場合はライセンスが必要で、社内利用のサイトだとサービスに問い合わせると、USD$11,000 for 250,000 page views per yearという返事が返ってきました。安くはありませんね。

Google Mapsは独自の google.maps.event.addListener などのメソッドを提供していて、その挙動と一つづつ試しながらなので、一進一退のゆっくり作業です。ちょっと面倒…。jQueryと組み合わせてゆっくりゆっくり開発です。

マーカーのDOMを取得できないという質問がウェブにあり、これは大変そうだなと思ったのですが、


marker = new google.maps.Marker({
position: m_position,
id: "8iu3afluh"
});


google.maps.event.addListener(marker, "click", function() {
  alert(this.id);
});

などとすれば設定したマーカーの id: 8iu3afluh が返って来るので、とにかくこれで問題無さそうです。

Saturday 15 September 2012

TextMate 日本語化

今まで日本語がほとんど必要なかったのでTextMateで日本語タイピングできる様にしていなかったのですが、ふと思いついて日本語を打てる様にしました。今更ですが…。


hetima.com

から CJKInput20061110.zip をダウンロードして解凍、CJK-Input.tmplugin を /Applications/TextMate/Contents/PlugIns/ に移動。

TextMateを再起動すれば日本語が打てる様になってました。

プラグインを開発してくださってありがとうございます。

Friday 14 September 2012

BDDとTDDはどう違うのか?

以前BDDとTDDはどう違うのか?という質問をされてうまく答えられませんでした。

現在私がBDDで好きだなと思い、TDDと異なると思うのは、BDDはとにかくまずプログラムに何をさせたいかを伝えることです。

暫くRoRとBDDで実践をしていて、決済のAPIを導入することがありました。最初はAPIの仕組みを調べてAPI指定のコマンドを直接コントローラに記述する形で、例えば

gateway = | PaypalApi::Billing.gateway
setup_purchase = gateway.setup_purchase
if setup_purchase.success?
  redirect_to gateway.redirect_url_for(setup_purchase.token)
else
  redirect_to somewhere-else, notice: "transaction failure"
end

などとしていたのですが、これだとテスト用APIのモックやスタッブを書くのがとても面倒。BDDではこのアプローチをやめて、とにかくAPIの仕様など気にしなくてプログラムに何をさせたいか書く事から始めるとすっきりします。例えばモデルのインスタンスを@orderにしている場合、

if @order.setup_purchase
  redirect_to gateway_url
else
  redirect_to somewhere-else, notice: "transaction failure"
end

としてモデルの中で実際にsetup_purchaseのコードを書きます。こうするとコードもテストコードも整理しやすくなります。

ただ実際はコントローラからtokenなどのpostリクエストの部分をモデルに渡す必要があるところで後でメソッドに引数を追加する必要など私の場合は出てきましたが。

Thursday 13 September 2012

iPhone 5 の価格設定って良いですね

アメリカのApple Storeで表示されている価格は16 GBのモデルで199ドル。SIMフリーのものであれば世界中どこに行っても使えますしね。今までのiPhoneは5万円するなどそんな電話、ばからしくて買う気になれませんでした。iPod touchと同じぐらいの価格であれば購入する意義を見いだせますね。


Wednesday 5 September 2012

ロリポップがRubyウェブアプリケーションクラウドサービスを始めたみたいです

先ほどロリポップからDMが入り、Rubyウェブアプリケーションクラウドサービスの宣伝が届きました。

http://sqale.jp/

Heroku はAWSのサーバを使っているけど日本のサーバは使えなかったので、ダウンロードのスピードがネックでした。その点ロリポップは日本のサーバを使っているのでしょうか?スピードが改善できてあと、ツールもしっかりしているか、試してみる価値はあるかなという気がします。