トップ 最新 追記

日々の破片

著作一覧

2009-10-01

_ データフォーマットとアプリケーションからの扱い方(続)

昨日のエントリーの続き。

たとえば、Javaであれば、以下のような実装になる。

// BitmapBuilder.java
package com.example.bitmapparser;
 
public class BitmapBuilder {
    public static Bitmap define(int bits) {
        return new Bitmap(bits);
    }
}

BitmapBuilderは、Builderとは名ばかりで、単にDSLとしてオブジェクトを返すだけのクラス。

それに対して、実際の処理を受け持つBitmapクラスの実装はたとえば次のようになる。

// Bitamp.java
package com.example.bitmapparser;
 
import java.util.*;
 
public class Bitmap {
    public interface Validator {
        boolean validate(int bit, char type, String value);
    }
    static final String CHAR_TYPE = "AN";
    static class Field {
        int bit;
        String name;
        int length;
        char type;
        Validator validator;
        Field(int b, String n, int len, char t) {
            this(b, n, len, t, null);
        }
        Field(int b, String n, int len, char t, Validator v) {
            if (CHAR_TYPE.indexOf(t) < 0) {
                throw new IllegalArgumentException("'" + type + "' is not acceptable");
            }
            bit = b;
            name = n;
            length = len;
            type = t;
            validator = v;
        }
        int parse(byte[] data, int offset, HashMap<Integer, String> map) {
            store(new String(data, offset, length), map);
            return offset + length;
        }
        void store(String value, HashMap<Integer, String> map) {
            if (validator != null && !validator.validate(bit, type, value)) {
                throw new IllegalArgumentException("bit:" + bit + "(" + name
                                                   + ") \"" + value + "\"");
            }
            map.put(bit, value);
        }
    }
    static class VariableLengthField extends Field {
        int vlength;
        VariableLengthField(int b, String n, int maxlen, char t, int vlen) {
            this(b, n, maxlen, t, vlen, null);
        }
        VariableLengthField(int b, String n, int maxlen, char t, int vlen, Validator v) {        
            super(b, n, maxlen, t, v);
            vlength = vlen;
        }
        int parse(byte[] data, int offset, HashMap<Integer, String> map) {
            int len = Integer.parseInt(new String(data, offset, vlength));
            if (len > length) {
                throw new IllegalArgumentException("bit:" + bit + "(" + name
                                                   + ") " + length + " but " + len);
            }
            offset += vlength;
            store(new String(data, offset, len), map);
            return offset + len;
        }
    }
    HashMap<Integer, String> data;
    Field[] fields;
    int bits;
    Bitmap(int initBits) {
        bits = initBits;
        fields = new Field[initBits * 8];
    }
    public Bitmap FIX(int bit, String name, int len, char type, Validator v) {
        fields[bit - 1] = new Field(bit, name, len, type, v);
        return this;        
    }
    public Bitmap L(int bit, String name, int len, char type, Validator v) {
        fields[bit - 1] = new VariableLengthField(bit, name, len, type, 1, v);
        return this;
    }
    public Bitmap LL(int bit, String name, int len, char type, Validator v) {
        fields[bit - 1] = new VariableLengthField(bit, name, len, type, 2, v);        
        return this;
    }
    public Bitmap FIX(int bit, String name, int len, char type) {
        return FIX(bit, name, len, type, null);
    }
    public Bitmap L(int bit, String name, int len, char type) {
        return L(bit, name, len, type, null);
    }
    public Bitmap LL(int bit, String name, int len, char type) {
        return LL(bit, name, len, type, null);
    }
    public String bit(int bit) {
        assert data != null;
        return data.get(bit);
    }
    public void parse(byte[] blk) {
        if (blk.length < bits) {
            throw new IllegalArgumentException("length must be greater than " + bits
                                               + ", but " + blk.length);
        }
        data = new HashMap<Integer, String>();
        int offset = bits;
        for (int i = 0; i < bits; i++) {
            for (int j = 0; j < 8; j++) {
                int bit = i * 8 + j;
                if ((blk[i] >>> 7 - j & 1) == 1 && fields[bit] != null) {
                    offset = fields[bit].parse(blk, offset, data);
                }
            }
        }
    }
    public String toString() {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < fields.length; i++) {
            if (fields[i] != null) {
                sb.append(i + 1).append('(').append(fields[i].name).append(")=>\"")
                    .append((data == null) ? null : data.get(i + 1))
                    .append("\", ");
            }
        }
        if (sb.length() > 0) {
            sb.setLength(sb.length() - 2);
        }
        return sb.toString();
    }
}

次のように呼び出す。

// BitmapTest.java
package com.example.bitmapparser;
 
import junit.framework.*;
 
public class BitmapTest extends TestCase {
    Bitmap bmp;
    protected void setUp() throws Exception {
        bmp = BitmapBuilder
          .define(4)
            .LL(1, "id", 16, 'N')
            .LL(2, "name", 64, 'A')
            .FIX(3, "nationality", 3, 'A');
    }
    public void testParse() throws Exception {
        bmp.parse("\u00e0\u0000\u0000\u000001114YAMADA KAKASHIJPN".getBytes("ISO-8859-1"));
        assertEquals("1", bmp.bit(1));
        assertEquals("YAMADA KAKASHI", bmp.bit(2));
        assertEquals("JPN", bmp.bit(3));
    }
    public void testToString() throws Exception {
        bmp.parse("\u00e0\u0000\u0000\u000001114YAMADA KAKASHIJPN".getBytes("ISO-8859-1"));
        assertEquals("1(id)=>\"1\", 2(name)=>\"YAMADA KAKASHI\", 3(nationality)=>\"JPN\"", bmp.toString());
    }
    public void testParseWithoutField() throws Exception {
        bmp.parse("\u00a0\u0000\u0000\u0000012CHN".getBytes("ISO-8859-1"));
        assertEquals("2", bmp.bit(1));
        assertEquals(null, bmp.bit(2));
        assertEquals("CHN", bmp.bit(3));
    }
    public static void main(String[] args) {
        junit.textui.TestRunner.run(new TestSuite(BitmapTest.class));
    }
}

このタイプのデータフォーマットをDSLとして実装することによるメリットとは何だろうか? 続く。


2009-10-02

_ ログに見るEclipse脳

なんで以下のようなコードが生まれるのだろうか?

    ...
} catch (Exception e) {
    logger.error("xxxでエラーになった");
}
loggerはLog4JのLogLogのインスタンスなので、あと3文字追加すれば、
    ...
} catch (Exception e) {
    logger.error("xxxでエラーになった", e);
}

となって、話が異様に簡単になる。

なっていなかったので、例外になったという事実だけを淡々と記録したログを前に途方に暮れて調査に無駄な時間を使うことになった。

どうも、彼らはユニットテスト(xUnit系の話ではない)時に、loggerの行にブレークポイントを置いて調べるから、eをLogLogのメソッドに送る必要性をまったくわかっていないようだった。

実際にインストールして動作させて異常時にログから調査する、というばかばかしいほど当たり前のことに思いが至らないのだ。

至らないのを個人の責に帰することは、ばかげている。

至るシステムを考えるべきだ。

もちろん、悪いのはEclipseで、Eclipseマターな開発をしているからeを与えることに思いが至らないのだから、Eclipseが勝手に「, e」を補完してやれば良いのだ。

そのへんの中途半端な設計思想が嫌いだ。

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

Before...

_ arton [ご明察 >ボンゴ君。 ありがとう]

_ ポンゴ君 [ボンゴじゃないポン。ひどいポン]

_ arton [ごめんなさい。>ポンゴ君]


2009-10-03

_ コード補完時代にAPIはどうあるべきか?

さて(承前)、実は問題は、LogLogのメソッドシグネチャにある。少なくともおれは、そう考える。

おれは常識人だし、みなさんも良識の持ち主だ。

こういう人たちは、以下のようなメソッドをオーバーロードするときに、どう定義するだろうか?

  • エラー用のログ出力メソッド。当然、ログファイルに出力するメッセージは引数に必要。
  • でも、例外くらった場合は、例外オブジェクトを引数に付けてくれればメッセージとかスタックトレースとかもログするよ。そのほうがいいよね。

それは、もう、こうするだろう。

interface Log {
    public void error(String msg);
    public void error(String msg, Throwable t);
}

なぜならば、Throwable tはあるかないかわからない、つまりはオプションだからだ。デフォルト引数が取れるプログラミング言語なら、次のようになるし、多くのプログラミング言語でもデフォルト引数は最後に配置するように実装上の都合から作られている(C++など)。

class Log
  def error(s, e = nil)
    ..
  end
end

それに対して、msg引数は文句なく主役だし、常にそこに存在するし、オーバーロードしたメソッドで同じ意味を持つ引数は同じ位置にあるべきだからだ。

だが、それは常識が通用していた時代の発想だ。

今は、常識が通用しない時代だ。

だって、JavaはLL(by ひがやすお)なんだぜ。そのくらい常識は地に落ちているのだ。

だから、上のAPIはだめだ。全然お話にならない。

コード補完を意識してAPIを決めることが正しい。

logger. と打ったときに、errorと出てくる。

型名や、仮引数名でソートされる可能性も忘れてはならない。

ThrowableのTは、StringのSより下位だし、msgのmよりtのtは後だ。

最初に選ばれるものを重視し、それにあった型と名前を選択する。

つまり、以下のようにインターフェイスをきる。

interface Log {
    public void error(Exception e, String msg);
    public void error(String msg);
}

というか、ExceptionがThrowableだとわかっていない開発者が紛れる可能性も考慮したほうが良いからExceptionと型指定すべきだ(実際問題としてErrorやThrowableを扱う必然はほとんどないから、知らなくても構わない)。

引数が少ない順にソートするIDEをもし使っていて、かつその表示順序を変えられないなら、以下のようにする。

interface Log {
    public void error(Exception e, String msg);
    public void error(String msg, String auxmsg); // auxmsg(補足情報)はnullでも可
}

デバッグ用出力メソッドも用意するか、と考える。

interface Log {
    public void debug(Exception e, String msg);
    public void debug(String msg, String auxmsg); // auxmsg(補足情報)はnullでも可
    public void error(Exception e, String msg);
    public void error(String msg, String auxmsg); // auxmsg(補足情報)はnullでも可
}

だめだ、それはだめだ。メソッドはアルファベット順にソートされて補完ウィンドウに出てくるのが常識だ。

したがって、debugはerrorより下に出さなければ、重要なログがデバッグ扱いされる危険がある。

interface Log {
    public void error(Exception e, String msg);
    public void error(String msg, String auxmsg); // auxmsg(補足情報)はnullでも可
    // さらに定義順の可能性も考慮して、重要度が低いものは下に配置する。
    public void putDebug(Exception e, String msg);
    public void putDebug(String msg, String auxmsg); // auxmsg(補足情報)はnullでも可
}

Eclipse時代のAPIでは、何がなんでも、どんな手段を使っても、優先順位が低いメソッドは、下になるように配置するのだ。

ここで、メソッド名の一貫性が失われる! と考えるのは、過去の常識人だ。本末転倒人でもある。

なぜ一貫性が必要かといえば、覚えやすいからだ。覚えやすいからコーディング効率は良いし、間違いも少なく、初回コンパイルエラーとかに遭遇もしにくくなる。でも、覚えなくてもいいようにコード補完があるのだし、コード補完されたメソッド名を選択するのだから書き間違いに関することは念頭に置く必要は、まったくもってない。ここで重要なのは、重要度が落ちるメソッドは下になる=選択しにくくすることにある。

というように、プロジェクトが望む方向に開発者が自然とコードを書けるように、ツールの力を借りているのであれば、それを、より推進する方向でAPIを考えることが必要であり、必然となる。

さて、Eclipse大好きな諸子、そこまで意識してEclipseを使っていますか?

注:昨日のはともかく、上で書いているのは相当まじめな論議で、主となるツールに合わせて、設計者の意図に沿ったコードが自然に書けるようにAPIを考えろ、ということだ。そのためなら、LogLogを内包したおれさまログラッパーインターフェイスを提供して、そいつをインポートさせるというのが正しいと考えている。今となっては。

_ 世界一のマンガ

本屋行ったら、朝倉世界一の新刊が出てたから買った。これから読む。

デボネア・ドライブ 2 (BEAM COMIX)(朝倉 世界一)

帯のジャック(正しい読みはなんなんだ? 後で調べる)を江口寿志が書いているってことは、既におっさんほいほいになってしまったのか。

でもおれにとっては朝倉世界一は、今だって、世界一モダンな漫画家なんだけどな。でも、ヘタウマ文脈で考えりゃ、すでに30年近いことになるのか。そりゃおっさんほいほい系だよなぁ。

というか、ガロ−パンチザウルス−白夜のいろいろの流れでうじゃうじゃ出てきた中で、岡崎京子と並んで朝倉世界一は、独特なセンチメンタルさと冷酷さの入り混じり具合がおれにはすげぇフィットしていて、今でも好きだ。

アポロ (Cue comics)(朝倉 世界一)

アポロなんて、セリフを覚えるほど読み込んだものだ。嘘(大げさの意味)だけど。

心臓が弱い(走ると動悸が乱れて死にそうになる)ロボくんが主人公で、アトムをほんの少し設定上でパロディにしていて(親捜しとか最後の消滅とか胸の蓋をぱかっと開けるとかも、多分)、主人公との奇妙な出会いと友情(このへんはオバQっぽい)とか、60年代スパイアクションの乗り(しかし絵は80年代どまんなか)とか、一コマ一コマに才能が迸っている(というか、結局、おれの好みにどんぴしゃりということだが)すごい作品だ。というか、今書いていて気付いたが、60年代の子供マンガの世界を80年代モダンで脱構築しているということか。それはどんぴしゃなのは当然だな。

敵のアジトのアパートの上の階に引っ越して、毎晩ダンスを踊ったり足踏みしたりして、寝不足攻撃をかけるとか、今でも好きなギャグだよな。

で、良くみたら、「2」とか書いてあって、1もあるのか。知らなかったので、後で買う。

デボネア・ドライブ 1 (BEAM COMIX)(朝倉 世界一)


2009-10-04

_ 並行プログラミングのメモ

いくつか気になった。
P.247
誤)キューが満杯になったこと
正)キューが空ではなくなったこと

P.246
このリストは、読みにくく感じる(自分がコードを読む/書くときのスタイルとの問題のようだ)。

と思ってチェックしておいたのだが、今あらためて書こうとリストを読むと、なんの違和感もない。getAnd(Dec|Inc)rementを利用している個所とか、==を利用して上限/下限をチェックしているところ。

昨日の時点では、最初に読みとり後で加算(減算)というのがすんなり読めずに、次に比較しているところでひっかかったようだが、一日おいたら頭の中に最初に読み取りパターンとしてそのまま認識できるように醸されたのかも。

と思ったら思い出した。

if (size.getAndIncrement() == 0)
  mustWakeDequeuers = true;

サイズが0だったら吸い取り君たちを叩き起こす必要あり、と、AndIncrementの部分を読み飛ばして読めてしまったからだ。

とは言え、getしてからincrementするアトミックなコマンドの名前として正しいので(結果重視でincremnetというようなメソッド名にすると、アトミックな処理だという意味を失う)結局は慣れということかな。

慣れでははなく概念あるいはイディオムとして頭の中に根をおろしているかということかも知れない。

The Art of Multiprocessor Programming 並行プログラミングの原理から実践まで(Maurice Herlihy)

2009-10-05

_ みんながやってくる

クレイシャーキーを読み始めた。

Here Comes Everybody: The Power of Organizing Without Organizations(Shirky, Clay)

大体6割程度の読み取りで、なかなか進まない(instituで始まる単語が頻出して明らかにキーワードなんだけど研究所みたいな意味じゃないことはわかるがモヤモヤした概念の形成中になったり)が、期待程度にはおもしろい。とはいえ青木さんの訳があればもっとおもしろいだろう。

導入は300ドルの携帯を落とした女性とその友人、拾ってがめた女性を巡る恐るべきエピソード。もっとも恐るべきかどうかは見方による。みんながNYPD(ニューヨーク市警?)を動かすよ――悪い意味で恐るべきだなぁ……

続いてFlickrでのマーメイドパレードとタグとか、ツナミとか。いかにみんなが情報ソースたりうるか。しかし組織化できるものなのか。本当にツナミなんだ。

そこで、人数が増えるとどれだけ組み合わせが爆発するかの例として、36人集まった部屋に誕生日が同じ任意のペアがいるかという賭にのるべきか、というのが出てきた。

答えは80%以上だからのるべきとなっているが、自分でも考えてみた。

任意のペアは36*35/2だから18*5*7で630。この時点で賭に乗ったほうが良さそうに思える(この数字までは読み進めると出てくる)。

ここからどうすればいいのだろう。

全体から同じじゃない組み合わせを引けばいいのかな。

とすれば、1-(365/365*364/365)**630で良さそうだというところまで考えたけど正しいかなぁ?


2009-10-06

_ 鉄筋コンクリートと鉄骨

工場現場を見ていて不思議に思った。

取り壊された三階建ては鉄骨でくまれていた。鉄骨はエの字をしていて厚みもある。だからえらく頑丈そうに見える。

それに比べると六階建てマンションからは鉄筋が顔を見せているだけだ。鉄筋はえらく頼りなげだ。数は多いが。

そういうものなのか、あれらが例外なのか。

追記:鉄筋はすごい。なるほどなぁ。ありがとう。


2009-10-07

_ チュニジア

ハンニバルというチュニジア料理の店があるそうだ。

象のステーキってこたないだろうけど、食ってみたい。

ローマ人の物語 (3) ― ハンニバル戦記(上) (新潮文庫)(七生, 塩野)

ではもしカンニバルという名前の店だったらどんな料理が出てくるんだろうか。

ひかりごけ (新潮文庫)(泰淳, 武田)

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

Before...

_ arton [↑「kを」というのは綴りではなくローマ字読みde 「カの音」のつもり(でも後ろのchやxは綴りの話)という混乱ぶり。]

_ rokugen [おっとすみません説明不足過ぎ、レクター博士が念頭にありましたのです。というか最初読んだ時に、なんのキャプションもなく..]

_ arton [ああ、なるほど>レクター博士。 僕もあれに引きずられてカとハでこんがらがったのかも。 豚は……オリヴェイラですね。サ..]


2009-10-08

_ IE7のアドレスバーを消す

IE8も同じ。

信頼済みサイトに設定したサイトのアドレスバーに対しては、window.openの引数の指定がこれまで通りに使える。つまりアドレスバーを消すか消さないかは開発者によって決定できる問題ではなく運用の問題になった。したがって必要ならそういう運用にすれば良い。

信頼できなければ、もちろん消えないが、それは信頼できないサイトなんだから当然ということで良いね。


2009-10-09

_ 三題話

今朝、目についたもの。

―新装開店した自転車屋。

―なんだっけな、書きはじめる前は象徴的に印象的だったんだが。

―私的な話という電車の中吊りじゃないほうの広告。


2009-10-10

_ ビジネスがすべてではない

オペラでもバレエでも映画でもものがわかったやつと一緒に行くほうが楽しい。ものさえわかっていれば、好みが違っても良いというか、違うほうがむしろおもしろい。で、観終わったあと、ここが良かっただのこれは違うだろうだのそうはいってもおれはこう思うよとか、好き勝手なことをだらだらと話す。そういう時間は良いものだ。

そのての対象となるもの(上の例だとオペラとかバレエとか映画)は人によってそれぞれで、なんとなくだが、昨日の合コンに参加していた女子というような話題ができる対象(ということはこの場合の対象は合コン)を好む人のほうが、ベルディのオペラに観られるヴァーグナーの影響というような話題ができる対象(ということはこの場合の対象はヴェルディのオペラ)を好む人より多いような気がする。

で、これも予想に過ぎないが、こういった好む人が少ない対象を偏愛する人の幾割かは、そうでない対象にはあまり興味が持てないのではないかと思う。たとえばおれはほとんどすべてのスポーツとかテレビのドラマ番組にはまったく興味がない。

そこで人によっては、興味はどうでもよく、他人とだらだら好き勝手なことを喋ることを目的に、多数が好むと思われる対象に時間をかける。営業マンであれば日経を読め(客先行って話すネタを作れ)、の非ビジネス版である。

でも、非ビジネス版で自分にとってこれっぽちも興味も関心もなくまったく心が揺さぶられることもないもの(たまには例外もあるかも知れないが、その例外を探すためにその他のガベージをコレクトしなければならないようなもの)に時間を使うのはくだらないね。人の使える時間は限られている。

もちろん、趣味はおしゃべりであれば、そちらが第一目的なんだから上で書いている「対象」というのはどうでも二の次だ。それはOK。

この対象は二の次という姿勢をもって、社会的趣味の持ち主と呼ぶことにする。

それに対して、まず対象ありき、さらにおしゃべりできれば尚よろしという姿勢をもって、技芸的趣味の持ち主と呼ぶことにする。

やっと定義ができた。とは言え、この2つの趣味の持ち主をもう少し広くすると、世に言う文系、理系の2極論になりそうな気もする。当然、法律の適用やら判例やらについて後者の姿勢を持つ法学の徒がいれば、学の領域からは文系になるが、アティテュードにおいて理系となって意味が通じないが、それはしょうがない。したがって、文系/理系という切り口はバカだということになる(ここで挙げている事項について)。

で、勉強会っておれには後者のお楽しみだと思っていたが、それをビジネスにつなげるということになると、途端に前者になってしまって、そうなると勉強の対象は2の次になってしまうわけで、そりゃ乱立もするし興味も持てねぇなぁということになるのであった。

別の角度:たまには、なんで上のようなことを考えたかを追ってみる。最初、livedoor Readerで、生越さんの雑文を読んで、そこからリンクを追ってGoTheDistanceに行って、そこで次の一文

また「勉強会」に代表されるような所属組織を超えたウィーク?タイズのつながりも数年前から随分活発になっているように見えます。これらの活動により業界内での自浄作用が働くでしょうし、より良いソフトウェアを作ることを議論?共有できる場があるのは素晴らしいことです。

に始まる段落を読んで、とんでもない違和感を覚えたからだ。より良いソフトウェアを作るかどうかは結果論であって、それは主眼ではないのではないか、ということ。

で、

僕は今小売業界の会社に属していますが、卸のバイヤーが集まって勉強会をするなんて動きは聞いたことが無い。

まで読み進んで、そりゃそうだろうと思ったのであった。それは職場の仲間で閉じられる内容で一般性がないだろう。

もちろん、世の中は広いから、おれさまの考えた新しいバイイング戦略について一般化したものがパラダイムたりうるかを他のバイヤーに問うてみたいというような勉強会もありうるとは思うが、それほど戦略に技術的なおもしろさがあるのかどうかは良くわからない。

それに対してソフトウェアについてはいろいろある。

コード、構造、そういったものには美醜がある。

つまり、ソフトウェアの構成技術については、それをあたかもオペラのようにしゃべることが可能だ。

なぜプッチーニはトゥランドットを死ぬまで半年も余裕があって、しかも元気旺盛だったのに完成できなかったのか、についておしゃべりするのと同じレベルで、なぜGNU Hurdが完成しないのかをおしゃべりできる場ってのが世の中にはあったほうが楽しい。RMSは今でもコードを書いてはコミットしているがすぐにリバートされてしまうとかしゃべって笑い合うことが、イチローがワールドシリーズのあの場面で打ったっていうようなことをしゃべるよりも、遥かに愉快に感じる人たちもいるのだった。(ろくな例じゃねえな。例えばジャイアントロックを外すというMacRubyの戦略が及ぼす拡張ライブラリへの影響とそれに対するきれいな解を考えるとか)

そのあたりを敏感に嗅ぎ取ると、お金の匂いがしない、という適切な評価もくだせることになる。それは正しい判断だ。

まあ、いろいろな思惑があって世の中は回るので実におもしろい。

ビューティフルコード (THEORY/IN/PRACTICE)(Brian Kernighan)


2009-10-11

_ 補完ができるSQL

どうしてsqlplusが嫌いなのかつらつら考えるに(別にすぐに気づくのだが、なんとなく「つらつら考えるに」という表現が枕詞というよりも定冠詞のように出てくるわけだが)打ち込みが面倒なことが一番だ。

というか、readlineをなんで組み込まないのだろうか(と^P押して思うのだが、実は知らないだけでEscしてkとか打つと出てきたりして)。

で、テーブル名が最初に来るウpダテなら、set と打ったところでカラム名を出すくらいの気のきかせ方はできるだろうが、セェctだとどうにもならないだろうな。

なで、updateはテーブル名を先に書いて、seleteは、とか思ったが自然な英語の流れなのか。逆に、いかに通常のプログラミング言語がパーザに人間様が合わされているということなのか。

でも、合わせてやりゃいいじゃん。相手はまだ生まれて50年の子供なんだし。

とすると、select テーブル名 なんとか カラム名, カラム名 という構文になるわけだが、では「なんとか」には何を入れることが可能か、それとも英語としてその並び順はあり得ないのか、どっちだろうか。日本語SQLなら話は楽そうだな。「テーブル から カラム名, カラム名 を選択」

whereは、どうすりゃいいだろうか。「以下の条件で…… テーブルから……」だと最初のカラム名補完という縛りから外れてしまうし。

そこで、テンプレートみたいなものを考えてみる。if と打った瞬間に() とか{}が挿入されて(の右にカーソルが出るやつ。

同じようにsele と打つといきなりfromやらwhereやらorder by やらが出まくって、カーソルはfrom の右で、そこでテーブル名を入れると勝手にカーソルがselect の右に移動して……とてつもなく使いにくそうだが慣れるとこれ使わないやつはばか的存在になるだろうか。


2009-10-12

_ cmd.exeに^pを

cmd.exeを使っていて、つい^pを打ち込み文句を垂れられたことがあれば……と書いて試してみたら64ビットVistaでは、それほど致命的ではないことに気づく(ということは、最近、打ち間違えないらしい)。
c:\home\arton\test>^P
'' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

かっては、プリンターがどうしたというすごくやっかいなエラーになったものだが。

と、出鼻をくじかれたが、次のスクリプトで取りあえずはそれなりにハッピーになるとわかった。

#!/usr/local/bin/ruby -Ks
require 'readline'
IO.popen("cmd.exe /A", "a") do |cmd|
==begin
  以下は無意味(cmdはreadモードではないので動作していない)
  Thread.start do
    while s = cmd.gets.rstrip
      puts s
    end
  end
==end
  while buf = Readline.readline('', true)
    if buf == 'exit'
      exit 0
    end
    cmd.puts buf
  end
end

こんなちょろいはずないから、実際に常用するといろいろ問題が出てきそうであるが、とりあえず、^p、^n、^a、^e、^d、^f、^bが使えるだけでも結構なことだ。

不思議なのは、なぜこの状態でTabの補完が使えるのかだけど(つまり使える)、readleinがTabを解釈しているのかな(ちゃんと調べずに取りあえず使ってみたのであった)。(というか出方が違うから、やっぱりreadlineが勝手にやっているのか。bashと同じことなのか)

追記:なんか無茶苦茶便利なんだけど。^kや^y、^rも使えるし。

追記:細かいことは後で考えることにしよう。とりあえずソースを書いたらgithub(readmeの代わりに上のをルートに置いた)

追記:上のリストのThreadの処理はデタラメだったので削除(しょうがないのでコメントアウト)


2009-10-13

_ 昨日のやつ

結局、子プロセスの標準出力も読むことにしようとすると、readline内で止まる(拡張ライブラリ内のIOだからだな、多分)ので標準出力を読み切れないし、かといって昨日の状態のままだと、標準出力をまじめに使っているプログラム(たとえばirb)を起動するとプロンプトが表示されなくなるし(ここは原理がまだわかってない)、ftp.exeのようにキーボードを直接読んでいるらしいプログラムを呼び出すと殺されるし(なんとなく理由はわかる)、cmd.exeの内部コマンドを実行するには便利だが、対話型プログラムの実行には向かないことがわかり、がっかりだ。

最終状態

#!/usr/local/bin/ruby -Ks
# coding: cp932
require 'readline'
def mode(m)
  if m == 'vi'
    Readline.vi_editing_mode
  elsif m == 'emacs'  
    Readline.emacs_editing_mode
  end
end
IO.popen("#{ENV['ComSpec']} /A /Q", "w") do |cmd|
  loop do
    buf = Readline.readline('', true)
    if buf.nil?
      cmd.puts "\x1a"
      puts
    else 
      Readline::HISTORY.pop if buf =~ /\A\s*\Z/
      if buf.size == 0
        cmd.puts "\x1a"
      elsif buf == 'exit'
        exit 0
      elsif buf[0] == ?:
        mode buf[1..-1].lstrip
        cmd.puts
      else
        p "-#{buf.length}-#{buf}--" if $DEBUG
        cmd.puts buf
      end
    end
  end
end

2009-10-14

_ わからん

Play Petals Around the Rose

かれこれ50回。

(追記:最終的にはわかったのだが、数の悪魔に魅入られていたとしか言えない)

_ ThreadWeaver

マルチスレッドユニットテスト用フレームワークらしい。ThreadWeaver

後でみる。

_ 最後に笑うのはいいかげんなにせもの

テレビがやってきたとき、まともな映画人は画面の小ささ、だからよくてバストショット、たいていはトーキングヘッズ、こんないかさまには誰もだまされないだろうとたかをくくっていた。

まともな論述者もそうだ。コンテキストを示せないという何かを議論するにはまったく不向きなこのメディアに人々が教えを乞うなんてことは想像の範囲外だ。

しかし彼らは大きく間違えていた。

「みんな」が求めていたのは本物の人生でもなければ、本物の議論でもなかったのだ。

それこそが、Wikipediaであり、blogである。それどころかtwitterだ。

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

_ ma2 [パズルの名前をよく考えると分かります。]

_ bero [というかhttpは「いいかげんなにせもの」とよばれてましたね. linuxも]

_ eto [いい話だな〜。Linuxを使ってhttpをしゃべってた私はさんざんな扱いでした。]


2009-10-15

_ Fiddlerが便利すぎ

FiddlerはHTTP(HTTPSも)のキャプチャツールだが、それにしても便利だ。

実は、その便利さとは裏腹なのが.NET Frameworkで作ってあるってことで、利用するマシンに.NET Framework(2.0以上)が必要なのだが、それさえクリアすればあきれるほど便利だ。(追記:1.1用(もあります))

というのは、サイドバイサイドxcopyインストールで動作するから、とりあえずどっかのマシンにインストールしてから、?program files?FiddlerディレクトリごとUSBメモリに放り込んでおけば、そいつをさらしに巻いて出かけるだけでOKだからだ。

というわけで、余分なものインストール禁止なサーバとかにFiddlerを入れたUSBメモリ差し込んで眺めたりとかできる。助かった。

それとFiddler自身が中間者機能を持つから、HTTPSのやり取りも全部見られるので、保護されたコンテンツと保護されないコンテンツの混在警告とか潰すのにもえらく役だった。(このとき、降ってくるFiddlerのおれおれ証明書の警告が裏側に回ってしまって一見するとIEがハングしているようになるのはちょっと勘弁だけど)

で、IE6でへーっと思ったのは、プロクシ接続でHTTP 1.1を使うチェックボックス(デフォルトはアンチェック)が結構システムに影響することで、何に影響するかというと、チェックしない状態だとAccept-Encoding: gzip, deflateが送られないことだった。これは不思議で、調べていたシステムではプロクシがいることはIEにはわからないはずだが、どうもIEの実装が安全側に倒している(透過プロクシがそこらじゅうにあるからだが)としか思えない。

というわけで、どうにも圧縮が効いていないようで不思議だったのだが、Fiddlerのおかげでわかった(少なくともAccept-Encodingが落ちていることが)ので、助かった。

デキシーズ・ミッドナイト・ランナーズ/ライヴ・イン・リヴァプール 2003 [DVD](デキシーズ・ミッドナイト・ランナーズ)

フィドルといえば中期デキシーミッドナイトランナーズだが、最近のケヴィン?ローランドはキュア−スタイルカウンシルと渡り歩いたタルボット(シェークスピア的な名前だ)なんかと組んでいるのか。

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

_ トオルスガルモノノ [http://www.fiddlertool.com/fiddler/version.asp#Legacy Fidd..]

_ mumurik [Fiddler便利ですなぁ。 HttpWatchなんかも便利ではあるけれど、USBに突っ込んで、とはいかない。]

_ arton [便利ですよね。それはそれとしてHttpWatchってのもあるんですね。今度見ておこう。]


2009-10-16

_ 毎日新聞社と文藝春秋社

歴史をひっくり返した毎日新聞社と一人の学者の人生を終わらせた文藝春秋社。同じマスメディアでもカラーがいろいろあっておもしろいな。

文藝春秋社

毎日新聞社

_ 安土桃山

こないだ、同僚と飯食っていたら、安土桃山に信長が城を建てさせる映画がどうとか言い出したので、何わけわからないこと言ってんだ、安土は安土、桃山は桃山、織田と豊臣、合わせて安土桃山だ。当然、信長の城は安土城で桃山なんて一切関係ない、と切って捨てた。つまり、安土桃山っていう呼び方は、魏晋南北朝という呼び方と同じ歴史の括り方と同じような政権による一つの時代を指す言葉であって、魏晋南北朝城がないように、安土桃山城なんてばかげたものは存在しない。

で、それからしばらくして、びっくり。地下鉄の駅にでっかなポスターが出ていて、安土桃山に城(安土桃山城)を建てるのがどうたらとか書いてある。

あれ、おれは間違っていたのか(良くあることだし)と、とりあえず、翌日そいつには済まん、と謝っておいたがやはり釈然としない。

この点に関しては、Wikipediaの項目を書いたのはおれかというくらいおれの認識と同じだ。少なくとも2人の人間がそういう認識であり、そういう認識に至った資料を読んでいるのだ。

多分、城の映画の広告を作った連中が無知の涙だろうとは思う。まあ、どうでもいいけど、安土に桃山という山があり、そこに城を建てたら安土桃山城という発想なんだろうなぁ。で、安土に桃山っていう山はあるのかね。ちなみに、安土の姉妹都市はリゴレットでおなじみのマントヴァ公国のマントヴァらしい。どちらも素敵な殿様である。

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

Before...

_ arton [一方、usaさんから、こういうツッコミあり。 https://twitter.com/unak/status/229..]

_ ぴー [その後、ネットで調べてみました。家光の将軍宣下まで伏見城を残したのであり、その後、家光令(一国一城令)によって取り壊..]

_ ぴー [↑桃山文化は江戸時代ではありませんが、秀吉の時代の文化を桃山文化と言われるようになったのかな・・・難しいY]


2009-10-17

_ ロメオとジュリエット

オーチャードホールでKバレエカンパニーのロメオとジュリエット。

音楽がすばらしく、後で見たら、先日のティアラこうとうのと同じ福田一雄が指揮をしていた。この人はうまいなぁ。

が、何より良かったのは、演出で、どうもこのバレエは歴史がたかだか100年に満たないせいか、どうにでも演出の余地があるらしく、これもまた素晴らしいものだった。

或る種あざといとも言えるのだが、たとえば、ジュリエットが毒(復活可能とはいえ、毒は毒)を呑む前にいろいろためらう、そのときに未来にあるであろうロメオとの幸福な情景を背景で見せる(しかし、この演出は一歩間違えると舞台だから嫌でも別の女性を使うことになるし、まったく逆の意味に受け取られる可能性もあるよなぁという点から思い切った演出だと思うが、実に説得力があるのは、舞台前景にいるジュリエットの表現が集中的だからだ)ことで、むしろ喜々として幸福そうに毒を仰ぐあたり(いや、毒を仰ぐ瞬間もそうかは記憶にはないのだが、舞台背景と組み合わせることで強力な陶酔感を表現しているところ)。

その意味で、ジュリエットを演じたロベルタ・マルケスというブラジル出身のロイヤルの人がべらぼうにうまいのだと思う。

表現力というのはなんだろうか? ある人の表現を観て説得力を受けるとか感動するとか、何がそうでないものと違うんだろうか。

或る種のばかっぽさというか、なんのてらいもなく大きく動くことなのではなかろうか。まったくてらいがなく、大きい動きがもたらす表現ということのように感じる。

出てきたときから、14歳の子供以外のなにものでもなく、ちょこまかして、びっくりしたり、よろこんだり、息をのんだり、悲しくなったりする。

最後のシーンでロメオは寄り添わずに死んでいるのだが(これも演出の妙とは言える。全体、熊川哲也の演出は絶妙なリアリティがあるし、メリハリのつけかたが抜群で、マーキュシオの生かし方とかこれまでろくに名前もなかったロザリンの扱いとか)、それだけに見つけたときの悲しさの表現の悲しさ。思わずもらい泣きしそうになってしまうというくらいに、感情移入させられたのは(舞台は再現不可能な生身の人間が実行しているだけに、本来、えらく客観的に観られるものなのだが)はじめてだ。といってもロメオのバレエは4種類しか観ていないが。

熊川哲也が跳躍して、女性を放り投げたり受け止めたり派手に動くのを生で観るのも初めてなのだが、これも素晴らしい。バルコニーの場面(あまり型がないので割とだれる感じをいつもは受けるのだが)で常に次に何が起きるのか期待しながら観るという得難い経験。

舞台は、古臭い感じのようでありながら、右側の建物の無理やりな奥行きの付け方の妙とか、色彩とか、これはこれで実に絶妙。

ふむ。音楽と演出だけでなく、ジュリエットもロメオもマーキューシオも乳母も衣装もみんな良かったようだ。実に良いものを観られた。

プロコフィエフ/ロメオとジュリエット(アバド(クラウディオ))

(プロコフィエフは好みではない(多分、リズム感が合わないのだと思う)が、これは和声が好きなのか、それとも舞台の記憶と共にあるから良い印象を受けるのか)

追記:熊川&マルケスのDVDが発売されるので、予約した。

熊川哲也 ロミオとジュリエット [DVD](熊川哲也)


2009-10-18

_ HttpURLConnectionではまる

JDK1.5以降で、URLConnectionにsetConnectTimeoutが実装されたので、おれさまHTTPクライアントを作る必要がなくなったと考えた。

たまたま、text/xmlで文字コードがWindows-31Jのデータを読み込む必要があったので、次のような(実際にはもっと複雑)プログラムを作った。

import java.io.*;
import java.net.*;
public class XmlReader {
    public static void main(String[] args) throws Exception {
        URL url = new URL("http://www.artonx.org/data/win31j.xml");
        HttpURLConnection c = (HttpURLConnection)url.openConnection();
        c.setConnectTimeout(1000);
        c.setReadTimeout(3000);
        c.connect();
        if (c.getResponseCode() == HttpURLConnection.HTTP_OK) {
            ByteArrayOutputStream bao = new ByteArrayOutputStream();
            byte[] buff = new byte[4000];
            int n;
            InputStream is = c.getInputStream();
            while ((n = is.read(buff)) >= 0) {
                if (n > 0) {
                    bao.write(buff, 0, n);
                }
            }
            is.close();
            String s = new String(bao.toByteArray(), "windows-31j");
            System.out.println(s);
        }
        c.disconnect();
    }
}

む、期待した通りに動かない。つまりまっとうに動作する。

c:?test>java XmlReader
<?xml version="1.0" encoding="windows-31j"?>
<data>日本語のデータ</data>

Solaris版だと??になって、結局、サーバでtext/xml; charset=windows-31jを返すようにしたのだが、変だな。そこまでJDKの実装が異なるとは思えないし(何かSolaris版の最初の実装にはバグがあったのかな)、なんでうまく動くんだろう。

_ 続き

という時に、既定の実装がすぐに見えないのは不便だな。というか、こういう時にすぐデカフェできるのが、IDEの長所か。


2009-10-19

_ ゴーゴーの思い出

店の中にでっかなテレビが置いてあって、それが従業員に向かって(客ではなく)がんがんメッセージを垂れ流していたらおれはちょっと嫌な気分になる。これは何の洗脳教室ですか?

と、テレビの中で延々と繰り返される創業者の従業員に向けたメッセージが、ここの持ち味だとしたら2度と食べたかないなぁと思って、そして実行している。


2009-10-20

_ soのトリビア

土曜のRHG読書会ふつぱいら編で、mputさんからlibcは実行できるという話が出た。

手元のLinuxで実行可能ビットが立っているsoを起動すると以下となった。

$ ls -l /lib/*.so|grep rwx
-rwxr-xr-x 1 root root   72800 2008-08-04 16:14 /lib/klibc-oHYcLOsqK031xhhY6ecG96fp_1A.so
-rwxr-xr-x 1 root root  131584 2009-01-30 02:56 /lib/ld-2.8.90.so
-rwxr-xr-x 1 root root 1502520 2009-01-30 02:56 /lib/libc-2.8.90.so
-rwxr-xr-x 1 root root  130214 2009-01-30 02:56 /lib/libpthread-2.8.90.so
$ /lib/klibc-oHYcLOsqK031xhhY6ecG96fp_1A.so 
Segmentation fault
$ /lib/ld-2.8.90.so 
Usage: ld.so [OPTION]... EXECUTABLE-FILE [ARGS-FOR-PROGRAM...]
You have invoked `ld.so', the helper program for shared library executables.
This program usually lives in the file `/lib/ld.so', and special directives
in executable files using ELF shared libraries tell the system's program
loader to load the helper program from this file.  This helper program loads
the shared libraries needed by the program executable, prepares the program
to run, and runs it.  You may invoke this helper program directly from the
command line to load and run an ELF executable file; this is like executing
that file itself, but always uses this helper program from the file you
specified, instead of the helper program file specified in the executable
file you run.  This is mostly of use for maintainers to test new versions
of this helper program; chances are you did not intend to run this program.
 
  --list                list all dependencies and how they are resolved
  --verify              verify that given object really is a dynamically linked
                        object we can handle
  --library-path PATH   use given PATH instead of content of the environment
                        variable LD_LIBRARY_PATH
  --inhibit-rpath LIST  ignore RUNPATH and RPATH information in object names
                        in LIST
$ /lib/libc-2.8.90.so 
GNU C Library development release version 2.8.90, by Roland McGrath et al.
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 4.3.2.
Compiled on a Linux >>2.6.24-16-server<< system on 2009-01-29.
Available extensions:
	crypt add-on version 2.1 by Michael Glad and others
	GNU Libidn by Simon Josefsson
	Native POSIX Threads Library by Ulrich Drepper et al
	BIND-8.2.3-T5B
For bug reporting instructions, please see:
.
$ /lib/libpthread-2.8.90.so 
Native POSIX Threads Library by Ulrich Drepper et al
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Forced unwind support included.

いきなりSEGVするklibcはともかく、他のsoは少なくとも著作権表示はする。

ldはusage表示までするので実際に引数を与えてみる。

$ /lib/ld-2.8.90.so --list /usr/local/bin/ruby
	linux-vdso.so.1 =>  (0x00007fff237ff000)
	librt.so.1 => /lib/librt.so.1 (0x00007fe91b3ff000)
	libdl.so.2 => /lib/libdl.so.2 (0x00007fe91b1fb000)
	libcrypt.so.1 => /lib/libcrypt.so.1 (0x00007fe91afc2000)
	libm.so.6 => /lib/libm.so.6 (0x00007fe91ad3d000)
	libc.so.6 => /lib/libc.so.6 (0x00007fe91a9cb000)
	libpthread.so.0 => /lib/libpthread.so.0 (0x00007fe91a7ae000)
	/lib64/ld-linux-x86-64.so.2 => /lib/ld-2.8.90.so (0x00007fe91b620000)

lddの出力に似ている。

$ ldd /usr/local/bin/ruby
	linux-vdso.so.1 =>  (0x00007fff0c9fe000)
	librt.so.1 => /lib/librt.so.1 (0x00007fc40442e000)
	libdl.so.2 => /lib/libdl.so.2 (0x00007fc40422a000)
	libcrypt.so.1 => /lib/libcrypt.so.1 (0x00007fc403ff2000)
	libm.so.6 => /lib/libm.so.6 (0x00007fc403d6d000)
	libc.so.6 => /lib/libc.so.6 (0x00007fc4039fb000)
	libpthread.so.0 => /lib/libpthread.so.0 (0x00007fc4037df000)
	/lib64/ld-linux-x86-64.so.2 (0x00007fc404637000)

というよりも全く同じだ。

$ file /usr/bin/ldd
/usr/bin/ldd: Bourne-Again shell script text executable

lddは中でld.soを呼び出しているのだった。


2009-10-21

_ 半年の空白

どうしてWindows7についての情報がまったく(自宅のほうには)来ないのかなぁとかのんきに構えていたらびっくり仰天。

MSDNで調べたらライセンス切れになっている。でも、手元には発注確認書とかあるし、eOpenで手続きした覚えもあるんだけど、もしかしてまったく忘れてたのだろうか? (確かに年始はばたばたしまくっていたし)

どうりでVisutal Studio 10についても何にも来ないはずだ。

eOpenのサイトをIE8でアクセスするとエラーになりまくるが、Firefoxだと入れた。すると、ちゃんと手続きされている。

が、MSDNではおれはライセンスが切れたことになっている。どうなってるんだ?

追記:MSDNサブスクリプション特典アクセス番号通知メールが存在しないことがわかり愕然。時期的にプロバイダのspam判定が無茶苦茶だったころに捨ててしまったか(それはないだろうなぁ)、単純にMSDN事務局の送信漏れではないかとか、いろいろ思うが、それにしても10か月以上、まったく気付かなかった(そのため、逆に最近のマイクロソフトはまったく新しいことをしていないんだなぁとか考えていたり)

取りあえずMVLSのサポートへメールを出した。

追記:電話サービスで無事完了。手続きの途中で引っかかった状態だったようだ(開始済みかつ未完了みたいな)。ステート管理って難しいから、ヒューマンベーストラブル対処が良いと思うが、いざ自分がひっかかるとわけわからなくて困るってことのようだ。


2009-10-22

_ トマニ式の生き方

妻が図書館から借りて来ておもしろいから読めというので読んだ。

ソニー出版の本で、翻訳は星新一。ドイツの人たちが作った絵本。アマゾンには無い。

やせた聴き分けの良い2人の姉妹が、ある日親父が買ってきた1冊の奇妙な本のとりことなる。その本はトマニと呼ばれる種族(動物?)について、とある冒険家の船長が記録したものだ。

寝ても覚めても姉妹はその本を読む。だんだん背がずんぐりむっくり、牙が生えて髪の毛は縮れて、皮膚は青くなり、ついに尻尾がはえて、立派なトマニになる。聴き分けはどこかに捨ててしまい、もう手伝いもしなければ毛糸で編み物もしない。胡桃の木に登って歌を歌う。父親は太鼓と何か楽器をプレゼントする。

母親はそれが嫌でひた隠しにするのだが(一方父親は、まあいいんじゃないかなぁ、いろんな人がいるほうがおもしろいし、という態度なので回りの人から敬遠されてしまう)、ある日、娘二人を連れて買い物に行かざるを得なくなる。

近所の人々は、この異形の獣に対して石をぶつけ棒で殴り、殺そうとする。

両親は熟考した末、家財を売り払い船を買い、一晩かけてトマニ式の本を熟読し、娘たちと同じくトマニとなる。とってもきれいな青になったわね、と子供たちは大喜び。

町の人たちの襲撃を避けながらどうにか船にたどりつき、一家はトマニの世界へ向けて出航する。


トマニそのものには良いも悪いもない。近所の人々の反応は当然だし、両親の選択も正しい。


2009-10-23

_ 見てくれの変遷

写真は後で。

1.0 竪穴式住居

2.0 仁徳天皇陵

3.0(1) 五重塔

95 東大寺大仏殿

98 平等院鳳凰堂

Me 羅生門

2000 金閣寺

XP 銀閣寺

Vista 安土城

7 江戸城

まだ先は長い。


2009-10-24

_ マスカーニ

おそらく、パリアッチョ、コロンビーナ、アルレッキーノという3人組のわかりやすさとか、カニオの衣装をつけろとかのせいだと思うが、僕にとってついさっきまでは、ヴェリズモオペラというのはレオンカヴァルロのパリアッチョのことだった。

が、子供が図書館で借りてきたシミオナートとデルモナコのカヴァレリアルスティカーナを聴いて、それは間違いだと気付いた。

圧倒的に、マスカーニの村の騎士道のほうが音楽として優れている。

ついさっきまでは、カヴァレリア・ルスティカーナは道化師だけでは間がもたないからついでに皿にのっけて置くパセリの一種だと信じていた自分の不明を悔やむ。

マスカーニ:カヴァレリア・ルスティカーナ 全曲(デル・モナコ(マリオ))

前奏曲からしてまったく異なる。弦の重ね方、ハープの効果的な使い方、音楽そのものだ。(追記:2度目に聴くと2流の若きシェーンベルクみたいだけど、でもそのくらい美しい)

もっとも、幕が上がると3流のジョルダーノみたいなメロディ(なんかラママモルタみたいだ)で唄が始まって、ちょっと拍子抜けするのだが、それでも、次々と組みあわされる歌と弦の絡み合いの美しさ、どうしてこれまで気づかなかったんだろうか、まったく。

_ これでおしまい

こないだ15巻が出たと思ったら、もう最終巻が出ている。

ふたつのスピカ 16 (MFコミックス フラッパーシリーズ)(柳沼 行)

_ 時代の変化に鈍い人

テクノロジーに言及しながら今後の社会のありようについて語る人が、テクノロジーの変化に伴う状況の変化を理解できずに怒るという低劣な現象を見かけることがある。

有名あるいは高名であるということは2つの事象をもたらす。

1つは、声の届く範囲の広がりだ。

そしてもう1つが届いた範囲の確認の不可能性である。

それはテレビ時代にはその通り。有名人が出る番組を100万人の人が観る。その100万人が何を考えたか、有名人は知りようがない。運が良ければ、一定数の知識人(良識人)からの手紙あるいは番組への声のようなハガキを参照できるかも知れない。それが知識人(良識人)からのものだということは、彼らの声を伝えられるメディアが文字通りリテラシを求めることから自明だ。そしてごく少数の明らかに異常な、現在の言葉を使えばストーカーからのもの。それは明らかに異常なゆえにすぐにわかるものだった。

この有名人が、自分の活動の場をWeblogなどに移すと、彼はこれまでに得ている高名(有名)であることの2つの特徴のうちの後者が、テクノロジーによって様変わりしていることに気づける可能性がある。

Weblogへのトラックバックやコメント、あるいはブックマークサービスなどが、テレビ時代には不可能だった「みんな」の意見を伝えてくるからだ。

80%の人たちが、その王様に対して絶対服従し、祈り、感謝し、平伏している様相が見えるかも知れない。

あるいは80%の人が、その王様の裸んぼぶりを観て楽しんでいた、という恐怖の真実が明らかになるかも知れない。

いずれにしても、それはテクノロジーが可能にした実相というものだ。

しかし、ある種類の人たちは、そこで明らかになった実相を受け入れられない。特に後者であれば当然だろう。

かくして彼は、それがテクノロジーの誤りであると考える。あるいは、テクノロジー提供者の悪意によって仕掛けられた陰謀と考える。

そして大騒ぎする。

これはどういうことだろうか。

この広範囲に相互に参照可能なテクノロジーの上でのコミュニケーションを考える場合、後者を受け入れる覚悟が必要だということだ。

それを避けることも可能である。閉じたコミュニケーション空間(SNSやIRCを想定してみよう)を気の置けない仲間同士と構築する。それは、新しい革袋に古い酒を入れることではあるが、そこから得られるものはもちろんある。

しかし、有名(高名)でありかつ開いたコミュニケーション空間に入るということは、それまでには存在しなかった世界、新しい革袋の新しい酒で乾杯することを意味する。たいていの場合、その味は苦いものかも知れない。

ということが書いてあるわけではないが(注)、PUBLISH, THEN FILTERのFame Happensの節を読んでいて考えた。

Here Comes Everybody: The Power of Organizing Without Organizations(Shirky, Clay)

注)実際に書かれていることは上の逆に近い。同じWeblogツールを利用していても、有名でないyou and meにとっては5人の友人からのツッコミと10人の通りすがりのメールに返答することは従来からの日常の延長に過ぎない。しかし有名(高名)な人間にとっては10000人の見ず知らずの人のツッコミと100000通のspam(ということにならざるを得ない)に返答することは技術的に不可能なことだ。したがって、テクノロジーによって、you and meと有名(高名)人の距離はかってないほど近づき、しかも双方向に見えるかも知れないが、それは幻影に過ぎない。この50年の最も重要なメディアとは電話とテレビだ。コミュニケーションとブロードキャスト。インターネットは双方向メディアを技術的に可能としたが、しかしこれらのツールの融合を与えることはできない。(上記の節の大意。おれの英語力の限界内で)

……そこでさらにおれは考える。もし、それが単なる140文字の無分別な掲示板であり、きわめてゆるく、しかも刹那的な結合しかなければどうか? ほんの少し、何かコミュニケーションとブロードキャストの溝を埋めかけているように思える。不思議なものだ。


2009-10-25

_ ジゼル

子供が生協のカタログで見つけて買ってくれとか言うので、いちおうアマゾンで見たら1000円近く安かったので輸入版を買った。コボーはアゴーだなぁとか言いながら観る。

コジョカルは狂乱するよりも深く悲しむ痛ましい感じの(ちょっと足りない子タイプのジゼル)で、小柄なこともあってえらく可哀そう。大柄だと大狂乱する(色狂いタイプのジゼル)できるので、演出する人はいろいろ踊り手に合わせて作れるから楽しい演目なんだな、きっと。

まあ、村娘のときは、どっちのタイプであろうと、一たび死んでしまえばふわふわしながら惚れた男をかばう不思議な生き物になるわけで、どこまでふわふわできるかがすべてなんだろうけど。コボーがすっと持ちあげてふわふわ、着地して動くとコボーがすっと持ちあげてふわふわ、息が合ったコンビってのはこういうことか、と見とれてしまう。うまいなぁ。

Giselle / [DVD] [Import](Alina Cojocaru)

ロイヤルって、見ていてオペラ座と比べると技術的にはぱっとしないというか、集団になると結構揃ってない。で、それは気づくのだが、大して気にならない(しかし気づく)ので、僕にとってはあまり重要ではないようだ。だが、気づくということは、そこが気になる人にはきっと気になるだろうな。

アゴーと言えば、ジェーンバーキンに代表される「イギリス女」のイメージなのだが、村の友人3人組みで一番上手な人が、すさまじいアゴーなエーベルバッハ少佐でなんとも困った気分となる。正面から映ると無理やりワイドテレビのせいもあるだろうが顔が全体の1/5くらいあるわけで、踊りはうまいのだが、きっと顔がエーベルバッハ少佐(なぜマンガの世界ではおもしろい連中はみんなといっても2人しか知らんが少佐なんだろうか)なのでプリンシパルになるのは大変なのではないかなぁとか、逆に技術は完全に見劣りしているのだが可愛いのが右側にいて、まあ技術力だけで評価されない世界ってシビアだなぁとか。

エロイカより愛をこめて 35 (プリンセスコミックス)(青池 保子)

何気なくアマゾンで調べたら現役続行中なのか。すげぇな。


2009-10-26

_ 映画は面倒

映画館で観るのはいいのだが、DVDで観ようとすると、相変わらずリージョンコードがあって、それだけならばまだよいがNTSCとPALがある。

アメリカは安いが1で、イギリスは次に安いがPALだ。

グローバルスタンダードがまだやって来てない未開の王国だな。

と、文句を垂れながら日本版を購入。

ラ・ボエーム デラックス版 [DVD](アンナ・ネトレプコ)

まあ、オペラだからどの国のやつを買っても問題なし、って点はあるが、市場がUKより小さいとも思えないのに(USよりは小さいからそれについてはしょうがないとしても)なぜUKよりも高いのかなぁ。

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

Before...

_ arton [どうなんでしょう? 最初からデジタルなんだから、NTSCだのPALだのの区別はないと思うんだけど(DVDだってコンピ..]

_ なかむら(う) [Blu-rayもリージョンコードはありますが、DVDよりだいぶ簡素化されていて、日本はアメリカや東南アジアと同じリー..]

_ arton [おお、アメリカと同じリージョンだってのはいいですね。]


2009-10-27

_ 実行可能なsoを作る

一部のsoが実行できることはわかったが、実際に自分で作ってみようとしたら、結構、難しかった。

普通に作ってみるとsegvする。

いろいろ試してみたが、man gccやman ldしてオプションをいろいろ変えてみてもうまくいかない。たとえば、--pic-executableを見つけたときは「これだ」と思ったが、そうやって作ったsoを実行しようとすると、bashがNo such file or directoryと言いだす。

はて?

もちろん存在しているから、ダイナミックリンクの過程でファイルが見つからないと考えるのが筋だろう。

面倒になって検索してたら、gcc-helpにそのものずばりの「Executable shared object」というスレッドがあった。

どうやら、.interpセクションを作り、そこにldを指定するのがキモのようだ。

以下を作る。

/* hello.c */
#include <stdio.h>
extern void exit(int);
/* このシステムはx64 linuxで、ldは以下が使われている */
const char my_interp[] __attribute__((section(".interp"))) = "/lib/ld-linux-x86-64.so.2";
int add_numbers(int argc, int* argv)
{
  int i;
  int ret = 0;
  for (i = 0; i < argc; i++) {
    ret += *argv++;
  }
  return ret;
}
void hello_main(int argc, char* argv[])
{
  puts("hello world !");
  exit(0);
}

通常のexecutableのmainと異なりcランタイムによる初期化/クリーンアップがないため、このmain関数(上ではhello_main関数がそれにあたる。リンク時に-e(エントリーポイント指定)で関数名を指定する。下のリスト参照)はexit関数で抜ける必要がある(そうでないと実行後にsegvする)。

$ gcc -Wall -W -fPIC -shared -o libhello.so.1 hello.c -lc -Wl,-e,hello_main,-soname,libhello.so.1
hello.c:13: : unused parameter argc
hello.c:13: : unused parameter argv
$ ls -l libhello.so.1
-rwxr-xr-x 1 arton arton 9741 2009-10-27 01:41 libhello.so.1
$ ./libhello.so.1
hello world !

確かに実行可能なsoが作れた。

リンクできるか試す。

/* hmain.c */
#include <stdio.h>
extern int add_numbers(int argc, int* argv);
int main(int argc, char* argv[])
{
  int arg[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
  printf("%d\n", add_numbers(sizeof(arg)/sizeof(arg[0]), arg));
  return 0;
}

コンパイル/リンクする。

$ ln -s libhello.so.1 libhello.so
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
$ gcc -c hmain.c
$ gcc -L. hmain.o -lhello -lc -o hmain
$ ./hmain
45

soとしても機能する。

ふつうのコンパイラをつくろう(青木 峰郎)

上でsonameで埋め込んだりするのは、ふつパイラで学んだ方法。


2009-10-28

_ 不思議な

ネトレプコとビリャゾンのラボエームが届いたので、早速子供と観る。

ラ・ボエーム デラックス版 [DVD](アンナ・ネトレプコ)

うーむ、えらく微妙な。映画なのかなぁ。映画だけど。屋根とか。難しいもんだな。アップを多用し過ぎかも。

三幕はすごく良い。歌もメイクもセットも演出も。

一幕は最近っぽいミミの仕掛け説。階段から上を見上げて太陽のところ。画家がいい(と思ったら吹き替えの役者だった。どっちにしてもアテレコだからどうでもいいのかも)。にしても先に行かせていきなりとは気付かなかった。第三者のおばさんを階段のところに組み込むのは映画っぽい。

四幕は音楽家(この人も役者らしい)の手持ちぶさたっぷり。マフのところはいい演出。ここでのネトレプコのメイクはなにがなんでもやり過ぎな気が。既に死んでいるよ(どこかで見たと思ったらスリラーの変身後のマイケルジャクソンだ)。

ビリャゾンは眉毛と三白眼が強調されている。もしかしてフォトジェニックなのかなぁ。音域に難があるらしいがおれにはわかんないや。ロドルフォの声としては好きだ。ムゼッタは歌と演技はムゼッタ。でも顔はベス。

音楽は原曲通り。ちょっとテンポは早めかも。出だしと最後は完全に無音だからテレビじゃ流せないな。

と、微妙ではあるけれど、家にあるラボエームとしてはカラヤン&フレーニより今後はこっちかな(フレーニが三幕でわたしは死ぬのね、と悟るところの控えめさは……と書いて気付く時代によって変わるミミの性格)


2009-10-29

_ ISO-2022-JP

久々にISO-2022-JPなフィールドに出会う。

PCKに変換するとして、どう扱うのが良いだろうか。

先頭と末尾にKI/KO付けて既存のエンコーダ(iconvとか)やクラスライブラリ(new String(ki + field + ko, Charset.forName("iso-2022-jp")).getBytes("windows-31j")みたいなやり方(確認していないのでAPIは怪しい))を使うか?

でも、単純にシフトしたほうが安い早いうまい(?になったり例外になったりする心配ないわけだし)のではないか、とか。

で、この場合は元の文字セットが変わることはないってのが条件だから後者だな。

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

_ naruse [CP50221を使ってください]

_ naruse [よくよく読むとISO-2022-JPじゃなくて、JIS X 0208が7bitでつっこんであるという話ですか。 それ..]

_ arton [どうもありがとうございます。 >JIS X 0208が7bitでつっこんであるという ですです。で、iconvにis..]


2009-10-30

_ 2%

相変わらずゆっくりとみんながやって来るを読んでいるのだが、Wikipediaの章になって、いろいろ考えるものがあった。

asphaltの項の成立を例にしているのだが、最初にどうでも良さそうなスタブを置くことがどう意味を持つのかがあり、それがどう発展したのかをヒストリを元に解釈する。

ブレヒトの「言い出したるは我にして、」を思わず想起する。誰も言い出さなければその後はないとか。

で、たくさん(実際には数値が出ているが)の人の手を経ているけど、その人数に着目しても実は真実は見えない。というのは、実際にほとんどの記述は2人の手によって為されている。この現象は同じようないわゆる「集合知」の世界では普遍的に見られる。Flickrのマーメイドも圧倒的な1人とその1人の半分を提供している2番目(5番目までが同傾向)、平均は全然下で、1枚のみを提供しているmode(どういう意味かわからん。真似っこ野郎というような意味かなぁ:追記 最頻値)がたくさん続く。このグラフ構造が、集合知と呼ばれるものの実態である、と来る。

おもしろい。

世界が100人の村で2人だけが主に働き、残り98人がその成果を貪るとしたら、おそらく2人は嫌になってしまい、結局、世界は成立しないように思う。狭い世界である。

しかし世界が1000万人の街で20万人が主に働き、残り980万人がその成果を貪る(でも気休め的にちょっとは手を気まぐれに動かす――ノイズとなるかも知れないが)としたら……なんか妙に現実世界そのままのような気がしてくる。GDPってそういうものじゃないか?

消費者は消費するが、供給者は供給する。

であれば、それを現実としたらどうだろうか。

そういう富の分配というのは既に考えている人たちがいたような。

マルクスや韓非子は、原始共産制が成立しえた理由を社会を構成する人員の少なさに置いた。

そうではなく、社会を構成する人員が巨大であれば多様性の原則により2%くらいの働き者が存在し得るかも知れない。さらに30%は、時たま働き、残りは消費する。

(機械を利用して)生産性を高めるということの最終的な目標は100%がフル稼働しなくても、2%が100%以上の供給を可能とすることだ。と、設定するといろいろ整合性が取れる。

Here Comes Everybody: The Power of Organizing Without Organizations(Shirky, Clay)

Wikipediaの歴史の箇所は江渡さんの本で理解していたので読みやすかった。にしても、objectionという単語が目的を意味するobjectから生まれているようなのに、異議とか反対という意味だとわかるまでは実に奇妙な読み取りをしていたのであった。なんでNupediaのメンバーがサンガーに強硬な目的(動機づけ?)を与えたのだろうか、とか(もちろん、猛反対したということであった)。

パターン、Wiki、XP ~時を超えた創造の原則 (WEB+DB PRESS plusシリーズ)(江渡 浩一郎)

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

_ ょゎ [> mode モード(最頻値)じゃないでしょうか。 1枚のみを提供している人が一番多い、という。]

_ arton [おお、モードにはそういう意味があるんですね。 どうもありがとうございます。すごく納得です(実際、グラフ上1番多い)。]


2009-10-31

_ ブレヒト

「言い出したるは彼にして、採用したるは我等なり」を、墓碑銘にしてくれ、という詩だったような気がしてきた。確認したいが手元に本がない。

ブレヒト詩集 (世界現代詩文庫)(ベルトルト ブレヒト)

というか、なぜ竹宮恵子が、と空目したこれちょっと聴いてみたいな。

竹田恵子ブレヒトソングを歌う(寺嶋陸也)

これはすごく聴いてみたいが、首が落ちそうだ。

ブレヒト再び(ミルバ)

というか、マンダレーソングもブレヒトだったのか。

ミュージック・ファクトリー(フライング・リザーズ)

つい試聴しまくってしまったが、カニンガムって名前のやつはどうしてこうも変な共同作業を指向するんだろうか。

_ おれに墓はいらない

見つけた。引用者ありがとう。

I NEED NO GRAVESTONE

I need no gravestone, but

If you need one for me

I wish the inscription would read:

He made suggestions. We

Have acted on them.

Such an epitaph would

Honor us all.

---Bertolt Brecht

こんな感じかな。

おれには墓石は無用だよ。でも

あんたがどうしてもって言うならさ

刻んでおくれよこの文句:

言い出したるは彼にして

実装したるは我等なり

こんな墓碑銘だったなら

栄誉をみんなで分け合える

――ベルトルト・ブレヒト

_ Windows7でVisutal Studio 6

あーあ、またあのばかげたMS JAVAのインストールからやらなきゃならんのか……とうんざりしていて、ふと気づく。

おれはVC6を、コマンドラインからしか使わないではないか。

ということは、XCOPYインストールで十分じゃないか?

というわけで、古いマシンのProgram Files\Microsoft Visual StudioをそのままProgram Files (x86)の下にコピーしてやって、~/binにvcvars32.batをコピーしてやって、コマンドラインからvcvars32と打つと、おお、ちゃんとRubyがmakeできるじゃん。

めでたしめでたし。


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|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|

ジェズイットを見習え