トップ 最新 追記

日々の破片

Subscribe with livedoor Reader
著作一覧

2007-08-01

_ 梅雨

8月になったけど、まだ梅雨明けしてないらしい。

_ ひさびさに無駄に時間を潰す

予期した動作をしない。

・本当に予期した動作ではないかをテストプログラムで確認

・再現しないことをテストプログラムを作って確認

・従来からの良くある実行時のバグパターンでの検証

とかを延々とやったあとに、ふと気付き、

ls $FOO_ROOT/bar.properties

があることを確認した後に

cd $FOOLIB

for i in `ls *.jar` do echo $i; jar -tvf $i | grep bar;done

して、がーん、これか!

となって、jarを作りなおして、しかしやはりうまく行かずに……

と過ごした最後に、良く考えたらbar.propertiesではなくbarden.propertiesだと気づいたという罠。jarのgrepの時、気付かなかったのが敗因ではある。

というか、最初に、リソースバンドルをかっちりと確認すりゃよいのに、いきなりソースを眺めてテストを回すところが間違いの元。


2007-08-02

_ OpenBlockSって速かったのかな

雷にやられたOpenBlockSの代わりとして、一応、アライドテレシスを信頼しているのでコレガを買った。スィッチとしても4ポート付いてるから、そのうち全部、これにまとめてしまおうかと思ったり。

corega CG-BARSX 有線LANブロードバンドルータ

しかし、なんとなく体感だけど、ルータを変えたら遅くなったような気がする(というプラシーボの可能性もあるわけだが)。特にDNSの中継。発売時期が最近っぽいから速くなるんじゃないかと期待したのだが、価格が1/8程度なんでこんなもんなのか?

(と思うと、交換されたケーブルモデムのほうに原因があったり。三星からNECだからなぁ)

_ ダックタイピング

なんできちんとインターフェース継承しないのかと疑問に感じたが、ダックタイピングもできるというアピールなのかな?


2007-08-03

_ JRuby on Rails

翔泳社さんから本が届いたので、開けるとJRuby on Railsという星空の表紙の本が2冊。

韓国で、

かんたんRuby on RailsでWebアプリケーション開発(arton)

を翻案して出版するという話は聞いていたけど、いつの間にかJRubyになったらしい。

というか、ハングルはまったく読めないのでリストとキャプチャを眺めると、なんとなく同じところもあるような、まったく別物のような。叩き台にはなっているようではあるので、ちょっと(著者の責任感としては)一安心ではあるし、なんとなく嬉しいような不思議な気分ではある。

それにしても共著者(というか、翻案者というか)の名前がまったく読めないのは妙な気分。

あと、JRubyになったせいでRuby-GetTextが抜け落ちているのが残念な感じ。それにDRYについて書いたところが、Dave ThomasではなくAndy Huntの間違いなのに、そのままなのにきづいてしまって、それはちょっと困った感じ。

というか、台湾版は漢字があるからまだ読めるけど、こっちは本当に見当がつかないな。

_ 分かち合うハックと使わせてやるハック

ストールマンとMatzは前者。ジョブズは後者。

JavaScriptやRubyは前者。Javaはほぼ後者(privateキーワードに対する態度)。

バッハは前者でベートーヴェンは後者。

折り紙は前者でレゴは後者。

散歩は前者で鉄道は後者(途中下車ができる切符は前者)。

パーソナルコンピュータは(Windowsが載っていてさえも)前者でアプライアンスは後者。帯は前者でベルト(穴が開けてあるやつ)は後者。

楽器は前者でCDは後者。

風は前者で壁は後者。道徳は(正しくは)前者で法律は(精神はともかく運用は)後者。

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

Before...

_ 通りすがります [面白いです。宗教はどっちかなあ。これも精神と運用と分けて考えないとだめかも。]

_ arton [宗教とひとくくりにすると難しいですね。運用は確かに後者っぽいけど。ただ、どちらかというと個人の精神の解放に結び付く道..]

_ 通りすがります [確かに、一度は信心深くならないと難しいですねぇ。偏見でしか語れてないかも知れない。有難うございます。]


2007-08-04

_ 鋼鉄の息子

Fortressっていうプログラミング言語を作ってる人は、CLtLの執筆者ではあるけれど、Schemeを作ったのはSussmanですね。と思いこんでたら、He is a co-creator of the Scheme programming language. なのか。

_ プログラムの書き方

PCからPCへあるサブディレクトリをまるごとコピーして、その中のプログラムを実行しようとしたらエラーになった。というのは、一緒に入っているデータファイル(ここではWindowsのiniファイルとする)が実に40個ほどあるのだが、すべてに共通するパラメータに、ドライブレターの指定があって、それがもとのPC用にD:となっているからだ。すべてを新しいPCの環境に合わせてC:にしなければならない。

さっそく、エクスプローラを起動して、最初のiniファイルをダブルクリックしてメモ帳を開いた新人のN君に対して、先輩のOさんが「ちょっと待った」と声をかけた。「君は、これから40個のファイルを修正するつもりかい?」

「もちろんですよ。だって、そうしなければ動かないじゃないですか」とN君は不思議そうにOさんの顔を見る。

「よく考えてみろよ。40個といえば、大した数だ。それをいちいち手で直していたら、直し忘れだって出てくるのじゃないか?」

「大丈夫です。エクスプローラを詳細表示モードにして更新時刻でソートすれば、直し忘れたファイルはすぐに見つかりますよ」とN君は得意そうに言う。

●手軽な検証手段が確保されている

「じゃあ、とりあえず、今開いたファイルだけ直してみなよ」とOさん。

N君は、メモ帳の「編集」メニューをクリックして「置換」を選択して、「検索する文字列」に「D:」、「置換後の文字列」に「C:」を入力して「すべて置換」を実行した。

「おいおい、『すべて置換』だと間違えて置換する心配はないのかい?」

と言うOさんに、どうしてもケチをつけたいようだな、と気づいたN君はきっぱりと、「Oさんもごぞんじでしょう。この中で:が使われているのはドライブレターの指定だけですよ。だから大丈夫でしょ。」

●機械的な操作を適用可能

「ということはだ」とOさんはにこにこしながらN君に言った。「君はエクスプローラの機能を使って、修正したかどうかを確認すると言ったね。つまり、コンピュータに作業を任せるということの意義を理解しているということだ。しかも、『すべて実行』を使って書き換えられるという条件もわかっている。いちいち人間、つまり君がD:はどこだと探して、それをC:に置き換えるなんてする必要はないってことをだ」

「もちろんです」

保存して、次のファイルを開こうとするN君を制してOさんは続けた。

「そこまで、コンピュータに作業を任せることができるなら、プログラムにやらせてみたらどうだ?」

「え? でもプログラムって難しいんじゃないですか?」

「そりゃ、難しいプログラムは難しいさ。でも、これからやろうとしていることは、そんなに難しいわけじゃない。僕らがやらなければならない作業手順をプログラムで置き換えていくだけのことだ。それに、プログラムにしておけば、次に似たような作業が必要になったとき――ご存じのように元のPCは潰してしまったけど、しばらくするとまた返されてくるからコピーバックしなきゃならない。」

「あ、つまり、元のiniファイルも保存しておかなきゃだめですね」

と、N君は気づいて、originalという名前のフォルダをエクスプローラを操作して作り始めた。そのリアクションの素早さを嬉しそうに眺めながらOさんは続けた。

「それはひとつの方法だよね。でも、作業を逆に実行してもすむよね。つまり、コピーして、C:をD:に変えるということだ」

「でも、それはめんどうですよ」

と、N君は、元のフォルダーのiniファイルを全部選択して、originaloへ右クリック−ドラッグ−ドロップしてコンテキストメニューから「コピー」を選んだ。

「でも、君は、今、まさにそれをしようとしてるじゃないか」

「だって、それはしょうがないじゃないですか」

「だから、その作業をプログラムにしようということだ。というか、すでにoriginalフォルダにoriginalじゃないファイルが紛れているわけだが……」

「でした」といって、N君は更新日時でソートしてダブルクリックしてメモ帳でオープンして編集メニューから……

「ああ、なるほど」と、N君。「なんとなく、Oさんの言ってることがわかりました」

#こういう文章って、なんかめんどうだな。

_ プログラムの書き方(2)

「じゃあ、プログラムを書こう。まず、エクスプローラからコマンドヒアで、このディレクトリにコンソールを開いて……ねぇ。インストールされてねぇ」とOさん。

「なんですか、それ?」とN君。

#ここで、Oさんがめんどうになって帰ってしまうという展開にすると楽だな。

_ プログラムの書き方(3)

ぶつぶつ言いながら、Oさんはコマンドプロンプトを開くと、cd [スペース] と打ち込んでから、エクスプローラのアドレスバーの文字列をドラッグするとコマンドプロンプトへドロップした。

「だー、Vistaか!」

何も起きないので、Oさんは呪詛をまきちらした。

「シフト右クリックで、パスとしてコピーですよ」と助け舟を出すN君。

_ プログラムの書き方(4)

Oさんはコマンドプロンプトで、notepad drivechange.rbと打ち込んだ。そんなファイルは無いから作るかというメモ帳に、OKをクリックしておもむろに、説明を始めた。

「最初に、こう書く」

#!/usr/local/bin/ruby -Ks

「Oさん、これ、Unixマシンじゃないですよ」と頭大丈夫か、と言わんばかりのN君。

「そりゃそうだが、Rubyがシーバン行を参照して、rubyが起動される設定ならば、オプションを読むっていう仕様なんだから、しょうがないのだ。-Ks ってのは、シフトJISを使うよ、という指定。もっとも、この中には出てこないとは思うけどね。とりあえず、やっとく」

「ああ、よくプログラミング言語入門に出てくる、『おまじない』というばかな言い回しで示される決まりのことですね」と、N君は辛辣だ。

「確かに、ばかな言い回しだとは思うが、こんなあたりまえのことを説明するのはくそめんどうだから、しょうがないってことが良くわかったよ」とOさん。

「まあ、それはそれとして、手順を考えてみよう。人間がやる場合には、エクスプローラから拡張子がiniのファイルを順番にダブルクリックして処理していくことになるよね」と言いながらOさんは次のリストを打ち込んだ。

Dir.open('.').each do |file|
 next unless /\.ini\Z/i =~ file
  p file
end

保存して、コマンドプロンプトで、「ruby drivechange.rb」と打ち込む。すると、コンソールに拡張子がiniのファイルが""付きで出力された。

「pってのは、デバッグ用の出力処理だけど、見ての通り、これで拡張子がiniのファイルだけを処理できる仕組みができたのはわかるかい?」

「結果はわかるけど、全然、意味はわかりません。Dirってなんですか、openってなんですか、かっこはなんですか?」とN君。

「いちいち説明していると面倒だから、おまじないだ。でもDirってなにかとか、openってなにかとか、薄々はわかってるんだろ」とOさん。

「まあ、確かに。nextもわかるかな。でもunlessと次の/とか=~とかはまったくわかりません」

「それは宿題」とあっさり先へ進むOさん。

Dir.open('.').each do |file|
  next unless /\.ini\Z/i =~ file
  File.open('tmpfile', 'w') do |d|
    s = File.open(file, 'r')
    d.write s.read.gsub(/d:/i, 'C:')
    s.close
  end
end

「これで、tmpfileっていういい加減な名前の中間ファイルを書き込みモードで開いてから、iniファイルの1つから読み込んだ内容のd:をc:に書き換えたものを書きだしてるわけだ。だから、実行すると、最後のiniファイルの内容から置き換えができたtmpfileっていうファイルが残る」と、Oさんははしょった説明をしながら、コマンドプロンプトに「ruby drivechange.rb」と打ち込んだ。「tmpfileができてるはずだから、確認してくれ」

N君は言われるままに、エクスプローラからできたてのtmpfileを……「ダブルクリックできないですよ。せめて、tmpfile.ini……とやるともしかしたら、iniファイルだからまずいことになるのかな? では、tmpfile.txtにしてくれりゃいいのに」とぶつぶつ言いながら、一覧からプログラムを選択でメモ帳を開いて中を見る。「なるほど」

「うまくいくようだから、完成させてしまう。つまり、1ファイル処理するたびに、tmpfileを元のファイルに上書きしてけば良いわけだろ」と言いながらOさんはプログラムを修正する。

require 'fileutils'
 
Dir.open('.').each do |file|
  next unless /\.ini\Z/i =~ file
  File.open('tmpfile', 'w') do |d|
    s = File.open(file, 'r')
    d.write s.read.gsub(/d:/i, 'C:')
    s.close
  end
  FileUtils.cp 'tmpfile', file
end

「で、実行だ」と、再度コマンドプロンプトから「ruby drivechange.rb」と打ち込む。

F5を押して、すべてのファイルの更新時刻が変わったのを確認したN君は、適当に開いてはファイルの中のD:がC:に置き換わったのを確認して、「ほー、こりゃ楽だ」

「で、完成」と、drivechange.rbを開いたメモ帳を閉じようとするOさんを制したN君、「あと1行追加したいな」と、言いながら

require 'fileutils'
 
Dir.open('.').each do |file|
  next unless /\.ini\Z/i =~ file
  File.open('tmpfile', 'w') do |d|
    s = File.open(file, 'r')
    d.write s.read.gsub(/d:/i, 'C:')
    s.close
  end
  FileUtils.cp 'tmpfile', file
end
FileUtils.rm 'tmpfile'

「なんだ、知ってるじゃん」とOさん。

「いや、知りませんが、cpでコピーできるなら、rmでリムーブできるのかと思って」と言いながらN君もコマンドプロンプトから「ruby changedrive.rb」と打ち込んだ。それからエクスプローラをF5して、tmpfileがなくなったことを確認して、「で、お勧めは?」。

「とりあえず、File、FileUtils、Dir、String、正規表現、あとは制御構造と演算子を覚えりゃいいんじゃないかなぁ。オンラインリファレンスがあるはずだから、適当に検索して探したら」と言いながら立ち去ろうとするOさん。実は、考えていたよりも時間がかかったので、N君に人間プログラムをさせればよかったかな、と少し後悔してたりして。

「で、まとめると」とN君。「機械的な作業だな、と気づいたら、作業手順を考えて、それを外側から順番にプログラムとして記述していく、ということですね。それにくわえて、破壊的な作業をする前に、本当にその時点までのプログラムが予期した動作をするか確認する、と」

「まあ、そうかな」

「で、とりあえず、このプログラムで使ってるものを調べる。つまり、ファイル操作、選択、文字列(という用語をなぜか知っている)、正規表現」

「まあ、そうだな」

たのしいRuby 第2版 Rubyではじめる気軽なプログラミング(高橋 征義/後藤 裕蔵)
本日のツッコミ(全4件) [ツッコミを入れる]

Before...

_ rubyco [fileutilsではなくpathnameを最初から使うというほうがよいのでは、と思いましたがいかがでしょう。]

_ arton [>N君の洞察力 願望が入ってますよね。 >pathname fileutilsのとりあえずの楽さというか。N君はUN..]

_ arton [とか言わずにpathname使うように変えてみますね。(後で)]


2007-08-05

_ プログラムの書き方(5)

(書き方(4)の続き)

N君が、Oさんが書いたプログラムを調べていると、Rさんが通りかかった。 「ふーん、Dirをopenして全ファイルなめてるけど、globしたほうがいいなぁ。それにどうせreadするんだから、Pathname使うほうがもっといいかも」と言うと、ささっと修正。

require 'pathname'
require 'fileutils'
 
Pathname.glob('*.ini').each do |file|
  File.open('tmpfile', 'w') do |d|
    d.write file.read.gsub(/d:/i, 'C:')
  end
  FileUtils.cp 'tmpfile', file.to_s
end
FileUtils.rm 'tmpfile'

そこで、ふとN君は疑問に思ったことを聞いてみた。

「一回、tmpfileっていうファイルに書き出してますが、これiniファイルの中身を全部読んでますよね。なぜ、そのまま元のファイルを削除してから書いたり、いきなり上書きしないんですか?」

「多分、Oさんは、最初、tmpfileの内容を確認させたんじゃない?」とRさん。

「ああ、そうでした。」

「いきなり、iniファイルそのものを更新する前に、確認できるようにしたんだと思うわ。あと、可能性としては、途中でプログラムが死んだ場合に、処理中のiniファイルかtmpfileのどちらか一方は残るようにしたかったんだと思う。Oさんはガチ好きだから。……もちろん、こうやってもいいんだけど」

require 'pathname'
 
Pathname.glob('*.ini').each do |file|
  contents = file.read.gsub(/d:/i, 'C:')
  file.open('w') do |d|
    d.write contents
  end
end

Rさんは、また、ささっと直して、行ってしまった。

「ふーん、僕はこっちのほうが短くて好きだな」とN君は思った。それに作業手順をプログラム化するっていうんなら、きっとこっちのほうが近いんじゃないかな、と考えた。すると待てよ……

require 'pathname'
 
Pathname.glob('*.ini').each do |file|
  file.open('w') do |d|
    d.write file.read.gsub(/d:/i, 'C:')
  end
end

「このほうが、もっと良さそうだ」と直して実行してみた。

それから、エクスプローラでF5を押して、一瞬、まっさおになったが、originalフォルダのことを思い出して胸をなでおろすのであった。

教訓:破壊的操作を伴うプログラムを作る場合には、バックアップを取って置くこと。

require 'pathname'
require 'fileutils'
  
Pathname.glob('*.ini').each do |file|
  FileUtils.cp file.to_s, "#{file.to_s}.bak"
 
  contents = file.read.gsub(/d:/i, 'C:')
  file.open('w') do |d|
    d.write contents
  end
end

_ LL魂(1)

Essentials of Constraint Programming (Cognitive Technologies)(Thom Fruehwirth/Slim Abdennadher)(メモ) declarative(追記:deしかちゃんと覚えてなかったので後で引っ張り出すとき間違ったらしい。酒井さんのところを見て修正:)denotational semanticsという言葉がまったくわからなかったのでakrさんに教えてもらう。が、そもそもどういう文脈で和田先生がその言葉を使ったのかがわからなくなってしまったので、はいそれまでよ。

_ LL魂(2)

Ioの発表がやたらめたらと面白かったのだが、RubyでああいうDSLを書けるか、という話を昼飯食う前にゆうぞうさんや、朴さん(だと思うんだけど違ったらごめんなさい)とした。

Ioの場合、パラメータリストに現れない引数は評価されないまま、メソッドに制御が渡るので、おそらく可能なんだろう、でもRubyだと評価されるよね、というところから、でも、ローカル変数に見つからなければメソッドとしてみることになるから、「,」と「 」に気をつければどうにかなるじゃん、ということになった。

で、軽く作ってみた。HTML吐く簡単なやつ。

#!ruby -Ks
# ll.rb
require 'pg'
 
module HtmlWriter
 
  Page do
 
    h1 こんにちは
    p 今日はLL魂なので、一ツ橋ホールに来ています。
 
  end
 
end

実行すると

D:\>ruby ll.rb
<html>
  <body>
    <h1>
こんにちは
    </h1>
    <p>
今日はLL魂なので、一ツ橋ホールに来ています。
    </p>
  </body>
</html>

と、与えた文字列(ではないのは、""とか''でくくられてないし、先頭に:も付いてない)が埋め込まれる。というか、pが関数とかちあうので余分なことも必要になったのだが。

# pg.rb
module HtmlWriter
  def self.Page(&p)
    @buffer = []
    puts '<html>'
    puts '  <body>'
    yield
    puts '  </body>'
    puts '</html>'
  end
 
  def self.p(*a)
    method_missing('p', a)
  end
 
  def self.method_missing(nm, *a)
    if a.size == 0
      @buffer << nm
    else
      puts "    <#{nm}>"
      @buffer.each do |x|
        puts "#{x}"
      end
      @buffer.clear
      puts "    </#{nm}>"
    end
  end
end

追記:衝撃的なオチ

なんか突然思い出したが、マクロがパワフルなのは呼び出し(というか展開時点では)評価しないからだった。いつ評価するかってのを現実世界にマップすると、なかなかおもしろいかも知れない。プロジェクト開始時点(メソッド呼び出し時)には評価せずに、作業が必要となった瞬間(プロシージャの中で)に評価する……多分、例外がスローされそうな気がする。一方、孔明の錦嚢も、必要となった時点で評価で、しかも物語はうまく進む。

_ LL魂(3)

プレゼント当たった。というか、こぼれ球を拾えた!

で、当たったのは、これ。

入門Common Lisp―関数型4つの特徴とλ(ラムダ)計算(新納 浩幸)

目つきの悪い鳥が3羽そろったよ。

_ LL魂(4)

ふと思ったのだが、shinhさん(おもしろい)や、lethevertさん(正統派でうまい)が、COBOLとかBASICとかをLLでございますと(というか、VBじゃなくて単なるBASICはLLで良いのか)発表すると、あっというまに人気の言語になりそうな予感。

_ LL魂(5)

なんかLINQみたいなコードを見たが、あれなんだったっけな? (思い出した。JavaFXだ)

_ LL魂(6)

JRubyのマルチVM対応の仕組みを見て思ったが、絶対どこかで誰かがCILを吐く4番目のを作りそうだな。意味があるかどうかはわかんないけど。

_ LL魂(7)

もしかしてコンパイラー。

variable or method not found : prnt もしかして print ? (y/n/a/c)

y……直してくれる(ソースも)

n……EDITOR環境変数の内容が起動されるだろうな。

a……abortする。

c……エラーはエラーとして続行(commonな動作)

ちょっと待てよ? VB8って既にもしかしてコンパイラーの実装になってるような。

_ LL魂(8)

Mac率はそれほど高くなく、意外とVista率が高かったように見えた。(DirectXが実はMacってのもあったな)

_ LL魂(9)

フォボナッチ数列ミュージックがすごく気に入る。あれも+40とか手を入れてるわけで、多分、クセナキスとか知らずにクセナキスしてるんだろうなぁ。

#偶然性を音にする過程で人間によって修正を入れる。人の意思が含まれなければそれは音楽ではない。

音楽と建築(ヤニス・クセナキス/高橋 悠治)(考えたら、おれのバイブルの1つだな)

Eonta / Metastasis / Pithoprakta(Iannis Xenakis/Konstantin Simonovic/Maurice Le Roux/Paris Contemporary Music Instrumental Ensemble/French Radio National Orchestra)

メタスタシスとかまた聴きたくなったので(LPしか持ってない)買う。指揮のル・ルーは、トリュフォーの映画に音楽を提供したりもしてるね。

_ LL魂(10)

ちなみに私にとってのベストはid:amachangのHTML+JavaScriptプレゼンだなぁ。

その一方で、たださん(らしい)の質問はおもしろい点を突いていると思った。というか、わき道にそれることができるプレゼン(RubyKaigiのときのサイロスさんの)とか、keisukenさんの3D空間を(多分)移動できるプレゼン(可能性の提示のみ)と同じように、Googleマップのようなプレゼン(2次元だけど動き回れる。リンクをうまくそこら中に残しておく。すごろくみたいなもので、ある程度までは事前に仕込んでおいても良いかも。反応がよければ3N4E進むとか、1S2Wへ進むとか、3移動前に戻るとか)とかも簡単にできそうだなぁとか。

というような後から考えたことより前に、amachangのプレゼンのインデックス画面がものすごく衝撃的だった(なぜだろうか? おそらく機能的なものではなく視覚的なものらしい)。和田先生のポストスクリプトファイル群もそうだけど。というか、akrさんとかが普通ポストスクリプトを手で書くのは当たり前みたいな話をしてるのを聞いて、まあ、そういう文化圏もあるんだろうなぁとか思ったり。

_ LL魂(11)

シーモアパパートは聴衆のハートを鷲掴みを読んで、Xtalのid:xtalcoさんがあのプレゼンのリズムの取り方を前日に練習している姿を想像して、やはりそれは無理ではないか、と打ち消してみたり。まじで、ノリから外国の人かと思った。たとえば、ジェームズブラウンとか。

ベンチマークが勝つと嬉しそうで負けると悔しそうなのが、見てていい感じだった。

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

Before...

_ arton [それなんてアバターと脊髄反射したものの、プレゼンというものがプレゼンテーターの発見をオーディエンスに追体験させるもの..]

_ あろは [declarative semantics (宣言的意味論) は,わりと Logic Programming の方面..]

_ arton [それ違うんじゃない? って指摘して欲しかったです。(operational semanticsとakrさんが対比させ..]


2007-08-06

_ LL魂(総括)

単純にショーとして見てておもしろいってのもあるわけだが(少なくてもおれはそうなんだけど)、本当の価値がどのへんにあるか、ちょっとだけ考えてみる。

すると、それは刺激ということにつきるんじゃないかと思う。

刺激というのは、たとえば、おれならこうするとか、そのてがあったか、とか、自分の発想を変えたり広げたりするための、イースト菌というかAオリゼーというかを植えつけられるというような感じのこと。

このあたりが実に微妙というかセンシティブなところなのだが、勉強カンファレンスと、刺激カンファンレンスの2分法が成り立つように思える。(というか、2分法でネタ出ししていくことで差異を強制的に作ることでそれぞれの意味を明確にするってことなのだが)

たとえば、会社に堂々と請求できるのは前者、自腹だなぁと考えるのが後者、TechEDは前者、RubyKaigiは後者、平日でもOKなのは前者、休日のほうが良いなぁなのが後者。

もっとも、その人の仕事領域が違ったりするわけで、たとえばおれにとってはYAPCは後者なんだが、明らかに前者の立場の人もいる。でも、JSもそうみたいだけど、このあたりのカンファレンスはそれ程、区別がはっきりしてるわけじゃないように感じる。

多分、区別がはっきりするとしたら、ビジネスで動く金の額によるんだろう(カンファレンスで動く金のことではなく、そのカンファレンスの題材によって動く金のこと)。それによって、会社に請求とか、会社が教育費用として出す金額、とカンファレンスの参加費とか平日、休日とかがリンクすることになるのだと思う。

つまり、RubyKaigiはまだまだ後者なんだが、それでもこないだの挙手の状況を見ると来年は前者になってしまうんだろうか? でも、それは成熟ということとは違うもので、異なる次元への移行なわけだが。で、おれにはそれはあまり楽しいことではなさそうだなということだ。

でもそれは逆も真なのだ。

Matzとko1ペアプレゼンなんて、明らかにLL魂が後者だから許されるのであって、前者のカンファレンスじゃ無理だろう。

で、そのあたりの微妙なところがVM魂のところにあったなぁ、と感じたわけだが。

_ レミーのおいしいレストラン

子供と見てきた。

恐るべき傑作。見たことがあるディズニー&ピクサー映画の中ではもちろん、ハリウッド文脈の映画としても圧倒的。

外に出て、屋根からあっちを見たら、そこにグストーのレストランの看板があるシーン。ここはすばらしく良いシーンだ。まさに映画そのもの。(看板のシーンとしては、市民ケーンの最初の看板が出てくるところに匹敵するかも)

まるでドラキュラか小林秀雄みたいな料理評論家のイーゴが悪役なのかと思うと、びっくりするほど偏見がない、真のプロフェッショナルな評論家なのだが(しかもどうも最後にはレストランのオーナーになるみたいだ)、彼が散々待たされたあげくに出された田舎料理(料亭に評論しにやってきたら、おでんが出されたようなもんだ)を鼻でせせら笑って、しかし口にしたとたんに、食べることの喜びを感じるシーンも悪くない。これも良いシーンだ。

その意味ではイーゴが主役で(わざわざ冒頭で紹介されるくらい重要な人物なわけだが、途中までまったく出てこない。そのため位置づけがシナリオ的には曖昧になっているのだが、でも物語としてはしょうがないだろうな)、彼がグストーについて抱いた誤解の解消の物語とも言える。誰もがシェフになれる、という言い回しにプロフェッショナルとして怒っていたわけだが、その意味が、シェフになるのに氏育ちは関係ない、ということだと理解するまでの物語だ。

それが明らかになるのは、一見主役に見える無能なリングイニ(ラングイニじゃないのかな?)が何もわかっていないということがわかる、レストランを相続した直後のインタビューの場面だろう。よりによって、血筋のことを言い出すわけなのだが。(にも関わらず、信頼を取り戻して、かつネズミ一族を味方につけることができるのは、その無能な素直さのためなわけだというところがシナリオとしてはうまいところなのかも)

それにつけてもレミーの持つ欠損は実に大きい。ところがその欠損を正しく表現すると物語が成立しなくなるので、そこのバランスを取る苦労も大きそうだった。不潔さを表現するために、下水や屋根裏や残飯などを出すわけだが、それを強調すると生理的な拒否反応を引き出しかねないわけだし。そこで常に2本足で歩かせて兄弟の4本足と対比させて前足は料理をするために清潔に保つんだとかしゃべらせてみたり、必ず手を洗うシーンを入れてみたりするわけだが。その一方で、アニメのネズミはミッキーのせいもあって元々そんなに不潔に見えるわけでもないので、この致命的な欠損に観客が気付かない可能性もあるので、そこを一族の集結シーンを入れて強調したり、いろいろ苦労の跡が見える。

それはそれとして作家達はマジンガーZのファンなのかなぁとか。どう見ても兜甲児。

マジンガーZ BOX1(初回生産限定) [DVD](永井豪とダイナミックプロ)

ちなみに、子供は単なるコメディ映画でこれっぽっちも感動しなかったとか小生意気なことを言っていたが、まあそうだろうな、という気はする。そのくらいうまくレミーがシェフになるということの問題点を隠蔽しているし、イーゴの気持ちの複雑さ(美食家ががりがりに痩せているという――ラングイニがわざわざセリフで指摘している――理由が読めていなかったし)も理解するのは難しそうだ。


2007-08-07

_ フィボナッチミュージック

やってみた。
#!/usr/local/bin/ruby -Ku
require 'rjb'     #JRubyじゃなくてrjbを使うのはおれにとっては自然
 
def fib(n)         #遅い
  if n<2
    n
  else
    fib(n-2)+fib(n-1)
  end
end
 
MidiSystem = Rjb::import('javax.sound.midi.MidiSystem')
synthesizer = MidiSystem.getSynthesizer()   #システム既定のシンセサイザー
synthesizer.open
channels = synthesizer.getChannels()        #16チャネルとか32チャネルとかある。多声を使うなら使える。
cha = channels[0]                           #とりあえずモノフォニーでいいや
 
p = 56
if ARGV.size > 0
  p = ARGV[0].to_i
end
cha.programChange(p)                         #1-128でプリセットされた音色を選択
 
s = 1
1.upto(30) do |n|
  x = fib(n)
  cha.noteOff(s)                             #指定音高の停止
  puts x
  x %= 19                                    #レンジを絞る
  x += 40                                    #下駄を履かせる(西尾さんの真似。というか全部真似だけど)
  cha.noteOn(x, 50)                          #音高、音量。音高は0−127。60がMid C
  s = x
  sleep(0.2)
end
 
synthesizer.close
追記:フィボナッチ数列を実際に音の動きとして示すことのおもしろさは、西尾さんLL魂のJythonのデモで示したものです。あまりのおもしろさに、まねしてRubyでやってみました。西尾さん、おもしろいプログラム、どうもありがとうございます。

_ ぼそ

慣用表現というものが世の中にはあって、たとえば、風が吹けば桶屋が儲かるとか。もちろん、風が吹いても桶屋にはびた一文たりとも落ちないわけだが。

_ びた一文

びた一銭じゃないわけだが、びたってなんだろう? ぴったりがなまったわけじゃなさそうだし。ぴったり一文も負けないじゃおかしいしな。鐚って漢字があるが、これかな? (そうらしい。びたせんという粗悪な銭。アルミ一円負からないという感じかなぁ)

_ モノフォニ

同一チャネルで同時発声できるから、あくまでも音色の領域。音相の分離とかモジュール分け用。

_ fib

遅いじゃなくておれの使い方がばかなのか。

後で直す。

_ fib(続き)

これなら速い。
def fib(n, r = [0,1])
  r[n] ||= fib(n - 2, r) + fib(n - 1, r)
end
 
class Array
  alias put []=
  def []=(i, n)
    puts n
    put(i, n)
  end
end
 
fib(ARGV[0].to_i)
本日のツッコミ(全7件) [ツッコミを入れる]

Before...

_ あろは [昔はおおらかだったので,銅の質が悪かったり,造型が歪んでいたりするびた銭でも, 4 枚で良銭 1 枚として認める,と..]

_ arton [>昔はおおらか すごい運用対処だ。]

_ きむら(K) [うは、脊椎と脊髄間違えたw]


2007-08-08

_ フィボナッチミュージック(続)

ここまで来ると、相当、いい感じ。
#!/usr/local/bin/ruby -Ku
begin
  require 'rjb'
  MidiSystem = Rjb::import('javax.sound.midi.MidiSystem')
rescue LoadError
  require 'java'
  MidiSystem = javax.sound.midi.MidiSystem
end
 
MAX_NOTES = 1000
 
synthesizer = MidiSystem.synthesizer
synthesizer.open
  
def fib(n, r = [0,1])
  r[n] ||= fib(n - 2, r) + fib(n - 1, r)
end
 
class  FibPlayer < Array
  def initialize(&proc)
    @hook = proc
    self[0] = 0
    self[1] = 1
  end
  alias put []=
  def []=(i, n)
    @hook.call(n) if @hook
    put(i, n)
  end
end
 
0.upto(7) do |c|
  Thread.start(synthesizer.channels[c], c) do |cha, v|
    fib(MAX_NOTES, FibPlayer.new do |n|
      cha.program_change n % 111 + v
      n %= 31
      n += 40 + v
      cha.note_on n, 50
      sleep 0.2
      cha.note_off n, 50
    end)
    Thread.main.run
  end
end
 
Thread.stop
 
synthesizer.close

rubycoさんのソースを参考に、Rjb、JRubyどちらでも動くようにしてみた(JRuby側のメソッド名のRubyizeが合ってるかどうかは不明)。

_ ブロードバンドルータ

あれからいろいろ見て回ったがというか使えばわかるが、5000円のルータは、OpenBlockSの足元にも及ばないってことが良くわかった。CPUがしょぼくてメモリーが少ない。と考えると、実にあの雷は痛い。というか、つい捨ててしまったのは実に愚かだった。修理に出すという頭が無かったのが敗因だ。新しく買うにしては、いい値段なんだよなぁ。

_ 22年

青木さんにプレゼントしたくなる栗ようかん

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

Before...

_ ムムリク [後から思うと、昔はさんまのかばやき缶詰みたいなところに(もっと大きいけれど)に入っていて、コンビーフ缶みたいに開けて..]

_ arton [コンビーフ缶みたいに開ける羊羮って想像すると楽しいですね。]

_ ムムリク [こんな感じです。ちょっとわかりにくいですが。 http://www.kanseido.co.jp/com/you/i..]


2007-08-09

_ 昔の話

FACEを使おうと思ったら、2バイトコードに対応してなかったので、cursesを使うことにした。とか書き始めてはみたものの、FACEじゃなくてfaceだったかも。というか、curesesって綴り合ってるか?

で、curesesを使うわけなので、80×24の座標系で物事を考える。

その時、作ったのは、4個所くらいに入力したらファンクションキーを押して処理を実行、てようなやつ。古いシステムである。

実は2バイトコードへの対応が腐っていて、半角カタカナも2桁として処理されたり(ここで、文字コードが何かわかる仕組み)。で、しょうがないので、(業務システムだから、使うなカスとかは言えないというか、よくそんなくだらない制限を甘受して、それだけならばまだ良いが、そのくだらない制限に反逆しようとする人をカス呼ばわりするわけで、どれだけ体制の犬なのかと、今日のスラドで久々にそういう犬を見てびっくりしたわけだが。という程度の言い回しの問題ではある。もちろん標準にしたがうのは正しい)0x8eのとこでカーソルを押されたら移動関数呼び出した後に1桁戻したりとか、くだらないけど結構楽しかったり。

で、思うに、原稿用紙もそうなわけだが、あの枡目という考え方をそのまま利用できる世界って結構良かったのではないだろうか。カーニングとかハイフネーションとかが普通に利用される言語の人たちにとっては、おそらく80×24の桁行の世界はとても窮屈だったろうな、と思うのだが、枡目を埋めて文を作る人にとってはね。

と、Wordでアルファベット日本語混じり文を入力してばかげたカーニングでとんでもなく間延びした行とかが出来ると思ってみたり。

その一方で、行書草書で書かれたものを眺めて、あれ、これが書であるならば、原稿用紙というのはいつごろからの風習なのか、と疑問に感じたり。もちろん、明治以降のことだろう。日本語活版印刷との整合性を取る必要があったからだろうな。

今は活版印刷では無いようだ。でも、適当にそこらの本とか眺めて見ても、日本語プロポーショナルフォントが利用されているようには見えない。

おお、そうか。その見た目の違和感が活字離れの原因かも。というか、すでに活字は使われていないわけだが。つまり、本を読まない人々の存在。

メイリオだのMS UI ゴシックだののほうが主流だしな。

もともと、日本は世界に冠たる出版王国だったというようなことをどこかで見かけた覚えがある。つまり日本人は本好きだというような結論になってたような気がするが、実は逆で、固定ピッチで活字を組めるから、アルファベット圏より本を作成するコスト(金額の話というよりは、活字を組むリソースの問題)が低かったのではないだろうか。そのため、本が安価に大量に出回りやすく、その結果、安い娯楽として人はそれを求める。

梶原一騎が気鋭のスポーツライターというか、物語作家としてデビューしてすぐに、雑誌から記事が消え、しょうがなくマンガ原作家というまったく新しい職業を開拓せざるを得なくなる、というようなエピソードが男の星座に出てくる。

B00007CA28

で、あまりにも新しい職業ゆえに、地位も低くのちのマッハGoGoGoの人かな、吉田竜夫からゴーストライター扱いされて怒るとか。物語りも作れない(というか、ここで作家と挿絵画家の作品に対する関係は変化しないのに、小説からマンガになることで社会的地位が逆転することにびっくりしているわけだが)、ただの画家のくさったやつのほうが、でかい顔するとは何事か、と怒りまくるものの、どうにもしょうがなくて酒飲んで暴れたり。

でも、あまりに怒る上に、現実問題として梶原一騎が物語を作らなければマンガが成立しないので、そこで「原作」という肩書が生まれ、新しい職業としての原作者(む、作家は家だが、原作者はモノだな)というものが誕生するとか。

で、当時無名の大山倍達が、「先生、男は名前を売ってなんぼですぞ」とアドバイスをするような違うかも。

本当は、telnetdはなくhttpdを内蔵するアプリケーションに話が進むはずだったのだが、違う話になった。


2007-08-10

_ お子様教育

どうも教育上よろしくないことに気づいたので、まじめにクロウラーのUA名を調べて、tdiary.confを修正。でも、Slurpは、disp_referrer.deny_user_agentsに含まれているんだが。

#Yahoo経由で見るからに夏休みの宿題用語をキーワードに検索してきて、孫悟空をきめた子がいたからなのだが。


2007-08-11

_ 憂鬱な時

ペンギンの憂鬱 (新潮クレスト・ブックス)(アンドレイ・クルコフ/沼野 恭子)

残念なことに、ペンギンもいなければ、ベビーシッターもいない。

せめて憂鬱な楽園を観る。

侯孝賢 傑作選 DVD-BOX 90年代+「珈琲時光」篇(侯孝賢)

_ アフィリエイト経由で買われた本

ドコカの国にようこそ! (fukkan.com)(大海 赫)

たぶん、ピカピカのぎろちょん経由なのだと思うが、大海 赫という名前の作家は初見。微妙に僕が児童書を読まなくなった時期以降の人らしい。

クロイヌ家具店 (fukkan.com)(大海 赫)

結構、多産な人のようだ。

白いレクイエム(大海 赫/西岡 千晶)

西岡妹とのコラボレーションがあるところを見ると、文句なしの現役作家のようだが、ピカピカのぎろちょんと同様に、そういえば不思議な世界を子供のころ読んだ記憶があるけどあれはなんだったんだろうか、という復刊ドットコム的心情から甦ったようでもある。

3年前なら間違いなく買うところだが(子供が児童だったから)、今となってはいささか時期的に微妙だ。

うさこ(いつの間にかミッフィーって名前になってるな)とかツェねずみみたいなまどうてください歴史になった児童書を除くと、児童書というのは一期一会な存在なのだな、と思ったり。その時、子供だったかどうかで知る/知らないとなる(流行小説ってのも一見してそうだが、出会いが子供の頃ってのが大きな違いとなるように思う。情報の流入量が絶対的に少ないから見える範囲の世界しか知らない)。青少年になってしまえば、書店の児童書コーナーを訪れることはなくなるし。人によるだろうけど(で、そのうち輪廻するわけだが)。でもないか。本ってのはいつだってその時その時の出会い勝負だな。春に会った本、夏に会った本、坂本竜馬ですかそうですかみたいな感じだ。そういう意味では、おさるのジョージだの小さな家だの花が好きな牛だののようないつでもある本ってのは今一つだ。

で、月日は巡り数10年ぶりに児童書コーナーへ行くようになりその時期の作家と出会い、出会いを与えてやるようになる。

うちにかえったガラゴ(島田 ゆか)

たとえばおれたちはガラゴを与えた。

それから何度も季節が回ったころに、この本はどっちになるのだろうか。ああ、これ子供ころ読んだな(からさらに2分岐。与えたくなるか、無視するか)なのか、そういえば変なケモノがカバンを売る児童書を読んだ記憶があるけどあれはなんだったのかな、なのか、あるいは忘れ去って、はいそれまでよ、なのか。

まどうてください、と何気なく呟いたときに、りゅうりゅうならすぞ、と返されるとなぜかとても幸せな気持ちになるわけだが、それは全然関係ない話だ。

_ 突然ルイフィリップ

トゥートゥールルルンルルルン

ライクノバディドゥノンノンノンノン

アーイヤイヤーイ

と突然頭の中でルイフィリップが歌い始めた。マジキニョランスアイヤイヤイ。暑いからだろう。

死ぬほど聴きたいおふらんす(白耳義だけど、と思ったらフランスで良いのだった)。

Rainfall/Jean Renoir(Louis Philippe)

でも、ベストにも入ってないな。ライクノバディドゥノンノンノンノン.

……

iTunes Storeで探したらあった。そりゃあるだろう。マスターピースだ。

でもパーシャルアルバムとかなっていて買えない。

Ruling Class: Very Best of El Records(Ruling Class: Very Best of El Records)

かといって、CDを買うのはちょっと考えてしまう(こたないか)。

このあたりを買うか。iTunes Storeより安いし。

Sunshine/Delta Kiss(Louis Philippe)

……

オフィシャルサイトでいくつかの曲が聴けた。"Manuke No Kara"っていうのはもぬけの空の間違いなんだろうか? だったら教えてやりたいが、本当に間抜けの空(もしかたしたら間抜けの鴉かも)の可能性もあるしな。

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

_ 大海 赫 [「児童文学」という言葉は嫌いです。 ところが、僕が書いた本は「児童書」に入っています。 皮肉ですね。]


2007-08-12

_ システムメンテナンス中

あ、お盆ということは、そういうことですか。orz

追記:というようなことを午前中に書いたときは15:00までとなっていて、で、15:00に見に行ったら18:00までに変わっていて、17:00くらいからは23:00までに変わっている。

まあ、そんなもんかな。


2007-08-13

_ 加算の方法

昨日アマゾンから届いたのだが最初の数行で時間を食う。

Short Coding ~職人達の技法~(Ozy/やねうらお)

どうやって足してるのか不思議だったが、足された結果と考えるってことか。と頭を切り換えられないところがおれの弱いところ。

それにつけてもえらく面白い。

そこを越えると、とりあえずルール解説なのでするする読めるし書き方もいい感じ。どうせgccなんだろうと思ってたら、cl(VC6)でもやれるのは良かった。というかルール知らなかったし。

でも2章まで読んだところで他のやんなきゃならないことをやるので中断。

最初の加算の問題がやたらと難しかった(というか、おれの悪い習慣で、見たとおりの処理ではない何か悪しき魔術が使われているに決まっているという思い込みで眺めるから、素直にありのままの値を取り出していると考え付かないんだろうな)のを除くと、あとはとても素直に話が進むので、おお、そういうことだったのか、と感心した。っていうか、これこそCの自習書じゃん。

#とは言え、最初からANSI Cの書き方しか知らなければとまどいは大きいかも

ところで、書影を貼るために読み返して(最初、携帯から適当に更新したのだった)思ったのだが、おれはばか→ここに書いてあること(=書いた人含む)は並、という受け取り方ができるな。それに対して同じことを、このおれさまですらお手上げ→ここに書いてあること(=書いた人含む)スゲー、ということもできる。しょせん相対的な問題だし。

とすれば、いたずらに卑下(ちなみに、ここでは別に卑下してんじゃなくて、実際に書いてないこと読んで時間を無駄にしたのはおれが悪いわけだが)するのは世の中の役に立たんだろうなぁ。このすげぇおれさまよりももっとすげぇあなたさま、ってほうが、この並以下なおれと違って並なお前、じゃつまらな過ぎる。

_ むむ

できるかな?ユースケースがあると、考える気になる。

主な問題点は、イベントハンドラだけなんだから、というと不正確で、

1. OSXの変な仕様

2. イベントハンドラはワーカスレッドでインボーク

3. OSXが変なのはともかく、基本的にメインスレッドは待ち状態のほうがOK

の3つ。なんでも3つにまとめるとわかりやすいらしい。だから本当はもっとあるかも。というか3があるから1は不要。

とすれば、いくつかの規約重要を導入すれば良いはず。

1. オブジェクトはメインスレッドで作成

2. SwingUtilities.invokeLater 必須。

3. invokeLaterに与えるRunnableは当然Rubyで書く。

4. しかし、Runnableはイベントディスパッチスレッドで実行されることになる。

5. イベントは当然、イベントディスパッチスレッドで実行される

6. というか、invokeLaterを呼んでいるため、待ち状態にする必要がある。

最初に、イベントディスパッチスレッドでの処理を考えてみる。問題はGCの実行や、Rubyのスレッドコンテキストの復元によって生じる。

すると、イベントディスパッチスレッドで呼び出されるRubyのスクリプトレットについて言えば、Mutex#synchronizeで挟み込んでスレッドコンテキストの復元などを防御し、かつGCも止めてやれば良い。

でも、そうするとGCされない問題が起きる。

それが、invokeLaterを呼び出したメインスレッド側の処理となる。同様に、こちらではループで待ち状態に入るわけだが、このループ内でGCを起動すれば良い。イベント処理のスクリプトレットは入口と出口でThread.criticalを設定/解除するので、スレッド切り替えは起きないし、起きた場合、つまりメインスレッドが実行できるのは、イベント処理スクリプトレットから抜けた後になる。つまり、イベントディスパッチスレッドのスタックは巻き戻されているため、GCでマークする必要はない。

では、メインではどうやって待てば良いのか、それが次の問題となる。

でも、実は大したことはない。ふつうにSWingアプリケーションを作れば、メインスレッド(Swing用語だとInitial Thread)は、SwingUtilities.invokeLaterを呼んだらそれでおしまいだからだ。おしまいの代わりに、上で書いた、Mutex#synchronizeによって防御した中でのGC呼び出しと、sleepかなにかによるワーカスレッドへの処理委譲を繰り返す。

いずれも、CレベルのサポートがなくてもRubyだけで書けるはず。

と、思って試してみたら、Mutex.synchronizeでSystemStackErrorになる。違うスレッドのスタックでコンテキストを作ろうとするからか。うまく行かないもんだな。

というようなことは、考えてみたら、1.9では解消するわけか。

_ 現代の日本人に欠けているもの

いくつかの同時代の他の国家が教育のカリキュラムに取り入れているにもかかわらず、という観点からなら、体系的に人を殺す技術は欠けているだろう。つまりは軍事教練。銃器の扱い、毒物の知識、効果的な人体の破壊法なども。

で、問題はその欠損が現代の日本人にとって弱点なのか、ということ。

無駄な教育ならば、コストをかけなくて済んで良かったね、と言えるわけだ。

逆に皆がその知識を自在に駆使できるとしたら、どのようなゲインがあり得るだろうか。


2007-08-14

_ メモ

追記と認証の順序。

最初に認証してから追記すれば良いのかな。


2007-08-15

_ オーバーライドバグ

こんなバグをやっちった。

class Base {
    String convert0(String s) {
        return null; # Dummy
    }
}
....
class Foo extends Base {
    String convert0(int n) {
        return ...; // 実装がある
    }
}
...
Base[] bases = { new Foo(); }
...
StringBuilder sb = new StringBuilder();
for (Base b : bases) {
    sb.append(b.convert0("hello"));  // Foo#convert0は呼ばれない
}

これは、ダックタイピングは……というのと同じ種類の問題のように見える。メソッドにオーバーロードがあるため、異なるシグネチャで書いてしまってもコンパイルは通るからだ。

どう解決できるだろうか?

それ抽象という方法がある。

abstract class Base {
    abstract String convert0(String s);
}
....
class Foo extends Base {
    String convert0(int n) {
        return ...; // 実装がある
    }
    // String convert0(String s)が未定義でコンパイルエラー
}

が、実際にはある長い長いデータをばしばし切り分けていくベルトコンベア的なシステムなので、Baseクラスにデフォルトの実装をしなけりゃやってられない(convert0メソッドからconvert365メソッドまであるという感じ)。というか、具象クラスのほとんどすべてのメソッドが空実装になる。ということは、機械的な空メソッドの実装を行う必要が出てくるため、結果的に、同傾向のバグが入りかねない。何よりも、あまりにもDRYじゃない。空メソッドを実装した具象メソッドがたくさんできてしまうからだ。interface Baseにしても、したがって話は変わらない。

いや、すべてのメソッド呼び出しが走るテストを書かないのが悪いというのはもっともだけど、それは置いておいて。

常に親へ委譲(とは違うが)を使えばどうだろうか?

class Base {
    String convert0(String s) {
        return null;
    }
}
....
class Foo extends Base {
    String convert0(int n) {
        super.convert0(n);  //// そんなメソッドは無いエラー
        ……実際の処理
        return ……;
    }
}

あまりに意味不明瞭かも知れない。でも、実装バランスからはそれほど悪くはないかも知れない。定義済みメソッドはむちゃくちゃ多いが、オーバーライドするメソッド数はそれほど多くはないからだ。また、パターンがあるので、意味不明瞭さはすぐに解消するだろう。しかし、削除されるかも。でも、この実行時には意味を持たないsuper呼び出しを書くというのは、結局規約の問題なので忘れてしまっても意識的に省略してもビルドはできるし、たいていはうまく動く。あまり良い防御方法とは言えないのではないか。

問題は呼ばれるべきメソッドが呼ばれていないということだ。したがって、呼ばれるべきではないメソッド側では対処できないだろう。

class Base {
    String convert0(String s) {
        assert false : "not override correctly";
        return null;
    }
}

というか、こんなことするなら、抽象メソッドにするほうが良い。し、それは現実的ではないと否定したばかりだ。

と、書いているうちに、可視化ツールというアイディアが生まれた。オーバーライドしてあるメソッドとそうでないメソッドが色で区別される。すると、

class Foo extends Base {
    String convert0(int n) {  // このメソッドは紫で表示されている
        return ...; // 実装がある
    }
    String convert1(String s) {  // このメソッドは紺で表示されている
        return ...; // 実装がある
    }
}

なぜ、convert0は紫なんだ? ……、あ、パラメータの型が違う!

今のIDEは、予約語、文字列、直定数、コメントといった、静的なというか言語仕様に基づいた色分けはしてくれるのは知っている。でも、これが役に立つのは(読みやすいとかは別にして)、コメントが別の色になるってやつだけだ。長い/* */を持つ腐ったプログラムを眺める時に役に立つのは知っている。

そうではなく、あるいはそれに加えて、継承についての色分けがあれば、少なくてもこの手のバグは防げる。

(overrideキーワードの記述を必須にするというC#の方法もあるな。でも、これはJavaの話だし、overrideキーワード必須は逆に面倒で忘れやすいし、しかも忘れても実行時に変だと気づくだけで、後からソース読むときの役にしか立っていないように思える)

というか、こういう色付けするエディターってすでにありそうな気がしてきた。あるんだろうな。elispで書きたくはないし。

_ ディエゴ、頭の中の自由

DIEGO, LIBRE DANS SA TETE

NAKED-LIVE 93(PANTA)

ディエゴって誰だ? メキシコのディエゴじゃなさそうだし。

ビコみたいな存在なのかな?

ストリート・ファイティング・イヤーズ(シンプル・マインズ)

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

Before...

_ arton [>親側でprotected final String convert0(int n) {}しておくとか。 あ、なるほ..]

_ NyaRuRu [Deprecated の進化版というか,コンパイル時にエラーチェックをするためだけに存在して,実装は要求されないよう..]

_ arton [確かに属性はまだまだ使い途がありそうですね。]


2007-08-16

_ 設計のまずさ

えらく使いにくく、しかもバグがたくさんありそうなツールを使っているわけで、しょうがないので、しょっちゅうベンダーに問い合わせを行うことになる。

これまで20回はメールが往復しただろう。

ここで、うんざりするのは、常に、そう常に、

「パラメータファイルはバイナリーエディターでエディットしてください」

という一節が入ることだ。

それは、インストールマニュアルにも書いてある。

拡張子がiniとなってるから、確かにすぐにメモ帳が開く。おそらく余分なCRが入ったりしたこともあるのだろう(実際には、90%以上の行がASCII+CRLFとなっていて、ごくまれにASCIIの制御コードが埋め込まれた行が存在する)。

ここまでしつこく書いてくるということは、

・そうは言ってもメモ帳で編集/保存してとらぶりまくった経験がある/あった

・障害事例ナンバー1

・テンプレ化されている

しかし、そういうこととは無関係にバギーなのだが。

ここから1つ教訓を得た。毎回サポートが(違うと書いているのに、実際には往復の3回目くらいから、面倒になって、こちらからのメールには「編集はバイナリーエディターで行っています」という一節を入れているのであった)同じおまじないを書かなければならないくらいなら、

・最初からそんなばかな仕組みにはしない

・早いうちにその点は修正する

のいずれかの対処をすべきということだ。はっきりいって、むかつくぞ。今では、

「お、返事キター!」

「バイナリーエディターでエディットしてくださいが結論に1000ヘクトパスカル」

「おれは10000ゴディバ」

という賭けにならない賭けが行われているくらいだ。

#これだけでは単なる王様の耳はロバの耳なので、有用な情報。Bzは、おれにはすごく使いやすい、シンプルなバイナリエディター。お勧め。(sendtoにショートカットを作るとエクスプローラからの送るメニューで起動もできるし)。

_ るびま敗戦記念日号

0020号

青木さんのインタビューのときも思ったが、同世代のインタビューイのときは、ささださんのインタビューがくだけておもしろい。(くだけたからといってちっているわけではないと思うし、年寄り相手がおもしろくないわけではない)

逆に思ったが、ささださんより若いインタビューイだったらどうなるんだろう? たとえば成瀬さんとか斎藤さんとか。

インタビューの価値についてさらに考えてみる。

・あの人のことを知りたい、っていう興味というのはインタビューを読むひとつの動機で、もちろんそういうのはある。essaさんとか中田さんのインタビューなんて、そのての好奇心を満たされまくり。

・それ以外

で、るびまであれば、むしろそれ以外の部分に、より着目したい。

・おれと異なる視点の人(しかし興味の範囲はかぶっているので、まったく無関係の人というわけではない)の話から、自分にとって未知の発見、見方、考え方、人生とか、そんなものを得るというようなこと

思い起こすと、スーパーアスキー末期のころの、生越さんの女子高校生Linuxっていうのは、もともとどういう発想で始めたかは知らないが、知ってて当然の人たち=読者に対して、知らないのが当たり前の人がLinuxを前にしてどう反応し、感じ、考えるか、というような新たな視点を与えるという、興味深い実験だった。もちろん、街頭でなんぱした女子高生を相手にしたら、筋がずれてしまう(ていうのはあくまでもLinuxについての連載だったわけだから)ので、そこは生越さんの教え子という枠が設けられていたと考える。というか、良い企画だったわけだが、読者欄でめたくそにされていたのは、いかに了見が狭く、自分目線だけでしかものを考えられない、教えて呉れ呉れたこらばかりが、声がでかい(わざわざ投書する)なのか、とそれはまたそれで新たな発見があっておもしろかったわけだが。

すると、たとえば、同じように、違う目線、違う発想、違う考え方の人たちが、(この場合の筋となるのはRubyである)をどう見ているか、どう考えているのか、どう使っているのか、は興味の対象足りうる。

・女子高生Linuxからの類推だと、女子大生Rubyist(Rubyistの必要はなく、Rubyを教えられている人たち)とか

・教育に使っている人、つまり小波先生とか。

・中学生Rubyistとか(だんさんの本ではじめて勉強はじめた読者とか)

・(ビジネス臭ぷんぷんの人はITMediaとかに出てくるし、立場上、本音トークとかは難しそうだから、ちょっとだめかも)

とか、考えてみると、すでにHotlinksというフレームワークとは外れていることに気づく。っていうか、今気づいたが、機械猫さんの日記は、Hotlinksに入ってないんじゃないか?

あれか。よしだともこのユーザー探訪(IME2007で出てこないが、「たんぽう」じゃないのか? 正しい読み方を知りたい)みたいな切り口か。

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

Before...

_ arton [あ、「たんぼう」なんですね。どうもありがとうございます。というか変換できたし。]

_ metanest [『ルート訪問記』ではなくて? よしだともこさんというと]

_ arton [あっそうでしたっけ? そう言われてみれば確かにそんな気がするので後で直すかも。]


2007-08-17

_ Ruby.NET

どんどこ動き出しているのであせりまくる。

と、忘れないようにメモ。

_ File#each_line

良く次のように書いて、ファイルがオープンされているよエラーとなって悲しくなることがある。
File.open('foo', 'r').each_line do |line|
  ...
end

なんとなく、次の書き方に似ているのでcloseしたつもりになってしまうからだ。

File.open('foo', 'r') do |foo|
  s = foo.read
  ...
end   # File.openのブロックを抜けるため、closeされる。

でも、File#each_line(実際にはIO#each_line)は、テキスト処理にはすさまじく便利なので使わないわけにはいかない。

そこで、次のように書いてみたり。

File.open('foo', 'r') do |foo|
  foo.each_line do |line|
    ...
  end
end   # File.openのブロックを抜けるため、closeされる。

2重ブロックは不格好だな。

あるいは、

foo = File.open('foo', 'r')
foo.each_line do |line|
  ...
end
foo.close

くだらない変数が必要になって、ますます不格好だ。

そこで、リファレンスを見ると、IO#each_lineはselfを返すって書いてあるじゃん。なんだ、そうだったのか。

したがって、次のように書けばOK。

File.open('foo', 'r').each_line do |line|
  ...
end.close

ブロックは1つ。無意味な変数も使わないで済む。実にスマートだ。(例外処理が必須な場合は話は別)

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

Before...

_ 通りすがり [るびまではちょうどその話題で、 「IO.readlines を使ったほうがいいと思う。 」とかかれています。 htt..]

_ arton [お、どうも。そういえば、何かでeach_lineだとファイルを閉じないとか書いてあるのを見た(かつ、経験ある)と思っ..]

_ arton [上の最後の行は何かの間違い。]


2007-08-18

_ マイクロソフトとRuby

民衆の敵 [DVD] FRT-145

こないだ雑談してたら、IronRubyが世界を制覇して、MSのRubyが世界のRubyになっちゃって、YARVは本当にYet Anotherにされてしまいそうでこわいこわいみたいなことが話題になった。

おれはそんなこたないだろうと思った。第1にそこまでMSがRubyにコミットするとも思えないし、J++のころとは戦略が違うし、とか。

でも、今になってふと考えた。

次のシナリオはあり得るし、もしかしたらそれで幸せになってしまう人がたくさんいるかも知れないかも知れない。

つまり、ECMARubyをMSがECMAに提出し、Sunがそれを後押しする、というシナリオだ。つまり、Ruby1.8.5(6)の仕様が標準Rubyになるというストーリー。

このシナリオは十分に考えられる。

まず、Rubyをエンタープライズで利用したい人たちにとっては、Rubyの標準というのが明文化されることになってハッピー。IronRubyやJRubyにとっては標準を冠することができる。認定試験もやりやすいだろう。

ここでMRIはどうなるんだろうか?

1.8.6系が容易にECMARubyに準拠できる(話が逆転している)のであれば、これはこれで良いことに思える。

ではYARVの立ち位置は、というと、ECMA標準があろうがなかろうが、今のRubyのユーザーのおれとしては、最新の安定板のASRは作るだろうし、使うだろうし、これは今のほとんどのユーザー=開発者と変わらんだろう。

問題となるのは、ECMARubyの2.0仕様策定が、YARV(1.9の意味で使っている)と別路線で走りだしたときだな。で、そういう可能性があるかないか、でいくと、YARVが普通に先行していれば、あまり無さそうに思える。よほど変な政治力が働かない限り、つまりプロトコルの脱共有化圧力で個人による実装が不可能レベルまで肥大化しない限り(それなんてWS-*)は、YARVの仕様の追認になるだろうからだ。

というような形でなら、MSのちょっかいっていうのはあるかもしれないな、とおれは考えた。

#しかし、WS-*というかSOAPを思い出してみると、Iで始まる巨人がからんでくると、いつのまにやらねちねちした型宣言が必須な言語仕様になってたりしそうで(型宣言はなくても、変数の初出時にはvarが必須とか)、こわいといえば、そっちがこわい。Groovyが元のGroovyから今のGroovyになるにあたってのJCPでの発言をチェックしてみるとおもしろそうである。

_ YARVと私たち

続き。

で、ECMARubyが仮にあったとして、もし不幸なことがあり得るとしたら、それはバージョン2からだろうと想像できる。

そこで不幸が起きないようにするにはどうすれば良いだろうか。

それはコモンセンスに任せれば良いのではないか。

具体的にはYARVがリリースされていて、それが広く使われていることが明らかな場合に、あえてそれをなかったことにする仕様が通ることはないだろうということ。

つまりはYARVをみんなで使おうね、と。

_ 石の上にも30年

iTunesから適当にシャッフルして流してたら、ある曲のあまりの美しさに思わず涙してしまった。

Everything Kill You

そうか。ここまで到達したのか。素直にすげぇよ。

Siberia(Echo & The Bunnymen)

エコーアンドザバニーメンについてはいろいろ思うところはあるが、どんどん年齢相応な深みってやつがついているようにはあまり思えないわけだが(Sessions in the Sandとか、別にゲームの頃の曲といってもかまわなそうだ)、で、確かに別にじじくさい曲を聴きたいわけでもないが、こういう(エバーグリーンの平易でメロディアスな感じとも違うし、フラワーズの21世紀サイケ中年路線とも違う、どちらかというとソロに近いかなぁ)素直にシンプルに、メロディアスな(やはりエバーグリーン路線かなぁ。でも10年の歳月か、唄の艶艶(いろつや)に陰翳あって見事なものだ)、アレンジも良いなぁ。音の層の厚いところと薄いところのバランスとか。

いいものを聴いた(というか、買ってiTunes食わせたものの一度も聴いてなかったのがなんだかなぁ)。

#う、シャッフル止めて落ち着いて聴く体勢にしたら、次のサイベリアが、いまさんのいつもながらのエコーバニ路線で、ちょっと不快になったり。やっぱりこいつらはBGM、と書いた瞬間に転調したが、そこはばかみたいに素晴らしかった。転調はモーツァルト以来の作曲家の必殺技だな)。

_ 転調

そういえば、昨日見た、ルグリカンパニー(でもルグリは出てない)の白鳥の湖の最後のロットバルトの翼をもぎとるところの転調(例の白鳥の湖の有名な曲が長調になる)で、ウワァー勘弁してくれ―と思ったのを思い出した。あれはひどい。長調にしても良いものと悪いものがあるだろう。あれはチャイコフスキーのオリジナルスコアなのか? だったら、ちょっとチャイコフスキーの作家としての良心を疑う。

でもそれを別にすると、楽しめた。4羽の白鳥の機械っぽさとか、オディールの機械っぽさ(ロットバルトが操っているかのような振り付け。というか振り付けも良いかも知れないがそれを実装する技術が確かなのがすげぇな。なんか白鳥全員うまかったし。ブランなバレエではじめてほとんど退屈しなかった)とか、なんだかすごくおもしろかった。それにしても、オディールはいいなぁ。

_ ASR-1.8.6-637

ASR

ロケール設定を日本語でいいや、としてたら、英語版はどこだというメールが来て、正直なところ結構うれしかったり。最近はOne Click Installerルールドなのかと思ってた。

というわけで、ロケールをニュートラルで作りなおした。

ついでに、というわけでもなく懸案事項だったパスの設定問題を修正して、インストール後にポストインストーラを走らせて修正するようにしてみた。

このあたりは、VC6のVisual Installerより、Visual Studio 2005の配置ツールのほうができが良くて、ちゃんとポストインストーラの実行と、それを実行して日付が変わったファイルのアンインストール時削除をしてくれる。

こうなると、いくらでもスクリプトを走らせられるようなので、PATH設定についてもちょっと考えるわけだが、これについてはやはりやめとこう。

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

Before...

_ arton [いやぁ、僕も全曲版(なのかな?)は初めてでした(組曲版もたぶん聴いたことないと思います)。それだけに衝撃も大きかった..]

_ とおりすがり [あの長調がいいんですよ。悲劇的で運命的な長調で、ぞくっとします。]

_ arton [なるほど。音楽が「悲劇的で運命的な長調」と言えばそうなのかも知れませんね。でも、劇の上では全然悲劇的ではなく単純に腕..]


2007-08-19

_ もうすぐTechED

でも火曜日は仕事の都合で行けない。

_ 木村さんのとこ経由で思ったのだが

デストラクタのセマンティクスの変更

素人のクレタ人に質問しないで、ふつうにMSDNを読めば良いと思う。

というか、はてながモヒカンがうろうろしている恐ろしいサザンクロスシティなら、OKWaveはクレタ人が棍棒をもってうろうろしている恐ろしいラビリントスだなぁ。ミノタウロスがうろうろしているクレタ島のほうがおさまりが良いかも。

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

_ きむら(K) [クレタ人ネタでちと書いたのですが、www.**.rim.or.jpが軒並み死んでいるようで 更新できませぬ orz]

_ arton [みたいですね。最初、またルータが死んだのかと思いました。]


2007-08-20

_ Ruby-1.8.6-p36 RDoc

mixiの質問コーナーに、ASRにRDocが含まれていない点についての質問があったので、インストーラパッケージを作成。使われているのかどうか良くわからないのにやたらとかさばるので、最近はパッケージに含めていなかったからだ。

ASRダウンロードページ

Visual Studioの配布ツールは、このての細かいファイルがたくさんあるのに異様に弱くて、ビルドするのに小一時間くらいかかって閉口した。


2007-08-21

_ 山口小夜子

新高恵子か山口小夜子か、というくらいに、僕にとってのカルトスターでもあったので、またひとつの時代が消えたなぁとかいろいろ感慨。

最後に観たのは、

ピストルオペラ スペシャル・コレクターズ・エディション [DVD]

で、最初は単なるギルドの連絡係かと思ったらところがどっこい眼が百個(というか、この映画は最初が最近の渡哲也もかくやというくらいに膨らみに膨らんで土佐衛門のようになった沢田研二が吊るされて殺されるところから始まるわけで、監督本人にとっては60年代のおとしまえかもしれないが、見てるこっちにとっては80年代の夢は枯野に枯れすすきのような物悲しさが漂いまくるセンスパワーな映画なので、山口小夜子はまさにうってつけ)。

歌と理論は良かったけれど、映画は批評も(増殖する男を誉めたりとか)撮るのもいまひとつだった(消しゴムと扉のやつは例外的に好きだが)寺山修司の映画でも山口小夜子だけは良かったな。

上海異人娼館 チャイナ・ドール デジタルリマスター版 [DVD](寺山修司)

なんというか、人形のような(生身な性を感じさせない)妖艶さみたいなものがあったというか。

#突然、思い出したが、チャイナドールでかげろうゆらめく地平線いっぱいに馬軍(馬賊なのか紅軍なのか同じ音の皇軍なのかは誰にとってもどうでも良いわけだが)が広がるシーンは広がりがあってよかった。ついでに、寺山修司の映画の問題点は(批評もそうだが)、そこに映されていないものを重視し過ぎて、幻想の中で映画を撮ったり語ることで、そのため実際のフィルムが(相対的に)あまりに矮小化される点にある、とおれには思えたから否定的なのだということも思い出した。

_ 断水時の水の流し方

断水中って何の比喩?

トイレの水の流し方は簡単というのが最初にあって、
それは確かに、レバーを下げたり上げたりすれば済むから簡単に見える。

でも、断水時には、当然、バケツの水を使うことになる。

勢い良く流すために、2メートル上から流したら、すごく悲惨なことになる。

それをおそれてちょろちょとと1cm上から流したら、ブツは流れない。

加減が必要だ。

さらに、10リットルあれば誰でも流せるだろうけど、50ccでは誰も流せない。

そこで、営業から3リットルで流せるかなぁ、と打診されたときに、安請け合いするか、現場検証して可否を決めるか、はなから無理と答えるか、あるいは2.98リットルならどうか、とか。実は特盛り野郎が住んでいたとか。

そもそも汲み置きが無いとして、断水時間を予測して流さないで済ませるという判断をしたりとか。

かように、実は「水を流すのは簡単」というのはコンテキストに依存した特殊状況であり、毎日の運用を考えると、実は全然簡単ではない。(3年間ノーダウンで動かせるか、というと当然、断水が起きることとか水漏れすることとか、詰まることも想定しなければならない)

そこで、「水を流すのは簡単」とか安請け合いしているけど、真価が問われるのは断水時だよ、とコンテキストを付け加えたということです。

で、何をもって断水時と考えるかは、初心者が起こしえる過ちについてどのような状況を想定するか、なので、それを考えることそれ自体も含まれることになります。というか、障害を予見できなきゃ意味がない。いや、断水なんて起きるはずないじゃん、という答えもひとつの見識だからそれならそれで良いわけです。

(僕は、そんな面倒なことを考えるのはいやだからはなから断水がありえないJavaとかC#(unsafe抜き)とかを教えるのが良いじゃん派。実際、断水してないし。でもマルチスレッドという名の糞詰まりはあったけど)

_ 串刺し公

Vlad

でもなぜなんだ? ルーマニアの人たちなの?

_ 同じ時に見た振る舞いに関すること

田中さんを満足させる説明ってのは結構ハードル高そうだな

なんでかというと振舞いはmoduleとして取り出すことができるからです。

データと「コードまたはタイプ」の分離

「コード」と「最終的に動いている状態の何か」の分離をより昇華した物になるんじゃないか、と思い始めています。

ここまでのまとめ。

・関数に操作対象を与える。

f = fopen(...);

fprintf(f, ...);

・操作対象が関数を持つ。

f.open(...);

f.printf(...);

・操作対象に関数のまとまりを与える ← 今ここ(「今」についてツッコミたい場合は自分のところに書いてください)

f.includes File-Functions


2007-08-22

_ JIS2004

なんとなく聴いたら存外おもしろかった。知らないことがたくさん。

・印刷の標準!=表示の標準(というか標準がない)

・常用漢字=簡略体、非常用漢字=正字

・関連するのが文科省、法務省、経産省

・摑む(環境依存文字=UnicodeというのがIMEで出てくるのはそういうことなのか)

・丸付き数字が50まで。

・まずShift_JIS(といってもCP932だろうけど)に直してA APIを呼んで、中でUnicodeに直してW APIを呼ぶ。

・表示は□でも中身は保持している

_ どきゅむ

環境依存文字。

追記:あれ、Windowsで見ると読めるぞ。どう変換してるんだ? と思ったら実体参照になってるのか。(この字って、PC98とPC286で違う字として結構話題になった遠い過去)

_ C#3.0

なんとなくだけど、全世界に1000人くらいは、C#を楽しいプログラミング言語として遊べている人がいるのではないだろうか、と3.0フィーチャを見て思った。

具体的には、Visual Studioを使わずに、普通にエディターでプログラムを書いている人という意味。でなければ、オブジェクト初期化式なんて(元ネタはJavaScriptとかだとは思うけど)出てこないのではなかろうか。あるいは、var(型代わりキーワード)だってそうだ。

で、やはりおれは思うのだが、プログラムは最初から最後まで自分でキーボードを叩いて作ったほうが楽しい。

追記:オブジェクト初期化式もvarと同じで、LINQに必須な技術だった(無名オブジェクトの生成)。varと同じくがりがりコードを書くのにも応用できるというだけ。

あと、こんな話題も。

無名オブジェクトはタプルではなく、単にオブジェクト。タプルと呼ぶのなら、パターンマッチングが必要になるし、それをC#に取り入れるのは現時点では無理。

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

_ 通りすがり [いま、パーティー会場にいますが、みつからず。]


2007-08-23

_ 明示的にexplicitlyを日本語化する

それだけ言いたかった。

参照

ヒント:もちろん、「日本語化」という日本語はない

合成語を知らんのか?

どうもそうではないようだと思ってたら、日本語じゃないからか

つまり、「語」だと誤解しているのが問題なのだろう。これは「機能」なのだ。

Perhaps the most straightforward way to define new functions is simply by combining one or more existing functions. For example, a number of library functions that are defined in this way are shown below.

・Decide if a character is a digit:

isDigit :: Char → Bool

isDigit c = c ≧ '0' ∧ c ≦ '9'

引用元は

Programming in Haskell(Graham Hutton)


2007-08-24

_ TechED

最終日。

_ 足が痛いです

パディンパダンパドン、みんなふーまなーいで。

という歌を歌う小人が主人公のNHKの(たぶん海外の)人形劇があったことを思い出したが、それとは関係なく

IPA未踏ソフトウェア創造事業2006年度下期千葉PM採択プロジェクト最終成果報告会」というのがあるそうなので、ふるって参加するとおもしろいかも。

_ 類似性ってやつかな

なんか、怒ってるわけ。

仕事はできるし、ちゃんとプログラムも書けるやつが怒っているわけだ。使えねーとかくずとか言いながら。

そこで、いかがしたでござるか? とか言いながら見に行くと、何を呪っているかといえば、java.util.HashMapだ。

なぜ怒る?

だって、このくそったれのIteratorはくそなんですよ。

いや、そりゃ、ハッシュだから……っていうか、ちゃんとドキュメントを読めばLinkedHashMapってのがあるぜ。

で、気づくと、世界(地図は世界の射影か、それとも世界が地図の射影か、まっぷまっぷ)はすべてリンクされているのであった。

という、4〜5年前にJavaでシステム作ってる時のエピソードを思い出す盛り上がりっぷりだった。

人はよく知らないものについて、仮定をもって臨む。あたりまえだ。

で、その仮定は、どうもシーケンシャルなようだ。だから、つっこんだ順に列挙されることが当然と感じる。

さらに10年以上(だと思う)前に、最適化によって実行オーダーが変わることをアセンブリリスト眺めて怒ってた人のことも思い出したり。順序が変わるって、驚天動地な、それまでの天動説が地動説になるような衝撃なのかも。

たしかに、時間はまっすぐに進み、行動は行ったきりで、幸運の女神の髪は後ろにたなびく(と思うと前髪なので誰も掴めない)。

もし、それが感覚ってやつなら、つまり最初にやったことが最初にあり、次にやったことが次にある、と想像することが本能的なものなら、理屈じゃないことになる。

っていうか、順序だけど。最初にハッシュの説明があり、次にハッシュを利用したコンテナの説明がくれば、そういうもんだとわかるだろうし、わかっている連中は、そうやってわかっているに違いない。

でも、最初に、render :text, :foo => bar, :baz => dar というのを見たり、obj = { :a => 1, :b => 2 }という、そういうコンテナ(ハッシュと呼ぶらしい。ハッシュってなんだろう? ハッシュポテトはおいしいな、まあ、いいや。食べればうまいんだから)だというところから入ってしまうと、上で書いた仮定、つまり自然な動作、つまり時間順、やった順、手続き通り、と感じるのは自然だろうな。理屈じゃないんだから、証明する必要すらない。

まあ、キーを与えてのルックアップはハッシュ、列挙は時間(挿入)順ってのは良い落とし所かも。

かくして、人はその実装については知らずにすむのであった。

で、何を類推したかっていうと、ああ、関数型言語ってはやんないだろうなぁ、だって(そのでんでいけば)不自然だもんな遅延評価とか。とか思ったのだった。それでもなおきらめを踏破するのならマスターと呼ぶ声がする。

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

_ sugimotokazuya [TechEdのSeasar.NETセッションの際に、お声をかけて頂いたのに、まともな挨拶ができずにすいません。 セッ..]

_ arton [セッション、お疲れ様でした。それにしても盛況で、正直なところびっくりしました。]

_ sugimotokazuya [ありがとうございます。自分もビックリしました。5人くらいしかいなかったらどうしようかと心配していたのが嘘のようでした..]


2007-08-25

_ 買ったが既に読まない気がし始めた本

神は妄想である―宗教との決別(リチャード・ドーキンス/垂水 雄二)

本屋で平積みされてたので思わず買ってしまった。

このテーマを語る科学者というのは珍しい。だって、いんちきな科学とかを相手にしているのでなく、題を見る限り、神そのもの、つまり宗教を相手にしているからだ。

信仰は個人の世界認識の問題なんだから、お前が語る問題じゃないだろう、という指摘があるのは当たり前なのに、なぜなんだ? という好奇心。

帯を見ると911がどうしたと書いてあるけど、そしておそらくあのへんの人たちには相当な数のインテリもいるはずだから、その人たちに向けて書いている、わけないだろうしなぁ。だって、インテリがある人たちは、広報的な理屈付けに用いているかも知れないけれど、経済格差とか収奪構造とかの方向から結論付けて行動していると思うじゃん。いっぽう、ふつうの兵士はこの本を読むこたないだろうし。

つまり目的がわからない。

そこに好奇心を刺激されて買ったわけだが、そういうのを読むのって勢いが重要だな。というわけで、ちょっと詰んでおいたら読む気が失せてしまった。

追記;なんとなくゲームの順番待ちの間に読んだら、ふむ、日本と英米(とくくって良いようだ)の宗教に対する感覚の差はそこまで大きいのか。冒頭では、ある条件がついた候補者に対する投票行動についての調査結果を紹介している。女性、黒人あたりだと90%台のアメリカ人は気にしない、としている(というか、100%じゃないわけだな)。モルモン教徒(とわざわざ例に出されているということは、日本での創価学会程度の位置なんだろうか)だと70%台。しかし無神論者を名乗ると40%台ということは、過半数の人間は、無神論者というだけで頭から否定してかかるということなのか。それは驚き。

_ ASP.NET 2.0の本

Visual C# 2005によるWebプログラミング入門(arton)

(↑ほぼ別物↓)

Visual C#.NETによるWebプログラミング入門―XML WebサービスとWebアプリケーション構築のノウハウ (.NETプログラミングシリーズ)(arton)

さくっと以前のバージョン(Visual Studioの説明+Webサービス+スマートクライアント)の改訂版にするつもりが、ASP.NET 2.0入門になってしまって(というか、そうじゃなきゃしょうがないと考えた)、結果的にほぼ全ページ(使いまわしたのは1章と序章の一部くらいだな)書き換えとなった『Visual C# 2005によるWebプログラミング入門』です。Visual C# 2005と銘打っているので、当然、LINQとかASP.NET Ajaxとかの話は無し、というか、ASP.NET 2.0も完全網羅とはいかなかったけど、主要なものはすべて含めたつもりです。ASP.NET 2.0以降を利用した開発のお供にどうぞ。

それにしても、.NET Framework本がジェネリックや無名(匿名)デリゲートの追加でコレクション周りの説明を変えたのがほとんどだったのとは、えらい違いだ。

Visual C# 2005プログラミング入門(arton)

(こっちは改訂新版)

_ SEOコンサルティング

なんと、トップ100に君臨ですか。(追記:PermlinkってのはPermalinkじゃないのか)

ならば、ぜひとも、このあたりを貼り付けましょう。

筋肉バカの壁 [博士の異常な健康PART2](水道橋博士)

いや、バカ+テストでこれかも。

バカとテストと召喚獣3 (ファミ通文庫)(井上 堅二/葉賀 ユイ)


2007-08-26

_ お、復活している

よかったよかった。

あまりにも(おれが)くだらないこと書いたんで消されたのかと思った。

ちなみに、テスト+バカでもベスト100に当然のようにランクインしてる。が、この召喚獣って人気あんだな。トレンドが違うと、本当に全然、知らないもんだな。

_ Cのstaticなプロトタイプ

それなりに書くなぁと思って、最後にまともに書いたCのプログラムを眺める。

rjb.c

8行ほどやっている。

僕がなんとなく自分に課しているコーディング規約は、

・publicな関数は最後

rjb.cの場合だと、Init_rjbcore(rubyのrequireに対するエントリーポイント)と、Java_jp_co_infoseek_hp_arton_rjb_RBridge_call(proxyに対するエントリーポイント)。例外的にsafe_funcallは本来であればJava_jp_co_infoseek_hp_arton_rjb_RBridge_callの中に閉じたい関数なので位置は直前。

・処理の内容とか粒度とかでなんとなく自分が納得するまとめ方をする。(ソースファイルというシャーレの中にそれぞれの菌ごとにコロニーを作らせるというか)

で、たまに2番目の理由から位置関係が入れ替わることがあって、その場合にはプロトタイプ宣言する。

例)register_class

参照しているのは、setup_metadataで、クラスのロード時にいろいろいじくる関数の親分。ソースの2/3あたりの位置。

でも実装しているのは、Rubyとインタラクションする関数群を置いてある場所で、ソースの4/5あたりの位置。

で、位置が逆転しているのでプロトタイプ宣言あり。

ってことは、関数は僕にとって似たような処理で束ねるので、それは呼び出し順序(トップなのかボトムなのか)とは関係しない。束ねた関数群の並び順は、他のモジュール(他の関数)とのインタラクションが無し(先頭)、有り(後ろ)ただし特定関数と密に結合し過ぎているように思えるものは特例措置で結合されている関数の直前、というのが大まかなルールのようだ。

あと、普段はEmacsで^X-2以上に分けてそれぞれのコロニーをバッファに出して同時にいじくるので、そのへんの記述方法が影響してるのかも。で、コンパイルエラーになったらプロトタイプ宣言を入れるので、結果的にstatic関数のプロトタイプ宣言が出てくる。


2007-08-27

_ メモ

工業化によって、大量生産経由で多品種生産までが可能となったというのがあったとして、PCを買うとき、ある程度の組み合わせが指定できるが、にもかかわらず、安価なのは組立を労働単価が安いところでやっているというのはあるにしても、パーツの規格化とか組み立ての自動化とかいろいろな要素がからまっているのだとする。

工業化されたソフトウェアというのは、工場が個々のPCに存在する状態というように考えることができるのではないか?

ソフトウェアはハードではないので、物理的な工場はいらないからだ。

今、どんなプログラムであれ、多少は設定を変えることができる。IEですら、オプションである程度はカスタマイズできる。そのかわり、オプションを解釈するプログラムをIEの実装者は実装している。実装は人間がしなければならないのだろうか。

Emacsもカスタマイズできる。elispをプログラムしてやって、かつ機能がelispから操作可能であれば。素人には手が出ない道理だ。

これとネットワークを組み合わせることを考える。

モデルとして、今、近いものをもってくると、大戸屋とか花丸うどんとかに近いかも。

WebでWordを買う。まず基本機能を5000円。で、サブミットすると、メニューからいろいろ選べる。編集機能拡張メニューで、シソーラス 200円と、自動保存 10円と、ヘルプ拡張メニューで、イルカ 30000円 と、その他メニューからトッピングでExcel連携 5円 を払うと、部品がPCにダウンロードされてきて工場が動き出して、おれさまWordがぽいっと生産される。

ここで工場が、単にプラグインの組み込みというレベルではなく、シソーラスの追加により基本機能が一度分解され、必要な個所にインタラクションが組み込まれ、呼び出しが生成され、というように工場によりプログラムされることを想像してみる。

そのような工場はおれには不可能とは思えない。アノテーションって、あるいはジョインポイントの設置とかはこういうことをやるための機能のはずだ。

そんなものは不要? であれば、基本機能だけを買えば良い。安いよ。

いや、でも絵文字の表示をしたい。

そこで、ソフトオンデマンドで拡張部品として絵文字表示 200円を注文すると、3秒後に、必要な何かが(それはActiveXコントロールとかプラグインではない)落ちてきて、また工場が活動を開始する。

基本機能をばらして、組み込まれているシソーラスとかとコンフリクトしないように考えながら、かちかちと絵文字表示機能を組み込んでいく。で、チャラーンと音がすると、オレ様Word2号絵文字表示機能付きができあがる。

PCの基本機能 + メモリー1GB増設 − DVDROM + DVD+-RW - 106キーボード + 101キーボード でおいくら、みたいな感じのことだ。それが手元で数分でできる。あとからオプション構成を自在に変更できる。

不要な部品は50%掛けで返金してくれる(あるいはプールされる)。

良く考えたら日本語しか使わないからシソーラスは削除(-150円)で、代わりに国語辞書検索(800円)+ 国語辞書(1000円)の追加ね。

でまた工場が稼動してオレ様Word3号が完成する。

ソフトウェアの工業化というのはそんな感じだ。

_ クォート

太陽の男たちはクェートを目指すわけだが、クォートが目に付いたので。

ExpressionType.Quote

プログラム=データ(コメント欄も)

マクロな教育とファンクショナルな教育ってのをそっから想像したり。マクロな教育では生徒をありのままに扱う。ファンクショナルな教育は生徒をいじくる。

マクロな教育を受けた生徒は広がりを獲得する。ファンクショナルな教育を受けた生徒はそれに染められる。

とか。

_ ラタトィイユ

原題のダジャレを生かすとチュープかなぁ。あまりにくだらないし、と思ったけど田舎風シチューでいいじゃん、とか気づいたが、そりゃどうでもよい。

ふと気付いたが、なかなか痛烈な内容でもあるな。

・血筋の否定

おやじがえらい料理人でも息子はぼんくら

・努力の否定

(本人のセリフで言ってるくらいなわけだが)血のにじむような努力で女性にもかかわらずがんばってます(が、たぶん教科書通りのろくでもない調味料を入れようとしたり、紋切型の料理を出そうとしたりして、いつもレミーを困らせる)

努力の否定というより、優等生的な努力の否定ということかな。

では逆に肯定されているものはなんだろう?

レミーの描かれ方を思い起こす。

・誇りの維持

とにかく兄弟がなんと言おうと2本足で歩くのはそういう感じだ

・運の良さ

流れ着いたのが、とかいろいろ

・ひらめき

こればっか

・あきらめの悪さ

最初のスープの味を直すところとか

・努力

マジンガーの操縦については努力してるな(あきらめの悪さと等しいだけかも)

・無理なことは自分でやらない

マジンガーを使うところもそうだし、いざとなれば群れさえ使う

・妥協のなさ

コレットの助言を断固拒否しまくり

・常に自分が正しい

こと料理については、まったく弱音もなければ、疑いもなく、上の妥協のなさと同じか。

結局、天才万歳じゃん、と言えなくもない。

で、だいたいにして、歴史を紐解くと、天才って周りから理解されずに苦しむと相場は決まっていて、ガロアの論文は無視されて決闘に負けて死ぬし、ベートーヴェンは苦悩して耳が遠いし、ランボーは絶望してアデンへ行ってしまうし、ロートレアモンは誰だかわからんし、モジリアニやバルトークは異国で腹を減らして死んでしまうし、もちろんレミーはネズミだから調理場へ近づくのもなかなか大変。

でも、そういうのはつまらない。

そのへんもあって、レミーはどうでもよくて、おれにとっての主役はイーゴなのかも知れないな。

#というか、イーゴがまさにその代表なのだが、ぼんくらマジンガーにしろ(すでに名前を忘れた)、コレットにしろ、ある分野についてすごいやつを(ほかの慣習的/情緒的/常識的な要素をまったく無視して)素直にすごいと認める人たちがいて、協力を惜しまないで、しかもそれが成功するところが、おそらく物語としての肝なのかも知れない。

#というか、こと料理に関してはぼんくらかも知れないが、給仕としてはすさまじい才能の持ち主だというところは救いになっているのか。

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

Before...

_ arton [気づいてくれてありがとう。]

_ ksh [> おれにとっての主役はイーゴなのかも知れないな。 僕もそんな感じでした。あの映画はイーゴが無くした物を取り戻すこと..]

_ arton [>他人の才能を生かすという才能 ああ、なるほど。ただ、結構、あいつも野心家なんですよね(最初、独自のスープを作ろうと..]


2007-08-28

_ ThinkPadの話

「IBM ThinkPad(シンクパッド)の創造:大崎勝彦&岩見知行グループ」

おもしろい。この話が本当のことだとして、いずれなんかすごいものはスカンクワークから生み出されるというような教訓が出てきたり。

いや、実はスカンクワークかどうかは重要ではないかも。

と、

超マシン誕生―コンピュータ野郎たちの540日 (1982年)(トレイシー・キダー/風間 禎三郎)

を思い出してみたり。超マシンは、オルターネイティブプロジェクトというか、バックアッププロジェクトで、それなりに正規のワークだ。

むしろ重要なのは、逼迫したリソース、少人数(しかも必ずしもその企業の精鋭部隊というわけではない、から逆にルサンチマンが強力なモチベーションとなったり)、少ない監視(レポート)、あたりが重要なのかも。でも、それはもしかしたら、特攻隊的なものかも。だとしたら失っているものも大きそうだし、というかそういうことを気にする人間が入り込む余地がないところが強みなのかな。

_ サッポロ

電車に乗ったらモニターの中で給仕が踊ってた。

なければつくればよい

正しい。

_ 黒歴史

なかったことにしたり、死んでしまった(だから結局はないことになる)ことにすることを黒歴史化と呼ぶのだとして、でも、そりゃ違うよなぁという印象。

というか、珍しくsumimさんがきつい言葉でディスっているのだが、なんかやっぱりタイミングとかあるんだろうな。

まず、やはり同時に片手を超えるものは扱えない。だから、どうしたって選別することになる。ここで選に漏れるってのは、(極端に悪いものは別として)良し悪しじゃないんだよな。結局はタイミングなのだ。たまたま知り合いが使ってたとか、たまたまちょうどリリース時期にあってたとか、たまたまインストールしやすかったとか、なんかそんな感じ。で、まったく異なる世界であれば、逆に乗り換えも検討するわけだが、それなりに近いと乗り換えのモチベーションも沸かないし。おれにとっては各種BSDとかもそんな感じだな。LinuxとOS X(使ってないとも言えないのかも)とWindowsがあるしな。でも、無視される(言及もされない)ってのは、本当の意味での死なのであって、なんであれ言及されるってのはそう悪いことじゃないんじゃないかな。それで逆に興味を惹かれる人(つまり、ちょうどそのタイミングにあった人)もいるとは思うのだが。

かつて例を見ないほどインストールベースが増え

ってのはOLPCのことかな。

追記:語源を尊重しましょう

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

Before...

_ mumurik [おお、通じた!って人ん家のコメント欄で何やってるんだか(^^; >自分 でも黒歴史といえばあのシーンは外せない。]

_ arton [ううむ、無教養はかっこわるい。これもタイミング(機会の意味で)だから劇場版でも見とくとするか。]

_ arton [ハリーの災難というのが最初に見えたからヒッチコックかと思ったけど、やはりあれだけの監督だからヒッチコックとかからも学..]


2007-08-29

_ 黒歴史

ううむ、向井さんまで言及されているとは。というか、ょゎさんも。

ちなみに、ウィキペディアの記述が充実しているというか、実に愛されてますね(富野監督がなのか、∀がなのか、ガンダムという世界がなのか、それとも言葉そのものなのかはわからないけど。というかうまい言葉ですね)。

でも日本語じゃない、とgoo検索やったら、0件ではないのだが微妙な結果。ウィキペディアがここに出てくるのは良いことなのだろうか? (いや、よくないと言い切れるほど反語的な利用ではないのだが、100%の肯定はしがたいのである)

_ ターンA

劇場版でも見るかとか書いてみたものの、いっぱいありすぎて良くわからない。

さすがにテレビ版はあるけど、これ全部見られるとは思えないから、それはないとして。

∀ガンダム MEMORIAL BOX 1 [DVD]

∀ガンダム MEMORIAL BOX II [DVD](安田朗/大河原邦男/富野由悠季/矢立肇/菅野ようこ)

では、劇場版はというと、全部入りになっちゃうのかな?

機動戦士ガンダム 劇場版メモリアルボックス [DVD]

(と思ったら、このボックスは黒歴史そのものしか入ってないのか)

ターンAガンダム I 地球光 [DVD](安田朗/菱沼義仁/富野由悠季/矢立肇/菅野ようこ)

ターンAガンダム II 月光蝶 [DVD](安田朗/菱沼義仁/富野由悠季/矢立肇/菅野ようこ)

この2つでいいようだ。というか、「∀ガンダム」で検索してもだめ(∀が無視される)で「ターンエーガンダム」で検索するのがコツのようだ。(追記:「∀ガンダム」で検索したら、そりゃ「(すべての)ガンダム」になるにきまっている(とはどこにも書いていないが)、そういう記号だ)

_ ファイルシステム

オブジェクトファイルシステム

おもしろい。

RYOを旗印に出かけて行ったら、ファイルシステムも自作ですが何か、みたいに言われたということなのかな。

そういえば、構造化記憶というのがそんな感じだった。NTFS上のファイルの中に構造化記憶というファイルシステムがあったわけで、なんかその入れ子の構造やAPIが使っていておもしろかったし、Commitができるので、基盤として利用してたら、NT4ではIStorageの数に4000だか2000だかという致命的な(明文化されていない)制限があってとんでもないトラブルになったことを思い出したり。


2007-08-30

_ ドイツの大規模開発

どっかで、アウトバーンの哲学というような記事を読んだ。

最高時速を決めてないから、ヒルトップで急ブレーキの跡がつきまくってて(丘の向こうで渋滞ってことだろう)、アメリカ人の筆者はびびるというか、こいつらバカじゃないかと思うだかするってようなの。その点、アメリカでは100マイル制限があるから安全ですなぁとか。

(斜め読みしただけだから、間違っているかも)

これって、あれだね。

100マイル制限で安全ってのは、型チェックや宣言されていない変数の出現とかを事前にコンパイラするから安全ということみたいだな、と思った。

日本もそういう意味じゃアメリカ風で、60Km制限(首都高のほとんど)とか80Km制限(中央道のほとんど)とかだ。アメリカよりも(100マイルって120Kmくらいじゃなかったっけ)制限がきついのは車が小さくて頑丈じゃないからかな。

もし、その自動車の速度というか高速道路の運用に関する知見が国民性に根ざしたものだと仮定すると、プログラミングというかソフトウェア開発の知見にもそれが反映されていてもおかしくない。

とすると、ドイツでは大規模開発(高速道路ってのは空間が大規模なわけだから、そう考えてみた)でもPerlとかRubyとかPythonとかががんがん使われているのだろうか。

というか、いったい、どんな言語が開発の主流で(たとえばSAPは何を使って開発してるのかな)、どのようなプロセスが利用されているのだろうか。

いっぽうロシアではBASICで大規模をやっていた、ということはないだろうが、ロシアではどのような言語、どのようなプロセスが主流なんだろうか。

フランスはどうだろうか? PASCALとかだったり、いや実は(関数型言語が強いような気がする)OCamlとかだったり。

イギリスはどうだろうか。イタリアや、スペインは。長いこと鎖国してたポルトガルはどうだろうか。

アメリカでは〜が主流だから+半年で日本が後を追うってような話は聞くが、ヨーロッパはどうなんだろうか。IntelとMicrosoftはヨーロッパでもIntelとMicrosoftだろうから、実際にはアメリカと変わらないのかな?

追記:「全体としてドイツのITは日本よりも官僚風・職人風に見えている(hfuさんのブックマーク)」。TYPO3について言うと、違いがあるようなないような、微妙な感じですね。

_ 2000年のルポなんて読んでないだろう

これが基礎文献(最初のとっかかりとしても)だと思う。おれは単行本が出た瞬間に買って読んだから、手元のは初版でそれが2000年になっている。20世紀の終わりにルポされた21世紀の日本の姿を描いた本である。

機会不平等 (文春文庫)(斎藤 貴男)

文庫本に落ちてることだし、まずこれを読むとこから始めたらどうか?

身近な例として、2000年のこの本には出てこないが「未踏」に税金使うことの理由もここらから読めてくる。

真に興味深いのは、この本が文藝春秋から出版されていることだ。おかげで、その時点のトップが将来展望をわかりやすく言葉にしているのが取材できている。

結果的にこの本は、著者の思いは確かなものではあるけれど、本来届いて考えるべき人は気付かないまま、届ける必要がそれほどはない側に届いていろいろ考えることになる本となっている。まあ、書物というものはどうしたってそういうものになるけれど。国民が選んだ政治の通りに世の中がかっちりと進んでいるのだ、といえばその通り。

「ノブレスオブリージュ」という単語は早くもこの本で出てきているのだが、なんのことはなく、このときにはすでにノブレスオブリージュの登場を前提として話は進んでいるわけですな。それがルポされてから7年か。

東大への進学率での興味深い観点からの比較が出ている。直接的には所得についてではない。都立高校のいわゆる名門校の凋落についてだ。

逆の見方をすれば、機会が与えられているのならそれは生かさなければならないということでもある。

あと、気づいたが、ある程度の年齢の人間が語るとき、状況が数年単位で変化しているということを意識しないと意味がないね。結構ドラスティックに変化しているから。(おれのときはどうだった、みたいなのが単にそのおれさま個人の特異性だけでなく、時代特性まで含んでいるということ)

_ system関数の使い方

ちょっと間抜けなことをやってしばらく悩んだのでメモ。

次はだめ。

system "foo x y >/tmp/foo.log 2&>/tmp/foo.log"

さりげなく動くのだが、引数が正しく渡らない(っていうか、これは理由がわからないので、機会があったら調べるかも、と思ってやり直したら全然違う結果になったり、あまりよろしくない)。

追記:&の使い方が間違ってるのが原因でおかしな動きになってた。バックグラウンド実行になるから変だったのか。というか>& という書き方を中途半端に覚えていて無茶苦茶書いてた。正しくは、"foo x y >/tmp/foo.log 2>&1"

追記:以降はどうでもよくなったけど、まあ、残しておく。

正しくは

err = STDERR.dup
STDERR.reopen('/tmp/foo.log', 'w') # 1.8では第2引数不要
out = STDOUT.dup
STDOUT.reopen('/tmp/foo.log', 'a')
system "foo x y"
STDERR.flush
STDERR.reopen(err)
STDOUT.flush
STDOUT.reopen(out)

なんか煩雑だ。

def system_with_log(cmd, path)
  out = STDOUT.dup
  STDOUT.reopen path, 'w'
  err = STDERR.dup
  STDERR.reopen path, 'a'
  ret = system cmd
  STDOUT.flush
  STDOUT.reopen out
  STDERR.flush
  STDERR.reopen err
  ret
end

とかだな。

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

Before...

_ arton [>たとえ話はどっち向きの類似性も主張できてしまう まあ、そうですね。どこに着目するか勝負だから遊び(連想ゲーム)みた..]

_ shiro [相乗り専用レーンは守らないと数百ドルの罰金ですが、日本はどうなんでしょう? 似たような例で、駐車場がどんなに混んでて..]

_ arton [>数百ドルの罰金 あ、なるほど。日本だと路肩は一応違反キップ(2点)になるようですが(取り締まっているのを見たことな..]


2007-08-31

_ グリフィス復活

2週間ごとに分厚いのがコンビニに売られるせいで、あっというまにベルセルクの小山ができてしまった。しょうがないなぁ。

それにしても

見事だ!!

人間の身でよくぞここまで練り上げた!!(ゾッド)

(こっちは相手)

何という男だ

人の身でよくぞここまで練り上げた(アーカード)

(こっちは主役)

というのがちょっとおもしろかったり。!!がないぶんだけアーカードはそれほど感心してないらしい。

それにしても、魔物と戦争が続く世界だけに、屈託なく生きているのがパックただ1人っぽい(鍛冶屋の養女はわりと屈託なさげだけど)だけで、あとは何かしら心に闇を抱えているところが悪く言えば鬱陶しく、良く言えば物語に深みをもたらしてるな。そんな中、ルカ姉さんが奇跡のような存在なわけだが、これでお別れか。

_ バブル

そういや気になってるんだけど、バブルってどういう意味で使ってるんだろう。

おれの理解では、本来の価値(たとえば100円とするじゃん)を遥かに越えた価値のものとして(たとえば1000円とするじゃん)取引されることになった状態を言うのだと思うのだが。で、あるとき、王様は裸だと言い出して寝た子を起こす子供がでてくる。すると、1000円の価値として1000円を借りていたつもりが、あんたの質草は100円なんだから、さっさと900円返せごるぁと言われて破綻するってことなんじゃなかったっけ。

だから、1000000円の屋形船を10000円の漁船だと思って遠洋漁業に出かけて拿捕されて帰れなくなるってのは、バブルっていうのじゃなくて単なる勘違いってことなんじゃないのかなぁ。5人の芸妓さんと2人の天ぷら屋さんと15人の粋人が乗り込んでそのへんを漂っていれば気持ちの良いもんなんだが、それを20人の足を鎖で繋がれた半裸の漕ぎ手と1人の船長と2人の一等航海士と3人の2等航海士と、20人の釣り師で乗り込む(さすがに、そういう乗り方はしないだろうけど)のは、違うような気はするなぁ。もちろん、船なんだからきちんと装備すれば問題ないとは思うけど。

遣唐使の時代、ぶかぶかの衣を着て風呂に入らず何やらもごもご呪文を唱えるまじない師みたいなのを乗せてたそうだけど、そのての連中を5人くらい用意できるとまた話は違いそうでもあり。

_ やっと再発

待ってれば再発されるもんだな。

クリスタルナハト(PANTA)

さっそく予約。

あわせて買いたい

水晶の夜―ナチ第三帝国におけるユダヤ人迫害(H‐J・デッシャー/小岸 昭)


2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|

ジェズイットを見習え