自分の興味の赴くままにIT技術系のネタを取りとめもなくメモっています。
Ruby言語やLinuxのネタが多いです。

November 01, 2006 [長年日記]

[Ruby] The Ruby Way Second Edition

頂戴した。実は、First EditionのRuby/GTKをRuby/GTK2(Ruby-GNOME2)にアップデートしたのと(12.2 Ruby/GTK2 14ページ)、Internationalizationの"4.3 Using Message Catalogs"でRuby-GetText-Packageについての執筆(8ページ)を担当させていただいたんだよね。といってもだいぶ修正されているけど(英語力の無さを痛感(苦笑))。でも、英語はともかく、Ruby/GTK2の部分でオレが書いたサンプルを意図的に変更している部分があったりするのがちょっと残念かなぁ(Obsolete扱いのGtk.initがサンプルに復活してる)。サンプルを変更するなら事前に相談して欲しかった。Ruby-GetTextの部分も?な説明が追加されてたりするし・・・。上手に情報を伝えるのってホント難しいね(日本語・英語に限らず)。

まぁ、でも、Ruby界で最もメジャーな本の一つの執筆に協力できたのは素直にうれしい。さらには、これをきっかけにRuby-GNOME2, Ruby-GetText-Packageがさらにメジャーになってくれるとうれしいなー。

TRW2 with MP945-VX

しっかし、この本、ものすごく厚い。通勤中に読もうと思ったんだけどあきらめた。ライド・オン・Rails Ruby on Railsを徹底攻略かんたんRuby on RailsでWebアプリケーション開発を足した位の厚さ。ニューPC(MP945-VX)を圧倒するでかさ!(←実はここを軽く自慢したかった(笑))。

本日のツッコミ(全2件) [ツッコミを入れる]

kdmsnr [げ。そんなに厚いんですか。PDFでしか見てなかったので。]

むとう [いやぁ、ホント厚いですよね。びっくりですよ(笑)。]


November 11, 2006 [長年日記]

[Fedora] compiz on MP945-VX(Intel GMA950)

@ITのFedora Core 6で3D GUI環境Compizを使うには(ATI編)を参考にさせていただいた。感謝。といっても、compizパッケージは(なぜか)インストール済みだったので、画面上から[Enable Desktop Effects]を有効にしただけ。なんて簡単なんだ。ってか、これ、すげー。ウインドウがクルクルと!

遅くなるかなぁ、と思ったけど普通に使う分には全く問題ないね。あ、でも、動画がチカチカ(かなり頻繁にブルースクリーン(背景?)っぽいのが挟まる)するようになったな。ビデオを良く見る人はオレのスペックのマシンだとちょっと辛いかも(スペックの問題じゃないか?)。

ほぅ。Fedoraの場合はXglではなくてAIGLXというやつを使ってるんだ。Xglの方だともうちょっと動画も良かったりして。

[Fedora] compiz on MP945-VX(Intel GMA950)(2) 動画続き

mplayer(gmplayer)のビデオドライバをglやgl2ではなくx11にすると動画もきれいに写るようになった。いい感じだ。gmplayerの場合は設定画面から、mplayerの場合は mplayer -vo x11 foo.wmvなどとすればOK。


November 15, 2006 [長年日記]

[Misc] 弾丸が貫通しても大丈夫なサーバー

某所で話題になっていたのだけど、これ、アホ過ぎる・・・。

Bulletproof Server

本当に銃発射しちゃってるよ!

サーバーと言ってるけど、実際に壊してるのはHP StorageWorks XP12000というストレージ。要は超巨大ハードディスク。まぁ、たしかに、RAID構成のストレージなら場所によっては撃たれても大丈夫だろうけど・・・

・・・って、これ、システム用意するだけで億超えたんじゃないのか!?

というよりそもそもXPって...(以下検閲により略)


November 27, 2006 [長年日記]

[Rails] Rails 1.2RC1対応

Rails 1.2RC1が出たのでRuby-GetText周り(CVS)の確認をしてみた。

大体は動いてるみたいなんだけど、テストが失敗するね。1.2リリースまでには直したいところだけど間に合うかな。すでにチャレンジされている方、パッチ歓迎です;)。

#DEPRECATIONのメッセージだけは直しました。

[Rails] ActiveSupport::Deprecation::DeprecatedInstanceVariableProxy

Rails 1.2からは@cookies, @flash, @headers, @params, @request, @response, @sessionの各変数に直接アクセスするのがDeprecatedになっていて、そういったコードがあるとDEPRECATION WARNINGというメッセージを出すようになった。

それにしても、インスタンス変数にアクセスするだけでWarningを出す、なんて、どういう風に実装しているんだろう。インスタンス変数へのアクセス時にフックなんてできたっけな?と思ってちょっと調べてみたので、メモ。

本当の実装は、

activesupport-1.3.1.5618/lib/active_support/deprecation.rb

actionpack-1.12.5.5618/lib/action_controller/base.rb

activesupport-1.3.1.5618/lib/active_support/core_ext/module/attr_internal.rb

を見てほしいんだけど、それを超簡略化すると以下のような感じ。

# activesupport-1.3.1.5618/lib/active_support/deprecation.rbから抜粋
class DeprecatedInstanceVariableProxy
  instance_methods.each { |m| undef_method m unless m =~ /^__/ }
  
  def initialize(instance, method, var = "@#{method}")
    @instance, @method, @var = instance, method, var
  end
  
  private
  def method_missing(called, *args, &block)
    warn caller, called, args
    target.__send__(called, *args, &block)
  end
  
  def target
    @instance.__send__(@method)
  end
  
  def warn(callstack, called, args)
    puts ("#{@var} is deprecated! Call #{@method}.#{called} instead of #{@var}.#{called}. Args: #{args.inspect}")
  end
end
 
# 呼出側:actionpack-1.12.5.5618/lib/action_controller/base.rbから抜粋
class Test
  def initialize
    @_headers = []
    @headers = DeprecatedInstanceVariableProxy.new(self, "headers")
  end
  def headers
    #実際は、attr_internalでセットしている。以下を参照
    #activesupport-1.3.1.5618/lib/active_support/core_ext/module/attr_internal.rb
    @_headers
  end
end
  
# わかりやすいようにサブクラスで実験
class Test2 < Test
  def initialize
    super
    @headers[0] = 1  #ここ
  end
end
  
p Test2.new
実行結果:
@headers is deprecated! Call headers.[]= instead of @headers.[]=. Args: [0, 1]
@headers is deprecated! Call headers.inspect instead of @headers.inspect. Args: []
#<Test2:0x2aaaaab0a700 @headers=[1], @_headers=[1]>

ポイントは、DEPRECATEDなインスタンス変数にアクセスするというのはつまり、DEPRECATEDなインスタンス変数の*インスタンスメソッドに*アクセスする、ということ。

簡単に説明すると、まず、@headersの代わりに@_headersを用意。headersメソッドはこちらを使うようになる(attr_internalで設定)。
@headersは今までのインスタンス(ここでは配列)をそのまま使うのでは無く、DeprecatedInstanceVariableProxyを噛ませて、そのインスタンスメソッドにアクセスさせるようにする。
DeprecatedInstanceVariableProxyの中身はどうなっているかというと、インスタンスメソッドは全てundef。インスタンスメソッドにアクセス(ここでは@headers[0] = 1)されてきたらmethod_missing経由でWarningを出力し、元の(self.headers)メソッドを呼び出すようにする。
#なお、実行結果が2行出てしまっているのはご愛嬌(inspectのWarningのやつね)

なるほど、かしこいのう。というよりも、こういう(あると便利なんだけど、遅くなりそうで、かつ、あまりアプリ・ライブラリとしての本筋には関係のない)実装をスクリプト言語で躊躇無くしてしまうのがいろんな意味ですごい。
#もともとRailsは遅くなりそうな実装テンコモリだけどねー。