フィンローダの本当の裏 →Home , Prev , Next

2003年8月のアレ

2003年8月31日

Java World の10月号を見て気になっていること。 オブジェクト指向プログラミングのツボ、という連載で、 インタフェース活用のススメ、という回。 リスト11から引用させてください。

public class Hoge {
    protected string[] arrayOfString;

    // インデックスで指定された文字列の文字の並び順を逆にする
    public void reverseString(int index) {
        String s = arrayOfString[index];
        char[] original = s.toCharArray();
        char[] reversed = new char[original.length];
        for (int i = 0; i < original.length; i++) {
            reversed[i] = original[original.length - (1 + i)[;
        }
        arrayOfString[index] = String.valueOf(reversed);
    }

    // すべての文字列の文字の並び順を逆にする
    public void reverseStringAll() {
        for (int i = 0; i < arrayOfString.length; i++) {
            reverseString(i);
        }
    }
}

これに対して、 並び順を逆にした文字列の文字数を取得するという機能をオーバーライドさせたい、 というのが課題だ。 その例がリスト12として、次のようなコードが紹介されている。

public class Boge extends Hoge {
    // 文字の並び順を逆にした文字列の文字数
    int numOfReversedString;

    public void reverseString(int index) {
        numOfREversedString++;
        super.reverseString(index);
    }

    public void reverseStringAll() {
        numOfReversedString += arrayOfString.length;
        super.reverseStringAll();
    }

    public int getNumOfReversedString() {
        return numOfReversedString;
    }
}

で、予期したように振舞わない、 だから継承はダメだ、という趣旨らしい。

継承が危険だとか、使いすぎると中毒になるので使わない方がいいとかいうのは別に反対しないのだが、 これはいくら何でも例がおかしすぎるのでないだろうか。 もちろん、これは 並び順を逆にした文字列の文字数 ではなく、 並び順を逆にした文字列の数 をgetするように実装しているのでヘンなのだが、 そういうtypoは別にこだわらない。 疑問は3つありまして。

まず、この例、継承なんか知らないというか、 単に元のコードを修正して 「並び順を逆にした文字列の数」もgetできるようにしろ、 という問題ならどうするのか。 オーバーライドしたクラスを作った時と同じような発想で書けば、 多分、こんなことになるのではないか。

public class Hoge {
    int numOfReversedString;
    protected string[] arrayOfString;

    public void reverseString(int index) {
        numOfREversedString++;
        String s = arrayOfString[index];
        char[] original = s.toCharArray();
        char[] reversed = new char[original.length];
        for (int i = 0; i < original.length; i++) {
            reversed[i] = original[original.length - (1 + i)[;
        }
        arrayOfString[index] = String.valueOf(reversed);
    }

    public void reverseStringAll() {
        numOfReversedString += arrayOfString.length;
        for (int i = 0; i < arrayOfString.length; i++) {
            reverseString(i);
        }
    }

    public int getNumOfReversedString() {
        return numOfReversedString;
    }
}

もちろん、これも期待通りに動作しない。 reverseStringAll() で文字列の数を加算したにもかかわらず、 reverseString() でも、もういちど文字列の数を加算してしまうからだ。

そんなわざとらしいバグはいくら何でも作らないだろ、 と思うだろうか。 私もそう思う。 だったら、オーバーライドしたクラスも、 いくら何でもそういうバグは作らないのでは? 普通、複数の文字列をひっくり返すようなメソッドがあったら、 単独で文字列をひっくり返すメソッドを呼んでいる位は常識的に気付くというか、 最初からそういうものだと想定してコードを変更するのでは?

public class Boge extends Hoge {
    int numOfReversedString;

    public void reverseString(int index) {
        numOfREversedString++;
        super.reverseString(index);
    }

    public int getNumOfReversedString() {
        return numOfReversedString;
    }
}

で、2つめの疑問。 こちらの方が興味津々なのだが、 仮に class Hoge が既にあるとする。 これに文字列の数をgetする機能を追加したい。 というような場面ですね。 インタフェースを使ってその機能を追加実装する には、 どうすればいいのだろうか?

全然関係ない話だが、 reverseString(int index) の実装がややこしいのだが、 演習でもなければ、 多分、次のような書き方をする人が多いのではないかと思う。

    public void reverseString(int index) {
        StringBuffer buf = new StringBuffer(arrayOfString[index]);
        arrayOfString[index] = buf.reverse().toString();
    }

ロジックとしては1文字ずつ入れ替えてとか、 勉強のためかもしれないが、 reverse() というメソッドがあるのだから使わない手はないのでは。

で、継承する人に対する警鐘として、 次のように指摘しているのだが。

スーパークラスに実装済みのメソッドをサブクラスでオーバーライドする場合には、 スーパークラスの実装についてもある程度把握しておかなければならないでしょう。

大雑把に賛成。 ただし、極論をいえば、二つ考え方があると思う。 まず、 スーパークラスに実装済みのメソッドをサブクラスでオーバーライドする場合には、スーパークラスの実装について完全に把握しておかなければならない という考え方。 もう一つは、 スーパークラスに実装済みのメソッドをサブクラスでオーバーライドする場合には、スーパークラスの実装に依存しないような機能追加でなければならない、 というやり方。 こちらの方が無難のように見えるが、 まさかということが絶対にないとはいえない。

じゃあ具体的にはどうすればいいのか? それがよく分からないですね。 例えば、こんな感じか?

public class Boge extends Hoge {
    int numOfReversedString;

    public void reverseAndCountString(int index) {
        numOfReversedString++;
        reverseString(index);
    }

    public void reverseAndCountStringAll() {
        numOfReversedString += arrayOfString.length;
        reverseStringAll();
    }

    public int getNumOfReversedString() {
        return numOfReversedString;
    }
}

この書き方は、スーパークラスのメソッドを全然オーバーライドしてないです。 ということは、 「オーバーライドする場合には、スーパークラスの実装について完全に把握しておかなければならない」という条件はクリアしたことになる。 なにしろ、オーバーライドしていないのだから、把握する必要ない。 もっとも、全然分からないと呼び出しもできないので困るが。 とにかく、 super 使うと、途端にややこしくなりそうな気がする。

最後の疑問。 これって例えば何も考えずに reverseStringAll() を2回呼び出したら、一つも文字列は逆転しないで最初と同じ状態なのだが、 その後に getNumOfReversedString() を呼び出すと arrayOfString.length * 2 という値が返って来るはず。 それでいいのか?

あるいは、 reverseString(int index) というのも public なわけだから、 reverseString(0) の後に reverseStringAll() を実行するような使い方も想定していると勝手に思い込んでみただけだが、 その場合、どういう値を戻すべきか? もちろん、逆転している文字列の数は arrayOfString.length - 1 個だが、 getNumOfReversedString() は arrayOfString.length + 1 を返してくる。


2003年8月29日

すのものの「いろいろ」で、 「通る」「通う」は(過去形にすると)「通った」になるので区別できなくなるというご指摘。 まさにそうだ。 2ちゃんねる表現だったら、どちらも「通た」で区別できない。

§

2003年度版のDVDと入力したかったのだが、 2003粘土板と変換されてびっくりした。


2003年8月28日

昨日帰ってきて、何か気がついたら朝になっていた。

§

TSUTAYAでボヘミアンラプソディーがかかっていた。 某被告の判決が出る日にかけるような曲じゃないような気がした。


2003年8月27日

山水電気。


2003年8月26日

FPROGのchatの、ギャンブルネタ。 ギャンブルで株で遊ぶという話。 基本的にギャンブルというのはゼロサム-テラ銭、ということで、 長期的に考えると、テラ銭分、必ず損する、 というのが確率的な発想ではあるが、 株の場合には配当金があるから、 必ずしもゼロサムではない。

ルーレットはどうですか。 先日、TVで金持ちが出てきたのだが、 ギャンブル必勝法ということで、ルーレットで賭けていた。 ルーレットなんて、典型的なテラ銭分減少パターンのギャンブルだから、 そんなことがマジであるのか。

必勝法というのも、超単純。 例えば、赤が何回か連続して出なかったら、次に赤に賭ける、みたいな話。 何回も連続して出ない確率は非常に小さくなるから、 とかTVでは言っていた。

もちろん、こんなのは数学的にも単純な誤解で、 その前に何が出ていようが、次に赤が出る確率は1/2だ。 というのが数学者の論理なのだと思う。

しかし、その人は実際にギャンブルで家を建てたという(私は信じてないですけど)。 数学よりもトンデモ理論が勝つということがあるのか、それとも確率は0ではないということで、単に運のいい人? 違う。 ルーレットが確率的な機械だという認識が、まず間違っているのである。 カジノでルーレットを担当するようなプロだと、 まず間違いなく思った所に球を入れる位のスキルはあると考えてよい。 プロを甘くみてはいけない。

その途端に、赤が何度も連続して入らなかった後の心理状態というのが問題になるわけである。 5回続けて黒に入ったか。 じゃあ赤に散らしてみるか、みたいに考えるのでは。 「では」というのもポイントなのだが、 何かそのあたりの駆け引きが重要なゲームになってしまうのだ。


2003年8月25日

VAIO Z のバッテリーを外したまま出てきてしまった。 不覚。


2003年8月24日

個人情報保護法について勉強しました。

メモその1: 法的に、個人情報というのは、こう定義されている。

この法律において「個人情報」とは、 生存する個人に関する情報であって、 当該情報に含まれる氏名、 生年月日その他の記述等により特定の個人を識別することができるもの (他の情報と容易に照合することができ、 それにより特定の個人を識別することができることとなるものを含む。) をいう。

従って、故人に関する情報はいかに扱っても個人情報保護法的には問題ないということか。 名誉毀損とか、似たような話があったような。

ここで一番気になったのは、「当該情報に含まれる氏名」である。 もっと具体的に。 実名をハンドルにしている人の、ハンドル。 これは個人情報か、否か?

4 この法律において「個人データ」とは、 個人情報データベース等を構成する個人情報をいう。

個人情報保護法は、「個人情報」と「個人データ」を区別している。 これポイント。

もう一つ大きいと思うのは第五十条。

個人情報取扱事業者のうち次の各号に掲げる者については、 その個人情報を取り扱う目的の全部又は一部がそれぞれ当該各号に規定する目的であるときは、 前章の規定は、適用しない。
一 放送機関、新聞社、通信社その他の報道機関(報道を業として行う個人を含む。)報道の用に供する目的
二 著述を業として行う者 著述の用に供する目的
三 大学その他の学術研究を目的とする機関若しくは団体又はそれらに属する者 学術研究の用に供する目的
四 宗教団体 宗教活動(これに付随する活動を含む。)の用に供する目的
五 政治団体 政治活動(これに付随する活動を含む。)の用に供する目的

「業」として行う場合には適用除外されることがあるわけですね。 しかし「業」でなければ適用されない。 もっとも、業でないのに個人情報をgetするようなことがあるのか、 という話はありそうだ。 個人でWeb掲示板を開設できる昨今、そういうケースはいくらでもあるが、 それって個人情報取扱事業者なの? 第二条3。

この法律において「個人情報取扱事業者」とは、 個人情報データベース等を事業の用に供している者をいう。 ただし、次に掲げる者を除く。

事業の用に供している者、という縛りがある。 ということは、個人Web掲示板って対象外なのか?

その昔、パソコン通信系のBBS(って何?)が流行していた頃に、 会員情報を流用して問題になった草の根BBSがありました。 あれって、事業の用になるのか?


2003年8月21日

ぷらっとホームの株を146,000円で指値を入れておいたら売れていた。 終値を見ると16万円を超えていた。

世の中難しいものだ。

§

chat で rpm のマニュアル読む。 って意味不明だが。

--percent のところで「その割合をを表示する」になっているのを見て、 思わず「をを〜」とかいう。

--help で、「長く表示する」というのが気になる。 「詳しく表示する」の方がいい。 長くというと、時間が長いというような誤解があり得るので。

というのを担当者(誰?)に指摘したいのだが、 後でするとして、とりあえずメモったと。

§

chat ですが。 Windows XP Home でも、 コンパネ→管理ツール→イベントビューア、というのは使えるらしい。 使えるというのはアレですが、 イベントのエラーとか見て、それでどうした、ということで終わってしまう罠。

どういうエラーかと思ったが、 DHCPのエラーとか、 ドメインがどうしたとか、そういうのもあったが、 一番多いのがどうも RealPlayer が出しているエラーのようだ。 実際、ヘンなことが多かったわけですけど。

§

BGM: Three of a parfect pair / King Crimson。 これ一日中聴いていた。 って、病院行った方がいいか、もしかして?

単語難しくて聞き取れません。 schizophrenic tendencies なんてのは、日本語だと誰でも知っているレベルなんだけど。 もちろん、言葉は知っていても、 その実何なのか、ということを科学的に知っている人は少ないのだろう。

§

ROM墓場からの声、に書く予定の一部。 単行本何かあるかというネタから、実は一冊もない。 じゃあどんなの書きたいか、という話で、ここに至るのである。

「劇的Before-After」のプログラミング版ですね。

帯の案。
とんでもないプログラムを抱えた依頼者に、 リファクタリングの匠が立ち上がる。 ブラックボックスの魔術師や、 委譲の伝道師たちが、 チームが投げ出したプロジェクトを救ってくれる!!

コツは、最初にオモクソぶち壊すことですね。天井まで壊してもいい。 できれば外壁、最低でも土台だけ残せばok。

なぜか必ず予算内(デザイン料除く)に収まるのがポイントです。これ重要。

事例例(って何?) どうしても統合できなかった某大銀行に、 リプレースの修飾師【謎】が立ち上がりました。 限られた期間内に、限りなく少ない予算で安定したシステムに置き換えるという厳しい条件でした。 匠は、何と COBOL で書かれた勘定系を全て崩して、Ruby に置き換えたのです。 しかも、懸案だった運用コストが、

 なんということでしょう(お約束)。

マシンも LINUX に置き換えることで、限りなく 0 に近くなったのです。 もちろん、端末のUIはキャラクタベースにするという、 オペレーターの思い出を再利用する心憎い演出も忘れません。 これで1円入札も気兼ねなく出来…


2003年8月20日

渋谷の店頭でブラックジャック文庫本の新刊を叩き売りしていたけど、 声を出せば売れるというような種類の本ではないと思う。 むしろ黙っていた方が…とか思った。

皆さん上の方を見上げていたので何かとおもってつい同じ方向を見てしまった。 修行が足りませんナー。 アディダスの看板広告だったと思う。

§

ぷらっとホームの株を136,000円で買った。

調子に乗って145,000円売りで指値を入れておいたら、 引け値が144,000円だった。 失敗。

ぷらっとホームというのは、 PC UNIX 系のアレとか売っている店で、 秋葉原にある。 行ったこともある。 というか、最近100Mbpsのダムハブ買ったのって、 ぷらっとホームのオンラインショッピングだったような。 それはそうとして、 近くに同人ショップがあったような気もするが、昔の話だ。 最近は、秋葉原といえば電気街じゃなくて同人とかそっちの方が有名だとか。

面白い銘柄というか、 派手なのというと、 先日も書いたが、 イーディーコントライブですか。 株価はぷらっとホームと同じ程度だが、 これなら一日に2万円程度動くことがある。


2003年8月19日

Weather Underground って何で Underground なんでしょうね?

§

世田谷区が住基ネット接続を再開したそうですが。 住基ネットに接続されている庁内LANの110台が感染したが、除去して安全になったので繋いだということで。

ちょと待てい。 ウィルスに感染したということがどういうことなのか、分かっているのか?

まあいいか。 ところで、仮に日本の人口が1.3億人(そんなにいないけど)として、 一人あたりの個人情報データが512バイト(そんなにいらないけど)で入るとする。 全日本人の個人情報データを保存するために必要な容量は、 130000000 * 512 ≒ 62GB。 今時のpcのハードディスクの容量があれば、全部入ってしまう程度なんですね。


2003年8月18日

出産費用を踏み倒す事例が増えているというのだが、 少子化対策とか行政で言うのであれば、 出産費用位は無料にするのが当然だと思う。 一人あたり20〜40万円。 それが税金から出せないで、 何が少子化対策か。

もしかして、無料化した途端に激増することを心配してますか?

§

VAIO Z を使っていると、 左手が無意識にタブレットの所をタッピングしてしまって、 思わぬ結果になることが、たまにある。 Z じゃなくてもあったと思うけど、 何か Z で確率が高くなったような。


2003年8月16日

ペントハウス いわゆる事実上倒産ですか。

日本語ページあるかと思って探したけど分からない。 検索したら、 関係ないサイトがおもいっきりヒットする。


2003年8月15日

ご飯に「ひじき志ぐれ」をかけて、お湯かけて、醤油ちょっとたらして食べる。 湯漬けって感じか。

「ひじき志ぐれ」でヒットさせたくて書いた。 ひじきしぐれ、だと google で殆どヒットしなかった。 で、それ何、とか言われそうな話ですが。

§

台風10号ネタ。

むかしむかし、おったげな。 おじいさんは、山にしばかりに、 おばあさんは、川に洗濯に行ったげな。

おばあさんが川についてみると、 川は台風10号の影響で濁流になっていたげな。 ふと川上を見ると、 大きな桃が、

ドンブラドンブラドンブラドンブラドンブラドンブラドンブラドンブラドンブラドンブラ

と流れてきて、

コーーーーーーーーーーー

と、すごい勢いで川下に流れていったそうな。

これでは洗濯はできんぞ、と思ったばあさんは、 そのまま家に帰ったそうな。

おしまい。

おおそうじゃ、バーベキューなんてもっての他だげな。 って、じいさん大丈夫か?


2003年8月14日

ちょっと風邪っぽいかな。 アジトにいるのだが、室温が22〜23度あたり。


2003年8月12日

asahi.com のニュースで、 インドネシア、バリ島爆弾テロ事件の主犯格の公判で、 死刑を求刑された被告が喜んでいるというのがあった。 死によって神に近づくことができる、というのだが、 イスラム過激派に死刑判決は抑止効果になっていない、という話。

非人道的というか、そんなことしたら過激派がもっと過激になりそうだから多分ありえない話だが、 抑止効果というのなら、豚肉食わせるってのが、何かであったような気がする。

というか、 イスラム的にはどういうのが刑罰になっているのだろうか。

日本だと、隠れキリシタンの処刑とか、 悲惨な歴史はあったわけですが。


2003年8月12日

何かウィルスが流行っているそうですが、 またぞろ Windows Update していないとかいう話ですか。 そうですか。


2003年8月10日

アジト日帰り。

§

カラムーチョカップ焼きそばという面妖なものを発見したのでトライ。

辛。

画像入れたいけど、容量足りなくなってきたのでパス。 画像だけ引っ越した後に入れる予定。 って、ここに画像が来る予定、というのはどうすれば書けるのだ?


2003年8月9日

今日はアジトに行く予定だったんですけどねぇ。 列車が全運休でどうしようもない。

「駅ねっと」ですか。 あんなに凄いサイトがまだあるとは知らなかった。 何かポチっと押して1〜2分帰ってこないのはまだいいとして、 うっかりポチッと押しすぎたら選択した駅名がクリアされてしまって、 もう一度1〜2分待たないとダメって、 誰だよ、UI設計したのは?

しかも、駅名を指定して、実行ボタン押したら 「混雑しているので使えない」とかいう。


2003年8月8日

イーディーコントライブってどうなのだろう。 株の話。 急上昇中なのだが。 とか思ったら今日は失速したみたいだが。


2003年8月4日

ニシキテグリという魚がいるそうですが。 ニシキテグラもいるのだろうか、とか思った。

冗談は抜きにして、この魚、 「ニシキ何とか」としか覚えられなかったので、 Webで探すのに大変苦労した。 キーワードの一部だけ覚えているような場合、 どうやって探すのが基本なのだろうか? 「ニシキ何々」と「魚」という情報からニシキテグリの情報が出ているサイトを探したい、というような場合だが。

§

このサイト、どの程度容量空いているのか調べてみた。

perl d:\perl\ftpcheck.pl ls-lR.dat 20496 blocks, 8314288 bytes (7.929 MB) .html = 2548224 bytes .txt = 39438 bytes .jpg = 5580921 bytes .png = 93792 bytes .gif = 1086 bytes

gifって特許切れたっけ? 意図的に使っていない筈なのだが、…と思って調べたら、 PostPetのロゴだった。 Sony指定なんだから、これは大丈夫だろ。 というか、PostPet インストールしてないよ、VAIO Z。 すみません、早急に何とかします。

で、10MBの限界に近づいているようなので、引越ししないと。 URL変えるのは愚の骨頂ということは承知なので、トップとかは変えないですよ、 もちろん。 さっきの結果見ると、半分以上は画像ってことが分かる。 つまり、画像を他サイトに引っ越せば桶。 他サイトというか、 自分のサーバー指すように変更すれば、まだ数GBは空いているはずだし、 折角Bフレなんだからそれでいこうか。


2003年8月2日

もののけ週間

っていつの話なんですか? 「もののけ週間」でサーチしても何もでてこないので、 とりあえず書いてみた。 こうすると、ここがヒットするような気がしたので。


2003年8月1日

今月こそはWebフォーラムの手続きを…とか思ったりする。 もう8月だよ。

I wanna find another way to live, ってことか。

BGM: Walls - Yes


(C) 2003 Phinloda, all rights reserved

RIMNET: phinloda@st.rim.or.jp