トップ 最新 追記

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

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-04-01 [長年日記]

% [clip] スキューム (d.y.d)

エイプリルフールネタ。 実際に動くようにしてるなんて手が込んでるなー。 動くの見ても動作がうまくイメージできないけど(苦笑

% [雑談] 今日はエコノミーモードで稼動中

ここ三日くらいハイパフォーマンスモードで動いていたせいか、今日はちょっと身体が重い。 三日しか保たないのかよ(苦笑

ちなみにハイパフォーマンスモードでの稼動時には補助燃料としてキリンガラナが欠かせません。 でもこいつは北海道限定なので、やっぱりわしは北海道から出ていくことはできないと思う。(どういう理由だよ)

ところで今日からバーチャルコンソールで武者アレスタが配信されるみたいなんだけど、エイプリルフールじゃないよね? 速攻買うぜ。(実物持ってるくせに)

% [clip] これからハルルコがすごいうそをつきます。

GIGAZINE のまとめページから。

「すごいうそ」というフレーズに惹かれて開いたらエロゲ屋だったんでリンクは控えるけど、ネタとしてはすんごい笑ったんで気になる人はぜひ。 別に 18 禁なネタではありません。 マジすごかった(笑


2008-04-02 [長年日記]

% [Ruby] define_method はバカにできないなと思った件

実は今までちょっとバカにしていたというか、この前の Test::Unit のネタみたいな遊びをやるためのものとしか思ってなかったんだけど、ふと思い付いたことがあって試してみたらなんか良い感じなので素直に見直した。

例えば何かやたら重い関数 (メソッド) があって、でもそれは何度実行しても同じ値を返すので実行するのは一回だけで良い、というようなシチュエーションがあったとしよう。 その場合、まあ普通はどこかにキャッシュしようと考えるわけだね。 メモ化という言葉を使っても良いが。 でまあ、以下のような実験用スクリプトを書いてみた。

% cat def_test.rb
class Heavyweight
   def self.func
      sleep 2
      self.to_s
   end
end

class Def
   def self.cache
      @cache ||= Heavyweight.func
   end
   def test
      self.class.cache
   end
end

class DefClassVar
   def test
      @@cache ||= Heavyweight.func
   end
end

class DefInstanceVar
   def test
      @cache ||= Heavyweight.func
   end
end

class DefineMethod
   cache = Heavyweight.func
   define_method(:test) do
      cache
   end
end

klass =
   case ARGV[0]
   when 'def'
      Def
   when 'class_var'
      DefClassVar
   when 'instance_var'
      DefInstanceVar
   when 'define_method'
      DefineMethod
   else
      puts "usage: #{$0} (def|class_var|instance_var|define_method) [number_of_call]"
      exit(0)
   end

obj = klass.new
num = (ARGV[1] || 10000).to_i - 1
num.times do
   obj.test
end
p obj.test
puts 'done.'

いくつかの方法で、Heavyweight.func を一回しか実行させないようにしている。 これを実行すると、

% time ruby def_test.rb def 100000
"Heavyweight"
done.
ruby def_test.rb def 100000  0.35s user 0.02s system 8% cpu 4.614 total

こんな感じで結果が出る。 で、以下がそれぞれの方法でやった場合の結果。(邪魔なところは省略してるよ)

% time ruby def_test.rb def 100000
0.35s user 0.02s system 8% cpu 4.614 total

% time ruby def_test.rb class_var 100000
0.20s user 0.01s system 4% cpu 4.336 total

% time ruby def_test.rb instance_var 100000
0.24s user 0.02s system 5% cpu 4.373 total

% time ruby def_test.rb define_method 100000
0.33s user 0.02s system 14% cpu 2.404 total

このように define_method を使った場合が一番速い。 ただまあ、実際のところは回数を増やしても、

ruby def_test.rb def 1000000  1.95s user 0.03s system 31% cpu 6.317 total
ruby def_test.rb define_method 1000000  1.93s user 0.03s system 44% cpu 4.388 total

という感じなので、単に最初の一回分が遅いだけであとはそれほど違いは無いっぽい。 でも、define_method って実行が遅いような気がしてたんで、これはこれで意外ではあった。

(追記)定数にした場合を試すの忘れてたけど…… まあ良いや。大して変わらんだろ(/追記)

おまけ。

この前書いた 文字列の mutable, immutable の話で、毎回新しい文字列が生成されて気になるということを書いたが、define_method を使えばそれを回避できることに気がついた。

irb(main):001:0> Object.class_eval do
irb(main):002:1*   hoge = 'hoge'
irb(main):003:1>   define_method(:s) do
irb(main):004:2*     hoge
irb(main):005:2>   end
irb(main):006:1> end
=> #<Proc:0x005b6b20@(irb):3>
irb(main):007:0> s.equal? s
=> true

まあ、これがどれだけ嬉しいかはわからんけど、ともあれ、define_method はブロックあるいは Proc オブジェクト (つまりクロージャ) を渡すものなので、単に「メタプログラミング用の def」という位置付けではなく、もっと広い場面で便利に使えそうな気がしてきてるのであった。 今回の実験で、今まで懸念していた性能の問題もほとんど気にしなくて良いみたいなのもわかったしね。

% [clip] 一行で吹いたら右足崩壊 (イミフwww)

がんばったけど >>69 で右足崩壊。

あと >>248 、手遅れw


2008-04-03 [長年日記]

% [雑談][Ruby] 本当に private

個人的に define_method をどう活用してやろうかと思考を巡らすブームが来てたりするんだが、そんな中、値や関数をほんとの意味で隠蔽したい際に使えそうだなと思った。

まあ、ぶっちゃけ Ruby でメソッドの隠蔽とか考えるなんてちゃんちゃらおかしいというか、そんなもん気にした方が負けだと思うんだけど、そういうのが気になって気になってしかたがない人ってのもいるかもしれない。

ちなみに Ruby に詳しくない人のために、Ruby における通常のメソッドの可視性について軽く説明しておくと、

  • public
    • 普通はこれ。誰でも触れる
  • protected
    • そのクラスかサブクラスのメソッド定義の中でだけ使える。
  • private
    • 関数的な呼び出しだけができる。よってそのクラスかサブクラスの中でしか使えない。

ここで言う「関数的」は、わしがよく使っている意味とは違って、単に object.hoge() みたいなのはダメで hoge() なら良いよというだけの意味。 protected と private は self.hoge という呼び出し方ができるかどうかくらいしか違いが無いので、一緒にしちゃったら?という意見はよく聞くはずである。たぶん。

でまあ、一見 private/protected を指定しているとたしかにそのメソッドにアクセスできないような気はする。

irb(main):001:0> class A
irb(main):002:1>  private
irb(main):003:1>  def f
irb(main):004:2>   p 'f'
irb(main):005:2>  end
irb(main):006:1> end
=> nil
irb(main):007:0> a = A.new
=> #<A:0x5b705c>
irb(main):008:0> a.f
NoMethodError: private method `f' called for #<A:0x5b705c>
 from (irb):8

…… のだが、こんな制限は「その気」の人間からは簡単に突破される。

irb(main):009:0> a.send(:f)
"f"
=> nil

結局、Ruby におけるメソッドの可視性は、単に「プライベートな感じでよろしく」ととりあえず宣言しているだけで、それを実際に守るかどうかは使う側次第なわけだ。 で、Ruby にはこういう、「とりあえず宣言的な意味での制限」はたくさんあるけど、そのほとんどはわかってさえいれば簡単に無視できる。 まあ、それが Ruby の良いところだと思うんで文句を言うつもりはさらさら無い。

で、本題の「ほんとの意味での隠蔽」だけど。 こんな感じ↓

irb(main):001:0> class A
irb(main):002:1>  f = Proc.new { p 'f' }
irb(main):003:1>  define_method(:g) do
irb(main):004:2*   f.call
irb(main):005:2>  end
irb(main):006:1> end
=> #<Proc:0x005b6c24@(irb):3>
irb(main):007:0> a = A.new
=> #<A:0x5b3df8>
irb(main):008:0> a.f
NoMethodError: undefined method `f' for #<A:0x5b3df8>
 from (irb):8
irb(main):009:0> a.g
"f"
=> nil

とりあえず今のところ、こういう方法で用意された f の中身を別のものに差し換える方法は (少なくとも Ruby レベルでは) 思い付かない。

まあ、これがどれほど嬉しいかというと、わりとどうでも良いっていうか、Ruby 的な美学からするとむしろ柔軟性が下がって美しくないという見方さえできる気がする。 ということで、およそネタのレベルだね。 使い道があるとも思えない。

ただ、隠蔽がどうのこうのじゃなく、単にメソッドローカルな処理の中に例えば昨日の「一回だけ処理したい」みたいなものがあった場合に、そのためだけにインスタンス変数だのなんだのを使うのはどうも美しくないなあ、などと思うことはあるかもしれず、そういうときには define_method が便利なのかもしれないなどと思ったりもするが、実際のところはようわからん。

ぜんぜんまとまらねー(苦笑

% [雑談] 気分爽快

今週一杯かけても終わるかどうか…… と思っていた作業をさきほど、ほぼ完了させて気分爽快。 とはいえ、その分昨日はちょっと無茶しすぎたんで、今日は早めに休もう。

しばらく放置してるゼルダは…… やめとこう。 せっかくゲットした睡眠時間を全部放出しちゃいそうだ(苦笑

ゼルダはもう少し落ち着いてから :-)


2008-04-04 [長年日記]

% [Fortress] 1.0 リリース記念で久々に Fortress をいじってみた

1.0 ってことはさすがに規格書に書いてある構文は全部使えるようになったってことだよねー? ということで、まずは以前未実装なためか実行できなかったテストコードを動かしてみる。 いつの間にか component の名前とファイル名が一致してないとダメになったみたいで、最初「まともに動かねー!!」と思ったんだけど、ファイル名を直したら全く中身の修正無しに動いた。

% fortress LabelAndExit.fss
guessing FORTRESS_HOME=/usr/local/fortress/bin/..
in B
out of A

うろ覚えだけど、想定通りの動きをしてるはず。 あと、以前使えなかった n:m というレンジ式も問題無く動いた。

% cat Range.fss
component Range
   export Executable
   run() = do
      for i <- sequential(2:10) do
         println i
      end
   end
end
% fortress Range.fss
guessing FORTRESS_HOME=/usr/local/fortress/bin/..
2
3
4
5
6
7
8
9
10

めでたし、めでたし。 続く…… かも。

% [Perl] tie のお勉強

以前「なんじゃらほい?」と思いつつも放置してた tie について、ちょっと勉強してみた。 要するにあるクラスのオブジェクトを Perl の基本的な型である scalar, array, hash, handle のように振る舞わせるためのものなんだな。 試しにちょっと書いてみた。

% cat HObject
package HObject;
use strict;
use warnings;

sub new {
   print "new\n";
   bless {};
}
sub hello {
   print "Hello!!\n";
}
sub TIEHASH {
   my $name = shift @_;
   print "TIEHASH\n";
   new __PACKAGE__, @_;
}
sub FETCH {
   my ($this, $key) = @_;
   print "FETCH $key\n";
   eval "\$this->$key";
}
sub STORE {
   my ($this, $key, $value) = @_;
   print "STORE $key, $value\n";
}
sub DELETE {
   my ($this, $key) = @_;
   print "DELETE $key\n";
}
sub CLEAR {
   print "CLEAR\n";
}
sub EXISTS {
   my ($this, $key) = @_;
   print "EXISTS $key\n";
   1;
}
sub FIRSTKEY {
   print "FIRSTKEY\n";
   'hello';
}
sub NEXTKEY {
   my ($this, $lastkey) = @_;
   print "NEXTKEY $lastkey\n";
   'hello';
}
sub SCALAR {
   __PACKAGE__;
}
sub DESTROY {
   print "DESTROY\n";
}
sub UNTIE {
   print "UNTIE\n";
   undef;
}
1;
% perlsh
main[191]$ use HObject;
()
main[192]$ use vars qw(%hoge);
()
main[193]$ tie %hoge, 'HObject';
TIEHASH
new
bless({}, "HObject")
main[194]$ $hoge{hello};
FETCH hello
Hello!!
1
main[195]$ $hoge{hello} = 'foo';
STORE hello, foo
FETCH hello
Hello!!
1
main[196]$ delete $hoge{hello};
DELETE hello
1
main[198]$ scalar %hoge;
"HObject"
main[199]$ untie %hoge;
UNTIE
DESTROY
(undef, 1)

なるほどなー。 で、これを利用してライブラリを書けば、普通の値のように扱うことができるって寸法なんだね。

% [OCaml][FreeBSD][Mac] 1.0 記念で Ocsigen を入れようとして絶望した件

アナウンスが 4/1 だったんでエイプリルフールか?とちょっと疑ったんだけど本当だったのでおめでとうございます。

ということでインストールしてみようと思ってダウンロードしてみたんだけど、結構いろいろ入れなきゃならないものが多いんで、久々に godi_console を立ち上げて build ファイルをアップデートしてパッケージリストを物色…… と思ったらなんだい Ocsigen 1.0.0 が含まれているではないの。

じゃあさっそく…… とインストール開始したんだが、ocaml-sqlite3 がビルドに失敗してあえなく挫折。 sqlite3 のディレクトリを MacPorts のものに設定しても同じなので、諦めて FreeBSD に入れることに。

しかし最近 FreeBSD は OCaml 関係で恵まれてなくて、Ports はいまだに 3.09.3 とかだったり、大変微妙。 まあ、godi が使えればいらないですよね〜ってことで今まで入れてなかった godi をインストール開始。 で、インストール完了後、そりゃーってんで Ocsigen のインストールを始めたわけだが、なんか知らんけど ocaml-ssl のビルド時に Thread モジュールが無えよとかってエラーが出て「はあ、何それ?」とひっくりかえる。

何が起きてるんかと思って、godi/build/godi/godi-ocaml-src/Makefile を見てみるとなんとこんな↓ のが。

46 .if ${OPSYS} == "FreeBSD"
47 CONFIGURE_ARGS+=-no-pthread
48 .endif

おいおい。 仕方ないので試しに自分で 3.10.1 をビルドしてみることに。 ビルドは普通に終了したので動かしてみる。

% ./boot/ocamlrun ocaml -nostdlib -I stdlib -I otherlibs/systhreads unix.cma threads.cma   
        Objective Caml version 3.10.1

# Thread.self;;
- : unit -> Thread.t = <fun>

うーん、動くなあ。 godi はなんであんな指定してるんだ? しゃーないから godi.conf に

OCAML_CONF_ARGS=-with-pthread

って足してインストールし直しか…… ダル〜

といった感じで、やたら時間を浪費して疲れたょ、とほほ。 こりゃ実際いじるのは明日だなー。

% [OCaml][FreeBSD][GODI] 続き

ぐはぁっ、OCAML_CONF_ARGS=-with-pthread とか指定しても変わらないじゃん。

どうなってんねん…… と思って OCaml の configure を見る。

 86     -with-pthread*|--with-pthread*)
 87         ;; # Ignored for backward compatibility
 88     -no-pthread*|--no-pthread*)
 89         pthread_wanted=no;;

はい、それまでよ...orz

先に -no-pthread 付けられたら回避する方法ナッスィングかよ。 頭に来たからもう godi の Makefile 直接いじっちゃるわい。 なんやねんな、まったく。

% [clip][OCaml] Problem14(2) -BigInt- (みずぴー日記)

はてダにはコメントしないと誓ったのに、以前のわしと同じように道を進んでるのを見てつい。→ ref. 1, 2

で、2 の方のリンクでも書いてるしコメントもしたんだけど、Hashtbl.hash という関数は Big_int.big_int 型の値に対しては常に同じ値を返す。

# List.iter (fun i ->
    print_int (Hashtbl.hash (Big_int.big_int_of_int i));
    print_newline ()
  ) [ 1; 2; 3; 4; 5 ];;
1
1
1
1
1
- : unit = ()

んで、Hashtbl モジュールは (たぶん他の言語でも似たようなもんだと思うけど)、ハッシュ値の衝突があった場合は同じハッシュ値の値はリストに詰めておいて、find のときにはその中から equal 関数を使って探す (だから functor が要求する signature に equal が含まれる)。もちろん捻りのないリストだから線形探索だ。

だから mzp さんが書いたものは、Big_int が遅いことよりもハッシュテーブルから値を取り出すことに時間がかかってることの方が性能へのダメージが大きいんじゃないかという気がする。 むしろハッシュテーブルなんて使わない方が断然速いと思われ。

(たぶん同じ問題だと思うんだけど) わしが 32bit 版 ocamlopt で Num モジュールを使った結果はこちら→ ref. 3

% [雑談] 最近 Lisp スレが異様に速くて付いていけない

という感じで Part21 が立ったようだが、

13 デフォルトの名無しさん [sage] Date:2008/04/04(金) 18:36:37  ID: Be:




    ※LispとSchemeのスレです。



14 デフォルトの名無しさん [sage] Date:2008/04/04(金) 18:42:02  ID: Be:
    お酒とワインのスレです。みたい 

15 デフォルトの名無しさん [sage] Date:2008/04/04(金) 18:45:12  ID: Be:
    麺類とうどんのスレです。みたい 

16 デフォルトの名無しさん [sage] Date:2008/04/04(金) 20:03:18  ID: Be:
    >>15
    ワラタ

    ;;;蕎麦で喧嘩するんだぜきっとw 

吹いたw

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

% みずしま [お。いつの間にか1.0が出てたんですね。いい機会だから 久しぶりに触ってみようかな。]

% jijixi [個人的には結構好きになれそうな要素が多いんですけど、パターンマッチが無いのだけが残念なんですよね(苦笑 で、結局あ..]

% みずしま [ああ。そういえばパターンマッチが無いんですね。>Fortress 確かにそこは残念ですね。concrete cla..]


2008-04-05 [長年日記]

% [OCaml][Ocsigen][Eliom] Ocsigen & Eliom 事始め

Ocsigen とは OCaml で書かれた Web サーバで、Eliom というのは Ocsigen 用の Web サービスを作るための OCaml のモジュール。 ちなみに Ocsigen は Oxygen (酸素)、Eliom は Helium (ヘリウム) に引っかけたネーミングである (おそらく)。

で、昨日 FreeBSD にインストールしたものの、結局 Mac の方でも godi-sqlite3 のビルド時に出るエラーを修正して (単に一箇所 redefine エラーが出るだけだったので、ビルドが止まったらそこを直して godi_make を再度実行するだけ)、インストールしてしまった。 まあ、それはどうでも良いだろう。

ともあれ、まずは簡単なサンプルを…… と思ったんだけど、Ocsigen の設定ファイルが作成されてないな。 自分でやれってことか……

ということで、(以下、相対パスは GODI をインストールしている場所を基準に考えること。ちなみにわしは /usr/local/godi だが、デフォルトは /opt/godi だったような) etc/ocsigen/ に share/ocsigen/examples/ocsigen.conf をコピーして、適当に編集。 よくわからんところもあるが、とりあえずこんな感じ。

% cat etc/ocsigen/ocsigen.conf
<!-- vim:ft=xml
-->
<ocsigen>
   <server>
      <!-- ____________________________________________________________ -->
      <!-- First part: basic configuration                              -->
      <port>8080</port>
      <logdir>/usr/local/godi/var/log</logdir>
      <datadir>/usr/local/godi/var/lib</datadir>
      <user>jijixi</user>
      <group>jijixi</group>
      <charset>utf-8</charset>

      <!-- ____________________________________________________________ -->
      <!-- Second part: Ocsigen's Extensions                            -->
      <findlib path="/usr/local/godi/lib/ocsigen/METAS"/>
      <extension findlib-package="ocsigen_ext.redirectmod"/>
      <extension findlib-package="ocsigen_ext.revproxy"/>
      <extension findlib-package="ocsigen_ext.accesscontrol"/>
      <extension findlib-package="ocsigen_ext.authbasic"/>
      <extension findlib-package="ocsigen_ext.cgimod"/>
      <extension findlib-package="ocsigen_ext.staticmod"/>
      <extension findlib-package="ocsigen_ext.ocsipersist-sqlite" />
      <extension findlib-package="ocsigen_ext.eliom"/>

      <!-- ____________________________________________________________ -->
      <!-- Third part: Configuration of virtual hosts and sites         -->
      <extconf dir="/usr/local/godi/etc/ocsigen/conf.d" />
      <host>
         <site path="examples">
            <eliom module="/Users/jijixi/tmp/eliom/hello.cmo" />
         </site>
      </host>

      <!-- ____________________________________________________________ -->
      <!-- Fourth part: various settings                                -->
      <commandpipe>/usr/local/godi/var/run/ocsigen_command</commandpipe>

   </server>
</ocsigen>

最初に動作テストをするときは <host> のところをサンプルファイルのままにしておいた方が良い。 これは Eliom で遊ぶために書き換えた後のもの。 サンプルのままにしてある場合は、

% ocsigen

とやってサーバを起動すると、http://localhost:8080/ にアクセスすれば色々出てくるんで、ポチポチリンクを押してみるよろしい。 ともあれ、そこはそれぞれ適当にやってもらうとして、hello.cmo を作る。

% cat ~/tmp/eliom/hello.ml
open Lwt
open XHTML.M
open Eliom_services
open Eliom_parameters
open Eliom_sessions
open Eliom_predefmod.Xhtml

let hello =
   register_new_service
      ~path:["hello"]
      ~get_params:unit
      begin fun _ () () ->
         return
            (html
                (head (title (pcdata "sample page")) [])
                (body [h1 [pcdata "Hello world!"]]))
      end

だいたいはチュートリアルのまんま。 return というのは Lwt というモジュールの関数で、Lwt は Lightweight Thread の略のようだ。 で、このモジュールのインターフェイスはリファレンスを見ると一目瞭然だけど、まんまモナドである。 要するに、スレッド制御のこまごまとした部分をモナドに閉じ込めて簡単にしたというものみたい。

html 関数以降の部分は出力される HTML を表わしている部分だが、字面はなんというか Kahua そっくり。 ただ、Kahua と大きく違うのは、ここで出力される HTML はコンパイル時に型検査されるので、コンパイルに成功した時点で常に valid な XHTML が出力されると保証されること。 まあ、その分面倒も多そうだけど、個人的な趣味で言えば大変すんばらしいと思う。

このファイルを有効にするには、

% ocamlfind ocamlc -thread -c -package ocsigen hello.ml

てな感じでコンパイルしてやって、できた hello.cmo の場所を ocsigen.conf で指定してやれば良い。 上記の設定であれば http://localhost:8080/examples/hello で表示できる。

さらに、パラメータもきっちり型付けして取得できる。 hello.ml に以下のように書き足してみる。

(* open してる部分は略 *)

let head = head (title (pcdata "sample page")) []

(* hello の部分は略 *)

let show_params =
   register_new_service
      ~path:["show"]
      ~get_params:(int "age" ** string "name")
      begin fun _ (age, name) () ->
         return
            (html head
                (body [p [pcdata ("name is " ^ name);
                          br ();
                          pcdata ("age is " ^ (string_of_int age))]]))
      end

これで、/examples/show というページが追加された。 ocsigen を再起動して http://localhost:8080/examples/show?age=10&name=hoge にアクセスしてみよう。

<body> 
  <p>name is hoge<br></br>age is 10
  </p> 
</body>

こんな感じの body が出力されたはず。br タグがなんかショボいけどまあ気にしない。 で、もしここで型の合わないパラメータを指定してリクエストすると…… (例えば /examples/show?age=foo&name=hoge としてみる)

<h1>Wrong type for parameter <em>age</em>.
</h1> 

こんなのが出た。素敵。 Web サービスの中身だけじゃなくインターフェイスまで型付きになる。

いーなー、おもしろすぎるなー。 Kahua もおもしろかったけど、それ以上におもしろい。 問題は Kahua に存在する簡易的なテンプレートシステムレベルのものすら用意されていないところか。

まあ、型検査によって常に valid な XHTML を出力するのがウリなわけだから、わざわざそこを台無しにしてしまうようなものは入れないだろうし、テンプレートも結局 (システムもテンプレートも含め) Eliom で書くしかないんだろう。

ただし、OCamlduce には対応しているようなので、それを使えばもう少し柔軟になるのかもしれない。 OCamlduce というのは (使ったことないからちょっとググってみた程度の知識だけど) XML の型検査をしてくれる処理系のこと。 "処理系" と書いたのは、言語は OCaml なんだけどライブラリではなくて処理系ごと fork したものらしいので。 なんか、

{{ <hoge class="{{ f "foo" }}">hoge</hoge> }}

みたいなのに、ちゃんと型が付くんだそうな。 で、当然型が整合しないときはコンパイル時にエラーになる。 仕組みがよくわからないけど、なんかやってることはスゴそうではある。 これもいつかはいじってみないとなー。

ともあれ、静的型付け言語を好むような人にとって、Eliom はすごくおもしろいものだと思う。 今のところ Ocsigen という Web サーバとセットでしか使えないが、Ocsigen にはリバースプロクシの機能もあるみたいだし、他の Web サーバと協調することは可能なはず。 あと、このページの Current work のところには、短期目標として

FastCGI module

なんてのが挙がってるんで期待。

とりあえずこんなところで。 静的型付け言語用の Web フレームワークと言えば、Lift なんかもいじってみたいんだよな。 どういうものか全然知らないんだけど、Rails に影響を受けてるってことは、Eliom とは違うアプローチなのかね。 ま、こいつもいずれいじってみよう。

% [雑談][Scala] Lift 入門ならず

よーし、軽くサンプルくらい動かしてみっかなー、とか思ってリポジトリからチェックアウトして、なんか apache maven とやらが必要だってんで入れてみて、つーか maven て一体何するもんだよ?と疑問を持ちつつも lift-example も svn で引っ張ってきて、HowTo run examples の言うとおり

% mvn jetty:run

とかやってみたけど、null がどーのこーので何も実行できず。 つーかなに、mvn って ant みたいなもの?何が違うの? とか疑問を抱きつつ、pom.xml がおそらく Makefile のようなものであろうと見てみると、こんなのが書いてある。

<parent>
  <groupId>net.liftweb</groupId>
  <artifactId>lift-examples-parent</artifactId>
  <version>0.7</version>
  <relativePath>../pom.xml</relativePath>
</parent>

これは…… なんだろう。lift-examples-parent っていう名前の何かが一つ上の階層に無きゃだめってことか? それは一体どこにあるんだ。 少なくともさっきチェックアウトした Lift のディレクトリには無いぞ。 さっきの HowTo... のページにも見当らないよな。

なんだろね、これはわしが maven のこととかをよく知らないからハマるのか、それとも誰でもハマるのかどっちだ。

とりあえず、今回は力尽きたわ...orz

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

Before...

% jijixi [> 全体を checkout すればなんとかなりませんか? ダメでした。 最初にやったときよりは進んだみたい..]

% odz [あー、なるほど。 maven-scala-plugin ディレクトリで mvn install ってやればうま..]

% jijixi [やってみました。 % mvn install (略) [INFO] Unable to build pro..]


2008-04-06 [長年日記]

% [Scala][Lift] Lift 今度こそ入門 (仮)

昨日、入門しそこねた件は、odz さんのアシストにより、

  • examples をチェックアウトしただけじゃダメっぽい
    • 実は Lift のリポジトリをチェックアウトした時点で liftweb/sites 以下に examples が含まれていたことに気づいた
      • しかし今度は maven-scala-plugin が無いよと怒られる
  • scala-tools/maven-scala-plugin 内で mvn install すれば良いらしい
    • it requires Maven version 2.0.7 と怒られる
      • 2.0.8 を拾ってきて入れたはずなのにナゼ?
      • 実は Mac OS X には (あるいは Developer Tools には、か?) Maven (2.0.6) が含まれていて、そげなこととは露知らぬわしはパス設定のワナでそちらを (無意識に) 使っていた

という感じで、ようやく光明が見えてきた。

さっそくパス設定を変更して、新しい mvn コマンドを使って maven-scala-plugin で mvn install を実行。 …… 成功。

その後 sites/examples で例の mvn jetty:run を実行したら、ようやく動いたよ。 でも実行されるまでに、ものすごい数のファイルをダウンロードしまくってたのが気持悪すぎた。 まあ、それを言いだすと maven-scala-plugin を入れたときに ~/.m2 以下に何かが大量に突っ込まれたことの方がもっと気持ち悪いが(苦笑

…… 気にしないことにします。

ともあれ、ようやくスタートラインに立てた感じ。 実際に自分で何か書いてみたりするのは…… また後で。

最後に、これから同じことやる人のためにサマリ。

  • まず Lift のリポジトリ全体をチェックアウト。
    • チュートリアルとか無視して ここ を参考にがばっと取ってきた方が良さげ。
  • HowTo run examples には、いかにも各サンプルをそれぞれ拾って来いみたいに書いてるがそれは無視。
    • あらかたは、さっきチェックアウトした Lift の liftweb/sites/ に含まれてるので、こっち使う。
    • で、HowTo の通りに mvn jetty:run すると maven-scala-plugin が無いと怒られるので、その前に入れる。
      • Lift リポジトリの scala-tools/maven-scala-plugin で mvn install するとプラグインがインストールされる。
  • あとは liftweb/sites/examples で mvn jetty:run を実行。
    • なんかものすごいたくさんのファイルをダウンロードしにいくが、がまんして待つ。
    • 最終的には [INFO] Started Jetty Server みたいな表示が出るので、Web ブラウザで http://localhost:8080/ に接続。

最終的に何がワナだったかと言うと…

  1. HowTo のページに書いてある場所から examples を取ってきても、それは完全な状態じゃない
  2. maven-scala-plugin が必要なのに、そんなことどこにも書いてない
  3. Mac OS X にはこっそり古い Maven が入っている

三つ目はともかく、最初の二つはドキュメントが悪いよなー。 少なくとも Maven とか使ったことない人間には対処不能だよ。 おそらくこれ以降のページでも、同じく Lift のリポジトリが全部存在するのを前提とした説明になってるに違いないので、これからはそのつもりでやることにしよう。 いやー疲れた (精神的に)。


2008-04-07 [長年日記]

% [雑談] マクロス F 第一話

オフィシャルサイトには北海道での放送予定が書かれてなかったんでがっかりしてたんだけど、なぜかやってるという。 まあ、某所で見ちゃったんだけど、ちゃんとでっかい画面で見るとまた一味違うわ。

しかし、先行放送版見たときも思ったけどクオリティ高すぎるね。 むしろこれから先大丈夫なのかと不安になるほどに(苦笑

なんつーか最初のシリーズをリアルタイムで見ていたおっさん世代にはたまらない、オマージュ的な演出がたくさんあって楽しすぎる。 やっぱ最大のオマージュ要素はランカ (緑髪の子) の声優だよね。 よくぞあんな最初の頃のミンメイっぽいのを見付けたものだと感心するよ(笑

あー、でも夜中の二時半放送はツラすぎるなー。 今日はたまたまそういう時期だったから起きてるけど、いつもそうとは限らないし。 やっぱ某所に頼っちゃうことになるのかしら……

おまけ: シンクロ率 400% 動画 → sm2903603


2008-04-08 [長年日記]

% [雑談] なんかもたもたしてるうちに EeePC 買うタイミングを逃しつつある気がする

HP から対抗馬が出るだの、EeePC もディスプレイ大きくしたのを前倒しで出すだの、様子見したくなるような情報がいろいろと……

いや、逆にみんながそうやって様子見してる今こそ買い時なのか?

わからん…… どうしたら良いのか全然わからん。

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

Before...

% jijixi [いやー、今まさに欲しいんですよね。 幸い資金もあるし。 なのに「もうちょっと待てば良いのが出そう…」とかそういう..]

% Hi-Low-Mix [今買わない者が明日買う訳がない! 買わない理由なんていくらでも考えられるんだ!]

% jijixi [買えって言われてるんだろうか、買うなって言われてるんだろうか(笑 っていうか、これから逝ってまいります。]


2008-04-09 [長年日記]

% [Firefox][Mac] Firefox Beta 5 がちょっとヤバい (現代的な意味で)

Mac OS X用Firefox 3.0 Beta 5はSafari 3.1よりも高速 (ZDNet Japan) という記事を読んで、ちょっと Mac 版の Firefox Beta 5 を試してみたんだけど……

なんか livedoor Reader とかの体感速度が Safari 3.1 より上なのは確か。 ブックマークとかの操作も以前のもっさり感が無いし、全体的に Safari より快適な気がする。 個人的に WebKit 系の強みだと思っていたフォントの関係も、Cocoa ベースになったからかほとんど違いがわからなくなったし (まだ若干 Safari の方が表示がシャープな気はするが)、乗り換えるに足るものに仕上りつつある気がする。

しばらくメインで使ってみようかと思ってみたり。

% [雑談] 娘娘の CM が頭から離れません。助けて!!

ちょっと気を抜くとすぐに「ハオチィライライ…」 って始まるんだよぅ。 今年の CM 大賞決まったな、もう。

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

Before...

% jijixi [なんか知らん間にフラグ立っとる(笑]

% odz [あろはさんと、keisukenさんと私でフラグを立てておきました。]

% jijixi [フラグが回収されるときのことを覚悟しときます(汗]


2008-04-11 [長年日記]

% [雑談] なんかこう、うまく回らないときってあるよ

あまり慣れていない事に手を出そうとして、それが何だかうまく動いてくれないとき、はたして自分のやり方が原因なのかそれとも他に原因があるのかという切り分けは難しいものだよね。

そういうときには、やっぱり「こうして、こうすれば確実に動くよ」というマニュアル的なものがあると随分楽になる。 少なくとも確実に動く方法が一つわかっていれば、もし動かない時にそれが動く場合とどう違うのかを調べていけばだんだん色んなことがわかってくるから。

…… てなことを、なんだかイマイチ実りの無い一日を過した時点で思ったりしたのだったが。

しかしこれってデバッグのお約束にそっくりだな。 どうすればそのバグが再現するか、わかっているのとわかっていないのとでは、デバッグの効率に天と地ほどの差がある。

うむ、デバッグ報告には再現手順が必須。 チュートリアルには真似するだけで確実に動かせる手順が必須。 それらが無いと、デバッグにかかる時間は何倍にもなるし、入門前に挫折する人数は何倍にもなるだろう。


2008-04-12 [長年日記]

% [clip] sm2968082

洗脳動画キタコレw

ヤバい、頭おかしくなりそう。

% [clip] sm2960473

何度見ても笑うw

% [雑談] マクロス F の DVD は普通に買っちゃうんじゃないかなー

と、思ってます。 今のところは。

今のところは… ってのは、つまり、今後ありえないほど質が落ちたりしなければ…… ってことね。

…… あるいは、今後ありえないほどわしの経済力が落ちたりしなければ…… とか(汗

まあ、さすがに BD には手を出すつもりはないけど。 っていうか再生環境無いし。 や、何かキラーソフトが発売されてうっかり PS3 買っちゃってるって可能性はゼロではないけど、BD 品質を活かせる表示装置が無いしなー(苦笑

% [雑談] EeePC 買ってきた

きました。 ヨドバシで、2GB のメモリも一緒で約 6 万円。 あと、それで付いたポイントで 4GB の SD カード一枚。 まあ、メモリやら SD カードやらは、もっと安いところはたくさんあるんだろうけど、ぶっちゃけめんどくさかったんで。 色は白。 最後までどっちにするか悩んだんだけど、結局うちにあるのは iMac も Wii も PS2 もドリキャス(笑)も白いのでそれに合わせようと。

やー、買っちゃったよ。買っちゃったなー。 で、これからの予定。

  1. とりあえず素の状態で動作確認
  2. 昼寝
  3. メモリ交換
  4. 本体 SSD の中身をシェイプアップ
  5. SD カードに色々入れる

てな感じかね。 なんか変なの混じってるけど、いやもうなんか眠くて。 つーかね、なにやら寒いなーと思ったら雪降ったりしてんの。 もうアホかとバカかと。 ようやく身体が暖かいのに慣れてきたと思ったのに、今さら雪とかやめれと。 ということで (どういうことで?) 眠いのよ。

まあ、それはともかく、EeePC は当面 Windows のまま運用することになるだろう。 いずれ FreeBSD か、それが無理でもせめて何か Linux を入れたいなとは思うが。

% [雑談] EeePC 日記

音しねー(笑

厳密には SSD にアクセスしたときの「チィー」って音は聞こえるけど、ハードディスクとかファンの音に比べれば誤差の範囲だ。 シャットダウンの時とか、いつ電源切れたのかわかんないし。 普通はハードディスクの回転が止まるフィ〜ンって音でわかるけど、そもそもこいつは何も回転してないからなー。

やっぱ回転する部分が無いのは良いことだ。 回転音が人一倍気になる人間であるわしにとっては特に。

ちなみに掃除機の音を擬音で表わせと言われて「ぶぃーん」って書く人は幸せな人だ。 わしにとって掃除機の音は「きぃーん」だから。 たぶん、猫とかの動物にもそう聞こえてるはず。 だから掃除機が動き始めると避難する。 わしも避難する。

ともあれ、この音の静かさは想像以上にすばらしいな。 SSD ばんざい。 わしは思ってた以上にこやつを愛せそうな気がするぞ。

% [雑談] SSD の弊害

Windows の UI がクソだってのもあるかもしらんが、今自分がやったクリックやダブルクリックが有効かどうかを確認する手段が無い(苦笑

普通、例え UI 的に目に見えなくても操作に成功していればハードディスクが動き出すから、うまく行ったかどうかはそれなりに判断できるんだけど、SSD の場合はほとんど音がしないからそこら辺がすごくわかりにくい。 しかも SSD のアクセスインジケータが右手の平で隠れる場所に付いてるんで、こいつを見て確認するのもちょっとかったるい。 これはあれだなー、インジケータは奥側に付けるべきだったなー。 残念。

% [雑談] EeePC ぽちぽち設定中……

Windows ではありがちなこととして、システムのアップデートがアホほど長い。 ので、ようやく今、やりたいことがやれるようになってきた感じ。

まず RAM ディスクを用意した。→ ERAM

で、TEMP とかブラウザのキャッシュとかの場所を RAM ディスクに割り当てて、SSD の劣化対策。 もちろんページファイルは無しに設定。 あとは Firefox 入れて、これでやっとこスタートラインかな。 いらないもの捨てつつ、付属の SD カードにアプリとか入れていこう。 追加で買ってきたのと、どっち使おうか迷ったけど、どっちも Class6 の 4GB だったから適当に決めた。 (っていうか、剥き身で一緒に置いといたら、どっちがどっちだかわからなくなったという)

UN*X 系環境はどうしようかと迷ったけど、結局慣れてる Cygwin にしようかと。 メモリはあるんだから coLinux ってのもアリかなーとは思うが。

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

% Hi-Low-Mix [いやー、楽しげですなあ。 やはり新しいジャンルを切り開く製品にさわるというのはいいですね。 うらやましい。]

% jijixi [基本的にデジタルガジェット大好きな人間なもんで、逆にこの微妙に半端なスペックがたまんないですね(笑]

% Hi-Low-Mix [あー、わかります。 QV-10とかPalmとか、フツーにスペックを見るとヘナチョコな製品が、意外なおもしろさを醸し..]


2008-04-13 [長年日記]

% [雑談] EeePC 日記、二日目

寝すぎた。 全然いじれてない……

ちなみに EeePC には実はちっこい CPU ファンがついていた模様。 iMac G5 のファンの音にまぎれて気付かなかったが(苦笑)。 まあ、今のところはほとんど気にならないような音量ではあるんだが、ファンというものは大抵経年劣化によって騒音は増していくものなので、いつかは気になるようになるやもしれず。 こまめに掃除してやれば良いんだろうけど、どうも簡単にアクセスできるような場所ではないような…… うむう。

しかしあれだね、EeePC を設計した人にはセンスを感じるね。 USB 端子の配置なんて最たるものじゃないかな。 色んなもののスペックを最小限まで削りつつも、拡張のために必要な USB 端子は削らなかったどころか普通よりさらに増やして三つ用意。 しかもそれを単純に三つ並べるんじゃなく、左右両側にバラして配置してある。 たぶん、ちゃんと考えてこの構成なんだよね。 っていうか、これが単に偶然こうなっただけだとしたら、それは奇跡だ。

% [雑談] EeePC 日記、路線変更やむなしか

SD カードの予想外の遅さに絶望したりとか。 10 MBps ってこんなもんか。

システムに必須のアプリケーション以外は SD カードに逃がしたかったんだけど、インストールに時間かかりすぎで死にそうだからあきらめて本体側に入れよう。 あとは容量との戦いだなあ。

% [雑談] EeePC 日記、まだ微妙に中途半端

とりあえず、IE は 7 に、Windows Media Player は 11 に。 あと Firefox は 3.0 beta 5 をインストール。

隠しファイルになっているアップデータのバックアップファイルはガンガン消し。 システム壊れたら Linux でも入れるよ…… と思ってるからその辺余裕の強気で攻められる。 システムの復元とかも余裕で無効化。

それとオフィシャルサイトの FAQ に倣ってファイルシステム全体に圧縮設定をかけてみた。 メモリが潤沢だからなのか、ほとんど性能的なペナルティは感じない模様。

あとは、

  • 窓使いの憂鬱
  • skkime
  • 香り屋版 Vim
  • AVG Free edition

あたりと、Cygwin で

  • Ruby
  • Python
  • Perl
  • zsh
  • screen
  • OpenSSH

くらいは入れた。 てな感じの状態で、SSD の残りは 1.5 GB 程度。 システムのアップデートなんかを考えると、500 MB くらいは空けとかないと痛い目見そうだから、実質的な残りは 1 GB ってところかなあ。

あとは何が必要かな。 OCaml は Cygwin のパッケージが 3.08 とかなんで GODI で入れる予定。 それと Erlang か。 あ、せっかく Windows なんだから F# も入れときたいな。 Java はとりあえず JRE だけかな。

…… 1 GB で足りるんだろうか。

今のところ iTunes とかはスルー予定。入れるとこ無さそう。 Adobe reader は無駄にデカいのでとりあえず消した。 でも今どき PDF 見れないと困りそうだ。 なんか軽い alternative があった気がするが、それでも入れるかな。

普通に使い始めるまでには、まだしばらくかかりそうな予感。

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

% Hi-Low-Mix [インストールするアプリは厳選しないといけないんでしょうね。 アンチウイルスなどイヤでも必要なものもありますから、け..]

% jijixi [まったくそのとおりで :-) あれこれ頭を悩ませながら楽しんでおります。]


2008-04-14 [長年日記]

% [雑談] EeePC 日記、三日目

RAM ディスクから SD カードにファイルをコピーしようとすると、謎のエラーが出て失敗する。 やれ「ファイルパスが長すぎます」だの「ファイルが使用中です」だの「Permission denied」だの。 それぞれ、「Explorer でコピー」「なんかのインストーラー」「Cygwin 版 Ruby で泥臭く」な場合だったかな。 いずれにしても R:\ から D:\ にコピーしようとしてるだけなのに、およそ意味不明。

一旦 SSD にコピーしてから SD カードにコピーすればうまくいくんで、RAM ディスクと SD カードとの間に直接は埋められない壁があるみたいなんだけど、まいったね、こりゃ。 一時的な保存場所を RAM ディスクにしておいて、必要に応じて SD カードにコピー…… ってシナリオを考えてたのに、これじゃ無理。 毎回 SSD にコピーするなんて、せっかく RAM ディスク作って書き込み回数減らそうとしてるのに、努力が水の泡じゃないか。

速度が違いすぎるのがいけないのか、どちらかのドライバに問題があるのか、どっちにしても根本的な解決は自力じゃ無理そうなんで、なんとか対症療法でも見付けられないもんかと思うんだが、今のところは SSD を経由するしかない感じ。 ふみぃ。

なんかダウンロードするというシチュエーションなら、直接 SD カードに保存すれば良くね? と思ったんだけど、Firefox だとうまくいかないんだよなー (IE は一時的に TEMP に保存するから…… で TEMP は RAM ディスクだから…… 論外)。 Firefox の場合キャッシュの場所を RAM ディスクに設定してあるんだけど、一旦キャッシュに保存してからコピーしたりしてるのかも。

とにかくまあ、まいりましたわ(苦笑

% [OCaml][GODI] EeePC 日記、GODI のインストールと設定編

何かをビルドするたびに一時的なファイルを SSD にがりがり書き込まれちゃ、たまったもんじゃないよなーということで、FreeBSD/Ports の WRKDIRPREFIX に相当するものを探した。 結果だけ書くけど、${GODI}/etc/godi.conf (${GODI} は GODI をインストールしたディレクトリだと思いなせえ) に、

WRKOBJDIR=/tmp

みたいに書く。 もちろん /tmp には RAM ディスクがマウントしてあるよ。 ついでに distfile やらでき上がったパッケージを保存しておくのももったいないから、

DISTDIR=/tmp
PACKAGES=/tmp

も加えておくと良い。 同じソースを使う場合にも毎回ダウンロードすることになるが、そんなことより SSD の容量の方が大事だよね :-p

てことで、EeePC に GODI をブートストラップからインストールする場合は以下のような流れになるだろう。

  1. godi-bootstrap-xxxxxx.tar.gz を拾ってきて作業場 (当然 RAM ディスク上) に解凍
  2. 普通に ./bootstrap を実行
  3. インストールされた ${GODI}/etc/godi.conf に上記の設定を追加
  4. ./bootstrap_stage2 を実行

ちなみに RAM ディスクは当初 250 MB にしてたんだけど、OCaml 本体のビルドのためにはこれじゃ足りなかった (泣けた)。 で、結局思い切って 500 MB 割り当てるように。 まあ、普段はこんなにいらないんだけど、いつかまた必要になることもあるだろうし、このままにしておこうかと。 っていうか、どの編に閾があるのかわかんないけど、250 から 500 に増やしたら RAM ディスクが見えなくなっちゃって、boot.ini を編集してメモリを切り離してやらなきゃならなくなったんで、戻すとまためんどくさいし。

ま、ブラウザのキャッシュを多めに割り当ててやれば、普段もそれほど無駄にはならんだろう。

% [雑談] EeePC 日記、SD カードリーダが不良品なんじゃないかって気がしてきたが……

微妙……

RAM ディスクからのコピーじゃなくても、失敗するときは失敗するみたい。 SSD からのときの方が成功率が高いのは速度の問題なんかなー。 つーかドライバが腐ってんじゃないのか? ERAM か何か、追加したドライバとの相性ってのも有り得るが。(まっさらの状態のときに十分動作確認しておくんだったと後悔するなー)

とりあえず事実関係まとめ。 使っているのは SDHC Class6 4GB のカード。 EeePC に付属してきたのと、買ってきたの (スペック同じ) 両方同じ状態。

  • SD カードにコピーしようとしたとき、コピーが開始されるまでが異様に長い
  • 途中、高確率で謎のエラーが出てコピーに失敗する
    • パスが長すぎる、とか
    • パラメータが間違っている、とか
    • 権限が無い、とか
  • SD カードから他のドライブにコピーするときは全く問題無し
  • 要するに、読むのは普通だけど書くのが変

さらに、ずっと前に使ってた 128MB の SD (HC じゃない) を発掘したんで使ってみたら、普通に書き込める (コピーできる)。 なんだかなー。 ググってみても同じような現象は目につかないんだけど、やっぱこれって不良品なのか?

読み込みは大丈夫だから、書き込むのはもっぱら別のマシンでやることにして、ROM カートリッジのように使えば良いかー…… などと思いつつあったりもするんだが。 ってか、もし不良品なんだとしてもクレーム付けんのめんどい。 ネガティブな話をするのって好きじゃないんだよ、精神的に疲れるから……

なんかもう、USB メモリ一本買ってくればそれで良くね? 2GB で 2,000 円とかだよね、今。 アプリは結局 SSD 側に突っ込んじゃったし、データのやりとりだけならそれで十分って気も。


2008-04-15 [長年日記]

% [雑談] EeePC 日記、四日目

結局、クレームとかめんどいから日和って SD カードリーダを買ってきた (SDHC 対応なの持ってなかったんで)。 読むのは問題無いし、どうしても書き込みが必要なときはこれ使う。 うん、たかだか 1,980 円で心の平穏が勝ち取れるなら、その方が良いさ。 ついでにセール品だった 2GB の USB メモリ、1,880 円も買っといたりとか。 平和。

その後、Erlang やら何やら入れて、Media Player Classic とか Codec の詰め合わせとかも入れて、なんやらかんやら入れたら SSD の残りが 1GB を切ったが、C:\WINDOWS\SoftwareDistribution\Download にいかにも消せそうなのが 500MB くらいあったんでごっそり消し。 大丈夫なのかは知らん。 つーか、こんなフォルダ前からあったっけ?

てな感じで、SSD の残りは 1.2GB ちょいというところ。 あとは RubyGems と必要な gem いくつか入れるくらいだから、1GB 以上は残せそう。 こんだけ空いてれば、大抵大丈夫そうだな。

ところで、ニコニコで動画見ながらコメントできない (動画とコメント入力欄が一緒に表示しきれない) って話をどっかで読んだけど、ブラウザを全画面表示にすればギリギリできるっぽいね。 少なくとも Firefox 3 beta 5 ではできた。

% [雑談] ギャグマンガ日和の単行本を大人買いしたりとか

むしろ今までなんで持ってなかったんだろうという感じだが。 おもしろいよね。 っていうか、おもしろすぎてしょっちゅう腹かかえて笑っちゃうんで、なかなか読み進められないという。

今度は DVD を大人買いしようかどうか迷っているような……

% [雑談] そろそろケータイの機種変しても良いんじゃないかと思うんだが……

どうもコレっていうのが無くてねー。 別に iPhone 待ちっていうわけでもないんだよな。 就寝前のお供としては今や EeePC があるし、単純に携帯電話として iPhone ってどうなのよ?と考えると、なんか微妙というか。

で、ちょうど春の新機種が出た (そしてほとぼりが冷めた) 頃合いなんで、ちらっとケータイ売り場なぞを物色してみたんだけど、やっぱなんかパッとしないよなー。 そんな中一個だけ、ちょっぴり気になったのは、SoftBank の 922SH かな。

QWERTY キーボードが付いてて、ワンセグ対応、閉じたままでも使えるようにタッチセンサーが付いてたりとか。 ギミック好きとしては、ちょっとそそられた。 でも、こういうのは実機を触ってみないと何ともなあ。 モックは触ってきたけど、実際の操作感がどうなのかわからんと買いかどうか判断付かない。 キーボードは親指打ちには丁度良い感じなんで、あとは中身がまともなら買っても良い気はするんだけど。


2008-04-17 [長年日記]

% [Fan] Fan Programming Language

きむら(K)さんとこ経由。

なんか色々混ざった感じのキメラっぽい言語。 Scala みたいに JavaVM と CLR の両方で動くのを目指してるようだ。 とりあえず Mac OS X では JavaVM で動いている模様。

fansh というコマンドが対話環境みたいだが、

fansh> class Foo { }
ERROR(1): Expected expression, not 'class'

なんかクラスの定義はできないっぽい。 ので、クラスとかは置いといて、Tour のページからいくつか抜粋。

変なリテラル

// Duration literal
fansh> 5sec
5sec
fansh> 1.5sec
1500ms
fansh> 10ms
10ms
fansh> 10ns
10ns
// Uri literal
fansh> `/hoge`
/hoge
fansh> `/hoge/fuga`
/hoge/fuga

Duration はともかく、Uri がどう使われるのかよくわからん。

演算子はメソッド呼び出しの構文糖

fansh> 1 + 2
3
fansh> 1.plus(2)
3
fansh> 1 << 2
4
fansh> 1.lshift(2)
4

文字列補間

基本 Ruby で微妙に Perl 寄り、みたいな?

fansh> x := "hoge"
hoge
fansh> y := "fuga"
fuga
fansh> "$x, $y, ${x + y}"
hoge, fuga, hogefuga

変数の定義は Io とかの系統

:= で初期化、= で代入。 一応、型推論付き。

fansh> str := "foo"
foo
fansh> str = "bar"
bar
fansh> str
bar
fansh> str = 1
ERROR(7): 'sys::Int' is not assignable to 'sys::Str'
fansh> str := "baz"
ERROR(1): Variable 'str' is already defined in current block
fansh> s = "piyo"
ERROR(1): Unknown variable 's'

クロージャ

|引数の型 -> 返り値の型| {中身の式} という形。引数や返り値の型は省略できないっぽい? 仮引数は同じスコープのものと名前がぶつかる? (Ruby 1.8 以前のような感じか?)。 あと、値を返す場合は必ず return が必要みたい。

fansh> clear
fansh> f := |Int x, Int y -> Int| { return x + y }
|sys::Int,sys::Int->sys::Int|
fansh> f(1,2)
3

fansh> x := 1
1
fansh> g := |Int x -> Int| { return x * x }
ERROR(6): Closure parameter 'x' is already defined in current block

fansh> g := |Int i -> Int| { i * i }
ERROR(23): Not a statement
ERROR(21): Must return a value from non-Void method

動的プログラミング

メソッド呼び出しを '.' で書くとコンパイル時に型チェックされるけど、'->' で書くとされないそうな。

fansh> clear
fansh> f := |Obj o -> Void| { echo(o.toHoge) }
ERROR(31): Unknown slot 'sys::Obj.toHoge'

fansh> f := |Obj o -> Void| { echo(o->toHoge) }
|sys::Obj->sys::Void|

fansh> f("hoge")
sys::UnknownSlotErr: sys::Str.toHoge
  fan.sys.Type.slot (Type.java:320)
  fan.sys.Type.slot (Type.java:315)
  fan.sys.FanObj.trap (FanObj.java:78)

メッセージパッシング式のスレッド

対話環境で複数行入力ができないんでめんどくさくて試してないが、Thread#loop でメッセージコールバックを定義、Thread#sendSync あるいは Thread#sendAsync でメッセージ送信みたい。

結構よくまとまってて、わりと使いやすそうな言語っぽい。 個人的には、パターンマッチが無いんであんまり使う気にはなんないけど :-p

% [雑談] ケータイは…

変にパソコン or PDA っぽい (そして、きっとそういう視点で見れば中途半端なのだろう) 922SH なんかよりも、921SH みたいなのの方がおもしろいかもなー。 それにしてもこいつら高いな。EeePC もう一台買えるぞ。 もし買うなら分割にすると思うけど、922SH なんか総支払額 10 万越えるとかどんだけ(苦笑

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

% きむら(K) [>パターンマッチが無いんで そんなにパターンマッチが好きかぁぁぁッ(笑) ]

% jijixi [関数型言語脳に侵された人間の 75% はパターンマッチが無いと生きていけないという調査結果がありますし。(注:ありま..]


2008-04-18 [長年日記]

% [clip] sm3024309 (アニソンがパクリだらけだった件)

『!?』の人の新作キターw

クロノトリガーのパート6 (予告:sm2969189) も予定されてるみたいなので楽しみ。

% [Windows] なんや知らんがデスクトップ設定がふっ飛んだ件

何日かぶりにデスクトップな Windows マシンを起動したんだが、ログオンしようとしたら何か「有効ななんちゃらが見付かりません」(かなりうろ覚え) みたいなエラーが出てデスクトップ設定がリセットされてしまった。 なんか急に青々しい!!

なんだろなー、前回使ったときにも別に変わったことはしてないと思うんだが、そろそろハードディスクがやばいんだろうか。 それとも、「若くてちっこい娘 (EeePC) にばっかりうつつを抜かして、このロリコン!!」とへそを曲げたんだろうか。 ごめん、おっちゃんロリコンではないが、コンピュータはちっこいのが大好物なんだ。 正直、君 (フルサイズのタワー型) には全く美を感じない。

まあ、冗談はさておき、たまにこういうことってあるよね、Windows XP って。 なんかの拍子にデスクトップ設定がおかしくなっちゃうの。 でまあ、どうせいつものことだろ、と思いつつやっぱり何となく気になるんで CHKDSK かけちゃうのもいつもどおり。 不毛……

% [Windows] なんや知らんがデスクトップ設定が復活した件

長い長い CHKDSK (フル) が終わったので、さて設定しなおすか…… と思ってログオンしたら元の設定が復活していたという。 わけわかんね。

別にディスクに問題は発見されてなかったんだがなー。 ほんと、何がしたかったんだ、こいつは。 つーか、マジですねてただけか?(笑

% [雑談][Mac] 今日は Windows マシンだけじゃなく iMac まで機嫌が悪いようだ

また Time Machine がおかしいよ……

「また」というのは、つまり前にもおかしくなったということなんだが、ここに書いたっけな? バックアップ中の表示の ??/?? というやつの分母がどんどん増えていって、いつまで経ってもバックアップが終わらないというやつなんだが。

なんかねー、バックアップが始まるところから見てると、どうも分母が 1KB から始まったりするんだよな。 もしかしてバックアップするものが何も無いときの処理が、何かバグってんじゃないの?って気がしなくもない。 デフォルトの状態だと、一時間経って何も更新されるところが無いことってあんまり無いのかもしれないが、わしのマシンの場合、キャッシュとかデスクトップとかの頻繁に更新されるようなところ (で、かつバックアップしても意味無さそうなところ) は除外項目に入れてるんで、わりと有り得るというか。

つーかもう、今日は何なんだ一体、厄日か?

% [雑談] マクロス F 第三話

ちゃんと本放送も見るし B-ch の配信も見るし、たぶん DVD も買うから某所で見ても許して。 気になってしかたないんだもん(苦笑

予告にクァドラン・ローにしか見えないものが映ってて、「ちきしょーずりーぞ」とか思ったり。 しかも色が赤とか。さすがにミリアじゃないと思うが。

あと、カナリアが「いつでも出られるよ」って言ってたときに画面に映ってたのってデストロイド・モンスターだったような気がするんだが。 ゴーストとか誘導ミサイルとかが無効化される敵だから、とどめ用にああいう火力重視なのが用意されてても不思議じゃないかな、とかさ。

いやー、毎回毎回心憎い小ネタが仕込んであって、まったくいやらしいぜ。良い意味で(笑

% [雑談][Scala] Actor でメッセージ待つ時は loop 使わなくちゃダメ〜

いや、ダメってことは無いんだけど、loop は actor のスケジューリングをする機能も含んでるので、場合によっては Actor システムの良さを殺しかねないよという話。 まあ、それほど気にする必要もないのかもしれないけど、雑談として。 話の発端は Scala-ja at Lingr

ちなみに、メッセージを待つときには、loop {..}ではなくて、関数の末尾再帰にするとちょっと早くなるみたい

チャットに参加したことはないけど、たまにログを眺めさせてもらってます。 シャイですんまそん(苦笑

Actor における loop というのは単なる while(true) じゃない。 できればそれがハッキリわかる例を示せれば良いんだけど、ちょっと難しいのでソース (actors/Actor.scala) を引用しつつ説明してみる。 ソースは 2.7.0 のもの。 まず、Actor.loop メソッドの定義。

196   def loop(body: => Unit): Unit = body andThen loop(body)

(=> Unit) 型のブロックを引数として、それを繰り返している…… んだけど、ちょっと一工夫入っている。 ここで body が呼んでる andThen というメソッドは、ここのちょっと上で定義されている Body[a] というクラスのもの。

182   private[actors] trait Body[a] {
183     def andThen[b](other: => b): Unit
184   }
185 
186   implicit def mkBody[a](body: => a) = new Body[a] {
187     def andThen[b](other: => b): Unit = self.seq(body, other)
188   }

mkBody メソッドによって暗黙に Body[Unit] 型に変換された body は andThen メソッドの中で seq というメソッドを呼んでいる。 この seq は Actor クラスのもので中身はこんな↓

688   private def seq[a, b](first: => a, next: => b): Unit = {
689     val s = Actor.self
690     val killNext = s.kill
691     s.kill = () => {
692       s.kill = killNext
693 
694       // to avoid stack overflow:
695       // instead of directly executing `next`,
696       // schedule as continuation
697       scheduleActor({ case _ => next }, 1)
698       throw new SuspendActorException
699     }
700     first
701     throw new KillActorException
702   }

説明が結構めんどくさいし、調べたのが大分前でうろ覚えなんでかなり適当な説明だけど、要するにここでは各 actor (Erlang 的に言えばプロセス) のスケジューリングをしている。 SuspendActorException を投げることで、待っている actor があったときにスレッドをそいつに譲ることができるわけ。 逆に言えば、SuspendActorException が起こらない限り、現在の actor が終了するまで一つのスレッドを占有し続ける。 つまり、loop を使ってこんな↓ 風に書くと、

actor {
  loop {
    react {
      case 'hoge => println("hoge")
    }
  }
}

loop に与えたブロックが一回処理されるごとに、actor が切り替わるチャンスがあるけど、

actor {
  def f() : Unit = {
    react {
      case 'hoge => println("hoge")
    }
    f()
  }
  f()
}

こんな↑ 風に書くと、ループするときに actor が切り替わるチャンスは無い。 react のときにもスケジューリング (SuspendActorException) が起こるので、全く切り替わらないわけではないと思うけど、react の外に何か長い処理があったりすると、その actor がスレッドを占有しがちになるという可能性は大いにあり得る。

Actor の仕組み上、スレッドが詰まって処理が回らなくなる可能性というのは常に存在するので、なるべく actor が切り替わるチャンスを増やすためにも、ループはなるべく loop を使った方が良いんじゃないかなと思う次第。

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

Before...

% jijixi [actors パッケージのソースは Scala 的なテクニック満載で、読んでてかなり楽しいと思うんでおすすめです。 ..]

% きむら(K) [流れを読まずにw マクロスFのネット配信ってとんでもなくタイムラグがあるんですね。 1話の配信が始まったばかりと..]

% jijixi [せめて一週遅れくらいにしてくれりゃ良いんですけどね(苦笑]


2008-04-19 [長年日記]

% [clip] sm1541393 (MD 鋼鉄帝国 普通のプレイ STAGE 1)

ぐあーーやりてーー!! シューティングゲームとしてはそれほど突出したものがあるわけじゃないけど、雰囲気というか世界観がすげー良いんだよなー。

くそー、当時の自分にもっと経済力があれば手放したりしなかったのに。 バーチャルコンソールで復活キボンヌ。

やったことない人も、とりあえずこの動画は見るべき。 特にスチームパンクとかそういうのに心惹かれるタイプの人は、最終面まで見て損はしないよ。 他の面はマイリスから → mylist/3545945


2008-04-20 [長年日記]

% [clip][雑談][Scala] 世界のナベアツに“はじめての Scala”で果敢に挑戦 (sumim’s smalltalking-to)

正直、"はじめての" にしては果敢すぎると思った(笑

っていうか読めない。 コメントや文字列以外の部分に日本語が来るということを、無意識のうちに排除しているというか、いかに ascii オンリーな (フツーの) 言語に脳が最適化されてるか思い知った気がする。 単に識別子が日本語になってるだけなのに、こうも読めないなんて(苦笑


2008-04-21 [長年日記]

% [clip] sm2431845 (ダライアスワイド 1/3 - DoCoMo iアプリ P905i -)

ケータイのゲームもここまで来ていたか。 すごくちゃんとダライアスで、すごい。 音楽とかも音色の違いはしかたないとして、その他の部分は結構がんばってる。

% [clip] sm274192 (ダライアスシリーズ メドレー 1)

この頃のタイトーは光り輝いていたよ。

今何やってんだろ、タイトーって。

% [clip] sm2098746 (グラディウス2)

ケータイアプリのムービーを見まくってたんだが、てっきり II のことだと思って見てみたらマジで2のことだったというサプライズ。 スクロール滑らかになっててワロス。 音楽の再現度は高いと思う。

何言ってんのか意味不明…… と思った人は普通の人。 何言ってんのか余裕でわかっちゃった人はナカーマ。

% [clip] sm1611954 (PSP版グラディウス2 OPデモ〜ステージ2まで)

やべー、こんなものの存在全く知らんかったぞ。

PSPの沙羅曼蛇ポータブルに収録されてる、グラディウス2のリファイン版です。

か、買ってこなきゃ!!

% [雑談][game] バーチャルコンソールで PCE のダライアス出してくんないかなー

イースが出せるんだから技術的には可能だと思うんだが。 アーケード版のサントラ + おまけゲームくらいのノリで買うよ。(失礼だなー)

% [clip] sm595025 (PCエンジンCD-ROM2『スーパーダライアスII』前半)

殺意を覚えるほどのヒドいアレンジ。 前作がゲームとしてはダメダメなバランスだったくせにそれなりに評判良かったのは、原曲そのままだったからだってのが全くわかってなかったんだな。

それに比べてメガドラ版 (sm263054) のすばらしいことよ。 最終面の演出とか、一部ではアーケード版を超えてますよ。


2008-04-22 [長年日記]

% [雑談] ついカッとなってやった。今は後悔している。

ちょっぴり。

や、なんかソフトバンクのオンラインショップで、金額とか確かめたりあーだこーだやってたら、なんかもうここまで入力したなら申し込んじゃえばいんじゃね?とか魔がさしたというかね。 結局 922SH じゃなく 921SH にしちゃったりとか。

っていうかさー、買ったこと自体はまあ良いのよ。 そろそろ新しいの買おうかーと思ってたわけだし。 でも、なんつーか在庫があるかどうかの確認が一切できないってどうなのさ。 普通、在庫を確認してから確定したいもんじゃないの? だがそんなの無ぇー!! (なのに確定しちゃうわしもわしだ)

なんか、まず審査があって、それに通ったら配送って流れらしいけど、審査後に在庫が無くて 1 ヶ月かかりますとか連絡来たらわしはどうすれば良いんだ? 心情的にはとっととキャンセルして、どっか在庫探しに行きたくなるんだけど。 だが、キャンセルする方法はどこにも書かれていない気がするんだよな。

(追記) 誤解を招きそうな表現だったので念の為補足。 「審査後に在庫が無くて 1 ヶ月かかりますとか連絡来たら」という部分は「もし、そうなったら」という話で、まだそういう連絡が来たわけではないです。 (/追記)

まあ良いや、まったり行こう。 どうしても今すぐ欲しかったわけでもないんだし、遅れるなら遅れるで気長に待てば良いさね。 そもそも無理に機種変する必要も無かった、という話は…… 忘れる。

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

Before...

% drkazu [Softbankの代理店でもあるので、問い合わせできますよー♪]

% jijixi [いざって時はよろしくです :-)]

% Hash [確かにほかのキャリアでもですね・・・QTL]


2008-04-23 [長年日記]

% [雑談] 桜の開花が早すぎて観光業の人たちは涙目らしい

やたらあったかいもんなー。 札幌は昨日開花で、例年より 11 日早かったんだそうな。 うちの近所でも結構咲いてるのが目につくね。

いつもならゴールデンウィーク中に花見できずに終わることも多いのに、今年は逆にゴールデンウィークが終わる頃にはすっかり散っちゃってそうな勢いだなあ。

% [clip] sm1964491 (【メガCD】ナイトストライカー【ヘタプレイ】)

Mega CD 版は何気に神移植。 なんか懐古ムードが爆発して、この手のムービーを一生懸命探してまわってるわし(苦笑

ゲーム感の移植度を高めるためにスプライトの解像度を諦めた結果、静止画があまりにもショボすぎてあんまり売れなかったという。 でも、アーケード版をそれなりに知っている人には評判良い。 音楽は CDDA だからアーケードまんまだしね。

わしも手元には残ってないけど、かなり遊んだよ。


2008-04-24 [長年日記]

% [雑談] 眠くてかなわん……

本格的に春眠暁を…… の状態。 集中でけん...orz

% [雑談] ソフトバンクモバイルから出荷完了のご連絡

が来た。 余裕で在庫があったご様子。 とりあえずめでたしめでたし。

ところで、最初の確認メールのときから気になってるのが、『申込種別』が『機種変更』じゃなく『買い増し』になってることなんだが、今回のメールには

商品到着後、お手数ですが、携帯電話機切り替え作業の為、お客さま自身にて、 現在お使いの携帯電話機からUSIMカードを取り外していただき、新しい携帯電話機 に取り付けていただく必要がございます。

なんてことが書いてあるし、大丈夫なんだよな……

機種変をオンラインショップでできるってのは大変結構なんだが (長々とした店員のマニュアル的説明とか聞かんでええしなー)、なーんか全体的に微妙感満点なのは、なんとかした方が良いんじゃないのかねー(苦笑

% [Vim][Ruby] end の数が合わない問題に悩まされている Vim&Ruby ユーザは matchit.vim をどうぞ

kwatch さんのパッチは個人的にはなかなか嬉しいと思うんだが (Dylan とか羨ましかったし)、本家に取り込まれることは無さそうなのであまりあてにはできない。 でも Vim ユーザには強い味方がある。 それが matchit.vim だ。 ~/.vimrc に以下のように書こう。

source $VIMRUNTIME/macros/matchit.vim

たったこれだけで、filetype=ruby のときに % キーで (通常時、カッコに対してそうであるように) 対応する箇所にカーソルが跳んでくれるようになる。 つまり、以下のようなソースがあったとして、

class Hoge
  def foo
    p 'foo'
  end
end

一番下の end のところにカーソルがあるときに % を押せば class のところに、一つ上の end のところにあるなら def のところに、それぞれカーソルが跳んでくれる。 もちろん逆に class や def から end に跳ぶこともできる。

基本的に end は必ず何かと対になってるし、文字列やコメント中の識別子はちゃんと無視してくれるので、ほぼ完璧に対応を示してもらえる。 少なくともわしが今まで使ってきた中では、間違った対応になってたことは無かった。 シンタックスハイライトは結構怪しいときがあるんだけど、そんなときも matchit.vim のおかげで安心して編集できる。

というわけで、Vim で Ruby のコード書く人には絶対おすすめ。 たぶん、Ruby 以外にも対応しているプラグインはあると思うんで、Ruby を使わなくても matchit.vim は入れておく価値あると思う。


2008-04-25 [長年日記]

% [雑談] 新しいケータイ (SB 921SH) が届いた

…… っていうかさ、夕方届くように時間指定したはずなんだけど、余裕でぶっちぎって午前中届くとかどういうアレ? そもそも時間指定の欄が空欄とか。 守れないなら最初から指定させんなよ...orz

まあ、何はともあれ受け取れたんだから良しとしとくが、まだ AC アダプターが届いてなくて充電ができない状況なんで、USIM を入れ替えるべきか否か迷う。 で、とりあえず USIM 無しで電源入れてみたんだけど……

きっちりまったくなんにも操作でけん!!

そりゃないんじゃねーの? また何年後かに機種変して USIM 外したら、5 万円もする端末はゴミ状態かよ。

やれやれ、ともかくせっかく手元にあるのにいじれないのもさみしいし、とりあえずは USIM 付け替えするか。 バッテリー無くなったら元の端末に入れ替えよう。 …… 良いんだよね、そういうやり方しても……

% [雑談] 921SH 日記、USB で充電可能

付属の USB ケーブルでパソコンと繋ぐと充電できるのであった。 とりあえず AC アダプターが届くまではこれでしのげそうだ。

% [雑談] 921SH 日記、アドレス帳をなんとかする

今までは 702NK だったので余裕で iSync を使ってたんだが、今回はそうもいかないのでアドレスブックから vCard を書き出してソフトバンクユーティリティにインポートした。 … んだけど、文字化け。ぐへぇ。

でも vCard のバージョンを 2.1 にすると読み込めない。 結局 3.0 で書き出した vCard ファイルを UTF-8 から CP932 に変換してインポート。 なんか納得いかない。 3.0 って文字コード UTF-8 に決まってるんじゃなかったっけ?

今回はとりあえずデスクトップ機にユーティリティをインストールしたけど、EeePC の方に入れてそっちで同期した方が良いかなあ。

% [雑談] 921SH 日記、ダライアス完全版

せっかく久々に普通のケータイを買ったんで、この前ニコで見たダライアスとか買ってみたり。 残念ながらワイド版は対応してないようなので (あんなに細長い画面があるのに、もったいない) 通常版だが。 ともあれ……

…… 無理。

こんなのクリアできるわけねーよ(笑

ゲームが難しいとかそゆんじゃなく、コントロールデバイスが致命的に使いにくすぎ。 せめて沙羅曼蛇方式で死んでもどんどん進ませてくれるんなら何とかなりそうだけど、死んだら特定の位置から開始だしさ。 そんなとこは原作に忠実じゃなくて良いと思うんだ。

% [雑談] 921SH 日記、ワンセグ連携

ネットワーク経由で番組表を取得して、それを元に視聴や録画の予約ができるという、なんというか今風っぽい連携機能。

そもそもテレビあんまし見ない人間だからして、わりとどうでもいい感じではあるんだけども、せっかく付いてるんだしアニメとか録画してみるか。

それにしても、液晶があまりにくっきりはっきりすぎで、画面が動いてないとなんだか見本写真のハメコミ画像みたいに見えてキモい(苦笑)。 そもそもこの大きさで、解像度は EeePC を上回ってるという何とも贅沢な画面なわけだが、それを活かすための映像コンテンツが手元に無いのは寂しいなあ。

DVD をリッピングしたやつはみんな H.264 でエンコっちゃってるんだけど、さすがに H.264 には対応してないっぽいんだよな。 だからってこいつのためだけにエンコし直しとかもバカバカしいし。 うーむ……


2008-04-26 [長年日記]

% [clip] 何考えてこんなモン作ったんだw (アルファルファモザイク)

一瞬意味がわかんなかったんだけど、じわじわ来た(笑


2008-04-28 [長年日記]

% [雑談] 暖かくなったり寒くなったり、もうだめ

なので、今日はもう寝て明日がんばる。(絶望的に説明が足りないと思います)

なんかつい最近、マクロス F の本放送もちゃんと見ると宣言したような気がするが (北海道は月曜の 26:25 です)、ごめんぶっち切る。 大丈夫、今やわしには強い味方の 921SH があるから、ワンセグを予約録画して見るよ。 まあ、某所で見るよりもさらに画質が残念なことになりそうなワンセグでわざわざ見る必要があるかっつーとかなり微妙ではあるけども、なんかほれ、チャンネルを合わせることに意義があるというか何というか。 (なんという偽善ですか)


トップ 最新 追記

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

RSS はこちら

jijixi at azito.com