/ 最近 .rdf 追記 設定 本棚

脳log[2006-07-09~]



2006年07月09日 (日)

[Firefox] ブラウザ、フォーカス、Tabキー

 タブキーでフォーカスが移動する先は現在表示されてる(フレームに収まってる)部分だけで良い。

あるページを読んでいる。読み進んでいく。「次のページへ」というリンクがある。タブキーを押す。ページがギュンッと巻き戻って一番最初のリンク*にフォーカスが移動する。さらにタブを押す、押し続ける。サイドバーのリンクを順にたどってフォーカスがページ下方へ移動していく。やがてまたもページが巻き戻る。今度は本文中のリンクを順に下方にたどっていく。やっと「次のページへ」にたどり着く。

今見ているリンクにフォーカスを合わそうとしているのに、フォーカスはとんでもないところに飛んでいく。タブキーを押すことによってスクロール位置が変わるのが非常にストレス。タブキーでフォーカスが移動する先は現在表示されてる(フレームに収まってる)部分だけで良い。

 tabindexを失念していた

HTML作成者が tabindexをリンクやフォームに割り振っていた場合 tabindexの小さい順にフォーカスが移動するのだった。tabindexが一つでも指定されていればそちらを優先すべきだな。(といっても、tabindexが指定されていて欲しいのは自分がよく使うページだけだけど。不特定の人に見せるのが目的のページで押し付けは良くない。)

tabindexはフォーカスの順番を決めるだけのものではないのだなぁ。

 これを機に Firefoxの拡張に手を出すか、ありもので間に合わすか。

ありものは↓。

Mouseless Browsingを使っているが Find As You Typeと競合するのでテンキーを Mouseless Browsing専用にしている。そうすると、テキストフィールドに数字を入力するのが不便(テンキーが使えないので)。

自前でやる場合、次にフォーカスを得るエレメントがどれなのかを自前で探すのは避けたいところ。それをするんだったら greasemonkeyで onblurを捕まえて、次にフォーカスを得るエレメントを順に辿っていって、最初に見つかったブラウザのフレーム内に収まってる(=見えている)エレメントを focus()すればいいはず。

* 普通はソーステキスト中に一番最初に登場したもの。tabindexが指定されていれば最小の tabindexを与えられたもの。


2006年07月04日 (火)

[]2点

  • [単行本] 桜庭 一樹【少女七竈と七人の可愛そうな大人】 角川書店
  • [コミック] 萩原 一至【BASTARD 24―暗黒の破壊神 (24) (ジャンプコミックス)】 集英社

 七竈

著者がインタビューで語ったところによると七竈を読んだ複数の人曰く「『エレンディラ』」らしいので先に、なぜか手許にある、1982年のノーベル文学賞を受賞した南米の作家ガルシア=マルケスの短編集『エレンディラ』に収録されている『無垢なエレンディラと無情な祖母の信じがたい悲惨の物語』を読むことにする。


2006年07月02日 (日)

[SQLite] EXPLAIN QUERY PLAN sql-statement;

知らない。知らないよこんな便利なコマンド。

EXPLAIN sql-statement;

ならドキュメントに載ってるけど、これが返すのは

0|Integer|5|0|
1|MustBeInt|0|0|
2|MemStore|0|0|
3|IfMemZero|0|25|
4|IfMemPos|0|8|
5|Pop|1|0|
……

みたいな SQLがコンパイルされた結果の、VMが逐一実行する命令のリストだから腰を据えないと解読できない。

それに対して

EXPLAIN QUERY PLAN sql-statement;

が返すのは

0|0|TABLE MyBooks USING PRIMARY KEY

みたいな、テーブルに対する問い合わせのリスト。インデックスが使われるのかどうかもわかる。

EXPLAIN QUERY PLANを発見
http://www.sqlite.org/cvstrac/tktview?tn=1878 (SQLite CVSTrac)
SQLite 3.2.6から追加された実験的なコマンドだって
http://www.sqlite.org/cvstrac/wiki?p=QueryPlans (SQLite CVSTrac)

2006年06月30日 (金)

[]3点。七竈、みつからない。

Amazonで「七竈」「七竃」「桜庭 一樹」「可愛そうな大人」、いずれを検索しても『少女七竈と七人の可愛そうな大人』は見つからない。ISBNで検索してやっと見つかる。4048737007。難儀なタイトルを付けたものだ。

と、そうではなくて、近所の本屋がだらしなくて 4軒まわっても本を見つけられなかった。Gyaoでドラマが配信されてる『少女には向かない職業』はその内の 3軒で平積みだったというのに。何故に新刊を隣に並べてまとめて売ろうとしない。

  • [コミック] 関崎 俊三【ああ探偵事務所 10 (10) (ジェッツコミックス)】 白泉社
  • [文庫] 本上 まなみ【ほんじょの鉛筆日和。 (新潮文庫 (ほ-14-2))】 新潮社
  • [文庫] 今野 緒雪【マリア様がみてる (仮面のアクトレス) (コバルト文庫 (こ7-49))】 集英社

2006年06月29日 (木)

ひつぐ、ほとぐ、すぐ、………………………、○○○ぐ。(勝った)

Rubyist Magazine - RubyKaigi2006特別号(6月10日 午前の部)より。

Ruby オンリーのカンファレンスを Ruby ゆかりの地・日本で開催できる喜びを寿ぎ*ました。

難易度高すぎ(笑) (゜Д゜;)ハッ!俺だけ?

* 再変換(ATOKの場合、文字入力が可能な場所で選択して Shift+変換)すると正解がわかる。


2006年06月27日 (火)

[]3点

  • [コミック] 高野 真之【BLOOD ALONE 3 (3) (電撃コミックス)】 メディアワークス
  • [コミック] 鈴木 みそ【銭 四巻 (ビームコミックス)】 エンターブレイン
  • [コミック] ととねみぎ【ねこきっさ (3) (まんがタイムKRコミックス) (まんがタイムきららコミックス)】 芳文社

2006年06月26日 (月)

[]4点

  • [コミック] 望月 奈々【ラブのま! (TENMA COMICS)】 茜新社
  • [["Video Games"]] ["SuperLite2000 アドベンチャー アカイイト"]
  • [単行本] 山下 伸夫【ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門】 ソフトバンククリエイティブ
  • [文庫] ジョナサン・キャロル【パニックの手 (創元推理文庫)】 東京創元社

[Ruby] REXML::Element#xpathがおかしい

 1. 適当なXMLファイルの各要素ごとに xpathを列挙して現象を確認

/ItemLookupResponse
/ItemLookupResponse/OperationRequest
/ItemLookupResponse/OperationRequest/HTTPHeaders
/ItemLookupResponse/OperationRequest/RequestId
/ItemLookupResponse/OperationRequest/Arguments
/ItemLookupResponse/OperationRequest/RequestProcessingTime
/ItemLookupResponse/OperationRequest/HTTPHeaders/Header
/ItemLookupResponse/OperationRequest/Arguments/Argument[1]
/ItemLookupResponse/OperationRequest/Arguments/Argument[1]
/ItemLookupResponse/OperationRequest/Arguments/Argument[1]
/ItemLookupResponse/OperationRequest/Arguments/Argument[1]
/ItemLookupResponse/OperationRequest/Arguments/Argument[1]
/ItemLookupResponse/OperationRequest/Arguments/Argument[1]
/ItemLookupResponse/OperationRequest/Arguments/Argument

pathが重複している。

 2. xpathの定義(rexml/element.rb)

    def xpath
      path_elements = []
      cur = self
      path_elements << __to_xpath_helper( self )
      while cur.parent
        cur = cur.parent
        path_elements << __to_xpath_helper( cur )
      end
      return path_elements.reverse.join( "/" )
    end

pathの各要素は __to_xpath_helperで取ってきている。

 3. __to_xpath_helperの定義(rexml/element.rb)

    def __to_xpath_helper node
      rv = node.expanded_name
      if node.parent
        results = node.parent.find_all {|n|
          n.kind_of?(REXML::Element) and n.expanded_name == node.expanded_name
        }
        if results.length > 1
          idx = results.index( node )
          rv << "[#{idx+1}]"
        end
      end
      rv
    end

node.expanded_nameを破壊的に変更している。("Argument" -> "Argument[1]")

 4. 修正

D:\ruby\lib\ruby\1.8\rexml>diff -u element.rb~ element.rb
--- element.rb~      2005-08-12 21:08:47.000000000 +0900
+++ element.rb       2006-06-27 00:36:58.546875000 +0900
@@ -720,7 +720,8 @@
         }
         if results.length > 1
           idx = results.index( node )
-          rv << "[#{idx+1}]"
+          rv += "[#{idx+1}]"
         end
       end
       rv

 5. もう一度列挙して結果を確認

/ItemLookupResponse
/ItemLookupResponse/OperationRequest
/ItemLookupResponse/OperationRequest/HTTPHeaders
/ItemLookupResponse/OperationRequest/RequestId
/ItemLookupResponse/OperationRequest/Arguments
/ItemLookupResponse/OperationRequest/RequestProcessingTime
/ItemLookupResponse/OperationRequest/HTTPHeaders/Header
/ItemLookupResponse/OperationRequest/Arguments/Argument[1]
/ItemLookupResponse/OperationRequest/Arguments/Argument[2]
/ItemLookupResponse/OperationRequest/Arguments/Argument[3]
/ItemLookupResponse/OperationRequest/Arguments/Argument[4]
/ItemLookupResponse/OperationRequest/Arguments/Argument[5]
/ItemLookupResponse/OperationRequest/Arguments/Argument[6]
/ItemLookupResponse/OperationRequest/Arguments/Argument[7]

 6. REXML 3.1.4

をを、直っている。というわけで上記は ruby-1.8.4に付随する REXML 3.1.3限定の話でした。

    def __to_xpath_helper node
      rv = node.expanded_name.clone
      if node.parent
        results = node.parent.find_all {|n|
          n.kind_of?(REXML::Element) and n.expanded_name == node.expanded_name
        }
        if results.length > 1
          idx = results.index( node )
          rv << "[#{idx+1}]"
        end
      end
      rv
    end

3.1.3 からの ChangeLog。(そのうち 3.1.4からの ChangeLogになりそう)

 7. レンタルサーバーの REXMLを更新することはできないので

間に合わせにこんなのを紛れ込ませる。

if(::REXML::Version < '3.1.4')
module ::REXML
  class Element
    def __to_xpath_helper node
      rv = node.expanded_name.clone
      if node.parent
        results = node.parent.find_all {|n|
          n.kind_of?(REXML::Element) and n.expanded_name == node.expanded_name
        }
        if results.length > 1
          idx = results.index( node )
          rv << "[#{idx+1}]"
        end
      end
      rv
    end
  end
end
end

2006年06月23日 (金)

Apache2.2, mod_authz_svn.so, mod_dav_svn.soコンパイル完了

Apacheと opensslは Windowsでも親切なのに Subversionの気難しいこと。

python gen-make.py -t vcproj --with-http=D:\apache2 --with-apr=〜 〜略〜

で書き出された subversion_vcnet.slnを VC++ 2005 Expressで開いて、mod_authz_svnと mod_dav_svnプロジェクトだけエラーを潰して*ビルドして、出来上がった Release\subversion\*\*.soを D:\apache2\modulesにコピー。

Apacheと svnモジュールの準備が整ったところで D:\apache2\bin\httpd.exeを起動しようとすると MSVCR80.dllがないとか言われる。Apacheのコンパイル時に *.exeや *.dllや *.soと一緒に作成されてた *.*.manifestを手動インストール。

httpd -k install

でサービスを登録して、D:\apache2\conf\httpd.confで

LoadModule authz_svn_module modules/mod_authz_svn.so
LoadModule dav_svn_module modules/mod_dav_svn.so
<Location /svn>
	DAV svn
	SVNPath "D:/svn/rep"
</Location>

みたいな設定を追加してリポジトリが見えるのを確認した。

 今回の面倒の全ては

python gen-make.py -t vcproj --with-httpd=D:\apache2 --with-apr=〜 〜略〜

ここにあった気がする。apacheが用意してくれた Makefile.winとか *.makを使ってだと apr, apr-util, apr-iconvはコンパイルできるけど Subversion経由だとこれらがコンパイルできない。だから Subversionには既に出来上がってる libapr.libを使ってほしいのに、その希望を伝える方法がわからない。

--with-apr=DIR
--with-apr-util=DIR
--with-apr-iconv=DIR

がそれだと思うのに。

* intl3_svn.libは subversion.tigris.orgから DLできる。

[]3点

みっくるんるん♪はネタとしてよくできてたけど、ハルヒが第12話の学園祭で歌った 2曲は普通にとても良かった。


2006年06月19日 (月)

[]7点

  • [コミック] 犬上 すくね【ラバーズ7 5 (5) (サンデーGXコミックス)】 小学館
  • [文庫] 野村 美月【“文学少女”と死にたがりの道化 (ファミ通文庫)】 エンターブレイン
  • [文庫] ジェイムズ・P・ホーガン, 池 央耿【ガニメデの優しい巨人 (創元SF文庫)】 東京創元社
  • [文庫] ジェイムズ・P・ホーガン, 池 央耿【巨人たちの星 (創元SF文庫 (663-3))】 東京創元社
  • [文庫] グレッグ イーガン【順列都市〈下〉 (ハヤカワ文庫SF)】 早川書房
  • [文庫] 小林 めぐみ【食卓にビールを (富士見ミステリー文庫)】 富士見書房
  • [文庫] 林 トモアキ【お・り・が・み 龍の火 (角川スニーカー文庫)】 角川書店

2006年06月16日 (金)

[]5点

  • [コミック] 小林 尽【School Rumble Vol.13 (13) (少年マガジンコミックス)】 講談社
  • [コミック] 久米田 康治【さよなら絶望先生 第4集 (4) (少年マガジンコミックス)】 講談社
  • [コミック] 畑 健二郎【ハヤテのごとく! (7) (少年サンデーコミックス)】 小学館
  • [雑誌] 【ヤングアニマル 増刊 あいらんど 2006年 7/30号 [雑誌]】 白泉社
  • COMIC RIN vol.19 2006.JUL

Amazon ECS: 最近 BrowseNodesが取得できない。ItemAttributesがちょこちょこ変わってる。

今日発売のスクールランブル 13巻と、3年前の 5月発売の 1巻を比べてみる。

<ItemAttributes>
  <Author>小林 尽</Author>
  <Binding>コミック</Binding>
  <Creator Role="著">小林 尽</Creator>
  <Label>講談社</Label>
  <ListPrice>
    <Amount>410</Amount>
    <CurrencyCode>JPY</CurrencyCode>
    <FormattedPrice>¥ 410</FormattedPrice>
  </ListPrice>
  <Manufacturer>講談社</Manufacturer>
  <ProductGroup>Book</ProductGroup>
  <PublicationDate>2006-06-16</PublicationDate>
  <Publisher>講談社</Publisher>
  <Studio>講談社</Studio>
  <Title>School Rumble Vol.13 (13)</Title>
</ItemAttributes>
<ItemAttributes>
  <Author>小林 尽</Author>
  <Binding>コミック</Binding>
  <Creator Role="著">小林 尽</Creator>
  <ListPrice>
    <Amount>410</Amount>
    <CurrencyCode>JPY</CurrencyCode>
    <FormattedPrice>¥ 410</FormattedPrice>
  </ListPrice>
  <NumberOfPages>161</NumberOfPages>
  <PackageDimensions>
    <Length Units="cm">18</Length>
  </PackageDimensions>
  <ProductGroup>Book</ProductGroup>
  <PublicationDate>2003-05-16</PublicationDate>
  <Publisher>講談社</Publisher>
  <Title>School Rumble Vol.1 (1)</Title>
</ItemAttributes>
  • Label, Manufacturer, Studioというよくわからない要素が追加
  • NumberOfPages, PackageDimensionsが削除たまたまっぽい

 NumberOfPages

ページ数がわからなくなるのは残念だけど、アマゾンの登録するページ数って多分ページ数の書いてある最後のページのこと。だから半端になる。

大抵の本は先頭から数えた紙の枚数をページとしている。最後まで数えたらキリのいい数字になる。

スクールランブルの 13巻を見てみたら奥付に 161Pと書いてある。あれ? 半端。161Pだと巻頭のカラー2Pが含まれていて奥付が含まれていない。純粋な紙の枚数は 161-2+1=160P。OK。この場合は 160+2(カラー)=162Pということにしよう。

 Label

この要素からは「講談社」でなく「少年マガジンKC」という値を取得したい。

 BrowseNodes

アマゾンのサイトを見る限り、スクールランブル 13巻には

ジャンル別 > コミック・アニメ・BL > 出版社別 > 講談社 > 少年マガジンKC

というブラウズノードが存在している。何で取得できなくなったのだろう。

ブラウズノードからはレーベルを取得したいだけなので、<Label>に期待した値を入れてくれればそれで済むし、しかも楽なんだけど〜。


2006年06月11日 (日)

[][][文庫] ジェイムズ・P・ホーガン, 池 央耿【星を継ぐもの (創元SF文庫)】 東京創元社

月面で一体の死体が発見された。人間と同じ姿ながら、5万年前に死んでいる彼は地球人ではありえない。だが別々に進化したにしては両者は似すぎている。彼は宇宙人なのか地球人なのか。

世紀の発見に沸く地球。様々な分野の科学者集団が一つの死体にアリのように群がり、たちどころに、とはいかないけれど少しずつ、時には意見を対立させながら謎を明らかにしていく過程の興奮すること!

ところが小骨がひとつ引っ掛かっていて、チャーリー(件の死体)の手記にこうある。

「ミネルヴァはどうなったろうか。この禍いの後、果たしてわれわれの子孫はより恵まれた場所で生き延びるだろうか。もし生き延びたとしたら、彼らはわれわれが何をしたか、いくらかでも理解するだろうか。」(206ページ)

これを読んだとき「星を継ぐもの」というタイトルの意味がわかった気がしたし、実際に結末ではそういう結論だったのだけど、その事実と結論された事柄はこの手記を書き残してすぐに死んでしまったチャーリーには知り得ないことのはずなのだが。

「彼らはわれわれが何をしたか、いくらかでも理解するだろうか。」という部分から、チャーリーたちルナリアンが「より恵まれた場所で生き延びる」ために何らかの行動を起こしたのだと思っていたし、実際にルナリアンは死にゆく自分たちの星から脱出するために惑星間の移住計画を推進していたのだからチャーリーの手記に間違いはなく思える。

だが、チャーリーがこの手記を書いている状況を考えると違ってくる。 チャーリーがこれを書いているのは自分が死ぬ寸前のことであり、その原因は対立する二国間の戦争(星の危機に際して戦争!)による破壊だとしたら? チャーリーの敵国はチャーリーの居た月面の基地を破壊したが、チャーリーたちもまた自らの星に存在する敵基地を攻撃して破壊している。

移住計画実現の見通しも立たないうちに始まった、母星を小惑星帯に変え、自らを絶滅に至らしめる戦争のさなかにあっては、あまりにも希望と空想に満ちたメッセージじゃないか。

[]7点

  • [文庫] 清原 なつの【飛鳥昔語り (ハヤカワコミック文庫 (JA843))】 早川書房
  • [単行本] 横田増生【アマゾン・ドット・コムの光と影】 情報センター出版局
  • [文庫] ジェイムズ・P. ホーガン【内なる宇宙〈下〉 (創元SF文庫)】 東京創元社
  • [文庫] グレッグ イーガン【しあわせの理由 (ハヤカワ文庫SF)】 早川書房
  • [文庫] デイヴィッド・エディングス, 佐藤 ひろみ【蛇神の女王 - ベルガリアード物語】 早川書房
  • [文庫] キャロル オコンネル【クリスマスに少女は還る (創元推理文庫)】 東京創元社
  • [文庫] リチャード マシスン, ロバート・R. マキャモン【震える血 (祥伝社文庫)】 祥伝社

2006年06月10日 (土)

[tDiary] セクション毎にフットノートが付けられる。(やろうと思えば)

tDiary-2.1.4からは section_enter_procと section_leave_procが用意されてるので、現在 body_leave_procを使って一日毎に行ってることを、section_leave_procでセクション毎に行うだけ。

Windows Vista beta2、Irvine、2Gの壁

気が付いたらファイルサイズが 3.8GBを超えてるのにまだダウンロードしてる。32bit版は約 3.5GBのはずなのに。

ダウンロード済みのサイズがマイナスMBになってるし。進捗グラフがマイナス%になってる。MSのサーバーに「Range: bytes=-123456789-」みたいにマイナスから始まる変な要求を送ってる。

[tDiary] index.rb: UAにキャッシュを許可。If-Modified-Sinceをチェック。

構わないと思うのですよ、リロードの度にプラグインを評価しなくても。

--- index.rb~	2005-06-13 14:05:11.000000000 +0900
+++ index.rb	2006-06-11 00:52:18.203125000 +0900
@@ -60,11 +60,15 @@
 		body = ''
 		head['Last-Modified'] = CGI::rfc1123_date( tdiary.last_modified )

+		require 'time'
+		ims = ENV['HTTP_IF_MODIFIED_SINCE']; ims = ims ? Time.httpdate(ims) : Time.at(0); # ENV?
+		diary_changed = (tdiary.last_modified - ims) > 30; # 30?
+
 		# ETag testing code
 		#require 'md5'
 		#head['ETag'] = MD5::md5( body )

-		if /HEAD/i !~ @cgi.request_method then
+		if /HEAD/i !~ @cgi.request_method and diary_changed then
 			if @cgi.mobile_agent? then
 				body = conf.to_mobile( tdiary.eval_rhtml( 'i.' ) )
 				head['charset'] = conf.mobile_encoding
@@ -73,15 +77,15 @@
 				body = tdiary.eval_rhtml
 				head['charset'] = conf.encoding
 				head['Content-Length'] = body.size.to_s
-				head['Pragma'] = 'no-cache'
-				head['Cache-Control'] = 'no-cache'
+#				head['Pragma'] = 'no-cache'
+#				head['Cache-Control'] = 'no-cache'
 			end
 			head['cookie'] = tdiary.cookies if tdiary.cookies.size > 0
 			print @cgi.header( head )
 			print body
 		else
-			head['Pragma'] = 'no-cache'
-			head['Cache-Control'] = 'no-cache'
+#			head['Pragma'] = 'no-cache'
+#			head['Cache-Control'] = 'no-cache'
 			print @cgi.header( head )
 		end
 	rescue TDiary::ForceRedirect

2006年06月08日 (木)

(すっぱいブドウ ∩ 負け惜しみ)≠φ

その心は、ブドウを取りそこなったキツネは、それをすっぱいと言う。

へぇ〜へぇ〜へぇ〜

[Ruby][SQLite] sqlite3-rubyのバグ。SQLite3::Database#create_aggregate()などに注意

Segmentation faultが起こったり起こらなかったり、起こったとしても(特定のパターンはあるにせよ)違う場所だったりとはっきりしないエラーに困らされた。

原因が create_aggregateで独自に定義した集約関数を使ってるからだということはわかってる。RubyForgeに関連のありそうな投稿を見つけた。

原因はリファレンスが切れて GCに回収されてしまったオブジェクトを参照しようとしてることにある、ということで良いか? 何ともヘタレな回避策は↓。

GC.disable; db.execute(sql); GC.enable

sqlite3-rubyはもうメンテされないのかね。名前付きプレースホルダの問題も解決されないし。

sql = 'SELECT * FROM Books WHERE Title = :title;'
db.execute(sql, {'title'=>'惑星をつぐ者'}) #=> no such bind parameter 'title' とかなんとか
db.execute(sql, {':title'=>'星を継ぐもの'}) #=>(゜Д゜ )ウマー

bind_parameterのキーに普通はコロンを付けたりしないよね、多分。