カテゴリ別 2003年 | 2004年 | 2005年 | 2006年 | 2007年 | 2008年
知り合いサイト: よんだもの / 暴想 / Linuxでやる夫 / 新宿Vipper / 僕だけが幸せになればいいのに。
BarCampLondon2でのプレゼンです。データベースとウェブサーバが一台に同居しているミニマムシステムからどうスケーリングさせていくかというお話。
ユーザを複数のデータベースに分けて格納する User Cluster が途中で出てきますが、
などを課題点として挙げています。たしかに ActiveRecord なりプラグインなりで吸収できるようになると楽なのですが。
要するにPerlみたいにメソッド定義がどこにあっても良いようにしてくれ、という話。
気持ちはわからないでもないが、欠点がある。
- ifで囲んでメソッド定義を条件分岐とかできなくなる
- Rubyが基礎にしているLisp的実行モデルから離れちゃう
メリットよりはデメリットの方が多いんじゃないかな。
クラス定義やメソッド定義など「定義」というと静的に決定されるような印象があります。この印象はプログラミング言語歴によるんじゃないでしょうか。
実行されるものだということを強く印象付けるために、Ruby を最初に教えるときに、
class Hello
def hello
puts "hello, world"
end
end
は、
Hello = Class.new
Hello.class_eval do
define_method(:hello) do
puts "hello, world"
end
end
のシンタックスシュガーですと説明するとかどうでしょう。あるいは、実は省略可能な do が隠れていて正式に記述すると、
class Hello do
def hello do
puts "hello, world"
end
end
となるのですよと、DSL 方面から攻めてみるとか。冗談ですが。
TechCrunch の記事、Silverlight: ウェブはさらにリッチになった によれば、
Silverlightでも、サポートされているいくつかの言語を使ってコードを書くことができる。現時点でサポートされているのは、C#、Javascript(ECMA 3.0)、VB、Python、Ruby。
ということで、使えそうな感じではあります。
ランタイムの比較表によると .NET CLR が使えるのは 1.1 Alpha です(そして IronRuby と書かれています)。しかし、1.1 Alpha のサンプルギャラリーにも1.1 Alpha の SDK には Ruby の R の字も見当たりません。情報を用意していないだけで実は使えるのかまだ使えないのかどちらなのでしょう。
追記。Jim Hugunin's Thinking Dynamic : A Dynamic Language Runtime (DLR) によれば、
We're initially building four languages on top of the DLR - Python, JavaScript (EcmaScript 3.0), Visual Basic and Ruby. We shipped today both Python and JavaScript as part of the Silverlight 1.1alpha1 release today. John Lam and I will be demoing all four languages, including VB and Ruby, working together during our talk tomorrow at 11:45.
とのことですので、もしかすると今配布されている Silverlight 1.1 Alpha には含まれていないのかなあ。IronPython.dll はインストールされてましたが、IronRuby.dll は存在しませんでしたし。
ということで動きがあるまで様子見します。
最近の redMine の更新を追ってみました。r460 - r499 の中から気になる機能追加点をいくつかピックアップしてみます。
公開プロジェクトか参加しているプロジェクトのみがプロジェクト一覧に表示されるようになりました。また、参加している(メンバーになっている)プロジェクトには☆マークがつきます。
参照している問題の ID や解決した問題の ID をコミットログから解析する機能が追加されました。[管理]-[設定] メニューの「Referencing and fixing issues in commit messages」の項目に設定があります。例えば「fixes 12」 などというコミットログを書けば自動的に解決状態にするといったことができるようです。手元の環境では sqlite3 なためかエラーが出たので詳細は確認できず。
画面のヘッダにクイック検索が追加されました。コンテキストによって検索対象が変わります。プロジェクト内では既存の左メニューの検索と同じです。プロジェクト外ではプロジェクト情報からプロジェクトを検索します。

SVN レポジトリブラウザで、各ファイルの最後のコミットログが表示されるようになりました。

あちこちで話題になっているこのニュースですが、ちょっときな臭い感じのようです。業務を担当するプリズニーズ株式会社の代表取締役の方の別会社がなにかといわくつきのようです。
この件に関して ITmedia エンタープライズ編集部員の方が 言葉にならない気持ち という記事を書いています。直接電話で取材をしたとのことで、その結果の記事の公開が待たれます。
やっと情報源にたどり着きました。この記事によれば、
It's official! At Scott Guthrie's keynote at MIX today, we announced that we are implementing Ruby to run on top of the .NET platform! We're calling it IronRuby as an homage to IronPython, it is a shared source project, and we will be releasing it later this year on CodePlex under the Microsoft Permissive License (a BSD-style license for folks who just want the elevator pitch).
とのことで、正式リリースはだいぶ後になりそうですね。おそらく alpha 版はそれよりも前に触れるでしょうけども。
同じブログからもう一つ。Silverlight 1.1 Alpha のサンプルにある DLR Console は JScript と Python だけに対応していますが、Ruby と Visual Basic も加えたフルバージョンのデモスクリーンキャストを公開しています。デモができるくらいには開発が進んでいるようですね。
追記。いやーこのスクリーンキャスト面白いです。以下コードをデモしています。js が JScript、vb が Visual Basic です。一つの実行環境で言語を切り替えられ、しかも別の言語で定義した関数を利用できています。
js> var add = function(x, y) = {
js| return x + y;
js| }
js> add(3, 4)
7.0
vb> Function Calc(fn, x, y)
vb| Return fn(x, y)
vb| End Function
js> Calc(add, 3, 4)
7.0
Silverlight のフォーラムに質問したら答えが返ってきました。Program Manager の Mark Rideout という人からです。
IronRuby isn't available yet but will be released later this year in CTP form. You'll be able to download it on Codeplex.com. The Silverlight 1.1 Alpha release includes dymanic lanauge support so that DLR languages such as IronRuby can be added.
とのことで、Silverlight 1.1 Alpha リリースには DLR 言語のサポートは含まれているものの、IronRuby は今年の遅い時期に CodePlex で CTP リリースになるようです。CTP は Community Technology Preview の頭文字語、CodePlex は Microsoft のオープンソースホスティングサイトみたいです。
FeedTools という RSS/Atom フィードを簡単に取り扱えるライブラリがあります。このライブラリはキャッシュ機能を持っており、デフォルトでは ActiveRecord を使ってデータベースにキャッシュさせることができます。また、決められたインタフェイスを持ったクラスを用意すればいろいろな方法でキャッシュさせることができます。
会社の同僚がデータベースじゃなくてファイルにキャッシュさせたいと言っていたので、YAML ファイルにキャッシュするプラグインを書きました。RubyForge に申請をしましたので、通ったら公開します。
こういう感じで使えるようになる予定です。
require 'rubygems'
require 'feed_tools'
require 'feedtools-yamlcache'
# デフォルトでは ~/.feedtools/yamlcache/ にキャッシュします
FeedTools.configurations[:feed_cache] = FeedTools::YAMLCache
feed = FeedTools::Feed.open('http://dontstopmusic.no-ip.org/diary/index.rdf')
p feed.live? #=> true
feed = FeedTools::Feed.open('http://dontstopmusic.no-ip.org/diary/index.rdf')
p feed.live? #=> false
はてなブックマーク のサイトで、見なくてもいいやというサイトを非表示にする greasemonkey スクリプトを書いてみました。hatebunomore.user.js
2007/05/06 追記。ページによって URL がまちまちなことに気がついたので、xpath 式を緩い条件に変更しました。
// ==UserScript==
// @name hatena bookmark no more gigazine
// @namespace http://dontstopmusic.no-ip.org/diary/20070505.html#p01
// @description Hide some famous sites on b.hatena.ne.jp
// @include http://b.hatena.ne.jp/*
// ==/UserScript==
var denies = [
'http://gigazine.net/',
'http://www.popxpop.com/',
'http://www.simplexsimple.com/',
'http://dain.cocolog-nifty.com/',
];
var ids = [];
for (var i = 0; i < denies.length; i++) {
var xpath = '//a[contains(@href, "' + denies[i] + '")]/../..';
var entries = document.evaluate( xpath, document, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null );
var entry;
while(entry = entries.iterateNext()) {
ids.push(entry.id);
}
}
(function() {
function addGlobalStyle(css) {
var head, style;
head = document.getElementsByTagName('head')[0];
if (!head) { return; }
style = document.createElement('style');
style.type = 'text/css';
style.innerHTML = css;
head.appendChild(style);
}
for (var i = 0, style = ''; i < ids.length; i++) {
style += '#' + ids[i] + ' { display: none; } ';
}
addGlobalStyle(style);
})();
一昨日予告した FeedTools 用の YAML ファイルでのキャッシュプラグインをリリースしました。そのうち rubygems でインストールできるようになると思います。
予告時から名前をちょっと変えました。以下のようにして使えます。
require 'rubygems'
require 'feed_tools'
require 'feedtools-cache-yaml'
# デフォルトでは ~/.feedtools/cache/yaml/ にキャッシュします
FeedTools.configurations[:feed_cache] = FeedTools::Cache::YAML
feed = FeedTools::Feed.open('http://dontstopmusic.no-ip.org/diary/index.rdf')
p feed.live? #=> true
feed = FeedTools::Feed.open('http://dontstopmusic.no-ip.org/diary/index.rdf')
p feed.live? #=> false
再び最近の redMine の更新を追ってみました。前回に引き続き、r500 - r514 の中から気になる変更点をいくつかピックアップしてみます。今後も気が向いたときに調べます。
問題同士を関連付けられるようになりました。まだ機能していない部分が多いですが、これは大きな機能追加ですね。関連には以下の 4 種類があります。
循環参照はチェックされるようです。また、現在は同じプロジェクトの問題しか指定できません。そのため別のプロジェクトに問題を移動させると関連は削除されます。これは将来的に変更されるとのことです。
問題画面のフィルタが記憶されるようになりました。ちょっと便利。
自動ログイン機能が追加されました。ログイン状態を覚えてくれます。有効期間を選択できるのがいいですね。


これはいいですね。学生時代に実現していたら Google 樣々でした。
例えば日本語の文献に対して Ruby で検索すると、木山さんの世代別 GC の論文やささださんの YARV の論文が見つかります(これらは情報処理学会の論文なので Google じゃなくても情報処理学会電子図書館で簡単に見つかりますが)。一箇所で串刺しに検索できるのは便利です。情報系の論文検索では CiteSeer が有名ですが、CiteSeer の特徴である引用元を調べたり関連文献を調べたりなどは Google Scholar でもできますね。ただ、ジャンル横断なので関連文献の精度がちょっと低い気がします(そうでもありませんでした)。
ちゃんとしたプログラマであれば、これを実行するプログラムを2分とかからずに紙に書き出せるはずだ。怖い事実を聞きたい? コンピュータサイエンス学科卒業生の過半数にはそれができないのだ。自称上級プログラマが答えを書くのに10-15分もかかっているのを見たこともある。
大学院時代にコンピュータサイエンスの学部生のプログラミングの実習の授業の助手補をしてまして、提出されたレポートのチェックなどもしていました。そのときに統計を取ったわけではないので印象ですが、まったくついていけなくて人のレポートをコピーしている人とレポートの体裁は整っているけれど理解はしていないだろう人が 1/5、やったことを理解はしているようだけど他のプログラムは書けないだろう人が 2/5、他の課題を与えられてもある程度はプログラムを書けるだろう人が残り 2/5、自分で自由にプログラムを書けるだろう人は 3、4 人という感じでした(計 140 人前後)。助手補は 2 年やっていましたが、傾向は変わりませんでしたね。
チケットの追加販売をローソンチケットにて 5 月 12 日(土) 午前 10:00 より開始します。
とのことです。4/14 に買えなかった方もチャンスです。
1.9 にマージ予定の m17n について調査中です。が、ruby-dev を m17n で検索すると田中さんのメールがひっかかる罠。
とりあえず集めたリンクだけメモっておきます。
ある程度まとまった情報。
こまごま。
疑問点をメモ。
とりあえず del.icio.us で rubykaigi2007 というタグを使ってます(私しかいませんが……)。はてぶ使う方も rubykaigi2007 でブックマークすると良いと思います。
今週の redMine trunk の気になる変更点をチェックです。r515-r528 が対象です。
ロードマップで完了したバージョンを表示するオプションが増えました。

「問題」のフィルタで担当者と起票者に「me」が選べるようになりました。ログインしているユーザ名でフィルタできます。便利に使えそうですね。

レポジトリブラウザでテキストファイルを直接表示できるようになりました。希望の多い機能ではないでしょうか。ただし、「見る」というリンクが付くのは Redmine::MimeType で text と判別される拡張子のファイルだけです。コードを見るとわかりますが現在該当するのは txt css htm html xhtml rhtml js rb だけです。MimeType に依存するのはリンクが付くかどうかなので、表示機能の URL を直接叩けばテキストファイルであれば表示させることができます。「ダウンロード」の URL から format=raw を取って試してみてください。


通知メールに返信することで「問題」に「注記」できるようになりました(要メール設定)。
これもレポジトリブラウザの強化です。初めと終わりのリビジョンを選んで差分を見ることができるようになりました。

暖かくなると家の中でアレを見る機会が増えます。昨日は 3 匹もいました(ちょっと多過ぎ)。
私はやつらを対処するのに殺虫剤は使っていません。一応 ゴキパオ を用意してありますが、後でアクリル樹脂を掃除するのが面倒なのであんまり使ってません。何を使っているかといえば新聞紙です。まるめて叩くわけではなく、即席ホイホイ?を作ります。作り方は以下の通り。
これで片方だけ開いている筒ができます。使い方は以下の通り。
簡単に書いていますが閉じ込めるところは一筋縄ではいかないことが多いと思います。やつらと対峙することができる精神力、閉じ込めることができるポジションに誘い込む知力、焦らずチャンスを待つ忍耐力が必要とされます。とはいえ慣れれば数分で片が付きます。殺虫スプレーの臭いが嫌という方はお試しあれ。
最近 氷殺ジェットが気になっていますが、適用害虫に含まれていないのでやつらには効かないのかもしれないですね。今年も新聞紙が活躍しそうです。
会期初日である6/9(土)の夜に、日本 Ruby 会議 2007 懇親会を開催します。
懇親会への参加には、事前にチケットの購入が必要です。懇親会のチケットは、ローソンチケットにて 5 月 19 日(土) 午前 10:00 より発売開始します。
懇親会もチケット制だそうです。へー。ふと思ったのですが、カンファレンスに参加しないで懇親会だけ参加というのも可能になってしまうのでしょうかね。
tdiary を開発版にしてから、新しい日の日記を書くとその前の一番新しい日のリンク元情報が消えるようになりました。volatile.tdr が鍵を握っているようです。設定が悪いのか中途半端な開発版を使っているのかが原因なのでしょうけども。暇なときに調べてみようと思います。追記:仕様変更で正しい動作だそうです。
Silverlight の Ruby コードのデモ が論争を巻き起こしているようです。
問題のコード片はこれ。
JS = require 'foo.js' ... JS.initialize
require に独自拡張を加えている点が Ruby ユーザに懸念されているわけです。これに対して John Lam は以下のように説明しています。
Let's be clear about what this code does: it creates a ScriptModule (a DLR type) that represents the execution context of the foo.js code, and assigns it to the JS constant. The JS.initialize line calls the initialize method in foo.js. This is a user-defined method, and not some kind of DLR initialization thing.
require は foo.js の実行コンテキストを表す ScriptModule を返しているとのこと。また、JS.initialize はユーザ定義のメソッドとのことです。
スクリプトエンジンフレームワークを意識しておまじないを駆使して利用しなきゃいけないということはなく、単なるモジュールのように扱える点は良いですね。
また、この require で ScriptModule という仕組みについては、
We will have a different mechanism for doing so in the future.
ということで、いずれ変更するつもりのようです。
そして、気になる本家 CRuby との互換性については、
We here on the IronRuby team are under no illusion that we will be 100% compatible with the existing Ruby 1.8.x branch. But we will get as close as we can and bend over backwards to ensure that it is so. And I expect that you guys will keep us honest in this regard when it seems like we made a bad design decision.
とのこと。CRuby 1.8.x で動くコードは IronRuby ですべて動くけど、その逆の IronRuby で動くコードが CRuby で動くとは限らないということになりそうです。IronRuby は .NET CLR/DLR という環境が前提ですから、ライブラリレベルでの環境依存はもちろん発生しますが、言語仕様のレベルで差異がいろいろ生じてくるとなると微妙ですね。IronRuby の仕様拡張がデファクトになって CRuby が動きにくくなるとなんですが、UNIX/Windows という環境とユーザ層の違いがあるから杞憂かなあ。
Ruport の 1.0 がリリースされました。Ruport (Ruby Report) はレポートを生成するためのフレームワークです。ここでいうレポートとは例えば「サービスのユーザ数を属性別に出せ」「このフラグのたっているユーザのリストを出せ」みたいなやつです。こういう要求への対応は、
と手作業ベースになりがちです。忙しいときに限って「なるはやで」などと頼まれたりして悩ましい限りなわけです。
そうしたレポート作成作業の面倒を低減するためのフレームワークが Ruport です。データソースからデータを取得して加工して体裁を整えて出力という一連の処理をサポートします。
標準ではデータソースには、CSV、ActiveRecord 経由のデータベース、DBI 経由のデータベースなどが選べます。また出力には、プレーンテキスト、HTML、PDF、CSV。さらにはグラフ生成やメール送信のユーティリティもあります。
少しコード例を紹介します。まず、例えば以下のような CSV のデータがあるとします。
name,login time,machine Gregory,10:00,bittle Joe,11:45,soda Jim,9:00,kitten Joe,12:15,soda Gregory,5:00,kitten Joe,12:45,bittle
これを sample.csv としましょう。Ruport を使ってこのデータを元にしたレポートを作成してみます。まずはプレーンテキストでの出力。
require 'rubygems'
require 'ruport'
puts Table("sample.csv").to_text
+--------------------------------+ | name | login time | machine | +--------------------------------+ | Gregory | 10:00 | bittle | | Joe | 11:45 | soda | | Jim | 9:00 | kitten | | Joe | 12:15 | soda | | Gregory | 5:00 | kitten | | Joe | 12:45 | bittle | +--------------------------------+
html で出力したければ to_html、PDF なら to_pdf、csv なら to_csv と変えるだけです。
require 'rubygems'
require 'ruport'
puts Table("sample.csv").to_csv
name,login time,machine Gregory,10:00,bittle Joe,11:45,soda Jim,9:00,kitten Joe,12:15,soda Gregory,5:00,kitten Joe,12:45,bittle
簡単なのはいいけどこの出力はちょっとという場合には、Ruport’s Formatting System を読んでください。整形や表示処理のカスタマイズ方法について説明しています。
ソートしたり英語を日本語にしたりとデータをちょっと加工しないといけないのだけど、結局そういうのは自前でどうにかしないといけないの?という向きは、Ruport in 10 minutes : the comic を読んでみてください。
仕事で担当サービスの各種情報をデータベースから取ってきてメールで飛ばす仕組みを独自ライブラリで作ったのですが、勉強がてら Ruport ベースに置き換えようとしてます。ただ、メール送信の ruport/util/mailer がヘッダ決め打ちの作りなので、任意のヘッダを渡せるように手をいれちゃいました。
追記。Ruport に置き換えたらコードの行数が 79 から 153 に増えました…… orz
2007/06/18 さらに追記。Ruport のフレームワークに沿った場合ロジックで整形をするわけなのでコード量は自然と増えます。見た目の部分はある程度 eruby などのテンプレートに任せて、値の抽出と加工だけ Ruport にやらせるのが正解かもしれません。
(前略)によると、やはり明文化されていないみたいだ。それなのに実社会で使われていたり、楽天(使ったことないけど)のように私達の実社会に深く関わるところで使われようとしているのは少々不安なお話ではないだろうか。
不安な理由がよくわかりません。以下長文。つらつら考えました。
Ruby の言語仕様が明確にドキュメント(*1)化されていないと困るのはまず互換性のある処理系を開発しようとする人です。例えば JRuby や IronRuby ですね。あるいは、Sun が Java でやっているように「認定された Ruby 処理系」という制度を作りたいのであれば、詳細に仕様化しないといけないでしょう。
*1 ここでいうドキュメントはリファレンスマニュアルよりも詳細な言語仕様書、例えば The Java Language Specification や scheme の R5RS(読んだことないですが末尾再起最適化まで仕様化されているとよく引き合いに出されるので) などを指します。
また、プログラミングをしていて、ライブラリではなく処理系に由来する奇妙な動作に遭遇した人も困るかもしれません。仕様が余すところなくドキュメント化されていれば、仕様なのかバグなのかの判断がつきます。ただ、リファレンスマニュアルでは力不足で、仕様書を読み込まなければ判断がつかないような仕様上の疑問点に度々ぶつかるようであれば、それは仕様が十分にドキュメント化されていないためではなく、仕様自体にに問題があるか言語(処理系)が十分にこなれて枯れていないのが原因だと思います。
Ruby のコンサルやサポートを業務にする場合にも困るかもしれません。つまり、Ruby を使ったソフトウェア開発や運用をしている企業に対してコンサルティングを行ったり、Ruby 処理系にバグやセキュリティホールがあったら n 営業日以内に修正するというようなサポートを行う場合です。特に後者の場合には顧客からレポートされた issue が仕様なのかバグなのかを判断する必要がありますので、仕様が十分にドキュメント化されていないと辛そうです。
一方、通常の開発を行うにあたって Ruby を利用する分には困らないのではないでしょうか。オンラインのリファレンスマニュアルや各種書籍にあたれば Ruby で何ができるか、こうするにはどうすればいいかといった情報は得られます。Ruby は開発目的の利用を対象としたドキュメントも不十分であるという指摘はありますが、利用者の増加と書籍やネット上のノウハウ蓄積の増加はリンクしていますので、必要な情報は自然と補われると思います。(るりまさぼっててすみません……)
Ruby で開発されたアプリケーションの利用者にとっては、開発言語が何であるかは重要ではないでしょう。開発の利用に耐えられなければそもそも開発言語として選ばれることはありません。広く使われているのであれば、その言語が信頼されている証です。使われるうちに叩かれて枯れていきますので、長く広く使われているのであれば信頼に足りると言えます。実感としては、オープンソースの言語においては、ちゃんと仕様化することよりも開発コミュニティや言語利用者(その言語を使う開発者)の質や量や勢いみたいなものが、その言語が「使える」かに大きく影響しているんじゃないかなあと思います。
ところで、他のプログラミング言語はきっちりした言語仕様があるのでしょうか。Javascript は ECMAScript として標準化されてますよね。Perl とか Python はどうなのかな。
無駄に長文書いて疲れました。少し続きます。
先日 m17n を調査中 と書きましたが一旦まとめてみます。間違いがありましたら訂正しますので教えてください。
CSI (Character Set Independent) 方式。テキストデータを内部文字集合に変換することなく、それぞれの文字エンコーディングのままテキスト処理を行う方式です。Java や Perl や Python などは内部文字集合に変換する UCS (Universal Charactor Set) 方式を採っています。
あと jcode.rb を捨てられます。
1.8.x では NKF ライブラリで文字エンコーディング変換が可能ですが、m17n フレームワークでも文字エンコーディング変換のインタフェイスが用意されます。ただし、当初の実装は iconv を利用したものになります。
C 言語的な文字列=バイト列モデルではなくなりますので、1.8.x とは非互換のメソッドがいくつかあります。具体的な変更点をリファレンスマニュアルのruby 1.9 feature の M17N の項から引用します。
- string[integer] が 1文字の String を返すようになりました
- string.slice(integer) が 1文字の String を返すようになりました
- ?c が 1文字の String を返すようになりました
- String#[]= が右辺の整数を受け付けなくなりました
正規表現エンジンが GNU regex matz special から Oniguruma matz special に変更されます。
スクリプト言語Rubyの拡張可能な多言語テキスト処理の実装によれば数%から10%程度遅くなる模様。
これもスクリプト言語Rubyの拡張可能な多言語テキスト処理の実装の情報ベースです。
Ruby の言語仕様は標準化すべきか は標準化というキーワードを思いついたのが最後にタイトルをつけるときだったのが敗因でした。
処理系がいろいろ増えていることと仕様の明確化というコンテキストからすると、仕様を標準化することで処理系独自の拡張に縛りをかけるべきではないかという話ですね。
Ruby の言語仕様はあまり変えないべきか と同じ結論で、フットワークが重くなるのであれば標準化はしなくていいと思います(してもいいけど matz ruby はきっと標準仕様から外れていくんじゃないかなと思います(笑 )。
執筆者、編集者のみなさんいつもありがとうございます。
後ですべて読む。
技術系の雑誌は読むのを止めてしまったので、マンガを除くと読んでいる雑誌はネットも含めてるびまと SF マガジンだけになりました(ネットマガジンでは en を読んでましたが休刊してしまった)。ブログの流行に伴う RSS の普及と RSS リーダの活用で、すっかり目の前に流れてくる情報を次々に処理していくスタイルになったため、ネット上のページというか文章との付き合いが非常に刹那的になってしまったなあと思います。サイトを一通り読むんじゃなくてブックマークされている記事だけ見て立ち去るとか。それに、ちょっと長い文章があると「後で読む」としたくなるのはこらえ性がないですね。
数日かけてゆっくり楽しめる「るびま」は私にとって貴重な存在です。頭から順番に読んだり、興味のある記事を先に読んだり、その時々によって適当ですが、毎号隅から隅まで目を通しています。
ところで、他のプログラミング言語はきっちりした言語仕様があるのでしょうか。Javascript は ECMAScript として標準化されてますよね。Perl とか Python はどうなのかな。
と書いたら教えていただきました。
TokuLog 改め Perl を極めて結婚するブログ - Ruby についてとかなんとか
Python の場合、とりあえず言語仕様は http://docs.python.org/ref/ref.html にありますね。
経験上、互換性のある処理系を作る際にはここにある情報で間に合うはづ。
あーなるほど。Lexical analysis では Ruby では慣習的にわかるでしょと書いていないことも事細かに記されていますね。他の章も項目的には Ruby のリファレンスも同じものがありますが、それぞれ詳細なのが Python 的なのかなあ。
Ruby の構文解析が非常に難しいというのは良く聞きますね。Ruby プログラミングを書く分には困らないので白鳥のバタ足ですね。難攻不落の parse.y に挑める人間だけが Ruby の真髄に近づける……ということで処理系の開発に参加できる人の障壁なっていたりしたら損しているのかも(逆に優秀な人だけ触れるという考えもあるか)。
Perl5 の処理系が一つしかなくて Python の処理系がいろいろある理由はなんだろう。ドキュメントあるなしだけでなくコミュニティの気質なども影響していそう。
個人的な愚痴を一つ。すみません。
このまま今の仕事を続けてていいのかと良く考えます。単純にやりたいことを言ってしまえばプログラミングなわけですが、入社以来運用ツール以外のプログラムは書いてません。じゃあ、プログラミングしてなくてまったくつまらなかったかといえばそうでもなく。バグを見つけて直したりするのが結構好きだということがわかったし、(ウェブサービスとしては)大規模なサービスを運用するに伴って得た知識や技術も少なくありません。
でも、同じサービスの運用とユーザサポートと調整ばかりしているのも飽きてきます。それと、社内の他の技術者から技術的な刺激を受けるということがあんまりないんですね。まあ、分野によっては濃い人はいます。あと自分は非コミュなんで自分から付き合いを広げたりしないため気付かないだけで、実は濃い人が多いのかもしれないのですが。同じ部の後輩に技術のセンスのある人がいるのですが、現状としては彼とやりとりするくらいでしょうか。
で、もうちょっと楽しく過ごすために、社内の有志で集まって何かしようかなあとしているところ。社内の技術者を盛り上げて楽しくしたいですね。それと優秀な技術者が入ってくるような雰囲気にしたい。が、そこまで今の会社でがんばる気になるかが問題ですね。やりがいがない気がしてなりません。
先週の redMine trunk の気になる変更点をチェックです。r529-r537 が対象です。フォーラム機能が新しく追加されたのが大きな変更点です。
プロジェクトごとにフォーラムを作成できるようになりました。複数のフォーラムを作成できます。ただし、機能はまだ最低限です。トピックを作って返信ができるというくらいですね。
フォーラムにウォッチ機能が追加されました。新しい投稿があった場合にメール通知されます。
フォーラムのメッセージが検索できるようになりました。
左サイドメニューの「マイプロジェクト」がなくなりました。代わりにトップメニューの「プロジェクト」のドロップダウンメニューに自分が参加しているプロジェクトが表示されるようになりました。
「バージョン」を日付なしでも作成できるようになりました。
Ruby Inside より 3 Fresh Presentations from RailsConf 2007
アメリカはオレゴン州ポートランドで RailsConf 2007 が行われていました。Ruby Inside でその RailsConf 2007 のプレゼンを 3 つ紹介していますので、右から左に流します。
Scaling a Rails Application from the Bottom Up は、最近 Joyent Slingshot を公開した Joyent の CTO のプレゼン。スケーリングといっても「Rails とデータベース……」という話ではなく、Joyent での例を元にして、コストとパフォーマンスを考えたサーバの物理構成やネットワーク構成を 実際の製品名を挙げつつ紹介しています。その後 L7、DNS、Memcached……と段々とアプリレベルまで降りてきて説明。参考になります。
Angels & Daemons は、Ruby でのデーモンプロセスの作り方。LDAP から ActiveRecord (とその裏のデータベース)へのゲートウェイという実例から説明しています。Rails の実行環境を引き継いだデーモンの作り方というのははじめて見たかも。
Harnessing Capistrano は、Capistrano のチュートリアルです。Capistrano がどういうことに使えるのか、インストール方法、タスクの書き方、Capistrano 2.0 の紹介などなど。まとまった Capistrano の資料では一番詳しいかも知れません。
memcache-client はいわずと知れた memcached の Ruby 版クライアントライブラリです。Ruby から memcached にデータを格納/取り出しができます。
FeedTools::Cache::Memcached を作るにあたって memcache-client の使い方を調べましたのでメモします。あまり突っ込んだことは書きません。ただの備忘録です(書くと憶える)。
# emerge memcached
libevent-1.3a と memcached-1.2.1 でした。1.2.2 はりリースされたばかりですしね。ちなみに USE=perl していると Cache::Memcached もインストールされます。後は設定ファイルを修正して起動です。
# vi /etc/conf.d/memcached # LISTENON を設定 # /etc/init.d/memcached start
# gem install memcache-client
gem でインストールします。gem は楽で良いですね。ところで、gem ってインストールした数が増えるほど require_gem に時間がかかるようになる気がしますが気のせいですかね……
一番単純な利用法は、接続先のホストとポートを指定して MemCache.new することです。あとはハッシュのように値の設定/取得できます。
require 'rubygems'
require 'memcache'
cache = MemCache.new('localhost:11211')
cache['number'] = 1234
cache['string'] = 'foo'
cache['array'] = [1, 2, 3]
cache['hash'] = { 1 => 'foo', 2 => 'bar' }
p cache['number'] #=> 1234
p cache['string'] #=> "foo"
p cache['array'] #=> [1, 2, 3]
p cache['hash'] #=> {1=>"foo", 2=>"bar"}
内部で格納するオブジェクトを Marshal していますので、Marshal できる任意のオブジェクトを格納できます。ですので、
require 'rubygems'
require 'memcache'
cache = MemCache.new('localhost:11211')
cache['file'] = File.open('/etc/hosts') #=> TypeError: can't dump File
のように IO とそのサブクラスなどはキャッシュできません。また、Ruby 以外の言語とキャッシュデータを共有するのも難しいと思います。
memcached にデータがあることを確かめるため、値の取得だけを試してみます。
require 'rubygems'
require 'memcache'
cache = MemCache.new('localhost:11211')
p cache['number'] #=> 1234
Ruby のプロセスは別ですが、データをちゃんと取り出せました。
キーは事実上 String しか利用できません。String#length を使ったり、String#crc32_ITU_T を定義しているためです。多少いじれば Symbol を使うようにすることもできるでしょう。
require 'rubygems'
require 'memcache'
cache = MemCache.new('localhost:11211')
cache[ [1, 2, 3] ] = 'foo'
p cache[ [1, 2, 3] ] #=> "foo"
と Array を受け付けちゃったりしますが、ハッシュ値を計算しているロジックが String 前提のようなので、Array を使うと衝突しそうです。String だけ使いましょう。
memcached はデーモンを複数並べて大きなメモリ壁にして使ったり、namespace を設定することで複数のアプリから利用したりと、使い出があるソフトですがとりあえず memcache-client の基本的な使い方としてはこれまで。
Javaの父、Java以外の開発言語を語る − @ITより。
一部のスクリプティング言語にも、メソッド呼び出しに関して改善すべき問題があります。われわれは現在、PythonとRubyでメソッドのディスパッチを高速化するためにバイトコードを追加するプロジェクトを進めています。
へー。これ以外にもゴスリングが Ruby と Rails についての質問に答えていて、そんな時代になったのだなあと Ruby 愛好家としては感慨深いです。
Rubyで毎月っていう処理をするのって、何かいい方法ないのかね。
理想を言えば
from_month..to_month.each{|month| ... }とか書きたいところだけど、日付の基準がわからないから難しいよね。
後先考えないやり方としては、Date#succ を再定義するのが簡単です。
require 'date'
class Date
alias :_succ :succ
def succ
self >> 1
end
end
from_month = Date.new(2007, 02)
to_month = Date.new(2007, 05)
from_month..to_month.to_a.reverse.each{|i| puts i}
#=> 2007-05-01
2007-04-01
2007-03-01
2007-02-01
もっとスマートな方法がきっとあります。
と思いました。言語によって使う単語に偏りがあるとか、その偏りの近さで言語同士の生まれ育ちの近さがわかるとか、一文字変数で一番良く使われているのはやはり i だけど時代によって浮き沈みがあったりだとか、あるクラスとあるクラスは一緒に使われることが多いとか、分かったりすると何となく楽しい。↓の記事を読んで。
現在、独立行政法人 国立国語研究所は明治から現代にいたる日本語を電子化して公開する「KOTONOHA計画」を推進している。その一環として現代日本語の書き言葉を集める『現代日本語書き言葉均衡コーパス』を2006年にスタート。完成は2011年を予定しているが、完成時に約1億語となるコーパスの一部分、約1000万語分のデータのインターネット上での試験公開を、5月28日に開始した。一般公開されるのは単純な全文検索だけが可能なWebページだが、学術利用や商用利用に対してはXMLでマークアップされたコーパスも有償で提供していく。
国立国語研究所が大規模コーパスを試験公開
先週の redMine trunk の気になる変更点をチェックです。r538-r552 が対象です。ウィークデーはあまり動きがありませんでしたが土日に大量のコミットがありました。プロジェクトのアーカイブ機能の追加が大きな変更点です。
wiki ページを削除できるようになりました。データベースからごっそり削除されるみたいです。
wiki ページにファイルをアップロードできるようになりました。textile の画像タグで画像のインライン表示もできるとのこと。
アカウント作成時にアカウント情報をメール通知してくれるようになりました。
プロジェクトのアーカイブ機能が追加されました。アーカイブ化するとデータは残っているものの、削除されたのとほとんど同じ状態になります。つまり、データの参照や操作が一切できなくなります。もう使うことはおそらくないけれど削除はしないで取っておきたい、という用途でしょうかね。一度アーカイブ化したプロジェクトを戻すこともできます。
最近のコメント:
RSS
![]()
This work is licensed under a
Creative Commons License
(note: text only. w/o web design, citations, (re)distributed softwares).
_ yokoyamen [このエスプリは画期的!]