単純化しすぎると非現実的になる場合、 ほどほどにしたほうがいいのかも。
考え直してみるとこの手間は、 処理を遅延すれば柔軟になるかわりに面倒になるという話かも知れない。
これは persistent なのを扱わなくてもそうなので、 persistent なぶん(もともと柔軟性に乏しいぶん)柔軟性の上がりかたが大きいだけ、 persistent なときに適用することに意味がある?
最近はマウスにボタンがたくさんついているのは珍しいことではないらしい。
いまここにあるのもそうで、普通の wheel mouse としての入力に加え、 さらに側面に 2つボタンがついている。
側面のボタンは Windows では (すくなくとも) IE でページを戻ったり進めたりするのに使える。
さて、このボタンを X (XFree86) で使えるか?
いろいろと調べるとどうやら使えるらしく、たしかに設定すると使えた。
普通の wheel mouse としてのボタンが (wheel の回転も数えれば) 5つ、 加えて側面に 2つあるので、計 7ボタンである。 だが、記憶によれば、X protocol は 5ボタンが最大と聞いたことがあるような気がする。
気になったので調べてみると、少なくとも ButtonPress や ButtonRelease の detail は BUTTON でつまり CARD8 なので、256 (255?)までいけるようだ。
5つまでなのは BUTMASK で、これは modifier のように使うときのものらしい。
とすると、ボタンを押しながら操作をする、 というようなのを指定するときに、ボタン6 以降は使えないということか。
すぱすぱ
ちょっと思ったのだが、 作品名がひらがな4文字の作品をリストアップできないだろうか?
Y.A.S.D. を If-Modified-Since: つきでアクセスするとエラーになるのを調べる。
% ruby -rnet/http -e ' Net::HTTP.start("RogueLife.org") {|http| http.get("/diary/", {"If-Modified-Since"=>"Fri, 30 May 2003 11:20:55 GMT"}) } ' /home/akr/ruby/lib/ruby/1.8/net/protocol.rb:184:in `sysread': End of file reached (EOFError) from /home/akr/ruby/lib/ruby/1.8/net/protocol.rb:184:in `rbuf_fill' from /home/akr/ruby/lib/ruby/1.8/net/protocol.rb:160:in `readuntil' from /home/akr/ruby/lib/ruby/1.8/net/protocol.rb:171:in `readline' from /home/akr/ruby/lib/ruby/1.8/net/http.rb:1701:in `read_chunked' from /home/akr/ruby/lib/ruby/1.8/net/http.rb:1680:in `read_body_0' from /home/akr/ruby/lib/ruby/1.8/net/http.rb:1663:in `read_body' from /home/akr/ruby/lib/ruby/1.8/net/http.rb:859:in `get' from /home/akr/ruby/lib/ruby/1.8/net/http.rb:858:in `request' from /home/akr/ruby/lib/ruby/1.8/net/http.rb:941:in `reading_body' from /home/akr/ruby/lib/ruby/1.8/net/http.rb:941:in `request' from /home/akr/ruby/lib/ruby/1.8/net/http.rb:858:in `get' from -e:3 from -e:2:in `start' from /home/akr/ruby/lib/ruby/1.8/net/http.rb:661:in `start' from -e:2
debug-socket (改) を使って通信記録をとる。
RogueLife.org:80 0>"GET /diary/ HTTP/1.1\r\n" 22>"Accept: */*\r\n" 35>"Host: RogueLife.org\r\n" 56>"If-Modified-Since: Fri, 30 May 2003 11:20:55 GMT\r\n" 106>"\r\n" 0<"HTTP/1.1 200 OK\r\n" 17<"Date: Tue, 03 Jun 2003 05:32:01 GMT\r\n" 54<"Server: Apache/1.3.27 (Unix) DAV/1.0.3 mod_jk/1.1.0 PyApache/4.26\r\n" 121<"Last-Modified: Fri, 30 May 2003 11:20:55 GMT\r\n" 167<"Transfer-Encoding: chunked\r\n" 195<"Content-Type: text/html; charset=ISO-2022-JP\r\n" 241<"\r\n" 243<"e75\r\n" 248<"<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"\n" 311<" \"http://www.w3.org/TR/html4/loose.dtd\">\n" 358<"<html lang=\"ja\">\n" 375<"<head>\n" 382<"<title>TSUMURA,Tomoaki: Y.A.S.D. (last 5days)</title>\n" 436<"<link rev=\"MADE\" href=\"&\#109;&\#97;&\#105;&\#108;&\#116;&\#111;&\#58;&\#116;&\#115;&\#117;&\#109;&\#117;&\#114;&\#97;&\#64;&\#116;&\#111;&\#109;&\#111;&\#46;&\#103;&\#114;&\#46;&\#106;&\#112;\">\n" 606<"<link rel=\"Prev\" href=\"/%7Etsumura/\">\n" 644<"<link rel=\"stylesheet\" type=\"text/css\" href=\"./yasd.css\">\n" 702<"<link rel=\"shortcut icon\" href=\"./yasd-favicon.ico\">\n" 755<"<meta http-equiv=\"Content-Type\" content=\"text/html; charset=ISO-2022-JP\">\n" 829<"<meta http-equiv=\"Content-Style-Type\" content=\"text/css\">\n" 887<"<meta name=\"date\" content=\"2003-05-30T11:20:55+00:00\">\n" 942<"</head>\n" 950<"<body>\n" 957<"<h1 lang=\"en\">Y.A.S.D. <span style=\"color: \#386; font-size: medium;" 1024<"\">(http://RogueLife.org/diary/)</span></h1>\n" 1068<"<p>\e$B$3$3$K=q$+$l$F$$$k$b$N$O!$;d\e(B(\e$BDEM8\e(B)\e$B$N;dE*J8>O$G$\"$j!$\e(B\n" 1142<"\e$B;d$,=jB0$9$kCDBN!&%0%k!<%W$J$I$N0U8~$H$O0l@Z4X78$,$\"$j$^$;$s!\#\e(B</p>\n" 1215<"<p>\e$BFbMF$O!$\e(B\n" 1233<"<a href=\"http://Solaris.RogueLife.org/\">Solaris</a>,\n" 1286<"<a href=\"http://www.lab3.kuis.kyoto-u.ac.jp/%7Etsumura/emacs/\">Emacsen</a> \n" 1362<"(<a href=\"http://www.lab3.kuis.kyoto-u.ac.jp/%7Etsumura/emacs/wl.html\">Wanderlust</a>),\n" 1450<"<a href=\"http://games.RogueLife.org/\">Roguelike</a>,\n" 1503<"<a href=\"http://www.lab3.kuis.kyoto-u.ac.jp/%7Etsumura/riders/\">\e$B%i%$%@!<%:\e(B</a>,\n" 1589<"\e$B$^$s$,\e(B, \e$B>.@b\e(B, \e$B$J$I$G$7$g$&\e(B...\e$B$?$V$s!\#\e(B\n" 1651<"Web page \e$B$+$i$N\e(B link \e$B$O\e(B \e$B$4<+M3$K$7$F$$$?$@$$$F9=$$$^$;$s$,!$\e(B\n" 1730<"mailing list \e$BEy$X$NL5CG0zMQ$O6`$s$G$*CG$j$7$^$9!\#\e(B\n" 1786<"(\e$B\"*\e(B <a href=\"\#search\">\e$BA4J88!:w\e(B</a>)</p>\n" 1838<"<div>\e$B!V\e(BSolaris+\e$B2rA|EYJQ99!W$N8!:w$GMh$A$c$C$??M$O\e(B\n" 1900<"<a href=\"http://Solaris.RogueLife.org/usr/lib/fbconfig/\">\e$B\"*$3$A$i\e(B</a><br>\n" 1980<"\e$B!V\e(BSolaris+(ldconfig|crle)\e$B!W$N8!:w$GMh$A$c$C$??M$O\e(B\n" 2042<"<a hre" 2048<"f=\"http://Solaris.RogueLife.org/usr/ccs/bin/ld.xhtml\">\e$B\"*$3$A$i\e(B</a></div>\n" 2127<"<div align=\"right\"><img alt=\"[Y.A.S.D. (Yet Another Scripts for Diary) v.0.69999]\"\n" 2210<"src=\"img/yasdlogo.png\" border=\"0\"> <a href=\"http://Solaris.RogueLife.org/\"><img\n" 2290<"src=\"http://Solaris.RogueLife.org/img/Solaris.RogueLife.png\"\n" 2351<"alt=\"[Solaris.RogueLife.org]\" border=\"0\"></a>\n" 2397<"<a href=\"http://games.RogueLife.org/\"><img\n" 2440<"src=\"http://games.RogueLife.org/img/defbanner.png\"\n" 2491<"alt=\"[RogueLike@lab3]\" border=\"0\"></a></div>\n" 2536<"<div class=\"index\">\n" 2556<"[<a href=\"/%7Etsumura/\" class=\"idxitem\">TOP</a>]\n" 2605<"-- [<strong>Y.A.S.D.</strong>]\n" 2636<"-- [<a href=\"whatsyasd.html\" class=\"idxitem\">What's Y.A.S.D.?</a>]</div>\n" 2709<"<hr>\n" 2714<"<p><span class=\"minititle\">.plan</span><br>\n" 2758<"<samp>07/18(Fri)</samp> Sohi\e$B@h@8\e(B \e$B9V1i\e(B<br>\n" 2812<"<samp>06/30(Mon)</samp> <span class=\"deadline\">\e$BK?8xJg!:@Z\e(B</span> (\e$BM9AwI,Ce\e(B)<br>\n" 2904<"<samp>06/26(Thu)</samp> [\e$B$^\e(B] \e$BL5E(4GHDL<\e(B(4) \e$BH/Gd\e(B<br>\n" 2974<"<samp>06/19(Thu)</samp> [\e$B$^\e(B] ORANGE(9) \e$BH/Gd\e(B<br>\n" 3034<"<samp>06/12(Thu)</samp> [\e$B$^\e(B] \e$B" 3072<"?]$a$7\e(B(4) \e$BH/Gd\e(B<br>\n" 3100<"<samp>06/04(Wed)</samp> [\e$B%@\e(B] \e$BHs>o6P9V;U46<U$N2q\e(B<br>\n" 3164<"</p>\n" 3169<"<p class=\"tvsched\"><span class=\"minititle\">TV Program</span><br>\n" 3234<"<samp>06/07(<span class=\"saturday\">Sat</span>)</samp> [BS2] 22:30 \e$BCK$?$A$NN9O)\e(B(2-3)<br>\n" 3328<"</p>\n" 3333<"<hr>\n" 3338<"\n" 3339<"<h2 lang=\"en\"><a class=\"h2\" href=\"./?2003&05\#30\" name=\"30\" id=\"30\">2003/05/30</a>\n" 3425<"<a class=\"h2\" name=\"20030530\" id=\"20030530\">(Fri)</a></h2>\n" 3484<"\n" 3485<"<h3 class=\"yasd\"><img src=\"img/title.png\" alt=\"@\" align=\"top\">\n" 3548<"<a class=\"h3\" name=\"30_nd\" id=\"30_nd\" href=\"./?2003&05\#30_nd\">\e$B<!$O\e(B</a></h3>\n" 3634<"<p>\e$B$^$:?9NSF19%2q$r$I$&$K$+$7$F!$$\"$H8xJg!\#\e(B</p>\n" 3688<"\n" 3689<"<h3 class=\"yasd\"><img src=\"img/title.png\" alt=\"@\" align=\"top\">\n" 3752<"<a class=\"h3\" name=\"30_s\" id=\"30_s\" href=\"./?2003&05\#30_s\">\e$B$?$@$$$^\e(B</a></h3>\n" 3839<"<p>\e$B$+$($j$^$7$?!\#\e(BK\e$BED$5$s$K$b\e(BO\e$BLn$5$s$K$b\e(BA\e$BLZ$5$s$K$b\e(BK\e$B6M$K$b2q$($F3Z$7$+$C$?!\#\e(B</p>\n" 3949<"\r\n" 3951<"94\r\n" 3955<"\n" 3956<"<h3 class=\"yasd\"><img src=\"img/title.png\" alt=\"@\" align=\"top\">\n" 4019<"<a class=\"h3\" name=\"30_ss\" id=\"30_ss\" href=\"./?2003&05\#30_ss\">StarSuite</" 4096<"a></h3>\r\n" 4105<"fd3\r\n" 4110<"\n" 4111<"<p>\e$B$H$$$&$o$1$G!$\e(B6.1b2 Impress \e$B$GH/I=$7$?$N$O;d$,=i$a$F$N%O%:\e(B(\e$BFf\e(B)\e$B!\#\e(B\n" 4203<"\e$B$H$3$m$G\e(B 6.1b2/Windows \e$B$G\e(B PDF \e$B=q$-=P$7$7$?$i!$%l%$%\"%&%H$,$?$,$?\e(B\n" 4286<"\e$B$K$J$C$?!\#!V%\#!W$H$+>e$K$:$l$A$c$&$N!\#\e(B6.1b1/SPARC \e$B$G$O$9$/$J$/$H$b\e(B\n" 4365<"\e$B$=$s$J$3$H$J$+$C$?$s$@$,!\#$C$F!$!VF1$8\e(B version \e$B$+$D\e(B \e$B0c$&\e(B platform\e$B!W$G\e(B\n" 4459<"\e$B3S$Y$F$J$$$N$G>pJsNL$J$7$+$b!\#\e(B</p>\n" 4500<"<hr>\n" 4505<"\n" 4506<"\n" 4507<"<h2 lang=\"en\"><a class=\"h2\" href=\"./?2003&05\#26\" name=\"26\" id=\"26\">2003/05/26</a>\n" 4593<"<a class=\"h2\" name=\"20030526\" id=\"20030526\">(Mon)</a></h2>\n" 4652<"\n" 4653<"<h3 class=\"yasd\"><img src=\"img/title.png\" alt=\"@\" align=\"top\">\n" 4716<"<a class=\"h3\" name=\"26_sh\" id=\"26_sh\" href=\"./?2003&05\#26_sh\">\e$BGc\e(B</a></h3>\n" 4800<"<ul>\n" 4805<" <li><a href=\"http://tankosha.topica.ne.jp/booksorjp/ISBN4-473-01989-6.html\">\e$B>P$o$;$F>P$o$;$F\e(B \e$B!=\e(B \e$B7K;^?}\e(B</a> (\e$BC88r<R\e(B)</li>\n" 4951<"</ul>\n" 4957<"\n" 4958<"<h3 class=\"yasd\"><img src=\"img/title.png\" alt=\"@\" align=\"top\">\n" 5021<"<a class=\"h3\" name=\"26_t\" id=\"26_t\" href=\"./?2003&05\#26_t\">\e$B$C$F$$$&$+\e(B</a></h3>\n" 5110<"<p>\e$B$o$?$7$c\e(B \e" 5129<"$B$3$s$J$3$H$d$C$F$k>l9g$8$c$J$$$h!\#\e(B</p>\n" 5173<"\n" 5174<"<h3 class=\"yasd\"><img src=\"img/title.png\" alt=\"@\" align=\"top\">\n" 5237<"<a class=\"h3\" name=\"26_web\" id=\"26_web\" href=\"./?2003&05\#26_web\">\e$B:rF|\e(B</a></h3>\n" 5326<"<p>\e$B$a$0$5$^\e(B \e$B$N$*%K%e!<%Q%=%3%sIJDj$a!\#\e(B\n" 5377<"\e$B$a$0$5$^\e(B \e$B$N$b$H!$C+@n2VE9\e(B \e$B$H\e(B Papamusu \e$B$N\e(B web \e$B%W%m%8%'%/%H;OF0$9$k!\#\e(B(?)</p>\n" 5482<"\n" 5483<"<h3 class=\"yasd\"><img src=\"img/title.png\" alt=\"@\" align=\"top\">\n" 5546<"<a class=\"h3\" name=\"26_dvd\" id=\"26_dvd\" href=\"./?2003&05\#26_dvd\">GV-MPG3TV/PCI</a></h3>\n" 5638<"<p>mAgicTV \e$B$G=q$-$@$7$?\e(B mpeg \e$B$N:F%(%s%3$,\e(B\n" 5692<"\e$B$G$-$J$$\e(B<a href=\"./?2003&02\#02_dvd\">\e$B7o\e(B</a>\e$B!$\e(B\n" 5759<"<a href=\"http://www.yuan.com.tw/japanese/tech_drive.htm\">YUAN \e$B$N\e(B driver MPG160 \e$B$H\e(B DVD Encoder</a> \e$B;H$C$FO?2h$7$?\e(B mpeg \e$B$J$iLdBj$J$+$C$?$h!\#\e(B\n" 5922<"mAgicTV \e$B$H\e(B I\e$B!&\e(BO \e$B$N\e(B driver \e$B$,Ie$C$F$?$C$F$3$H$G$9$+\e(B...\e$B!\#\e(B</p>\n" 6012<"<hr>\n" 6017<"\n" 6018<"\n" 6019<"<h2 lang=\"en\"><a class=\"h2\" href=\"./?2003&05\#24\" name=\"24\" id=\"24\">2003/05/24</a>\n" 6105<"<a class=\"h2\" name=\"20030524\" id=\"20030524\">(<sp" 6153<"an class=\"saturday\">Sat</span>)</a></h2>\n" 6194<"\n" 6195<"<h3 class=\"yasd\"><img src=\"img/title.png\" alt=\"@\" align=\"top\">\n" 6258<"<a class=\"h3\" name=\"24_tv\" id=\"24_tv\" href=\"./?2003&05\#24_tv\">tv</a></h3>\n" 6336<"<p><a href=\"http://www.4nin.com/live/vs0204/tv/2003/post_pub2.html\">\e$B!V%i%$%V40A4HG\e(B!\e$B;M?MSr;R!W\e(B</a>\e$B!$4XEl$N$_$+$h\e(B!! <kbd>(;_;</kbd></p>\n" 6488<"\n" 6489<"<h3 class=\"yasd\"><img src=\"img/title.png\" alt=\"@\" align=\"top\">\n" 6552<"<a class=\"h3\" name=\"24_m\" id=\"24_m\" href=\"./?2003&05\#24_m\">...</a></h3>\n" 6628<"<p>\e$B>.86XFFs$,\e(B \e$B$\"$,$?\e(B \e$B%U%!%s$@$H$$$&$3$H$O!$\e(B\n" 6690<"\e$B!VhA2hJs!W$O!VhA309q!W$+$i$H$C$F$$$?$N$+$b!$\e(B\n" 6741<"\e$B$H$+\e(B \e$B$/$@$i$J$$$3$H$r;W$C$?$j!\#\e(B</p>\n" 6789<"<hr>\n" 6794<"\n" 6795<"\n" 6796<"<h2 lang=\"en\"><a class=\"h2\" href=\"./?2003&05\#21\" name=\"21\" id=\"21\">2003/05/21</a>\n" 6882<"<a class=\"h2\" name=\"20030521\" id=\"20030521\">(Wed)</a></h2>\n" 6941<"\n" 6942<"<h3 class=\"yasd\"><img src=\"img/title.png\" alt=\"@\" align=\"top\">\n" 7005<"<a class=\"h3\" name=\"21_uri\" id=\"21_uri\" href=\"./?2003&05\#21_uri\">URIs</a></h3>\n" 7088<"<ul>\n" 7093<" <li><a href=\"http://www.peritek.com/news_argus_solaris_video.htm\">Peritek Adds Sola" 7177<"ris Video Digitizing Software Support to High Performance Dual-Head Graphics/Video Capture PMC Card</a></li>\n" 7286<" <li><a href=\"http://www.eweek.com/article2/0,3959,1091772,00.asp\">More Partitioning in the Works for Solaris 10</a> (eWeek)</li>\n" 7416<" <li><a href=\"http://www.opensource.org/sco-vs-ibm.html\">OSI Position Paper on the SCO-vs.-IBM Complaint</a></li>\n" 7530<"</ul>\n" 7536<"<hr>\n" 7541<"\n" 7542<"\n" 7543<"<h2 lang=\"en\"><a class=\"h2\" href=\"./?2003&05\#17\" name=\"17\" id=\"17\">2003/05/17</a>\n" 7629<"<a class=\"h2\" name=\"20030517\" id=\"20030517\">(<span class=\"saturday\">Sat</span>)</a></h2>\n" 7718<"\n" 7719<"<h3 class=\"yasd\"><img src=\"img/title.png\" alt=\"@\" align=\"top\">\n" 7782<"<a class=\"h3\" name=\"17_uri\" id=\"17_uri\" href=\"./?2003&05\#17_uri\">URIs</a></h3>\n" 7865<"<dl class=\"uri\">\n" 7882<" <dt><a href=\"http://www.tiem.utk.edu/~peek/software/solaris/make-dtlogin/\">make-dtlogin :: HOWTO: Add Non-CDE Window Managers to CDE's Dtlogin</a></dt>\n" 8035<" <dd>\e$B;d$O\e(B <a href=\"./?2002&01\#11_sol\">$XINITRC \e$B;H$C$F\e(B</a>\n" 8105<" \"exec ssh-agent wmaker\" \e$B$7$F$k$+$iITMW$@$1$I!$\e(B\n" 8161<"\r\n" 8163<"4c\r\n" 8167<" \e$B;d$_$?$$$K!V\e(BGNOME\e$B$$$i$" 8201<"s$1$I\e(BCDE\e$B$b7y!W$J?M$K$OJXMx$+$b!\#\e(B\n" 8243<"\r\n" 8245<"ea9\r\n" 8250<" \e$BL$$@$K!$$o$6$o$6\e(BGNOME\e$B$N>e$G\e(B window manager \e$B$rF0$+$94r$7$5$,\e(B\n" 8331<" \e$BJ,$+$C$F$J$$;d!\#\e(B</dd>\n" 8362<" <dt>Sun Fire <a href=\"http://www.sun.com.au/products/servers/entry-level_servers/sun_fire_v60x_server.html\">V60x</a> / <a href=\"http://www.sun.com.au/products/servers/entry-level_servers/sun_fire_v65x_server.html\">V65x</a>\n" 8586<" (sun.com.au)</dt>\n" 8607<" <dd>Xeon\e$B$+$h!\#\e(B</dd>\n" 8634<" <dt><a href=\"http://www.forbes.com/business/2003/05/12/cx_ld_0512sunw.html\">Sun Micro Fights Back After Caustic Report</a> (Forbes.com)</dt>\n" 8776<" <dd>\e$B$O$F$5$F!\#\e(B</dd>\n" 8803<" <dt><a href=\"http://www.eweek.com/article2/0,3959,1090214,00.asp\">Sun Cuts Midrange Unix Server Price</a> (eWeek)</dt>\n" 8923<" <dt>Interview series with Jonathan Schwartz (<a\n" 8972<" href=\"http://www.alwayson-network.com/printpage.php?id=337_0_1_0\">Part1</a>,\n" 9052<" <a href=\"http://www.alwayson-network.com/printpage.php?id=338_0_1_0\">Part2</a>,\n" 9135<" <a href=\"http://www.alwayson-network.com/printpage.php?id=340_0_1_0\">Part3</a>) (Always" 9225<"On)</dt>\n" 9234<" <dd>\e$B!V\e(BPart2: Solaris v.s. Linux\e$B!W$O!$\e(B\n" 9285<" \e$B$Y$D$K!V\e(Bv.s.\e$B!W$8$c$J$$$M!\#\e(B</dd>\n" 9332<" <dt><a href=\"http://www.nwfusion.com/news/2003/0514sunpreac.html\">Q&A with Sun: Sun Preaches blade servers</a> (NetworkWorldFusion)</dt>\n" 9474<"</dl>\n" 9480<"\n" 9481<"<h3 class=\"yasd\"><img src=\"img/title.png\" alt=\"@\" align=\"top\">\n" 9544<"<a class=\"h3\" name=\"17_sun\" id=\"17_sun\" href=\"./?2003&05\#17_sun\">FEH\e$B$C$F!$\e(B</a></h3>\n" 9638<"<p>SunSolve\n" 9650<"\e$B$K\e(B<a href=\"http://sunsolve.sun.com/handbook_pub/\">\e$B0\\$C$F$?\e(B</a>\e$B$N$+\e(B...\e$B!\#\e(B\n" 9746<"\e$BL>A0$bJQ$o$C$F$k!\#\e(B</p>\n" 9775<"<hr>\n" 9780<"\n" 9781<"<p><span class=\"minititle\">Back Number</span> <br>\n" 9832<"<strong>1998</strong> : Jan, Feb, Mar, Apr, May, Jun, Jul, <a href=\"./?1998&08\">Aug</a>, <a href=\"./?1998&09\">Sep</a>, <a href=\"./?1998&10\">Oct</a>, <a href=\"./?1998&11\">Nov</a>, <a href=\"./?1998&12\">Dec</a><br>\n" 10064<"<strong>1999</strong> : <a href=\"./?1999&01\">Jan</a>, <a href=\"./?1999&02\">Feb</a>, <a href=\"./?1999&03\">Mar</a>, <a href=\"./?1999&04\">Apr</a>, <a href=\"./?1999&05\">" 10249<"May</a>, <a href=\"./?1999&06\">Jun</a>, <a href=\"./?1999&07\">Jul</a>, <a href=\"./?1999&08\">Aug</a>, <a href=\"./?1999&09\">Sep</a>, <a href=\"./?1999&10\">Oct</a>, <a href=\"./?1999&11\">Nov</a>, <a href=\"./?1999&12\">Dec</a><br>\n" 10499<"<strong>2000</strong> : <a href=\"./?2000&01\">Jan</a>, <a href=\"./?2000&02\">Feb</a>, <a href=\"./?2000&03\">Mar</a>, <a href=\"./?2000&04\">Apr</a>, <a href=\"./?2000&05\">May</a>, <a href=\"./?2000&06\">Jun</a>, <a href=\"./?2000&07\">Jul</a>, <a href=\"./?2000&08\">Aug</a>, <a href=\"./?2000&09\">Sep</a>, <a href=\"./?2000&10\">Oct</a>, <a href=\"./?2000&11\">Nov</a>, <a href=\"./?2000&12\">Dec</a><br>\n" 10934<"<strong>2001</strong> : <a href=\"./?2001&01\">Jan</a>, <a href=\"./?2001&02\">Feb</a>, <a href=\"./?2001&03\">Mar</a>, <a href=\"./?2001&04\">Apr</a>, <a href=\"./?2001&05\">May</a>, <a href=\"./?2001&06\">Jun</a>, <a href=\"./?2001&07\">Jul</a>, <a href=\"./?2001&08\">Aug</a>, <a href=\"./?2001&09\">Sep</a>, <a href=\"" 11273<"./?2001&10\">Oct</a>, <a href=\"./?2001&11\">Nov</a>, <a href=\"./?2001&12\">Dec</a><br>\n" 11369<"<strong>2002</strong> : <a href=\"./?2002&01\">Jan</a>, <a href=\"./?2002&02\">Feb</a>, <a href=\"./?2002&03\">Mar</a>, <a href=\"./?2002&04\">Apr</a>, <a href=\"./?2002&05\">May</a>, <a href=\"./?2002&06\">Jun</a>, <a href=\"./?2002&07\">Jul</a>, <a href=\"./?2002&08\">Aug</a>, <a href=\"./?2002&09\">Sep</a>, <a href=\"./?2002&10\">Oct</a>, <a href=\"./?2002&11\">Nov</a>, <a href=\"./?2002&12\">Dec</a><br>\n" 11804<"<strong>2003</strong> : <a href=\"./?2003&01\">Jan</a>, <a href=\"./?2003&02\">Feb</a>, <a href=\"./?2003&03\">Mar</a>, <a href=\"./?2003&04\">Apr</a>, <a href=\"./?2003&05\">May</a> \n" 11998<"</p>\n" 12003<"\r\n" 12005<"358\r\n" 12010<"\n" 12011<"<h3 class=\"yasd\"><img src=\"img/title2.png\" alt=\"-\" align=\"middle\">\n" 12078<"<a class=\"h3\" name=\"search\" id=\"search\">\e$BA4J88!:w$9$k\e(B</a></h3>\n" 12146<"<p>Match \e$B7o?t$,1&$N?t;z$rD6$($?>l9g!$:GBg$=$N?t\e(B (\e$B:G?7$+$i=g\e(B) \e$B$7$+\e(B\n" 12230<"\e$BI=<($5$l$^$;$s!\#$^$?!$8!:w8l$O\e(B 1\e$B8l\e(B \e$B$7$+F~NO$G$-$^$;$" 12297<"s!\#\e(B\n" 12304<"\e$B<jH4$-$G$9\e(B, \e$B$($(<jH4$-$G$9$H$b$5\e(B! (\e$B%0%`\e(B!)</p>\n" 12368<"<form method=\"GET\" action=\"./s.py\" class=\"yasd\">\n" 12417<"(1)KeyWord\n" 12428<"<input type=\"TEXT\" name=\"key\" size=\"30\" value=\"\"\n" 12477<" tabindex=\"1\" accesskey=\"W\">\n" 12512<"<input type=\"SUBMIT\" name=\"submit\" value=\"(2)Search\"\n" 12565<" tabindex=\"2\" acce" 12589<"sskey=\"X\">\n" 12600<"<input type=\"RESET\" name=\"reset\" value=\"(3)Clear\"\n" 12650<" tabindex=\"3\" accesskey=\"R\">\n" 12685<"(4)Num\n" 12692<"<select name=\"max\" tabindex=\"4\">\n" 12725<" <option value=\"10\">10 <option selected value=\"20\">20\n" 12779<" <option value=\"30\">30 <option value=\"50\">50 <option value=\"100\">100\n" 12848<"</select>\n" 12858<"</form>\n" 12866<"\r\n" 12868<"4bc\r\n" 12873<"\n" 12874<"<hr>\n" 12879<"<div class=\"index\">\n" 12899<"[<a href=\"/%7Etsumura/\" class=\"idxitem\">TOP</a>]\n" 12948<"-- [<strong>Y.A.S.D.</strong>]\n" 12979<"-- [<a href=\"whatsyasd.html\" class=\"idxitem\">What's Y.A.S.D.?</a>]</div>\n" 13052<"<div align=\"right\">\n" 13072<"<a href=\"http://RogueLife.org/px-window.xhtml\"><img\n" 13124<"src=\"/img/px/px-window-button.png\" alt=\"[PX-WINDOW]\" border=\"0\"></a>\n" 13193<"<a href=\"http://www.catnet.ne.jp/masumi/syouten.html\"><img\n" 13252<"src=\"/img/masubi.png\" alt=\"[Masubi]\" border=\"0\"></a>\n" 13305<"<!--a href=\"http://www.pythonlabs.com/\"><img\n" 13350<"alt=\"[by Python]\" src=\"img/but_scale_plain.png\" border=\"0\" align=\"top\"></a-->\n" 13428<"<a href=\"http://python.jp/\"><img\n" 13461<"alt=\"[PyJUG]\" src=\"/img/pyjug88x31a.jpg\" border=\"0\" align=\"top\"></a>\n" 13530<"</div>\n" 13537<"<div>Copyright &\#169; 1998-2003 TSUMURA,Tomoaki</div>\n" 13591<"<address>\n" 13601<"<img src=\"/%7Etsumura/img/tsumura.png\" alt=\"\e$BM8\e(B\" align=\"top\"><a\n" 13670<"href=\"&\#109;&\#97;&\#105;&\#108;&\#116;&\#111;&\#58;&\#116;&\#115;&\#117;&\#109;&\#117;&\#114;&\#97;&\#64;&\#116;&\#111;&\#109;&\#111;&\#46;&\#103;&\#114;&\#46;&\#106;&\#112;\">&\#116;&\#115;&\#117;&\#109;&\#117;&\#114;&\#97;&\#64;&\#116;&\#111;&\#109;&\#111;" 13892<"&\#46;&\#103;&\#114;&\#46;&\#106;&\#112;</a></address>\n" 13941<"\n" 13942<"</body></html>\n" 13957<"<!--\n" 13962<"HTTP/1.1 200 OK\r\n" 13979<"Date: Tue, 03 Jun 2003 05:32:01 GMT\r\n" 14016<"Server: Apache/1.3.27 (Unix) DAV/1.0.3 mod_jk/1.1.0 PyApache/4.26\r\n" 14083<"\r\n" 14085<"\r\n"
ふむ。If-Modified-Since と Last-Modified が同じなのにコンテンツが返って来るのは変だがそれはおいておくとして、 ケツになんか変なヘッダらしきものがついているのも変だがそれもおいておくとして、 EOFError の直接的な原因は正しくない chunked らしい。
12868<"4bc\r\n" 12873<"\n" ... 13892<"&\#46;&\#103;&\#114;&\#46;&\#106;&\#112;</a></address>\n" 13941<"\n" 13942<"</body></html>\n" 13957<"<!--\n" 13962<"HTTP/1.1 200 OK\r\n" 13979<"Date: Tue, 03 Jun 2003 05:32:01 GMT\r\n" 14016<"Server: Apache/1.3.27 (Unix) DAV/1.0.3 mod_jk/1.1.0 PyApache/4.26\r\n" 14083<"\r\n" 14085<"\r\n"
最後のところはこんな感じだが、 12873 + 0x4bc = 14085 なので、12873 から 14085 までが chunk-data で、 その直後の CRLF までで chunk をなしているところまでは正しい。 だが、chunk のつぎには chunk か last-chunk があるはずなわけで、 それを読もうとしてしばらく待ち、 結局そんなものは来ずに EOF が来て EOFError になるという顛末の模様。
なぜ EOF が来てしまうかというと、 どうやらサーバはすでにデータを正しく送り終ったと思い込んでいるようで、 次のリクエストが来なくてタイムアウトしているらしい。 実際、telnet で会話して、タイムアウトする前に次のリクエストを送ると ちゃんと答えてくれる。
それはそれとして、コンテンツの最後に <!-- がついているのは 変なヘッダがつくのに対する対処のような気がするので たぶん当人は承知しているのであろう。
さて、net/http のマニュアルを見ると、 EOFError が発生する可能性があるとは書いていないようだ。
まぁ、EOFError が発生し得ることは分かったのでいいとして、 他に発生し得る例外はあるだろうか?
コバルト文庫の新刊が出ている。
ふむ。いつもに比べて発売日が遅いような気がする。
info-cvs で principle of least surprise といってる人がいるなぁ。
Web アプリケーションにおけるセッションキーの漏洩の話があるが、 実装言語の統計はあるだろうか?
たとえば、PHP だと少なかったりしないのだろうか?
セッションキーなんて、 工夫すれば十分にライブラリで隠蔽できると思うのだが、 独創的な(危険な)やりかたで使われるのは、 適切なライブラリが用意されていないからではないだろうか?
ここで「適切」というのは、cookie などを生で使うよりも 多くのケースで簡単、お気楽に使え、かつ、安全なようなものである。 そういうライブラリがあれば、 典型的な(怠惰な)プログラマがライブラリを使うように誘導でき、 かなり安全になるのではないだろうか。 そういうデザインは不可能だろうか?
root でしか使えないもの(mknod, chroot, setgroups, etc.)は POSIX の範囲外なのかぁ。
... うが。mknod は XSI として載ってるか。
Hash の等しさについて考える。
... Hash の key として Hash を使うことについて考える。
... うぅむ、難しい。
そもそもは、deep copy が ちゃんと deep copy になっているかどうかを調べたいわけである。
対象はとりあえず Fixnum と String と Array と Hash を テキトーに組み合わせたオブジェクトとしよう。 また、とりあえずデータの構造は木構造と仮定しよう。
それなら == でいいじゃないか、というのはアサハカで、
% ruby -e 'p({{}=>0} == {{}=>0})' false
というような例がある。さらに、
% ruby -e 'p({{}=>0,{}=>1} == {{}=>1,{}=>0})' false
なんて例もある。どうしたらいいか?
本屋にいくと、電撃文庫が出ている。
何冊か買うわけだが、買い逃しを避けるため、 (折込広告や帯の)新刊のリストをチェックすることにしている。
一冊手に取って帯を見ると... ぴぴるぴるぴるぴぴるぴ〜♪
その本屋はライトノベルもビニールをかけているため、 折込広告を見ることが出来ず、 チェックするために他のを手に取る必要があったということだけ記しておこう。
なお、詳説正規表現第2版も買ってしまい、 文庫とあわせて万札が消えてしまった。
deep copy というのは、 同じ構造を作り上げたものであるから、 データをラベルつきグラフとみなすと、 構造が同じというのはグラフの同型性を判定することに帰着する。
とすると、グラフ間の写像を求めることができれば、 うまく deep copy できているというわけだ。
Hash は key-value pair の集合とみなせるので、 ふたつの集合の対応をとればよい。 複数の(最悪 n! の)対応を試さないといけないので、 backtrack してそれぞれの可能性を試していかないといけないが。
... 作ってみる。動いた。
これで Hash#{hash,eql?} を定義しなくてもテストできるようになった。
繰り返しテストをするわけであるが、何回目で失敗するかの頻度をプロットしてみる。
1: ****************************************** 2: ************************************** 3: ********************************************* 4: ****************************************************** 5: ****************************************** 6: ********************************** 7: ******************************************* 8: *************************** 9: ************************************ 10: ************************* 11: **************************** 12: ****************************** 13: *********************** 14: *********************** 15: ******************** 16: ******************* 17: *********************** 18: ******************** 19: ******************** 20: *************** 21: ****************** 22: ******************** 23: ************ 24: **************** 25: ***************** 26: *********** 27: ************* 28: ************** 29: ****************** 30: **************** 31: *********** 32: ******* 33: ** 34: ******** 35: ****************** 36: ***** 37: ******** 38: ***** 39: ******** 40: ** 41: ********* 42: ******** 43: ******** 44: **** 45: ****** 46: ***** 47: ******* 48: ******* 49: ***** 50: ****** 51: *** 52: ******* 53: **** 54: ******* 55: **** 56: * 57: **** 58: ** 59: ** 60: ***** 61: * 62: *** 63: * 64: ** 65: ** 66: ** 67: * 68: * 69: * 70: *** 71: ** 72: *** 73: * 74: * 75: * 76: * 77: ** 78: * 79: 80: ** 81: ** 82: * 83: ** 84: 85: 86: * 87: * 88: 89: * 90: * 91: ** 92: 93: 94: 95: 96: *** 97: 98: ** 99: *
同型性の検査はサイクルがあってもうまく動くように作ってしまったので、 つぎはランダムな構造のオブジェクトを生成するときに、 木じゃなくてグラフな構造にしたいところである。
どうやればランダムなグラフ構造のオブジェクトを簡単に生成できるだろう?
まぁ、bug fix されてからでいっか。
Cinderella is a software for doing geometry on the computer, and it is designed to be both mathematically robust and easy to use.
おや、 おくじさんが YAML に手を出している?
String#sum をはじめて使った。
HTML の一部分を取り出したい。 というか、取り出しかたを設定可能にしたい。
というわけで xpath が欲しくなり、 ちょうど commit されたこともあり REXML を使ってみる。 (HTML から XML への変換は Tidy を使う)
うぅむ。コード変換には要 uconv か。 まぁ、事前に変換しときゃいいということでそうする。
しばらく前からアンテナを(再度)作っているわけだが、 思いついて名前を samidare と決める。
アクセスを五月雨式に行うのが由来だが、 ちょうど梅雨なこともある。
304 OK という返事を返すサーバがあることを知る。
... publicfile か。
メッセージがユーザに提示されるときのことを考えると、 最新の情報がユーザに届いていることには違いないんだから、 200 と区別がつかなくてもいいという考え方はあるかも知れない。
でも、このメッセージはユーザに提示されるというよりは、 人間が生でつないで眺めるときのためのような気がするので、 数値とメッセージが対応しているほうがいいという考え方もあるかも知れない。
さて、どっちだろう?
東京 PRO 呑
東京 PRO
電撃HP
読んでいた連載がふたつおわる。
GET すると Last-Modified がついていないのに、 HEAD するとついているというケースがあることに気がつく。
さて、どうしたものか。
なつみかんはまず HEAD を試すのか。
自分が話したことの速記録というものをはじめて見る。
うぅむ。口調に違和感を感じる。 対談とかインタビューの記事で同じような口調を読んだことがあるように思える。 本当にこういう言い回しで喋っていたのだろうか?
YAML の y に気がつく。
テストを書くまでもなく問題があることは既に知っていたか。
あるディレクトリの下ぜんぶ、というものを表す記法には ** というのがある。
では、あるディレクトリの上ぜんぶ、というものを表す記法はあるか?
妖幻の血
お。3つも載っている。
「口を出さない」と宣言することは口を出したことになるだろうか?
という疑問を書くことは口を出したことになるだろうか?
という疑問を書くことは口を出したことになるだろうか?
... 以下無限に続く。
WEB+DB PRESS Vol.15 の CMS の話を読んでみる。
時系列に沿ってあるイベントが起きるとし、 そのイベントが起きる頻度がどのように変化しているかを調べたいとする。
よくやる方法は、一定期間(一日とか一時間とか)毎の イベントの回数を数え、ヒストグラムにするというものである。
さて、この一定期間というものはどう決定したらいいか? この期間が長すぎると測定したデータ全体がひとつの期間に入ってしまって変化がわからないし、 短すぎると各期間に高々ひとつしかイベントが入らないことになってやはり変化が分からない。
長すぎても短すぎてもいけないということは、 どこかに「最適な」期間があると予期させるものがあるが、 あるとしたらそれはどういうものだろうか?
また、一定期間毎に集計するという以外の方法はどのようなものがあるだろうか?
7/7 はポニーテールの日らしい。
文字コードの変換において発生し得るエラーにはどんなものがあるか考える。
文字コード X から文字コード Y に変換するということは、 X から仮想的になんでも表現できるユニバーサルな文字列に変換し、 そこからさらに Y に変換することだと考えられる。 文字列というよりは、X における文字の定義を並べたものというべきか。
前半の変換でエラーになるのは入力の byte 列が X として間違っている場合である。 (割り当てられていないコードポイントを使っている場合もあるか)
後半の変換でエラーになるのは文字が Y で表現できない場合である。
tidy で parse できない HTML に出会う。 (というか、自動修正に失敗してる?)
そのうち自前で HTML パーザを書こう。
割り当てられていないコードポイントが変換できないことは、 前半と後半のどちらの問題だろうか?
文字の定義が求められないという意味で前半の問題と考えるか、 未定義なものを表現できないという意味で後半の問題と考えるか。
そもそも、こういう迷いが生じるということは、 前半と後半にわけるという考え方自体に問題があるだろうか。
SF マガジン。
お、第六大陸の登場人物の顔が載っているな。
放射能マーク 168 放射線マーク 89 バイオハザードマーク 305
犬以外のポチ、猫以外のタマ、をリストアップするにはどうしたらいいだろうか?
と、ワニのポチが出て来るのを読みつつ考える。
goo の英和辞典(三省堂の EXCEED 英和辞典)に Emacs が載っていることに気がつく。
GNU も載っており、ちゃんと発音も書いてあって、g を発音することがわかる。
なお、vi は載っていない。
また、Tcl/Tk も載っているが、発音は書いていない。
qwerty で lisp と入力しようとして右手がひとつ左にずれて出て来た単語に眉をしかめる。
[latest]