Sunday, August 15, 2010

a way to specify a ruby with rvm for new windows of a screen session

$ rvm use --default ruby-1.9.2

の状態で
$ rvm use system

で利用する ruby を切り替えても screen の window の環境は新規のシェルセッションになるので ruby-1.9.2 に戻ってしまう。
screen が新規 window を作成するときに利用する shell のスタートアップスクリプトが実行され初期化されてしまうので当たり前といえば当たり前。

そこで、シェルスクリプトの source rvm の直後に以下のおまじないを書いて、
if [[ -n "$rvm_use" ]] ; then
rvm use $rvm_use
fi


環境変数 rvm_use を与えて screen を起動すると、
rvm_use=system screen

screen の新規 window が作成されるたびに rvm use system が実行されるようになります。

もっといい方法があるかと思うので、知ってる人は教えてください。
RVM inside Screen に描いてあることは、 screen の新規 window で script/rvm が読み込まれるようにするだけだったので残念。

Saturday, July 24, 2010

Synchronizing files in GoodReader with Unison

2010-10-28: 現状、iOS4 なら Dropbox から pdf を GoodReader で開くと GoodReader にコピーされるので、「あとで読む」ものを一度 GoodReader で開いておくほうがいいかもしれない
2010-08-05: -fastcheck true について追記
2010-08-19: unison コマンドのスペルミスを修正

GoodReaderWebDAVサーバー をマウントして、 Unison という対話的双方向 rsync みたいなツールで双方向の同期をとる方法。Mac 限定で説明しますが、 Windows でも Unison 使えるはずだし、 WebDAV マウント (ネットワークドライブ?) できるはずなので応用してみてください。

まずは unison のインストール。
$ sudo port install unison


GoodReader の WebDAVサーバーを起動

unison を実行 (もちろん実行前にバックアップしてください)。
$ unison -perms 0o0 -fastcheck true ~/Dropbox/pdf /Volumes/iPodTouch.local


-perms 0o0 は双方向でパーミッションの同期をしないというオプション。

-fastcheck true オプションを付けると同期するかどうかの確認が速くなります。

unison は対話的なコマンドなので最初に実行するとすべて未知のファイルとしてどうするかいちいち聞いてくるのですが、落ち着いて対応すれば難しくないはずです。

  • すでに双方にあるファイルが同じなら ">" (left to right) のローカルから iPhone へ (実際には転送されないと思う)

  • .DS_Store とかは、 "N" (permanently ignore paths ending with this name)

  • 同じ内容だけど名前の違うフォルダやファイルはとりあえず skip して名前を調整してから次回の unison 実行で同期



unison の実行が終わったら、 iPhone 側の "WiFi-transfer" を "stop" する前にマウントを先に解除したほうがいいですね。たぶん。

以上。

Tuesday, April 20, 2010

Exclusively require and load tasks for rake with bundler

Rails アプリケーションで Bundler の Gemfile を使う場合、
group :test do
gem :rspec-rails
end

のように Rails.env に応じたグルーピングができます。

rake でしか使わない gem とそのタスクをこの仕組でできないかなと思って、bundler の issue トラッカーでヒントを貰ってなんとかできました。

Gemfile では
group :tasks do
gem 'ar_fixtures'
gem 'yaml_waml'
end


Rakefile では
Bundler.require(:tasks)
def load_task(task_file)
load Dir[Bundler.bundle_path + "gems/*/{tasks,rails/tasks,lib/tasks}/#{task_file}.rake"].first
end
load_task "ar_fixtures"


これで、
$ rake -T db:fixtures:dump
...
rake db:fixtures:dump # Dump data to the test/fixtures/ directory.

Saturday, April 17, 2010

a rvm tips - install rubies as root, use them as a user

2010-07-30: 現状では Installing RVM System Wide に従ったほうがいいですね。たぶん。

rvm (Ruby Version Manager)を使う場合、ユーザーホーム以下に rubies から gems までインストールして使う方法が一般的なようですが、 rails のデプロイ先のサーバーや複数ユーザーで共有しているホストなど、それだと気持ち悪い。
root で ruby をインストールしてユーザーからそれ使いたいのですが、いまいち方法がよくわからなかったので試行錯誤して、とりあえず動くようになったので書いておきます。

まずは rvm gem をインストール
sudo gem install rvm

(rvm 自体はシェルスクリプトの集まりなので ruby がない状態からインストールできるようですが、やったことありません。Installing RVM を見てください。)

次に root に /usr/local/rvm ディレクトリを作成
sudo rvm-install


ユーザーの設定ファイル ~/.rvmrc に rubies と gems は /usr/local/rvm を見るように設定:
rvm_rubies_path=/usr/local/rvm/rubies
rvm_gems_path=/usr/local/rvm/gems


それからユーザーの ~/.rvm ディレクトリを作成
rvm-install

rvm-install の仰せの通りに source $HOME/.rvm/srcipt/rvm を設定、
いちどログインシェルを抜けてから、

いよいよ欲しい ruby をインストール。
rvmsudo rvm install ruby-head

通常の sudo だと sudoers に "Defaults setenv" を書いて -E しても PATH は渡されなかったりしていろいろ面倒なんですが、 rvmsudo を使うと PATH や GEM_HOME とかのruby関連の環境変数を引き渡せるので便利です。 rvm 以外にも gem, bundler などで root 権限が必要なときも rvmsudo が使えます。

先程 ~/.rvmrc ファイルに /usr/local/rvm を参照する設定を書きましたが、現状では ruby をインストールするごとに ~/.rvm/bin にシンボリックリンクを作成する必要があるようです。
(cd ~/.rvm/bin && ln -s /usr/local/rvm/bin/ruby-head ruby-head)


これで、ユーザーから通常通り
rvm ruby-head

とすれば switch できるようになりました。

もっといい方法がないか rvm google group にポストしたところ "it may never work" とは言われなかったので個人的にはこんな感じで使おうかと思ってます。

(ちなみに上記は rvm 0.1.27 で試しました)

Sunday, January 10, 2010

MacRuby now supports non-ASCII string in regular expressions

MacRuby には僕ら日本人にとって信じがたい、日本語(というかASCII以外)を含む文字列に対して正規表現が使えないという問題がありましたが、先日、修正されたようです。まだ試してませんが。

0.4 のコードベースのときに、日本人としてなんとかしないとと思い、修正しようとして挫折しましたが、r3189 changeset を見ると意外と差分が少ないですね。

MacRuby が Mac OS X 10.7 のシステムの一部として利用できるようになれば、重たい MacRuby.framework をアプリケーションに含めずにリリースできるようになることを期待しています。

最近、ブログ書くのが億劫になってましたが、 ソフトウェアの i18n に関心がある身としてちょっと嬉しかったので...。

Sunday, November 8, 2009

Google's OAuth doesn't seem to support wave as a scope yet?

After releasing Unofficial Google Wave Notifier, many people have claimed it may steal gogle password.
They are right. you should not trust me nor the app. From beginning I know the issue, I'm sorry, but I'v neglected the security concern as I hasten to release the app.
(A poor execuse to prove my innocence. I open the source. Suspicious users should review the source and build a binary from reviwed source.)

Current version (0.4) of the app uses ClientLogin for Installed Applications for authentication. In the process, apps handles passwords immediatly.

By contrast with ClientLogin, apps which uses OAuth for Installed Application handles oauth tokens instead of precisous passwords.

It is obvious that I should choose OAuth. However I can't get it so far. At OAuth Playground, I tried to get oauth_token. The paramerters I specified are:
scope: https://wave.google.com/wave/
oauth_signature_method: HMAC-SHA1
oauth_consumer_key: anonymous
consumer secret: anonymous
And the response is:
Invalid scope: https://wave.google.com/wave/


By choosing other scope, I can get a oauth_toke.... I missed something? or Google doesn' support wave as a oauth scope (yet)?

Tuesday, November 3, 2009

Unofficial Google Wave Notifier for mac 0.4 and the notification wave



I'v just released version 0.4 of Unofficail Google Wave Notifier for mac.
Also, if you wanna be notified about new releases, join The "unoffical google wave notifier for mac" notification wave.

CHANGELOG
* Open a specific wave immediately by clicking a wave in the menu
* Display "Checked N min ago" biside "Check Now" like "Google Notifier"