この文書の所在
Junkieta.netFragment → Notes, 2009-01

2009年01月の雑記

2009-01-05, 2008から2009へ

あけました。もう何日も前に。年越しにあたって一年を振り返るとか新年の抱負とか、そういうものを書こうかとも思ったけれど、8年付き合ってきたモニタが年末に逝ってしまわれたというゴタゴタで更新できなかった。

年末には初めて小学校の同窓会に付き合った。顔を覚えていない人の方が多そうだと思っていたけれど、話してみればそれなりに思い出せる記憶もあり、数時間の飲み会なんてすぐに終わった。が、一部の馬鹿騒ぎグループのノリには辟易した。別に自分にも周りにも小学生の頃と同じ人格なんて求めてはいないが、「お色気パブ」だの「キャバ」だのの話題ばかり大声で叫ぶ25歳の酔っ払いってなんなんだよ。女性陣に下ネタばかりふって、同姓には中身のない同意を求め、それで盛り上がろうっていう精神がわからん。そんなノリにはついていけない、いやついていきたくない。以前起きた合コングループの強姦事件とか、こういう空気のなれの果てだったんじゃねぇかとか感じて、胸が悪くなった。

年が明けてからは、客を迎えたり自宅の大掃除をしているうちにこんな日付になってしまった。あと「うみねこのなく頃に」の新作が届いたので、それだけは大急ぎでプレイした。もう一度読み直して、今度はメモとかじゃなく自分なりの整理した見解として一つ文書を公開したいな。出題編も今回でラストのようだし。「うみねこ」に限った話ではないけれど、そろそろ雑記以外のコンテンツをしっかりそろえていきたい。Junkieta.netも公開からもうすぐ三ヶ月。ウェブの技術系ネタをちまちま雑記に書くのも悪くないが、今年はそれ以外にも意図的に触手を伸ばすようにしよう。

2009-01-14, フィードのこと

以前してたはてブのエクスポート機能の話に対して、フィードも吐かないでセマンティックウェブがどうこう言っちゃってる人は、こういうときにどうするのが正解だと考えているのだろうなあとかつぶやかれてるんだけど、セマンティックウェブってフィードを用意しないと正解にたどりつけないものだと言いたいんだろうか? もしそうなら、とりあえずThe Web Kanzakiの「メタ情報とセマンティック・ウェブ」などを読んでみて、もう少し想像の幅を広げてみるといい。そしてたかが更新情報フォーマットとしてしかRDFを理解できない貧しい発想とは別れちまいなよ。…ともあれ僕はDublin Coreの「creator」っていう語彙の使い方について書いただけだ。そもそも記事内容と無関係な点で揶揄されるいわれはない。

ちなみに今のところ自分で用意する手間をかけるつもりもないが、何でもいいからフィードをよこせって人はPage2RSSというサービスが吐いてるAtom1.0RSS2.0が使えるかも。ただし僕の意思と関係なく外部で勝手に生成されてるものだから、データの信用度とか更新速度とかについて一切責任持てないのであしからず。

2009-01-15, 2年前の今日、血が流れた

精華生が殺されたっていう速報が流れて、即座に電話をかけてきてくれた友人がいた。登下校で警察官をしょっちゅう見た。自宅に地元警察が事情聴取に来た。友人が靴のサイズを測られたり当日のアリバイを確認されたりした。大学の職員さんが交代で登下校の安全確認をしていた。「不夜城」と呼ばれた大学で、夜10時に帰宅を勧めるアナウンスが流れた。殺された彼がいかに純粋な学生だったかと報道され、同時に犯人のおぼろげな情報が流れては消えていった。

僕は彼を知らない。彼とて学部も違う大学院生である僕をおそらく知ってはいなかった。でもあの通りを、あの住宅と田んぼで区切られたあの道を、開発が進み大きな通りになっていった登下校のルートを、共有していた。そしてあそこで彼の血が流れ、花が飾られた。田舎の静かな夜道が不気味な何かにおびえる暗がりに変わった。僕が納得できるのは、「事件の加害者も被害者も知らない他人」なんて状況は、本当にただの偶然でしかないってことだけだ。どれだけの人が忘れさろうが、まだ何も、あの日から変わっちゃいない。

2009-01-18, デビルサバイバー、プレイ開始

女神異聞録デビルサバイバーをプレイ中。現状での感想をだらだらと。相変わらず本名が名前入力できない(「澤」が存在しない)寂しさがのっけからあったが、ご愛嬌。進行状況は封鎖から二日目の後半、パーティーの平均レベルが17くらい。悪魔合体について色々計画練るのが楽しい。一方でフリーバトルが好きなだけできちゃうので、育成とか金稼ぎを始めると緊迫した本編の展開と気持ちの乖離が大きくなる。ここは注意しないとダレそう。フリーバトルなしでそこそこ余裕もってクリアできるくらいの難易度、二週目に緻密な育成前提のハードモードとかの方が素直にプレイできそうな感じがする。

戦略パートというか、COMPを使う場面のインターフェースで.hackを思い出す。擬似的なコンピュータの操作をゲーム内で登場させるってパターンは、これからのゲームでは増えていくんだろう。「悪魔」の取得でオークションをシステムとして用いるのは発想としてうまいと思った。でも戦って勝てば「契約」できるって話があったのに、後はずっとオークションで取得するばかりってのは味気ない気もする。今後戦闘とか会話とかで加入する「仲魔」は登場しないのかな。あと「邪教の館.exe」に案内キャラがいないって寂しいな。ヴィクトルみたいなキャラがいるのといないのとでは印象ずいぶん違う。

パーティーはがんがん新しい「仲魔」を作った方が強くなるっぽい。レベルだけ上げていってもスキル性能に差が開く。けっこうバランス配分考えて作ったパーティーもあまり長く利用できないので、本編進行時間より頭ひねってる時間の方が多い。これはゲームの問題というより、完璧主義の傾向が強い僕のプレイスタイルとの相性だな。ファミコンウォーズとかで、前半・中盤・後半の展開をシミュレーションしてから最初の手を進めたりしてきたからなぁ。もっと、勝てばいいんだ勝てば、とりあえずやってから考えよう、という発想でちゃかちゃか進めるべきかもしれない。

僕はアトラス製ゲームの多くを好んでいるんだけど、シミュレーション系ではやや敬遠していた。魔神転生は未プレイ、REBUSは途中で投げた、ステラデウスはなんだかんだとやったものの、後半のストーリー展開に違和感色々…てな具合で。今回は最後まで楽しめるかどうか、とりあえず期待。

2009-01-25, 手作業に飽きてきた

「ウェブ日記」のスピード、軽快さ、柔軟性という話を読んで考えていたこと。僕は自分の雑記執筆スタイルにもそろそろ飽きてきている。毎回毎回「index.htmlを開いてDLを目で追ってDTに日付を挿入してDDを打ち込んで初めて雑記を書き始める」というその手間が、もう許せなくなっている。そして書き上げた後で文末のupdatedを書き換えて、それから月別一覧ページにコピペして、FTPでサーバーに上げる…なんて作業が残っているから、少し文章に詰まるだけで書き上げようという気力まで失ったりしてきた。ツールに思考が制限されるのが嫌だといって自動管理システム作る・使うのを避けていたけど、ちょっと考え方を変える必要があるかもしれない。

もちろん手動更新にはシステムを経由しないで文章の修正が可能という利点が存在する。優柔不断な僕は色々な方針変換(注:内容じゃなくてHTMLのマークアップ方針の転換)をたった三ヶ月の間に行ってきたけど、そのコストが軽い。必要な修正を必要なファイルにだけして終わり。別にコードを見直して生成手順を変えたりとか、そういう手間はいらない。フィードを提供していないのも、自動化のプロセスが増えると意識の変化にサイトの構成を対応させられなくなるという恐れがあったりする。

ただし修正は楽でも、更新に手間がかかる今のやり方だと、新しい記事をアウトプットするのが面倒。原稿書いてマークアップして、まではいいんだけどその後の作業のせいで、ああもうお蔵入りでいいや、とかすぐ思ってしまう。あれはほんと、嫌な気分だけが残る。

思い立ったが吉日ということで、ローカル用Perl/CGIと、それと連携するための自サイト用Grease Monkeyスクリプトを書いた。両方あわせて200~300行程度。わりとこざっぱりしている。

JavaScriptの仕事は自分の雑記ページを閲覧時に新規記事書き込み用のフォームを設置して、書いた文章をhtmlFormElement.addEventListener("change", updatePreview, true)でプレビューしたり、submitを受けた後データの書式を書き換えてローカルサーバにPOSTするだけ。一方でPerl/CGI側は、受け取ったデータを定義リストとして整形したのち、index.htmlと該当月の雑記一覧ページに更新反映、月別一覧ページが存在しないならば前後の文書案内を付加して新規作成する。

ただし更新作業の手動・自動の切り替えは楽なままにしておく。日付が同じだけど内容が少しずれるだとか、そういう時はCGIもスクリプトも使わず今までどおり手作業でDD要素を追加して編集する。手作業の編集を経ても、基本的な書式が統一されていれば動くようにだけ気をつけて組む。

2009-01-25, デビルサバイバー二週目、やってるけども

「女神異聞録デビルサバイバー」、ひとまず一週はジンルートで終了した。楽しかったんだけども、後半に突入すると物語というかキャラクターの肉付けが薄くなっていた。まあ、途中の選択によっては死んでるキャラクタとか、そんなにシナリオの分量割いてらんねーよみたいな対象がちらほらあるとは思うのだけれど、せっかく生かすためのルートを選ぼうとあれこれ考えたのに、その生き延びたキャラが後半になるほど空気になっていくのはちょっと解せない。メガネヤローとか特に。個人に焦点を当てたいのか、それともバベルの塔になぞらえた現代版神話を描きたいのか、はっきりしないような、中途半端さが目立ったかも。

んで二週目は難易度ほぼ無視、クロノトリガーの「つよくてニューゲーム」並の性能を継承した状態で開始できてしまう。マルチエンディングを売りにする以上そういう仕様にするのはわかるんだけども、逆に緊迫した戦闘とはほど遠い作業がゲーム進行に不可欠になっちゃっている。二週目はともかく、三・四週目は僕には辛いかもしれない。

何百回とランダムエンカウントの戦闘を繰り返すRPGと比べると、SRPGは一つ一つの戦闘における緊張感の占める重要性が高い。単なる積み重ね(レベル上げとか)じゃなく、そのステージをクリアするまでの過程として戦闘はある。RPGならMPを節約する程度だった戦略も、SRPGでは残存勢力撃破までの余力とか、移動先の計画とか、その他多くの状況を踏まえた決断が必要になる。そうだったものが、「敵が弱い」だけで全部必要の無い思考になってしまうのがわびしかった。要するに、一週目と二週目でゲームプレイにおける思考がまったく変わってしまうことに違和感が生まれた。

別に出来の悪いゲームとは思っていないし、アトラス節というか、シナリオの随所で人間の絶望とか希望とかの描き方がうまいなぁ、と思わせてくれるところはけっこうある。でも緊迫感のない戦闘が二週目以降続くとなると、「東京封鎖なんて対した事件じゃねーじゃん、悪魔なんていくら沸いてもへーきじゃん」という気持ちがムクムクと。スキルとか悪魔とかは育てたり収集したりという要素が濃いので継承できることは嬉しいけれども、それくらいじゃ簡単には勝てないくらい敵も強くなっていいんじゃないか。シヴァでピクシーを屠る僕は何者なんだ、ダメージ9800とかファイナルファンタジーじゃねーんだから、とか悶々とする。

2009-01-26, 書き続けるのはなぜなのか

更新がしんどいよ、という愚痴に対して闇黒日記から言及いただいた。

眞面目な人だと眞面目に更新しようとして眞面目に文章を書いて眞面目に更新履歴なんかを表示しようとするから面倒になるんだらうと思ふ。俺なんかは何處までも好い加減に濟ませる事でその邊の精神的な負荷を引下げようとしてゐる。

「適當にやる」と云ふのは更新頻度を上げるのには大變重要な事で、ひたすら眞面目にやつてゐたらそのうち自分で自分を許せなくなる。勿論、適當なやり方は叩かれる理由になるし、俺もしよつちゆう叩かれてゐるけれども、その邊は「百も承知」と割切つてやるのも――「ウェブ日記」でも「ブログ」でも、アクセスを集めるのが目的であるならば、必要な事だと思ふ。

イタイところ、というか核心を突かれた気持ちになった。僕は完璧主義に走るか全て投げ出すか、という二択で自分の方向性を決めてしまいがちになっている。実際自分で自分を許せなくなることはかなりあって、自分すら許していないものを他人が許すわけがない、と冷や汗かいたり。これ、余裕が足りなくなると攻撃的になる危ういビビリ方だな、反省しよう。継続的な作業にはほどよい力の入れ方と抜き方が必要。思えば、大学院入試でも似たことを指摘された気がする。

雑記更新を手動がいいか自動がいいかと言う前に、この厄介な眞面目さと格闘しておくことは必要かもしれない。僕の雑記は「Junkieta Fragment」もそれ以前も、「きっちり書き上げたい」というものと、「オマケとして載せよう」というものが混在している。きっちり書くなら日付別の一記事におさめてしまうのはもったいない、とか、ただの気まぐれだったらそもそも載せてもしょうがないのでは、とか、いちいち身悶えしながら書いたりして。挙句どっちつかずの雑文になってしまったり。…書いてみるとけっこう恥ずかしいな。

今朝、中学生の時書いた小説が物置から出てきて思わず読み返してしまった。今読んでみると「アラ」は目立つんだけど、面白かった。小説とか戯曲とか書いてた頃は、「アラ」とかおいといてまずは書きまくることばかり考えていた。作ったものに文句つけられると「このヤロ」とか思うが、「じゃあこれでどうよ」って言うためにまた書いた。ただそれが楽しかったから - というのは、今という時間から見た考え方であって。書くということが自然で当然で、だからこそ欠かしちゃいけないような何か、呼吸みたいなものだった。なにより書くことをやめれば僕は誰からもイナイとみなされるモノでしかないんだと確信していて、でも書いてさえいればまだ人と対話することができるんだ、とひたすら文章にすがりついていた。

きっと楽しかったんだ、あれは。あれが、楽しいっていうことだったんだ。手間なんか手間じゃなかったし、許すも許せないもない、生きていくなんて作業が作業じゃなかった。

2009-01-26, visibilityとdisplay

display:nonevisibility:hiddenは意味が違うよ、という話。以前はてなアンテナのユーザースタイルを書いた時から、表示領域の幅を基準にdisplayプロパティを使うべきなのか? visibilityと区分けしなくていいのか? と頭の中で引っかかっていた。

で、仕様を確認しなおしてたどり着いた結論は。これはdisplayMedia:allであり、visibilityMedia:visualであることを確認すれば納得がいく。visibility:hiddenは視覚的なレンダリングを行うUAに対象を限定した、純粋に「表示」を制御するプロパティだが、display:noneは要素のボックスを生成しない、ようは非視覚系UAも含めて内容をそのものを「消去」、なかったことにする可能性のある指定なわけだ(仕様の形式構造についての話を参照)。

displayとvisibilityでぐぐった結果を読んでると、両者の差異は「表示領域が画面上に確保されるか否かの違い」と書いているところが多いが、これは不十分。一方、A List apartなどでは実際にスクリーンリーダを利用して、スタイルが適用された要素の読み上げはどのようになっているか律儀に調べているけど、実装の如何に関わらずdisplay:nonevisibility:hiddenは、その特性を考慮して使い分けた方がいい(なんかスクリーンリーダでもvisibility:hiddenを読み込んじゃうヤツもあるけど、それって実装がおかしいだろう、という話もあるし)。ちなみに仕様はUAに対してdisplayプロパティのサポートは必ずしも要求しないとしている(HTML user agents may ignore the 'display' property)。これも当然といえば当然。

まとめると、display:noneは「非表示」ではなく「消去」に近い挙動が想定されていて、@mediaルールと組み合わせない限り簡単に使うべきではないんじゃないかということ。それ以外で考えられるケースとしては、DEL要素の内容みたいに記録だけは残しておくが必ずしも通常の閲覧では必要ないもの、くらいか。単純にvisibility:hiddenが表示領域を確保したままになるのが問題だったら、positionプロパティを併用してやるだけで同様の視覚整形は可能なんだから。あ、でもleft:-100%とかはバッド。「左スクロールバー」を出したり、領域内に内容が収まるように拡大縮小率を変更したり、そういう未知のUAは悪魔の証明により否定不可能だよね。

2009-01-28, 「うみねこ」考察の調べもの中

「うみねこのなく頃に」の出題編全体を通した考察を書いてる。楽しい。でも、調べ物がちっとも終わらない。今、朝鮮特需の話を追ってる。Wikipediaは広く浅く関連用語を見るにはいいけど、こちら側に明確なニーズがある時に応えてくれる感じではないんだよなぁ...特に歴史ネタは要出典って書かれるまでもなく、出所不明な議論が多いし。

しかしメモと考察の書き足しがえらい量になりそうでどう公開しようか悩む。が、悩んでるうちにまた「お蔵入りでいいや病」が発生すると困るので、ある程度書いたら半端でも公開してしまおうと思う。追記前提の文書公開。それでいいはず、「うみねこ」自体リアルタイム性が命の推理呼び込みゲーなんだから。迷ってるうちに解答編が発売される時期になっちゃったら興ざめだ。

2009-01-29, cite属性追跡スクリプト

ダブルクリックでcite属性を辿るUserScript。こういう芸当を考えればたしかにサイト側CSSにはblockquoteのcontentプロパティも別にいらない。あって困るもんでもないだろうから、Junkieta.netでは消さないけど。

Ctrl付きなら新規ウィンドウ立ち上げって形に改変して使わせてもらうことにした。ちなみに手元のFirefoxはwindow.openを新規タブ生成に設定してるので、僕の場合ウィンドウオープンにはなってないが。

window.addEventListener("dblclick", function(e) {
  for(var target=e.target; target; target=target.parentNode) {
    if(target.cite) {
      if(e.ctrlKey) window.open(target.cite);
      else location.href = target.cite;
      break;
    }
  }
}, true);

これtagNameを確認しないとINSDEL要素のcite属性も拾うわけなんで、@descriptionblockquote|qins|delを足しといたらいいんじゃないかと。

2009-01-29, 闇黒日記閲覧用スクリプト

「人のコードを読むとスクリプトを書きたくなる病」の発作がおさまらないので、闇黒日記日別閲覧スクリプトを作った。バックナンバーでも日付別にDL要素が作られている時期のならいける。

Ctrl+
一日前の記事を表示。
Ctrl+
一日後の記事を表示。
Ctrl+
その月の最初の記事を表示。
Ctrl+
その月の最後の記事を表示。

もともとこの雑記用に書いてたんだけど、こういうのはサイト側で設置すると単なる余計なお世話だったりするから微妙。実はdeadspace向けのも作ろうとして、日付別とOL>LIを一つずつ拾うのとどっちがいいか迷ってるうちに面倒臭くなってしまった。

2009-01-30, google用ユーザースタイルシート追加

google検索結果向けスタイルシートを公開。方向性はgoo辞書のスタイルと一緒で、情報+余白カットメインのユーザースタイル。ロゴをフォントに入れ替えたり、max-width上書きしたり、スペース確保の小技をちょこまかとやってる。あとgoogleに対してはスタイルシートとは別にtabindexを振るスクリプトも併用してる。

// ==UserScript==
// @name           add tabindex attribute
// @namespace      http://junkieta.net/
// @include        http://www.google.com/search?*
// @include        http://www.google.co.jp/search?*
// ==/UserScript==

Array.forEach(document.links, function _(n) {
 n.removeAttribute("onmousedown"); // 履歴追跡ハンドラ殺し
 if(n.parentNode.nodeName == "H3") n.setAttribute("tabindex", _.i ? ++_.i : (_.i=1));
});

googleとは別件でこんなのも使う。

// ==UserScript==
// @name           kill redirect
// @namespace      http://junkieta.net/
// @include        http://a.hatena.ne.jp/*
// ==/UserScript==

Array.forEach(document.links, function _(n) {
  var href = n.href.replace(this, "$1");
  if(!href) return;
  n.href = href;
  n.tabIndex = _.i ? ++_.i : (_.i = 1);
}, /^http:\/\/a.hatena.ne.jp\/go\?(.+?)\d{14}$/);
2009-01-31, HTML4.01仕様書参照用スマートキーワード

CSS2.1仕様書参照用スマートキーワードの二番煎じ。tagNameからHTML4.01仕様書の定義ページへ直行。キーワード設定はhtml4?がベターかな。

javascript:(function(tag, url, index) {
  if(index.hasOwnProperty(tag = tag.toUpperCase()))
    location.assign('http://www.w3.org/TR/html401/' + url[index[tag]] + '.html#edef-' + tag);
})(
  '%s',
  ['interact/forms','interact/scripts','present/frames','present/graphics','present/styles','struct/dirlang','struct/global','struct/links','struct/lists','struct/objects','struct/tables','struct/text'],
  {A:7,ABBR:11,ACRONYM:11,ADDRESS:6,APPLET:9,AREA:9,B:3,BASE:7,BASEFONT:3,BDO:5,BIG:3,BLOCKQUOTE:11,BODY:6,BR:11,BUTTON:0,CAPTION:10,CENTER:3,CITE:11,CODE:11,COL:10,COLGROUP:10,DD:8,DEL:11,DFN:11,DIR:8,DIV:6,DL:8,DT:8,EM:11,FIELDSET:0,FONT:3,FORM:0,FRAME:2,FRAMESET:2,H1:6,H2:6,H3:6,H4:6,H5:6,H6:6,HEAD:6,HR:3,HTML:6,I:3,IFRAME:2,IMG:9,INPUT:0,INS:11,ISINDEX:0,KBD:11,LABEL:0,LEGEND:0,LI:8,LINK:7,MAP:9,MENU:8,META:6,NOFRAMES:2,NOSCRIPT:1,OBJECT:9,OL:8,OPTGROUP:0,OPTION:0,P:11,PARAM:9,PRE:11,Q:11,S:3,SAMP:11,SCRIPT:1,SELECT:0,SMALL:3,SPAN:6,STRIKE:3,STRONG:11,STYLE:4,SUB:11,SUP:11,TABLE:10,TBODY:10,TD:10,TEXTAREA:0,TFOOT:10,TH:10,THEAD:10,TITLE:6,TR:10,TT:3,U:3,UL:8,VAR:11}
);

属性名はかったるいのでパス。

関連リソース

前後の文書
webmaster@junkieta.net
published:2009-01-05, updated:2009-01-31