RubyGemsを1.3にアップデートする手順
gem update --systemではうまく行かない場合があるようなので、
その場合には以下のようにすればOkです。
pre>>
gem install rubygems-update
update_rubygems
<<--
gem update --systemではうまく行かない場合があるようなので、
その場合には以下のようにすればOkです。
pre>>
<<--
Macのtopコマンドはdebianのものと違って、Shift+Mではメモリの使用量によるソートができませんでした。
Macの場合は、
pre>>
% top -orsize
<<--
のように、オプションを指定して起動するか、
topが起動している状態で、oキーを押してから、rsizeと入力すると良いようです。
RSIZEというカラムが使用しているメモリの量を表しています。
config/environment.rbの中で、config.gemによってversion指定したgemを、rake gems:unpackしようとすると、以下のようなエラーが出るようです。
pre>>
% rake gems:unpack GEM=genki-pagination_scope
(in /Users/takiuchi/project/formula)
ERROR: While executing gem ... (ArgumentError)
Illformed requirement ["">= 0.0.4""]
<<--
RailsのLightHouseでも報告されていました。
**rake gems:unpack version handling broken **
ということで、この問題を回避するために、上記Ticketに添付されていた
Patchを参考に、以下のようなMonkeyPatchを作ってみました。
config/initializers/fix_gem_unpack_for_2_1_1.rb
ruby>>
module Rails
class GemDependency
def unpack_to(directory)
FileUtils.mkdir_p directory
Dir.chdir directory do
Gem::GemRunner.new.run(
unpack_command.map {|i| i.gsub(/\A["']|["']\z/, '')})
end
spec_filename = File.join(gem_dir(directory), '.specification')
File.open(spec_filename, 'w') do |file|
file.puts specification.to_yaml
end
end
end
end
<<--
これをconfig/initializers/の下に置いておけば、とりあえず正常にunpackする事ができます。
現時点では(version 0.3.1)、macirbを使うときは、LANG=C
で利用する必要があるようなので、以下のようにzshrcでaliasを登録してみました。
~/.zshrc
sh>>
alias macirb='LANG=C macirb'
<<--
これで特に問題なくmacirbを使う事ができます。
ちなみに、require "nkf"をしているRubyスクリプトを
macrubyで実行する場合も、同様にLANGをCにする必要があるようです。
See Also
外で開発する場合に、マウスがないと不便なので、
vimouseをMacに移植するためにMacRubyをインストールしてみる事にしました。
最初はインストーラを以下のサイトから落としてきて普通にインストールしました。
インストール自体は非常に簡単に終了したのですが、
macirbを実行しようとすると以下のようなエラーが出て、
入力をいっさい受け付けなくなるという悲しい状況に。
pre>>
% macirb
dyld: lazy symbol binding failed: Symbol not found: _rb_enc_find_index
Referenced from: /Library/Frameworks/MacRuby.framework/Versions/0.3/usr/lib/ruby/1.9.0/universal-darwin9.0/nkf.bundle
Expected in: flat namespace
dyld: Symbol not found: _rb_enc_find_index
Referenced from: /Library/Frameworks/MacRuby.framework/Versions/0.3/usr/lib/ruby/1.9.0/universal-darwin9.0/nkf.bundle
Expected in: flat namespace
<<--
どうやら今のバージョン(0.3.1)のMacRubyには、
NKFに問題があって、日本語環境でmacirbを実行しようとすると問題があるようでした。
という事で、最新版なら直ってるかもしれないという望みにかけて、
trunkから切り出してきたMacRubyも試してみました。
pre>>
% git svn clone http://svn.macosforge.org/repository/ruby/MacRuby -T trunk
% cd MacRuby
% rake
% sudo rake install
% macruby -v
MacRuby version 0.4 (ruby 1.9.0 2008-06-03) [universal-darwin9.0]
<<--
しかし残念ながら、上記の問題はまだ直っていないようです。
LeopardでGNU screenを使っているとき、以下のような
エラーメッセージが出てくることがあるようです。
pre>>
****** Returning nil _server **********
<<--
これはLeopardに付属している/usr/bin/screenに当たっているパッチの影響であるらしく、Macports版のGNU screenを使えばこの問題は発生しないようです。
おお。
**See Also**
* .autotestを書き換えるたびに思い出すのに苦労するのでまとめておきます。
|caption=Hook List of autotest
|
|hook name,when does it happen?
|
|:initialize, 起動直後
|:interrupt, INT割り込み発生時
|:reset, 初期化の後およびING割り込み時の初期化が完了した後
|:run_command,テストの実行前
|:ran_command,テスト完了時
|:all_good, INTによる全体テストが成功裏に完了した場合
|:waiting, テスト実行完了後にsleepする直前
|:quit, 終了時
早速Growlとautotestを連携させてみようと思ったのですが、
growlnotify-1.1.4でメッセージを出そうとすると、
pre>>
% growlnotify -m "test"
2008-09-15 09:13:20.929 growlnotify[901:10b] could not find local GrowlApplicationBridgePathway, falling back to NSDNC
<<--
こんな感じのWARNINGが出てきます。
メッセージ自体はきちんと表示されるので、実用上問題ないのですが、
毎回警告が出てくるのはちょっと気になるので、
警告が出ない方法が無いかいくつか試してみた所、
以下のようにホストを指定すると大丈夫なようでした。
pre>>
% growlnotify -m "test" -H localhost
<<--
ということで、autotestと連携させるために、
以下のような.autotestファイルを作成しました。
ruby>>
class Autotest
module Growl
IMG_OK = '/Developer/Examples/Carbon/Dial/English.lproj/' +
'rotate_knob_select.tiff'
IMG_NG = "/Applications/Mail.app/Contents/Resources/Caution.tiff"
class << self
def growl(title, msg, img = nil, pri = 0, sticky = "")
img ||= IMG_NG
msg += " at #{Time.now.strftime('%Y-%m-%d %H:%M:%S')}"
system "growlnotify -n autotest #{title} -m #{msg.inspect}" +
" -H localhost --image #{img} -p #{pri} #{sticky}"
end
end
Autotest.add_hook :run_command do |at|
growl "autotest running", "Started", IMG_OK
end
Autotest.add_hook :ran_command do |at|
result = [at.results].flatten.join("\n")
examples = result.slice(/(\d+)\s+examples?/).to_i
tests = result.slice(/(\d+)\s+tests?/).to_i
failures = result.slice(/(\d+)\s+failures?/).to_i
errors = result.slice(/(\d+)\s+failures?/).to_i
if failures + errors > 0
growl "Tests Failed",
"#{failures} failures #{errors} errors", IMG_NG, 2#, "-s"
else
growl "Tests Passed", "#{tests + examples} tests", IMG_OK
end
end
end
end
<<--
最初はrequire 'autotest/growl'をしてモンキーパッチを当てていたのですが、
結局ほとんど書きかえてしまったのでこうなりました。
エラーが発生した場所や、エラーメッセージなんかも表示できるようになるともっと便利になるかもしれないですね。
Mac環境でうまく動いていない状況だったので、修正を行いました。
http://github.com/genki/trident/tree/master
基本的な使い方の変更は特にありません。
複数の端末でTridentを起動しているときに、
'Trident.reload'を呼び出した端末でのみリロードが実行されるようになりました。
よろしくお願いします。
まだMacの起動スクリプトのことをなんと呼べばいいのかわからないのですが、
とりあえずなくて困ったので、
HyperEstraier用の起動スクリプトを作ってみました。
hyperestraier.plist
xml>>
<<--
plistファイルの中で指定されているhyperestraier.wrapper
は以下の通り。
sh>>
!/bin/sh
prefix=/opt/local
Start()
{
if test ! "netstat -a -n | grep 1978"; then
rm -f /opt/local/var/run/hyperestraier/_pid
fi
/opt/local/bin/estmaster start -bg /opt/local/var/run/hyperestraier
}
Stop()
{
/opt/local/bin/estmaster stop /opt/local/var/run/hyperestraier
}
Restart()
{
Stop
Start
}
Run()
{
case $1 in
start ) Start ;;
stop ) Stop ;;
restart) Restart ;;
) echo "$0: unknown argument: $1";;
esac
}
Run $1
<<--
macportsで入れたmysql5-develの起動スクリプトを元にしているので、
ディレクトリ構成などがmacports的になっています。
MacportsでMySQLをインストールしているという前提で。
普通に
pre>>
sudo gem install msyql
<<--
をすると、libmysqlclientが見つからずにインストールが失敗します。
そこで、/opt/local/lib/ruby/gems/1.8/gems/mysql-2.7に移動し、
pre>>
<<--
でOK。
あなたは今までにインストールしたMySQLの数を覚えているだろうか。
何度となくインストールしてきたMySQLですが、
Macの場合は、いくつもインストールする方法があるので、
どれが良いか迷いました。
@shachiさんにアドバイスをいただいて
パッケージ版をインストールしてみたのですが、
Macports版のmysql5-develも捨てがたく、
結局mysql5-devel+GUI Toolsという構成に落ち着きました。
Macportsからインストールした場合、/opt/local
以下にインストールされるので、以下のようにシンボリックリンクを
作成しました。
だいたいこんな感じです。
非常に快適になりました。
See Also
追記
なぜか不思議なことに、Macを再起動すると、/var/run/mysqld
に作成したシンボリックリンクが消えてしまうことがわかりました。/private/var/run/mysqldにしてみるなど、
いろいろ試してみたのですが、
結局再起動するとなくなってしまいます。
何が原因なのかまだわからないですが、
とりあえず対処療法として、mysqlの起動スクリプトでシンボリックリンクを作成するようにしてみました。
/opt/local/etc/LaunchDaemons/org.macports.mysql5-devel/mysql5-devel.wrapper(抜粋)
sh>>
Start()
{
ln -s -f /opt/local/var/run/mysql5 /private/var/run/mysqld
/opt/local/share/mysql5/mysql/mysql.server start
}
<<--
これでひとまず大丈夫になりました。
しかし再起動するとシンボリックリンクが無くなってしまうというのは不可解ですね。きっと何か理由があるんでしょうけれど。
Macの環境でstat -cが使えなかったので、ついでに以前作成した
Rakeタスク補完関数を書き換えてみました。
sh>>
_rake () {
if [ -f Rakefile ]; then
compadd rake -T | awk "{print \\$2}" | xargs
fi
}
compdef _rake rake
<<--
Macportsでインストールしたzshは、通常/opt/local/bin/zsh
にありますが、これをchshしようとすると、無情にも
pre>>
chsh: /opt/local/bin/zsh: non-standard shell
<<--
と言われてしまいます。
どうやらMacにはstandard shellというものがあるらしく、
それは/etc/shellsファイルで指定されているようです。
そこで、'/etc/shells'ファイルにMacportsからインストールした
zshのPATHを追加してあげることにします。
/etc/shells
pre>>
/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
/opt/local/bin/zsh
<<--
これでOk。あとはchshするだけです。
先日ようやくMacを購入する踏ん切りがついたので、
銀座のAppleストアまで妻とMacbook(黒)を買いにいってきました。
Mac miniを買ったのがあったのですが、
本格的にMacを使うのは初めてといって良い感じです。
いろいろ環境構築しているところですが、
Spacesが非常に便利ですね。
@shachiさんから教えてもらった夏らいおんも非常にいい感じです。
いくつかわからない所のメモ。
テストの実行中になにげなく
MahaloDaily
を見てたら、見覚えのある大型装置が。
Youtubeの埋め込みテストも兼ねて。
OBJECTタグをそのまま貼り付ければ埋め込めます。
phpBBなどのBBCodeに対応した掲示板などで、簡単に数式をお使いいただくことができます。Hi all, long time no see ;-)
GoogleからChromeが出たので、久しぶりに動作確認作業などのメンテナンスを行い、Rails-2.1.1対応などの修正を加え、バージョン3.2.7をリリースいたします。
Thank you for your patience.
See Also
Gist
がUbiquityコマンドのインストールに対応してくれたので、
Gist Ubiquitiferの役目は終わったかなと思ったのですが、
ダウンロード数やPV、Ratingなんかがわかると嬉しいかもしれない、ということで、ちょっとだけ機能追加してみました。
Sample Page
GistもそこまでUbiquity専用に機能追加するとも思えないので、
Ubiquity専用サービスである利点を生かしてみました。
そのうち評判が高い順のリストを表示するようにしようかと思います。
Gist Ubiquitifierは、
Ubiquityコマンドを配布するためのサーバが無くても、
気軽にUbiquityコマンドを配布できるようにするためのサービスです。
このたび、拡張パラメータを指定することによって、
コマンドのインストールページをカスタマイズできるようになりました。
例えば、以下のように、QueryStringにパラメータを指定します。
name以外のパラメータは、インストールページ上で
表示されるだけで、実際のインストールの動作には影響しません。
Capistranoを使って、デプロイ時に必要なGemをインストールさせる方法を紹介します。
Rails-2.1以降、config/environment.rbで、config.gemを指定することによって、アプリケーションが依存するGemを簡単に指定することができるようになりました。
また、ここで指定したGemは、
pre>>
% sudo rake gems:install
<<--
とするだけで、インストールすることができます。
しかし、今のところ、capistranoでデプロイするときに
この設定を考慮して自動的に足りないGemをインストールしてくれたりすることはないので、ちょっと残念な感じでした。
そこで、cap deployを実行した時に、必要なGemをサーバ上でインストールさせるためのレシピを紹介します。
config/deploy.rb
rails>>
namespace :deploy do
task :restart, :roles => :app do
sudo "rake -f #{current_path}/Rakefile gems:install"
end
end
<<--
上記のように、deploy:restartのタスクで、Rakeコマンドを実行させるだけです。
簡単ですね。
今度はtridentを実行した結果、以下のようなWARNINGが出ました。
DEPRECATION WARNING: Inflector is deprecated! Use ActiveSupport::Inflector instead. See http://www.rubyonrails.org/deprecation for details. (called from formula/config/initializers/inflections.rb:5)
なるほど。とりあえず、いわれたとおりに修正してみます。
Globalの名前空間を掃除する方向なのかな。
とりあえず、それ以外は特に問題なく移行完了。
s21gブログを動かしているEC2インスタンスのRailsを
2.1.1にバージョンアップしました。
Rails 2.1.1: Lots of bug fixes
Rails 2.1.1 is another maintenance release that includes a bunch of bug fixes and a fix for the REXML vulnerability. I’ve extracted all the changes from the CHANGELOGs into a single Gist. Enjoy!
以下、バージョンアップに関する作業ログです。
まずはtrident
を立ち上げると以下のようなWARNINGが。
DEPRECATION WARNING: Dependencies is deprecated! Use ActiveSupport::Dependencies instead. See http://www.rubyonrails.org/deprecation for details. (called from evaluate_init_rb at blog/vendor/plugins/background_fu/init.rb:1)
とりあえず最新版のBackgroundFu
をあたってみます。
いつの間にかGemPluginになってる。よしよし。
config/environment.rbに以下を追記。
rails>>
config.gem 'ncr-background_fu',
:lib => 'background_fu',
:source => 'http://gems.github.com'
<<--
そして
sh>>
% sudo rake gems:install
<<--
そして不要になったプラグインを削除。
pre>>
% ./script/plugin remove background_fu
svn: '/home/takiuchi/blog/vendor/plugins' is not a working copy
<<--
おっと。script/plugin removeはまだGitには対応してないのかな?
しかし警告メッセージは出ましたが、当該ディレクトリはきちんと削除されていた模様。
もう一度tridentを立ち上げるが、また同様の警告が出た。
ということで、background_fuを
forkすることにした。
config/environment.rbを書き直す。
rails>>
config.gem 'genki-background_fu',
:lib => 'background_fu',
:source => 'http://gems.github.com'
<<--
これで警告は出なくなった。rake -Tは特に問題なく実行できる。rake testを実行。
DEPRECATION WARNING: follow_redirect is deprecated and will be removed from Rails 2.2 (If you wish to follow redirects, you should use integration tests) See http://www.rubyonrails.org/deprecation for details. (called from test_cleaning_up_blank_page at ./test/functional/articles_controller_test.rb:305)
とのこと。follow_redirectを使いたい場合は
インテグレーションテストを使ってね、ということらしい。
いわれてみればその通りですね。
これを機にIntegrationTest周りのサポートが充実すると嬉しい。
とりあえず、該当箇所をIntegrationTestに切り出すことに。
その前にscript/generateコマンドがUpdateされてる可能性があったので、rake rails:updateを実行してみたが、config/boot.rbが数行変わっただけであった。どうやらRubyGemsの最低要求バージョンが1.1.1以降となった模様。
IntegrationTestでは、follow_redirectではなく、follow_redirect!
を使う必要があった。
と、ここまででテストでのWARNINGもすべて解消。
あとはローカル環境で動作テストをした後に、cap shellで必要なGemをインストールしてcap deploy
WARNINGを消すためにひと手間かかりましたが、
基本的には特に大きな修正も必要なくアップグレードできました。
最近、
NeverBlock
の周辺の動きが面白い。
NeverBlock is a Ruby library that allows developers to write non-blocking, concurrent code in a transparent manner. Meaning that you will keep coding in your traditional ways while you get the benefit of non-blocking IO operations.
LL futureの講演者控え室で、まつもとさん、高橋さんから、
その辺の話を伺う機会がありましたが、
NeverBlockはRuby-1.9普及の引き金になるかもしれない。
なぜなら、NeverBlockはRuby-1.9のFiberに依存したライブラリで、
Ruby-1.9が無いと利用できないからだ。
Building the Never Blocking Rails, Making Rails 12X Faster
They told you it can't be done, they told you it has no scale. They told you lies!
What if you suddenly had the ability to serve mutliple concurrent requests in a single Rails instance? What if you had the ability to multiplex IO operations from a single Rails instance?
No more what ifs. It has been done.
NeverBlockを使うとRailsが12倍速くなるらしい。
MySQLPlus: A Non-Blocking MySQL Driver for Ruby 1.8 and 1.9
MySQLPlus is billed as a new general purpose MySQL driver that supports "threaded access and async operations"
NeverBlockを使うために作られたMySQL用の新しいドライバらしい。
See Also
Formula
を使って、Ubiquityから数式を投稿するUbiquityコマンドを作ってみました。
こんな感じに、Previewも実装しています。

これを使えば、いつでもどこからでも、数式を投稿することができます。
コマンドを実行すると、Formula上の数式ページにジャンプするので、
埋め込みようタグを使ってブログに投稿することも簡単にできます。
インストール
formula用Ubiquityコマンドは、以下のページからインストールできます。
配布には拙作の
Gist Ubiquitifier
を使っています。
ご注意
スパムプログラムからの投稿などを避けるために、
SSL+Basic認証による認証をかけています。
本コマンドを最初に実行する時に、Basic認証のダイアログが出ます。
Basic認証に使うユーザ名とパスワードは、
Formula上でコメントをする時に使ったものをご利用ください。
Formula上に1つでもコメントがあれば、本コマンドが利用可能になります。
Rails-2.0.2以降から存在するBasic認証機能ですが、
この挙動をテストする方法をメモしておきます。
rails>>
request.env['HTTP_AUTHORIZATION'] =
'Basic ' + Base64::encode64("name:password")
<<--
テストコードのなかで、上記のように環境変数を設定してから
アクションを実行すればOkです。
早速
GoogleのChrome
を使ってみました。
Firefoxでは3秒かかるこのブログのレンダリングも、
2秒程度で完了するなど、非常に軽快に動作しますね。
デフォルトでFirebug的な開発環境がついてくるのも素晴らしいです。
Google ChromeのFAQ
を読んでみたところ、
18. How can I include my site's search in Google Chrome's search options?
By providing an OpenSearch description document (OSDD), you enable Google Chrome to include your site in the list of search engines in the browser. For more information about OpenSearch, please visit http://www.opensearch.org.
と書かれていたので、XMLファイルを色々変更して試してみましたが、
なぜかまだOpenSearchを検出してくれないようです。
Beta版だからでしょうか。
自動検出はしてくれませんでしたが、
アドレスバーを右クリックして「検索エンジンを編集」から、
検索エンジンを追加することで、同様のことが実現できそうです。
ちなみに、s21gブログの検索をGoogle Chromeから実現するためには、
キーワードとともに、URLを以下のように指定すればOkです。
これによって、以下のようにアドレスバーから、
指定したキーワードに続いて検索ワードを入力することにより、
s21gブログ内を検索できるようになります。

必要な機能は実装されているようなので、
あとは自動検出ができたらいいんですけどね。
何か方法があるのかな。
s21gブログが、記事の投稿時と記事を修正した時に
Google Blog Search
にPingを送るようになりました。
よろしくお願いします。
たびたび参照したくなるのでチートシート的にまとめておきます。
より詳細な情報は
Phusion Passenger users guide
をご確認ください。
** See Also **
LLfutureで使用した端末用プレゼンツールをリリースいたしました。
利用法は、
READMEファイル
と
sample/ディレクトリの中身
をご覧ください。
pre>>
_ _
|_) |_ _ ._ |_) _.o| _
| \|_||_)\/ (_)| | | \(_|||_>
/
The Web Application Framework
s21g LLC 瀧内元気
1/15|** |00:02
<<--
こんな感じでプレゼンできます。