トップ «前の日記(2005-08-05) 最新 次の日記(2005-08-07)» 編集

日々の破片

著作一覧

2005-08-06

_ 目が悪くなると世界が変わる

パブロ@はてなというピカソに出会った。

でも実は単なるペアプロだったりするし、音韻じゃなくて見間違いによるから語呂合わせじゃなくて語形合わせだ。

そこでふと語呂と語形じゃ全然違うということに気づく。語呂には主観が入る。語呂が良い/悪い。しかし語形が美しいとか語形の調子が良いというのは聞かない(というか語形というのは音韻の変化などの観察対象となる音韻上の連なりであって、文字通りの語を構成する文字の見た目の意味ではない)。字形、字体というのはあるな。しかし、あくまでも語の問題だし。皿皿皿……という高橋新吉の語形というよりはやはり字形だし。

_ 生産性

『生産性が高い言語』という言い回しがある。

その意味するところは、なんだろう。

多分、こんなことだ。

漢字を使うのは実は難しい。彼は行った。正則だとこうだけど、いったのかおこなったのか判断するには前後の文脈にたよる必要がある。

そこで、前後の文脈を読むなどという高等技術を使わなくても済む平仮名ですよ。というわけで、仮名漢字変換を持たないワープロを与える。それが生産性が高いということだ。

でも、この戦略がたいていの場合に失敗するのは、

・漢字仮名混じり文のほうがほとんどの場合に読みやすい(『行った』なんてのは例外)

・『きょうはいしゃにいった』のような強烈な反例に対する無知

あたりだろうな。というわけで、やはり漢字の利用を解禁する。

でも、この戦略がたいていの場合に失敗するのは、

・『難漢字多数利用是如何』とか大喜びで書き出すやつが出て来る(でも、意味はわかるから、まあいいんじゃないか、やりたいお年頃なんだろ、と、たかをくくっていると)

・『共は慰謝に逝った』とか漢字も知らなきゃ辞書もひかない追随者が出て来ることだ。『きょうはいしゃにいった』から事態は少しも進展していないではないか(多分、『医者に行った』んだろうが、前後の文脈読んだり、変換キーを押した位置を推測したりといった高度な読み取り技術が要求されるわけで、元の木阿弥である)。

漢字仮名混じりだめ、平仮名オンリーだめ、そこで教育漢字限定かつ熟語は全部で100種くらいのお子様ワープロを与えれば良いと思いつく人がいる。LISPからマクロを抜いて与えるとか、Javaから継承とインナークラスを抜いて与えるとか、RubyからclassとmoduleとProc、eachあたりを抜いて与えるとか、Cからgotoと関数ポインタを抜いて与えるとかだ。

でも、この戦略がたいていの場合に失敗するのは、

……(と無限に続く)

_ 安全なコードは難しい

public class Registry {
    static final int SYSTEM_END = 99;
    static final int USER_START = 100;
    String[] registry; // 最初の100個はシステム専用
    ...
    /**
     * 内部処理専用
     */
    String internalGetValue(int index) {
        return registry[index];
    }
    /**
     * 設定値を返す。
     * @param index 読み取る値のインデックス
     * @throws ArrayIndexOutOfBoundsException indexが不正
     */
    public String getValue(int index) {
        return registry[USER_START + index];
    }
}

というようなプログラムの持つバグをTechED初日のセキュアコードのセッションで指摘された。C#でだけど、Javaでも同じことだ。ちなみにinternalGetValueにはセキュア属性が付いていた。

ArrayIndexOutOfBoundsExceptionにチェックさせようという戦略だがすべてのユーザーがシステム値を読み取れるバグがある。もちろんReflectionの使用は除く。

問題点を指摘し、修正せよ(配列2本持ちとか、別クラスにするとかは置いておいて、あくまでもgetValueメソッドの修正ということで)。

C#の元の問題のほうが難しいな。

本日のツッコミ(全10件) [ツッコミを入れる]
_ jugyo (2005-08-06 10:03)

> 安全なコードは難しい<br>indexがマイナスだったらArrayIndexOutOfBoundsExceptionをthrow、でどうですか?

_ arton (2005-08-06 10:31)

ピンポン。C#だとunsigned intがあるからそこが見つけにくいのでした(longにキャストして判断すれば良い)。この場合、Javaだから簡単だね。

_ arton (2005-08-06 10:45)

うう、longにキャストは別の話だ。C#だと加算後の値について下限チェックが必要。

_ babie (2005-08-06 10:46)

いっそのこと、<br>return registry[USER_START + index % (registry.size - USER_START)];

_ arton (2005-08-06 11:07)

変な呼び出しするプログラムを弾くのも目的なんだからやり過ぎでしょ。というかインデックスの意味がmod size-USER_STARTで重複していくからまずい(後から後ろに延ばせなくなる)

_ babie (2005-08-06 23:51)

>やり過ぎ<br>ダハハ、その通りです。Ruby のインデクサっぽいかな〜と思って。

_ arton (2005-08-07 19:39)

c:\home\arton>ruby -e 'a=[1,2,3,4,5];p a[-1]'<br>5<br>そうか、忘れてたけど、確かにこれは便利なんですよね。

_ arton (2005-08-07 22:28)

残念、大きい方にはみ出すとrubyはnilを返すからbabieさんのはブブーでした。

_ babie (2005-08-08 00:50)

あう、調子に乗って循環させてしまった。

_ unibon (2005-08-08 09:43)

言語(プログラム)を言語(漢字)でたとえるのは、すごく分かりやすいですね。


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|04|05|06|07|08|09|10|11|

ジェズイットを見習え