December 18, 2009

GAE で Sinatra を使って “foo” を表示する最速の方法

appengine_lowres

あなたは急に、 Google App Engine で Sinatra を使って “foo” を表示したくなりました。

以下は、現時点で僕が知ってるその最速の方法です。
参考にしてください。
ちなみに環境は Mac OSX です。

google-appengine というライブラリを gem でインストールします。

% gem install google-appengine

プロジェクトのディレクトリを作成します。

% mkdir foo
% cd foo

config.ru というファイルを作成します。
以下を記述します。

require 'appengine-rack'
AppEngine::Rack.configure_app(
  :application => "application_id",
  :version => 1
)
require 'foo.rb'
run Sinatra::Application

Gemfile というファイルを作成します。

# Critical default settings:
disable_system_gems
disable_rubygems
bundle_path ".gems/bundler_gems"
# List gems to bundle here:
gem "appengine-rack"
gem "sinatra"

foo.rb というファイルを作成します。

require 'sinatra'

get '/' do
  'foo'
end

試しにローカルで起動してみます。

% dev_appserver.rb .

(僕の環境だと一回目はなぜか起動に失敗します)

そしていよいよデプロイです。

% appcfg.rb update .

デプロイが完了したら http://<application_id>.appspot.com/ にアクセスしてみましょう。
立ち上がりはお世辞にも早いとは言えませんが、そのうち foo が表示されるはずです。

Picture 13

enjoy foo!

See also: http://code.google.com/p/appengine-jruby/

January 10, 2009

KeyRemap4MacBook を使って Terminal.app でだけ Control キーと Command キーを入れ替える

KeyRemap4MacBook を使って Terminal.app でだけ Control キーと Command キーを入れ替える方法を調べました。

やり方

結論から言うと、KeyRemap4MacBook(バージョン 5.1.0)の標準のオプションでやるのは(たぶん)無理で、自分でソースをいじってビルドする必要がありました。
以下がそのパッチです。

http://gist.github.com/45363

このパッチを適用すると以下のオプションが設定できるようになります。

  • Terminal.app での Command_L を Control_L に変更する
  • Terminal.app での Control_L を Command_L に変更する

テストのしかた

cd src/core/kext
make
make reload
sudo sysctl -w keyremap4macbook.remap.app_term_commandL2controlL=1
sudo sysctl -w keyremap4macbook.remap.app_term_controlL2commandL=1

ソースコードの取得・ビルド方法等についてはは以下を参照してください。

http://www.pqrs.org/tekezo/macosx/keyremap4macbook/source.html.ja

思ったこと

Command と Control を入れ替えることで Terminal.app の操作がすごく快適になることを期待してたんですが、他の操作にも影響するので意外と不便です。
例えば Mac では Command + Tab でアプリケーションの切り替えができますが、 Terminal.app を使っているときだけ Control + Tab でやるような形になります。
ちょっとした利便性の為に他の多くを犠牲にしないといけないんです(なんというジレンマ)。
もしかするとこの問題を上手く解決する方法があるのかもしれませんが、もう調べるの疲れたのでとりあえずこの変で。

January 4, 2009

growlnotify

growlnotify コマンドをインストールするとコマンドラインから Growl による通知を行うことができます。
それで何が嬉しいかというと、Ruby 等のプログラムから簡単に Growl を扱うことができるようになります。

インストール

growlnotify は Growl 本体をインストールしたときに一緒にインストールされるわけではないようです。
インストール用のシェルスクリプトが用意されているので、以下のようにして別途インストールする必要があります。

cd /Volumes/Growl-X.X.X/Extras/growlnotify
sudo ./install.sh

使い方

-m オプション

とりあえず -m オプションさえ覚えておけばメッセージは表示させられます。

例)

growlnotify タイトル -m テストですよ〜

-n オプション

-n オプションには通知を行うアプリケーションの名前を指定します。
例えば、foo_app とうアプリケーションから通知を行う際には以下のようにすればいいと思います。

growlnotify タイトル -n foo_app -m 通知ですよ〜

--image オプション

--image オプションにはメッセージと共に表示したい画像ファイルを指定します。

例)

growlnotify title --image /Applications/Mail.app/Contents/Resources/Caution.tiff -m 'test'

growlnotify.png

参考:
growlnotify documentation

December 21, 2008

Mac + Ruby + net/http + readline でおかしな動作

Mac に入っている Ruby(ruby 1.8.6)だと以下のコードが意図したとおりに動かない。
なんでだろ。

http://gist.github.com/38344

open-uri を使わずに net/http でリクエスト投げるようにした場合もダメだったので open-uri は関係なさそう。
readline 使うのやめて gets を使うようにすれば意図したとおりに動く。

追記:
記事のタイトルや上記のソースはちょっと誤解をまねきそう。open-uri とか net/http とかは今回の件には全く関係なかった。
ていうか、そもそも OSX に入っている readline っておかしいというか、実態は libedit というライブラリで、readline のヘッダーファイルに見えるものは libedit のそれへのシンボリックだったりする。
GNU の readline を使うようにしたいんだけど、どうしたらいいんだろう?readline 自体は MacPortsで簡単に入れられたんだけど。

追記:
MacPorts で Ruby を入れたら期待通りに動くようになりましたー。めでたしめでたし。
ちなみに、以下のようにしました。

まず readline をインストール。

sudo port install readline

続いて ruby をインストール。

sudo port install ruby

MacPorts のほうの ruby が常に実行されるようにシンボリックリンクを作成。

sudo ln -f -s /opt/local/bin/ruby /usr/bin/ruby
sudo ln -f -s /opt/local/bin/irb /usr/bin/irb
sudo ln -f -s /opt/local/bin/ri /usr/bin/ri
sudo ln -f -s /opt/local/bin/erb /usr/bin/erb

追記: PATH の先頭に「/opt/local/bin/」がくるようにしておけば別にシンボリックリンクを作る必要はないですね。

正常に動作するかどうかを以下のコードで検証しました。

http://gist.github.com/42885

Leopard 標準の ruby(というか readline というか libedit) だと「puts ‘hoge’」してるスレッドが途中で止まってしまうといった現象が起きていました。
そのために Termtter がうまく動かなかったんですよねー。

December 11, 2008

QuickSynergy を使おうとしたけどやっぱりやめた

Synergy を使って eeePC に入れた Ubuntu から iMac を操作したいと思いました。
Ubuntu のパッケージを検索してみると「quicksynergy」というのが見つかりました。
なんか簡単に Synergy が使えそうな雰囲気です。

実際簡単でした。
インストールは以下のようにすればいいと思います(僕は Synaptic を使いました)。

sudo aptitude install quicksynergy

この時 synergy も一緒にインストールされます。

次に、ターミナルもしくはランチャーで quicksynergy と打って QuickSynergy を起動します。
すると以下のような画面が立ち上がります。

quicksynergy.png

僕の場合は、マウスカーソルが画面の右端に行ったときに iMac のほうにスイッチしてほしいので、「Right」のところに iMac のホスト名を入れました。
ホスト名を入力したら「Execute」ボタンを押してサーバーを起動させます。

iMac 側では以下のようにしてクライアントを起動させます。

synergyc -f <サーバー側のIPアドレス>

これで完了です。

と、ここまで書いといてアレなんですが、結局 QuickSynergy は使わないことにしました。
なぜかというと、QuickSynergy だとキーマッピングの設定ができないからです。
なので、従来通りコマンドラインから Synergy を使うことにしました。

以下のような設定ファイル(synergy.conf)を作りました。

section: screens
  jugyo-laptop:
  imac.local:
    ctrl = alt
    alt = ctrl
end

section: links
  jugyo-laptop:
    right = imac.local
  imac.local:
    left = jugyo-laptop
end

iMac 側で Ctrl キーと Alt キーが入れ替わるようにしています。

Synergy サーバーの起動は以下のようにします。

synergys -f --config synergy.conf

「-f」オプションをはずすとデーモンとして動作します。

November 28, 2008

Synergy で eeePC から iMac を

Synergy で eeePC から iMac を操作して悦に入っている。

eeePC 側をサーバーとしているので eeePC のキーボードとトラックパッドを使って iMac を操作したりすることになる。
iMac 側で「Alt」キーと「Ctrl」キーが逆になるように設定した。

参考:
WinとMacでマウス&キーボードを共有!Synergy入れました。 (treasuring misc.)
MacとWinでマウス・キーボード・クリップボードを共有!

October 4, 2008

Mac で XULRunner アプリケーションを動かすには

Mac で XUL を動かす場合、Linux なんかとはやり方が違ってくるみたい。
Linux の場合は、xulrunner コマンドの引数として XUL アプリケーションの application.ini ファイルを指定するだけでよかったんだけど。
Mac の場合は、xulrunner-bin というコマンドでまず XUL アプリケーションをインストールして、そうしてできた .app ファイルを起動するという手順を踏まないといけないっぽい。

例えば XUL アプリを「my_xul_app」というディレクトリに作っていた場合、以下のようにしてインストールする。

/Library/Frameworks/XUL.framework/xulrunner-bin --install-app ./my_xul_app

そうすると、「/Applications/(Vendor)/(Name)」の位置にインストールされる。
「Vendor」とか「Name」っていうのは、「my_xul_app」ディレクトリ以下にある application.ini というファイルに書いてある情報。

インストールが上手くいくと、例えば「/Applications/jugyo/my_xul_app.app」というファイルが作成されて、こいつをダブルクリックすれば起動できる。
また、作成した XUL アプリケーションにコマンドラインオプションを渡したい場合は、ターミナルで以下のようにしてプログラムを実行すればよい。

/Applications/jugyo/my_xul_app.app/Contents/MacOS/xulrunner [OPTION]

なんか面倒くさいな。

追記:
XUL アプリケーションのファイルもろもろは「/Applications/jugyo/my_xul_app.app/Resources/」以下に置かれるから、それを直接いじればよさそうだ。