> 結城浩の日記 > 2005年11月 | 検索 |
プロフィール | 日記一覧 | 日記ダイジェスト | Twitter | RSS |
|
うう。 やっとC MAGAZINEの原稿(2006年2月号向け)が書けましたのです。 例によって分量オーバーしているような。すみませんすみません。
「大阪府など、ICタグ利用した学童の安全確保システム実証実験」という記事を読んで思ったこと。
こういうセキュリティシステムが出てくるときには、 ぜひ「執拗な悪意を持った人の気持ちになれる検証者」 が安全性の検証をしてほしいと思います。
素人的に気がつくポイントとしては:
などです。
これはいま10分くらいで思いつくまま書いたものですから、 専門家が真剣に考えれば、おそらく数百から数千のチェック項目(もっとかも)が出てくると思います。
この類のシステムが出てきたときに、一般の父兄でも「突っ込み」が入れられるような、 汎用に使える「システムチェックリスト」のようなものは公開されていないのだろうか。 …とここまで書いてきて、シュナイアーの Beyond Fearに一般的な話題が出てきていたことを思い出しました。
これですね。
「セキュリティシステム、テクノロジー、プラクティスを分析・評価する5つのステップ」
"five-step process to analyze and evaluate security systems, technologies, and practices" (by Bruce Schneier, Beyond Fear, p.14)
かなり意訳すると、こうなります。
結城は、 このステップ1〜5をステップ・バイ・ステップで考えることは大事だと思います。 セキュリティの専門家でなくても、 業者の宣伝文句に惑わされずにセキュリティシステムを分析・評価する「とっかかり」に なってくれるように思います。
多くのセキュリティシステムの宣伝文句は、 ステップ1〜3を雰囲気で語り、 ステップ4と5について語らないのではないでしょうか。 特に、そのセキュリティシステムが「新たに生み出す危険」 について語る宣伝文句を私は見たことがありません (もしもあったら教えてください)。
プログラム書いて… φ(._.)
、
図を描いて… φ(+_+)
、
文章を書いて… φ(@_@)
、
なかなか進まん。
ぷぎぃ!
11月は小の月だから「月末」が早いんだよう…。ふみー。
それはさておき。
編集部から『暗号技術入門 —— 秘密の国のアリス』の増刷のお知らせをいただきました。 ご愛読してくださっている読者のみなさん、ありがとうございます。
そういえば、こういうのもありましたね。 何だか懐かしいな。
みなさんにお尋ねです。 いわゆる 高橋メソッドでプレゼン資料を作りたいとします。 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/高橋メソッドマシーンを使って作ってみました(だから、あなたは仕事をしていたはずでは?>自分)
「日記ダイジェスト」を更新しました。 ふと「日記ダイジェスト」は、すでに600ページ以上あることに気がつきました。 「日記ダイジェストダイジェスト」が必要そうですね(^_^;
結城浩の2005年「よかった探し」です。
昨晩は新しいお仕事の打ち合わせに出かけました。 具体的なアクションはおそらく来年ということになるでしょう。 また新しい世界が開かれることを期待しつつ、 祈りつつ、仕事をしていきたいと思っています。
「テトラちゃんと相加相乗平均」のLaTeXファイルを公開しました。
今日は少し暖かい。朝日の中、木々に包まれた歩道を歩く。 住宅地の中なので、車も通らない、静かないい道だ。
私はiPod shuffleでバッハの「フーガの技法」を聴きながら、満ち足りた気持ちで歩く。 どうやったらこんなに素晴らしい作品を生み出すことができるんだろう。 数学的なバッハの曲。規則的なようだが、規則的ではない。 機械的なようだが、機械的ではない。非常に複雑に入り組んでいるように感じるのだが、 シンプルで美しいテーマが繰り返し聞き取れる。
…そんな音楽を楽しみながら、私はゆっくりと道を歩いていく。 落ち葉を踏む、さくさくという感触もどこか楽しい。 私は、レオンハルトのハープシコードにあわせて軽くハミングしていたかもしれない。
そのとき、コートを着た一人の会社員が、私を早足で追い越していく。
タバコの煙がやってくる。
タバコの煙は、ふわっと顔にかかり、私は咳き込んで立ち止まる。 タバコを手にした会社員は特に気にせず、早足のまま過ぎていった。
私は、咳が収まってからも、道の傍らに立ったまま、しばらく考えた。
あの会社員は、自分のタバコの煙が私にかかったことなど全く知らない。 気持ちのいい朝が、タバコの臭いで一度にだいなしになったことも知らない。 ここは外だし、特に禁煙にする必要もないくらいにオープンな空間だし、 私だって、自分に煙がかかりさえしなければ、特に文句もつけない。 でも。けれども。うーん。 こういう気持ちはどこに持っていけばいいんだろう。
……日記に書いてみよう。
で、いまこの日記を書いていて思ったのだけれど、 あの会社員は、私に不快な気持ちを与えたことなど知らないだろう。 だったら、もしかしたら(いや、もしかしなくても)、 私自身も、私が気づかないところで同じように不快な気持ちを誰かに与えているのかもしれない。
だからどう、と何か主張があるわけではないけれど。
あーうー。 この時期「年末進行」という単語にはどきどきしますね。 とりあえず淡々とがんばるのであった。
ところで、ある方から、お仕事のご依頼メールをいただきました。 そのメールには「結城がどういう仕事をして来たか・ 現在どういう活動をやっているか・また何に興味があるか」 などが、きちんとサマライズされておりました。 でも、単に要約したわけではなく、文章中に自然に内容が織り込まれています。 失礼ながら「す、すごい…」と感嘆しつつ読みました。 また良いお仕事ができるといいなあ。
その方は、結城のWebサイトをごらんになったわけですが、 Webサイトというものが重要な営業ツールになっていることを今更ながら感じました。
午前中は礼拝。お昼は久々に美味しいイタリアンで外食。帰ってきてからお昼寝。いつもの日曜日。
ある読者さんからフィードバック。 メールアドレスがわからないので、こちらでお返事。
「テトラちゃんと相加相乗平均」、興味深く読ませていただきました。
ちょっとだけ気にかかったのは、 8ページの「2数を乗じて平方する」という箇所で、 これだと、(xy)^2になりませんか?
おお、確かにそうですね。 「平方する」ではなく「平方根をとる」ですね。 「僕」に伝えておきます…というか、修正しておきます。 ご指摘ありがとうございます。
ちょっと風が冷たいけれど、良い天気なので次男とお散歩。
私「そろそろおうちに帰っておやつ食べよう」
次男「おやつ、何?」
私「うーん…おせんべ」
次男「おせんべ、ないよ」
私「なんで? あるよ」
次男「ないよ」
私「あるよ」
次男「ないよ」
私「あるよ」
次男「もう食べちゃったもん。ないよ」
私「それ、ごませんべいでしょ。ごませんべいじゃなくってえ」
次男「なくって?」
私「ごませんべいじゃなくってえ、ごませんべいじゃなくってえ、ごませんべいじゃなくってえ、ごませんべいじゃなくってえ、ごませんべいじゃなくってえ」
次男「きゃはは。なーにぃ?」
私「ごませんべいじゃなくって、塩せんべい。それから、柿の種。それに、えびせんべい」
次男「えびせん、って言うんだよ」
私「えびせんべい」
次男「なにぃ? えびせんろ? 線路で電車が通ったら、えび折れちゃう」
私「じゃあ、えびせんせい。えびの先生」
次男「きゃはは」
私「えびの先生、えび先生。Rubyの線路、Ruby on Rails」
次男「?」
家についてから、二人で塩せんべいと柿の種とえびせんを食べました。
参考までに、2005年11月のアクセス数推移を。 11月3日の後の急上昇の部分が、Tropyによるものですね(Tropyの公開は11月5日の真夜中まで)。
といっても、ページ数は増えていますが、ユーザ数や転送量は増えていませんね。 まあ、Tropyの使われ方を考えると当然ですかね。
ミルカさんシリーズ第4弾、「テトラちゃんと相加相乗平均」を公開します。 ぜひ、ご感想をお寄せください。
これまでのミルカさんシリーズは「数学ガール」のページからどうぞ。
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.
関係あるかどうかわかりませんが、ご参考まで。
午前中は礼拝。 帰って来てからぐっすり昼寝。 いつもの日曜日。
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(); } }
10分で作るRailsアプリ for Windowsを見て感動し、私もRailsを試してみようと思いました。 実は先日一回トライしたのですけれど、最後の最後でエラーが出て放置していたのでした。 調べてみると「クライアントをアップグレードしなさい」というエラーになっていました。 もう一度上のflashを見直すと、MySQL Serverのバージョンが4になっているのに、 私がインストールしたのはMySQLの5でした。あれれ。 そこで一度全部アンインストールして、再挑戦。 今度はうまく行きました。 以下は、私のメモ。
gem install rails --remote --include-dependencies
を実行する。
何となく、役に立たないプログラムを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!ということで、さっそく検算。
use bigint; my $p = 1634733645809253848443133883865090859841783670033092312181110852389333100104508151212118167511579; my $q = 1900871281664822113126851573935413975471896789968515493666638539088027103802104498957191261465571; my $N = 3107418240490043721350750035888567930037346022842727545720161948823206440518081504556346829671723286782437916272838033415471073108501919548529007337724822783525742386454014691736602477652346609; if ($p * $q == $N) { print "Factored!"; } else { print "?"; }
この機会に拙著も宣伝しておこう。
数当てクイズへの解答や反応をありがとうございます。 以下、結城および他の方々の解答(抜粋)を記載します。
クイズに挑戦したい方は、 先を読み進める前に、 問題編をお読みください。
問題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を越えると一意性は失われます。
グループ化すると解ける問題が多いのでそうする。
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。
まちよ と申します。僭越ながら数当てクイズの問題Aの回答を投稿させていただきます。
数字の出現順がキーになる。
・1番目は 0 に設定
・n番目の数字が素数の場合は、10のm乗 とする。mはそれまでに素数の出てきた数。素数でない場合は、素因数分解して得られる数字に設定した値を足した値。例えば 6番目の数字の場合 2x3 なので、2番目の数字に設定した値と、3番目に設定した値の和。
これでつじつまが合うはずだと思います。
15番目の数字なので 15 = 3 x 5 で
3番目の数字→10
5番目の数字→100
により、答えは 110 です。
問題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
という遷移ではないでしょうか。
問題Aは多分,110
問題Bはおそらく,1211
なんとなく
最近は秋晴れでとても気持ちが良い。 今日はJavaでプログラムを少し書いた。 Perlもいいし、C#もいいけれど、Javaもなかなかいいよね。 そういえば、Java SE 6ではfriendが入るんでしたっけ。 friendよりもuintを入れてほしいなあ。
問題A
0, 1, 10, 2, 100, 11, 1000, 3, 20, 101, 10000, 12, 100000, 1001, 次の数は?
問題B
1, 11, 2, 12, 111, 21, 3, 13, 121, 1111, 112, 22, 211, 31, 4, 14, 131, 次の数は?
解答は、以下のフィードバック欄からどうぞ。 解答は、日記などで公開させていただくかもしれませんので、そのおつもりで。Enjoy!
ずっと仕事。
Tropy設計判断を忘れないうちにメモ。
この数日、頭の中は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を楽しんでくださった・くださっているみなさんに感謝します。
Tropyの負荷があまりにも高いので、しばらくTropyをお休みします。 楽しみにしてくださった方、申し訳ありません。 Tropyのスクリプトを公開しますので、ご利用ください。
Tropyクローン(Tropyエンジン)たちです。 他にもありましたらここに追記していきますので、 フィードバックからお知らせください。
先日公開した、 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さんから)。
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クローン!
Tropy(とろぴぃ)というCGIを作りました。どうぞ遊んでみてください。
Tropyの特徴を挙げてみましょう。 まずは基本。
でも、Wikiとはまったく異なります。 というか、通常のWebページとはまったく異なる方向性を持ちます。 特徴を列挙しますね。
さらに。
ランダムジャンプしかないので、 あるページを見つけ出すのは偶然に頼るしかないということになります。 大げさに言えば、一期一会のページ巡回。 自分が書いたページといえども、 URLを記録してなければ、そのページに再度めぐり合うには偶然だけが頼り。
そして最後に、極めつけ。
つまりTropyの各ページは対称であって、どこにも中心はないのです。 FrontPageやIndexやTable of Contentsはない。
Tropyでは、 書かれたページの全貌や関係を、できるだけ把握させないように工夫されています。 できるだけランダムに、できるだけバラバラに。
このような、Webの慣習に逆行しているようなページに、 いったいどんな意味があるのでしょうか。
結城自身にも、まだよくわかっていません。
でも、あなたには、わかるかも。
ちなみに、 Tropy(とろぴぃ)という名前について。
このCGIは、ここ数日「実験ページ」という形で公開していました。 まだ名前がない状態でバグ取りをしたり、ユーザさんの意見をもらったりしていました。 そんな中、どなたかが「名前募集中」のページに、
randomをクリックしていたら、 なぜかエントロピーという言葉を思い出したので、「とろぴ」。
と書き込みをしてくださいました。 Tropy(とろぴぃ)という名前はここからいただきました。 エントロピーを思い出してくださったこの方に感謝します。 実験ページで応援してくださったみなさんにも感謝します。
追記(2005-11-04)
一日足らずのうちに、アクセス数が大変なことに (^_^;
。
とりあえず、HTMLファイル化の対策をした。
自分がwatchしているページがある人は、以下のような変更をお願いします。
https://www.hyuki.com/tropy/?12345678 ↓ https://www.hyuki.com/tropy/12345678.html
Tropyがこれほど受けるとは驚きです。 感覚的にいえば、Tropyは「Web 0.5」ですね(Web 2.0-1と呼んでもよい)。
アマゾンで、書籍の中まで検索できる「なか見!検索」がはじまりました。 たとえば、 「結城浩」を含んでいる本などを検索することができます。 結城自身の本が見つかるのは(著者名なので)もちろんですけれど、 『WEB+DB PRESS』の参考文献のところや、 『XPエクストリーム・プログラミング適用編』の謝辞のところに私の名前が出てくることがわかります。
サインインしなくても、目次・はじめの数ページ・索引などを読むことができますし、 サインインすれば、検索で見つかった前後のページを読むことができます。
これは画期的なできごとだと思います。 本を買うかどうかの判断をするとき、 「中身をぱらぱら見る」ことができるようになったわけですから。 いくら良さそうな本でも、 本文をぱらぱら見て「自分がほしい本とは違うなあ」と思うことがあります。 また逆に「あ、こういう感じなら良いかも」と思う場合もあります。 これまでは、 書店に行かなければ「中身をぱらぱら見る」ことはできませんでしたが、 「なか見!検索」で出来るようになった、と。 自分と相性が良いことを確かめて買うのは大事ですよね。
結城の本はすべて「なか見!検索」対応になっていますので、 ぜひ、中身をぱらぱら見て、 相性が良いかどうかを確かめてご購入ください。 よろしくお願いいたします。
…と書いてから、 まだ対応していない本が何冊かあるのに気づきました (たとえば『改訂第2版Java言語プログラミングレッスン』はまだですね)。 申し訳ありません。 できるだけ早く対応できるように出版社さんにお願いしておきます。
あなたのご意見・感想をお送りください。 あなたの一言が大きなはげみとなりますので、どんなことでもどうぞ。