トップ 最新 追記

じじぃの日記、ツッコミ可

Twitter: @jijixi_org
Xbox Live: jijixi

初心者が書いた OCaml 入門
Spotlight tips サイト内リンク集
1970|01|02|
2003|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|11|
2011|05|
2012|01|

2008-08-01 [長年日記]

% [雑談] F-17

ここのところ過去作に対するオマージュ的な要素が減ってきて寂しいなーと思ってたんだが (ランカ・アタックも名前負けっぽかったし)、今回はそれがてんこ盛りでおっさん世代的に見てすばらしい展開。 作画が微妙なところとかあったりしたが、マクロス的にはそれも含めてネタとして認定して良いのじゃないか(ぉぃぉぃ)。 だがオズマに関する事は何を書いてもネタバレになりそうなので書かない。

とりあえずオープニングは「ライオン」じゃなかった。 あれ、見るアニメ間違えた?

メインの話 (オズマネタ) 以外にも、クランとミシェルのラブコメがあったり、ルカの怪しい動きがあったり、バジュラ (この表記違和感あるなー) の大変な秘密が明らかになったりと、盛り沢山な内容だった。

% [雑談] ミンメイ人形とテグザー

たしか隠れキャラ (アイテム?) か何かでミンメイ人形があったんだと思った。

% [clip] グラディウスなどに代表されるシューティングゲームの殆どは何故丸裸でステージ1から挑むのか?

こういう不毛なネタで語るのは好きだw

そんなん言ったらさ、市長なんて重職に就いているくせに、犯罪者が巣食う街に 上半身裸の手ぶらで出ていくやつもいたぞ。

いくら娘が囚われているとは言えあれはねーよ。しまいにゃ汚職警官の吐いたガムまで食ってたぜ?

ハガー市長www でも吐いたガム食うのってファイナルファイトだっけ、ビジランテとかじゃなかったか。

DARIUSを50インチ3画面でやりたかったなあ

150インチかよw

計算違うw

% [game] 零4日記

タイトルに4なんてついてはいないが、いちいち「つきはみのかめん」とか入れるのはかったるいのでいいのだ。

なんだかんだでおもしろいので (操作はバイオ4みたいになっちゃったけど、話のノリは今までと同じだし)、手首イテーとか思いながらついつい長くやってしまう。 昨夜は二章まで終わらせたところで終了。 各章の終わりに月が欠けていく演出があるんで、15 くらい章があるのかもしれん。

で、今三章を始めたところだが、三人目の主人公がオズマすぎて笑った。 一人目の主人公の名前がルカで (女の子だが)、そいつを探しに来たという設定なので、あの声と髭面で「ルカはどこだ」とか言ってたりしてもうオズマにしか見えん(苦笑

% [game] 零4日記、心臓が心配になってきた

三章に入ってからビックリドッキリ演出が急に多くなってて困る。

「見たのか!!」

ヒィ見てません、見てませんてば。

この主人公だけ戦い方がカメラじゃなくてムズいから、なおさら泣きそう。

ところで電話の演出が Wii ならではでおもしろい。 突然鳴るはずのない電話が鳴り始めるというのはホラーのお約束だが、その電話を取るとテレビからではなく Wii リモコンのスピーカーから声が聴こえてくるという。 要するにほんとに電話に出たようにしろと。

% [game] 零4日記、いー感じに神経磨り減るの巻

あーほんと磨り減る。 でもこの現実では体験できないタイプのストレスは逆に気持ちいいわけで(苦笑

もちろん現実じゃないからいいのであって、こんなタイプのストレスを感じる実体験なんて絶対したくないわけだが。

四章に入って最初の主人公に戻ってきたが、当初から予想していたとおり敵が複数同時に出てきたときに難易度が跳ね上がる。 逃げられねーっての、この操作体系じゃ。

で、双子の幽霊にボコボコにされて「死ぬから、死ぬから〜」と泣きそうになりながら倒したら、間髪入れずになんか「見ちゃいけない!絶対見ちゃいけない!!」とかいうのが出てきて (意味不明だな、でもうまく説明できないや)、画面が白黒 + ノイズだらけに。

知ってるよ、このエフェクト。 過去作でラスボスが即死攻撃しかけてくるときのやつだ。 死ぬ、これは触られたら絶対死ぬ。 双子のせいで瀕死の状態なのに、さらに半泣きで逃げ惑うはめに。 もちろん半泣きなのはゲームのキャラクターじゃなく、わし。

零は零のままで良かったなあ。 バイオはもうホラーじゃなくなっちゃったし。 サイレントヒル5はどうなんだろうね。 E3 かどっかで公開されたムービー見た感じだと、なんか変に機敏な動きになっててアクション要素が強化されちゃってるみたいで嫌な予感がしなくもないんだけど。 つーか、わしはサイレントヒル5のために PS3 を買わなきゃならないんだろうか。

本日のツッコミ(全1件) [ツッコミを入れる]

% きむら(K) [>だがオズマに関する事は何を書いてもネタバレになりそうなので書かない お心遣いに感謝します(笑) 今回のOPいい..]


2008-08-02 [長年日記]

% [Ruby][Rails][ActiveSupport] Mac の合字ファイル名で困ったときには ActiveSupport::Multibyte::Chars#normalize で処理すべし

ref. Macの合字ファイル名で困ったときにはUnicode::Normalizeで処理すべし - 狐の王国

ちょうどたまたま同じことでわしも困っていて調べたので書いてみる。 ActiveSupport には ActiveSupport::Multibyte::Chars というクラスがあって、これは要するにマルチバイト文字列を扱うために拡張された String である。 で、基本的にはほとんどのメソッドは method_missing で Chars#handler が返すハンドラに丸投げされるんだが、デフォルトだとそのハンドラは ActiveSupport::Multibyte::Handlers::UTF8Handler というやつで、こいつが normalize というメソッドを持っている。

…… とまあ、中身的なことを長々と書いても読む方も面倒だろうから、この辺で本題に入ろう。 興味がある人はソースを読むといい。

さて、この機能の一番シンプルな使い方はおそらく以下のようになる。

% irb
irb(main):001:0> require 'rubygems'
=> true
irb(main):002:0> require 'active_support'
=> true
irb(main):003:0> 'hoge'.chars.normalize(:c)
=> #<ActiveSupport::Multibyte::Chars:0x115f828 @string="hoge">

もちろん Rails 環境であれば ActiveSupport は勝手に読み込まれるので 1, 2 行目は必要無い。 active_support を require することによって String クラスには chars というメソッドが追加される。 このメソッドは要するに ActiveSupport::Multibyte::Chars.new(self) ということをやっている。 で、Chars クラスに normalize(:c) というメッセージを投げると、method_missing によって ActiveSupport::Multibyte::Handlers::UTF8Handler.normalize(self.string, :c) という感じのものが実行される (細かいところは端折ってるので実際のソースとは違うよ)。

この場合、'hoge' という文字列を Normalization Form C で正規化するという意味になる。 サポートされている正規化方法は、

irb(main):004:0> ActiveSupport::Multibyte::NORMALIZATIONS_FORMS
=> [:c, :kc, :d, :kd]

というように、C, KC, D, KD の四つ。 normalize メソッドでは正規化方法の指定を省略できるが、デフォルトがなぜか KC なので注意が必要。 KC で正規化しちゃうと記号の類とかがごっそり変換される可能性があるので、場合によっては「正規化しすぎ」な状態になっちゃうかもしれない。 もちろんその方が嬉しいときもあるだろうから、その辺は必要に応じてということで。

ちなみに ActiveSupport が嫌いな人、特に core_ext によって組み込みクラスがごっそり拡張されてしまうのが我慢ならないような人は、active_support を require するのではなく active_support/multibyte だけ require すると良いかもしれない。

% irb
irb(main):001:0> require 'rubygems'
=> true
irb(main):002:0> require 'active_support/multibyte'
=> true
irb(main):003:0> ActiveSupport::Multibyte::Handlers::UTF8Handler.normalize('hoge', :c)
=> "hoge"

2008-08-03 [長年日記]

% [game] 零4日記、三人目主人公おそらく終わり

十章までクリア。 前作と同様、三人の主人公の話を章ごとにちょっとずつバラバラに進めていく形なんだが、おそらくこの十章で三人目 (オズマもどき) の話は終わったと思われる。

「ああ、そういうことだったのか……」

そのセリフはそっくりそのままわしに言わせてくれ(苦笑

でも結局、どこが「それ以前」でどこが「それ以後」なのか、よくわかんないなあ。 まあホラーでこの手の仕掛けを使う場合は「よくわかんない」方が良いとは思うけど。

さて、章の終わりに表示される月はこれまでのペースからすると、あと一・二回で新月になろうかという感じなんで、残りの章の数もそれと同じくらいだと思われる。 二人目の主人公の話も前回で終わってるような気がするから、残りは全部一人目が担当かな。 前作もそんな感じだったし。

% [game] 零4日記、とりあえず一周目クリア

ラスボスがウザいのはこのシリーズのお約束だが、今回輪をかけてウザかった(疲

ボスとの戦い自体は比較的楽なんだが (Easy モードでやってるせいもあるだろうけど)、ボスを倒した後にピアノを弾かされるのがウザい。 リモコンを使ったポインタの指示で鍵盤を押すというやつなんだが、完璧に曲を憶えてやっても高確率で失敗する。 音ゲーよろしくちゃんとリズムを合わせて弾かないといけないんだけど、リモコンでポイントするのが間に合わねーっての。 で、あせって別のとこ押しちゃうっての。

そんで何度も何度も失敗するわけだけど、三回失敗するたびにボスが帰ってくる。 要するにボスを追い払って、その間に曲を弾きましょうっていう話なんだけど、全然うまく弾けないから何度も何度もボスと戦うはめになるわけ。 もう、うんざり。

最終的には何回戦ったのかな、たしか五回くらいは行ってたような気が。 っていうかリモコンでピアノ弾くとかバカだろ。 ピアノ習ってるって設定なのに一本指奏法かよ。 せめて正確な順番で押せたら OK くらいにしてください。 リズムとか無理。

それにしても二人目の主人公である海咲 (ミサキ) は何のために存在したのかわからなかったな。 結局、流歌にも霧島にも絡まなかったし。 ムービーリスト見るかぎり、またトゥルーエンドがあるっぽいから、そっちで活躍すんのかね。 他の主人公達よりもラスボスの方に強い因縁があるキャラだから、可能性はあるな。


2008-08-04 [長年日記]

% [雑談][Scala] よろしい、では Stream だ。と思ったんだけど結局やっぱり Stream はあてになんなかったという話

ref. filterって高速化できないのか? - ザッ・カン

それ Stream 使えば良いんじゃね?と思ったわけですよ。 そりゃ filter 挟んだ分余計な一時リストが増えるんだから遅いだろうさ、でも遅延リストならばっちりじゃん、とね。 それじゃあ、ってんでベンチマークコードを拝借して、

object sum_filter extends Benchmark {
  def run = {Stream.range(0, 10000000).filter(_ % 2 == 0).foldLeft(0){(acc, i) => acc + i}}
}

みたいにして実行してみたら……

java.lang.OutOfMemoryError: Java heap space

おいぃ!! なんでやねん。 そんな大量のメモリが必要になるような処理じゃないと思うんだがなあ。

というわけで、引き合いに出したはいいものの結局全然解決策を提示できませんでした。ごめんなさい(苦笑

ちなみに。

Hugs> foldl (+) 0 $ filter even [0..10000000]
[1]    2148 segmentation fault  hugs

あれー? なんか根本的にこの方法じゃダメってことかなあ。 ghci だとこうだし↓

Prelude> foldl (+) 0 $ filter even [0..10000000]
*** Exception: stack overflow

たぶん出てるエラーはそれぞれ違うけど、現象としては全部スタックオーバーフローなんだろうなあ。 (Scala の場合はその前にヒープが溢れてるみたいだけど。スタックが詰まれていく一方ならヒープも解放されないんだろうし) しかし、なんでそうなるのかがよくわからん…… 遅延リストって難しいね。

本日のツッコミ(全7件) [ツッコミを入れる]

Before...

% shelarcy [領域計算量の問題ですね。 > どこでスタックが積まれてるかイマイチイメージできないというか。 手前味噌で..]

% jijixi [みなさんアドバイスありがとうございます。 shelarcy さんの記事は読んだ記憶がありました。全然中身が頭に入っ..]

% きむら(K) [うーむ。 とんだ勘違い(あーんど恥さらし)。 自分が想像していたのと違うカラクリで動いてるようで >遅延評価。 ..]


2008-08-05 [長年日記]

% [雑談][Haskell][Scala] Stream が OutOfMemoryError の続き

Haskell で foldl (+) 0 $ filter even [0..10000000] がうまくいかない理由は foldl のせいだという (わしにとっては) 衝撃的な事実がみなさんからのツッコミによって判明したわけだが、 おそらくこのことは「Haskell だから」、つまり「遅延リストだから」ではなく「遅延評価戦略の言語だから」こうなっているということのように思える。

さて、では本題であったところの Scala はどうかというと、正格評価の言語である。 ということは、

override def foldLeft[B](z: B)(f: (B, A) => B): B = { 
  def loop(s: Stream[A], z: B): B = 
    if (s.isEmpty) z
    else loop(s.tail, f(z, s.head))
  loop(this, z)
}

このコードは普通に末尾再帰で、アホみたいにスタックやヒープを食いつぶしたりせずに動くように思える。 やはり Scala の場合の問題は filter なのではなかろうか。 ということで以下が filter のコード。

override def filter(p: A => Boolean): Stream[A] = {
  def loop(s: Stream[A]): Stream[A] =
    if (s.isEmpty) s
    else if (p(s.head)) Stream.cons(s.head, loop(s.tail))
    else loop(s.tail)
  loop(this)
}

うーん、条件式が true のときに末尾再帰になってないけど、試したときのコードは偶数かどうかだったから、要素一つごとに末尾再帰になるしスタックがアホみたいに積まれるようには思えないな。

そうするとあれだろうか、ほんとに単純に、あの数の要素が全部最後まで評価されると (tail の部分の評価が遅延されていて、一度評価されるとその内容がキャッシュされるようになっている) その分だけ Stream クラスのインスタンスが生成されて、それを置いておくだけのヒープが足りないというだけなんだろうか。 ヒープサイズを増やしてやればちゃんと動いてくれるんだろうか。

…… だが、scala コマンドはデフォルトで "-Xmx256M -Xms32M" という java オプションを付けて起動されているのである。 これ以上増やせって、どんだけ富豪なんだよ。とほほ。

% [雑談][Scala] よろしい、では Iterator だ。だがやっぱり解決しなかった件

きむら(K)さんのナイスヒント

Python のジェネレータみたいのを想像してたんですが。

それだ!!

Scala にも Python のジェネレータみたいのあるよ。 それが Iterator。 よーし、それじゃーってんで、

matt-k さんのコードに以下のような追加をして、

--- Test.scala.orig  2008-08-05 19:23:57.000000000 +0900
+++ Test.scala 2008-08-05 19:40:52.000000000 +0900
@@ -9,7 +9,12 @@
     def run = {(0 until 10000000).filter(_ % 2 == 0).foldLeft(0){(acc, i) => acc + i}}
   }
 
+  object sum_iterator extends Benchmark {
+    def run = {Iterator.range(0, 10000000).filter(_ % 2 == 0).foldLeft(0){(acc, i) => acc + i}}
+  }
+
   sum_if.runBenchmark(5).foreach(println)
   sum_filter.runBenchmark(5).foreach(println)
+  sum_iterator.runBenchmark(5).foreach(println)
 
 }

コンパイルして実行……

% scalac Test.scala
% scala -classpath . Test
3893
3836
3737
3708
3797
9008
8748
9778
10631
9375
9785
9651
9066
8583
8620

下から五つが追加した分ね。 でも…… あれー?遅いな、おい。 これはがっかり。 一つ目の方法並みまで行くかどうかは不安だったけど、二つ目よりは確実に速いと思ったんだけどなあ。

というわけで、やっぱり今回も解決せず。ごめんなさい(苦笑

% [雑談][Haskell] Data.Traversable に関して調べてみようと思ったが……

ikegami さんが書いてた Data.Traversable というのを調べてみようと思ったんだが、さっぱりわけがわからなくて挫折した。 リファレンスを見ると、

Functors representing data structures that can be traversed from left to right.

とか書いてあるんで、なんかこう適当なデータ構造を平らにしてなめっていけるにするような感じの仕組みなのかな。

つーか、とにもかくにも、

<*> <*>

こういうのが AA に見えてしかたがないんだが(ぉぃ

% [Perl][Ruby] Ruby ユーザのための Moose 入門 (中身スカスカだから期待しないように)

Ruby とか Python とか使ってると、とてもじゃないけど Perl5 標準の仕組みじゃオブジェクト指向プログラミングなんぞしたいと思えないでしょ。 でもなんか、Moose ってやつは開発者が Ruby に乗り換える代わりにこれを書いたとかいう代物らしいので、それならやる気になるかもとか思ってちょっくら入門してみた次第。

で、なんか適当なものを書いてみようと思ったんだけど、ちょうどいいお題が見付からなかったんで、しょうがないから Ruby で典型的な基礎的コードを書いてみて、それを Moose に移植するということをやってみた。 ちなみに、Moose の特徴的な部分 (アクセサの型制約とかそういうの) は全然使ってないので、面白味に欠けるけどそういうのはググればいいと思うよ (投げっぱなした)。

% cat hoge.rb
class Hoge
   attr_accessor :foo
   attr_reader   :bar

   def hoge
      puts self
   end
end

module Fuga
   def fuga
      puts 'fuga'
   end
end

class Piyo < Hoge
   include Fuga
end

hoge = Hoge.new
hoge.foo = 'foo'
puts hoge.foo
(hoge.bar = 'bar') rescue puts $!
hoge.hoge

piyo = Piyo.new
piyo.hoge
piyo.fuga
% cat hoge.pl
package Hoge;
use Moose;

has foo => (is => 'rw');
has bar => (is => 'ro');

sub hoge {
   my $self = shift;
   print "$self\n";
}

package Fuga;
use Moose::Role;

sub fuga {
   my $self = shift;
   print "fuga\n";
}

package Piyo;
use Moose;
extends 'Hoge';
with 'Fuga';

package user;
use strict;
use warnings;

my $hoge = Hoge->new;
$hoge->foo('foo');
print $hoge->foo . "\n";
eval { $hoge->bar('bar') };
print $@;
$hoge->hoge;

my $piyo = Piyo->new;
$piyo->hoge;
$piyo->fuga;

以下、実行例。

% ruby hoge.rb
foo
undefined method `bar=' for #<Hoge:0x27998 @foo="foo">
#<Hoge:0x27998>
#<Piyo:0x277cc>
fuga
% perl hoge.pl
foo
Cannot assign a value to a read-only accessor at (eval 72) line 1
        Hoge::bar('Hoge=HASH(0x932fe8)', 'bar') called at hoge.pl line 32
        eval {...} called at hoge.pl line 32
Hoge=HASH(0x932fe8)
Piyo=HASH(0x9534d0)
fuga

さて、問題は Ruby なら相当のところまで中身をいじくれるわけだけど、その辺の具合が Moose ではどうなのかということだな。 なんかちょっと楽しくなってきたぞ。


2008-08-06 [長年日記]

% [雑談] ふと気付けば八月なんだよね

「もう八月」というより「まだ八月」って感じのような気もするが。

なんか今年は季節感がおかしいから、「あれ、今何月だっけ?」と考えちゃうことが多すぎる。 八月だから暑いのはあたりまえなんだけど、その相関関係が信用できないというか。 だってなんか五月くらいの方が暑かった気がするし(苦笑

% [雑談] いやいや、オリジナルにだって出てますってミンメイ人形

でもイマイチ自信無かったから証拠を探してみた。→ こちらのページの一番下の画像。

画像は全て X1 版と書いてあるけど、88SR 版でも同じはず。 88SR なんていうブルジョアアイテムは持ってなかったけど、Beep! の愛読者だったわしが言うんだから間違いない(あてにならんわ)。

% [雑談][Rails] Rails 2.0 以降では Ajax リクエストが絡む JavaScript コードは手書きせずにヘルパを使うべき

いくら「おれさまは JavaScript が得意だから Rails のヘルパが吐く糞コードなんか使ってられないぜ」とか思ったとしても。

なんでかっていうと、CSRF 対策用のトークンをパラメータに含んだものを吐いてくれるから。 どんなヘルパメソッドがあるかは ActionView::Helpers::PrototypeHelper のマニュアルを読むべし。

そもそも prototype.js なんて使ってねーよ、という人は…… ご愁傷様。 一応、コントローラの form_authenticity_token というメソッドでトークンを取得できるので、authenticity_token というパラメータにその値を入れてやるように細工すれば行けるんじゃないかと思うけど、わしは JavaScript 書けない人だから prototype.js をヘルパ経由で使う以外の選択肢なんて考えたことも無いんで (や、それじゃマズいなと常々思ってはいるんだが) 実際のところはよくわからん。

どっちにしても、安易に CSRF 対策を OFF にしちゃうのはちょっともったいないと思う。

% [雑談] どうせ北海道は札幌くらいのもんだろ?と思ってたら普通に我が家も写ってて苦笑した

今話題の Google スト(ry の話ね。

ゴミが出てたのでどうやら朝に撮影されたようだ。 ちなみに、うちの近辺にはいわゆるゴミステーションのようなものは無くて、適当に道路の近くにゴミを出しておくと収集車が道なりに総なめしていくという昔ながらのスタイルなのである。 牧歌的だなあ。

% [雑談] 蠅の危機回避能力は異常

さっきから部屋に入ってきた蠅がうるさくて血管切れそう。

ウザいから退治してやる、と思って身構えてると巧妙に姿を隠して見付からないくせに、こっちが他の作業に集中し始めた頃に首の周りとかにたかってきやがる。 あーーーー!!!!マジウゼーーーーー!!!!

% [Perl][Moose] インスタンス変数は型付きにできるのにメソッドはできないなんて不公平だ、という人のためのモジュール MooseX::Method

まあ、型付きと言っても型チェックは実行時なんでちゃんとテスト書かないと何かってーとすぐ止まるがっかりなアプリとかができあがるに違いないのだが、まあそれはそれ。

Moose が元々持っているインスタンス変数あるいは属性あるいはプロパティあるいは…… まあなんかそんな感じのものの型チェックはこんな風に使う↓

% cat attr.pl
package Attr;
use Moose;
has foo => ( is => 'rw', isa => 'Int' );

package user;
use strict;
use warnings;

my $obj = Attr->new(foo => 10);
print "$obj->{foo}\n";
$obj->foo('1.1');   # ここで死ぬ
print "$obj->{foo}\n";
% perl attr.pl
10
Attribute (foo) does not pass the type constraint because:
Validation failed for 'Int' failed with value 1.1 at (eval 71) line 7
        Attr::foo('Attr=HASH(0x931ab4)', 1.1) called at attr.pl line 11

ここで has 関数の isa というオプションに指定している 'Int' が型指定。 Int は Moose 組み込みのもので整数じゃないとダメよという印。 その他の型については perldoc Moose::Util::TypeConstraints すると良い。 なんかジェネリックなコレクションぽく ArrayRef[Int] みたいな指定もできるらしい。

そんな感じで、こういうことができるならメソッドの引数にだってこういう機能が欲しくなるのが人情ってもの。 そこでどっかの偉い人が作ってくれたのが MooseX::Method である。

% cat meth.pl
package Meth;
use Moose;
use MooseX::Method;

method foo => named (
   hoge => { isa => 'Int' },
   fuga => { isa => 'Int', required => 1 },
) => sub {
   my ($self, $args) = @_;
   "hoge is $args->{hoge}, fuga is $args->{fuga}\n";
};

package user;
use strict;
use warnings;

my $obj = Meth->new;
for my $args (
   { hoge => 10 },               # 必須引数 fuga が無い
   { fuga => 'fuga' },           # 型が違う
   { fuga => 20, hoge => 10 },   # 正常
) {
   if (my $r = eval { $obj->foo($args) }) {
      print $r;
   } else {
      print "$@\n";
   };
};
% perl meth.pl
Parameter (fuga): Must be specified at meth.pl line 23

Parameter (fuga): Argument isn't (Int) at meth.pl line 23

hoge is 10, fuga is 20

なんかヘンテコな DSL っぽくなってるけど、要するに

method( メソッド名, 引数パターンを指定する何か, 無名関数 )

という感じの method という関数があるだけだと思う。 で、引数パターンを指定する何か (メソッドシグネチャとかそういう感じ?) というのを作るための関数が上の例で使っている named というやつ。 これは要するにキーワード引数的なものを作る場合に使うやつね。 他に、単純かつ順番に羅列する positional や、両者の合成バージョンの combined なんてのがある。

えーと、あとはまあ perldoc MooseX::Method で。

なんか MooseX という名前空間は Moose の機能拡張のために予約されてるっぽい場所のようなので、後で探索してみようと思う。 なんかたくさんあるみたいだ。

本日のツッコミ(全4件) [ツッコミを入れる]

Before...

% jijixi [ちぇっ、プライバシーも何もあったもんじゃないw]

% きむら(K) [いいなあ、楽しそうでw ]

% jijixi [普段見てる景色がインターネット上で見えるというのは、楽しくもあるけどある意味怖いですね(苦笑 普通に人間の視点だか..]


2008-08-07 [長年日記]

% [clip] sm4185206 (マクロス検証動画 ロイ・フォッカーVsオズマ・リー)

初代を見てない人もこれで安心。

パインは悪くない、サラダが悪いんだ

ワロスw

% [clip] nm4206342 (ノーザンクロス)

フルバージョン。 ラジオからの引用かと思ったら違うっぽい。 絶妙に低音質だったりとか、実は宣伝のための意図的リークじゃないのか、これ(苦笑

% [clip] sm4101169 (ツンデレカーナビ 釘宮理恵ver)

MAD かと思ったらガチだったという。

しかしこれは実用性があやしいな。 釘宮病じゃない人にはウザいだけだし、病気の人は気が散って運転にならんのじゃないか?(苦笑

で、わしは別にそっちの病気じゃないのでこれ自体はどうでも良いんだが、最後の方の店頭デモ中って画像にとてつもない名前を見つけてしまって、思わず MAPLUS とやらのサイトをチェックしにいってしまったよ。→ MAPLUSポータブルナビ2 "DEMO/音声サンプル"

若本さんwww

% [game] 忌火起草 解明編

PS3 は持ってないし買う気もなかったんで前作 (っていうのか?) はやってないけど、なんかそれプラス解き明かされなかった謎を解く話が追加されてるとかそんな感じらしい。 PS3 版が出た当時は PS3 ならではのどうのこうのって宣伝文句が踊ってた気がしなくもないが、それの完全版が Wii で出るってのはなんというか……

ともあれ、ちょっとだけやってみたんだけど、なんだかこう…… 微妙な感じ。 話の内容は始めたばっかで全然わかんないから置いとくとして、システムがなんか違うんじゃねーの?という気がしてならない。

地の文とは別の流れでセリフが音声として流れる、っていうのはまあ良いよ。 そのこと自体はわりとおもしろい。 でもさ、その音声には字幕入れようよ。

金八先生のときもそうだったけど、字幕が無いとしょっちゅうバックログ見て何言ってたか確かめないといけないんだよね。 それがほんとに流れを損ねてくれるんでイライラする。

世の中、ヘッドホンで外界の音を遮断してゲームやる人間ばっかじゃないんだから、その辺気を使ってくれないと困るよ。 このゲームに限ったことじゃないけど、突然犬猫が吠えだすこともあれば、近所のガキンチョが叫びだすこともあれば、緊急自動車がサイレン鳴らして走ってくることだってあるわけで、そのときに大事なセリフを聴きのがしたりするともうムキーってなる。 せめて字幕が出てりゃ話の筋がわからなくなることもないのに。

まあね、このゲームはバックログで一応読み直せるからある程度許せるよ。 流れが損なわれるのは間違いないけど。 でも、ムービーだらけのゲームでとばすと話がわからなくなるような流れのくせに字幕が入ってないのとかは、ディスク割りたくなることがある。 最近どんなのあったか思い出せないけど、しばらく前のならグランディア3とか。

% [雑談] EeePC に Xandros 入れたその後

Debian/etch の apt-line を追加して、aptitude の依存性自動解決オプションを全部オフった状態でいろいろ入れた。 いろいろっつっても、日本語フォントとかプログラミング言語とかまあその辺。 aptitude のオプションをデフォのままにしておくと、依存性のせいで Xandoros が元々持っているパッケージががんがん壊れていくので注意。 おかげで一回再インストールしたよ(苦笑

godi を入れようと思ったらどういうわけかうまく行かないので (OCaml 本体のビルドが失敗する)、 しかたなく deb の 3.09.2 を入れた。がっかり。

Windows のとき、SDHC への書き込みで変なエラーが出ていた問題は、やっぱり Linux にしても変みたい。 結局ハードウェア的な障害なのかねえ。

% [game] 忌火起草日記、細かいけど気になるんだからしかたがない

『街』みたいに tips があるんだけど、tips を選択するには一つしかない選択用ボタンを押すしかない。 で、それは別に良いとしてだ。 画面内に複数の tips がある場合にボタンを押すと、既読だろうがなんだろうが必ず最初の項目にカーソルが合わさる。 …… UI 設計したやつ出てこい。バカじゃねーのか。

ただでさえ押しにくい「-」ボタンが割り当てられてるってのに、例えば三つの tips があったら全部読むためにそのボタンを六回も押さなきゃないなんてバカすぎる。 未読が選択されるようにしとけば三回で済むのにだよ。 同様の機能は最近のスパロボなんかにもあるけど、ちゃんと未読に飛ぶよ。 そもそもこの機能の元祖だと思われる街だってそうじゃなかったか?

未読・既読の管理をしてないってんならまだ許す余地もあるけど、ちゃんと色変わるじゃないか。 未読がどれかなんてわかってんだろ。 せめて tips 選択状態に入ったら方向キーでカーソル移動できるようにしろよ。 こういう部分は細かいけど重要なところだと思うんだがなあ……

なんか愚痴ばっか書いててもつまんないんで、話の内容について。

…… なんかサイレントヒルっぽい? まだよくわからんけど。 リアルすぎる幻覚 (妄想?) とかがなんかそれっぽいというか。

% [game] 忌火起草日記、この手のものを純粋に楽しめなくなってるのかなあ

えー、これ愛美が黒幕で FA じゃないの? あらゆる面で怪しすぎるんだけど。

でも、怪しすぎるところが逆にひっかけなのかもと思わなくもないしなあ。 まあ、かまいたちの夜みたいにキャラの役割まで大きく変わるようなマルチシナリオなんだとしたら、今回はそうだけど別の話では全然違うとかありそうだし (もちろんその逆も)、あんまり気にしてもしかたない気はするけど。 っていうか、この作品て推理物じゃないよね。


2008-08-08 [長年日記]

% [雑談][Perl] Perl の暗黒面

Perl には次のような特徴がある。

  1. ネストしたリストは平らにされる
  2. ハッシュの中身は実質リストである

そうだとわかっていても、以下のような例はちょっとドキッとする。

% cat list_test.pl
use strict;
use warnings;
use Data::Dump;

sub make_list {
   (1, 2, 3);
}

sub make_hash {
   { foo => make_list(), bar => 'hoge' };
}

print Data::Dump::dump(make_hash()) . "\n";
% perl list_test.pl
{ 2 => 3, bar => "hoge", foo => 1 }

Perl こえ〜

% [雑談] F-18

新マクロス級キター!!! 今回はアイランド 1 に連結したままの巡航形態だけだったけど、新オープニングで変形後の姿も出てきてるんで今後はもっと活躍してくれるに違いない。 あー、でも艦長が天才じゃないからやっぱそれほど活躍しないかも。

シェリルのアレは死亡フラグというよりは、むしろ最終局面に向けての重要な鍵となる部分なんだと思うなあ。 アレが実はこーしてあーするとアレのアレになる、みたいな。 新 OP でシェリルとランカのペアが前面に押し出されてるのも、つまりはそういう事なんじゃないの?

長距離フォールド前の在庫一掃投げ売りフォールドセールとか、なんか変な生活感があって良いなあ(笑

% [雑談] 過去の自分を褒めたくなる瞬間

あー、この修正ちょっとめんどくさそうだなー、とか思いながらソースを見るとあらかじめ修正時のことを考えた作りにしてあったとき。 そんなことやってたの全然忘れてたよ、みたいな(苦笑

ともかく、そんなときは「過去のわし GJ」と言わざるを得ない。 そして、未来のわしに GJ と言われるようにがんばろうと思う。

% [雑談] もう暑くてやってらんないし

仕事中なのにビール飲んじゃったりしてます。 在宅勤務万歳。(そういう問題じゃねー)

や、仕事はちゃんとやってますから、ほんとに。 さすがに昼間っから酔っぱらうほど飲む勇気は無い(苦笑

あー、でもビアガーデンとか行きてーなー。

% [game] 忌火起草日記、ようやく一つ目の完

あー、かったるかった。 屋敷に行くまでは最近のかまいたちシリーズみたいにフローチャートが使えるのに、屋敷に着いてからはなぜかそれが使えなくて、しかもバックログで前の選択肢に戻ったりもできなくなる。 スーファミ時代に逆戻りかよ……

そんな感じで正解ルートを見付けられるまで、何度も何度も同じテキストを読まされる地獄。 まあ、一応既読部分なら前方へのログジャンプはできるんだけど、そんなのより選択肢までスキップする機能付けろって感じ。 かったるさマックス。

ともあれ、なんとか完に辿り着いて、ようやく二周目開始。 シナリオ修了率はまだ 20% だし、これからが本番なんだろう。 エンディングのスタッフロールで今後の展開がいくらか予告編みたいに流れるんだけど、その感じからすると初代かまいたちみたいな思い切った役柄変更は無さそうな感じだね。 むしろ一周目で残った (というか最後の最後に思いっ切り振り撒かれた) 謎が解明されていくような方向性かな。

やっぱりシステム絡みでストレス溜りまくりだけど、とりあえず話はおもしろくなってきたんで、まあこのまま続けよう。

本日のツッコミ(全2件) [ツッコミを入れる]

% きむら(K) [んー、暗黒面の2のほうはちょっと違うんじゃないかと。 しかし説明を書くにはこのスペースは狭すぎる(おい ]

% jijixi [そいじゃあ別の広いスペースに説明をよろしくっす :-)]


2008-08-09 [長年日記]

% [雑談][Perl] 配列とハッシュそれとリスト

正直 Perl のこの辺の挙動はわかりにくすぎるんで、多少の間違いには目をつぶってでも自分がイメージしやすい形で理解 (モデル化?) しようと思ってしまうのである。 で、試行錯誤しつつ、今のところは以下のような感じであろうと思っている (今後また変わるかもしれないけど)。 ちなみに昨日書いた「ハッシュの中身は実質リストである」という文言は以下のオレオレモデルによるもので、どっかで読んだとか誰かにそう教えてもらったとか、そういうことではない。

  • コンテキスト
    • スカラ
      • なんか一つの値
      • 文字列、リファレンス、ハンドル、あとなんかあったっけ?
    • リスト
      • スカラの並び
  • 変数
    • スカラ ($)
      • スカラコンテキストで評価されたものが入る
    • 配列 (@)
      • リストコンテキストで評価されたものを、インデックスでアクセスできるようにしたもの
    • ハッシュ (%)
      • リストコンテキストで評価されたものを、キーと値のペアとしてアクセスできるようにしたもの
      • リストの並びは CommonLisp などで言うところの属性リスト
      • キー1, 値1, キー2, 値2, ...
  • リテラル
    • 配列リテラル [..]
      • [] で囲まれた部分 (リストコンテキスト) を配列として扱えるようにしたものへのリファレンス
    • ハッシュリテラル {..}
      • {} で囲まれた部分 (やっぱりリストコンテキスト) をハッシュとして扱えるようにしたものへのリファレンス

で、リストコンテキスト中で配列やハッシュが評価されると、どちらもリストとして扱われる。 内部的なことはともかくとして、見た目上はやっぱり「ハッシュの中身は実質リストである」という感じ。

きむら(K)さんが「違う」と言っているのはおそらく、リストがそのままハッシュになってるんじゃなくて内部的な構造は別物でその都度変換されてるんだよ、というようなことかと思うんですが (ref.)、Perl で何か書く上で上記のような単純化した理解だけだとハマるシチュエーションとかあったらハマって苦しむ前に教えてほしいです。 なんか最近 Perl がおもしろくなってきてる自分がちょっと怖い(苦笑

あ、念の為書いておくと、もちろん「単純化した話だけでいーじゃん、詳しい説明なんて聞きたくねーよ」とか思ってるわけではないので楽しみにしてます、詳しい説明 :-)

% [雑談][Perl] Perl の嫌いなところは変わっていないのだが

嫌いなところは嫌いなままなんだけど、いろいろいじってるうちに今まで見えてなかったおもしろいとこが見えてきたせいで総合点は上がってきてるという感じ。

ちなみに嫌いなところってのは主に二つ。

  • sigil
  • context

今でもこんなもん無くなれば良いのにと思うけど、無くなったら Perl じゃないって気もしなくもない。 まあ、コンテクストはオレオレモデルでそれなりに制御できるようになってきたし、sigil (これなんて発音するのが正しいんだろ?) も慣れで何とかなるレベルではあるし、嫌いっていうだけで使う上での障害ではなくなりつつある。

もちろん細かく言えば嫌いなところはまだたくさんあるけど、そういうのは Ruby だって OCaml だってその他わしの好きな言語にもあるわけで、あえて挙げてくようなものでもない。 あ、でも最近セミコロンが必要無い言語ばっか書いてたから、セミコロン必須はツラい :-p

最近見えてきたおもしろいところっていうのは、なんというか DSL 構築能力?とでもいうもの。 サブルーチンのプロトタイプで (&) を指定しておくと sub 無しで無名関数が使えるとか、',' と '=>' という二種類のカンマとか、そういうのを使い分けて見た目を整えるとか、そんなのがなんかおもしろい。

自分でも遊びで try..catch っぽい仕組みを作ってみたりとかして遊んでたり。 なかなか思うような形にできなくて悶々としたりしてるけど(苦笑

あ、そうそう Perl を使う上で一つ困ってることがあって、それは

  • fold (あるいは inject, reduce) が無い

ということ。 もしかしたら知らないだけなのかもしれないけど、たぶん組み込みの機能としては無いよね。 きっと CPAN にはそれっぽいのがありそうな気がするけど、どうやって探したら良いんだろ。

ということで親切で暇な人のアドバイスをお待ちしております。 別に暇じゃない人でもいいですが。 親切じゃない人も…… まあお願いします。 でも「ググれ」とかだと泣きます。

% [雑談][Perl][Ruby] Ruby に慣れすぎた人間が Perl をいじるときに不安になること

Ruby に限らず変数に格納されるのが常に参照であるような言語 (関数型言語全般とか Python とか) に慣れていると、 破壊的な操作に敏感になるような気がする。 まああくまで「わしの場合」ということにしておくけど。 そういう言語では、

irb(main):001:0> a = [1,2,3,4]
=> [1, 2, 3, 4]
irb(main):002:0> b = a
=> [1, 2, 3, 4]
irb(main):003:0> a[0] = 5
=> 5
irb(main):004:0> a
=> [5, 2, 3, 4]
irb(main):005:0> b
=> [5, 2, 3, 4]

こういうことが起こるので、変なバグに悩まされないようにと思って、どうしてもこの手の破壊的操作自体を避ける傾向がある。 で、そういう思考のわしが Perl を使う場合、push とか shift とかをバンバン使ってるソースとか見ると背中がぞわぞわしてしかたがない。 でも Perl の場合そこまで気にする必要もないってことに、最近ようやく気がついた。 なんでかってーと、Perl の変数に入ってるものは敢えてそう指定しないかぎり参照じゃなくて実体だから。

pirl @> @a = (1,2,3,4)
(1, 2, 3, 4)
pirl @> @b = @a
(1, 2, 3, 4)
pirl @> $a[0] = 5
5
pirl @> @a
(5, 2, 3, 4)
pirl @> @b
(1, 2, 3, 4)

安心。 でも、こういう挙動に慣れてないので頭がスパっと切り替わってくれないんだよなー(苦笑

% [雑談] オリンピックが開幕したわけだけれども

ちっともまったく興味が湧かないのはなんでなんだろね。 なんか知らんけど異様に冷めた目で見てる自分がいるんだが。

% [Perl][Mac] MacPorts で Perl 5.10 を入れてみた件

なんとなく入れてみたくなったんで。

で、どうやら 5.8 とぶつからないように perl5.10 みたいにサフィックスを付けてインストールしてくれるみたい…… なのは良いんだけど、cpan-5.10 を実行してまず install Bundle::CPAN したわけですよ。 でもなんかところどころで表示される perl のパスが…… /opt/local/bin/perl になってる?

% /opt/local/bin/perl -v
This is perl, v5.8.8 built for darwin-2level

OS 10.5 にしてすぐの頃に MacPorts でインストールしたものが動かなかったり色々めんどうなことがあって、そのときに PATH 環境変数で /usr/bin の方が先に来るように直したまま今まで使ってたから忘れてたけど (つまり今まではプリインストールされた /usr/bin/perl を使ってた)、MacPorts でも perl がインストールされてたんだったよ。

いやーん、と思いながら見てみれば、案の定インストールされているのは /opt/local/lib/perl5/site_perl/5.8.8/ だという。 ぐったりしながら /opt/local/bin/cpan-5.10 を見てみる。

1 #!/opt/local/bin/perl
2     eval 'exec /opt/local/bin/perl -S $0 ${1+"$@"}'
3         if $running_under_some_shell;

いくらコマンド名にサフィックス付けてもここでそれを使わなかったら意味無いよねー。 なんてがっかり品質なんだ、まったく。 しかたないからこのファイルの perl の部分を perl5.10 に書き換えて、 もっかい cpan-5.10 実行しなおし。 今度はちゃんと 5.10.0 のディレクトリにインストールされたようだ。

ところで Mac で Bundle::CPAN をインストールすると Mac::Carbon てのもインストールされるようなんだが、これのテストでいきなり「イ〜ヤ〜〜オッ!!」みたいな声がするのがビビるので勘弁してほしいと思った。

本日のツッコミ(全6件) [ツッコミを入れる]

Before...

% jijixi [> (Cの)ソースバリバリ貼り付けても?w わりとw Perl のソースは読みにくいっていう印象がありますけ..]

% きむら(K) [すんません。材料はそれなりに集まってるんですけど 捌いている余裕がありません○| ̄|_ 気長に待っておくんなまし..]

% jijixi [は〜い、了解っす :-)]


2008-08-10 [長年日記]

% [Perl] 5.10 の新機能

perldelta - perl 5.10.0 の新機能というページを斜め読みした。 とりあえず feature プラグマで導入できる say switch state はどれも便利そうだ。

  • say
    • 改行付き print
    • むしろどうして今まで無かったのかと問い詰めたい
  • switch
    • switch と言いながら実際の構文は given なのはなぜだ
    • given (EXPR) { when (PATTERN) { PROC } when (PATTERN) { PROC } default { PROC } }
    • Ruby の case..when に近いと思われ (まだ実際に使ってみてないからわからんけど)
  • state
    • イマイチ意味がわからなかったがこのページを見て理解した
    • 要するに C の関数内 static 変数
    • メモ化する関数とか書くとき便利そう

given 構文の when ではスマートマッチ演算子 (~~) というのが使われているらしい。 == とか =~ とかの機能をまとめてしまったようなもの?

ともあれ、さっそく perlsh の eval してるところに "use feature ':5.10';" を追加した。 (有効範囲がグローバルじゃないので、こうしないといけないようだ)

102 @result = eval ("use feature ':5.10'; $strict use warnings; package $CWP; $command");
本日のツッコミ(全3件) [ツッコミを入れる]

% きむら(K) [> スマートマッチ演算子 (~~) smart にマッチングしてくれるんですよw マッチ対象が配列でもよろしく..]

% きむら(K) [ああ、部屋が片付かないのにこんなことをしていていいのか? #初代ゲームボーイ(テトリス付き)とか2000年問題に関..]

% jijixi [Windows5.0 (笑]


2008-08-11 [長年日記]

% [Perl] lvalue として使える関数

Perl には返り値が代入式の左辺値として使えるような組み込み関数がある。 my とか local とか our とか vec とか。 で、こういうのって自分で定義できるのかなー、と思って man perlsub で lvalue という単語を探してみたらあった。

ぶっちゃけて言うと、関数の属性として lvalue を指定して左辺値として扱わせたい変数を返すようにすればよろしいようだ。

WARNING: Lvalue subroutines are still experimental and the implementation may change in future versions of Perl.

とか書いてるけど、ちょっと遊んでみたいだけだから問題は無い。 てことでカウンタを書いてみた。 あとちょうどいいので stete 変数も使ってみたり。

% cat counter.pl
use strict;
use warnings;
use feature ':5.10';

sub counter : lvalue {
   state $c = 0;
   $c++;
   $c;
}

my $i;
for $i (1 .. 3) {
   say counter;
}

counter = 123;
for $i (1 .. 3) {
   say counter;
}
% perl5.10 counter.pl
1
2
3
124
125
126

なんかおもしろい。 Ruby でも使う側の字面を同じような感じにはできるけどメソッド二つ書かなきゃならないし。 まあ、代入時にフックかけたいとかって話になると、結局この手は使えなさそうだけど。

% [Perl] テスト書くときには何を使ったら良いのやら

一応、Happy Testing Perl というページを読んで、Test::More, Test::Base, Test::Declare 辺りはいじってみたがどうもしっくり来ない。 Test::Declare 辺りは RSpec っぽく書けるからわりと良いんだけど、結局他と同じように plan の数を数えなきゃならないのがうっとうしい。

あの plan というやつはどうするのが正解なんだろなあ。 いくら何でも手で数えろって話は無いと思うんだが、とりあえず no_plan を指定して動かしてみて、それで実際に実行された数を入れろとかそういうのなんだろうか。

Ruby では Test::Unit に慣れてるからってことで Test::Unit にも手を出してみたけど、Ruby のに比べてあまりにも使いづらくてぐったりした。 assert 一つ書くにも $self->assert とかかったるすぎるだろ。 Test::Unit::Runner の代わりに Test::Unit::HarnessUnit を使うと TAP 対応してくれて、plan の数とかも数えなくて良いから、その辺は楽なんだけど。

本日のツッコミ(全2件) [ツッコミを入れる]

%  [Test::Baseなら plan tests => 1*blocks; って方法で、解決できたはず、、]

% jijixi [慣れの問題もあるかも知れないけど、わしのテストの書き方と Test::Base ってどうも相性悪いみたいなんですよね..]


2008-08-12 [長年日記]

% [Perl] Test::Declare をちょっとだけ自分好みにしてみた

Test::Declare::blocks の返す数は test 関数の数だと思ってたのに、実は ok なんちゃらな関数を字面的に数えてるだけだった (それはそれでスゴイ気はするが) ということにせつなさを感じたり。 あと init とか cleanup とか名前付いてるわりに、実は単に書いた順番に実行されるだけだったということに以下略。

% cat t/foo.t
package foo;
use strict;
use warnings;
use Test::Declare;
plan tests => blocks;

describe 'description' => run {
   cleanup {
      print "cleanup\n";
   };
   test 'test' => run {
      print "test\n";
      ok 1;
   };
   init {
      print "init\n";
   };
};
% prove -lv t/foo.t
t/foo....
1..1
cleanup
test
ok 1
init
ok
All tests successful.
Files=1, Tests=1,  0 wallclock secs ( 0.02 usr  0.01 sys +  0.24 cusr  0.07 csys =  0.34 CPU)
Result: PASS

ショボーン。

というわけで、そこら辺を何とかする Test::Declare::Delay (仮) というモジュールをでっち上げてみた。 なんで Delay かというと逐次実行すると plan が数えられないから。

% cat lib/Test/Declare/Delay.pm
package Test::Declare::Delay;
use strict;
use warnings;

use base 'Exporter';
require Test::Declare;
my $override = join '|', qw(plan test describe init cleanup);
import Test::Declare grep(!/^($override)$/, @Test::Declare::EXPORT);
our @EXPORT = (@Test::Declare::EXPORT, 'start');

my $current_package = undef;
my %reserved_tests = ();
sub current_package {
   my $name = shift;
   if (defined($name)) {
      $current_package = $name;
   } else {
      $current_package;
   }
}
sub delay {
   defined($current_package) ? 1 : 0 ;
}
sub clear_package {
   $current_package = undef;
}

sub plan {
   my ($type, $package) = @_;
   if ($type =~ /delay/i and defined($package)) {
      current_package $package;
   } else {
      Test::Declare::plan(@_);
   };
}

our $description = '';
sub describe ($$) {
   $description = shift;
   shift->();
}

sub test ($$) {
   my ($test_block_name, $proc) = @_;
   return Test::Declare::test($test_block_name, $proc) if not delay();

   my $ref = $reserved_tests{current_package()} ||= {};
   $ref->{test} ||= [];
   push @{$ref->{test}}, ["$description, $test_block_name", $proc];
}

{
   no strict 'refs';
   for my $sub qw(init cleanup) {
      *{'Test::Declare::Delay::'.$sub} = sub (&) {
         my $proc = shift;
         return &{*{'Test::Declare::'.$sub}}($proc) if not delay();

         my $ref = $reserved_tests{current_package()} ||= {};
         $ref->{$sub} ||= [];
         push @{$ref->{$sub}}, $proc;
      };
   }
}

sub start {
   return if not delay();

   my $reserved = $reserved_tests{current_package()};
   my $init = $reserved->{init}[0];
   my $cleanup = $reserved->{cleanup}[0];
   my @tests = @{$reserved->{test}};
   plan tests => scalar(@tests);

   my $result = eval {
      &$init() if $init;
      for my $test (@tests) {
         my ($desc, $proc) = @$test;
         Test::Declare::test($desc, $proc);
      };
      &$cleanup() if $cleanup;
   };
   clear_package();
   die $@ if $@;
   $result;
}

1;
% cat t/bar.t
package bar;
use strict;
use warnings;
use Test::Declare::Delay;
plan delay => __PACKAGE__; # ここが違う

describe 'description' => run {
   cleanup {
      print "cleanup\n";
   };
   test 'test' => run {
      print "test\n";
      ok(1);
   };
   init {
      print "init\n";
   };
};
start; # ここが違う
% prove -lv t/bar.t
t/bar....
1..1
init
test
ok 1
cleanup
ok
All tests successful.
Files=1, Tests=1,  1 wallclock secs ( 0.02 usr  0.02 sys +  0.22 cusr  0.07 csys =  0.33 CPU)
Result: PASS

モジュール作成の作法もわかってないし、テストも書いてないし、やっつけ仕事なので色々制限がある。 あときっとバグもある。

  • describe が複数ある場合に未対応 (init/cleanup を使わないなら動くと思うけど)
  • まったくもってスレッドセーフじゃないと思う (それで困るシチュエーションがあるかは知らんが)
  • plan の数は test 関数の数で決め打ちなので、test 関数一つにつき ok なんちゃらは一回にしよう
  • テストを溜め込んで最後に実行するので、最後に start 関数を実行する必要あり

書いてるときはそれなりに楽しかったけど、ぶっちゃけもう飽きた。 正式にリリースする気とか、改良やメンテナンスする気とか、ほとんど無いので誰か欲しい人がいればあげます。 っていうか、describe が複数ある場合のことをまるっきり失念して書いたから、溜め込んでおくためのデータ構造がすごく適当なので、そこからちゃんと作った方が良いと思う。 つまり一から書き直した方がきっと良い。

ふう、無駄な汗を流したぜ。

% [Perl] Test::Unit をちょっと書きやすくしてみた

実はこっちが本命で、さっきの Test::Declare::Delay はこれがうまくいかなくて気分転換にちょっと書いてみただけのものだったのである。 まあ、こっちにしたって実用性があるのかは知らんけど。 どっちも半分以上はリフレクション的なものの実験のために書いてたりするんで、実用性云々より書くこと自体に意味があるんだが。

で、さっきのはともかく、こっちのは車輪の再発明してる気がしなくもないんだけど、とりあえず見付けられなかったんで。 そもそも Perl では XUnit 系って人気無いみたいだし、誰も使ってねーよとかそういう話なのかもしれん。

ともあれ貼る。 …… と思ったが長いので先に説明しちゃう。

これが何をするものかというと、要するに $self->assert とかかったるくて書いてらんないんで、 new したときにインスタンスをどっかに保持しておいて、assert とか呼んだときに AUTOLOAD (Ruby で言うところの method_missing) で保持してあるインスタンスに丸投げするという感じ。 あと、prove で実行するという前提で Test::Unit::HarnessUnit を実行するショートカットを用意したりとかそんな感じ。 まあ、使用例を見ればだいたいわかるでしょう。 AUTOLOAD を利用している都合上、assert とかの呼び出しにはカッコ必須。

なんかよくわかんないけど、終了時(?)に誰かによって DESTROY 関数が呼ばれるようなんだが、これを定義しておかないと AUTOLOAD が変なことになる。 なので、とりあえずダミーで何もしない DESTROY を定義してあるんだけど、これってどうするのが正解なんだろ。

あとさっきも書いたけど、リフレクション的操作の実験的な部分が多々あるので、必要以上にそこら辺のテクニックを駆使しているところがあるのはご愛嬌ということで。 そこはこう書けるよ、みたいなツッコミもお待ちしております。

% cat lib/Test/Unit/Simple.pm
package Test::Unit::Simple;
use strict;
use warnings;
use Exporter;
use base qw(Exporter);
our @EXPORT = qw(init start_runner start_harness);
use Test::Unit::TestCase;
use Test::Unit::TestRunner;
use Test::Unit::HarnessUnit;

our $VAR_NAME = '$test_case_object';
our $VAR_SUFFIX = $VAR_NAME;
$VAR_SUFFIX =~ s/^\$/::/;

sub init ($@) {
   my $package = shift;
   my $base_class = shift || 'Test::Unit::TestCase';
   my $var_name = $package.$VAR_SUFFIX;
   my @args = ($package, $base_class, $var_name);

   my $error = _make_class(@args);
   die $error if $error;

   $error = _make_autoload(@args);
   die $error if $error;
   1;
}

sub _make_class {
   my ($package, $base_class, $var_name) = @_;

   eval join ("\n",
      "package $package;",
      "use base qw($base_class);",
   );
   return $@ if $@;

   eval {
      no strict 'refs';
      *{"$package\::new"} = sub {
         ${*{$var_name}} = &{*{"$base_class\::new"}}(@_);
      };
      *{"$package\::DESTROY"} = sub { 1; };
   };
   $@;
}

sub _make_autoload {
   my ($package, $base_class, $var_name) = @_;
   eval {
      no strict 'refs';
      *{"$package\::AUTOLOAD"} = sub {
         my $method = ${*AUTOLOAD};
         $method =~ s/.*:://;
         my $object = ${*{$var_name}};
         if (my $sub = $object->can($method)) {
            &$sub($object, @_);
         } else {
            die qq(Can't locate object method "$method" via package "$package")
         };
      };
   };
   $@;
}

{
   no strict 'refs';
   for my $args (
      ['runner',  'Test::Unit::TestRunner'],
      ['harness', 'Test::Unit::HarnessUnit'],
   ) {
      my ($type, $class) = @$args;
      *{"start_$type"} = sub ($) {
         my $package = shift;
         my $runner = &{*{$class.'::new'}}($class);
         die "can't create runner of $class." if not defined($runner);
         $runner->start($package);
      }
   };
}

1;
% cat test.t
package test;
use strict;
use warnings;
use Test::Unit::Simple;
init(__PACKAGE__);

sub set_up {
   print ">>> set_up\n";
}
sub tear_down {
   print ">>> tear_down\n";
}
sub test_foo {
   print ">>> test_foo\n";
   assert(1);
}
sub test_bar {
   print ">>> test_bar\n";
   assert_equals(10, 10);
}

start_harness(__PACKAGE__);
% prove -lv test.t
test....
STARTING TEST RUN
1..2
>>> set_up
>>> test_foo
>>> tear_down
ok 1 PASS test_foo
>>> set_up
>>> test_bar
>>> tear_down
ok 2 PASS test_bar
ok
All tests successful.
Files=1, Tests=2,  1 wallclock secs ( 0.03 usr  0.01 sys +  0.22 cusr  0.05 csys =  0.31 CPU)
Result: PASS

% [game] 忌火起草日記、ようやく「完」三つ目

既読率は 59%。 これまでの三本は基本的にほぼ同一の設定の中で進む話だったが、次からは大きく変わってきそうな感じ。

しかしやっぱりシステムがなー。 次の選択肢までボタン一発で飛ぶ機能さえあれば、それだけで良いんだけど。 つーか、かまいたち2や3では既読ログを進めるのに方向キーを押しっぱなしにしておくと、選択肢のとこで止まってくれたはずなんだよ。 だからボタン一発とは言わないまでも、押しっぱなしのまま他のこととかできたからマシだった。 でも今回のはそれすら無いんだよな。押しっぱなしにしてたらガンガン選択肢もスルーしていきやがる。 ほんとダメ。


2008-08-13 [長年日記]

% [雑談][Perl] シンボルとか型グロブとかの話

Perl でメタプログラミングをやろうと思ったら避けては通れないので、いろいろ調べてるところ。 日和って全部文字列 eval でやっちゃえとかいうのは負けだよね。

ちなみに昨日書いたもので、自動的に変数を定義しちゃうみたいなことをやってるんだが、勝手に名前空間を汚すのはイケてないよなーと思っていたわけで、どうもそういうときは Symbol モジュールが使えるらしい。

% perlsh
main[257]$ use Symbol;
()
main[258]$ $s = gensym;
do {
  require Symbol;
  Symbol::gensym();
}
main[259]$ $$s;
*Symbol::GEN0

要するに Scheme の gensym と同じようなもんだろう。

シンボルとか型グロブ (typeglob) とかってなんか名称がややこしいんだが、どういう区別なんだろう。 要するに型グロブってシンボルのことじゃないの?って感じちゃうんだけど。

ちなみに何で型グロブって呼ばれるのかは想像が付く。 こういう↓ ことだよね。

main[289]$ use vars qw($hoge @hoge %hoge);
()
main[290]$ $hoge = 'hoge';
"hoge"
main[291]$ @hoge = ('hoge', 'fuga');
("hoge", "fuga")
main[292]$ %hoge = ('hoge', 'fuga');
("hoge", "fuga")
main[293]$ $s = *hoge;
do {
  my $a = *main::hoge;
  $a = \"hoge";
  $a = ["hoge", "fuga"];
  $a = { hoge => "fuga" };
  $a;
}
main[294]$ no strict; ${$s};
"hoge"
main[295]$ no strict; @{$s};
("hoge", "fuga")
main[296]$ no strict; %{$s};
("hoge", "fuga")

各型付き変数名を一緒くたにしたようなものだから。 たぶん '*' という記号もファイルグロブの '*' からのイメージじゃないかな。

さて、gensym で返される値の使い方だが。 どうやら gensym が返すのは型グロブそのものじゃなくリファレンスのようなので、さっきの実行例のようにデリファレンスしてやらないと実際の型グロブは得られない。 ということを踏まえて、gensym を使用した無名変数を扱うやり方は、基本的にはこんな↓ 感じになるだろうか。

main[257]$ use Symbol;
()
main[258]$ $s = ${gensym()}
*Symbol::GEN0
main[259]$ ${$s} = 'hoge'
"hoge"
main[260]$ ${$s}
"hoge"
main[261]$ $Symbol::GEN0
undef

無名シンボルなだけあって、字面だけ真似してアクセスしようとしてもできないようだ。 これで安心して見えないところでも勝手に変数を使えるね。

昨日の Test::Unit::Simple では、パッケージごとに変数を作ってやってたけど、パッケージなんて所詮シンボルテーブルでしかないんだから、無理にそのパッケージに変数を作ってやる必要なんて無いんだよな。 読めさえすれば良いんだから。 パッケージごとに何かを保持したいというなら、gensym で作った無名変数にハッシュでも入れておけば良いんだし。 というか、そういうことを言い始めると、そもそも昨日のくらいのやつなら無名変数だって必要無くて our 変数一個で済むわけだが。 (まあ、あれは単にそういうことやってみたかったってだけなんだけど)

% [Perl] Test::Class - Easily create test classes in an xUnit/JUnit style

あー、これがいいや、これ使おう。 要するに Test::More や関連するテストモジュールを使いつつ xUnit 風にラッピングしてくれるモジュール…… だと思う。 Test::Unit との違いは、

  • $self->assert* じゃなく Test::More などの is とかその類をそのまま使う
  • 頭に test が付いたメソッドじゃなく、Test 属性が付いたメソッドを実行する
  • setup や teardown なんかもメソッド名じゃなく属性で判断
  • plan 数はテストメソッドごとに指定する (テストごとに no_plan も可)

メソッド名がそのまま (というかアンダースコアが空白に置き換えられて) テストの説明として表示されるようになってたり、メソッド名で説明をするクセがついてるわしにも安心。 plan 数の問題は基本的にテストメソッド一個につきテスト関数一個ということにすれば数える必要無いし、複数のテスト関数が書きたくなったとしてもメソッドごとに数えれば良いだけだから、いじったとこだけで完結できて修正漏れの心配も少なそう。

他に Test::SimpleUnit ってのがあるみたいだけど、サンプル見るとなんかすごく書きにくそう。 たしかに assert がそのまま書けたりシンプルではあるんだろうけど……

% [雑談] 五輪野球

やっぱキューバは強いなー。 全員が足が速くて長打力のあるアベレージヒッターっていうイメージがあるけど、今回はそれに加えて日本野球的ないやらしさまで身に付けてきてる感じがする。

身体的ポテンシャルからして差があるのに、日本の強みである細かい野球まで真似されたら勝てんでしょう。 初めて対戦するはずの田中に対してスライダーを狙っていってる風だった辺り、情報収集もかなりきっちりやってんじゃないの?と思ったりした。

八割方キューバが金で決まりじゃね?


2008-08-14 [長年日記]

% [雑談][Perl] どうして Perl には配列と配列をくっつける関数が無いんだろう、とマジで思ってたよ...orz

気付いてみればバカバカしいにもほどがあるが……

main[259]$ {
main[259]> my @a = (1,2,3);
main[259]> my @b = (4,5,6);
main[259]> my @c = (@a, @b);
main[259]> }
(1, 2, 3, 4, 5, 6)

これで良いんだもんね。 ハッシュのマージも、

main[260]$ {
main[260]> my %a = (foo => 'hoge', bar => 'fuga');
main[260]> my %b = (foo => 'piyo');
main[260]> my %c = (%a, %b);
main[260]> \%c;
main[260]> }
{ bar => "fuga", foo => "piyo" }

こんなで。 ネストしたリストが平らにされるのって何でやねんと思ってたけど、こういう利点もあるんだなあ。

% [雑談][Perl] 長いモジュール名に別名を付けて短かい名前で使う方法

…… をずっと考えてた。 名前空間を汚したくないから import はしたくない。 でも長ったらしいモジュール名を何度も何度も書かされるのも勘弁してほしい。 みたいな感じのときにどうするかという話。

そんでまあ、いろいろ考えて今のところこんな↓ 感じが簡単かなと思うんだが、副作用のほどは不明。

% cat a_module.pl
package a_module;
use strict;
use warnings;
use b_module;

BEGIN {
   require List::Util;
   *list:: = *List::Util:: ;
}

sub f {
   list::first { $_ % 2 == 0 } @_;
}

print f(1,3,5,7,10), "\n";
print b_module::f('hoge'), "\n";
% cat b_module.pm
package b_module;
use strict;
use warnings;

BEGIN {
   require Scalar::Util;
   *list:: = *Scalar::Util:: ;
}

sub f {
   list::readonly(shift);
}

1;
% perl a_module.pl
10
134217728

list:: というのが list モジュールを表わすハッシュになっているので、それを丸ごと他のモジュールのもので置き換えてやる感じ。 モジュール名そのものはグローバルだと思うんだけど、関数の中身についてはコンパイル時に確定してしまうようで上記のように同じモジュール名を使ってても (a_module で list:: の中身を上書きしてしまっても) ちゃんと動いてくれるみたい。

list という名前はもちろん適当だけど、その辺は必要なものを潰してしまうようでなければ何でも良いんじゃないかと。 あ、でも m とか s は止めといた方が良いと思う。 やってみると意味不明のエラーが出ると思うけど、要するにパーサの問題のようで m// とか s/// とかと誤認されるということみたい。

ちなみにモジュールの代入を BEGIN ブロックでやっているのは、そうしないと使うときの名前解決ができなくてコンパイルエラーになっちゃうから。 まあ、ファイル単位で別名が付けれれば十分なんだからそれで良いんじゃないだろうか。 もっと動的に書き換えてもアクセスする方法はあるんだけど、それだと「長いから短かくしたい」という趣旨から外れてしまうので今回の件では無視。

% [雑談] 五輪野球二日目

おいおい上原すげーいーじゃないか(笑

一点差で上原は怖いなーと思ってたら、いー感じで追加点が入って、なんだかいろいろいー感じで回ったね。 っていうか、ある意味生贄状態だった台湾の最後のピッチャーがかわいそうでならなかった。


2008-08-15 [長年日記]

% [雑談] F-19

まさにトライアングラー。

ギャグ回ってわけではないけど、クスッとくる場面多数。 話数から考えて、これが最後の平和な回かもね。 次回はあらゆるものが最終局面に向けて動き出す模様。

% [雑談] 五輪野球三日目

テレビ付けた瞬間、「あれ?日本ハムの試合やってんの?」と思ったのはわしだけではあるまい。 そしてなんかぼんやり見てると、どっちが応援してるチームなのかわかんなくなってくる罠。 何が言いたいかというと、要するにオランダのユニフォームが日ハムそっくり。

さらにオチとして、オランダの最後のピッチャーがマイケル中村の類似品で笑う。 うつむいてセットするとことか仕草がそっくりで、しかもサイドスローという。 結構ベテランらしいが、実はマイケルの元ネタなのか?

% [game] 忌火起草日記、そろそろがまんの限界です

四本目のシナリオをクリアして既読率 70% ちょいという辺り。 次のシナリオの入口がわからなくて延々彷徨ってるところ。

正直もう限界。

二本目三本目あたりでも思ってたんだけど、なんでこんな風にシナリオ突入条件を厳しくしたんだろ。 各シナリオに分岐してからバッドエンドとかで止められるのは別にかまわんのだけど、分岐させる方法がわかんなくて同じとこを何度も何度もやり直させられるのは、もううんざり。 ただでさえ不親切なシステムでストレス溜まってるってのに。

基本的に攻略サイトとかは一通りクリアするまで見ないことにしてるんだけど、ここまで空回りさせられるとちょっと頼りたくなってくる。 RPG みたいに他にやることあるならハマっても潰しが効くんだけど、この手のゲームだとほんとに空回りだからなぁ……


2008-08-16 [長年日記]

% [game] 忌火起草日記、ピンクのしおり

なんとかかんとか、ここまで漕ぎ着けた。 しかし、なんでまた PS 版かまいたちのおまけみたいなサウンドドラマになってんの? かったるい、すげーかったるい。 一旦再生し始めると、一つの場面が終わるまでまったく操作受け付けないし。 一時停止くらいさせろよ。

ピンク用シナリオはかまいたち2がおもしろかったなー。 今回のは話の内容とかはともかく、見せ方を間違ってると思う。

そんな感じでかったるいからまだピンクは途中なんだけど、シナリオはこれで全部なのかな。 既読率は 89% とかなんで、金のしおりの分としてもう一本くらいあっても良い気はするけど。

% [雑談] 五輪野球四日目

見てて疲れた……

どうして毎度毎度、韓国戦はこうなるんだろなあ。

% [game] 忌火起草日記、金のしおり

ピンク終了で金のしおりに。 スタッフロールで予告っぽいのが流れなかったんで、追加シナリオはもう無いのかな。 一応、金になった特典として、今まで見れなかった屋敷到着後のフローチャートが利用可能になった。

なんかまだ見れてない分岐が結構あるし既読率は 91% とかなんだけど、正直どうやって埋めて良いやら皆目見当が付かん。 攻略サイトを探してみたが、そこら辺を解決してくれそうなサイトを見付けられなかった。

んー、もういーかな。 ぶっちゃけ疲れたよ。 微妙に心残りではあるけど、これで終了ってことにしよう。

最終的な感想。 「かまいたちシリーズをやり直したくなった」


2008-08-17 [長年日記]

% [Perl][Ruby][Python] 配列操作の比較

前に書いたものに Perl での例を追加してみた。

# 配列リテラル
# Ruby
[1,2,3,4,5]
  ↓
# Python
同じ
  ↓
# Perl
同じ (ただし、配列そのものではなく、無名配列へのリファレンス)
# イテレーション
ary.each { |i| ... }
  ↓
for i in ary:
   ...
  ↓
for my $i (@ary) {
   ...
}
# 結合
ary + ary2
  ↓
同じ
  ↓
(@ary, @ary2)
# 文字列を連結
ary.join(',')
  ↓
','.join(ary)
  ↓
join ',', @ary
ary << a << b
  ↓
ary.append(a)
ary.append(b)
  ↓
push @ary, ($a, $b)
ary.map { |i| ... }
  or
ary.collect { |i| ... }
  ↓
def proc(i):
   ...
map(proc, ary)
# ツッコミがあったので内包表記版追記
[proc(i) for i in ary]
  ↓
map { ... } @ary # ブロック内では $_ が各要素として使える
ary.inject(init) { |a,b| ... }
  ↓
def proc(a,b):
   ...
reduce(proc, ary, init)
  ↓
List::Util::reduce { ... } $init, @ary # ブロック内では $a が accumulator、$b が各要素
ary.compact
  ↓
[x for x in ary if x is not None]
  ↓
grep {defined} @ary
ary.reverse
  ↓
list(reversed(ary))
  ↓
reverse @ary
ary.reverse!
  ↓
ary.reverse()
  ↓
@ary = reverse @ary
ary.each_with_index { |item, idx| ... }
  ↓
def proc(item, idx):
   ...
[proc(ary[i], i) for i in range(len(ary))]  # もちろん proc の中身が短かければ直接書いても可
# ツッコミがあったので追記
[proc(item,idx) for idx,item in enumerate(ary)]
  ↓
# よくわかんないけど、外部モジュールに頼らないならこのくらい?
for my $i (0 .. $#ary) {
   ...  # $i と $ary[$i] を使う
}
ary.dup
  ↓
list(ary)
  ↓
@new_ary = @ary
ary.delete_at(pos)
  ↓
ary.pop(pos)
# 値を返さなくて良いなら del ary[pos] でも可
  ↓
delete $ary[pos]
ary.flatten
  ↓
# 自分でそれっぽい関数書くしかなさそう?
  ↓
# そもそもネストした配列って存在しないし。
# 存在するのは「配列の配列」じゃなく「配列リファレンスの配列」
# 一段階だけでいいならこんな?
map {ref($_) eq 'ARRAY' ? @$_ : $_} @ary
本日のツッコミ(全7件) [ツッコミを入れる]

Before...

% きむら(K) [>内包表記に慣れちゃうと だから applyやらmapやらreduceがなくなる(ライブラリに追い出される) と..]

% jijixi [そうなんでしょうねえ。 map 的操作は内包表記で統一しろと。 ジェネレータ式の存在なんかも加味すれば、間違いな..]

% shiro [CLerが何でもloopで書くのと似ているかもしれない。 mapやreduceは高階関数をコンビネータで組み合わせ..]


2008-08-18 [長年日記]

% [game] 忌火起草日記、今度こそ最終回

2ch のスレ見てみたら金しおり後の最後のシナリオの出し方がわかったので、ちょっくら見てみた……

………… あーあ………

かまいたち2のときみたく、一つのシナリオでやるならまだしも、全体をこれで落としちゃったらダメすぎだろーよ。 ただでさえ大しておもしろくもなかったシナリオが、これのせいで全く無意味になったね。 なんかすげー白けた。

これなら間違えて弟切草買ってきてやってた方が良かったよ。

そういやスレにもあったけど、赤ルートで金縛りから逃がれたときの金属音って結局何だったんだ? まあいーや、どうでもいーよね、そんなこと。 辻褄とかそんなもん必要無い世界なんだから。


2008-08-19 [長年日記]

% [独り言] 独り言カテゴリのエントリについてはコメント無用

コメントされても返事できない場合がほとんどです。

% [独り言] 無題

彼等と共に生きようと思うなら、この悲しみは避けることはできない。 彼等に与えられた時間は、我々に比べてあまりに短かいのだから。 それでも我々は彼等を求めるのをやめることができない。 なら、せめてその時は、少しでも心安らかに旅立てるようにしてあげたいと、常に願う。

十五年ほど前の話。 彼が最期の夜を迎えたとき、私はサインを見逃してしまった。 後から思い起こしてみれば、たしかにそれはあったのだ。 いつもより荒い呼吸、何か言いたげにこちらを見る眼差し、どれも普段とは違っていた。 だが私はそれに気付かず、翌朝彼は家族の誰も立ち会うことのできないまま息を引き取っていた。

彼は安らかに逝けたのだろうか。 誰にも見守られていないことに孤独を感じてはいなかっただろうか。 朝まで付いていてあげれば良かった。 いや、付いていたかった。 あるいはそれが彼にとって何の意味も無いことであったとしても。

その後悔の念が今でも残っている。

そして昨晩、彼女がまた最期の夜を迎えた。 一月半前に余命幾許も無いことは宣告されている。 もう何日も食事を摂っておらず水しか口にしていない。 その時が近付いているのは明らかだった。

もうしばらく声など出していなかった彼女が大きく切ない鳴き声を上げた。 息も荒く、辛そうにしているのがわかる。 いよいよその時が来たのか、そう思った。 しばらくなでてあげていると起き上がろうというそぶりを見せたので寝返りを打たせてあげた。 もう自分で寝返りを打つことすらできないほど衰弱しているのだ。 しかしその後、下の世話などもした頃には荒かった呼吸もすっかり落ち着き平静に戻っていた。 そこで私はミスをした。 「ああ、おしっこが溜まってて苦しかったんだな」 そう思ってしまったのだ。

どちらとも取れる選択肢が与えられた場合、人は往々にして自分にとって都合の良い方を選んでしまう。 私は、「彼女はまだ大丈夫。まだ最期じゃない」そう思った。 それが私の望んでいる選択肢だったから。 そしてまた後悔を残すことになった。

彼女は今朝、私が起きる直前に息を引き取った。 私は自らの心の弱さによって、また最期にそばにいてやることができなかったのだ。 せめてもの救いは他の家族は彼女に付いていてあげられたことだろう。 やはり辛そうな声を上げていたそうだから苦しみはしたのだろうが、少なくとも孤独を感じながら逝ったのではないと信じたい。

私はこれからも彼等と共に生きていくだろう。 そして、そうするなら否応なく、またいつかその時が訪れる。 次こそはもっとうまくやろう。 少しでも彼等が心安らかに最期の時をすごせるように。

自戒を込めて記す。

% [独り言] 身体が重い

緊張の糸が切れて、どっと疲れが押しよせてきたようだ。 特に意識はしていなかったけど、やはり気持ちが張り詰めていたんだな。


2008-08-21 [長年日記]

% [雑談] オーバーユースを精神論で美談にするのは日本人の悪いクセだよな

もういい加減そんな風潮も廃れたのかと思ってたけど、少なくともマスコミ (特に民放テレビ) はそんなことないようで。 そんで、そうやって煽ると深く物事を考えないような人は騙されるのかもしれず。 ソフトボールのニュース見てて、正直ヘドが出そうだった。

上野選手が無事に試合を終えられるよう祈ってます。

% [雑談] ソフトボール金メダルおめでとう

試合が変に長引かなくて良かった。

% [雑談] アレな人に目を付けられると大変だから言動には気を付けようと思った

前から思ってることだけど改めてそう思ったよ(疲


2008-08-22 [長年日記]

% [雑談] 五輪野球準決

まーなんつーか、わりと予想どおりっつーかね。 序盤あんだけオタオタしてた相手から、エラー絡みでたった 2 点しか取れない時点で終わってるでしょ。 あそこで 4 点なり 5 点取ってれば全然違う展開になってたと思うし、実際取れておかしくない流れだったのに。

できればダルビッシュがキューバ戦でリベンジするとこを見たかったんだが、アメリカ勝ってくれないかなー。 っていうか、ヤツは相手がキューバじゃないとやる気無くしてぼんやりしたピッチングしそうで怖いんだが(苦笑

% [雑談] F-20

…… なんてこった…… なんてこったとしか言いようがない。

先週の予告からある程度は予想してたけど、なんという鬱展開。 どーすんだこれ……

% [雑談] 五輪野球準決その2

はいはい、もうキューバ優勝で決まり。 マイナーリーガーごときが敵う相手じゃなかった。 予選で韓国が勝ったのだって、決勝トーナメント進出が決まっててわざわざ勝つ必要無いから調整程度に流してたってだけに決まってるよ。 その試合見たわけじゃないけど。

というくらい絶望を感じる試合ですた。 もし日本が決勝に進んでたとしても「こりゃダメだ」と思ってたと思う。

本日のツッコミ(全4件) [ツッコミを入れる]

Before...

% きむら(K) [うわあ気になって眠れねえw #いつも起きて放送を観てます ]

% jijixi [「あぁーーーー……」とか素で声出しちゃったわし(苦笑]

% きむら(K) [TBS、今放送終了。 あの場面ですか。>あーっ #アッーではなくw ]


2008-08-23 [長年日記]

% [雑談] 五輪野球三決開始

先発ダルビッシュじゃねーのかよ!!

…… すげー見る気失せた。

% [雑談] マクロス F 某氏生存の可能性

5% くらいはあるんじゃないかと思ってたり。 ブレラのバルキリーがリモートコントロールでこっちに向かってきてる、ってのが伏線なんじゃないかと思ったりしたのだが。 ランカの位置はモニタしてるはずだし、確率的にありえないとかってことは無い気がする。

まあ、うまいこと拾えたとしても、あの怪我だからピンピンして戻ってくるってのは難しそうだが。 サイボーグ化フラグか?

% [雑談] 五輪野球三決終了

パッとしねー試合だったなー。 そもそも投手交代のタイミングとか、勝つ気があるのか怪しい感じだったが。 ペナントレース復帰のための調整として担当イニング数決め打ちで出しただけじゃねーの?

% [clip] sm4381651 (マクロスFの悲しみを癒す動画を作ってみた。(修正))

不謹慎すぎるwww

あとタグの「シェリルが不吉な歌を歌うから…」に吹いた。

% [clip] sm4374917 (鏡音リンに「ノーザンクロス」を歌ってもらいました)

かなりすごい。

% [clip] sm4370617 (マクロスF×江頭2:50)

ガッペエガルチャーw

% [雑談] 五輪野球決勝

いやー、すんごくおもしろい試合だった。 最後の最後までどうなるかわからない展開でしびれたね。

それにしても、今後オリンピック種目として復活を求めるなら、審判陣のレベルの低さはなんとかしないとダメじゃないの? 審判ごとにクセが違うとかいうレベルじゃないもんな。 一試合の中でまったく同じ球が、ストライクだったりボールだったり判定のゆらぎが大きすぎる。

本日のツッコミ(全4件) [ツッコミを入れる]

Before...

% jijixi [サイボーグ化されると、おそらく目からビームとか出ますね。 そんで「ギャラクシーの科学力は宇宙一ィィ」みたいな。 ]

% きむら(K) [>審判陣のレベルの低さはなんとかしないとダメじゃないの? メジャーの審判で固めますか?(笑) ]

% jijixi [選手はプロも出るんだから、審判もプロを使ったらいいんじゃない?とは思いますね。]


2008-08-25 [長年日記]

% [雑談] 今月のプ〜ねこ

うはw オレサマ地獄行きケテ〜イwww

でもこんな地獄ならいつ死んでも良いわ。

本日のツッコミ(全1件) [ツッコミを入れる]

% きむら(K) [>でもこんな地獄ならいつ死んでも良いわ。 やはり(笑) ]


2008-08-29 [長年日記]

% [雑談] F-21

今回のサブタイトルに関するネタバレするよ。

前々回が「トライアングラー」、前回が「ダイアモンドクレバス」、今回が「蒼のエーテル」、そして次回は「ノーザンクロス」だそう。 …… つまりまあそういうことで。 次回でノーザンクロスにどんな映像が載っかるか楽しみでしかたがない。

最終回近辺で使われるんだろうと思っていた例のセリフが今回使われてしまった。 思ったより大分早いな。 カレンダーや DVD 収録話数の都合とかから考えると、おそらく 25 話が最終になると思われるんだが、21 話であーなったということは最後は結局ランカとくっつくという線が濃くなってきた感じが。

% [clip][game] 9月以降配信予定タイトル発表――「バーチャルコンソール」 (ITmedia +D Games)

ソ、ソソソ、ソーサリアンキター!!!!

% [雑談] F-21 その2

そういや、シェリルが楽屋っぽいところにいるカットがあったと思うんだけど、もしかしてエルモさんと組んだのかな、と思った。 前回シェリルが歌ったときにいたからね。

そしてサブタイトルがノーザンクロスってことは来週はシェリル完全復活の回かな。

% [clip] 落合と井端 (続・妄想的日常)

これはたしかに天才だわwww


2008-08-30 [長年日記]

% [clip] 「五輪のメダルは、金・銀・銅・鉄・アルミ・錫・鉛で上位7人にあげるべき」…中国の作家がIOC会長に訴え (痛いニュース)

話の本筋は「アホかw」で終わりなんだけど、>>47 はもっと評価されても良いと思った。


トップ 最新 追記

日記ってのは本来、自分で読み返すためにあるもんだよなあ……
もしくは有名人になったら死後に本になったりとかか?

RSS はこちら

jijixi at azito.com