thorでnamespaceを指定するときの注意点

Rubyコマンドラインスクリプトを作成するときにお世話になるフレームワークthor」ですが、namespaceメソッドを使って複数のクラスに対して同じnamespaceを設定すると、片方のクラスに実装されているタスクしか実行できないようです。

続きを読む

Coda2のRuby.modeを修正しました。

Coda2のデフォルトのRuby.modeだと末尾が?で終わるメソッド名をナビゲータで拾ってくれないという問題があったので、Ruby.modeを修正しました。
修正したものはhttps://github.com/dribble13/Ruby.modeに晒していますので、ぜひご利用ください。

zshでファイル名の一部を置換するワンライナー

大量の画像ファイルのファイル名を一部だけ変更する必要があったので、下記を参考にしつつzshワンライナースクリプトを書いてやってみました。

続きを読む

unicornサービス起動スクリプト

Redmineをnginx+unicornで運用し始めたのですが、サーバにrbenvをインストールしているという事情もあってこちら(http://mhalligan.com/fixing-unicorns-init-script)を参考に起動スクリプトを作成しました。

作成した起動スクリプトは下記になります。

unicorn起動スクリプトのサンプルは、開発元よりこちら(https://github.com/defunkt/unicorn/blob/master/examples/init.sh)で公開されています。

ブログのバックアップにDropboxを使ってみる

このブログはさくらインターネットさんのVPSサービスを利用して運営されているのですが、ファーストサーバさんのような大規模な障害が発生したり、気が狂って間違って sudo rm -fr /* などというコマンドを実行してしまったり、どこぞのクラッカー集団に襲われたりと、まぁ色々とサーバ上のデータを失ってしまうというリスクはつきものです。 そこで大切なデータを失う前にバックアップを自動的に取るようにしましょう、というお話です。

今回のポイントですが、バックアップ先にクラウドストレージサービスであれDropboxを使用する、というところがポイントです。

DropboxUbuntu 12.04で利用する方法は下記を参考にしました。

さて、バックアップデータ採取元のVPSサーバですが、GnomeKDEといったGUI周りのサービスは入っていません。それに毎日毎日sshでログインして特定のコマンドを流す、というのも面倒なので避けたいところです。というか、絶対に3日で忘れます。忘れるというか面倒くさくなってやらなくなります。

じゃ、どうするのということですが、バックアップを代わりにやってくれるシェルスクリプトを作成してこれをcronで1日1回決まった時間に実行するようにします。

まず、シェルスクリプトはこんな感じです。

上記シェルでは大きく分けて下記3つのバックアップを取っています。

  1. MySQL内のブログ用データベースのダンプ
  2. wordpressのソース一式
  3. nginx, php-fpm の設定ファイル

バックアップ先にはDropboxと同期しているディレクトリ内にバックアップ専用ディレクトリを設けてその中にバックアップを取るようにしています。

シェルスクリプトが用意できたらcronの設定を行います。

0 3 * * * /hoge/fuga/bachup.sh

上記設定では毎日午前3時にバックアップスクリプトが実行されるようになっています。この辺りは時間別のアクセス数や他のcronの設定などの兼ね合いで決めてください。

最後にサーバ側のDropboxの設定です。 まずはDropboxのダウンロードサイトからdropbox.pyをサーバへダウンロードします。

ダウンロードができたら、dropbox.pyに実行権を付けて

$ dropbox.py start -i

とするとDropboxの同期を行うデーモンがインストールされます。

デーモンのインストールが終わったら

$ dropbox.py start

とコマンドを実行すると、DropboxのURLが表示されるので、ブラウザで表示されたURLにアクセスし、Dropboxのアカウントの登録 or 作成を行います。

Dropboxのアカウント作成 or 登録が完了した時点からホームディレクトリ内のDropboxディレクトリにあるファイルがDropboxと動機されます。

今回のようにDropboxをバックアップデータの退避先として利用する場合、sshなどでログインしていなくてもdropboxの同期デーモンが実行されていないとマズイのでこちらを参考にスタートアップスクリプトを作成し、サーバ起動時に自動的にdropboxの同期デーモンも起動するようにしておきましょう。

また、デフォルトの設定ですとDropboxのデーモンがLan syncという機能がONになっており、udp 17500でブロードキャストしているので下記コマンドでLan sync機能をOFFにしておきましょう。

$ dropbox.py lansync n
$ dropbox.py stop
$ dropbox/py start

後は、cronでバックアップスクリプトが実行される度にバックアップファイルが作成され、Dropboxの同期デーモンが自動的にDropboxにアップしてくれます。

これで少しは安心ですね。

 

Ruby on Rails 3.2.xでAmazon SESを使ってメールを送信する

Amazon EC2インスタンス上で何かしらアプリを動かしていて、メールを送信したいって場合はEC2のインスタンス上で何とかすることも出来なくはないようですが、結構大変なので素直にAmazon  SESというメール送信サービスを使いましょうというお話です。

Amazon EC2と同じくAWS上のサービスですので、AWSのアカウントが必要です。また迷惑メール配信防止のため、送信元アドレスの存在チェックなど諸々の手続きが必要ですが、その辺はAWSのヘルプを見てください。

で、ようやく本題のRails 3.2.xでAmazon SESを使ってメールを送信する方法ですが、aws-ses という便利なパッケージがありますので今回はこれを利用しましょう。

まずはGemfileに下記を追加してbundle installします。

gem "aws-ses"

インストールに成功したら、config/initializers/amazon_ses.rb を作成してActionMailerでのメール配信方法にAmazon SESでのメール配信を追加します。:access_key_idと:secret_access_keyにはAWSのアクセスキーを設定します。

require 'aws/ses'
ActionMailer::Base.add_delivery_method :ses, AWS::SES::Base,
  :access_key_id     => 'access_key_id',
  :secret_access_key => 'secret_access_key'

後は、config/environment/*.rbに

config.action_mailer.delivery_method = :ses

と追加すればActionMailerでメール送信ができます。