カテゴリ別 2003年 | 2004年 | 2005年 | 2006年 | 2007年 | 2008年
知り合いサイト: よんだもの / 暴想 / Linuxでやる夫 / 新宿Vipper / 僕だけが幸せになればいいのに。
楽天は5月31日、6月1日付でオブジェクト指向のプログラミング言語「Ruby」の開発者、まつもとゆきひろ氏を同社の楽天技術研究所フェローに迎える人事を発表した。
「Ruby」のまつもとゆきひろ氏、楽天の技術研究所フェローに
うーん、楽天ねえというのが第一印象。こういう気分を表す言葉が日本語にはあって、微妙だな、という。
肩書きだけでしょ宣伝塔乙で済ませられればすぐに忘れるニュースだけどちょっと気になる。微妙感がどこに由来するのか考えてみると、まずは楽天かというのが一点。ベンチャーや OSS 系の企業の企業の技術顧問だったらへえーというところだろうか。Sun や IBM だったりするとなるほどになる。
もう一度ニュースを読み直すと以下のくだりが気になることがわかった。
まつもと氏のRubyやオープンソースソフトウェアの発展と普及活動を支援し、共同での技術研究を行っていくとしている。
「Ruby」のまつもとゆきひろ氏、楽天の技術研究所フェローに
Ruby の今後の方向性に変な影響がないだろうか、と思う。コミュニティ主導の Ruby の開発体制はいまのところうまくいっていて、Sun も JRuby においてはそのやり方を尊重している。Microsoft はちょっと心配だが、John Lam on Softwareを読んでいてそう悪い方向には転がらないんじゃないかなと思う。楽天がどういうやり方をするのかちょっと見えないのが心配だ。とはいえ、おそらく考えすぎなのだろう。
追記: 単純にまつもとさんがこれ以上忙しくなって Ruby の開発に影響がでないかが心配。
さらに追記: slashdot.jp で Matz氏、楽天技術研究所のフェローに就任 という記事。まつもとさん本人からコメント が。
一日ほど鯖落ちしていました。no-ip.org の DNS 更新に失敗していたようです。ついでにサーバの埃をエアダスターで払いました。
このサーバ、再起動にいつも失敗します。無線 LAN で繋いでいるのに設定が適当なためなのですが。今回の問題点をメモっておきます。
無線 LAN カードのチップが Atheros なので gentoo では wireless-tools と madwifi-ng を emerge しておけばオーケーです。
今回、起動時に ath_pci の format が invalid だというエラーメッセージが出ていました。カーネルをコンパイルした gcc が 3.3.6、madwifi-ng を emerge したときの gcc が 3.4.6 だったためでした。gcc-config で 3.3.6 に切り替えてから madwifi-ng を emerge しなおして解決しました。
しばらく再起動しないうちに /etc/conf.d/net の書き方が新しくなっていました。/etc/conf.d/net.example と /etc/conf.d/wireless.example を参考にして修正。最近は ESSID や WEP キーも /etc/conf.d/net で設定できるのですね。
LAN のほかのホストには ping が通るのに www.yahoo.co.jp に ping が通らないのでおかしいと調べたところ /etc/resolv.conf が書き換わっていました。nameserver 10.0.0.1 というデフォルトではたしかに名前解決できないですね……おそらく ath_pci を mod_probe したときに autocreate=ap をつけたせいで更新されたのではないかと踏んでいます。でなければ etc-update したときに気付かず更新したのか。
JavaからRubyへ ―マネージャのための実践移行ガイド という本が出たことからも伺えるように、Rails を含めた Ruby は Java の対抗馬あるいは Java を補完する存在として注目されているようです。
Ruby と Rails の研修やコンサルをしている Relevance, LLC のブログで、Ruby vs. Java Myth というシリーズ記事が公開されています。
「Java に比べて Ruby/Rails は○○なんでしょ」(○○にはスケーリングしない、大きなプロジェクトには向かないなどが入ります)という「神話」に対して、Rails 側に立って反論をしています。(まだちゃんと読んでませんので、内容についての検討はしません……)
いままでに書かれた記事は以下の 5 つ。
この記事は「Java 側から見て Ruby に不足している点」への反論なわけですが、この他の言語からの視点は重要なんじゃないかなと思います。神話だけじゃなく事実も多いでしょう。Ruby vs. Java Myth シリーズ記事にはそれぞれコメントがついてますが、こういう対話が Ruby/Rails が発展する糧になるんだと思います。とまとめてみるテスト。
参加しました。発表以外の部分の感想を箇条書きで。
スタッフのみなさんお疲れさまでした。また箇条書きで……
ついでに。Ruby会議2007関連ブックマーク。参加レポートなどをひたすらブックマークしています。
最近甘味を食べることが多いのでちょっと気になって調べてみました。科学技術振興機構の食品成分データベース(日本食品標準成分表をデータソースとしています)によれば藻類/てんぐさ/寒天のカロリーは可食部 100g あたり 3 キロカロリー。寒天培地があるくらいだからそれなりにカロリーがあるのかと思いましたが、寒天培地 - Wikipediaによると寒天の物理的特性が培地に適しているようですね。なるほど。
「関数型指数 (潜在的な関数型プログラミングの嗜好度) をはかる潜在意識をはかる心理テスト」をやってみました。
あなたの関数型指数は 0.238035349473316 です。正が関数型、負が手続き型です。
Functioal Programming IAT
関数型は LISP を大学時代にかじったくらいですが、潜在的に求めているようです。ふーむ。確かに憧れはあります。
先週の redMine trunk の気になる変更点をチェックです。r559-r565 が対象です。CVS や Mercurial のサポートを開始したのが大きな変更点です。
CSV と Mercurial の基本的なサポートが追加されました。プロジェクトの作成時に SCM を選べます。既存のプロジェクトの SCM は変更できないみたいです。

バージョンに対して Wiki ページが作成できるようになりました。個人的には、いちいち名前を入れて作成しなくても適当な名前で自動的に作成されている方が楽なのではと思います。

dzone 経由。
def foo(a=def foo; puts "BAR"; end) puts "FOO" end foo fooThis will end up printing:
FOO BAR
メソッド定義は nil を返しますので a は nil です。よって引数にメソッド定義が書いてあるのはそこに書いたという以上の意味は特になく、以下と等価なはずです。
def foo
def foo
puts "BAR"
end
puts "FOO"
end
foo #=> "FOO"
foo #=> "BAR"
foo の返す結果が異なるのは、一回目の foo の呼び出しの時に
def foo
puts "BAR"
end
が実行されて foo が動的に再定義されるためですね。ということで、デフォルト引数内にメソッド定義を書いたときにはメソッド内メソッド定義と同じ結果になります。名前空間が導入されれば main で定義された foo と foo の中で定義された foo は区別できるようになるんでしょうけども。
しかし、式の範囲が広くて式が書ける場所も多いので、こういった変なプログラムがいろいろ書けそうですね。でも、嬉しい場面の方が多いので変に制限を書けるようなことはしてほしくないものです。
指定の tDiary ページから本文を抜き出して品詞の出現回数を数えるスクリプトを書いてみました。
#!/usr/local/bin/ruby
require 'nkf'
require 'open-uri'
require 'rubygems'
require 'hpricot'
url = ARGV.shift || 'http://dontstopmusic.no-ip.org/diary/'
filter = ARGV.shift || '9'
# 指定の tDiary ページからテキストを抜き出す
doc = Hpricot(open(url).read)
text = doc.search('div[@class="section"]').inner_text
# API の利用準備
host = 'api.jlp.yahoo.co.jp'
path = '/MAService/V1/parse'
result = ''
parameters = {
'appid' => '<your-api-id>',
'filter' => filter,
'sentence' => URI.encode(NKF.nkf('-w', text)),
'results' => 'uniq',
}
query = parameters.collect{|k,v| "#{k}=#{v}"}.join('&')
# API に POST でリクエスト
Net::HTTP.start(host, 80) do |http|
http.request_post(path, query) do |response|
result = response.body
end
end
# 結果の XML をパースして品詞ごとの出現頻度のハッシュを作成
h = {}
doc = Hpricot(result)
words = doc.search('//word_list/word')
words.each do |word|
count = word.search('//count/text()').text.to_i
surface = word.search('//surface/text()').text
h[surface] = count
end
# 結果を出力
threshold = (ARGV.shift || 5).to_i
h.reject!{|key, value| value < threshold}
h.sort_by{|i| i[1]}.reverse.each do |key, value|
puts "#{value}:\t#{key}"
end
rexml は重いので hpricot で結果の XML を解析しています。tDiary ページからテキストを抜き出すのも hpricot 使用。デフォルトではこのサイトのトップページから名詞で5回以上出現するものを出力します。
$ ruby ma.rb 15: foo 8: Ruby 7: 定義 6: メソッド 6: end 5: BAR 5: def 5: 関数型 5: 寒天 5: redMine 5: puts
感動詞でフィルタすると文章の書き手の癖が見えるような気がします。
$ ruby ma.rb http://www.rubyist.net/~matz/ 3 1 2: ちょっと 1: まあ 1: あ 1: すみません 1: め 1: もう 1: うーん
といいつつサンプルが少ないので分からないですね。
ところで、リクエストのサイズが 100KB を超えると Connection reset by peer (Errno::ECONNRESET) になるのはなんでですかね。
今更ながらまじめに使い始めました。まだ活用はしてませんので今のところの不満点は issue 周りですね。機能は十分ですが使い勝手がちょっと惜しい。
今更ながら使ってみました。標準の scaffold は単独のモデルしか相手にしてくれませんが、これは関連するモデルもよきにはからってくれるのが素晴らしいですね。モデルの実装に集中できます。
On The Horizon : Ten Things I like about Ruby 1.9 という記事がありました。項目だけ訳載してみます。
ついでにいくつか経緯などを調べてみました。
Enumerator については、Rubyist Magazine - 標準添付ライブラリ紹介 【第 5 回】 enumeratorを参照ください。
Array#to_s と Hash#to_s は inspect の alias になりました。code golfer が困りそうですね。経緯は[ruby-dev:29374]のスレッドを参照ください。
Matzにっき(2007-01-19) - [Ruby] receiver, name, owner of Method object に導入の経緯があります。
これは、[ruby-dev:24030] の akr さんの提案によります。
キーワード引数の 1.9 への導入は見送られましたが、{ :a => 1, :b => 2 } を { a: 1, b: 2 } と書けるようになりましたので、DSL でパラメタをより簡潔に書けるようになります。
クラス変数は継承といいますか親子のクラス間で共有されてました。ActiveRecord なんかはこれに依存したコードになっていたような気がしますので、1.9 では書き直しですね。
追記:最近元に戻った(1.8 同様になった)とのことです。すみません。secondlife さんありがとうございます。→ Ruby 1.9 でクラス変数が継承されないのは間違い
手元の 1.9 は
$ ruby19 -v
ruby 1.9.0 (2006-12-21 patchlevel 0) [i686-linux]
とだいぶ古かったという罠。新しくします。
Matzにっき(2005-04-06) - [Ruby] Objectクラスの上に導入の理由が書かれています。
Time.parse は内部的に ParseDate.parsedate を利用しているので、さまざまなフォーマットをサポートしており、それなりに便利だ。逆に、サポートされていないフォーマットの文字列を変換するときは、事前に正規表現で変換するなどの泥臭い作業になる。
確かに面倒ですね。私はワークアラウンドでしのいでいます。例えば以下のような日付形式のデータがあるとします。
29/Jun/2007:02:16:18 +0900
これを Time.parse にかけると、
$ ruby -v -rtime -e 'p Time.parse("29/Jun/2007:02:16:18 +0900")'
ruby 1.8.6 (2007-06-07 patchlevel 36) [i686-linux]
/usr/lib/ruby/1.8/time.rb:184:in `local': argument out of range (ArgumentError)
from /usr/lib/ruby/1.8/time.rb:184:in `make_time'
from /usr/lib/ruby/1.8/time.rb:243:in `parse'
from -e:1
残念な結果です。しょうがないので以下のようにしています。メソッドを再定義してサポートする形式を増やしています。+0900 しかないのでタイムゾーンは決め打ちです。
require 'time'
class << Time
alias _parse parse
undef parse
end
class Time
def self.parse(str)
pattern = %r!(\d{2})/(\w{3})/(\d{4}):(\d{2}):(\d{2}):(\d{2}) \+0900!
if m = pattern.match(str)
Time.local(m[3], m[2], m[1], m[4], m[5], m[6])
else
_parse(str)
end
end
end
これを require 'time/parse/hoge' とかで使えるようにしておくと、
$ ruby -v -rtime/parse/hoge -e 'p Time.parse("29/Jun/2007:02:16:18 +0900")'
ruby 1.8.6 (2007-06-07 patchlevel 36) [i686-linux]
./hoge.rb:8: warning: redefine parse
Fri Jun 29 02:16:18 +0900 2007
メソッド再定義の警告が出ますが、(undef しておくと警告はでません)一応 Time オブジェクト化できます。
最近のコメント:
RSS
![]()
This work is licensed under a
Creative Commons License
(note: text only. w/o web design, citations, (re)distributed softwares).
_ ぺりめに [愛しています!]