2011年11月28日月曜日

世界の宝物

最近晴彦は字に興味があるようだ。特に漢字。新しい漢字を知りたがる。

昨晩はお風呂で「世界の宝物」の漢字を訊いてきた。「物」は難しかったのでそれ以外はエアで教えた。エアでも理解できたようで、お風呂から上がった後、パンツもはかずにメモ帳に書いて練習していた。ただ、なぜこの字を書きたいかはわからなかった。

翌る日、仕事から帰宅後、その理由がわかった。白板をみると「世界の宝物」というタイトルがあり、その下に自分と菜月の宝物を箇条書きにしていた。

この内容も興味深い。

1 かぞく、じぶん
2 こいづかけ
3 ポケモン

1に自分をなかなかかけない。どうやら菜月にも自分が大切なんだということを伝えていたらしい。あと2番目。相当晴彦にとって大切なんだろう。晴彦の内面が見えるとてもおもしろい出来事だった。

2011年11月6日日曜日

ころころ走る女の子

3歳の菜月を走る姿を見るといつも思い出す風景がある。それは池袋サンシャインの噴水広場の前で遊ぶ女の子の姿である。

たぶん3歳ほどだと思ったその女の子はとても愛らしくはしゃいでいた。

当時4歳だった晴彦のそれとは違う。晴彦はもっと直線的にびゅーんといって、どかっとぶつかって、立ち止まったと思えばまたびゅーんを走り出す。

女の子はころころと走るんだなと直感的に思った。同時にこの菜月もこうなると思うととても楽しみになった。

いつのまにか菜月は3歳になっていた。あ、そうだと思って菜月をみると、ころころではく、ヒラヒラと走る。これはこれでいい。これが菜月。

2011年9月21日水曜日

Tasknoteのリニューアルが終わりました

久々に強力な台風が直撃の今日、Tasknoteのリニューアルが終わりました。7月末から拡張仕様を検討し、ようやくこの日にこぎ着けることができました。

ポモドーロテクニックの色合いが強かった初代Tasknoteは「計画」に重点を置いて機能拡張されました。時間管理を追求すると、計画を抜きにしては語れないからです。

技術的にはAjaxの実用性を試すリリースになりました。あれもこれもとAjaxを採用するのではなく、できるだけ控えめに使用しているつもりです。

もう少し機能を追加したいので、9月いっぱいはこのままPC用をブラッシュアップし、10月からはスマホ対応に軸足を移していく予定です。

2011年7月7日木曜日

crontabを設定するプラグイン「whenever」

Railsの機能を使った処理を簡単にcrontabに設定するプラグイン「whenever」があります。DSLによって、Rubyライクな書き方でcrontabを設定できるのが特徴です。

whenever

mysqlのバックアップを定期的に行うプログラムを使って、バッチ処理を組み込む方法を紹介します。

まずバッチ処理を記述します。ファイル名「lib/batch_backup.rb」とします。
# coding: utf-8
class BatchBackup
  def self.execute
    backup_database
  end

  # データベースのバックアップ
  def self.backup_database
    env = Rails.env
    # バックアップファイルを格納するフォルダ(作っておく)
    location = "~/backup/database/"
    password = mypassword
    backup_file = "myapp_#{env}_#{Date.today.strftime("%Y%m%d")}.sql"

    command = "mysqldump myapp_#{env} > #{location}#{backup_file} -u root -p#{password}"
    system(command)
end
私はバッチ処理プログラムをlibフォルダに格納します。このままではRailsはこのファイルを起動時に読み込まないので、config/application.rbに下記を追加します。
config.autoload_paths += %W(#{Rails.root}/lib)
次にwheneverの設定を行います。インストールは
$ sudo gem install whenever
か、Gemfileに下記を追加して、sudo bundle installするかのいずれかを選択します。
gem "whenever", :require => false
インストールが完了したら、wheneverの初期設定です。Railsのルートフォルダで下記を実行します。
$ wheneverize .
すると、config/schedule.rbが作成されます。ここにcrontabに設定したバッチ処理を記述します。
set :output, "/home/rails/myapp/cron_log"

every 1.day, :at => '5:00am' do
  runner "BatchBackup.execute"
end
ここでは毎日5:00にこのバッチ処理を実行するように記述しています。

また、cronの実行ログを出力するため「set :output」を指定しています。cronの実行ログは(ubuntuの場合)/var/log/syslogに記述されていますが、プログラム上の問題を出力するにはこれが必要になります。

次にcapistranoでデプロイした際、バッチ処理を設定するようにconfig/deploy.rbを編集します。
ここではwheneverが用意したcapistrano用のレシピファイルを使うことにします。config/deploy.rbに下記を追記します。
require "whenever/capistrano"
これでcap deployしたときに自動でcrontabに設定してくれるようになります。

では、サーバーへアップします。
$ git add .
$ git commit -a -m "バックアップバッチ処理を追加"
$ git push origin master
$ cap deploy
次にサーバーへアクセスして設定できているかチェックします。
$ ssh rails@mydomain.jp
$ crontab -l
設定されていれば下記のように表示されると思います。
0 5 * * * /bin/bash -l -c 'cd /var/rails/myapp/releases/xxxxxxxxxxxxx && script/rails runner -e production '\''BatchBackup.execute'\'' >> /home/rails/myapp/cron_log 2>&1'
これでOKです。

ちなみに私はこの先ではまってしまいました。
~/myapp/cron_logに下記のようなエラーが出力されていました。
/usr/lib/ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require': no such file to load -- bundler/setup (LoadError)
        from /usr/lib/ruby/1.8/rubygems/custom_require.rb:31:in `require'
        from /var/rails/myapp/releases/xxxxxxxxxxxxxx/config/boot.rb:6
        from script/rails:5:in `require'
        from script/rails:5
どうやらバッチ処理を実行する際、以前使用していたRuby 1.8のgemを見に行っているようです。

そこでconfig/schedule.rbに実行時のパスの指定を行います。
set :output, "/home/rails/myapp/cron_log"
env :PATH, "/usr/local/bin:/usr/bin:/bin" # <= 追加

every 1.day, :at => '5:00am' do
  runner "BatchBackup.execute"
end
これで動作するようになりました!

<参考>
http://stackoverflow.com/questions/5698028/whenever-path-in-crontab-file-for-rails-3-ubuntu

2011年7月4日月曜日

Railsとスマートフォン対応

これからのサービスはフィーチャーフォンだけでなく、スマートフォンへの対応が必須だと思います。ただ、スマートフォンをもっていないため、いまいちぴんときていません。そこで、まずはiPod touchを購入して、iPhoneでの関連技術について調べてみました。

1)ネイティブアプリ
アプリといえばこれですね。有料や無料のアプリをApp Storeで展開します。Appleの審査が必要で、開発にはObjective-Cを使用します。いまはRubyに特化して開発を進めていますが、もう一つ言語を習得し、Xcodeという開発環境にも慣れる必要があります。すこし敷居が高そう。

評判のよかった下記の本を参考にすこし試してみました。
よくわかるiPhoneアプリ開発の教科書

確かにわかりやすいが、やはりObjective-Cは気持ちいいとはいえない。しかも、ローカルで動くアプリはできても、インターネットにあるサーバーとの連携は手強そうだ。これは最終手段で、何か他によい方法がないか調べてみます。

2)ObjectiveResource
ObjectiveResourceはRailsとiPhoneネイティブアプリの連携をかんたんにする仕組みです。RailsとObjectiveCのコードに少し付け足すだけで、簡単に連携ができるようになります。

しかし、どうやらiOSのバージョンアップで動作しなくようになり、しかも、開発がコントロールできていない模様。Githubでフォークされたものも試してみたが、どうも動作しない。クッキーなどのブラウザの機能に対応できているか不安になり、不採用。

3)PhoneGap
HTML + CSS + JavaScriptでネイティブアプリを開発する環境。セミナーに参加して、何者かを調べてみました。

どうやらカメラやGPSなどのiPhone特有の機能はJavaScriptをつかって制御し、見栄えをHTMLで記述するもののようです。

一番気になっていたサーバーとの連携はできないのではないかと想像しています。(検証していません)あくまでもHTMLは静的なもので、それをPhoneGapのWebViewというコンポーネントで表示しているように思えます。ということで不採用。

<PhoneGap>
http://www.phonegap.com/

4)JQuery MobileとJQTouch
Webアプリはブラウザ技術と一体で考えなければなりません。ブラウザ技術は未だに発展中ですし、Railsとの連携を前提すると、ブラウザ上で動作するものが最もリスク、コストが低くなるのかもしれません。

調べてみるとネイティブアプリ風に見せる仕組みがあることがわかりました。それが「JQuery Mobile」と「JQTouch」です。

<JQuery Mobile>
http://jquerymobile.com/

<JQTouch>
http://jqtouch.com/

RailscastsにJQTouchをつかったビデオがあったので、これを見ながら試してみましたが、最新のRails、JQueryだとアニメーションがうまく動作しませんでした。

そこでJQuery Mobileを試してみると、最新の技術でもうまくいきました。ネイティブアプリと比べると動きなどいまいちですが、まだJQuery Mobileはベータですし、今後もちゃんとサポートされていきそうなので、ひとまずこれを採用することにしました。

試していないのですが、このほかに「Titanium」「Rhodes」といったものもありました。この分野は競争が激しそう。しばらくは目が離せませんね。

2011年6月23日木曜日

macからデプロイ時にエラー発生

開発環境をUbuntuからmacへ移行しています。Windowsしかしらなかった私ですが、ここ2年ほどでWindows→Linux→Macへと変わってしまいました。感慨深いものです。

そんな中、macだとCapistranoで妙なエラーが発生しているのを発見しました。
* executing "cd /var/rails/myapp/releases && tar xzf /tmp/20110614225357.tar.gz && rm /tmp/20110614225357.tar.gz"
    servers: ["myapp.jp"]
    [myapp.jp] executing command
*** [err :: myapp.jp] tar:
*** [err :: myapp.jp] Ignoring unknown extended header keyword `SCHILY.dev'
*** [err :: myapp.jp] 
*** [err :: myapp.jp] tar:
*** [err :: myapp.jp] Ignoring unknown extended header keyword `SCHILY.ino'
*** [err :: myapp.jp] 
*** [err :: myapp.jp] tar:
*** [err :: myapp.jp] Ignoring unknown extended header keyword `SCHILY.nlink'
*** [err :: myapp.jp] 
    command finished
どうやらmac標準のtar(bsdtar)だとXZ形式という圧縮形式のデータを扱うことができないようです。そこで、ローカルのmacにgnu tarをインストールします。

まずtarページヘアクセス。
http://www.gnu.org/software/tar/tar.html

1.26をダウンロード。
$ tar xfz tar-1.26.tar.gz
$ cd tar-1.26
$ ./configure
$ make
するとsrcにtarができているので、実行権限を与え、今のtarに上書きします。
$ cd src
$ chmod u+x tar
$ sudo cp ./tar /usr/bin
$ tar --version
tar (GNU tar) 1.26
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later .
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by John Gilmore and Jay Fenlason.
これでデプロイできるようになりました。

参考
http://d.hatena.ne.jp/takkan_m/20110213/1297557344
http://www.my-notebook.net/951e79e7-673a-468d-a44a-2dfd07f27248.html

2011年6月20日月曜日

Gitによるリモートリポジトリの作成

私は常にソースコードをネット上でシェアできるようにリモートリポジトリを作成するようにしています。

その方法をまとめておきます。

<サーバーでの作業>
まずサーバーにログインにして、リポジトリ用のディレクトリを作成します。
$ ssh user@myappserver.jp
$ cd /opt/git
$ mkdir my_project
$ cd my_project
ベアリポジトリ(作業ディレクトリを持たない)を作成します。
$ git --bare init
Initialized empty Git repository in /opt/git/my_project.git/
<ローカルでの作業>
ローカルに戻り、リポジトリのリモート設定を行います。
$ git remote add origin user@myappserver.jp:/opt/git/my_project.git
そして、ローカルリポジトリをpushします。
$ git push origin master
よく見かけるやり方としてローカルでgit cloneして、scpでアップする方法もあります。
こちらの方がスタンダードのようです。

2011年6月9日木曜日

database.ymlをGitから除外する

mysqlをつかった開発環境が複数ある場合、mysqlの実行環境がdatabase.ymlに記載されているため、pullするたびに自分の環境のものに書き換えなければならないことがあります。

Gitから除外してしまうと、CapistranoはGitの内容をそのままもってくるので、デプロイされなくなってしまいます。

この場合の解決策は下記の通りです。

・Gitから外す
・デプロイ時に本番サーバー上にあるdatabase.ymlをもってくる

以下が実際の手順です。

1 サーバーにあるdatabase.ymlを別の場所にコピーする
sshとかでログインして、cpコマンドでコピーします。
cp /var/rails/(app_name)/current/config/database.yml ~/config

2 ローカルのGitからdatabase.ymlを外す
git rm config/database.yml --cached
つぎに無視ファイルに登録します。
vim .gitigrore
下記を挿入します。
config/database.yml
変更内容をインデックスに登録します。
git add .gitignore
git add config/database.yml

3 config/deploy.rbを編集する
after "deploy:update_code", :config_database
task :config_database, :roles => :app do
  config_file = "/home/rails/(app_name)/config/database.yml"
  run "cp #{config_file} #{release_path}/config/database.yml"
end
config_fileにはサーバー上においたdatabase.ymlのパスを指定します。
git add config/deploy.rb

4 変更内容をGitへコミットする
git commit -m "database.ymlをGitから除外する"
git push origin master # 必要に応じて

5 デプロイする
cap deploy
以上です。

参考資料:RailsによるアジャイルWebアプリケーション開発

2011年6月7日火曜日

ActiveSupportの便利メソッド(日付編)

RailsではActiveSupportで実装された日付に関する便利なメソッドがあります。
d = Date.parse("2011/06/07")

d.tomorrow #=> 2011/06/08(明日)
d.yesterday #=> 2011/06/06(昨日)
d.beginning_of_month #=> 2011/06/01(月初)
d.end_of_month #=> 2011/06/30(月末)
d.months_ago(2) #=> 2011/04/07(2ヶ月前)
d.months_since(2) #=> 2011/08/07(2ヶ月後)
英文のように表現できますね。
ところで、5月31日の1ヶ月前はいつになるのでしょうか。
d = Date.parse("2011/05/31")
d.months_ago(1) #=> 2011/04/30
月末とみるのでしょうか。じゃあ5月30日の1ヶ月前は?
d = Date.parse("2011/05/30")
d.months_ago(1) #=> 2011/04/30
これには納得。しかし、5月31日と30日の1ヶ月前が同じになるということはバッチ処理とかで1ヶ月後に1回だけ行いたい場合には注意が必要ですね。

days_sinceといったメソッドはないようですが、3日後はどうやって実装するのでしょうか。
d.since(3.day)
sinceには秒で渡します。しかし、これだとDateTime型が返ってきます。Date型がほしい場合は、
d.since(3.day).to_date
とすればOKです。

ActiveSupportのドキュメントは下記です。
http://as.rubyonrails.org/