活字が語る内容は全て真実だと思っていた。言葉には(唯一絶対の, 定められた)正しい意味があり、それを載せているのが辞書だと思っていた。なんとなれば本や辞書が作られる過程が全く想像できなかったのと見た目の精確さからそういう勘違いをしてしまったのだろう。今だって体裁の整った HTMLメールは企業からのメールだと思いがちで、フィッシングメールではないかと疑うのを忘れてしまいそうになる。
子供には「不思議なこと」が存在しない、というのもある。『ソフィーの世界』の、キッチンで宙に浮かぶママ、というのがそういう話ではなかったか。
irb(main):001:0> RUBY_RELEASE_DATE => "2006-12-25" irb(main):002:0> "aaa"\ irb(main):003:0* "bbb" => "aaabbb" irb(main):004:0> "aaa"\ irb(main):005:0* %[bbb] NameError: undefined local variable or method `bbb' for main:Object from (irb):5
こういうもんなの? "bbb" と %!bbb! は同じものだと思っていたが。
'%04d-%02d-%02d'%[2007,12,12] => "2007-12-12"
String#% が呼ばれてるんだよ。
PS1用のコントローラーの DUALSHOCKが、PS2のゲームでも使えることがあるらしい(DUALSHOCK2の機能を使ってない場合?)ので差してみた。
メニューを開く早さが体感 3割増。反応がもっさりしてたのはコントローラーが一因だった。セレクトで地図を開くとき以外*のあらゆる場面でゲームが高速化したみたいにサクサク操作できる。
こちらのとり得る選択肢が充実してきて、強敵に為す術がないということはなくなった。ヘイスト、バブル、ブレイブ、魔防破壊、バーサクなどなど。
ガンビットもそこそこ充実してきて単体で有効な条件だけでなく、一連の条件を設定することも可能になってきた。とはいえ未だにポイゾナもボキャルも自動化できないのは納得できないけど!
覇王の剣をとった後あたりからハマっている。以下に挙げる条件は序盤から変わってないのだけど技や魔法やガンビットや最大MPが充実して行動の幅が広がってきて、「なんとかなる」ことが多くなったのが大きい。
なんといっても、プレイヤーが常に複数の目的を持っているというのが良い。どのモブ、どのボスを倒しに行くのか、どのダンジョンを探索するのか、あるいはストーリーを進めるのか。これらの行動を制限するものは自身の強さのみ。初めて訪れる場所というのは一撃二撃で瀕死にされることもままある。そういうときは一体ずつ集中攻撃して経験値を稼いだり、すこし戻って雑魚狩りで LPを稼いでライセンスを充実させたり、あるいはストーリーを進めて装備を充実させたり。自身の強さと相談して再挑戦する時期を決めるのはプレイヤー自身。そういう自由がある。少し無理をしてぎりぎりの戦闘をこなすのも自由。久しぶりにゲームをしていると感じられる RPG。楽しい。
* セレクトとスタートに関しては DUALSHOCKと DUALSHOCK2に違いはなく、どちらもダメ。どれだけ奥まで押し込ませようとするのだ。ボタンの物理的なフィードバックと電気的なオンオフとの間にズレがあるから違和感を与えるのだよ
二年近くの長い沈黙を破って 2007-01-13にリリースされていた。
http://vvvvvv.sakura.ne.jp/ds14050/w/
Internet Explorer 7 で上の Hikiページを表示すると、右上のメニューを除いてテキストを選択することもリンクをクリックすることもできない。キーボードでの操作はできる。
スクリプトは仕込んでない。外部スタイルシートは hiki_base.cssと pain.cssが読み込まれている。 <style>タグが一カ所使われている。HTMLは Anothoer HTML-lintでチェックして対応がとれてないタグは存在しなかった。
(ページのどこでも)ダブルクリックするとまるで見当外れのページ右下の Generated が選択されるからスタイルシートの float辺りがくさい。
pain.cssをみてみると
div.main { float:right; width: 78%; } div.sidebar { float:left; width: 20%; (以下略)
という記述があり、サイドバーの表示を floatで実現していた。
臭う、臭うぞ。でもここまで。そのうち直るでしょ。
Hikiにはデフォルトで adminという名前の管理ユーザーが一人。Hikiをインストールして FrontPageを表示したら、まず管理者のパスワードを設定するよう促される。
管理画面で edit_user.rbプラグインを有効にするとユーザー名とパスワードの組をいくつでも追加でき、ページの編集を登録ユーザーだけに許すということもできる。必ずしも編集権を登録ユーザーのみに制限する必要はない。
パスワードはなし。名を名乗るだけでなれる。ただし登録ユーザーと同じ名は名乗れない。
掲示板に書き込むときに名前を書くように Wikiを編集するときにも名前を入力できたらな、と思ったので。
パスワード無しの単なる自称なのでなりすましもできるし、しょうもないコメントを(ユーザー名として)入力することもできるけど、貢献してくれた人に名無しでいることを強要するのは間違い。ペンネームでもなんでも名乗る自由と匿名でいる自由が与えられていいと思う。善意の第三者の協力を期待するのなら。
まずローカルで試してからアップロードしたのだがローカルの Apacheが Ruby-1.9.0を呼ぶので、FrontPageの表示からログインまでを可能にするために加えた変更点のリストをメモしておく。
- instance_variables.each do |v| + instance_variables.each do |v| v = v.to_s;
vにシンボルが渡されて、次の行で v.sub!したときにエラーになっていた。
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)] としていたので同じように配列にした。
- Digest::MD5::new( s || '' ).hexdigest + Digest::MD5::hexdigest( s || '' )
リファレンスマニュアルには Digest::MD5.new([str]) とあるが引数の数が 0でないと叱られる。
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の使用は不適切か。
上のエントリで FrontPageの表示とログインまでやったが、差分の表示もおかしかったので Array#to_s らしき部分を join('') に書き換えまくったら直った模様。
'string'.join は存在しなかったので、書き換えてエラーにならないということは考えたとおり Array#to_sだったか、そのコードが実行されてなくて発覚してないが実は間違いだった(実行されたらNoMethodErrorになる)かのどちらか ^_^; こういう実行してみないとわからないところは javascriptと同じでレアなコードパスのデバッグを難しくするね。
以下、リスト。
+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を返すようになった対策。
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
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)か統一しろよ、とセルフツッコミ。
- 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)
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
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
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)
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の設置が一段落したようなのでページの編集に取りかかる。が、こちらもすんなりとはいかない。プラグイン記法でできることが著しく制限されているのだ。
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の方をちょこっと変更してもいいんじゃないか?
{{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
を見て、
というのと同種の嫌悪を感じる。
スノーボード用の手袋。ボードはやらないが、柔らかいのでスキーにもバイクに乗るときにも使う。
3、4年前に買った手袋が昨日ダメになったための予定外の出費。
インナーとアウターの分かれてない防水手袋は、乱暴に脱いでインナーの指先が裏返ったら終わりなのねん。指先の粘着テープと防水シートが絡んで団子になってもう指が通らない。
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の代わりは存在しないので。
* そのからくりは、昔から生活に運動が組み込まれていなくて、運動しないのが常態だからです。
桜庭一樹 読書日記【第11回】を昨日読んだ。
鼻から脳のエピソードでは、語感の間抜けさと「さようなら、初恋」のミスマッチに笑いを堪えられなかった。
その後、桜庭氏が東京創元社の編集諸氏から「出島」と呼ばれている話が続く。
この話を読むまで、長崎の島と言えば出島しか知らなかった自分は、真似してこの作家を「出島」と呼ぶことはできない。
何の話なのかというとスラッシュドット ジャパンで今日、 長崎の軍艦島、来春から一般公開へという記事が出ていたよ。へぇぇ。というだけのこと。
物を知っている人というのは自分の知っていることに関連づけて更に効率的に知識を増やしていけるのではないか、と。
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の値は以下の通り
以上。本がありませんね。
2006-11-14版の ドキュメントによれば JANを使って ItemLookupすることはできないみたい。
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年からです。知らなかったわけではありませんが、忘れていました。
本筋の戦闘はボスが倒せないなんてこともなく、かつ戦闘がダルく感じるほど敵が弱いわけでもない。そして、本筋とは関係ないモブは全滅させられるほど強い。お金は貯まりやすく減りやすい。どれもうまくバランスがとれていると思う。
序盤から、普通の敵に混じって倒せない敵がうろついてるのも好ポイント。ドラクエで橋を渡るときのような緊張感がフィールドに生まれている。本筋とは関係のない方向にどんどん歩いていって強めの敵と戦うこともできる。
ガンビットはプレイヤーが
考えるためのシステムだと思う。
だから 12月に書いたようにタイミング良くボタンを押して攻撃をガードするというのは、ガンビットと方向性が反対向きなので FF12にそれを求めるのは無理だったかもしれない。
ところで
ガンビットの条件がさっぱり増えない。
一度レジストされたら同じ敵に二度目は仕掛けない賢さがあってもよかったのでは?そしたらボスに効かない密猟を延々しかけることもないし、レジストされることの多い補助魔法をガンビットに組み込むこともできるし。
大味な印象であまり面白くない。
コマンドバトルなのが悪いわけではなく、無用な期待をさせるのが悪い。見た感じ、FFTの地形や高低差を利用したり、魔法の発動時間を考えて敵を誘い込むor押し留める戦略性やベイグラントストーリーのアクション要素を期待させるのにどちらも存在しない。
PS2で導入されたアナログコントローラーの「アナログ」の意味するところDUALSHOCK2は(セレクト/スタートを除いた)ボタンの押し具合が 256段階で表されることだったと思うけど、RPGでアナログコントローラーDUALSHOCK2を使うと弊害が目立つ。
つまり RPGでは 256段階の微妙な押し具合を判別する必要があるのは稀で、殆どはどこかに閾値を設定してオン、オフの二つに分けるのだと思うが、この閾値が高すぎる。FF12を含めてプレイしたどの RPGも*。押してるつもりなのに押してないと判断されることが多くて疲れる。
やりすぎ。
攻撃、回復、MP回復のバランスを忙しく保ちながらボスの HPを削っていって、あとちょっとというところで必ず敵の攻撃が激しくなる。死者続出で、復活と回復に専念しても追いつかず、わずかな余裕を見つけて攻撃してみたらそれまでの半分以下のダメージしか与えられない。倒せないっての。
これじゃあ、余裕で倒せるか、倒せないかのどちらかしかなくなるって。(なんとか倒せそうだ、は大詰めで倒せないだと判明する)
ミストナックと召喚を全く使っていない(覚えてすらいない)ことを書かなかったのはフェアじゃなかったかもしれない。存在を忘れていたよ。
ミストナックってそんなに強いの?
* そうでないゲームもあったかもしれないが記憶に残るのは不満のあったゲームだけ、ということで。