最新

val it : α → α = fun

<<  2008/11  >>

2008/11/20 Cのシンボルを置換する方法

http://q.hatena.ne.jp/1227069551

これについてはhandyな解決策はないだろうと思う(GNU globalでできる、という回答があるけど本当だろうか。globalそんなに真面目に使ったことないからよく知らないけど、ないだろう、という仮定のもとに以下の文章を書く)。ある識別子と同じ字句がコメント内や文字列リテラル内などにないということがあらかじめわかっているなら、ただの文字列置換でもできるのだけど、そうでもないなら少なくともコメントと文字列ぐらいを解釈する程度の簡易なトークナイザは必須で、それぐらい書くのはそれほどしんどいわけでもないだろうが、こういう質問に対して「パーサ書け」という回答をするのはさすがに人を馬鹿にしすぎているというべきだろう。

一瞬だけ思ったのは、cppにうまいことオプションと-Dを渡せばそういう動作にならないか、ということだが当たり前ながら無理のようだった。当然のように#includeや#defineはすべて展開されてしまうし、/* */のコメントは消えてしまう。//は残るけど、その中の文字列はcppの置換対象。

まあ、回答に対する質問者の反応を見る限りでは、つまりsedとかでよかったらしいけれど。

ところで、同じく回答を見ていて知らない人も結構いるのではないかということに気づいたのだが、sed/perl/rubyには-iというフラグがあって非常に便利なのでおすすめしておきたい。この質問の回答者のように、

sed -e 's/foo/bar/g' $i > $i.tmp && mv -f $i.tmp $i

などとしてもよいのだけど、これは次のようにかける。

sed -i.tmp -e 's/foo/bar/g' $i

(私はよく-i.bakとするけど)。-iはファイルをin-placeに更新するというフラグだが、-iフラグには引数を指定することもでき、指定するとin-placeに更新するのだが元のデータも指定した値を末尾につけた名前のファイルとして残す。言葉で書くと煩雑だが、つまり上の例は、

mv $i $i.tmp; sed -e 's/foo/bar/g' $i.tmp > $i

とほぼ同じ動作になるということ。-iでバックアップしつつ変換してしまい、うまいこといったと確認できたらバックアップは削除する、という感じだ。処理に自信があるなら-i単体にしておけば元のファイルは残らないし、中間ファイル名で思い悩む必要がないから気が楽。perlの-nや-p、それに影響を受けたrubyの-nや-pも同じように-iがある。もちろんmvやcpと使えばいいけれど、複数のコマンドの組み合わせではなくてコマンド単体で動くことにはそれなりの価値があって、たとえばfindやxargsと組み合わせやすい。

このフラグはこういうケースですごく便利なので、あらゆるコマンドに付属してくれると素晴らしいことが起こるような気がする。というわけで、任意のフィルタを引数にとり、標準出力に書き出す代わりにin-placeに更新するというinplaceというコマンドもある。あるというか、多分パッケージとして存在するのはFreeBSDだけだろうがRubyで書かれているのでその辺の普通のOSで動くと思う。もっとも、「これはすごく便利に違いない!!」と興奮して入れてみたのだが実際使ってみたことは数えるほどしかないけれど(笑)。

ちなみに、これまた有名な話だがsedはそんなに速くない。バージョンいくつかからだったか忘れたけどGNU sedは真面目に多言語処理をするようになったため急激に速度低下してしまった、という話じゃなかったかと思った。ともあれ一般的なケースではperlの方がよっぽど速いので、sedは存在を忘れた方がいい。どうせちょっと複雑なことをやろうとするとsedスクリプトなんか書いてられない(まあ私はpelすらまともに書く能力を失ったのでrubyでちょこちょこ書きますけれども)。

というわけで何のはなしだったっけ……ああそうそう、sedでもperlでもrubyでもいいけど、-iは覚えて置いて損はないです。


2008/11/14 好きなあの子の嫌なとこ

http://www.kt.rim.or.jp/%7ekbk/zakkicho/08/zakkicho0811b.html#D20081112-4

こういう聞き方はいいね。結局、よくわかっていないと本当の弱点はわからないものだし(ささださんに話を効くとRubyのまずいところをいくらでも語ってくれる説)。まあ中には本当にわかってんのかなあという回答もありますが、それはさておき。個人的には特にプログラミング言語そのものに対するこだわりが薄くなっているので自分で書こうという気はないですが、Haskellについてわかりづらいところがあると思うので説明しましょう。

The big implementations handle I/O in ways that don't seem quite compatible with the standard. (In particular, outputting characters only outputs the low 8 bits -- and then code gets built that uses this assumption to do binary I/O. Ick.)

読んだ瞬間「あ、あれね」という感じですけれども、まともに使ったことがある人じゃないとわかりづらいですね。

まず、Haskellにおける文字型(Char)は1文字=Unicode文字と定義されています。ところが実装がまずいせいでCharをputCharとかで出力しようとすると、最下位の1バイトしか出力されないんですね。「あ」が "B" になっちゃうという具合。そういう事情もあり、実際にはCharをバイト列であるかのように扱う流儀があります。その方が簡単なんですね。たとえばhGetContentsでファイルを読み込むと文字列が手に入るわけですが、この場合は普通に1バイトずつCharに収まっているのです。さらにバイト列として高速に文字列処理をするByteStringなんてのもありますし...

Text.Xhtmlというxhtml出力ライブラリがありますが(たぶんこれなんかはone of the big implementationsでしょう)、これは1文字がisprintじゃないときはChar単位で数値実体参照に変換するという実装になっていたんですが、そうすると生のUTF-8バイト列の日本語を入れたときに大変なことになるので、U+FFまでの文字はバイト列とみなして実体参照に展開しない、という極めてuglyなhackを入れた犯人は俺です。超すまん。今どうなってるか知らないけど。

さて、これで終わりなら話はまだ楽なんですが、続きます。Haskellの言語仕様上1文字=1Unicode文字という定義になっていました。これは字句的にもそのような定義になっており、Haskell98ではファイルのエンコーディングに関する議論は全く無く、ファイルはあたかもUnicode文字の連なりであるかのような仕様です。とはいえ実際そんなわけはない。ただ昔はこの仕様は別に守られておらず、たとえばGHCではファイルはLatin-1でエンコードされているという前提になっていて、Latin-1ならバイト列をそのまま通し、そうでないならコンパイルする、となっていました。が、もう何年か前の話ですが、GHCはファイルのエンコーディングをUTF-8とみなすという方針に変更し、ファイルの中身をUnicode文字の連なりとみなすということになりました。このため、これまでLatin-1でファイルを書いていた人が「俺の名前が入ってるとコンパイルできないんだけど!」とか微笑ましい相談をMLに投げたりしたものです。

サラッと書きましたが、実はこいつは合わせ技で非常に面倒なことになります。たとえばプログラムのコードで putStrLn "あ" って書くと、この"あ"はUTF-8でエンコードされているんですが実際には"\u3042"と同じ扱いになり、putStrLnは下位1バイトしか出力しないので"B"になる、とか楽しい展開が待っています。

で、ブログを作るとして、お気楽に「コメント」とかをプログラム中にリテラルの文字列か何かでそのまんま埋め込んでおいて、もちろんコンテンツはどこかにUTF-8のバイト列にして保存していたときにどうなるかは、みなさんにも想像がつきますよね? この辺、もうしばらくさわってないので最新の状況は変わっているかもしれませんが、Haskell界隈でi18nに燃えている人って心当たりがいないので多分放置されているんじゃないかな。

あ、それで、つまりstandard的にはChar=UnicodeなんだけどChar=Byteであるかのようなnon-standard wayな実装は結構いっぱいあってわけわからん、と言うのが元の話だというわけ。いやしかしあれだね、悪い方が良い原則を思い出すよね。


2008/11/09 梅田望夫は「意」か「情」か

意の文化と情の文化という記事を読んで、なるほどなあと思いつつ未読なまま(帰国したら読もうかなと思っているが)これは応用が効きそうだな、ということをいろいろと考えていたのだが、さて梅田望夫は意か情だろうか。

もちろん、人間そうそうどちらかに切り分けられるわけじゃないと思うのだが、たとえば彼もこれまでもいくつもバカバカしくひどいコメントを見てきたはずで、それで鬱屈した感情がついに噴出してtwitterに愚痴った、などといった見方は一面的だしどうもそぐわない(個人的には)。「おう、そうまでいうなら読んでから反論してやるよ!」とでもいうような反応を期待して怒ってみた(挑発してみた)のではないかな。でもそうであることを理解されない反応ばかりで、今頃は「失敗したな」と思っているのではないだろうか。

こういうことを書くと「そんなことまで推測して反応しなきゃならんのか?」みたいなそれこそバカバカしい意見が出て来るものだけど、もちろんそんなことはない(書いたものに対する反応を見誤ったのは彼のミスだろう)。けど、まさに情という側面だけで自分が傷つけられたと感じて反応するのはそれこそ全然生産的じゃないような気がするし、反応を見ているとすっかり梅田を叩くという「空気」が醸成されていて、本来的でない点(たとえば書評の体をなしていないとか文章がよくないとか、そういう辺り)を攻撃しているのを見るにつけ、炎上ってのはこういうものだとわかっていつつなんだかなあと思うのだ。


2008/11/08 未体験の味

宿の近くにトルコ-中東風の料理のお店(要するにケバブとかだけど)の店ができていて、そこで飯を食った。それは良かったけど、ついでにドリンクでも、と目を走らせてなにやら怪しいものがあったので頼んでみた。それがこのヨーグルトソーダ。店頭に並んでいたときは沈殿していて下が白く、上は透明になっていた。 よく見るとパッケージには「SHAKE GENTLY BEFORE OPENING」とか書いてあるぞ。振っていいのか、これは、と疑問に思いながら何どかボトルを上下に回して攪拌したあとがこの写真、という状況(それにしてもピントがあってないなあ。iPhoneてピント調整できるのか?)

で、飲んだ。

日本の「飲むヨーグルト」というやつがあるでしょ。ぼくはあれは好きですよ、そんなに飲まないけど。カルピスソーダもぼくは好きだ。どっちも甘いしね。でもご存知のようにヨーグルトそのものはべつに甘いわけじゃなく、むしろ酸っぱい。で、あれなのね、これは。加糖されていません。

まあ、でもね、言ったら何だけど多分そういうんだろうな、とはぼくも思っていたんですよ。みなさんも、こんなのが並んでたらそう思うでしょう。ちょっと酸っぱい炭酸飲料だろうなと。でも単にそういう言葉で表現するのと実際に味わうのじゃこれが大違いというやつでして、酸味はなかなか強くあとから押し寄せる微炭酸がこの味わいをかなり複雑なものにしている。複雑だが、おいしくはない。

ラッシーってあるでしょう。インドの乳飲料で、店によっては加糖してたりするけど、あれもさわやかな酸味がある。あれはなかなか良い。それから、無味の炭酸水って嫌いな人が結構いるけど、ぼくは割と好き。でもこれはないな。久々に面白いものを飲みました。

製品名で検索したら飲んだ感想を書いている(もちろん英語の)ブロガーがいっぱいいて、いくつか目を通したら全く褒めてない(笑)。ゲゲボドリンクとしての地位を確立していたらしいよ。

気になるのは、ボトルに書いてある www.abali.com が期限切れっぽい感じでドメイン業者の広告になってることなんですが...おいおい大丈夫なの?


2008/11/01 ハロウィンの風景

先週末にサンフランシスコにでかけたが、こちらの人は買ったパンプキンをベビーカーで運搬するのが一般的なのだろうか。最初見たときは相当驚きました。

週末の観光地も仮装した子供がいっぱいいたが、今日(こちらはまだ31日)は職場に行って朝食を食べていると木ノ葉の隠れ里の忍者がトレイに食べ物を載せて歩いていたり、眼帯をした海賊がうろうろしていたり、トイレに入れば真剣にメイクをしているゾンビがいたり、していた。周囲の同僚は普通だったが、ああいう格好の人はあの姿で仕事をしていたのだろーか。楽しげだ。

ハロウィンの仮装というのは、起源を辿ると妖怪とか妖精とか幽霊とか魔女とかの格好をするもののようだが、さっぱり関係なく単に猫耳のヘアバンドをつけていたり、角をつけてみたり、単にアメコミヒーローやアニメキャラや映画のキャラのコスプレだったり、お姫様とか中世ヨーロッパ風の扮装であったりするのもよく見かける。よくわからないがなかなか楽しい。

////

話は全く変わるが、ミクシィ年賀状というやつは、いいか悪いかはさておき(というか全然良かないと個人的には思うのだが)、いかにもミクシィらしいな、と思ったことであった。アナウンスされてみると今までそのようなサービスがなかったことが不思議なくらいしっくりと来る。そうじゃない?

ではその「ミクシィらしさ」とはいったい何か?

簡単にいうと日常性というか、ありふれているものというか、私たちの世界の地縁、血縁に密着した社会というか、そういうものがベースになった風習というか文化というか、そのようなもの(ちっとも簡単でないな)。実際問題としてぼくのマイミクにはそういう人は多くないのだが、現実にはそういう利用形態が多いのであろうというイメージを持っているというわけだな。


2008/10/26 エロゲーの歴史

http://urasoku.blog106.fc2.com/blog-entry-539.html

少なくとも、回収騒ぎがあってモザイクを入れたり18禁マークができたりソフ倫が立ち上がったのは90年代前半なんですが(ウィキペディアによると91年らしい)、ちょっとそうは読めないでしょう、これ。

ほかにもいろんな流れがあるのを記述し切れておらず偏っているが、まあそういうものとして読むべきだね。こういうのは語りたがる人が多いし、その人の数だけ別の歴史があるものなのでなかなか難しい。そうしたなかではまあまあバランスがいい方だろうと思う(思うが、私のエロゲーの知識は相当昔で停滞しているのでわからん。長らくウィンドウズ持ってないからね)。

それにしてもアリスソフトのゲーム性の高いものが完全に無視されているなあ。たしかに主流ではなかっただろうが(しかしなんだな、こんなふうに何かに言及すると、自分がそれに強い思い入れがあるように読まれる気がするのが難しいところだ)。

////

ところで、はてブの反応を見ると「これはひどい」という人もいるが、ひどいとまでは言いがたいところ。何かを無視しているというのを、個人的な思い入れを除外して、取捨選択の結果として特定の作品が除かれているという理解のもとで観察するとそれほどひどい取捨選択というわけでもないというところだろう(ウィキペディアの微妙な記事を読んだ時の感想に、そういう意味で似ている)。うーん。


2008/10/25 選挙ポスターのはなし

ところで、またマウンテンビューにいる。

で、街中をふらふらとしていたらデカデカと人名が書いてあり、脇にCITY COUNCILとか書かれた謎の立て看板が林立しているのを何度も見かけた。どうも市議会議員選か何かがあるらしいのだが、驚くのは情報量の薄さだ。有益な情報としては、名前ぐらいしか情報がない。あと文言としてあるのはCITY COUNCILとかVOTEくらい? 自分のページを持ってる人はURLも書いてあるけど、基本的に「俺に投票してくれ!」という主張しかしていないわけだ。そんなのありか。

日本の選挙ポスターを見てみると、だいたい基本フォーマットは名前と顔写真、それによくわからないキャッチコピーだと思う。ああいうのによくある具体性に欠くキャッチコピーにも辟易していたのだが、顔写真もなし、コピーも選挙にかける意気込みもなんにもなしで「VOTE VOTE VOTE」と書かれるとさすがにげんなりする。こっちの人の感覚からするとそんなでもないんだろうか。ないとないで寂しいものだ。

しかしなんだな、どうせ選挙ポスターの内容量なんてしょぼいもんだし、あんなものを見て投票相手を決めつやつなどいないだろう(選挙カーなんかも同じ)。つまり効果という意味では同じようなものなのだから、みんながこうならこれでいいのかもしれず、いったい自分が何に驚いていたのかよくわからなくなる。たかが市議会議員レベルでも個人のドメインを持っていて選挙に活かそうという発想を持っているだけマシなのかもしれない。

オチはなし。

関係無いけど沖縄の選挙の話をちょっと思い出した。「けいこ」とだけ書かれたポスターとかはテイストが近い(けど、こんなお祭り騒ぎではない、もちろん)。

(追記):

で、またふらふら歩いていたら A BETTER MTN. VIEW というキャッチコピーも書いてある看板を発見したので、折角書いた文章の前提が崩れてしまった。でも、全く無意味だけど見るとこういうのがあるとなんか安心するな(笑)。


2008/10/23 フリップフロップ演算子にはいつも混乱する

http://www.kt.rim.or.jp/~kbk/zakkicho/08/zakkicho0810c.html#D20081022-3

Rubyではブロックローカル変数は繰り返されるごとに初期化される、というだけかと。

>> ([true, false]*3).each{|b| x = "foo" if b; p x}
"foo"
nil
"foo"
nil
"foo"
nil
=> [true, false, true, false, true, false]

で、ここでのキモは (first=true)..false はフリップフロップ演算子なので、

  • 1回目のループでは左辺条件が実行され、trueなので右辺条件が実行され、falseなのでこの条件式自体は真
  • and first なのでif式の条件も真なので実行される
  • 2回目以降は右辺条件だけが実行され、左辺条件は実行されないまま結果は真
  • and first だがfirstはブロックローカル変数なので初期化されていて、代入文が実行されなかったのでnilのままとなり、条件全体は偽になる

ということですね。

それにしてもフリップフロップ演算子って現実的にどれぐらい使われているものなんですかね。使ったことないなあ。


2008/10/21 1つ前の記事の修正

後で気づきましたが、ベイリーの最後の長編はThe Great Hydrationじゃありませんでした。Eye of terrorが1999年で、こっちの方があとなんですね。

この本も未読なんですが、これは実は『ウォーハンマー40k』というゲームのノベライズというか小説版です。ウォーハンマーといえば言わずとしれたGames Workshopのファンタジーゲームで、ヨーロッパ中世の暗黒時代風の風俗や迫り来る「混沌」の侵略といったダークで猥雑な雰囲気のゲームです。40kは、そのファンタジー世界の4万年後の世界で、高度なテクノロジーを持つ人類とかエルフとかが宇宙空間とかで相変わらず混沌の軍勢と戦うといった趣向のSFものらしい。で、この小説版というのが出ているんですが、なぜかベイリーが書いているという次第。ほかにSF方面で有名どころだとイアン・ワトスンも書いています。

ちなみに短編も同じく40k関係の作品をいくつか発表しているほか、インターゾーン2000年10月号に短編が掲載されています。これが最後かなあ(ちょっと自信ない)。


2008/10/17 訃報: バリントン・J・ベイリー

うあー今年の訃報にはまだこんなものが残されていたのか……。ローカスオンラインによるとベイリーが死去したとのこと。

「好きなSF作家は?」と聞かれたとき、(相手が濃いSFの人でない場合は「知らないだろうけど」と前置きを置いた上で)わたしがまっさきに挙げるのがバリントン・J・ベイリー。享年71。わたしが管理しているcity5.orgというドメインがあるんですが、これも彼の短編集のタイトル『シティ5からの脱出』から来ています(元の短編集の表題作は Exit From City 5じゃないんですけどね)。

好きな作品はというと『時間衝突』『カエアンの聖衣』『光のロボット』といったところでしょう。この『時間衝突』ですが、「時間」というのは実は過去から未来へ波として伝わる意識のことだ、というのが基本設定になっています。なので時間遡行して過去の世界を見ると、その時点の人々はもう時間波が失なわれて意識がなく、操り人形のように生気のない状態で動いていると(というようなイメージは、『光のロボット』などにもあるように、ベイリーお気に入りのものというかテーマみたいなものなのでしょう)。さて、そうして時間遡行した主人公たちはある事実に気付きます。というのは、主人公たちが過去から未来へと意識の波が伝わっていく正面に、未来から過去に向かってのもうひとつの波が押し寄せてくる! 衝突したら大変なことになる。時間波は意識なのであるから、相手の時間波を構成する意識を全て殺せば世界は救われる、と考えた両陣営は壮絶な時間戦争(地面に爆弾を埋めて相手の時間波が到達するあたりの時刻で爆発するとか)を開始する……というストーリーです(かなりネタを割ってます)。

これだけでかなり無茶苦茶ですが、実は時間をナナメに移動して衝突を回避する斜行存在とかが時間戦争勃発を見物していたりして、すンごいのであります。

「衣は人なり」というカエアン文化が実に素晴しい『カエアンの聖衣』、ロボットに魂があるか、という問題を歪つに取り扱った『ロボットの魂』『光のロボット』、至上最強の武芸者、小姓を従え、不思議な力を持つ「禅銃(ゼンガン)」を手に入れてしまったサル!という設定だけでお腹いっぱいな『禅銃』など、奇妙奇天烈で異様でヘンテコで間違ったオリエンタリズムを混ぜることにかけては一級品だった凄い作家でした。

ベイリー様。これまでヘンな作品ばっかり読ませてもらってありがとう。あなたがいなかったら、わたしのSF観はもっと真っ直ぐだったと思う。

 

なお、日本での紹介は93年の『光のロボット』刊行がほぼ最後でその後はいくつか短編が翻訳されたぐらいだと思いますが、実際その後はほとんど作品を発表していない。ウィキペディアでは2002年ということになっている Sinners of Erspia(1997年)とThe Great Hydration(1998年)が十年ちょっとぶりぐらいの新作で、けっきょく長編はThe Great Hydrationが最後になってしまいました。

そういえばSinners of Erspiaはけっこう前に読んだのでちょっと紹介しておきましょう(The Great Hydrationは未読。持ってるけど)。舞台はErspiaという名前の惑星。この世界は太陽神を奉じ善を愛する光の部族と、月神を奉じる悪逆な闇の部族に分かれて争っています。光の部族に生まれ育った主人公の女性は、ある日「神なんているもんか。ただの気のせい。こんな堅苦しい部族は抜けだそう」とか恋人に誘われてのこのこと闇の部族のテリトリーに侵入、恋人はあっさり殺され主人公も囚われの身になってしまいます。そこで主人公は謎めいた「客人」と出会います。この者こそ、実は外惑星からやってきたのだといいます。

そこでこの人物に主人公は問い掛けます。神はいるのか。気のせいではないのか。答えは「います」。

実はこの世界の太陽も月も実際には人造物。それぞれの中核には精神エネルギーを投射する装置が据えつけらえていて、太陽は善の心を、月は悪の心を発信している。それらは実際に人々の心に影響を与える。それが神の正体なのだと(ちなみにこの人は銀河連邦で禅を学んでいたので精神エネルギーの影響を受けません(笑))。

なんだかんだで主人公とその人は不時着した宇宙船を修理して宇宙に脱出し、太陽と月を破壊することを試みます。結果として太陽を先に壊したところ、 Erspiaの住人はみんな心が悪に染まって争いあい全滅。月の破壊も完遂しますが、せっかく直った宇宙船も壊れ、月が投射する最後の精神エネルギーをまともに浴びた主人公は心が悪に染まりきって戻らなくなってしまいます。そしてそのまま宇宙を漂白する旅が始まる……というところで1章がおしまい(2章だったかも)。ぜんぶで10章ぐらいあります(笑)。その先も、なぜかErspiaと同じ名前でぜんぜん違う(けどおおむね似たようにヒドい)世界を訪問する話が幾度か続いて最後は創造主と対面しておしまい、みたいな感じで、オチは面白くなかったと思うんですが、ゾロアスターみたいな世界(なのです)を設定しておいて「神は実際にいて、でも本当は機械で精神エネルギーを投射しています」みたいな超即物的なところとか、いや本当にすごいよね。