2003年1月

結城浩の日記

目次

2003年1月31日 (金) - 修繕

サーバ移転であちこちCGIがほころびているのを修繕してまわる。 このあたり、リアルワールドの引越しと似ていていささか可笑しい。

他の人はどこ見てる?や、 他の人はどこをよく見てる?も無事に復帰しました。やれやれ。

日記のカレンダーを直して、という お願いメールが 橋本礼奈さんから来た。 さくっと修正。 CGIをいじっているところだったので、タイミングがとてもよい。 「プログラマは魔法使いのようだ」とか「だてに結城さんじゃない」というおほめの言葉をいただき、うれしくなる。*^_^*

気がつくと、21世紀最初の素数年である2003年ももうすぐ一月が終わる。

[TECHINFO] レクチャで流したようなちょっとした情報を取りまとめるため、 技術情報というページを起こした。

2003年1月31日 (金) - 仕事

[CR](ce)淡々と仕事。 うーん、一生懸命書いているのに、 なかなか進まないにゃー。 ぜんぜん「淡々と」じゃない。

文章は、読むことで磨きがかかる。

[REF] いつの間にか リファクタリングの連載原稿ができていたので編集部へ送付。 今回は「Tease Apart Inheritance —— 継承の分割」という大きなリファクタリング。

2003年1月30日 (木) - クラス情報をJTreeとJTableで表示

クラス情報をJTreeとJTableで表示する簡単なビューアです。

コンパイル&実行は、

    javac ClassView.java
    java ClassView javax.swing.JFrame

のようにします。

上半分のJTreeにはクラスの階層が表示されます。 マウスでクラス名を選択すると、下半分のJTableには、 クラス名、スーパークラス名、メソッドの一覧 が表示されます。 もっとたくさんの情報を表示してもよかったのですが、 とりあえず以上。

/* ClassView.java */
import java.lang.reflect.*;
import java.io.*;
import java.awt.*;
import java.util.*;
import java.util.regex.*;
import javax.swing.*;
import javax.swing.tree.*;
import javax.swing.table.*;
import javax.swing.event.*;

public class ClassView extends JFrame implements TreeSelectionListener {
    private static final String ROOT_OBJECT = "java.lang.Object";
    private final HashMap _nameToNode = new HashMap();
    private final TreeNode _root = createNode(ROOT_OBJECT);
    private final JTree _tree = new JTree(new DefaultTreeModel(_root));
    private final JTable _table = new JTable();
    private final JScrollPane _treePane = new JScrollPane(_tree);
    private final JScrollPane _tablePane = new JScrollPane(_table);
    public ClassView() {
        super("ClassView");
        _nameToNode.put(ROOT_OBJECT, _root);
        _treePane.setMinimumSize(new Dimension(640, 240));
        JSplitPane pane = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
        pane.setTopComponent(_treePane);
        pane.setBottomComponent(_tablePane);
        pane.setPreferredSize(new Dimension(640, 480));
        getContentPane().add(pane, BorderLayout.CENTER);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        _tree.addTreeSelectionListener(this);
        pack();
        show();
    }
    public void add(String classname) {
        try {
            add(Class.forName(classname));
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    public void valueChanged(TreeSelectionEvent e) {
        Object[] path  = e.getPath().getPath();
        if (path != null && path.length > 0) {
            String className = path[path.length - 1].toString();
            showClassProperty(className);
        }
    }
    public void add(Class cls) {
        Vector v = new Vector();
        while (cls != null) {
            v.insertElementAt(cls.getName(), 0);
            cls = cls.getSuperclass();
        }
        for (int i = 0; i < v.size() - 1; i++) {
            String parentName = (String)v.get(i);
            String childName = (String)v.get(i + 1);
            DefaultMutableTreeNode parentNode = findNode(parentName);
            DefaultMutableTreeNode childNode = createNode(childName);
            parentNode.add(childNode);
        }
        repaint();
    }
    private DefaultMutableTreeNode findNode(String name) {
        DefaultMutableTreeNode node = (DefaultMutableTreeNode)_nameToNode.get(name);
        return node;
    }
    private DefaultMutableTreeNode createNode(String name) {
        DefaultMutableTreeNode node = findNode(name);
        if (node == null) {
            node = new DefaultMutableTreeNode(name);
            _nameToNode.put(name, node);
        }
        return node;
    }
    private void showClassProperty(String className) {
        DefaultTableModel model = new DefaultTableModel();
        model.setColumnCount(2);
        _table.setModel(model);
        try {
            Class cls = Class.forName(className);
            Class supercls = cls.getSuperclass();
            Method[] methods = cls.getMethods();

            showProperty("name", className);
            if (supercls != null) {
                showProperty("super", supercls.getName());
            }
            for (int i = 0; i < methods.length; i++) {
                showProperty("method #" + (i + 1), methods[i].toString());
            }
        } catch (Exception e) {
        }
        _tablePane.repaint();
    }
    private void showProperty(String propName, String propValue) {
        DefaultTableModel model = (DefaultTableModel)_table.getModel();
        int row = model.getRowCount();
        model.setRowCount(row + 1);
        _table.setValueAt(propName, row, 0);
        _table.setValueAt(propValue, row, 1);
    }
    public static void main(String[] args) throws Exception {
        if (args.length == 0) {
            System.out.println("Usage: java ClassView classname ...");
            System.out.println("Example: java ClassView javax.swing.JFrame");
        }
        ClassView view = new ClassView();
        for (int i = 0; i < args.length; i++) {
            view.add(args[i]);
        }
    }
}

2003年1月29日 (水) - サーバ重い

サーバ移転はいいのだが、何だか重い。 あちこちのCGIはおかしなエラーになるし。ふみふみ。

2003年1月29日 (水) - CSVファイルをJTableで表示

CSVファイルをJTableで表示する簡単なビューアです。

/* CSVViewer.java */
import java.io.*;
import java.awt.*;
import java.util.regex.*;
import javax.swing.*;
import javax.swing.table.*;

public class CSVViewer extends JFrame {
    private final String _filename;
    private final JTable _table = new JTable();
    private final JScrollPane _pane = new JScrollPane(_table);
    public CSVViewer(String filename) throws IOException {
        super(filename + " - CSVViewer");
        _filename = filename;
        readin();
        getContentPane().add(_pane);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        show();
    }
    private void readin() {
        Pattern pattern = Pattern.compile(",");
        DefaultTableModel model = (DefaultTableModel)_table.getModel();
        try {
            final BufferedReader reader = new BufferedReader(new FileReader(_filename));
            String line;
            for (int row = 0; (line = reader.readLine()) != null; row++) {
                String[] items = pattern.split(line);
                model.setRowCount(row + 1);
                for (int column = 0; column < items.length; column++) {
                    if (model.getColumnCount() <= column) {
                        model.setColumnCount(column + 1);
                    }
                    _table.setValueAt(items[column], row, column);
                }
            }
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) throws Exception {
        if (args.length != 1) {
            System.out.println("Usage: java CSVViewer file.csv");
            System.exit(0);
        }
        new CSVViewer(args[0]);
    }
}

サンプルCSVファイル(sample.csv)です。

2002,ISBN4797321261,結城浩のPerlクイズ
2002,ISBN4797319127,Java言語で学ぶデザインパターン入門 マルチスレッド編
2001,ISBN4797316462,Java言語で学ぶデザインパターン入門
2001,ISBN4797312211,Perl言語プログラミングレッスン 入門編
1999,ISBN4797308036,Java言語プログラミングレッスン(上巻)
1999,ISBN4797310103,Java言語プログラミングレッスン(下巻)
1998,ISBN479730507X,Perlで作るCGI入門 基礎編
1998,ISBN4797305819,Perlで作るCGI入門 応用編
1998,ISBN4797307579,改訂第2版 C言語プログラミングレッスン 入門編
1995,ISBN489052519X,C言語プログラミングレッスン 文法編
1996,ISBN4890528687,新版 C言語プログラミングのエッセンス

コンパイル&実行は次のようにします。

javac CSVViewer.java
java CSVViewer sample.csv

2003年1月29日 (水) - サーバ移転

サーバ移転のため、サイトのあちこちに不都合が発生していますが、ご了承ください。

2003年1月28日 (火) - Bridgeパターン / 打ち合わせ

[REF] 現在書いているJAVA Developerのリファクタリングの連載は「継承の分割」です。 これはBridgeパターンの構成と呼んでもいいかもしれません。 サンプルプログラムをいまマクドナルドで書いたのですが、 すっごく気持ちがいい。リファクタリングは気持ちがいいねえ。

[CR] 暗号本について、編集長と打ち合わせ。 いろいろと情報交換。

2003年1月27日 (月) - 読者からの質問

質問

今卒業研究で,Javaを勉強しているのですが, 
(中略)
自分の作ったjavaをimportしようとすると,文句を言われちゃいます. 
これで卒研はストップしまくりです... 
あと一ヶ月で発表...
いろいろ調べてるんですが,jarファイルの作成仕方と意味がよくわかりません.

ご多忙かと思いますが,
どうかたすけてくださ〜〜〜い!!! 

回答

卒業研究というものは(以下略)。 ともあれ、発表がんばってください。

さて、自分の作ったクラスのimportがうまくいかないのは、 クラスパスが正しく設定されていないのでしょう。 以下を参照。

https://www.hyuki.com/jq/jqdig0056_package.html

jarファイルの作成の仕方と意味については、 検索エンジンで「jarファイル 使い方」などとして検索しましょう。

2003年1月26日 (日) - 「キリストにならいて」MakeWeb→PDF

「キリストにならいて」の翻訳は、 翻訳者の方々に決まったフォーマットで書いてもらっている。 で、以下のPerlスクリプトを使うと、pLaTeXを利用して、PDFを作ることができる。

#
# 「キリストにならいて」のMakeWeb入力ファイルをPDFに変換するPerlスクリプト
#
# Copyright (C) 2003 Hiroshi Yuki.
# https://www.hyuki.com/imit/
#
# This program is free software; you can redistribute it and/or
# modify it under the same terms as Perl itself.
#
# ・要platex, dvipdfm。
# ・platexのdocumentclassとして、奥村さんのjsarticleを使用する。
#
use strict;

my $footnote = '本翻訳はパブリックドメインに置かれている。https://www.hyuki.com/imit/';

my @files = (
    'imit1.doc',
#   'imit2.doc',
#   'imit3.doc',
#   'imit4.doc',
);

foreach my $filename (@files) {
    $filename =~ s/\.doc$//;
    &make_pdf($filename);
}
exit;

sub make_pdf {
    my ($bodyname) = @_;
    my $inputfile = "$bodyname.doc";
    my $texname = "tex-$bodyname";
    open(INPUT, $inputfile) or die "$!:$inputfile";
    my $title = '';
    my $subtitle = '';
    my $author = '';
    my $body = '';
    my $skipping = 0;
    my $verbatim = 0;
    while (<INPUT>) {
        if ($skipping) {
            if (/^-y/) {
                $skipping = 0;
            }
        } else {
            if (/^-title=(.*)/) {
                $title = $1;
            } elsif (/^-subtitle=(.*)/) {
                $subtitle = $1;
            } elsif (/^-author=(.*)/) {
                $author = $1;
            } elsif (/^-x/) {
                $body .= qq(\\par\n);
                $skipping = 1;
            } elsif (/^-z/) {
                $body .= qq(\\par\n);
                $skipping = 1;
            } elsif (/^\*(.*)/) {
                $body .= qq(\\section*{$1}\n);
            } elsif (/^-content/ or /^-mokuji/ or /^;/ or /^-include/ or /^-this/ or /^-header/) {
            } else {
                $body .= qq($_);
            }
        }
    }
    close(INPUT);

    open(OUTPUT, "> $texname.tex");
    print OUTPUT <<"EOD";
\\documentclass{jsarticle}
\\title{$subtitle \\\\ $title}
\\author{$author \\footnote{$footnote}}
\\date{ }
\\begin{document}
% \\thispagestyle{empty}
\\maketitle
% \\tableofcontents
\\newpage
% \\sloppy
$body
% \\newpage
\\end{document}
EOD
    close(OUTPUT);

    system("platex -interaction=batchmode $texname.tex");
    system("platex -interaction=batchmode $texname.tex");
    system("dvipdfm $texname.dvi");
    system("start $texname.pdf");
}

たとえば、以下のようになる。

2003年1月26日 (日) - 重いサイトのサイト思い / 次男発熱

www.hyuki.comのサイトの閲覧が重いのではないか、 という報告を多数いただきました。 最近、リムネットがサーバのバージョンアップをしているので、 その影響ではないか、と私は想像しています。 もしかしたら、世界で流行している(していた)ワームの影響かもしれませんけれど。

次男が発熱。たぶん、ミニー・メイと同じか。 マシュウに馬車を出してもらうわけにはいかず、夜中にどたばた。 次男はこういうパターンが非常に多い。長男との個人差なのだろう。

ぼうっとしていると、 興味深い物語の筋が浮かんだので、 手元にあった羊皮紙に走り書き。 4つに折りたたんで水晶の小箱に放り込む。

眠くて眠くて、文章がおかしい。

2003年1月24日 (金) - 聖書通読表 / Creative CommonsのWeblog

家内が面白い聖書通読表を見つけたのでご紹介。

[TRANS] 「クリエイティブ・コモンズのWeblog抜粋」を公開しました。 Weblogを全部翻訳するというわけではなく、 興味があるものをぼちぼちやろうかと思っています。

そもそもの発端はCreative CommonsのWeblogに、 「WeblogにCreative Commonsのライセンスを適用したらどう?」的な記事が書かれたこと。 私はそれを見て「ん?でもCreative CommonsのWeblog自体に、 ライセンスが適用されてないではないか。ライセンスが明記されていないからぱっと翻訳できないんだよね」 と疑問に思いました (つまり、WeblogのページにAttributionなどのリンクが張られていないということ)。 その旨をCreative Commonsにメールしたら7分後に 「おお確かにその通り。Attributionと考えてください。翻訳もありがとう!」という返事がきました。 そういうわけで、とりあえず一日分翻訳して公開。

再帰的な行動といえる。

2003年1月24日 (金) - 仕事

[CR](ce) 今日は2つのセクションをばりばり書いた。 なかなかよろしい、と『またもりへ』のぞうさんのまね。 あと2つのセクションをばりばり書いて、 全体を読み直せばレビューアさんに送れるだろう、と思う。

何だか、すごく面白い暗号の本ができつつあるように思います。 とても、とても(以下略)。 という話を家内にすると、 家内は「あなたはいつもそう言うわねえ」とにこにこする。

[CR/Review] レビューアとのやりとりは2241通。

2003年1月23日 (木) - 仕事

ふゆはつとめて ゆきのふりたるは いふべきにもあらず

[CR/Review] レビューアとのやりとりは2230通。 先日送った章に、もうすでに反応が返ってきている。 感謝します。

[CR](ce) 新しい章の執筆開始。 とりあえず文章をさくさくと書いて、 図をさくさくと描く。 うん。とても、とてもよい。 何とかこの章もさっさと——でもていねいに——まとめたい。

現在の状況をまとめて編集長さんに報告する。

昨晩の夜中、 private finalとImmutable話題で[DP/ML]にメールを出したような記録があるが、 よく覚えていない。 半分寝ながら(手が勝手に)メールを書いていたらしい。やれやれ。

それはさておき、 以前も書いたような記憶があるけれど、 メーリングリストを自分の勉強のきっかけ、トリガー、刺激剤とするのは とてもよいと思う。 メーリングリストへ新規投稿するのでもいいし、 そこに流れている話題に、自分なりの解答・意見を投稿するのもいい。 それをきっかけにちょっと一歩進んで調べたり、 他の人の意見を参考にできたりする。 もちろんROMでもいいのだけれど、 自分なりの活用方法を考えるとなかなか素敵。 本を読んでもつかみにくいことが、 誰かの一言で氷解することもある。

もちろん、 かえって混乱することもあるかもしれないけれど。 たとえば、初心者歓迎の技術系メーリングリストだと、 その危険性はあるかもしれない。 ある技術の初心者「だけ」が集まっているなら特に (と書いたのは、特にどこかのメーリングリストに対しての批判ではありません。 単に思ったことを書いているだけです。念のため)。

[MakeWeb] MakeWebの最新版を公開していないことに気がつき、 あわてて公開。 そして、最終更新が2001年だったことにちょっとショックを受ける。 月日の経つのは早いものですね。 やっぱり、その都度公開できるものを公開したほうがいいなあ。 完成してから、と考えるといつまで経っても何も公開できない。

2003年1月22日 (水) - 三位一体

ちゃいちゃんパパのページに仏教の「三身一体」という話題が書かれていました。 ちゃいちゃんパパによれば「三身一体」というのは、

とのことです。 ちゃいちゃんパパはこれに続いて

そう、三位一体とほぼ一緒と言おうか、これは、もう同じでしょう...。やはり、仏教もキリスト教も根本では、同じ説を信じます。

とまとめていらっしゃいます。 以下、リンク。

さて、私は、そうではない。 仏教とキリスト教はまったく違いますよ。 という話を以下に書きます。

キリスト教の「三位一体」というのは、 聖書の神さまはお一人だが、三つの位格からなっている、 という教義で、すごくおおざっぱにいえば、次のようになります。

さっきの「三身一体」と似ているようだけれど、その類似は表面的なものです。 大事なのは「それでは、そのようなお方」は、 そもそも「自分」とはどういう関係にあるのか、です。

聖書の神さまは私たちと無関係ではありません。 それどころか…。

私たちの存在の基盤であるこの宇宙、私たちの命は、父なる神さまが作られたものです。 それは聖書の「創世記」に詳しく書かれています。

しかし私たちは(自分を振り返っても、聖書の歴史を読んでみてもわかるように)神を忘れ、愛を忘れ、 自分勝手、自己中心に生きてしまいます(ですよね)。 そのような神を忘れた振る舞いは「死」という報いを受けることが聖書に書かれています。

けれど、神さまは自分がお創りになった人間(私たちのこと)をとても愛していたので、 子なるイエスさまをこの世に送られました(このお祝いがクリスマスですね)。 何のために? イエスさまが、私たちの「死」という報いの「身代わり」になるためです。 そしてイエスさまは私たちの身代わりとして十字架の上で死にました。 イエスさまご本人がなしとげたことは、私たちの「いのち」に関わることです。 聖書には、私たちがイエスさまを信じることで「義とされる(神さまの前で正しいものと見なされる)」と書かれているからです。 イエスさまはその後、死から復活なさり、天に昇られました。

聖霊さまは、天から来られました(これがペンテコステですね)。 そして教会を立て上げ、 現在の私たちが互いに愛しあい、信仰をもち、 神さまの意志に従う生活ができるようにしてくださいます。

つまり、聖書に書かれている神さまは、 最初から最後まで、私たちのことを愛し、愛し、愛し続けておられる方です。 神さまは、私たちをそもそも存在させてくださいました。 イエスさまは、自己中心で神をないがしろにする私たちを救うために自分の命を投げ出しました。 そして聖霊さまは、現在の私たちに必要なものを与えてくださいます。

キリスト教は「宗教」ではなく「関係」であるとよく言われるのはこのゆえです。 聖書の神さまの愛に気づき、神さまとの愛の関係を回復し・大事にすること。 そして神さまの助けにより、私たちの互いの愛の関係も回復されていく。

これらすべてが聖書に書かれていることです。 ぜひ、本の中の本、"The Book" と呼ばれる聖書をお読みください。

少し補足します。 私は、仏教の教えに詳しいわけではありませんが、 仏教の教えのすべてがキリスト教と相反しているとは思いません。 そもそも、多くの人に受け入れられている宗教には共通部分は多いものです。

でも、本質を見失ってはいけない。

もう少し補足します。 当然のことながら、私はちゃいちゃんパパを責めているわけではありません。 今日のこの文章はちゃいちゃんパパの文章によって生まれたものです。 感謝します。

2003年1月22日 (水) - 仕事 / 簡単日記書きシステム「YukiLog(結城ログ)」

[CR](si)をやっと送信。やれやれ。

[YukiLog] 話題のWeblogをやってみたくて(^_^) いろんなWeblogツールを試していましたが、 結局エディタで直接MakeWebのソースを書いてUpFtpでHTMLを更新するのが 一番しっくりくる(当たり前か。何年もそれでやってるんだもんね)。

でも、何か作りたくて、パタパタと手を動かして、 簡単日記書きシステム「YukiLog(結城ログ)」をPerlで作ってみました。 一般の日記書きシステムに比べたらシンプル&低機能なので、 あまり期待しないでください。 でも、自分でPerlスクリプトをいじりたがる人にはちょっぴり参考になるかも。 例によってPerlと同じ条件でソースを公開しますので、 自分にしっくりくるシステムを作ってくだされ。

それにしてもPerlは楽しい。 思いついたツールがさくさく作成できるものね。 というわけで著書の宣伝。

2003年1月21日 (火) - 仕事

[CR] 今日も今日とて暗号本。 (si)の章は、何とか今日中にまとまりそう。 とても、とてもうれしい。 応援してくださるみなさんに感謝し、神さまの御名をほめたたえます。 『暗号とセキュリティ入門』という仮題で執筆してきたけれど、 割合としては暗号技術が大きいから、 『暗号技術入門』『暗号入門』あたりが妥当なタイトルかもしれない。 このあたりはまた編集長さんと相談しよう。 ともあれ、祈りつつ進めていこう。

前原先生とさらにGnuPGの暗号・署名の通信実験。 Becky!からのプラグインで暗号化がうまくいかなかったけれど、 プラグイン作者の荒川さんからのヒントで、うまくいくようになりました。 [gnupgnewsjapan]MLで問題解決。感謝します。

2003年1月20日 (月) - 仕事

[CR] 今日も今日とて暗号本。(si)の章はまだ続いている。 なかなか書きあがらないものだにゃー。

[CR/Review] レビューアとのやりとりは2182通。感謝。

いまは受験の季節だったり、 論文〆切の季節だったりするのですよね。 そういう方々の健康が守られますように。

冬が受験の季節になっているのはかわいそうだと思う、 と言ってたのは私の家内だっけ。

『Perl言語プログラミングレッスン 入門編』が増刷になるとのこと。 読者のみなさんに感謝し、出版社や書店のみなさんに感謝し、 神さまに栄光をお返しいたします。

私の書く本って、 総じて「手っ取り早く何かする」よりも 「本当に理解するための一歩を築く」という方向を向いているように思う(向きたいと願っている)。 そして、そういう態度は、私は自分の父から学んだように思う。 父は教師だが、その教えるポイントはどこにあるかを思ってみると、 「本当に大事なところを強調して教える」 「適切な例を使って教える」 といったところだろうか。

2003年1月19日 (日) - 『Java言語プログラミングレッスン』

『Java言語プログラミングレッスン』の読者から、 とてもうれしいフィードバックをいただきましたのでご紹介します。

半年以上前にSUNのofficialの講習を受けてから、 Javaの本を山というほど買い、サンプルのプログラムを何回も書いてきたのですが、 いまいち、ごみのような知識がたまるばかりで「Javaを理解できた」という実感がわきませんでした。 ところが、この本にははっきりいって脱帽しました。 最初の1冊をこの本にしていれば、半年以上も苦しむことはなかったのに…… ページを繰るたびに 「そうかそういうことだったのか」とうなずいたり 『先生と生徒の会話』ににやにやしたり、 説明のうまさにため息をついたり、 あたまの中がすっきりと整理されていくのがわかります。まさしくこの本は 「Java学習のガーベージコレクター」というかんじです。 (中略) 長らく停滞していたJAVA学習に弾みがつきました。 またJAVAの学習にとどまらず、仕事で書くドキュメント等の参考になりそうです。 本当にありがとうございました。 デザインパターンとPerlも結城先生の本を買いました。 これからも良い本をたくさん出して下さい。

2003年1月17日 (土) - リコーダーの楽しみ

午後からリコーダーを少し吹く。 最近は、YAMAHAのABS樹脂製スケルトンタイプのリコーダーをよく吹いている。 プラスチックなので取り扱いが楽だ。 せっかくなので、Windowsのサウンドレコーダーを使って録音してみる。 ついでに「午後のこ〜だ」でWAV→MP3変換をして公開。 テンポはめろめろでトリルもふにゃふにゃですけれど、お暇な方は聞いてやってくださいな。

学生時代に好んで演奏した曲で、作曲者も曲名も覚えていません。 でも、手は曲を覚えている。

2003年1月17日 (金) - GnuPGによる通信実験 / RMAC / 仕事

いつもいろいろお世話になっている前原先生と GnuPGによる通信実験。 公開鍵による暗号化・復号化、署名・署名の検証などを行なう。

Crypto-Gram(January 15, 2003)で、 The RMAC Authentication Mode の話が面白かった。 Schneierは、 RMAC should not become a NIST standard. と言い切ってますねえ。 以下のURLはCRYPTO-GRAMからの抜粋。

他力本願の質問ですが。 Internet Explorerで「オフライン作業」に移行する方法ってどうやるのでしょう。 [ファイル]→[オフライン作業]のはずなのですが、 このメニューの項目が出るときと出ないときがあって困っているのです。 ご存知の方がいらしたら、 ご一報くだされ。 以前の「ソース表示ができなくなったらキャッシュをクリアせよ」というTipsはとても役立っています。感謝。 (解決→さっそく安原さんから 情報をいただきました。ありがとうございます)

[CR](si) 今日も今日とて淡々と仕事。 昨日の続きの部分はうまくつながってくれた。 図も新たに描いた。 以前書いた部分はどんどんゴミになって捨てていく。 よく理解している部分はスムーズに書けるけれど、 よく理解していない部分はぎこちない、という当たり前の事実。 世の中の技術書って難しい(読みにくい)本が多いと思うのだけれど、 本を書いてみるとその理由がよくわかる。 読みやすい本を書くのにはむちゃくちゃ時間がかかるのだ。 信じられないくらいに時間がかかる。 時間をかけてていねいに書いて、読みやすく読みやすくした本ほど、 読者は時間をかけずに読むことができる。 つまりは、相互理解にかかる時間的コストを書き手側が負担するか 読み手側に負担させるか、ということですね。 負担している人数を掛け算することを考慮すれば、 当然ながら書き手側が負担すべきだと私は思います。 もちろん、ものには程度というものがあり、 判断にはいつもトレードオフが伴う。 時間をかけすぎて完成できない(読者に伝わる量がゼロ)になるくらいなら、 見切って完成させるのも大事ですね。 …ということで逃避終わり。仕事に戻ります。

2003年1月17日 (金) - ユニセフ

「結城さんちの本屋さん」はアマゾンアフィリエイトに参加しています。 みなさんが「結城さんちの本屋さん」でお買い物してくださった金額の 3〜5%が、ギフト券として結城あてに送られてきます。

先日、2002年10月〜12月の分が送られてきたので、 それと同額をユニセフにインターネット募金しました。 みなさんのご協力を感謝します。

ユニセフ(UNICEF:国連児童基金)は、 子供たちを守るために活動している世界的な団体です。

2003年1月16日 (木) - 仕事 / SealedObject / NullCipher

[CR] いつものように暗号本を書いている。現在は(si)の章。 ずいぶん書いたのだけれど構成がよくなかったので、 ばっさり見捨てて新たに初めから書き直し。 いまのところは順調に進んでいる模様。 一冊の本を書くっていうのは、長い道のりですねえ。

レビューアさんのメールを読みながら、 ときどき書いた章を読み直してみる。 「あら」はあるものの、すっごく面白い! ドキュメンタリーでもなく、プログラミングの本でもなく、 数学の本でもなく、新情報を扱う本でもない。 でも読んでいてどきどきする、 どんどん先が読みたくなるって不思議な感覚です。 こんな面白い仕事を与えてくださる神さまに感謝します。

javax.crypto.SealedObjectとjavax.crypto.NullCipherの練習。 まあ、普通はSealedObjectをファイルにserializeしたり、 ネットワーク経由で送るのだろうけれど。

import java.io.*;
import java.security.*;
import javax.crypto.*;

public class SealedObjectSample {
    public static void main(String[] args) throws Exception {
        Cipher encryptCipher = new NullCipher();
        Cipher decryptCipher = new NullCipher();
        
        Message message = new Message("Hello", 123);
        System.out.println("message = " + message.toString());
        
        SealedObject sealedMessage = new SealedObject(message, encryptCipher);
        
        Message decryptedMessage = (Message)sealedMessage.getObject(decryptCipher);
        System.out.println("decryptedMessage = " + decryptedMessage.toString());
    }
    public static class Message implements Serializable {
        public String _string;
        public int _value;
        public Message(String string, int value) {
            _string = string;
            _value = value;
        }
        public String toString() {
            return "[ string = " + _string + ", value = " + _value + " ]";
        }
    }
}

NullCipherってNull Objectパターンなんだね、と気がついたので、 デザインパターン・メーリングリストに投稿。

よく考えてみると、昨年の12月にもNullCipherの話を投稿していたのに気がついた。 やれやれ…(^_^;

2003年1月15日 (水) - BioPerl

バイオ関連の研究集会で、 タカラバイオ株式会社の大浦さんが、 拙著『Perl言語プログラミングレッスン 入門編』を紹介してくださいました。 感謝しつつ、リンク。

2003年1月15日 (水) - 翻訳を利用したいという方からのメール

質問

突然のメールを失礼いたします。 結城さんの翻訳なさったオー・ヘンリーの作品を利用させていただき、 或る作品(商業ベース)を制作したいのですが、 料金などはどうなっていますでしょうか。

回答

メールありがとうございます。

私の翻訳したオー・ヘンリーのテキストを利用する場合には、 以下の文面をどこかに表示してください。 これだけで、自由に(freely)制作してくださってかまいません。 料金は不要です(free)。 Copyrightの年号は、ご利用になる作品の、 末尾にある年代を参照してください。

Copyright (C) 1999 Hiroshi Yuki (結城浩)
https://www.hyuki.com/trans/
本翻訳は、この版権表示を残す限り、訳者および著者にたいして
許可をとったり使用料を支払ったりすること一切なしに、
商業利用を含むあらゆる形で自由に利用・複製が認められます。 
プロジェクト杉田玄白正式参加作品。 
http://www.genpaku.org/

もしも、私の翻訳したテキストを改変して用いる場合には、 その旨を明記した文章を付加してください。

すでにいろんな方が いろんな形で私の翻訳テキストを利用してくださっています。 どうぞご利用ください。

2003年1月15日 (水) - 仕事

[PI] プログラムと図と原稿を書いて編集部へ送付。 いつもお世話になっております。

今回(次回)はNull Objectパターンの紹介。 Null Objectパターンの紹介を兼ね、 JavaとC#でRSS(XML)を処理する簡単なプログラムを書く。

2003年1月14日 (火) - サーバメンテナンス

サーバメンテナンスのため、 2003年1月28日(火)18:00-22:00の間、サーバが停止します。 hyuki.comへのアクセスができなくなり、 結城あてのメールが届かなくなると思います。

2003年1月14日 (火) - 仕事

[PI]まじめに仕事。せっせとプログラミング。

2003年1月14日 (火) - インターネット礼拝

大和キリスト教会カルバリーチャペル(大川従道牧師)という教会では、 インターネット礼拝というものを行っている。 要するに、インターネットで礼拝を視聴できるというコーナーだ。 なかなか礼拝に出席できない方や、 教会の礼拝というものをちょっと見てみたいという人にはとてもよいと思うのでご紹介。

2003年1月14日 (火) - マーロウ

先日、南葉山の「マーロウ」というレストランに家内と次男との3人で行きました。 ここは非常に特徴のあるプリンで有名なところです。 前回来たときには非常に混雑していたのでテイクアウトのプリンを買いましたが、 今回は10分ほど待って中に入ることができました。 で、プリンセットを頼みました。 私は北海道のフレッシュクリームのプリン+コーヒーで、 家内はクリームチーズのプリン+コーヒー、 次男はバナナのプリンです。 ここのプリン、一口食べるだけで、 「これがプリンなのか」とショックを受けるような味です。 甘いというか、濃厚というか、何と言うか…。 ダイエットをしている人は行ってはいけない場所かもしれません。

2003年1月13日 (月) - 年間聖句

今年の私の年間聖句は、初めに、神が天と地を創造した。(創世記1:1)です。

この聖句から、私は「初めの愛から離れるな」というメッセージを受け取りますし、 「神さまが作られたものをよく見よ」というメッセージも受け取ります。 また「神さまは創造主なのだ」ということも改めて思いますし、 「自分の存在に先立って、神様はこの宇宙を備えてくださったのだ」ということも思います。 「神さまは被造物とは別の次元の方である」ということにも思いをよせ、 また「自分がこの世に生を受けている理由」にも心を向けたくなります。

あなたは、どんな風に思われますか。

2003年1月13日 (月) - 仕事

[CR/Review] レビューアとのやりとりは2101通。

レビューアさん(複数人)からの指摘で、最近面白かったもの。

「結城さん、鳩は一匹・二匹ではなく、一羽・二羽と数えるのではないでしょうか」

その通りでございます…(^_^;

そのほかにも「ASCIIなのに9ビットです」 とか「20バイトといいながら例は24バイトになっています」など、 私の間抜けなミスはたくさんあります。

2003年1月12日 (日) - 独断と偏見で選ぶベストサイエンスブック2002

www.moriyama.comの森山さんが、恒例の 「独断と偏見で選ぶベストサイエンスブック2002」を開催しています。 1月末が投票〆切なので、サイエンス書好きな人は急ごう!

2003年1月11日 (土) - 「キリストにならいて」

[IMIT] ずいぶん前に翻訳しかかっていた「キリストにならいて」の現状を公開します。 時間があるときにぼつぼつ翻訳をしています。 翻訳はパブリックドメインに置きます。

翻訳の協力者を募集しています。 興味がある人は結城浩 hyuki@hyuki.com あてに、 [IMIT]という表題ではじまるメールをお送りください。

2003年1月10日 (金) - 仕事 / 虹の発見

家内が用事があるというので、 午前中は、次男をデパートに連れていって子守りをする。 マックを食べて、デパートの屋上でトーマスに乗せる。

午後は黙々と仕事。

ある方が、私の本を「良質のミステリを読んだような」と評してくださったことがある。 技術書でミステリというのはまずい気もしないでもないですが(^_^; 問題解決のカタルシスにつながる何かがあったのだろうと素直にうれしくなりました。 感謝です。

[CR]を書きはじめて、しばらくしてから、あるテーマに気がついた。 そのテーマは専門家には当然のことなのだろうけれど、 私は暗号について詳しく考えはじめるまでは気がつかなかったことだ。 これに気づいたとき、私はちょっと感動したのを覚えている。 バラバラのように見える技術が、こんな風につながるとは。 いま書いている(si)の章から、 そのテーマが少しずつ顔を出してくる。 だから、書いていてとっても楽しい。心が躍る。

どんなささやかな仕事であっても、 ある期間それにどっぷり使って頭を絞っていると、 何かしら「はっとする発見」があるものだ、と私は思っている。

何かをつかむ瞬間。カタンと音を立てて扉が開く瞬間。 ふと見上げた空に虹がかかっていたのに気がついたときのような、そんな瞬間のことだ。 そんなとき、その発見のことを「愛する人たちにうまく伝えたい」と感じるのは、 とても自然なことではないだろうか。 たとえ、その虹を作ったのが自分ではないとしても。

ほら、虹だよ!

2003年1月9日 (木) - 仕事

[CR](ma)レビューアさんに送付。感謝。次の章は(si)である。

2003年1月8日 (水) - Stallmanからメール

Richard Stallmanからメールをもらいました。 きゃー!♪

といっても、何のことはない。 私がstallman.orgのWebページの日付が間違っていた(s/2002/2003/)のを指摘したメールを出したら、 それに対して感謝の返事をしてくれただけですが(^_^;

それでもメールはメール。 さっそくミーハーの記録に追加しようっと(←ミーハー)。

[CR](ma) 図を描いて、説明の文を書く。ていねいに、ていねいに。 どんどんと図を描いて、どんどんと文章を書く。

[CR/Review] レビューアとのやりとりは1970通。 感謝しつつ。

奥さんにストールマンからメールをもらった話をする。

 私「ねえねえ、あなたは知らないかもしれないけれど、リチャード・ストールマンから
   メールをもらったんだよ」
家内「誰それ」
 私「ええと…まあいいんだけど」
家内「ごめんなさいね。不勉強で」
 私「いやいや。私がストールマンのWebページの日付が2002になっていたのを指摘したら、
   お礼のメールをくれたんだよ」
家内「重箱の隅をつつくようなメールってやつ?」
 私「ええと…まあそうだね」
家内「メールもらえてよかったわね♪」
 私「(^_^)」

確かに、ミーハーの記録を読むと「ちょっとしたミスを指摘」「ちょっとしたtypoを指摘」「ちょっとしたバグを見つけ」ばっかりではないですか。 やれやれ(^_^;

そうだそうだ。昨日のクイズの答え。

HTMLファイルの数は、935個でした。 したがって一番近いのは「1000個くらい」ですね。 みなさんの予想はいかがでしたか。

なるほど、と思ったのは結城のページの「検索機能」を使って「Googleに探させた」人がいたこと。 でもそれだとWikiのページもたくさん引っかかるので多めにでちゃうんですよね。

ではでは。See you!

2003年1月7日 (火) - クイズ

それではここでクイズを1つ。 このサイト www.hyuki.com の中には、 公開しているHTMLページはいくつあるでしょうか。

CGIは含めません。サーバ上に置かれていて誰でも閲覧できる、拡張子が.htmlのファイルの数です。 以下の中から最も近いものを1つ選んでください。

解答は明日にでも。

2003年1月7日 (火) - 仕事 / コモンズ

[CR](ma) 新しい章を書き始め。ていねいにスタート。じっくり考える。 素朴な質問(自問)に耳を傾けつつ書く。

shinoさんの日記に反応。

もちろん、本歌取りの楽しみは重要です。 でも、もう少し「創造の本質」に関わってくる話だと思います。 完全なゼロから何かを創造できる人間はいなくて、 必ず過去からの「入力」があってこそ「出力」が生まれるわけです。 で、著作権を必要以上に行使しすぎると、 多くの人々が「入力」することができなくなってしまう。 そのため「出力」も先細りになってしまう。 豊かな作品が生まれることを守るはずのルールが、 豊かな作品を殺す働きをしてしまう、という逆説的な現象が起こるわけです。

だからそこには「適切なバランス」が必要である、というのがレッシグ教授の著作『 コモンズ』の主張です。 誰でも適切な条件下で使うことができる「共有地」のような場所——コモンズ——に作品がプールされており、 さらにそこに適切な量で流れ込んでくるようにしなければ、 次の世代の新しい作品は生まれてこないのです。 パブリックドメインというのはそのような共有地の1つだし、 フリーソフトやオープンソース、青空文庫やプロジェクト杉田玄白なんかもそのような共有地の1つである、と。 みんなが使えるようにしておけば、ある人が作ったものを土台にして別の新しい作品が生み出される。

ささやかな例で言えば、私が翻訳した「 賢者の贈り物」。 ネット上には、いろんな人が関わった別バージョン(別の作品)が出回っています。 昨年のクリスマスごろに 紹介しましたね。 あのような「新しい作品」が生まれたのは、 私が、元テキストをフリーで公開しているからですね。 それを「入力」として、新しい「出力」——新しい作品——が生み出されるわけです。

それにそもそも、私が「賢者の贈り物」を翻訳公開できたのは、 オー・ヘンリーの原文がパブリックドメインというコモンズに置かれていたからなのですね。 入力→出力→入力→…という作品の連鎖があるのです。

2003年1月6日 (月) - 仕事

[CR/Review] レビューアとのやりとりは1920通。 いつもありがとうございます。

[CR](m)この章、やっと完成。 今晩にでもレビューアさんたちへ送る予定。

[REF]校正。

[CR](m)レビューアさんに送付。さっそく返事もいくつかいただく。感謝。

2003年1月6日 (月) - クリエイティブ・コモンズが描くいくつかの例

『クリエイティブ・コモンズが描くいくつかの例』を翻訳しました。

公開してすぐに、翻訳で疑問だった点をメールで教えてくださる方がいらした。 ありがとうございます。

「百字書評」や「作者紹介」がAttributionライセンスに相当することに気がつく。

2003年1月5日 (日) - IEとHTMLソース / 更新情報とアンテナ / 祈り

他力本願質問コーナー→解決 結城が使っているMicrosoft Internet Explorerでは、 ときどき、[表示]→[ソース]を実行しても何も表示されない(本当はいま見ているページのHTMLが見たいのに) ということがあります。 IEを使っているみなさんは同じような経験はありませんか? もし回避策or対策をご存知なら教えてくださいませ。 (補足:何も表示されないというのは、より正確にはHTMLソースを表示するためのプログラムがlaunchされないという意味です)。

解決編。 非常にたくさんの方から[ツール]→[インターネットオプション]→[全般]→[インターネット一時ファイル]→[ファイルの削除] を行うと大丈夫ではないかというメールをいただきました。感謝します。 さっそく試したところ、一発でうまくいく(HTMLソースを表示するプログラム(秀丸に設定している)がlaunchされる)ようになりました。 とってもうれしいです。感謝!

更新情報更新コーナー。 更新情報の右側にはてなアンテナを埋め込んでみました。

[PRAY] さまざまな方のための祈り。

2003年1月4日 (土) - 日記作成支援CGI Akiary

ちょっと時間ができたので、 「日記を認める(したためる)システムたち」を読みながら、 いくつか公開されているCGIを試してみた。 高機能のものは多いけれど、 設置のしやすさと便利な機能のバランスという点では、 Akiaryというシステムがとてもよいと感じたのでご紹介。 付属ドキュメントも読みやすい。

2003年1月4日 (土) - 祈り

[PRAY] さまざまな方のための祈り。

2003年1月4日 (土) - Creative Commons関連

Creative Commonsに関する情報を積極的に日本語化しているサイトがありました。 以下にリンクします。

それから、Creative Commonsのライセンスを適用するサンプルとして、 「結城さんちの本屋さん」の書籍紹介文を「Attribution」ライセンスにしてみました。 こんな感じで、Creative Commonsのアイコンを利用する、と。 HTMLの中にはRDFが埋め込まれています。

ついでに、public domainというリンクも利用してみることにします。 私が公開しているpublic domainの作品というと… そうそう、マルチン・ルターの小信仰問答書でしたね。 ページの下のほうにpublic domainのリンクをつけてみました。

2003年1月4日 (土) - GnuPGのBecky!プラグイン

[GnuPG] そういえば、GnuPGのBecky!プラグインがどこかにあったなと思ってGoogleすると すぐに見つかる。すばらしい。 インストールして試してからそのページを見ていると、あれれ! これは昨日、GnuPGのREADME翻訳の疑問点を解決してくださった荒川靖弘さんのページではないか…。 というわけで感謝しつつリンク。

2003年1月3日 (金) - クリエイティブ・コモンズ(Creative Commons)のライセンス解説

『コモンズ』のレッシグ教授らが関わっているCreative Commonsのライセンスは非常に興味深い。 フリー・ソフトウェア、オープンソース、フリーテキストなどの活動に影響を及ぼしそうな感じがする。 ので、Creative CommonsのWebサイトで公開されているライセンス解説のWebページをさくっと翻訳して公開。 レッシグ先生にも許可が得られましたのでご紹介。

Creative Commonsの4つのオプションというのは、 帰属(Attribution)、非商用(Noncommercial)、派生作品の禁止(No Derivative Works)、同様に共有(Share Alike)である。 あなたは、自分の作品にこの4つのうち何を適用しますか、というのがCreative Commonsのライセンスの特徴である。

帰属(Attribution) というのは「byだれそれ」をちゃんと表示してね、という条件。

非商用(Noncommercial) というのはそのまんま「非商用に限って使っていいよ」という条件。

派生作品の禁止(No Derivative Works) はもとの作品を変えたり、リミックスしたりしちゃだめ、という条件。

同様に共有(Share Alike) というのは、派生作品を配布するときには元の作品と同じライセンスで配布せよ、という条件。

4つのオプションの組み合わせのうち、No Derivative WorksとShare Alikeは共存できないので、 全部で11通りの組み合わせがありえる。

2003年1月3日 (金) - 祈り

疲れが出たのか、熱が出て寝込んでいる。

[PRAY] さまざまな方のための祈り。

2003年1月1日 (水) - 新年

あけましておめでとうございます。

原稿を書いていると、 長男が起きてきて「おとうさん、あけましておめでとうございます」と言うので、 何だかとってもうれしくなる。 「はい、あけましておめでとうございます。ことしもよろしく」と答える。

ぜひ、感想をお送りください

あなたのご意見・感想をお送りください。 あなたの一言が大きなはげみとなりますので、どんなことでもどうぞ。

あなたの名前: メール:
学年・職業など: 年齢: 男性女性
(上の情報は、いずれも未記入でかまいません)


何かの理由でうまく送れない場合にはメール hyuki@hyuki.com でお願いします。

豊かな人生のための四つの法則