目次

2005年11月30日(水) 原稿出し
2005年11月29日(火) セキュリティシステム、テクノロジー、プラクティスを分析・評価する5つのステップ / 仕事 / 『暗号技術入門 ―― 秘密の国のアリス』増刷
2005年11月26日(土) 高橋メソッドのプレゼンテーションをflashのローカルファイルとして作るには?
2005年11月25日(金) 日記ダイジェスト更新
2005年11月23日(水) よかった探しリース / 打ち合わせ
2005年11月22日(火) 「テトラちゃんと相加相乗平均」のLaTeXファイル公開 / 気持ちのよい朝
2005年11月21日(月) 年末進行 / お仕事メールとWebサイト
2005年11月20日(日) 日曜日 / 数学ガール
2005年11月19日(土) おせんべいの対話
2005年11月18日(金) Tropy: 2005年11月のアクセス数推移 / はてなブックマーク数と閲覧数に関する素朴な疑問
2005年11月16日(水) テトラちゃんと相加相乗平均
2005年11月14日(月) 名前を...で省略する
2005年11月13日(日) いつもの日曜日
2005年11月12日(土) 小さなHTTPサーバ(その2)
2005年11月11日(金) Railsアプリに挑戦 / 小さなHTTPサーバ / RSA-640 is factored! / 数当てクイズ (解答編)
2005年11月10日(木) 淡々と仕事
2005年11月9日(水) 数当てクイズ (問題編)
2005年11月8日(火) 仕事
2005年11月7日(月) Tropy設計判断
2005年11月6日(日) 駆け抜けたTropy / Tropyお休み中です
2005年11月5日(土) 随時更新、いろんなTropyたち / Web 0.5としてのTropy (追記あり)
2005年11月3日(木) Tropy(とろぴぃ)というCGIを作りました(追記あり)
2005年11月2日(水) なか見!検索
日記一覧

2005年11月30日(水)

2005年11月29日(火)

セキュリティシステム、テクノロジー、プラクティスを分析・評価する5つのステップ

2005年11月29日(火) 14:00

「大阪府など、ICタグ利用した学童の安全確保システム実証実験」という記事を読んで思ったこと。

こういうセキュリティシステムが出てくるときには、 ぜひ「執拗な悪意を持った人の気持ちになれる検証者」 が安全性の検証をしてほしいと思います。

素人的に気がつくポイントとしては:

  • 防犯カメラの画像を攻撃者が傍受する可能性はないか。
  • 防犯カメラの画像の記録(録画画像)を攻撃者が得る可能性はないか。
  • 「通信距離が長い」というのはメリットなのかデメリットなのか。
  • ICタグは複製できないか。
  • 生徒や職員がICタグを紛失した場合にはどうするのか。どうなるのか。
  • 生徒の登下校の記録を遠隔地に送信するとのことだが、それは攻撃者に傍受される可能性はないのか。
  • 情報管理センターでの管理体制はどうか。
  • 情報を教職員や保護者のパソコンにメールで通知するとのことだが、どんな情報がメールで送られるのか。
  • メールで送られる情報は暗号化されて送られるのか(たぶん違うと予想)。
  • 教職員や保護者のパソコンから情報が漏れた場合に想定される被害は何か (たとえばファイル共有ソフトやウイルスなどで、ネットに広まってしまった場合。想定外だと予想)。
  • DoS攻撃への対処はどうか。
  • 教職員が攻撃者に買収された場合に想定される被害は何か。

などです。

これはいま10分くらいで思いつくまま書いたものですから、 専門家が真剣に考えれば、おそらく数百から数千のチェック項目(もっとかも)が出てくると思います。

この類のシステムが出てきたときに、一般の父兄でも「突っ込み」が入れられるような、 汎用に使える「システムチェックリスト」のようなものは公開されていないのだろうか。 …とここまで書いてきて、シュナイアーの Beyond Fearに一般的な話題が出てきていたことを思い出しました。

これですね。

「セキュリティシステム、テクノロジー、プラクティスを分析・評価する5つのステップ」

"five-step process to analyze and evaluate security systems, technologies, and practices" (by Bruce Schneier, Beyond Fear, p.14)

  • Step 1: What assets are you trying to protect?
  • Step 2: What are the risks to these assets?
  • Step 3: How well does the security solution mitigate those risks?
  • Step 4: What other risks does the security solution cause?
  • Step 5: What costs and trade-offs does the security solution impose?

かなり意訳すると、こうなります。

  • ステップ1: あなたが守ろうとしている「大切なもの」は何か。
  • ステップ2: その「大切なもの」はどんな「危険」にさらされているか。
  • ステップ3: そのセキュリティシステムはその「危険」をどれだけうまく軽減してくれるか。
  • ステップ4: そのセキュリティシステムが「新たに生み出す危険」は何か。
  • ステップ5: そのセキュリティシステムに支払う「対価」と「トレードオフ」は何か。

結城は、 このステップ1〜5をステップ・バイ・ステップで考えることは大事だと思います。 セキュリティの専門家でなくても、 業者の宣伝文句に惑わされずにセキュリティシステムを分析・評価する「とっかかり」に なってくれるように思います。

多くのセキュリティシステムの宣伝文句は、 ステップ1〜3を雰囲気で語り、 ステップ4と5について語らないのではないでしょうか。 特に、そのセキュリティシステムが「新たに生み出す危険」 について語る宣伝文句を私は見たことがありません (もしもあったら教えてください)。

『暗号技術入門 ―― 秘密の国のアリス』増刷

2005年11月29日(火) 04:47

11月は小の月だから「月末」が早いんだよう…。ふみー。

それはさておき。

編集部から『暗号技術入門 ―― 秘密の国のアリス』の増刷のお知らせをいただきました。 ご愛読してくださっている読者のみなさん、ありがとうございます。

そういえば、こういうのもありましたね。 何だか懐かしいな。

2005年11月26日(土)

高橋メソッドのプレゼンテーションをflashのローカルファイルとして作るには?

2005年11月26日(土) 21:47

みなさんにお尋ねです。 いわゆる 高橋メソッドでプレゼン資料を作りたいとします。 flashのローカルファイル(*.swf)として作りたいとすると、 もっともよい方法は何でしょう。 できれば、フリーソフトだけで作れればよいのですが。

高橋メソッド反応リンク集からたどれるような、JavaScriptベースならローカルファイルとしてすぐに作れます。 ただ、flashのほうが見栄えがよいように思います (縦方向のセンタリングの問題なのかな? フォントなどを調整すればよくなるのでしょうか…)。

高橋メソッドBBSを利用すれば、 数学物語 ミルカさんシリーズの紹介ページ のようにflashで作ることもできますが、これはローカルファイルにはなりません。

flashを作るフリーソフトウェアとしては、 ParaFla!が有名/良さげなのですが、 どなたかParaFla!で「高橋メソッドテンプレ」とか作っている方はいませんでしょうか (むちゃくちゃ他力本願で恐縮です)。

何か良いアイディアなどがありましたら、 フィードバックから情報をいただければ感謝です。

追記1) さっそく「OpenOffice.orgのpresentationでswf出力が可能です」という情報をいただきました。感謝です。今度試してみます。

追記2) 「 Flashなら Winkはご存知でしょうか? 動画にできるのが有名ですが、ご希望のようなFlashもつくれたと思います 」

追記3) 「 Winkはどうでしょう。もともとチュートリアル作成用のソフトですが、flashに吐き出せます。 画面自体は自分の好きなように作って、そこからflashにできる……はずです。 少ししか使ったことがないのですが 」

追記4) 結城です。みなさん情報ありがとうございます。 OpenOffice.orgとWinkを試してみましたが、 今のところ「惜しい」という感じでした。 もう少しいろいろ試してみます。 作成の手間と美しさのバランスでは、現在のところ 高橋メソッドBBSが一番でした。でも、ローカルファイルにならない。うーん。 (なんだか頭がループしている……あっ、きっと年末進行逃避モードなのだのかもしれないわたし。あうあう)

追記5) laszlo.jpな十河 学さんから 「高橋メソッドonLaszlo」のお知らせをいただきました。感謝です! 以下引用。

こんにちわ。十河と申します。
いつも結城さんの書籍やブログ楽しみにさせていただいています。
本日のブログエントリを読んで「高橋メソッドonLaszlo」を作成してみました。

<takahashimethod>
    <page>高橋メソッドonLaszlo</page>
    <page>入力はXML</page>
    <page>出力はFlash</page>
</takahashimethod>

という形式で書かれたXMLファイルからフラッシュファイルswfを出力します。
swfをこちらにおいていますのでよろしければご覧ください。
http://laszlo.jp/wiki/index.php?plugin=attach&pcmd=open&file=takahashiMethodPresentator.lzx.swf&refer=TakahashiMethodOnLaszlo
まだまだ不十分な点もありますが、とりあえずver0.1.0として公開してみました(^^;
ご意見・ご感想をいただけると幸いです。

結城:うー、かっこいいなあ。 〆切前でなければいろいろやりたいところ…うう。 高橋メソッドBBSのように、フォントサイズを画面サイズに追従させる(画面が大きいときにはフォントも大きく)というのは できるんでしょうか(と言いたいことだけ書いて仕事に戻ります…)。

追記6) さばぞうさんから 「 テキストデータを読み込んで表示する 『高橋メソッドマシーン』ってのがあるようです 」 という情報をいただきました。 ふむふむ…。おお、ここにある「あじびつ」さんによる Flash/高橋メソッドマシーンは、まさに、求めていたものでは…! 感謝です! (あなたは仕事をしていたはずでは?>自分)

追記7) というわけで、 Flash/高橋メソッドマシーンを使って作ってみました(だから、あなたは仕事をしていたはずでは?>自分)

2005年11月25日(金)

2005年11月23日(水)

よかった探しリース

2005年11月23日(水) 12:00

左手よかった探しリース右手

結城浩の2005年「よかった探し」です。

打ち合わせ

2005年11月23日(水) 11:32

昨晩は新しいお仕事の打ち合わせに出かけました。 具体的なアクションはおそらく来年ということになるでしょう。 また新しい世界が開かれることを期待しつつ、 祈りつつ、仕事をしていきたいと思っています。

2005年11月22日(火)

気持ちのよい朝

2005年11月22日(火) 10:36

今日は少し暖かい。朝日の中、木々に包まれた歩道を歩く。 住宅地の中なので、車も通らない、静かないい道だ。

私はiPod shuffleでバッハの「フーガの技法」を聴きながら、満ち足りた気持ちで歩く。 どうやったらこんなに素晴らしい作品を生み出すことができるんだろう。 数学的なバッハの曲。規則的なようだが、規則的ではない。 機械的なようだが、機械的ではない。非常に複雑に入り組んでいるように感じるのだが、 シンプルで美しいテーマが繰り返し聞き取れる。

…そんな音楽を楽しみながら、私はゆっくりと道を歩いていく。 落ち葉を踏む、さくさくという感触もどこか楽しい。 私は、レオンハルトのハープシコードにあわせて軽くハミングしていたかもしれない。

そのとき、コートを着た一人の会社員が、私を早足で追い越していく。

タバコの煙がやってくる。

タバコの煙は、ふわっと顔にかかり、私は咳き込んで立ち止まる。 タバコを手にした会社員は特に気にせず、早足のまま過ぎていった。

私は、咳が収まってからも、道の傍らに立ったまま、しばらく考えた。

あの会社員は、自分のタバコの煙が私にかかったことなど全く知らない。 気持ちのいい朝が、タバコの臭いで一度にだいなしになったことも知らない。 ここは外だし、特に禁煙にする必要もないくらいにオープンな空間だし、 私だって、自分に煙がかかりさえしなければ、特に文句もつけない。 でも。けれども。うーん。 こういう気持ちはどこに持っていけばいいんだろう。

……日記に書いてみよう。

で、いまこの日記を書いていて思ったのだけれど、 あの会社員は、私に不快な気持ちを与えたことなど知らないだろう。 だったら、もしかしたら(いや、もしかしなくても)、 私自身も、私が気づかないところで同じように不快な気持ちを誰かに与えているのかもしれない。

だからどう、と何か主張があるわけではないけれど。

2005年11月21日(月)

年末進行 / お仕事メールとWebサイト

2005年11月21日(月) 14:34

あーうー。 この時期「年末進行」という単語にはどきどきしますね。 とりあえず淡々とがんばるのであった。

ところで、ある方から、お仕事のご依頼メールをいただきました。 そのメールには「結城がどういう仕事をして来たか・ 現在どういう活動をやっているか・また何に興味があるか」 などが、きちんとサマライズされておりました。 でも、単に要約したわけではなく、文章中に自然に内容が織り込まれています。 失礼ながら「す、すごい…」と感嘆しつつ読みました。 また良いお仕事ができるといいなあ。

その方は、結城のWebサイトをごらんになったわけですが、 Webサイトというものが重要な営業ツールになっていることを今更ながら感じました。

2005年11月20日(日)

日曜日 / 数学ガール

2005年11月20日(日) 20:42

午前中は礼拝。お昼は久々に美味しいイタリアンで外食。帰ってきてからお昼寝。いつもの日曜日。

ある読者さんからフィードバック。 メールアドレスがわからないので、こちらでお返事。

「テトラちゃんと相加相乗平均」、興味深く読ませていただきました。

ちょっとだけ気にかかったのは、 8ページの「2数を乗じて平方する」という箇所で、 これだと、(xy)^2になりませんか?

おお、確かにそうですね。 「平方する」ではなく「平方根をとる」ですね。 「僕」に伝えておきます…というか、修正しておきます。 ご指摘ありがとうございます。

2005年11月19日(土)

おせんべいの対話

2005年11月19日(土) 22:23

ちょっと風が冷たいけれど、良い天気なので次男とお散歩。

私「そろそろおうちに帰っておやつ食べよう」

次男「おやつ、何?」

私「うーん…おせんべ」

次男「おせんべ、ないよ」

私「なんで? あるよ」

次男「ないよ」

私「あるよ」

次男「ないよ」

私「あるよ」

次男「もう食べちゃったもん。ないよ」

私「それ、ごませんべいでしょ。ごませんべいじゃなくってえ」

次男「なくって?」

私「ごませんべいじゃなくってえ、ごませんべいじゃなくってえ、ごませんべいじゃなくってえ、ごませんべいじゃなくってえ、ごませんべいじゃなくってえ」

次男「きゃはは。なーにぃ?」

私「ごませんべいじゃなくって、塩せんべい。それから、柿の種。それに、えびせんべい」

次男「えびせん、って言うんだよ」

私「えびせんべい」

次男「なにぃ? えびせんろ? 線路で電車が通ったら、えび折れちゃう」

私「じゃあ、えびせんせい。えびの先生」

次男「きゃはは」

私「えびの先生、えび先生。Rubyの線路、Ruby on Rails」

次男「?」

家についてから、二人で塩せんべいと柿の種とえびせんを食べました。

2005年11月18日(金)

Tropy: 2005年11月のアクセス数推移

2005年11月18日(金) 11:15

参考までに、2005年11月のアクセス数推移を。 11月3日の後の急上昇の部分が、Tropyによるものですね(Tropyの公開は11月5日の真夜中まで)。

[グラフ]

といっても、ページ数は増えていますが、ユーザ数や転送量は増えていませんね。 まあ、Tropyの使われ方を考えると当然ですかね。

2005年11月16日(水)

2005年11月14日(月)

名前を...で省略する

2005年11月14日(月) 08:42

Nikesと名前推論を読んでいて思ったのですが、 Knuth先生の Literate ProgrammingツールであるWEBには、 既出のセクション名を ... で省略できるっていう機能がありますね。 たとえば、

@<Program to print the first thousand prime numbers@>

というセクションが出てきていたら 次からは、

@<Program to print...@>

のように省略できます。

説明文は、 Literate Programming (knuthweb.pdf)のp.7, p.8あたりにあります。 以下引用。

> Since the names of sections tend to
> be rather long, it is a nuisance to type them in full each
> time; WEB allows you to type ‘...’ after you have given
> enough text to identify the remainder uniquely.

関係あるかどうかわかりませんが、ご参考まで。

2005年11月13日(日)

2005年11月12日(土)

小さなHTTPサーバ(その2)

2005年11月12日(土) 09:59

Javaのコードをいじっているうちに、こんな感じになりました。

import java.io.*;
import java.net.*;
import java.util.*;
import java.util.concurrent.*;

class Server implements Runnable {
    private static final String HEADER = "HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n";
    private static final String FORM = "<form action='/'><textarea name='m'></textarea><input type='submit'></form>";
    private final ServerSocket _serverSocket;
    private final ExecutorService _executorService;

    public Server() throws IOException {
        _serverSocket = new ServerSocket(8888);
        _executorService = Executors.newFixedThreadPool(5);
    }

    public void run() {
        try {
            while (true) {
                final Socket socket = _serverSocket.accept();
                _executorService.execute(new Runnable() {
                    public void run() {
                        try {
                            String request = new BufferedReader(new InputStreamReader(socket.getInputStream())).readLine();
                            String response = HEADER + "<html><pre>" + request + "</pre>" + FORM + "<hr>" + Thread.currentThread() + "</html>";
                            socket.getOutputStream().write(response.getBytes());
                            socket.close();
                            // throw new IOException("IOException from run");
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                });
                // throw new IOException("IOException from while");
            }
        } catch (IOException e) {
            e.printStackTrace();
            try {
                _serverSocket.close();
            } catch (IOException ex) {
                e.printStackTrace();
            }
        } finally {
            _executorService.shutdown();
        }
    }
}

public class Main {
    public static void main(String[] args) throws IOException {
        new Server().run();
    }
}

2005年11月11日(金)

Railsアプリに挑戦

2005年11月11日(金) 21:47

10分で作るRailsアプリ for Windowsを見て感動し、私もRailsを試してみようと思いました。 実は先日一回トライしたのですけれど、最後の最後でエラーが出て放置していたのでした。 調べてみると「クライアントをアップグレードしなさい」というエラーになっていました。 もう一度上のflashを見直すと、MySQL Serverのバージョンが4になっているのに、 私がインストールしたのはMySQLの5でした。あれれ。 そこで一度全部アンインストールして、再挑戦。 今度はうまく行きました。 以下は、私のメモ。

  • 5分でインストールするRails+MySQL
  • Rubyのインストール。
    • GoogleでActiveScriptRubyを検索する。
    • ActiveScriptRuby 1.8.2.5をダウンロード。ActiveRuby18.msiがファイル名。
    • ダウンロードしたActiveRuby18.msiをインストール。インストール先はC:\rubyに変更。
    • なぜかActiveScriptRuby 1.8.2.6がインストールされたが、気にしない。
  • RubyGemsのインストール。
    • RubyForgeのRubyGemsのページへ行く。
    • RubyForgeのRubyGemsのページからダウンロード。rubygems-0.8.11.zipがファイル名。
    • ダウンロードしたrubygems-0.8.11.zipを展開。展開するとrubygems-0.8.11ディレクトリができる。
    • rubygems-0.8.11ディレクトリを開いてsetup.rbをダブルクリックして実行。
    • Windowsの[スタート]ボタン→[Ruby 1.8]→[ruby console]を選ぶ。コマンドプロンプト(ruby console)が開く。
    • ruby consoleで gem install rails --remote --include-dependencies を実行する。
  • MySQLのインストール。
    • MySQL公式サイトへ行く。
    • MySQL 4.1のページへ行く。
    • Windows Essentialsをダウンロード。mysql-essential-4.1.15-win32.msiがファイル名。
    • MySQL Administrator Downloadsのページに行く。
    • Windows版をダウンロード。mysql-administrator-1.1.4-win.msiがファイル名。
    • mysql-essential-4.1.15-win32.msiを実行。
      • Setup TypeはTypicalのまま。
      • MySQL.com Sign-UpはSkip Sign-Upにする。
      • 最後にFinishボタンを押すと、MySQL Server Instance Configuration Wizardが始まる。
        • Standard Configurationに変更してNextする。
        • ずっと変更なしでNextするが、Include Bin Directory in Windows PATHにはチェックを入れる。
        • New root password:ではパスワードを決めて入れる。
        • 最後にexecuteボタン、そしてFinishボタン。
    • mysql-administrator-1.1.4-win.msiを実行。
      • ライセンスをacceptした後は、特にデフォルトのまま、Next。
  • Railsで作る簡単Webアプリbookmark編

小さなHTTPサーバ

2005年11月11日(金) 18:42

何となく、役に立たないプログラムをJavaで書きたい気分になった (役に立たないプログラムではあんまりなので、「小さなHTTPサーバ」とタイトルを変えました)。

import java.io.*;
import java.net.*;

class Server {
    static String HEADER = "HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n";
    static String FORM = "<form action='/'><textarea name='m'></textarea><input type='submit'></form>";
    public static void main(String[] args) throws Exception {
        ServerSocket server = new ServerSocket(8888);
        System.out.println("http://localhost:" + server.getLocalPort());
        while (true) {
            Socket socket = server.accept();
            String request = new BufferedReader(new InputStreamReader(socket.getInputStream())).readLine();
            socket.getOutputStream().write((HEADER + "<html><pre>" + request + "</pre>" + FORM + "</html>").getBytes());
            socket.close();
        }
    }
}

ほぼ同じコードをPerlでも(perldoc perlipc参照)。

use strict;
use Socket;

my $HEADER = "HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n";
my $FORM = "<form action='/'><textarea name='m'></textarea><input type='submit'></form>";
socket(SERVER, PF_INET, SOCK_STREAM, getprotobyname('tcp')) or die;
setsockopt(SERVER, SOL_SOCKET, SO_REUSEADDR, pack("l", 1)) or die;
bind(SERVER, sockaddr_in(8888, INADDR_ANY)) or die;
listen(SERVER, SOMAXCONN) or die;
while (accept(CLIENT, SERVER)) {
    my $request = <CLIENT>;
    print CLIENT "$HEADER<html><pre>$request</pre>$FORM</html>";
    close(CLIENT);
}

書いて、眺めているうちに、何か作れそうな気分になるから面白い(作らないけど)。

追記

KIDO Sadayoshiさんから「なんとなくRuby版」を送っていただきました。 ありがとうございます!

require 'socket'

header = "HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n"
form = "<form action='/'><textarea name='m'></textarea><input type='submit'></form>"

server = TCPServer.open(8888)
while true
  socket = server.accept
  request = socket.readline
  socket.write "#{header}<html><pre>#{request}</pre>#{form}</html>"
  socket.close
end

RSA-640 is factored!

2005年11月11日(金) 11:43

RSA-640 is factored!ということで、さっそく検算。

use bigint;
my $p = 1634733645809253848443133883865090859841783670033092312181110852389333100104508151212118167511579;
my $q = 1900871281664822113126851573935413975471896789968515493666638539088027103802104498957191261465571;
my $N = 3107418240490043721350750035888567930037346022842727545720161948823206440518081504556346829671723286782437916272838033415471073108501919548529007337724822783525742386454014691736602477652346609;
if ($p * $q == $N) {
    print "Factored!";
} else {
    print "?";
}

この機会に拙著も宣伝しておこう。

数当てクイズ (解答編)

2005年11月11日(金) 06:50

数当てクイズへの解答や反応をありがとうございます。 以下、結城および他の方々の解答(抜粋)を記載します。

クイズに挑戦したい方は、 先を読み進める前に、 問題編をお読みください。

結城の解答

問題Aの解答

0, 1, 10, 2, 100, 11, 1000, 3, 20, 101, 10000, 12, 100000, 1001, 次の数は?

この数列は、 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14を それぞれ素因数分解したときの、素因数の指数を並べた数の列です。 つまり、 5a×3b×2cの形に 素因数分解したときのabcです。 14の次の数である15を素因数分解すると、 51×31×20になるので、 問題Aの答えは110になります。

答え:110

問題Bの解答

1, 11, 2, 12, 111, 21, 3, 13, 121, 1111, 112, 22, 211, 31, 4, 14, 131, 次の数は?

この数列は、 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17を それぞれ2進法で表記したときの、同一数字の連続数の列です。 つまり、2進法で表記したとき最上位の1からはじめて、 1がa個連続、0がb個連続、1がc個連続、0がd個連続しているときのabcdです。 17の次の数18を2進法で表記すると10010になるので、 問題Bの答えは1211になります(1が1個連続、0が2個連続、1が1個連続、0が1個連続)。

答え:1211

注意

問題A, Bともに、現れる数が9を越えると一意性は失われます。

id:kkkkkkkkさんの答え

matarilloさんの解答

グループ化すると解ける問題が多いのでそうする。

A

(0), (1, 10), (2, 100, 11, 1000), (3, 20, 101, 10000, 12, 100000, 1001, ?), ... とグループ化できそう。グループnには2^(n-1)個のメンバーが存在する。
そう考えるとグループ4の先頭は4になりそうだが、残念ながら出題はそこではない。
次に1, 10, 100, 1000, 10000, 100000の出方からパターンを類推できるかと思ったが、どうもうまくない……あれ、これ素数?
a_2=1, a_3=10, a_5=100, a_7=1000, a_11=10000, a_13=100000
そう考えるとa_17=1000000になりそうだが、残念ながら出題はそこではない。
素数が出てくるなら、次は合成数と素因数分解を考えるのだろう。と、ここで素因数分解にたどり着いた時点でパターン発見。
a_4 = a_(2^2) = a_2 * 2 = 2
a_6 = a_(2 * 3) = a_2 + a_3 = 11
a_8 = a_(2^3) = a_2 * 3 = 3
a_9 = a_(3^2) = a_3 * 2 = 20
a_12 = a_(2^2 * 3) = a_2 * 2 + a_3 = 12
a_14 = a_(2 * 7) = a_2 + a_7 = 1001
a_15 = a_(3 * 5) = a_3 + a_5 = 110
答えは110。

素因数分解なんだから、書き方を変えたほうがきれいですね。

 2 =                   2^1 ->    1
 3 =             3^1 * 2^0 ->   10
 4 =                   2~2 ->    2
 5 =       5^1 * 3^0 * 2^0 ->  100
 6 =             3^1 * 2^1 ->   11
 7 = 7^1 * 5^1 * 3^0 * 2^0 -> 1000
 8 =                   2^3 ->    3
 9 =             3^2 * 2^0 ->   20
10 =       5^1 * 3^0 * 2^1 ->  101

のように。 もちろん初項は 1 = ... * 5^0 * 3^0 * 2^0 -> 0 ですね。

B

(1), (11, 2), (12, 111, 21, 3), (13, 121, 1111, 112, 22, 211, 31, 4), (14, 131, ...)とグループ化できる。グループnには2^(n-1)個のメンバーが存在する。
n番目のグループは、各桁の合計がnになることがわかり、[n個のものを1つ以上のグループに配分したときのパターン]とわかる。
グループ内の並びのパターンだが、グループ3と4をにらんできたら見えてきた。
グループn+1の前半は、グループnのメンバーを逆順にして、先頭に1を追加。グループn+1の後半は、グループnのメンバーの先頭桁に1を足す。これでどうだ。
ちなみにグループの最後のメンバーを除けば、そこまでの並びは左右対称になっている。
グループ5の前半はグループ4のメンバーを逆順にして先頭に1を追加。
なので(14, 131, 1211, 122, 1112, 11111, 1121, 113)と並ぶだろうから、答えは1211。

id:Horiuchi_Hさんの答え

まちよさんの答え

まちよ と申します。僭越ながら数当てクイズの問題Aの回答を投稿させていただきます。
数字の出現順がキーになる。
・1番目は 0 に設定
・n番目の数字が素数の場合は、10のm乗 とする。mはそれまでに素数の出てきた数。素数でない場合は、素因数分解して得られる数字に設定した値を足した値。例えば 6番目の数字の場合 2x3 なので、2番目の数字に設定した値と、3番目に設定した値の和。

これでつじつまが合うはずだと思います。

15番目の数字なので 15 = 3 x 5 で
3番目の数字→10
5番目の数字→100
により、答えは 110 です。

notogawaさんの答え

どばいさんの答え

問題Bの答え:1,2,3,4、、、それぞれを分割する組み合わせを網羅する数列ではないでしょうか。
例えば3の場合、
○ ○ ○
と3つの要素の間を、仕切る/仕切らないの組み合わせになっていると考えます。

○|○ ○   12
○|○|○   111
○ ○|○   21
○ ○ ○   3

ここで、仕切りの部分のみに着目すると 10,11,01,00 となっておりこれはグレーコードの遷移です。ですから5の分割について同様に考えると

1000  14
1001  131
1011  1211
1010  122
1110  1112
1111  11111

という遷移ではないでしょうか。

unyaさんの答え

問題Aは多分,110
問題Bはおそらく,1211
なんとなく

西尾さんの答え

2005年11月10日(木)

淡々と仕事

2005年11月10日(木) 09:54

最近は秋晴れでとても気持ちが良い。 今日はJavaでプログラムを少し書いた。 Perlもいいし、C#もいいけれど、Javaもなかなかいいよね。 そういえば、Java SE 6ではfriendが入るんでしたっけ。 friendよりもuintを入れてほしいなあ。

2005年11月9日(水)

2005年11月7日(月)

Tropy設計判断

2005年11月7日(月) 09:27

Tropy設計判断を忘れないうちにメモ。

  • なぜ数字? → 英単語などが偶然出来るのを避けたかった。覚えにくくしたかった。
  • なぜ8桁? → 記憶のマジックナンバー7に1を加えた。覚えられそうな、忘れそうな量を狙った。
  • なぜ衝突しないだけの長いIDを使わなかった? → 万一衝突したら、片方を削除すればよいから。
  • なぜLocation:を使わない? → 負荷対策。最初は使っていた。クライアント側の滞空時間を長くしたかったのでクライアントプルにした。
  • なぜonLoadでstyle.visible="hidden"? → JavaScriptが有効ならリンクを隠し、一定時間後に表示。JavaScriptが無効なら最初から表示。
  • なぜpermalinkのリンクがない? → 「URLを記録しておく」ということに気づくのを遅らせるため。気がついたころには何個かページを失っていることを期待。
  • なぜhelpのリンクがない? → 迷わせたかった。これは何だろうと不安にさせたかった。そのほうが自分で考える。自分で試し出す。
  • なぜトップページへのリンクがない? → そもそもTropyにはトップページがない。
  • なぜEdit Create Random? → Tropyにはそれが必要十分と考えた。
  • なぜEditは左端? → CreateよりもEditを使う回数が多いと考えた。押しやすさ。
  • なぜRandomは右端? → Randomは押す回数が一番多いと考えた。押しやすさ。
  • なぜEdit Create Randomは大文字ではじまる? → リンクの区別がくっきりつくように。
  • なぜEdit Create Randomは右上? → 左上は目立ちすぎ。右下は何度か試したが、メッセージと重ねずに毎回同じ位置に出すのが難しかった。
  • なぜEdit Create Randomは英語? → 日本語だとコンテンツと干渉する。
  • なぜEdit? → Editするから。これが好きな人はエディタ。
  • なぜCreate? → Createするから。これが好きな人はクリエイタ。
  • なぜReadではなくてRandom? → Readはページで現在ユーザがやっていることであり、そのリンクの目的ではない。RandomとしたのはJump to a random pageを一言で言うため。
  • なぜ全部動詞にしなかった? → その類の統一は、頭では納得するが、感覚的には納得しなかった。
  • なぜDeleteを作らなかった? → 不要だから。
  • なぜRSSを作らなかった? → 不要だから。
  • なぜURLの自動リンクを作らなかった? → 不要だから。
  • なぜNGワード禁止機能を作らなかった? → 不要だから。
  • なぜタグを有効にしなかった? → 不要だから。
  • なぜ○○という機能を入れなかった? → たぶん、不要だから。
  • なぜリンクは灰色? → リンクを目立たせたくなかった。
  • なぜリンクに下線がない? → リンクを目立たせたくなかった。
  • なぜリンクにtitle属性がない? → 最初はあった。Edit, Create, Randomで意味は十分伝わると判断。
  • なぜCopyright表示がない? → 「ここは何?」感を高めたかった。
  • なぜ淡い色がランダム? → 下品な色使いにしたくなかった。区別できそうな/できなそうな色合いを狙った。前に見たことがあるかも?という感じにしたかった。
  • なぜ同じページは同じ色? → ページの同一性を保ちたかった。URLをシャッフルしなかったのと同じ理由。
  • なぜTropy...のときにブランク? → 「何が起こっているのだろう」感を増すため。また次のページに至るまで、気持ちをニュートラルに入れてほしかった。
  • なぜ編集フォームを最初からオープンにしなかった? → 編集を意識させたくなかった。
  • なぜ編集ページのときに白色? → 好みの色を出すまでCreateを連打する人がいた。「好みの色を自分で選ぶ」ことをさせたくなかった。
  • なぜNew Page? → Create_New_Pageと文章が続く。
  • なぜNew Pageでtextareaが空白? → titleとかnew pageと最初は書いていた。そのままWriteボタンを押す人が多数出た。
  • なぜpreではなくp? → 何となく。preだとユーザが制御できる領域(比喩的な意味)が広すぎると感じた。文章を書かせたかった。
  • なぜ20行? → 何となく。ノートパソコンでもスクロールせずに読めるくらいの量。
  • なぜ1000バイト? → 何となく。
  • なぜXHTMLにしない? → XML宣言が読めないブラウザがあった。ユーザからの報告。
  • なぜXML宣言だけ無くさなかった? → HTML Validatorが文句を言う。CSSとHTMLはValidatorで100点にしたかった。
  • なぜスクリプト内に直接タグを書く? → 楽だった。tropy.cgiという1ファイルだけを編集したかった。
  • なぜ17個に1個だけ…? → よく気がつきましたね。これはやむにやまれぬ負荷対策の一種。できればやりたくなかった。
  • なぜfiles/.htaccessがdeny from all? → 直接.txtファイルを読まれたらつまらないから。
  • なぜ.htaccessにErrorDocument 404 http://www.example.com/tropy/?notfound? → HTMLをブックマークしている人にNot Foundページを見せたくなかった。
  • なぜTropyという名前? → ユーザさんから「とろぴ」というヒントワードをもらった。確かにエントロピーに関係しそうで、しっくり来た。
  • なぜ「とろぴぃ」という表記? → Tropyの読み方を統一したかった。
  • なぜEncodeやJcodeではなくjcode.pl? → たまたま。楽だった。
  • なぜスクリプトがこんなにぐちゃぐちゃ? → 時間的理由。Rewrite it as you like. Tropy is a free software.
  • なぜこんな「Tropy設計判断」を公開する? → 公開しておけば、ここ数日で考えたことが、自分も含めた誰かの役に立つかもしれないから。公開しなかったら、そのうちに失われてしまい、自分も含めた誰の役にも立たなくなるから。

2005年11月6日(日)

駆け抜けたTropy

2005年11月6日(日) 22:26

この数日、頭の中はTropyでいっぱいでした。

「名前のない実験ページ」として開発をはじめたTropyを、 日記やtextfile.orgで紹介してから、 あちこちからリンクしていただき、アクセスが急上昇しました。 普段でも個人サイトとしてはアクセス数はそれほど少なくないのですが、 その数が文字通り倍増しました(特に11月4日は数倍増し)。 Tropyの性格上それは当然のことですよね。

動作チェックのため、Tropyで書き込みをすると結城あてにメールが来る設定にしていました。 わたしはいままで自分のメールボックスにあんなにメールが高速に溜まるのを見たことがありません (^_^;

急激なアクセス上昇に対処するため、CGIの改良を常時続けました。 HTMLのキャッシュ化をしたり、 Randomの連打を防ぐためアンカー表示を遅らせたり、 Random先のページをHTMLに埋め込むということもやりました (詳しくは公開している Tropyのスクリプトを参照。整理されていないのはご容赦)。

パフォーマンスの改良とともに、Tropyへの書き込みやWebでの反応を参考に、 「Tropyらしさを失わないようにしながら、どの機能が削れるだろう?」 ということを考えていました。 その心的密度の高さは、YukiWiki・声のかけら。・はてダラなどを作っていたときの感触と似ていました。 言うなれば「駆け抜けてみるか今夜!」が数日続いた感じですね(微妙に意味不明)。

ページが生まれては書き換わり、削除されていくTropyを見ていると、 スピードをむちゃくちゃ上げたインターネット、 という感じがします。 本当にエキサイティングでした。 貴重な体験です。

さて。

昨晩も、 わけもわからずドキドキしながらTropyのことを考えていました。 夜中のリビングをうろうろ歩きながら、 「現在のCGI負荷がこれ以上続くとまずいから、何とか分散させる方法はないか」 と考えていたのです。 そろそろ本来の生活ペースに戻さなければならないので、 どういう改良をしたら安定するか、に心を砕いていました。 明日の日曜は礼拝なのに、 その間もTropyの改良を考えるはめになりそうです。 それは正しいことではない。

そのとき、ふと「自分ひとりで抱えるのは良くない」という思いが心に浮かびました。 Tropyという興味深い「何か」を自分だけで抱え、ちまちました改良を考えるのは良くない。 動いているTropyをいったん停止しよう。 そして現在の時間を、スクリプトを公開できる形にまとめるために使おう。 スクリプトを公開すれば、クローンだって作りやすいし、 スクリプト中に込められた結城の工夫(や失敗)がはっきり他の人に伝わる。 そうだ、それが有効な時間の使い方だ。

こんな風に気持ちが切り替わりました。 そう決めてから約1時間半で、スクリプトを公開できる形にし、 Tropyはお休みですというページを作りました。 この作業のおかげで、 今日は心安らかな日曜日を送ることができました。 感謝です。

ともあれ、この数日間、ネットのみなさんの反応は、 大いに結城の気持ちを支え、後押ししてくれました。 メールでも、多くの方から情報や意見、それに「おもしろい!」という感想をいただきました。 心から感謝します。 以下に、結城が読んだもののほんの一部ですけれど、 感謝しつつリンクします。

上のリストの最後のリンクは田崎先生のページです。 田崎先生の 「どうか、ご無理をなさらないように、結城さん」 という優しいお言葉は、とてもうれしかったです。

Tropyの再開は未定。 生活ペースを取り戻してから、また考えます。

Tropyを楽しんでくださった・くださっているみなさんに感謝します。

2005年11月5日(土)

随時更新、いろんなTropyたち

2005年11月5日(土) 20:30

Web 0.5としてのTropy (追記あり)

2005年11月5日(土) 06:31

先日公開した、 Tropy(とろぴぃ)というページは、 一日にしてとんでもない量のアクセス数をたたき出してしまいました(大汗)。 ユーザによって作られたページ数もすごいことに。 これはとてもまずいので、いくつかの負荷対策を行いました。

それはさておき、 昨日の解説と重複する部分もありますが、 Tropyを公開して思ったことを少し書きましょう。

感覚的にいえば、TropyはWeb 2.0ならぬ「Web 0.5」ですね(Web 2.0-1と呼んでもよい)。 ええと、Web 0.5というのは「Webの常識的な便利機能をできるだけ入れないようにしている」というほどの意味です。 たとえば、検索, What's newやRSS, URLの自動リンクやWikiNameなどですね。 それから、むやみに制限を入れています。 行数の制限、1ページの分量制限、そして、1ページに表示される書き込み数は1つだけ。

Web 0.5というとWeb 2.0に対抗しているようですが、もちろんそんなことはありません。 実際Tropyは、Web 2.0のパターンのいくつかは踏襲しているように思います。 たとえば、以下はTropyに当てはまりますね (パターン名の翻訳は、 minfish.jpさんから)。

  • ユーザーが価値を付加する(Users Add Value)
  • ネットワーク効果はデフォルトで(Network Effects by Default)
  • 永久にベータ版(The Perpetual Beta)

Tropyのユーザは「全貌をつかめない」ことに軽い不安のようなものを感じます。 自分が作ったページを見失ってとまどったり、 特定の語を含んだページを探せないことにいらだったりします。 普通なら「ユーザはこういうことをしたくなるから、それを機能として追加しよう」と思いがちですが、 Tropyはその逆を行ってみました。 つまり「ユーザがそういうことをしたくなっても、機能として追加しない」という方針です。

現在のTropyのユーザに提供されている機能は、Edit, Create, Randomだけです。 現在のページを編集する、新しいページを作成する、そしてランダムジャンプ。 EditとCreateを1つのコマンドにまとめられないことはないと思いますが、 そこまではシンプルにしませんでした(なんとなく)。 他のページに行く手段は、ランダムジャンプだけ。 Randomをなくすこともできるのですが(たとえばタイマで自動ジャンプさせる)、 それはしませんでした。

そのほか、検討したけれど入れなかった(少なくともいまは入れていない)機能の1つは 「完全ランダムエントリ」です。 これは、URL指定もできない、ランダムでしか見つからない、絶対捕まえられないページです。 それから「URLシャフリング」も入れませんでした。 これはURLを定期的にシャフリングしてブックマークを無意味にする機能です。

Tropyのユーザは「何がTropy的であるか」についてのイメージをすでに持っているようで、 あちこちに「こういうのはTropy的だ」とか「いや、こういう行動はTropy的ではない」などと書かれていました。 何がTropy的なのか、というのは考えると面白いですね。

TropyはPerlで書かれています。 いまは公開する予定はありませんけれど、 Webアプリを作れる人なら簡単に作れますよね。 他のサイトにも作ってください。そして負荷分散を(苦笑)。 APIを考えれば「分散Tropy」もできるかもしれませんね。

追記(2005-11-05 16:45)

PythonによるTropyクローン!

2005年11月3日(木)

Tropy(とろぴぃ)というCGIを作りました(追記あり)

2005年11月3日(木) 18:33

Tropy(とろぴぃ)というCGIを作りました。どうぞ遊んでみてください。

Tropyの特徴を挙げてみましょう。 まずは基本。

  • Wikiのように誰でも自由にページを作れるし、編集できる。
  • 誰がそのページを書いたかは分からない。

でも、Wikiとはまったく異なります。 というか、通常のWebページとはまったく異なる方向性を持ちます。 特徴を列挙しますね。

  • WikiNameを使ったページ間のリンクはない。
  • URLを書いても、リンクが自動的に作られることはない。
  • もちろんHTMLのタグは書けない(書いても単なる文字として扱われる)。
  • 検索機能がない。
  • ページの一覧もない。
  • 最近更新されたページがどれなのか分からない。
  • いつ作られたページなのかもわからない。
  • RSSもない。

さらに。

  • 1ページのサイズや行数に制限がある。つまり一ページにたくさん書くことはできない。
  • ページを渡り歩くのはランダムジャンプしかない。

ランダムジャンプしかないので、 あるページを見つけ出すのは偶然に頼るしかないということになります。 大げさに言えば、一期一会のページ巡回。 自分が書いたページといえども、 URLを記録してなければ、そのページに再度めぐり合うには偶然だけが頼り。

そして最後に、極めつけ。

  • Tropyのトップページも毎回ランダムに選ばれる。

つまりTropyの各ページは対称であって、どこにも中心はないのです。 FrontPageやIndexやTable of Contentsはない。

Tropyでは、 書かれたページの全貌や関係を、できるだけ把握させないように工夫されています。 できるだけランダムに、できるだけバラバラに。

このような、Webの慣習に逆行しているようなページに、 いったいどんな意味があるのでしょうか。

結城自身にも、まだよくわかっていません。

でも、あなたには、わかるかも。

ちなみに、 Tropy(とろぴぃ)という名前について。

このCGIは、ここ数日「実験ページ」という形で公開していました。 まだ名前がない状態でバグ取りをしたり、ユーザさんの意見をもらったりしていました。 そんな中、どなたかが「名前募集中」のページに、

randomをクリックしていたら、 なぜかエントロピーという言葉を思い出したので、「とろぴ」。

と書き込みをしてくださいました。 Tropy(とろぴぃ)という名前はここからいただきました。 エントロピーを思い出してくださったこの方に感謝します。 実験ページで応援してくださったみなさんにも感謝します。

追記(2005-11-04)

一日足らずのうちに、アクセス数が大変なことに (^_^; 。 とりあえず、HTMLファイル化の対策をした。 自分がwatchしているページがある人は、以下のような変更をお願いします。

http://www.hyuki.com/tropy/?12345678
↓
http://www.hyuki.com/tropy/12345678.html

Tropyがこれほど受けるとは驚きです。 感覚的にいえば、Tropyは「Web 0.5」ですね(Web 2.0-1と呼んでもよい)。

2005年11月2日(水)

なか見!検索

2005年11月2日(水) 06:23

アマゾンで、書籍の中まで検索できる「なか見!検索」がはじまりました。 たとえば、 「結城浩」を含んでいる本などを検索することができます。 結城自身の本が見つかるのは(著者名なので)もちろんですけれど、 『WEB+DB PRESS』の参考文献のところや、 『XPエクストリーム・プログラミング適用編』の謝辞のところに私の名前が出てくることがわかります。

サインインしなくても、目次・はじめの数ページ・索引などを読むことができますし、 サインインすれば、検索で見つかった前後のページを読むことができます。

これは画期的なできごとだと思います。 本を買うかどうかの判断をするとき、 「中身をぱらぱら見る」ことができるようになったわけですから。 いくら良さそうな本でも、 本文をぱらぱら見て「自分がほしい本とは違うなあ」と思うことがあります。 また逆に「あ、こういう感じなら良いかも」と思う場合もあります。 これまでは、 書店に行かなければ「中身をぱらぱら見る」ことはできませんでしたが、 「なか見!検索」で出来るようになった、と。 自分と相性が良いことを確かめて買うのは大事ですよね。

結城の本はすべて「なか見!検索」対応になっていますので、 ぜひ、中身をぱらぱら見て、 相性が良いかどうかを確かめてご購入ください。 よろしくお願いいたします。

…と書いてから、 まだ対応していない本が何冊かあるのに気づきました (たとえば『改訂第2版Java言語プログラミングレッスン』はまだですね)。 申し訳ありません。 できるだけ早く対応できるように出版社さんにお願いしておきます。

日記一覧

2025年 010203040506070809101112
1999年 010203040506070809101112
[icon]
結城浩(ゆうき・ひろし) @hyuki

『数学ガール』作者。 結城メルマガWeb連載を毎週書いてます。 文章書きとプログラミングが好きなクリスチャン。2014年日本数学会出版賞受賞。

Twitter note 結城メルマガ Mastodon Bluesky Threads Home