/ 最近 .rdf 追記 設定 本棚

脳log[2007-01-16~]



2007年01月16日 (火)

[Hiki]ユーザー管理

 管理者

Hikiにはデフォルトで adminという名前の管理ユーザーが一人。Hikiをインストールして FrontPageを表示したら、まず管理者のパスワードを設定するよう促される。

 登録ユーザー

管理画面で edit_user.rbプラグインを有効にするとユーザー名とパスワードの組をいくつでも追加でき、ページの編集を登録ユーザーだけに許すということもできる。必ずしも編集権を登録ユーザーのみに制限する必要はない。

 仮ユーザー(仮称) のようなものがあればと思う

パスワードはなし。名を名乗るだけでなれる。ただし登録ユーザーと同じ名は名乗れない。

掲示板に書き込むときに名前を書くように Wikiを編集するときにも名前を入力できたらな、と思ったので。

パスワード無しの単なる自称なのでなりすましもできるし、しょうもないコメントを(ユーザー名として)入力することもできるけど、貢献してくれた人に名無しでいることを強要するのは間違い。ペンネームでもなんでも名乗る自由と匿名でいる自由が与えられていいと思う。善意の第三者の協力を期待するのなら。


2007年01月13日 (土)

[Ruby][Hiki] Hiki-0.8.6のインストロールインストゥール、install。

まずローカルで試してからアップロードしたのだがローカルの Apacheが Ruby-1.9.0を呼ぶので、FrontPageの表示からログインまでを可能にするために加えた変更点のリストをメモしておく。

 hiki/config.rb: Hiki::Config#initialize

-      instance_variables.each do |v|
+      instance_variables.each do |v| v = v.to_s;

vにシンボルが渡されて、次の行で v.sub!したときにエラーになっていた。

 hiki/command.rb: Hiki::Command#cmd_login

          if page && !page.empty?
-           redirect(@cgi, @conf.base_url + @plugin.hiki_url( page ), session_cookie( session.session_id ))
+           redirect(@cgi, @conf.base_url + @plugin.hiki_url( page ), [session_cookie( session.session_id )])
          else
-           redirect(@cgi, @conf.index_url, session_cookie( session.session_id ))
+           redirect(@cgi, @conf.index_url, [session_cookie( session.session_id )])

Cookieが session_id=SESSIONIDの形でなく SESSIONIDと key名なしの状態でブラウザにセットされるからログインに失敗していた。

Hiki::Command#cmd_logoutでは同じ引数を [session_cookie(session_id, -1)] としていたので同じように配列にした。

 hiki/storage.rb: Hiki::HikiDBBase#md5hex

-      Digest::MD5::new( s || '' ).hexdigest
+      Digest::MD5::hexdigest( s || '' )

リファレンスマニュアルには Digest::MD5.new([str]) とあるが引数の数が 0でないと叱られる。

 hiki/db/tmarshal.rb: TMarshal::dump_text

    when Array
-     "[\n"+obj.collect{|x| dump_text(x)+",\n"}.to_s+"]"
+     "[\n"+obj.collect{|x| dump_text(x)}.join(",\n")+"\n]"
    when Hash
-     "{\n"+obj.sort_by{|e| e[0].inspect}.collect{|k,v| "#{dump_text(k)} => #{dump_text(v)},\n"}.to_s+"}"
+     "{\n"+obj.sort_by{|e| e[0].inspect}.collect{|k,v| "#{dump_text(k)} => #{dump_text(v)}"}.join(",\n")+"\n}"

dumpに失敗していた。

原因となった Array#to_sのバージョンによる出力の違い↓。

Ruby-1.8.5p12> [1,2,3].to_s #=> "123"
Ruby-1.9.0 20061205> [1,2,3].to_s #=> "[1, 2, 3]"

リファレンスマニュアルには

to_s
   self.join($,) と同じです。

と書いてあるから to_sで(ある種の) joinを代用していても仕方ない。

と思ったがどちらにしろ Array#to_sの出力は $, に依存するので、後で(loadするときに) evalすることを考えれば今回の to_sの使用は不適切か。

[Ruby][Hiki] 差分の表示

上のエントリで FrontPageの表示とログインまでやったが、差分の表示もおかしかったので Array#to_s らしき部分を join('') に書き換えまくったら直った模様。

'string'.join は存在しなかったので、書き換えてエラーにならないということは考えたとおり Array#to_sだったか、そのコードが実行されてなくて発覚してないが実は間違いだった(実行されたらNoMethodErrorになる)かのどちらか ^_^; こういう実行してみないとわからないところは javascriptと同じでレアなコードパスのデバッグを難しくするね。

以下、リスト。

 style/default/hikidoc.rb: HikiDoc#escape_meta_char

+if(defined? ' '.ord) # Ruby-1.9
   def escape_meta_char( text )
     text.gsub( META_CHAR_RE ) do |s|
+      '&#x%x;' % s[1].ord
+    end
+  end
+else
+  def escape_meta_char( text )
+    text.gsub( META_CHAR_RE ) do |s|
       '&#x%x;' % s[1]
     end
   end
+end

いきなり Array#to_sと関係ないが String#[index] が Integerに代えて一文字の Stringを返すようになった対策。

 hiki/util.rb: Hiki::Util#word_diff

      if digest
-        return View.new( diff, src.encoding, src.eol ).to_html_digest(overriding_tags, false).to_s.gsub( %r|<br />|, '' ).gsub( %r|\n</ins>|, "</ins>\n" )
+        return View.new( diff, src.encoding, src.eol ).to_html_digest(overriding_tags, false).join(\).gsub( %r|<br />|,  ).gsub( %r|\n</ins>|, "</ins>\n" )
      else
-        return View.new( diff, src.encoding, src.eol ).to_html(overriding_tags, false).to_s.gsub( %r|<br />|, '' ).gsub( %r|\n</ins>|, "</ins>\n" )
+        return View.new( diff, src.encoding, src.eol ).to_html(overriding_tags, false).join(\).gsub( %r|<br />|,  ).gsub( %r|\n</ins>|, "</ins>\n" )
      end

 hiki/util.rb: Hiki::Util#word_diff_text

      if digest
-        return View.new( diff, src.encoding, src.eol ).to_wdiff_digest({}, false).join.gsub( %r|\n\+\}|, "+}\n" )
+        return View.new( diff, src.encoding, src.eol ).to_wdiff_digest({}, false).join(nil).gsub( %r|\n\+\}|, "+}\n" )
      else
-        return View.new( diff, src.encoding, src.eol ).to_wdiff({}, false).join.gsub( %r|\n\+\}|, "+}\n" )
+        return View.new( diff, src.encoding, src.eol ).to_wdiff({}, false).join(nil).gsub( %r|\n\+\}|, "+}\n" )
      end

join('')か join(nil)か統一しろよ、とセルフツッコミ。

 hiki/util.rb: Hiki::Util#compare_by_line_word

-          before_change = Document.new(line[1].to_s,
+          before_change = Document.new(line[1].join(''),
                                       doc1.encoding, doc1.eol)
-          after_change  = Document.new(line[2].to_s,
+          after_change  = Document.new(line[2].join(''),
                                       doc2.encoding, doc2.eol)

 hiki/docdiff/view.rb: View#apply_style

       if block_given?
-        source = yield block[1].to_s
-        target = yield block[2].to_s
+        source = yield block[1].to_a.join ''
+        target = yield block[2].to_a.join ''
       else
-        source = block[1].to_s
-        target = block[2].to_s
+        source = block[1].to_a.join ''
+        target = block[2].to_a.join ''
       end

block[i]は nilの可能性があるので to_a.join

 hiki/docdiff/view.rb: View#apply_style_digest

       if block_given?
-        source = yield entry[1].to_s
-        target = yield entry[2].to_s
+        source = yield entry[1].to_a.join ''
+        target = yield entry[2].to_a.join ''
       else
-        source = entry[1].to_s
-        target = entry[2].to_s
+        source = entry[1].to_a.join ''
+        target = entry[2].to_a.join ''
         end
       if  i == 0
         context_pre  = ""  # no pre context for the first entry
       else
-        context_pre  = @difference[i-1][1].to_s.scan(context_pre_pat).to_s
+        context_pre  = @difference[i-1][1].to_a.join('').scan(context_pre_pat).to_s
       end
       if (i + 1) == @difference.size
         context_post = ""  # no post context for the last entry
       else
-        context_post = @difference[i+1][1].to_s.scan(context_post_pat).to_s
+        context_post = @difference[i+1][1].to_a.join('').scan(context_post_pat).to_s
       end

 hiki/docdiff/view.rb: View#source_lines

   def source_lines()
     if @source_lines == nil
-      @source_lines = @difference.collect{|entry| entry[1]}.join.scan_lines(@eol)
+      @source_lines = @difference.collect{|entry| entry[1]}.join(nil).scan_lines(@eol)

 hiki/docdiff/view.rb: View#target_lines

   def target_lines()
     if @target_lines == nil
-      @target_lines = @difference.collect{|entry| entry[2]}.join.scan_lines(@eol)
+      @target_lines = @difference.collect{|entry| entry[2]}.join(nil).scan_lines(@eol)

[Hiki]セキュリティエラー続発

Hikiの設置が一段落したようなのでページの編集に取りかかる。が、こちらもすんなりとはいかない。プラグイン記法でできることが著しく制限されているのだ。

tDiaryは日記の著者を信用している(自分の日記を壊そうとする者はいないので。著者!=管理者となるレンタルサービスでは話が違って、セキュアモードでシステムを守る必要があるが)のに対し、Hikiはページ編集者を全く信用することができない。誰でも書き込めるのが Wikiだから。

そんなわけでセキュリティエラーが続発中。プラグイン記法で許されるのは単一のプラグイン呼び出しだけ。任意の文字列を埋め込むことも、プラグイン呼び出しを連ねることも、Rubyであれやこれやをすることもできない。全てをプラグインの中に閉じこめてしまい、Hikiページではそれを呼び出すしかないわけだ。(プラグインは Hikiの設置者が責任を持っているので信用されている)

{{CGI::escapeHTML @hoge.inspect}}

どころか

 {{CGI::escapeHTML '<abc>'}}

ですら通らないんだから。いやはや全く。

 いやいやいやいや

SecurityError (Insecure: can't intern tainted string)

これは Ruby 1.9.0に固有のエラーじゃまいか。だったら Hikiの方をちょこっと変更してもいいんじゃないか?

[Hiki][Ruby]プラグイン記法

 {{hoge a b 5}}      #=> hoge('a', 'b', 5)
 {{hoge 'a' b(5)}}   #=> hoge('a', 'b', 5)
 {{hoge ,a(, b)(5)}} #=> hoge('a', 'b', 5)
 {{hoge, a, b, 5}}   #=> PluginException('not plugin method: hoge,')
 {{hoge; hage}}      #=> PluginException

文法の緩さとか、一つのメソッドしか呼べないとか、嫌すぎる。

そりゃあ Rubyで

require digest/md5

という風にライブラリ名をクォーテーションで括らずに書けたら楽だなとかは考えるし、Symbolが Stringのサブクラスになったときは

require :sqlite3

が通るのを一番に確認したけど、

defined? printf
alias printg printf

を見て、

  • printfって何?クラスは?
  • printgと printfの間にカンマがないけどどういう文法? alias専用ルール?

というのと同種の嫌悪を感じる。


2007年01月11日 (木)


2007年01月09日 (火)

[BAD BOY]少し冷静になって考える

  • どの道のどの部分を走るか
  • どこに保管するか

車を運転することもある今では、以前みたいに自分の安全を車のドライバー任せにしてしまうことの迷惑さにも頼りなさにも無自覚ではいられない。(無法な運転は怖くてできない。自分にとってもドライバーにとっても怖い)

十分な広さのない歩道は走れないし、かといって車道にも十分な広さがないと身の危険か後続のイライラを感じることになるだろうし。

いざ自転車に乗ろうと思うと走る場所に困る。


2007年01月08日 (月) 成人の日。昔より一週間も早い。海の日をハッピーマンデーの対象にしたのは間違い。あれは 20日、夏休みの始まる前の日であることに意味があったのだから。

[]手袋

スノーボード用の手袋。ボードはやらないが、柔らかいのでスキーにもバイクに乗るときにも使う。

3、4年前に買った手袋が昨日ダメになったための予定外の出費。

インナーとアウターの分かれてない防水手袋は、乱暴に脱いでインナーの指先が裏返ったら終わりなのねん。指先の粘着テープと防水シートが絡んで団子になってもう指が通らない。

[BAD BOY] 買う。今年は買う。

DR250Rを買ったのが 2003年の 5月か 6月。その少し前の 4月か 5月にヤフオクで今乗ってる DRを見つけるまで悩んでたのが、DJEBELを買うか BAD BOYを買うか。(DJEBELは DR250Rの兄弟車で、主なところではタンクの容量とライトが違う)

DRを買ったので BAD BOYを買うお金はなくなったが今なら買える。問題は保管場所と乗る機会。人間は楽な方に流れていきますので、機会が確保できるかどうか。ガソリン高と運動不足が背中を押してくれるはず。なのだが、運動しないからと体脂肪が増えてるわけでもなく*、実のところどちらもあまり気にしていない。どうなる?

もうひとつ購入をためらわせるのが BAD BOYの人気。近所では見たことないのが救い。

自分の持ってる iPodは三世代目だが、当時はまだ猫も杓子も iPodという雰囲気ではなかった、ように思う。仮に今 iPodを持っていなくて携帯音楽プレーヤーを探しているとしたら、iPodを除外して良さそうなのを探した上でやっぱり iPodを買うと思う。バッテリーの保ち以外に勝るものが他のには無いからね。

なんだやっぱり iPodを選ぶんじゃないかと、書いて気付いたので迷わず BAD BOYを買ってこようと思います。BAD BOYの代わりは存在しないので。

* そのからくりは、昔から生活に運動が組み込まれていなくて、運動しないのが常態だからです。


2007年01月07日 (日) 掏摸。読めなかった。ふと原題が目に入った。FINGERSMITH。邦題の方が耽美な雰囲気があって好きだ。


2007年01月06日 (土) 1月2日に D言語 1.00 リリース

鼻から脳、出島、軍艦島

桜庭一樹 読書日記【第11回】を昨日読んだ。

鼻から脳のエピソードでは、語感の間抜けさと「さようなら、初恋」のミスマッチに笑いを堪えられなかった。

その後、桜庭氏が東京創元社の編集諸氏から「出島」と呼ばれている話が続く。

この話を読むまで、長崎の島と言えば出島しか知らなかった自分は、真似してこの作家を「出島」と呼ぶことはできない。

何の話なのかというとスラッシュドット ジャパンで今日、 長崎の軍艦島、来春から一般公開へという記事が出ていたよ。へぇぇ。というだけのこと。

物を知っている人というのは自分の知っていることに関連づけて更に効率的に知識を増やしていけるのではないか、と。


2007年01月05日 (金)

[][Amazon]いつのまにか* ISBNが 13桁になっていた。ASINと 新ISBNは一致してないみたいだし、JAN(ISBN-13)を使って本を ItemLookupできるようになるのだろうか。

Amazonで ISBNと ASINが一致しなくなるのが一番痛い。ASINの桁数を増やしてくれるのが楽なんだけど、Amazonにとっては楽じゃないんだろうなあ。

気になる AWSでの ItemLookup。 従来は [An ASIN]の部分に単に ISBNを入力するだけで本の情報を得ることができた。

http://webservices.amazon.com/onca/xml?Service=AWSECommerceService
   &AWSAccessKeyId=[Your Access Key ID Here]
   &Operation=ItemLookup
   &ItemId=[An ASIN]

これに

   &IdType=EAN

というパラメーターを付ければ ItemIdとして ASINの代わりに JANを指定できる。新しい 13桁の ISBNは JANと一致しております。やったね。ただし、

If you select SKU, UPC, or EAN as the IdType for your request, you also need to include the SearchIndex parameter.

(IdTypeに SKU, UPC, EANを選んだら SearchIndexも指定する必要があるよ。)

SearchIndex is required any time you select SKU, UPC, or EAN as the IdType for your request.

(上と同じ内容だけど any time you select EANと書いてあって、よりハッキリ。)

書かれているので、同時に SearchIndexも指定しなければならない。

Amazon.co.jpで許されてる SearchIndexの値は以下の通り

  • Electronics
  • Music
  • Classical
  • DVD
  • Kitchen
  • Software
  • VideoGames

以上。本がありませんね。

2006-11-14版の ドキュメントによれば JANを使って ItemLookupすることはできないみたい。

 amazon.co.jp アソシエイト・セントラルに答えがあるじゃない

https://affiliate.amazon.co.jp/gp/associates/network/help/t4/a7/

転載しちゃって良いかな?

自動化された方法、またはプログラムを組むことによって、13桁のISBNからアソシエイト・リンクを作成することはできますか?

はい、13桁のISBN(以下、新ISBN)への移行後は、Amazon Webサービスの一部である、Amazon E-Commerce Service (ECS) のシステムを利用して、新ISBNをもとにアソシエイト・リンクを生成することが可能になる予定です。Amazon Webサービスでは、現在、ItemLookupの機能を利用して、流通コードであるEANやJANをキーにしたデータ参照が可能であり、この機能に新 ISBNを使用したマッチングを追加する予定です。こちらのサポート開始時期につきましては、E-Commerce Serviceの開発者フォーラム(英語版または日本語版)や、ニュースレターによりご案内しますので、定期的にチェックされることをお勧めします。なお、Amazon Webサービスのご利用には登録が必要です。登録がお済みでない方は、こちらより登録IDを取得してください。

見覚えがあるから一度は読んだはずなのに。

* 2007年からです。知らなかったわけではありませんが、忘れていました。


2007年01月03日 (水)

[FF12]3、40時間ぐらいプレイして (現在、雪の降るブルオミシェイス)

本筋の戦闘はボスが倒せないなんてこともなく、かつ戦闘がダルく感じるほど敵が弱いわけでもない。そして、本筋とは関係ないモブは全滅させられるほど強い。お金は貯まりやすく減りやすい。どれもうまくバランスがとれていると思う。

序盤から、普通の敵に混じって倒せない敵がうろついてるのも好ポイント。ドラクエで橋を渡るときのような緊張感がフィールドに生まれている。本筋とは関係のない方向にどんどん歩いていって強めの敵と戦うこともできる。

 12月13日では書けなかったガンビットについて

ガンビットはプレイヤーが

  • いかにケアルを選ぶ手間を省くか
  • いかに盗むを選ぶ手間を省くか
  • いかに密猟を選ぶ手間を省くか
  • いかにたたかうを選ぶ手間を省くか

考えるためのシステムだと思う。

だから 12月に書いたようにタイミング良くボタンを押して攻撃をガードするというのは、ガンビットと方向性が反対向きなので FF12にそれを求めるのは無理だったかもしれない。

ところで

  • 今の手持ちの条件ではチャージを選ぶ手間は省けない。沈黙の味方にボキャル、猛毒の味方にポイゾナもできない
  • ボスに密猟をしかけないようにガンビットをオフにする手間も
  • 敵の弱点に合わせて使う攻撃魔法を選び直す手間も省けない

ガンビットの条件がさっぱり増えない。

一度レジストされたら同じ敵に二度目は仕掛けない賢さがあってもよかったのでは?そしたらボスに効かない密猟を延々しかけることもないし、レジストされることの多い補助魔法をガンビットに組み込むこともできるし。

 FF12の戦闘は面白いのか?

大味な印象であまり面白くない。

  • 敵の攻撃はかわせない。
  • 敵も味方も離れた敵に攻撃を当てすぎ。
  • そのくせ飛行タイプに分類される敵には、たとえその敵が降下してきていても攻撃を当てられない。
  • 敵と味方の間に割り込んでいっても敵の攻撃が背後の味方に届くので盾になれない。
  • だから HPの低い魔法使いは生き残れない。役割分担ができない。
  • 結局はコマンドバトル。立ち位置、移動に意味はない。
  • 敵味方で団子になって範囲魔法打ちっ放し、最後まで立ってた方が勝ち。

コマンドバトルなのが悪いわけではなく、無用な期待をさせるのが悪い。見た感じ、FFTの地形や高低差を利用したり、魔法の発動時間を考えて敵を誘い込むor押し留める戦略性やベイグラントストーリーのアクション要素を期待させるのにどちらも存在しない。

 ついでにアナログコントローラーDUALSHOCK2についての不満

PS2で導入されたアナログコントローラーの「アナログ」の意味するところDUALSHOCK2は(セレクト/スタートを除いた)ボタンの押し具合が 256段階で表されることだったと思うけど、RPGでアナログコントローラーDUALSHOCK2を使うと弊害が目立つ。

つまり RPGでは 256段階の微妙な押し具合を判別する必要があるのは稀で、殆どはどこかに閾値を設定してオン、オフの二つに分けるのだと思うが、この閾値が高すぎる。FF12を含めてプレイしたどの RPGも*。押してるつもりなのに押してないと判断されることが多くて疲れる。

 瀕死パワーアップ

やりすぎ。

攻撃、回復、MP回復のバランスを忙しく保ちながらボスの HPを削っていって、あとちょっとというところで必ず敵の攻撃が激しくなる。死者続出で、復活と回復に専念しても追いつかず、わずかな余裕を見つけて攻撃してみたらそれまでの半分以下のダメージしか与えられない。倒せないっての。

これじゃあ、余裕で倒せるか、倒せないかのどちらかしかなくなるって。(なんとか倒せそうだ、は大詰めで倒せないだと判明する)

 2007-01-11追記: ミストナックと召喚を

ミストナックと召喚を全く使っていない(覚えてすらいない)ことを書かなかったのはフェアじゃなかったかもしれない。存在を忘れていたよ。

ミストナックってそんなに強いの?

* そうでないゲームもあったかもしれないが記憶に残るのは不満のあったゲームだけ、ということで。


2007年01月01日 (月) 気付けば 0時をまわっていた。元旦である。日が昇ってないからまだなのか?何にせよ今日は昨日の明日で明日の昨日でしかない。俺は、年末だからって掃除をしたりはしないっ!しなかったっ!嘘です。今も部屋の中をひっくり返してる最中です。もなかではありません。


2006年12月31日 (日) ミリオンダラー ベイビーはすごい映画。こんなに集中して、のめり込んで、登場人物に寄り添って見た映画は思い当たらない。


2006年12月30日 (土)

[Ruby][iPod] ipodpl.rb

前々回(9月12日)前回(12月12日)

結局

> ruby ipodpl.rb I:\ artist:"小松 未歩" rating:5 rating:4 or and --album-shuffle > temp.m3u

という形になった。

最近は iPodから曲が溢れてきていて、HDDが安いこともあって iPodに入ってる曲や溢れた曲、全て PCに入っている。

iPodが唯一のミュージックライブラリだった 9月とは状況が変わっているので iPod内の曲を PCから検索できてもあまり嬉しくない。iPodより多くの曲が PCに入っているから。

一応、産物

予め iTunesDBから使えそうな情報を拾って SQLite3形式のデータベースに登録しておいて、検索は SQL任せ、という仕様です。

 2007-02-11

Songbirdのデータベースは最初から SQLiteだ。良き哉良き哉。


2006年12月26日 (火)

[m.k]脳内ソング

冬になると Love gone。今年は 愛してる...も。今日は雨だったので雨が降る度にと涙と One Side Loveだった。