本日は出雲支部訪問。今月のお話のテーマは「奉仕」。
要旨は以下の通り。
教会ではいろいろな形で奉仕が求められるが、ときどき難しいことがある。 最大の難関は「利己心」である。 利己心とは漢字では「自分の利を求める心」だが、 実際には「自分の利だけを求める心」あるいは 「他人の利をうとましく思う気持ち」である。 しかし、利己心を抑えて奉仕する時、win-winの関係が成立し、 (すごく)長い目で見ると自分にも祝福がある。
使った聖句
引用したことわざ
さて、上記の話の構造はオープンソースにもあてはまる。 つまり利己心(あるいはエゴ)を抑えてオープンにすると長い目で見ると得するという構図だ。
しかし、私自身はオープンソース活動をあまり「奉仕」であるとは捉えていない。 また、そうであるとも言うつもりはない。
理由はいくつかあって、
「オープンソース」という単語は暗黙にビジネスに結びついている。 だから「奉仕」のようなビジネスに結びつきにくいものとは距離を置いた方が望ましいような気がする、 イメージ戦略として。
というわけで、ことわざだけを再掲しよう。
ITmediaライフスタイルのIntelの著作権政策責任者に対するインタビューから。 DRMの必要性うんぬんは取り合えず置いておいて、 「なぜ戦わないのか」という彼らの言葉に完全に同意する。
以前にも書いたが、 すべての番組をコピーワンスなんてのはコンテンツ屋の横暴だ。 動機は分からないでもないが、ユーザ利便性のことなんて何も考えていない。 DRMを提供する側から「なぜ戦わないのか」と言われるってのはどうかしてるとしか言いようがない。
では、私は声をあげ、コピーワンスには近づかないと宣言することで戦おう。 それはたとえ微力に過ぎなくても。
私自身はそんなにテレビも見ないし、音楽もそれほどは聴かない。だから、 コンテンツ屋が目先のコピー防止にとらわれて、 将来自分の首を絞めても、日本のコンテンツ産業が衰退しても、 私は知ったこっちゃない、と知らんぷりを決め込むこともできるかもしれない。 でも、一度失った自由を取り返すのがどんなに大変か、 そして一部の自由を失うとそれが他にも波及するのが想像できるから、 なにかをしたいという気持ちになる。
有効な対策が思いつかず、暗い気持ちになるのを抑えつつ。
飛行機に乗って東京へ移動。VA Linuxビジネスフォーラム2005に出席するためだ。
のんびり移動していたら最初の方の話は聞けずに、MySQLの話から。
ずっと聞いていたのだけど、テクニカルな話はマーケッティング色が強くてそれほど面白くなかった。 一番面白かったのは、「UFJ銀行のオープンプラットフォーム戦略とLinuxへの取組み」というお話。 最初から最後まで「本気で使うユーザの視点」を押し通していてすがすがしい。 普段、あまり聞くことのない視点だったので目新しかった。
ITmeaidにレポートがある。
その後、懇親会に紛れ込む。おいしいものをほおばりながら、 原稿で御世話になっている人を始めとするITメディア関係者と御挨拶。 上記のレポートを書いた西尾さんが高校の後輩であることも判明。 世間は狭い。
最近、文章ばかり書いていてライターに成り下がっている。 いや、大事な収入源なのだが、でもプログラミングの方が圧倒的に楽しいのに、 全然時間が取れないのだ。
いやいや、時間が取れないのは作らないからだ。 そこで決心した。これから当分1日1ハックを目指そう。
とりあえず今日は、先日レポートがあったRubyのBignumにビット演算のバグがある点について。 どうやら、2の補数表現への変換でoverflowの扱いに間違いがあったようだ。 分かる人には自明なのだろうが、数の扱いが苦手なので、 懇切丁寧に解説したメールをいただいてはじめて理解できたという。
ということは、以前このバグを直そうとしてごちゃごちゃやったのは全て無駄だったということかな。 数学バカがBignumを処理しようというのがそもそも間違いか。
[ruby-talk:197946]で公開されたRubyでUnicodeを扱うライブラリ。
ダウンロードは<URL:ftp://ftp.mars.org/pub/ruby/Unicode.tar.bz2>から。
使い方はこんな感じ。
Unicode strings can be obtained by applying the + unary operator to native strings, e.g. +"Hello" (where the native string is encoded in the default encoding).
% irb -I. -runicode -Ku irb(main):001:0> ustr = +"π is pi" => +"π is pi"
Native strings are obtained from Unicode strings by calling to_s, which accepts an optional argument to indicate the desired encoding.
irb(main):002:0> str = ustr.to_s => "π is pi" irb(main):003:0> str.encoding => Unicode::Encoding::UTF8
Individual characters can be indexed from Unicode strings, returning a Unicode::Character object.
irb(main):004:0> ustr[0] => U+03C0 GREEK SMALL LETTER PI
Case conversion is handled as with native strings.
irb(main):005:0> ustr.upcase => +"Π IS PI"
Normalization is accomplished with the ~ unary operator.
irb(main):006:0> ustr = +"m,Am" => +"m,Am" irb(main):007:0> ustr.to_a => [U+006D LATIN SMALL LETTER M, U+00ED LATIN SMALL LETTER I WITH ACUTE] irb(main):008:0> (~ustr).each_char { |ch| p ch } U+006D LATIN SMALL LETTER M U+0069 LATIN SMALL LETTER I U+0301 COMBINING ACUTE ACCENT => +"m,Am"
実に面白い。
Ruby M17Nは、複数のエンコーディングを(できるだけ)変換なしで処理するのを主眼にした デザインになっているのだが、Cのlocaleモデルのような、 1プログラム1エンコーディングのようなケースはともかく、 複数エンコーディングが混在する場合には、 結局は統一的な内部文字集合(Universal Character Set - UCS)に変換して 処理する必要があるかな、と考えてきた。
というか、変換まわりにはあまり気を使ってこなかったというのが実情だ。 この辺が、「基本はUnicodeへの変換」という他の言語(PerlとかPythonとか)との違いだ。
とはいえ、実用のためには、どこかで変換は必要なわけで、 それはきっとIOで行うに違いないと考えてきた。
しかし、自動変換(coercing)を強く勧める意見が出た。[ruby-talk:198475]
自動変換は
などの理由で敬遠してきたのだけど、 今回の提案はちょっと具体的。
# # NOTES: # a) String#recode!(new_encoding) replaces current # internal byte representation with new byte sequence, # that is recoded current. must raise IncompatibleCharError, if # can't convert char to destination encoding # b) downgrading string from some stated encoding to "none" tag must # be done only explicitly. # it is not an option for implicit conversion # c) $APPLICATION_UNIVERSAL_ENCODING is a global var, allowed to be # set once and only once per application run. # Intent: we want all strings which aren't raw bytes to be in one # single predefined encoding, # so all operations on string must return string in conformant encoding. # Desired encoding is value of $APPLICATION_UNIVERSAL_ENCODING. # If $APPLICATION_UNIVERSAL_ENCODING is nil, we go in "democracy # mode", see below. # def coerce_encodings(str1, str2) enc1 = str1.encoding enc2 = str2.encoding # simple case, same encodings, will return fast in most cases return if enc1 == enc2 # another simple but rare case, totally incompatible encodings, as # they represent incompatible charsets if fully_incompatible_charsets?(enc1, enc2) raise(IncompatibleCharError, "incompatible charsets %s and %s", enc1, enc2) end # uncertainity, handling "none" and preset encoding if enc1 == "none" || enc2 == "none" raise(UnknownIntentEncodingError, "can't implicitly coerce encodings %s and %s, use explicit conversion", enc1, enc2) end # Tirany mode: # we want all strings which aren't raw bytes to be in one single # predefined encoding if $APPLICATION_UNIVERSAL_ENCODING str1.recode!($APPLICATION_UNIVERSAL_ENCODING) str2.recode!($APPLICATION_UNIVERSAL_ENCODING) return end # Democracy mode: # first try to perform non-loss conversion from one encoding to another: # 1) direct conversion, without loss, to another encoding, e.g. UTF8 + UTF16 if exists_direct_non_loss_conversion?(enc1, enc2) if exists_direct_non_loss_conversion?(enc2, enc1) # performance hint if both available if str1.byte_length < str2.byte_length str1.recode!(enc2) else str2.recode!(enc1) end else str1.recode!(enc2) end return end if exists_direct_non_loss_conversion?(enc2, enc1) str2.recode!(enc1) return end # 2) non-loss conversion to superset # (I see no reason to raise exception on KOI8R + CP1251, # returning string in Unicode will be OK) if superset_encoding = find_superset_non_loss_conversion?(enc1, enc2) str1.recode!(superset_encoding) str2.recode!(superset_encoding) return end # A case for incomplete compatibility: # Check if subset of enc1 is also subset of enc2, # so some strings in enc1 can be safely recoded to enc2, # e.g. two pure ASCII strings, whatever ASCII-compatible encoding # they have if exists_partial_loss_conversion?(enc1, enc2) if exists_partial_loss_conversion?(enc2, enc1) # performance hint if both available if str1.byte_length < str2.byte_length str1.recode!(enc2) else str2.recode!(enc1) end else str1.recode!(enc2) end return end # the last thing we can try str2.recode!(enc1) end
うーん、面白い(こればっかり)。
確かに通常のアプリケーションモデルは
が、ほとんどだと思うので、それを考えるとこの辺ってのはそんなに悪くないのかも。 ただ、文字列の中身がいつの間にかすりかわるのはちょっと恐い。
楽天技術研究所フェローとしての初仕事としての ミーティング出席のために上京。 なんか毎日飛行機に乗ってるな。
マイルは溜まるが、疲れる。
で、せっかくの機会なのでささだくんのところに寄って打ち合わせ。 そしたら、akrさんもいて、たくさん有益な意見をいただいた。 おかげでブロックパラメータなどいくつか放置されていたところの 細かいところが決まった(と思う)。
研究所スタッフとの挨拶から始まって かなり突っ込んだ研究テーマまで。 現時点ではまだ妄想レベルだが、 リソース(時間・人・お金)を突っ込めば実現性は高いと思う。
内容は(現時点では)公開できないが、 成果はオープンソースにするという言質は取りつけた。
PFIの人たちが「頭良さそう」なのは認めるけど、 それを示すのに「彼らは皆、東大・京大、および同大大学院の現役学生、もしくは卒業生」 という表現のを使うこの記事は「頭悪そう」。
Emacsテクニック。
さすがにEmacs歴20年近いと、知らないテクニックはほとんどなかった。 とはいえ、じゃあ、なんでも知ってるかと言うとそうはいかないのが Emacsの恐ろしいところだが。
最近だと
を「発見」した。
米子でステーク大会。 今回は2年に一度の衛星放送によるカンファレンス。
でも、くたびれててあんまり集中力が維持できなかった。 猛省。
弟の新居で親戚が集まろうか、という話をしていたのだが、 次女が風邪を引いたため、うちは断念。残念。