Syntax highlighter

2009-12-26

クリスマス

メリークリスマス。一応。

今日は26日なので、日本ならケーキが半値以下になっているはず。
っが、こっちはセカンドクリスマスといって、祝日!だったりする。
(ちなみに、クリスマス自体も祝日)
今年は土曜日なのであんまり関係ないが。
(来年は25と26で土日なので最悪だが)

クリスマスということで、えらい勢いで(名古屋弁)物が売れたらしい。
買い物にいったら売り切れとかどんだけ・・・
しかも売り切れたのは3日前とかどんだけ・・・
という状態だった。
この不況に消費が活性化されるのはいいことだとは思うけどね。

そんな感じであった。
取り留めないなぁ・・・

2009-12-22

Scheme: ソースを色づけするスクリプトを書いてみた

何か実用的なものを作ってみようと思い書いてみた。
(実用的かどうかはよく分からんが・・・)
1: (require rnrs/hashtables-6)
2: (define keywords (make-eq-hashtable))
3: (define (set-keywords)
4: (begin
5: (hashtable-set! keywords 'define "<span style=\"color: blue;\">define</span>")
6: (hashtable-set! keywords 'if "<span style=\"color: blue;\">if</span>")
7: (hashtable-set! keywords 'let "<span style=\"color: blue;\">let</span>")
8: (hashtable-set! keywords 'letrec "<span style=\"color: blue;\">letrec</span>")
9: (hashtable-set! keywords 'lambda "<span style=\"color: blue;\">lambda</span>")
10: (hashtable-set! keywords 'cond "<span style=\"color: blue;\">cond</span>")))
11: (define (keyword? key)
12: (hashtable-contains? keywords key))
13: (define (highlighted-keyword key)
14: (hashtable-ref keywords key ""))
15: ; string might be like this "(define",
16: ; this function should return like this -> "(<span style=\"color: blue;\">define</span>"
17: (define (has-tag? str)
18: (let loop((strls (string->list str)))
19: (cond ((null? strls) #f)
20: ((char=? (car strls) #\<) #t) ; if the string has "<" it's must be tag(might be < procedure...)
21: (else (loop (cdr strls))))))
22: (define (list->symbol ls)
23: (string->symbol (list->string ls)))
24: (define (parse-keyword str)
25: (if (has-tag? str)
26: str ; if the string has tag, just return.
27: (letrec ((ls (string->list str))
28: (set ((lambda (l)
29: (let firstb((c (car l))
30: (rest (cdr l))
31: (ret '()))
32: (cond ((null? rest) (cons ret rest))
33: ((char=? c #\() (cons (append ret (list c)) rest))
34: (else (firstb (car rest) (cdr rest) (append ret (list c)))))))
35: ls)) ; blanket + space
36: (br (car set))
37: (rest (cdr set)))
38: (if (null? rest)
39: str ; only ( or spaces
40: (let ((key (list->symbol rest)))
41: (if (keyword? key)
42: (string-append (list->string br) (highlighted-keyword key))
43: str))))))
44:
45: (define (read-file file-name)
46: (with-input-from-file
47: file-name
48: (lambda ()
49: (let loop((ls '())
50: (c (read-char)))
51: (if (eof-object? c)
52: (reverse ls)
53: (loop (cons c ls)(read-char)))))))
54:
55: (define (last-char str)
56: (let ((l (string-length str)))
57: (if (= l 0)
58: (integer->char 0)
59: (string-ref str (- l 1)))))
60:
61: (define (high-light str)
62: (let ((ls (string->list str)))
63: (if (null? ls)
64: ""
65: (let loop((forward "")
66: (c (car ls))
67: (src (cdr ls))
68: (is-quoted #f)
69: (is-escape #f))
70: (cond ((null? src) (string-append forward (string c)))
71: ; escape begin
72: ((char=? c #\&)
73: (loop (string-append forward (string c)) (car src) (cdr src) is-quoted #t))
74: ; escapse end
75: ((and is-escape (char=? c #\;))
76: (loop (string-append forward (string c)) (car src) (cdr src) is-quoted #f))
77: ; quote
78: ((and (char=? c #\") (not (char=? #\\ (last-char forward))))
79: (cond ((and is-quoted) ; end quote
80: (loop (string-append forward (string c) "</span>") (car src) (cdr src) #f is-escape))
81: ((not is-quoted) ; begin quote
82: (loop (string-append forward "<span style=\"color: green;\">" (string c))
83: (car src) (cdr src) #t is-escape))
84: ; in quote
85: (else (loop (string-append forward (string c)) (car src) (cdr src) is-quoted is-escape))))
86: ; comment
87: ((and (not is-quoted)
88: (not is-escape)
89: (not (char=? #\\ (last-char forward)))
90: (char=? c #\;))
91: (string-append forward
92: "<span style=\"color: #006600; font-style: italic;\">"
93: (string c)
94: (list->string src)
95: "</span>"))
96: (else
97: (if (and (< 0 (string-length forward)) (char-whitespace? c)) ; if the charactor is whitespace
98: (begin
99: (set! forward (parse-keyword forward)); check if the string is keyword
100: (loop (string-append forward (string c))(car src) (cdr src) is-quoted is-escape))
101: (loop (string-append forward (string c))(car src) (cdr src) is-quoted is-escape))))))))
102:
103: (define (make-line str num)
104: (string-append "<div><span style=\"display: inline-block; width: 30px; font-weight: bold; text-align: right;\">"
105: (number->string num)
106: "</span>: "
107: (high-light str)
108: "</div>"))
109:
110: (define (escape c)
111: (cond ((char=? #\< c) "<")
112: ((char=? #\> c) ">")
113: ;((char=? #\" c) """)
114: ;((char=? #\& c) "&")
115: (else (string c))))
116:
117: (define (read-line source)
118: (if (null? source)
119: '()
120: (let line((ret (cons "" (cdr source)))
121: (c (escape (car source))))
122: (cond ((null? (cdr ret)) ret)
123: ((string=? "\r" c) (line (cons (car ret)(cddr ret)) (escape (cadr ret))))
124: ((string=? "\n" c) ret)
125: ((string=? "\t" c) (line (cons (string-append (make-string 8 #\Space)
126: (car ret))
127: (cddr ret))
128: (escape (cadr ret))))
129: (else (line (cons (string-append (car ret) c)
130: (cddr ret))
131: (escape (cadr ret))))))))
132:
133: (define (build-html contents)
134: (define (build-itr contents)
135: (let build((ret "")
136: (line (read-line contents))
137: (num 1))
138: (if (null? line)
139: ret
140: (build (string-append ret (make-line (car line) num))
141: (read-line (cdr line))
142: (+ num 1)))))
143: (string-append "<pre>" (build-itr contents) "</pre>"))
144:
145: (define (main args)
146: (if (null? args)
147: (begin
148: (display "usage: scm2html file-name")
149: -1)
150: (let ((contents (read-file args)))
151: (set-keywords)
152: (display (build-html contents))
153: (newline))))
154:
155: (main "scm2html.scm") ; test
長い上に汚い・・・っが、開き直ってさらしてみた。

仕様:
* 行番号付与
* コメント、文字列及びキーワード色づけ
* タブをスペースに変換。

既知の不具合:
ダブルクオート(文字列)の色づけ周りは大分怪しい。文字列の後ろになんか文字がないとタグがおかしくなる。(ブラウザで見る分には問題ないけど、HTMLとして不正になる)

Perlで作れば簡単なのに何やってんだろうとか思いながら作った。Schemeは文字列処理得意じゃないのかしら?
(正規表現使ってないからだと思うが・・・R6RSって正規表現サポートしてるのかな?)

寒い寒い

雪が溶けない。土曜日にこんな感じだった。

今のところ、そのまま足跡がついた程度でとどまっていたりする。寒い。

こんな雪の中、ドイツに行こうとした(実際には以前から計画していた)。
ユトレヒトで国際列車(?)に乗り換えてという感じ。
ユトレヒトの駅はこんなだった。(ユトレヒト中央駅のバーガーキングから)

国際線は来ませんでした(昨日の話)。
まぁ、いかないと決めたのだが、今日電車がドイツまで走っているか調べてみた。


はい、ありませんでした~(ごちバトルの羽鳥アナ風)

この量の雪は珍しい(らしい)とは言え、いくらなんでも雪に弱すぎだろうオランダ。

2009-12-18

寒い

現在、オランダは冬です。当たり前です、北半球なんだから。
寒い。マジで。
最高気温1度って何ですか?殺す気ですか?
秋の雨で(工事中の穴に)たまった水が凍って、スケートできそう。
そんな気分です。

これだけ寒いと、当然彼が来るわけです。そう、白い悪魔君が・・・
ってか、来ました。10cmくらい・・・

雪が降ると日本でもそうだけど交通事情がえらいことに(名古屋弁)なります。
特に電車。
30分おくれは当たり前。
運休とか勝手に路線変更とか連発。
7時に家をでて9時半ちょい過ぎに職場に着きました。
いつもなら8時ちょい過ぎです。勘弁してください。

ってか、雪が降ること分かってる国のはずなのに、雪対策が無いってどういうことだよ!
おかしいだろ!!

Scheme: SICPの練習問題(2.68)

飛んでたりする。いや、これ以前もちゃんとやってますよ(^^;

以前Huffman符号のことを(LHAの話か?)をちらっと書いて、あきらめたとも書いたがその話題だったのでついつい。
とりあえず、Huffman符号木について。木自体はこんな感じ。
{A B C D E F G H} 17
               *
             /   \
           A 8     * {B C D E F G H} 9
                 /     \
     {B C D} 5 *           \
             /   \             \
           B 3     * {C D} 2      * {E F G H} 4
                 /   \        /       \ 
               C 1   D 1    * {E F} 2     * {G H} 2
                          /   \         /     \
                        E 1  F 1      G 1     H 1
いまいち二分木に見えないのはご愛嬌。
ここではなのか、一般的になのか、左に行けば1、右にいけば0となっている。数字は重み(多分、頻出度)

デコードは、ビット列から文字列を復元するので、先頭からビット見て行って葉にたどり着いたところで一文字復元完了という感じ。
エンコードは逆。上から木を舐めて、葉にたどり着くまでもビットを記録するって感じ。

っで、2.68の解凍
(define (encode-symbol symbol tree)
  (define (has-symbol? symbol tree)
    (if (leaf? tree)
 (eq? symbol (symbol-leaf tree))
      (or (has-symbol? symbol (left-branch tree))
   (has-symbol? symbol (right-branch tree)))))
  (if (leaf? tree) ; 葉ならシンボルを見つけた
      '()
    (let ((left (left-branch tree))
   (right (right-branch tree)))
      (cond ((has-symbol? symbol left)
      (cons 0 (encode-symbol symbol left)))
     ((has-symbol? symbol right)
      (cons 1 (encode-symbol symbol right)))
     (else (error "error"))))))
最初はcondの中でifを使って変な場合分けをしてlistを返してappendしていたが、解答はすっきりconsを使ってた。いまいちこの辺の使い方がまだ身について無い感じ。う~ん。
まぁ、でもHuffman符号の具体的なやり方がわかったということでちと満足。
(もやもやとは分かっていたが、木の作り方とかいまいちだった)

2009-12-12

TopCoder

アルゴリズムでググッたら出てきた。
面白そうなので登録。

サイト自体はプログラムコンテストサイトで、与えられた問題を解いていくというもの。
解ける問題から、そうでもないのまで幅広い・・・
とりあえず自力で解いて、誰かが書いた解答を見る。
自分が未熟を通り越して、スタート地点にも立ってないのかと思わされた。

基本的なことでできるのだが、柔軟な発想とか、数学的知識がぜんぜん足りない。
気づいたのだから勉強しないと・・・

2009-12-09

Scheme: SICPの練習問題(2.17~2.28)

最近SICPを読み始めた(オンラインなので、英語。きつい・・・)
SICPはMITが出してる本で、バイブル的な何からしい。
1章の問題は数学チックなのが多いので、半分くらい飛ばしてしまった。後でやろう。
折角なので、(自分の)答えを載せてみたり。

下のは職場のGaucheで作って(おいおい)、家のMzSchemeで確認。
MzSchemeだと「()」が使えないので、「'()」に変更。
一つMzSchemeで動かないのがあった。処理系依存なコードだったのかしら?
; 2.17
(define (last-pair list)
  (define (last-pair-itr val list2)
    (if (null? list2)
 val
      (last-pair-itr (car list2) (cdr list2))))
  (last-pair-itr (car list)(cdr list)))
(last-pair '(1 2 3 4 5 6))

; 2.18
(define (reverse list)
  (define (reverse-itr ret list2)
    (if (null? list2)
 ret
      (reverse-itr (cons (car list2) ret) (cdr list2))))
 (reverse-itr '() list))
(reverse '(1 2 3 4 5 6))


; 2.21
(define (square-list-no-map list)
  (if (null? list)
      '()
    (cons (* (car list) (car list))
   (square-list-no-map (cdr list)))))
(square-list-no-map '(1 2 3 4 5 6))



(define (square-list list)
  (map (lambda (x)(* x x)) list))
(square-list '(1 2 3 4))


; 2.22
(define (square-list items)
  (define (square x)(* x x))
  (define (iter things answer)
    (if (null? things)
 answer
      (cons (square (car things))
     (iter (cdr things) answer))))
  (iter items '()))
(square-list '(1 2 3 4 5))


; 2.23
(define (for-each proc items)
  (if (null? items)
      #f 
    (and (proc (car items))
  (for-each proc (cdr items)))))

; 2.25
(car (cdr (car (cdr (cdr '(1 3 (5 7) 9))))))
(car (car '((7))))
(car (cdr (car (cdr (car (cdr (car (cdr (car (cdr (car (cdr '(1 (2 (3 (4 (5 (6 7))))))))))))))))))

; 2.26
(define x (list 1 2 3))
(define y (list 4 5 6))
(append x y)
(cons x y)
(list x y)

; 2.27
(define x (list (list 1 (list 2 3) (list 4 5)) (list 6 7 8)))
(reverse x)
(define (deep-reverse list)
  (define (reverse-itr ret list)
    (cond 
     ((null? list) ret)
     ((pair? (car list))
      (reverse-itr (cons (reverse-itr '() (car list)) ret) (cdr list)))
     (else (reverse-itr (cons (car list) ret)
   (cdr list)))))
  (reverse-itr '() list))

; Gaucheでは動いたコード
;(define (deep-reverse list)
;  (cond
;   ((null? list) '())
;   ((pair? (car list)) (cons (car (cdr (car list)))(car (car list))))
;   (else (cons (deep-reverse (cdr list)) (car list)))))
(deep-reverse x)


; 2.28
(define (fringe l2)
  (cond ((null? l2) '())
 ((not (pair? l2)) (cons l2 '()))
 (else (append (fringe (car l2))
        (fringe (cdr l2))))))
(fringe (list x x))

2009-12-03

時間がほしい

働きつつ、(オランダ語)学校にいってるから平日は時間が全然無い。
日が昇らないうちに出社して、暗くなってから帰宅なんて生活だ。
(ちなみに、今の時期は8時ちょい過ぎに日が昇り、5時前に日が沈むけど:-P)

最近つらつらと考えていることの備忘録。
  1. 何か実用的なものを作りたいなぁ

    • ちょっと考えてるのはC++実装のServletサーバー。需要なさそうだけど・・・
    • OSとか言語処理系とかも面白そうだ。
    • 最近意図的にBoostを避けてたけど、そろそろ使おうかな。やっぱり便利だし・・・

  2. オランダ語の文法で意味不明だった部分が理解できた

2. について。
オランダ語の変な文法が理解できた。こんなの↓
Vandaag ben ik moe.
(英訳) Today am I tired.
ずっと、何で主語が動詞の真後ろに移動してるんだ?と疑問だった。なにしろ、普通に書くと
Ik ben moe vandaag.
になるのに、Vandaag(今日)を強調すると、上記みたいになる。
なぜ?
っで、理由。
Persoonsvormen(人称系?誰か訳教えて)は必ず2番目に来る。
Persoonsvormenとは英語で言うところの、三単現のSが適用される位置にある動詞のこと。つまり、格変化する動詞。
変なルールとか思いながらも、そのルールに当てはめれば確かに納得がいく。
ちなみに、他の文法は結構英語に似てるので、そんなに苦労はしない。っが、語彙が圧倒的に足りないのでぜんぜん話せない。先は長そうだ・・・

2009-11-29

C++: BFDを使ってみる その2(たぶん最後)

昨日の続き。いろいろできそうだなと思ったが、少し落とし穴があった・・・

【落とし穴その1】
mprotectで取得した関数のアドレスを実行可能とか読み込み可能とかにしないと動かせない。
よく考えればあたりまえか・・・
っが、MingwとかCygwin(要するにWindows環境)にはそげなものがない・・・

【落とし穴その2】
dlopenとかdlsymとかその辺の話。ある意味当然ではあるが、共有ライブラリじゃないと読み込めない。
上記の問題から、BFDでシンボル読み込んで、シンボル名をデマングルして、呼び出し時にシンボル名に変換してやればいいかなとか思ったんだけど、BFDはWindowsのDLLに対応していない。Mingwの-sharedオプションで作ったにもかかわらずである。
(本当かどうかはよく知らん、調べてない。PEに変換しているからか?)

この辺を試してみよう。Windows限定の話になるけど・・・

余談
折角なので(備忘録も兼ねて)、BFDの使い方をメモ。
こんな感じの流れ。
bfd_init(); //初期化。一回だけでいい。
bfd* abfd = bfd_openr("hoge.o", NULL); // .a とか .soでもいいと思う
if (bfd == 0) {
  bfd_perror("failed to open"); // error
  return; // 失敗したので
}
// オブジェクトのフォーマットチェック
// アーカイブとかもヘッダの中にあるので、適当に必要なチェックで。
// .aとかのアーカイブだと、.oが複数個入っているので、それ用の処理がいる
if (!bfd_check_format(abfd, bfd_object)) { 
  bfd_perror("format error"); // .o ファイルじゃないよ
  return; // それじゃ!
}
// 中身を読み込む
if (!(bfd_get_file_flags(abfd) & HAS_SYMS)) {
  return; // シンボルなし
}
long storage = bfd_get_symbol_upper_bound(abfd); // サイズを取得
if (storage < 0) {
  bfd_perror("bfd_get_symbol_upper_bound"); //  中身なし?
  return;
}
asymbol** symbol = (asymbol**)malloc(storage); // メモリ確保(new じゃだめなのかね?)
int symbolCount = bfd_canonicalize_symtab(abfd, symbol);
if (symbolCount < 0) {
  bfd_perror("no symbol"); // シンボルがない
  return;
}
// シンボルを読み出す
for (int i = 0; i < symbolCount; i++) {
  asymbol asym = symbol[i];
  int value = bfd_asymbol_value(asym); // シンボルの値(何が入ってるんだろう?)
  const char* name = bfd_asymbol_name(asym); // シンボル名(名前マングルされてる)
  if (name == 0 || ::strlen(name) == 0) continue; // シンボル名が無ければ次
  symbol_info info;
  bfd_symbol_info(abfd, asym, &info); // シンボル情報を取得(中身はよく知らん)
  // 関数ポインタ
  int* fp = (int)file->contents // .o ファイルの中身(バイナリで読み込む)
            + asym->section->filepos // セクションの場所?
            + value;
  // 多分セクションデータとかを自分自身に配置しないと
  // (略)
  mprotect((void*)(((int)fp+4095) & ~4095 - 4096),
          4096, PROT_READ | PROT_WRITE | PROT_EXEC);
  /* こっちのが正しい?(どっちにしろMingwでは動かん
  long pagesize = sysconf(_SC_PAGESIZE);
  char *p = (char *)((long)s & ~(pagesize - 1L));
  mprotect(p, pagesize * 10L, PROT_READ|PROT_WRITE|PROT_EXEC);
  */
  //適当にキャストして、実行
  typedef void (*fnc)(); // とりあえず、戻り値、引数無しと仮定
  fnc fncP = (fnc)fp;
  fncP(); // 実行
}
多分こんな感じ。実際に動かせないので、正しいかどうかは保障できない。
(他人のコードから推測、というかほぼ丸写し、しただけだし・・・)

2009/11/30 追記

落とし穴その1は大嘘であった。
mprotectで実行可能にしなくてもWindowsだと普通に動いた。Cで作った関数だが。
C++側だとどうもいろいろ面倒なのだろう。コンストラクタとか、継承とか。
(確かに、仮想関数のアドレスとかどうやって取るとか、thisポインタを渡すとか、考えればいくらでも解決しないといけない問題がありそう)
憶測だが、コンストラクタのアドレスが分かったところで、クラス全体の情報が取れているわけではないのだろう。ヒープに取るメモリの量とかコンストラクタだけじゃ取れそうにないし。
構造体がBFDから作れるか試してから探した方がいいだろうか?
(C互換の構造体だと単なるメモリの塊というイメージだが・・・)
気合入れればいけそうなのだが、頭と気力が足りない感じ・・・前者が特に・・・orz

2009-11-28

C++: BFDを使ってみる

前にLHAの展開を書いていたが、それとはぜんぜん関係ない話。
LZHUFがいまいち分からなくて挫折したとも言う・・・orz

BFD、big fucking dealがBinary File Descriptorになったライブラリ。GCCに付属してくるもの。
何ができるかといえば、オブジェクトファイルとか、アーカイブファイルからいろんな情報が取ってこれる。

っで、これを使ってC++らしくないものを作ってみようと考えたのだが、上手くいかない。
ちなみに、らしくないものとは、リフレクションのことである。
BFDつかってシンボルを読み込んで、関数のアドレスは取れた。名前マングリングされた関数名で取れるので、デマングルするか、呼び出しの際にマングルする必要があるが・・・
(あぁ、取得したときにデマングルすればマングラーなど要らんのか、無駄なもん作った)
っで、ここからが問題。
C++なので、newして、確保したメモリに対してコンストラクタ呼ぶ必要があるのだが、上手くいかない。
いくつか理由が考えられるのだが、どれだろう?
1. そもそも無理。
2. 取得が上手くいっていなくて、変なアドレスを指してる。
3. その他
取れるアドレスは、単に関数のアドレスなので、適当に関数ポインタにキャストするのだが、
こんな感じであってるのか?
// operator new の関数ポインタ
typedef void* (newP)(size_t);
newP p = (newP)pointer; // pointerは取得したnewのシンボルアドレス
void* buf = p(size); // 予定通りなら、bufには確保したメモリが入るはず・・・
が、今のところ結果はセグメンテーションフォルト。
う~ん、なぜ?
BFD自体もあんまり知られて無いのか、ネットに情報があんまりないし・・・困った。

2009-11-25

おいしいスパゲッティの食べ方

ここで言うスパゲッティとはいわゆるプログラム上の話である。つまりそういうことだ・・・
よく分からない人は、ググってください。
一応Wikipediaへのリンク

自社のコンポーネントを使って、スマートカードのデータを管理するシステムを提供する会社なのだが、そのコンポーネントが何年も前からの代々受け継がれてきたようなつくりになっていて、涙が出そうになる。
しかも、困ったことにドキュメントの類がない。ないことはないが、肝心な部分がない。製品マニュアルをみて理解しろというにはちと作りが悪すぎる。
外面はものすごくよくできていると思う。ユーザーインターフェースは秀逸と言ってもいい。それに反比例して開発者用のその他もろもろは・・・まぁそういうことだ。
更に困ったことに、5年とか10年とか開発に携わっている人でもよく分かっていないらしく、無駄なコーディングをしてバグをつぶすとか普通にある。
(というか、それをしたのでこれを書いてる)
ちょっとXMLの設定ファイルに10文字足すだけで直るバグを、Javaクラスを1つ作って、既存のクラスに定数を足して、XMLも弄ってということした。
それで給料もらっているのでいいといえばいいのだが、確認含めて30分で済む作業を4時間かけて修正するのはいかがなものだろうか?
(ドキュメントがないので、デバッガでソースを追いながらだとこんなもんだよと自分を慰める)

次回のメジャーバージョンアップでspringとかHibernateとかその辺のフレームワークを使って、メンテナンスしやすくすると言っているので、それを信じて耐えるか・・・

オランダの不思議

2つくらい不思議なものをみた。

その1.
オランダにはクリスマスシーズンに、サンタクロースとは別にシンタクロース(Sintaklaas)なるものがいる。彼はトナカイではなく、黒人のプリーストをつれてきて、なんだかよく分からん呪文(オランダ語で喋ってただけ)を唱えたのち、子供たちにプレゼントを配っていた。
本来は12月15日くらいの行事らしいが、(多分その時期は休暇をとる人が多いため)、僕の会社では11月末に移動したらしい。会社が(おそらく)福利厚生の一環(単にオランダ人が祭り好きなのかもしれんが)で行っていたので、社員の家族とか子供とかきてた。
ちなみに、この行事、いつの頃からシンタクロースがつれてくる牧師が黒人に変更されたため、黒人の人たちには受けが悪いらしい。よく知らん。

その2.
この国で(自称)上流家庭の人たちはナイフとフォークでパンを食べる。
正直見ていて滑稽に映るのだが、そういうことらしい。育ちがいいことの証明なのか、その方がマナーがいいと思われるのかは知らんけど。ちなみに、徹底してる人は、食べ物に直接手を触れないそうだ。
つまり、ナイフとフォークでパンを袋から取り出し、皿に置かれたパンにバターを塗り、Beleg(パンにのせるもの全般)をナイフとフォークで取り、切って食べる。
不思議な光景であった。
試してみようかとも思ったが、あまりに抵抗があるのでやめた。どうやら僕は上流家庭の人間にはなれないらしい。

2009-11-21

C++: istreamのread

職場の環境でexe、zipのファイルがダウンロードできない。
っが、普段使っているエディタじゃないとどうも調子が出ない(エディタは重要だ)
ちなみに、xyzzyである。Emacsライクな素敵エディタ。
配布形式はlhaなので、ダウンロードはできた。っが展開できない・・・
なら、自力で展開してやろうと思い、Lhaの展開プログラムを書いているのだが、まさかファイルの読み込みでえらいことになるとは思わんなかった。
普段は固定長のバイナリデータなんて扱わないからなぁ・・・
問題になったのはこんな感じのコード。
-----
unsigned char* buffer = (unsigned char*)new char[size + 1];
in.read(buffer, size); 
-----
ちなみに、「in」はistream。
こんな感じでやったら、何故かセグメンテーションフォルトで死んだ。理由はよく分からない・・・
デバッガで追っかけてもread()の部分で死んでるし、意味不明。
しょうがないので、1バイトずつとって押し込めることにした。
それだと動いた・・・なぜだ?

2009年11月21日 追記

理由が分かった。
利便性を高めるために、こんなメソッドを一枚かませていたが、それがいけなかった。
-----
template<typename T>
int get_byte(T& t, int size)
{
  in.read(reinterpret_cast(&c), size);
  return in.gcount();
}
-----
だめな理由も一日寝てすっきりしたらよく分かった。ある意味当たり前。
渡してるのはポインタなのに、受け取る方式はリファレンス。何が起きるんだろう?
ポインタのポインタみたいな感じになっていたんだろう。そりゃ鼻から悪魔が出てくるわ・・・
自分の未熟さだけを露呈しただけだった・・・orz

2009-11-16

初日

今日は仕事の初日であった。
場所はロッテルダム。駅前といってぜんぜん問題ない場所なので、通勤には非常に便利。
(電車通勤で1時間を下回る職場はこれが初めてだ!)
職種は何を血迷ったのか再びプログラマー。ま、日本と違って残業はほとんどない(らしい)ので、特に問題は無いだろう。
(問題になるとすれば、言葉か・・・いや、英蘭どっちでもOKなので大丈夫なはず・・・)

個人的にいろいろ日本にいたときと比較すると環境はいい気がする。
(給料はそんなに高くはないが・・・)
初日が終わったばかりで浮かれているというのもあるだろうが、それを差し引いてもいい会社だと思う。
(と思いたい。自分の中で結論が出るのは分かるのは早くとも1ヶ月後だろうなぁ・・・)
まだ試用期間中だしぼろを出さないようにしないと・・・

2009-11-15

2012

観てきた。
感想、いまいち・・・
インデペンデンスデイとかアルマゲドンとかと同じ監督らしい(よく知らん)
まぁ、インデペンデンスデイで感動できるなら・・・きっと、多分・・・

話の概要は、要するに現代版ノアの方舟といったところかな。
2012年12月21日に太陽系の惑星が一直線に並んで、その重力場の影響で地球のマントルが暴れる→津波→世界が沈む
こんな感じ。
ぶっちゃけ、突っ込みどころ多すぎ。
例えば、
高さ6000メートルを超える津波は起き得るのか?
わずか3年でArcと呼ばれる超巨大な方舟を7隻も作れるのか?しかも極秘裏に?
なぜアメリカだけがそのことを知っているのか?
(この場合、世界中に優秀な科学者はいるという意味)
その他、たくさん。

あんまりネタ晴らししてもいかんのでこれくらいで。
個人的に話のネタ程度に観る価値はあるかもといいたかっただけ。

2009-11-11

C++: テトリス

ニコニコ動画(たまに見るんです)に1時間でテトリスを作るという動画があった。
これ↓

300行そこそこのソースコードでそこそこ動くテトリスができてた。すげ~。
っで、触発されたわけでもないが、ちとGUIプログラムを組んでみたくなり、なんかいいライブラリ無いかなと探してたりする(Win32APIを直接構う気力はない・・・)

有名どころで、Qt、wxWidgetなどがあるが、ためしにという割には巨大すぎる。
(最初は慣れようという意味合いもあり、上記のテトリスをC++的にしてみようと思うのだが・・・)
っで、よさ下なのがWTLだったのだけど、ATLというライブラリが必要で、ATLはVisualStudioに入っているという・・・
それだけのためにそんなものを入れる気力もなく(そもそも僕のノートPCの容量では入れたくないというか・・・)
う~ん、適当な何かはないだろうか・・・

2009-11-07

カレー

カレーを作ってみた。
といってもカレールーを入れてというのではなく、ゼロから。
(カレールー使って作るんならブログに書くようなことではないし)

こっちでカレールーを買うとなるとかなり高い。1パック(ゴールデンカレーの小さいの)5ユーロとかする。高すぎ!
ということで、スパイスから作ることに。
【材料】
ジャガイモ 大4つ
鶏肉 どんなもんだか知らん、500gくらい?
たまねぎ
トマトピューレ
クミンシード
ローリエ
唐辛子
マギーキューブ

胡椒
味の素
-- 以下 ホワイトカレーソース(?)
小麦粉
牛乳
マサラ粉
--

【作り方】
たまねぎをスライス。鍋に油、クミンシードをいれ、たまねぎを茶色になるまで炒める。鶏肉投入。塩コショウ投入。いい感じになったらジャガイモ、水をいれ、マギーキューブ、ローリエ、トマトピューレ、唐辛子を投入。煮る。
その間にカレーソースを作る。ホワイトソースにかなり大目のマサラ粉を入れるだけ。気合で作る。多めに作った方がとろみが出やすい。できたら鍋に投入。
煮る、煮る、煮る。
出来上がり。

ジャガイモのでんぷんと小麦粉のグルテンでとろみがでます。一日経つとマジでカレーになってます。
適当にスパイスを足すとより風味が出るかも。
後は適当に。
たまには手作りカレーもいいもんですぜ!!

2009-11-03

オランダ語学校

新参者かつオランダ語がしゃべれない人用にオランダ政府が超格安(?)で学校の手配をしてくれる。
拒否権はないので、行くしかない・・・

ということで昨日が初日だった。学校に行くまでには仕事が見つかっているだろうとの目論見から夜間の部を選択。
(実際は・・・見つかってはいたりするが、まだ働いてない・・・)

っで、行ってみてびっくりしたこと。
1. 新参者(オランダに1年以内に来た人)は僕一人
2. ほとんどの人はオランダ語がしゃべれてるじゃん!!
3. 19年オランダに住んでる人が同じクラス
4. クラスの7割がトルコ人

トルコ人たちは(当然?)英語が話せない。僕はトルコ語が話せない。彼らとコミュニケーションをとるかどうかは分からんが、やるとしたらオランダ語になるのだろうか?
いい環境にいると思い込むとして、勉強するか・・・

2009-11-01

Perl: CGI.pmで気づいたこと

PaypalでIPNを受信する件は無事何とかなった。
解決するまでに3時間くらい必要だったが・・・
(んでもって、失敗していた理由が送るはずのパラメータを送ってなかったとか、それが間違っていたとかそんな話だったりする・・・-_-;)

PaypalのIPNはデータをPostで送信してくるので、追加のパラメータ(自分とこで必要なもの)をクエリーストリングで追加することにした。
方法は、Paypalのショッピングカート画面を開く際のパラメータの一つ「notify_url」で、コールバックURLの後ろの「?key=value」ってやっただけ。まぁ、「?、&、=」辺りはお約束の「%~」に変換する必要はあるけど。

っで、RubyとかPythonとかPHPとか使えない(使わない)僕はPerlのCGI.pmを使って送信されたデータを取得しているわけだが、普通にCGI.pmのparamメソッドを使っても追加パラメータが取れない。
でも、URLの末尾には「?key=value」がくっついてる・・・
しょうがないので$ENV{"QUERY_STRING"}で取得して、自前でパースした。
試してない上に、ドキュメントも読んでいないので憶測に過ぎないが、
送信メソッドが「Post」の際、CGI.pmはクエリーストリングを取りに行かないのかな?
理由はなんとなくわかるし、それがただし動作な気はするが・・・
(逆をやったら、おかしなことが起きるだろうし・・・、GETの時に標準出力から読むっての)
おかげで、数年ぶりくらいにこんなコード書いた。
my @query = split("&", $ENV{"QUERY_STRING"});
my %hash;
foreach (@query) {
  my ($key, $value) = split("=");
  $hash{$key} = $value;
}
実際は、$value =~ s/%([0-9a-fA-F]{2})/pack('H2', $1)/eg とか入れる必要があるだろうけどね・・・

Paypal: よく分からん

玩具販売サイト構築の話。
支払方法としてPaypalを利用するというところが決まっていて、PaypalのPDTとIPNについて調べて動作確認しているとろこなのだが、いまいちよく分からん。
なんというか、う~ん。ぶっちゃけ何が送られてくるのかわからんのがいかん。
IPN simulatorでも使ってみるかな・・・

ちなみに、PDTとIPNの違いについてはこの辺が分かりやすかった。
同期通信か、非同期通信かの違いなんだけどね。
しかし、何とかしてIPNに追加パラメータを渡せないかな。
そもそも、今のところIPNを上手く受信できて無いが・・・

2009-10-31

MySQL: 涙が出そう・・・

最近、MySQLを使っている。自分用ではない。自分用なら間違いなくPostgreSQLを選ぶと思う・・

MySQLは他のRDBMSと違って、SQLにくせがある。拡張SQLというか制限SQLというかとにかく不便。Update関係で自己相関クエリが使えないのは以前書いたけど、Viewの中でselect句を使って結合ができないとは思わなかった・・・

こんなのはNG:
CREATE OR REPLACE VIEW adult_member AS
SELECT m.name, m.age
FROM (SELECT * FROM member WHERE age >= 20) AS m;
そんな・・・さすがに困るなぁこれ・・・
将来的にはOKになるらしい。ソースはここ

個人的Q&A
Q:将来まで待てない状態の人はどうしたらいいのでしょう?
A:from句の中を別viewにすればOKです。

もうね、涙がでるよ、マジで・・・

2009-10-27

IE6: フリーズする

玩具販売サイトの話。
経緯はこの辺
(といっても、2行しか書いてないが・・・)

通常はFirefoxで開発して、確認でIE6とかを使っている。
(Firebugいいよ~)
っで、持たせてたデータをファイルからMySQLに移行したら、IEがフリーズするようになった・・・orz
理由はいまいち分からない。
考えられそうな理由
  1. Javascriptで変なことがおきている
  2. CSSの解釈で起こしなことがおきている
  3. DB接続が遅すぎてTimeout
よく考えると、3はありえなかったりする。
単にAjaxでhtml取ってきてるだけだし・・・

なぜだ?
IE6だからか?

2009/10/28 追記

原因が分かった。
prototype.jsのAjax.Updater(たぶんRequestでも)で、asynchronous(非同期通信)をfalseにすると起きてた。
まぁ、Ajaxのいいとこを殺していたので(理由もあったのだが)オプションを除去。
そのページはAjax通信だけで4~5ほどあったので、なんとなく納得。っが、FirefoxはOKだったのはなぜだ?
同時通信数増やしてたっけ?

2009-10-26

SQL: MySQLで更新、削除時に起きた問題

こんな感じのクエリーが動かない。
delete from 
   child
where id in
    (select p.id as id
    from parent p
    left join child c
    on p.id = c.id
    where c.id is null);
SQLの内容自体はよくありそうな、親テーブルと子テーブルを左側外部結合して、親テーブルにはあるけど子テーブルにはない行の削除といった感じ。
Oracle、DB2、PostgreSQLでは動いた記憶があったので、当然MySQLでもいけるだろうと思ったら動かない。
こんなエラーが出た。
ERROR 1093 (HY000): You can't specify target table 'child' for update in FROM clause
(適当な)訳:更新にはFROM区で指定した特定のテーブル「child」を使えないよ~ん。

調べてみた。
どうやら、このタイプのクエリは自己相関サブクエリというらしい。
ソースはここ
鬼かと・・・

解決方法を考えてみた。
1.所詮はプログラムで行っているのだから、クエリーを2回投げればいいじゃん。
2.Viewを一個こしらえれば回避できるらしい。
3.そもそもこんなクエリ投げるってことはデータの持ち方がおかしいのでは?
4.気合で解決方法探してみる・・・
4は方法じゃないね。

誰かいい方法知りませんか?

2009-10-24

C++: MingwでWindowsDLLを使う

Mingw GCCでVCとかでコンパイルされたDLLを使う方法。
この辺参考。

pexportsを使ってDLLの中で定義されている関数を抜き出す。
その後、そいつを使ってDEFファイルを作る。
んで、Mingw付属のdlltoolを使って「.a」ファイルを作って完了。

字面は簡単、実際は面倒だった。
リンカ実行時に表示される、「undefined reference "hogehoge@4"」みたいなのを全部洗い出して、上記のDEFファイルに書き込む必要がある。しんどい。
この辺の互換性って何とかならんのかなぁ・・・

2009-10-17

ぼくらの

漫画の話。アニメではない。
実際のところ、この作品との出会いはアニメのオープニングテーマなのだが。
っで、全10巻読んでみた。

感想:よくこんなの思いついたな作者・・・
基本設定は、別次元の地球と存在をかけての戦い。方法はどっかから与えられたロボット。
操縦者はロボットを操る力を得る代わりに戦闘終了後に必ず死亡。
「勝って地球を守って死ぬか」「負けて地球と一緒に死ぬか」の2択。
選ばれた時点で(最終的には自分で契約する必要があるが)、「死」確定。

内容は面白い。というか考えさせられる。
しかし、パラレルワールドと戦うってどっかで見た設定だな。
ポンコツのヘルメット被って、木刀で戦う高校生だった気がするが、なんだっけ?
思い出せん・・・

2009-10-14

StyleSheet: 高さの異なるカラムを揃える

まさにタイトルどおりの話。
この辺を参考にした。

なるほど、:afterを隠しておいて、必要になったら勝手に表示といた感じかな?
かなり面白い。多分高さ32768pxまで対応してるんだろう。なぜこの数値なのかはよく分からんが?
ブラウザが認識する最大値かな?

ソースが載ってなかったので載せておこう。
#content {
    text-align: center;
    margin:0 auto;
    overflow:hidden;
    /* width: 700px; *//*これ僕は必要なかったので削除*/
}
#content:after {
    content:".";
    display:block;
    height:0;
    clear:both;
    visibility:hidden;
}

#column1, #column2, #column3{
    float:left;
    padding-bottom:32768px;
    margin-bottom:-32768px;
}

#column1 {
    float: left;
    width: 20%;
}

#column2 {
    float: left;
    width: 40%;
}

#column3 {
    float: left;
    width: 35%;
}
幅は適当に変えた。
後は、それぞれのIDを持つHTML要素を作るだけ。
ずっと探していたがようやっと見つかったわぁ。
(前にも見つけた気はするが・・・)

タグがprogramになってるけど、あまりそれ以外に選択肢がなかったから・・・
(増やしたくないという理由で・・・)

2009-10-12

C++: expatを使ってみた

激しく今更感があるがexpatを使ってみた。
ちなみに、expatはSAXでXMLを扱うためのライブラリ。C言語で実装されてるけど、問題なくC++で使える。

RSSを読み込んでデータ型に落とし込もうということをしてみたんだけど、意外と難しい。
SAXってイベント駆動型のAPIなので、全部自前で管理するのだが、結構どうしたもんかなと言うときがある。
基本の動きとしては、
開始エレメント -> 中身 -> 終端エレメント
という感じで動くんだけど、
こんな感じのXMLだとえらいことになる
<hoge>
  <fuga>中身</fuga>
</hoge>
XMLは性質上、空白文字とかもテキストノードとして扱うので、イベントがこんな感じになる。
hoge開始
 ↓
改行文字及び、空白文字
 ↓
fuga開始
 ↓
中身の文字
 ↓
fuga終了
 ↓
改行文字
 ↓
hoge終了

正直、無駄イベントが多すぎな印象。こんな場合個人的には、改行文字と空白文字を除いてほしいのだが、そうもいかんらしい。自前で無視するか、イベントハンドラを追加するか・・・悩ましい。

2009-10-10

Javascript: 苦労した話

JavascriptでIFrameを扱う話。
「tmpl.js」という誰かが作っているライブラリを見つけ、便利そうだったので使おうかと考えた。
この辺
incl.jsで外部HTMLを読み込んで、tmpl.jsで文字列の置換を行うつもりだった。
こんな感じ。

本体
<include id="navi.html"></include>

外側
{ヘッダー部分(tmpl.jsとかとか)}
<a href="hoge.html">{something}</a>

上手くいかなかった。
正確にはFirefoxでは動くがIEではだめといった感じ。
あきらめて、prototype.jsとAjaxにした。
読み込んだ後にごりごり文字列の置換を行っただけ。

同じようにIFrameで別ページを読み込んで、中身だけ取り出そうと試みた。
外側のHTMLではAjaxを使ってデータを取得し、中身だけ取り出す、そうすることでサイトの外観の定義を一箇所にできるかなぁなんて思ったり。
無理だった。
理由:遅延処理のせい。
IEのIFrameにはonreadystatechangeなんてのがあるし、Firefoxは単にonloadに入れればいいだけじゃん、外側はonloadで読み込んでるし。
こんな感じで。
if (/*@cc_on ! @*/ false) {
  iframe.onreadystatechange = function() {
    if (this.readyState == "complete") {
      doSomething(this);
    }
  }
} else {
  iframe.onclick = function() { doSomething(iframe);}
}
安易でした・・・orz
問題はdoSomethingの中の処理なんだけど、IFrameから中身の文書を取り出すときに、contentWindowをが必要になるんだけど、IEではnullになってる。
やり方が悪いんだと思うんだけど、あきらめて力技でやることにした。

IE7とか8ならいけるのだろうか・・・
未だにIE6が必要なのかも怪しいが・・・
(とはいっても、僕の環境はIE6。メインがFirefoxだからという理由)

台風18号

人に言われて思い出した。そういえば最大級の台風が日本に上陸したとか・・・
っで、ちょっと地元のニュースを読んでみたが、結構ひどい。
割とピンポイントで知っている地名とか出てるし・・・僕の地元は大丈夫か?

K氏とかS氏とかの地元の写真が出てたなぁ・・・大丈夫かね?

2009-10-02

ギター

更に連投。。。
(いや、ちまちま上げるの好きじゃないから、ネタがまとまったときにドカンとアップなんて考えてないですよ)

こっちに来てからギターを始めた。バンド仲間などいないので、アコギでソロギター・・・
仕事が見つかるまでものすごく暇なのでというだけではなく、音楽にかかわっていたいという思いもあったからである。
足掛け7ヶ月か・・・
最近になって、ようやく少し弾けるようになったかなぁって程度なので、あまり才能はないのだろう・・・(TДT)

っで、なんとなく気づいたこと。
  • 以外にも左手は器用だったということ
  • 器用だと思っていた右手はそうでもなく、不器用だったんだということ
狙った2弦(or 3弦)だけを人差し指もしくは中指だけで弾くなんてムリポ・・・
右手よ、器用になってくれ~・・・

Javascript: DOM操作でテキストだけ抜き取る

連投。

以前かいたWebサイトで、「ページ内にあるサムネイル画像の検索を行いたい」なんて要望がでて、テキストの検索だからできるだろうと思って作ってみた。
ちなみに、各サムネイルはこんな感じ。
<span class="product">
<img id="hoge" src="hogehoge" />
<div>Produce Name</div>
<div>€ 50</div>
</span>
先頭要素が「span」なのはIE6対策。
っで、prototype.jsを使ってるので、document.getElementsByClassNameでサムネイルの各要素を取り出して、以下のスクリプトでテキストノードだけ抜き取る。
var tags = $A(element.getElementsByTagName("*"));
var text = "";
tags.each(function(tag, index) {
    var children = $A(tag.childNodes);
    children.each(function(node, index) {
        if (node.nodeType == 3) {
            text += node.nodeValue + " ";
        }
    });
});
elementは取得した要素配列の一つ。
元々はここにあったソースだけど、これはFirefox限定だったので、prototype.js使ってクロスブラウザにした。
ただ、それだけ。

どうでもいい話だが、上記のスクリプトの「var text="";」の部分、初期化せずに「var text;」って書くと、for文の中の宣言にもかかわらず、あたかもC/C++のstatic宣言みたいな動作してた。Firefoxでしか確認してないけど。バグか?

免許ゲット

日本の運転免許をオランダのに書き換えた。

オリジナル(日本の)はRDWという免許関連のことをしている機関に納められる。要は取り上げ。
が、確認したところによると日本の免許はちょっと特別で、1ヶ月後くらいに日本大使館に送付されて、取りに行けば返してくれるらしい。便利。
今のところ必要ないのが、気が向いたら取りに行こう。ちなみに日本大使館はハーグにある。

こっちの免許はなのか、書き換えたからなのかは知らないが、10年有効で、日本の免許の最長より5年長いことになる。
10年ここにいるかどうかは分からないが、面倒な手続きは10年に一回でいいのはいいことだ。
ちなみに、ぜんぜん関係ないが、パスポートは最長5年らしい。日本のだと5年のと10年のが選べる。なんかひっくり返った感じだ。
当然僕のは日本のパスポートなので、期間だけ見ればいいとこ取りな感じで得した気分。

っま、免許だけあっても車はないので、あんまり意味はないんだけどね。

2009-09-21

オランダ人の話す英語

オランダ語関連の本でよく「オランダ人は英語で話しかければ英語で、フランス語で話しかければフランス語で返事をする」なんてくだりを見る。試したことないので、本当かどうかは知らない。
個人的に僕は人見知りなので、自分から話しかけるということはないのだが、必要に駆られるときはしばしばある。

とりあえず、今まで話した人が全員流暢に英語を話したかというと、そうでもない。
まぁ、確かに「日本人と比べれば」段違いで英語は話せると思う。でも、オランダではある程度英語が必要な時があるからそれはある意味当たり前な話。普段からある程度必要ならある程度話せるだろう。イギリスが近いし。
でも、かなり怪しい英語を話す人もやっぱりたくさんいる。

以下は体験談。
個人的に「いちご = strawberry(ストロベリー)」は「orange(オレンジ)」と一緒でユニバーサルな言葉だと思っていた、保育園児でも知ってる言葉だし。オランダに来る前までは。
近くにあるスーパーマーケットの中にちょっとしたスナックを売ってる店があって、毎週土曜日はミルクシェイクが50セントで売られている。
50セントなら買おうと思い、何があるか聞いてみると。
「banana, vanilla, chocolate, and aardbei」
ん?「aardbei」?なんだそれ?(その当時はまだ知らなかった単語)
「what was aardbei in English?」
店員さんは結局答えられずに他の人に尋ねていた・・・

ちなみに答え:いちご = strawberry

う~ん・・・なぜだろう?

オランダに来る可能性ががある人はあまりオランダ人の英語を信用しすぎない方がいいと思う。

2009-09-13

Elegy 小フーガ

2008年に公開された映画。
英語音声でオランダ語字幕という状態な上、いまいち話が好きになれないので適当に流し見。

その中で主人公(?)がピアノでクラッシクの曲を弾いていて、何の曲だろう?となる。
ビバルディ?いや、もっと教会音楽的な、バッハ?

ということで調べてみた。
というか、バッハに当たりをつけて自分の記憶の中にあるバッハの曲名をYoutubeで検索と言った方がいいか。
バッハの曲なんて、トッカータとフーガのニ短調しか知らんがな。


と思ったが、もう一つ知っている。
なんだったかな・・・
確か、ト短調。う~ん。
フーガト短調・・・検索・・・小フーガ。これか。


これだ。

それにしても、このあたりの曲なんて昔母親に名前聞きまくって覚えた記憶があるんだが、忘れるもんだね。

2009-09-11

「same」の意味

ちょっとした口論の話。

まずは、sameの意味
1. Being the very one; identical: the same boat we rented before.
2. Similar in kind, quality, quantity, or degree.
3. Conforming in every detail: according to the same rules as before.
4. Being the one previously mentioned or indicated; aforesaid.
from thefreedictionary.com

っで、口論の内容
例)二つの同じ型番号の椅子がある。これは「same」か?
ある人は言う、これは「similar」である、と。
また、ある人は言う、これは「same」である、と。
最初の人は言った、「辞書を引けば、これはsimilarだ。用法が間違っている」

要するに、本当に間違っているのかというのの確認の話になる。
1の意味だけで見れば、same = uniqueと言えるので、まぁ間違いかと。
でも、複数意味があるということは、会話または文章の無いようによって意味が変わるということで、もしuniqueの意味だけなら、uniqueを使えばいいわけだ。
つまり、辞書的に見ても、上記の例は「same」ではないかと思うのだが、どうだろう?

ついでに、「same」の和訳。
a. (the 〜) 同じ, 同一の, 同様な ((as)); 〔話〕 ((the 〜 asで)) …と同じように. (this [these, that, those] 〜) 前述の, 例の; 変らない, 単調な.
from goo辞書

他の人の意見が聞きたいなぁと思ったり。

2009-09-10

クロスブラウザな話

「玩具をネット販売したいからショッピングサイトを作れ。」
始まりはこの言葉からだった。

-- 略 --

異なるブラウザで同じ動作がある程度しか保障されていない話は有名だが、それを解消するために開発者の時間と精神力が大量に消費されているのはあまり有名ではない。

要するに上記のような問題である。つまり、異なるブラウザ間の動作が異なった際の解消方法の話。

問題その1
Firefoxでは「__hogehoge__」というスタイルシートの記述は許可されているが、IE6ではだめ。
先頭のアンダースコアを削ったら動いた。
気づくのに3時間かかった俺、涙目。
ちなみに、なぜそんな面倒なクラス名をつけたかというと、Javascript内で要素を勝手に作ってくっつけてるやつのクラス名だから。要は、名前を変更するなよって意味だけ。
他はHTMLファイルに書かれているので適当に編集してもらって構わないというだけの話。

問題その2
以下はFirefoxのみで動作可能
-- javascript --
function check(form) {
  var inputs = form.getElementsByClassName("hoge");
  // do something
}

-- html --
<form name="fuga" action="check(this)">
  <input type="text" class="hoge" value="hohoho" />
</form>
getElementsByClassNameはprototype.jsのdocumentに対する拡張メソッド。IEだとformに対しては使えないと怒られる。
しょうがないので、getElementsByTagNameでinputタグを抜き取って、Element.hasClassName()でクラス名を持っているかチェックして切り抜ける。入力チェックだしこの程度でいいだろう。
誰か、いい方法知ってたら教えて。

問題その3
opacityの話。これはどちらかといえばCSSの話か?
Firefox3は単に「opacity: 0.5」みたいに書けばOK。
IE6は 「filter: alpha(opacity=50); -moz-opacity:0.50; opacity:0.50;」と3行いる。
たぶんこれはCSS2とCSS3の違いか?IE6は古いのでしょうがないといえばしょうがないか・・・

一通り出来上がったら、Firefox3、IE6、7、8とチェックしないとなぁ・・・

2009-09-06

時をかける少女

今更ながらに、時をかける少女を観た。レンタルだが。
ま、内容については適当にネタバレサイトでも探せば山ほどあるので、ググってください。
本題は実はそれとは遠く(それほどでもないが)離れたところにある。

映画を観るとき、黙ってみますか(歓声等は除く)、それとも批評しながら観ますか?
ちなみに僕は黙って観る派。もちろん、胸のうちではそれはおかしいだろ、って突っ込みは入れるが。

この映画、に限ったことではないが、14歳の少女が主人公なだけあって、言動が幼い。若さとも言えるが、愚かさとも言える。
(個人的には14歳ならそんなもんだろうというのと、自分もそんな時代があったなぁなんて重ねる部分があってよかったと思うんだけど)
そうなると、批評したいタイプというか口に出しながら観るタイプの人はそれを口にするのですね。挙句の果てに、なぜこの映画を借りてきたのかを問う始末・・・
もうね、黙って観ろと、言ってやりたい。
(人のことは言えんところはあるけど・・・呪ビとか・・・観ずに寝てたけど邪魔にならないようにしてたけど・・・)
隣で「Idiot」とか「Stupid」とか言ってるのを聞きながら観ると、ちと(大分?)興が冷める。
14歳に何を求めているのだといえば、「Still」・・・

映画は一人で観るものだと実感。
そこまで映画熱があるわけでもないのでいいと言えばいいのだが、そうは言ってもねぇ・・・

2009-08-31

求めているもの、求められているもの

仕事探してほぼ丸2ヶ月。未だ無職なわけだが、2度ほど面接(といっても電話)を受けた。ちなみに、何かの間違いでどちらも同じ会社。
結果は未だ無職ということだ。

ただ、何度受けてもその会社の求めているものが満たせるとは思えないので、まぁ、いいのだろう。(泣いてないからね。。。)
Javaにおけるfinalキーワードの意味は?assertの意味は?ifとassertの違いは?immutableクラスとは?
いやね、分かりますよ。日本語ならね。そげな勉強英語ではしておりませんので、ぱっとは答えられんがね。んで、言われたのが、Java開発者になりたいなら、コースを受けるべきだね、って。ああ、そうかい。

個人的に、プログラミングの本質は問題の解決にあると思っているので、開発言語にこだわったことないんだよね。言語の特徴を活かす事は好きだが。
なので、Java最高、デザインパターン必須、ってのは肌が受け付けない感じはする。2度とも同じ人だったと思うが、いわゆるオタクなかほりがする話し方だったし。(まぁ、デザインパターンは知ってて損はないと思うが。でもあれって突き詰めていくとそうなるって物に名前が付いてるだけって気もするが)

Javaのプログラムが書ける人(幅が広い定義なるが)ではなく、Java言語の定義を知っている人がほしいなら募集要項にそう書いてほしい。
あぁ、負け犬の遠吠えさ。

2009-08-30

圧倒的じゃないか

某ガンダムの台詞ではない。
308議席獲得の民主党のこと。

初めて選挙権を行使しなかった(できなかったのだが)選挙。
それにしても、ネット(ぐらいしか情報源がない)でささやかれていることが本当で、この4年間の間に全部実現されたら、日本に帰れなくなるなぁ・・・
そもそも、個人献金とか西松建設の問題ってどうなったんだろう?今のところ容疑者扱いなのかね?真っ黒なグレーの人が総理大臣とか(そもそも政治家でそうではない人の方が少ないのかもしれないが)、日本列島は日本人だけのものではない発言の人が総理とかどうなんだろう?
国益のために動いてくれるならどっちでもいいんだけど、アメリカ寄りか、中韓寄りかの違いかね。

これだけ圧倒的な議席数をもたれたら、お手並み拝見では済まない状況ではないかと思ったり思わなかったり。

2009-08-27

総選挙

民主党の財源の話。

民主党は現行制度を抜本的に改め、職業に関係なくすべての人が同じ制度に加入する「一元化」を目指す。収入の15%の保険料を納付し、将来はそれに見合った額を受給する「所得比例年金」に「最低保障年金」を組み合わせる構想だ。

ソースはここ
おまけ

収入の15%…

       ヽ|/
     / ̄ ̄ ̄`ヽ、
    /         ヽ
   /  \,, ,,/    |
   | (●) (●)|||  |
   |  / ̄⌒ ̄ヽ U.|   ・・・・・・・・ゴクリ。
   |  | .l~ ̄~ヽ |   |
   |U ヽ  ̄~ ̄ ノ   |
   |    ̄ ̄ ̄    |

計算式
額面給料:400万(結構もらってんな)
民主党案:400 x 0.15 = 60万

これに対して、所得税、住民税、その他もろもろがかかる。
「憶測」
給料:400万
所得税(5%):20万
地方税(10%):40万
健保税(10%):40万 (これは減るのか?)
民主案(15%):60万

手取り額(年):240万
手取り額(月):20万

300万なら、月の手取りは15万に、200万(いわゆるワープア)なら、10万に。アルバイトも収入になるので、単純に時給 x 15%が税金に。
ちなみに、消費税は別途買い物すれば取られます。

うわさによると、これが施行されるのは政権を取った4年後。そのときには、民主党が野党になっている可能性がある。っで、野党としてこの法律のことを言及するとかなんとか。
まぁ、さすがにそれはうわさでしかないが。ありえそうな話。

TVでは民主300議席なんて騒がれてるらしいけど、あなたはそれでも民主党にいれますか?

2009-08-20

Composite pattern

[category]
Structural pattern

[brief description]
This pattern "compose" objects into tree structures to represent part-whole hierarchies.

[detail description]
This pattern provides a tree structures data model. Think about directories and files, directories are composite and files are leafs. Directories can have files in themselves as their children.

[expression in UML]

┌─────────┐
│ Component │
├─────────┤
├─────────┤0..*
│ + operation() │────────―─┐
│ + add() │child │
│ + remove() │ │
│ + getChild() │ │
└─────────┘ │
△ │
│ │
┌──────┴───────┐ │
│ │ │
┌────┴───┐ ┌────┴────┐ │
│ Leaf │ │ Composite │ │
├────────┤ ├─────────┤ │
├────────┤ ├─────────┤ │
│ + operation() │ │ + operation() │ 1 │
└────────┘ │ + add() │◇─┘
│ + remove() │ parent
│ + getChild() │
└─────────┘

[sample code]

(C++)

#include <stdexcept>
#include <iostream>
#include <vector>
#include <string>

enum Type
{
dic,
file
};

class Component
{
public:
Component() {}
Component(Type t_, const char* name_)
: t(t_), name(name_)
{}
virtual ~Component() {}
virtual void operation() {}
Type getType() { return t; }
const char* getName() { return name; }
virtual void add(Component* c) { throw std::runtime_error("This method is not implemented."); }
virtual void remove() { throw std::runtime_error("This method is not implemented."); }
virtual std::vector getChild()
{ throw std::runtime_error("This method is not implemented."); }
virtual int getSize() { throw std::runtime_error("This method is not implemented."); }

private:
Type t;
const char* name;
};

class Directory
: public Component
{
public:
Directory(const char* name)
: Component(dic, name)
{}
virtual ~Directory()
{
for (int i = 0; i < children.size(); i++) {
delete children[i];
}
}
virtual void operation()
{
std::cout << getName() << std::endl;
}
virtual void add(Component* c)
{
children.push_back(c);
}
virtual void remove()
{
Component* c = *(children.end() - 1);
delete c;
children.pop_back();
}
virtual std::vector getChild() { return children; }
virtual int getSize() { return children.size(); }

private:
std::vector children;
int size;
};

class File
: public Component
{
public:
File(const char* name)
: Component(file, name)
{}
virtual ~File() {}

virtual void operation() { std::cout << getName() << std::endl; }
};

void printTree(Component* com, const std::string indent)
{
std::cout << indent;
if (file == com->getType()) {
com->operation();
} else if (dic == com->getType()) {
com->operation();
int size = com->getSize();
std::vector children = com->getChild();
for (int i = 0; i < size; i++) {
Component* c = children[i];
printTree(c, indent + " ");
}
}
}

int main(int, char**)
{
Component* d1 = new Directory("dic 1");
Component* f1 = new File("file 1");

d1->add(f1);

Component* d2 = new Directory("dic 2");
d1->add(d2);

Component* f2 = new File("file 2");
d2->add(f2);

printTree(d1, "");

return 0;
}

Factory method pattern

[category]
Creational pattern.

[brief description]
This pattern provides methods to create objects which has superclass and a lot of derivatives.

[detail description]
This pattern solves the problem that other creation pattern has. (The problem is specifying the exact class of object that will be created)
This pattern separate the method to create an object so that client do not need to specify the class of object.

[expression in UML]

┌──────────┐
│ Creator │
├──────────┤
├──────────┤
│+ factoryMethod() │
│ : Product │
└──────────┘



┌───────┐ ┌──────────┐
│ Product │ │ CroncretCreator │
├───────┤ <------------ ├──────────┤
├───────┤ ├──────────┤
└───────┘ │+ factoryMethod() │
│ : Product │
└──────────┘


[sample code]

(C++)

#include <iostream>
#include <stdexcept>

// this class is interface of product
class Car
{
public:
virtual ~Car() {}
virtual void run() = 0;
};

// these are concret products
class SportCar
: public Car
{
public:
SportCar() { }
virtual ~SportCar() {}

virtual void run()
{
std::cout << "I'm a sport car." << std::endl;
std::cout << "I can run 300 km/h." << std::endl;
}
};

class LuxuryCar
: public Car
{
public:
LuxuryCar() { }
virtual ~LuxuryCar() {}

virtual void run()
{
std::cout << "I'm a luxury car." << std::endl;
std::cout << "You can feel very comfortable." << std::endl;
}
};

class NormalCar
: public Car
{
public:
NormalCar() {}
virtual ~NormalCar() {}

virtual void run()
{
std::cout << "I'm a normal car." << std::endl;
std::cout << "I'm a resonable price." << std::endl;
}
};

enum CarType
{
Sport,
Luxury,
Normal,
Other
};

class CarFactory
{
public:
static Car* createCar(CarType type)
{
switch (type) {
case Sport: return new SportCar();
case Luxury: return new LuxuryCar();
case Normal: return new NormalCar();
}
throw std::invalid_argument("We don't know how to make this car.");
}
};

int main(int, char**)
{
try {
Car* car1 = CarFactory::createCar(Sport);
Car* car2 = CarFactory::createCar(Luxury);
Car* car3 = CarFactory::createCar(Normal);

car1->run();
car2->run();
car3->run();
// the factory throws exception
Car* car4 = CarFactory::createCar(Other);
} catch (std::exception& e) {
std::cout << e.what() << std::endl;
}
return 0;
}

Adapter pattern

一応自分の言葉で説明できるように、自分なりの解釈を書くようにしてるので、間違いがたぶんにあると思う。

[category]
Structural pattern.

[brief description]
This pattern translates one interface for a class into compatible interface.
=> Wrapper

[detail description]
Adapter class provides interfaces to client from incompatible classes or, this is my opinion, a new interface wrapped around a simple interface such as MFC. cf) MFC wraps Windows API about C++ interface, I think, I've never used MFC... --;

[expression in UML]
┌───────┐
│ Adaptee │
├───────┤
├───────┤
│+ methodB() │
└───────┘



┌───────┐ ┌───────┐
│ Client │──────>│ Adapter │
├───────┤ ├───────┤
│- adapter │ │- adaptee │
│ : Adapter │ │ : Adaptee │
├───────┤ ├───────┤
│+ doWork() │ │+ methodA() │
└───────┘ └───────┘
│ │
│ │
↓ ↓
┌─ doWork() ───┐ ┌─ methodA() ───┐
│ │ │ │
│ adapter.methodA() │ │ adaptee.methodB() │
│ │ │ │
└──────────┘ └──────────┘


[sample code]

(C++)

#include <iostream>
//---- this is adaptee classes for other file
struct Point
{
Point(int x_, int y_) : x(x_), y(y_) {}
int x;
int y;
};

std::ostream& operator<<(std::ostream& ost, Point p)
{
ost << "(" << p.x << "," << p.y << ")";
return ost;
}

class LinePrinter
{
public:
void printLine(Point* a, Point* b)
{
std::cout << "draw line from " << *a << " to " << *b << std::endl;
}

void printRectangle(Point* a, Point* b)
{
std::cout << "draw rectangle from " << *a << " to " << *b << std::endl;
}
};
//---- end adaptee classed

//---- these are adapter
class Shape
{
public:
Shape(int x1, int x2, int y1, int y2)
: p1(x1, y1), p2(x2, y2)
{}
virtual ~Shape() {}

virtual void draw() = 0;
protected:
void setPrinter(LinePrinter* printer_)
{
printer = printer_;
}
LinePrinter* printer;

Point p1;
Point p2;
};

class Line
: public Shape
{
public:
Line(int x1, int x2, int y1, int y2)
: Shape(x1, x2, y1, y2)
{
setPrinter(new LinePrinter());
}
virtual ~Line() {}

virtual void draw()
{
printer->printLine(&p1, &p2);
}
};

class Rectangle
: public Shape
{
public:
Rectangle(int x1, int x2, int y1, int y2)
: Shape(x1, x2, y1, y2)
{
setPrinter(new LinePrinter());
}
virtual ~Rectangle() {}

virtual void draw()
{
printer->printRectangle(&p1, &p2);
}
};
//---- end adapter

int main(int, char**)
{
Shape *line = new Line(0, 0, 10, 5);
Shape *rect = new Rectangle(0, 0, 10, 10); // must be square

line->draw();
rect->draw();

delete line;
delete rect;

return 0;
}

デザインパターンのお勉強

仕事を探す上で、どうにもデザインパターンがキーワードになるので、昔の本やら知識やらを総動員しつつ、勉強することにした。
いや、**日本語**でなら説明できるんだけど、英語と言われると難しいからなのだが。

っで、メモ帳代わりにブログを使用することにした。
なので、しばらく面白くも無い投稿が続くことになる。

2009-08-15

風雲たけし城

オランダのケーブルテレビのチャンネルの一つ(のが多い)、コメディーセントラルで「Takeshi's Castle」として放送された。
懐かしさのあまりテレビを占拠してみてしまったが、ダイジェスト版というか、なんというか、面白さ半減であった。(オランダ語の解説がよく分からなかったという説もある)

Wikipediaで調べてみると、この番組1986年から1989年まで放送されていたらしい。う~ん、保育園から小学校までか。
水鉄砲合戦とか、バレーボールを受け取るのとか、壁をぶち破るやつとかアトラクションを結構覚えている。

そこそこ面白かったのだが、1時間フルに放送してほしいのと、オランダ語字幕にして音声は日本語にしてほしいなぁ。

2009-08-09

Guitar Hero

Wii版ギターヒーローに最近はまっている。
昔ゲーセンで少しだけやった、コナミのギターフリークスとほぼ同じゲーム。
多分ギターヒーローはパクリか、OEMだろう。っが、これのすごいところはボーカル、ギター、ベース、ドラムとゲーム内でバンドが組めるところ。(全部別売りだけどね)

とりあえず、一通りの曲をクリアして、ハードに挑戦中。
使用ボタンが4つから5つになると一気にハードルが高くなる気がする。
はまる要素が結構あっておすすめ。

2009-08-01

しばらくはまったこと

be into ではなく、troubleの意味で・・・

最近何を思ったのかC++でちょっとしたものを作ってみたりしているのだが、それではまった。
はまったコード

class x
{
public:
typedef std::vector< x* > x_list;
x_list children() { return children_; }
void append(x* child()) { children().push_back(child); }
private:
x_list children_;
};

void do_something(x* parent, x* child)
{
x->append(child);
}

Java的感覚で見ると特に問題ないのだけど、C++的には意図した動作をしない。ある意味当たり前なんだけど、しばらくC++から離れていたのではまった・・・
問題h、メンバ関数children()が参照返しではなく値返しだということ。っで、append()の中でchildren()を呼び出しているので、children_に追加したくても、実際にはどこかにメモリーをリークさせながら消えていったという悲しい現実。
わざわざappend()の中でchildren()を呼ぶ必要があったかと言われると・・・
解決方法は簡単でchildren()の戻り値を「x_list&」にすればOK。

今後の備忘録のために、恥ずかしいミスをさらしておく・・・orz

2009-07-22

言葉の壁

I received an email offered me an job as a C# engineer. Even though, I'm not so familiar with C#, but it was still a good opportunity... if it wasn't required the one condition, fluent Dutch!

オランダ語なんてまだ挨拶程度しか話せんわ!
Goedemorgen.
Mij naam is Kei.
Aargenaam kennis te maken.
これだけでいいなら。。。
だめだよなぁ、もちろん・・・

オランダ語、そろそろ真剣に勉強しないとなぁ・・・

2009-07-19

Dirty Jobs

ディスカバリーチャンネルで「大人の職業体験」という邦題のTV番組(日本ではもう放送してない)
内容は、肉体労働にスポットを当ててどんな仕事なのか体験してみるというもの。結構面白く、中には本当に3Kな仕事(そもそもそれがコンセプトだと思うが)もあったりする。
コメンテータ(体験者?)が2人いて(もっといるかも)、一人はマイクロウで北米(多分アメリカだけ)担当。もう一人はピーターでヨーロッパ担当。
ちなみに、ピーターの方は日本では放送されていなかった(はず)。

番組の説明はここまでにして、本題。

---以下多少グロテスクな表現が入ります---

前回見たのに、牛の解体作業が含まれていてそれについてちと不思議に思ったので。
内容はフランスで牛の頭と内臓を解体するというもの。残りの部分は解体済みであった。
まぁ、こういってはなんだけど、結構グロい。ほぼすべての内臓がフックに引っ掛けられて解体され、冷凍保存された牛の顔の皮をはがし、脳みそを取る。こんな感じ。
個人的にはこういうのを見るのはいろんな意味で勉強になるので、特に抵抗はない。(別にグロいのが好きという意味ではない)
あと、フランス人は牛をほぼ丸ごと(すべての部位を)食べるんだということを知ってちょっと尊敬。

っで、疑問に思ったこと。
これは「Dirty Jobs(汚い仕事)」なのか?
まぁ、なりたいとかやりたい仕事ではないのでそうなのか?
う~ん・・・
タイトルは変えられない、でも仕事の紹介はしたい、といったところであると信じたい。

ちなみに、このすぐ後にやっていたフランスの下水掃除はマジで汚かった。
画面越しに臭ってきそうなぐらいに・・・

2009-07-16

携帯買った

結局日本から持ち込んだ携帯はSIMロックの解除ができなかったため(アマゾンとか見るとあるけど、日本からだと配送料が・・・)新しいのを買うことにした。

で、買ったのがLGのKP500 Cookie。
2つ候補があったなかでこっちにした。どちらもタッチパネルなのだが、なんとなくこっちの方がデザインが好きだったのと、300万画素のカメラに惹かれて。
(although it's made in korea, i hate...)

っで、とりあえず使ってみた感想。
機能性:う~ん、ボタンに慣れてる人にはちと厳しいか。反応速度が遅い。
デザイン:割とよい。結構好き。
まだ適当にかまっただけで、あまり機能をよく知らないのだが、携帯電話としてはこんなものではないかと。
問題になるとしたら2Gだろう(サイバーフォーミュラSINのアスラーダ風)
あんまり機能的な差を知らないのだが、一つ前のプロトコルを使っているというのは気になる。3G自体もうそんなに目新しくないのに。

ほぼタッチパネルというだけで選んだ感はあるが、使ってみてさほど問題なければOKだろう。そもそもヘビー携帯ユーザーというわけでもないし。

2009-07-02

サイバーフォーミュラ?

GT-Rという車のことである。
説明の必要も無いくらい有名だとは思うが、一応。
日産から出ているスポーツカーで無駄に性能が高い、以上。

っで、なぜサイバーフォーミュラなんて言っているかと言うと、2009年に発売されたVスペックと呼ばれる1500万以上の車にはブーストが付いているのだ!!
単にターボ車というだけではなく、一定の条件を満たすとブーストボタンが押せるらしい。
詳しくはここ

これで、水素エンジンと変形システム、サイバーシステムが追加されたら実写版サイバーフォーミュラの出来上がり。

個人的には狙って作ったと思われるけど、どうだろう?

2009-07-01

シャワー

配水管から水漏れするので、修理を依頼している。っで、乾かすのに2日必要と言われシャワーが浴びれない・・・
髪は気合で洗ってはいるのだが、さすがに夏場にこの仕打ちはきつい。

日本(の夏は1年くらい経験していないが)と比べれば気温は低めなのだが、26度くらい、それでも暑い。
んでもってシャワー浴びれないので汗が・・・うぅ、臭ってるかも・・・

明日までの我慢・・・

2009-06-29

クッキー

アメリカのお土産でいくつかクッキーを買ってきた。
といっても、生地の状態なので自分で焼く必要がある。
っで、冷蔵庫のスペースの関係上焼くことにした。

適当に形を作ってオーブンで10分~14分。

・・・

・・・・・・

・・・・・・・・・

クッキーって焼くと3倍くらいに膨れ上がるものだっけ?

まぁ、気にせずにとりあえず試食。
味は、イメージしていたものよりは甘くないが、とってもオイリー・・・
一日に1枚以上は食べれそうにない。

2009-06-27

GCC 4.4.0

コンパイラである。
最新の4.4.0がMingwから出たので、インストールしてみた。
バージョン4以降からはC++0xの実装が試験的に行われている(らしい)ので、ちょっとその辺を触ってみたかったのと、そろそろ感を取り戻しとかないとなぁという焦りからだったりはする。
ちなみにここから
MinGW


インストール自体は難しいことはないので難なくクリア。Msys自体は前にもかまったことあるしね。
っで、「Hello World」(単にコンパイラの動作確認)もクリア。
問題はここから。
正規表現がBoostを使わなくてもできるようになっているはずなので、それをやってみようと思ったのだが、どうもうまくいかな。
単に「-std=c++0x」オプションを付けたら、swprintfとvswprintfが無いといわれ探す。んで、ヘッダファイル(stdio.h)を見て「-ansi」オプションが付いたら除外されていることにたどり着き、「-std=gnu++0x」に変更。
正確には厳しく標準に従うと除外されるということみたい。安全じゃないから。
(しかし、いいのかこれ?明らかにコンパイラのバグな気がするのだが・・・。まだ標準化されてないとはいえ、準拠してないってことだよなぁ・・・)
そしたら、今度はリンカでこける。どうも正規表現周りのオブジェクトがないらしい。
格闘すること数時間、未だに解決方法が見つからない・・・

う~ん・・・
おとなしくBoost入れた方が早いかな・・・
ライブラリも豊富だし・・・

2009-06-26

ビザ

ついにビザを取得。1年間の期限付きだけど(次回更新で5年、さらに次で永久になる)。
これで強制送還におびえながら過ごすということはなくなった。

さて、次は職探しか・・・
システムエンジニアは不足してる(という話)から、すぐに見つかる(という気休め)と信じて。まぁ、不足してる理由が日本と同じだったら最悪ではあるが・・・

履歴書を更新しないとなぁ。

2009-06-08

オーランドについて

滞在期間も一週間を超えたし、とりあえず観光情報でも書いてみようかと。役に立つかは分からんけどね。
とりあえず経験したことを元にするので、すべてが正しいわけではない。間違ってても責任は取らない。

気候:5月の終わりから6月の初旬にかけては日本の7月から8月くらいの気温。ただし雨が台風並みに降るので体感気温の差は激しい。半そで短パンで出かけて雨が降ったら寒いということもしばしば。
交通手段:バスが主。レンタカーを借りることを強くお勧めする。が、フロリダ州の交通マナーはアメリカ一悪い(らしい。僕はそう思う)ので心臓の弱い人にはお勧めしない。あと右側通行なのと、赤信号で右折できるので注意(例外もあるが)。

お勧め滞在場所:インターナショナルドライブ(International Drive)がいろんなアミューズメントパークが近いし、レストラン等もありお勧め。車で10分くらいの位置にユニバーサルスタジオ、シーワールド、Wet'n Wild、アクアティカ、ディズニーがある。どれも大きいが(面積)、特にディズニーは巨大なのでディズニーにだけ行くだけの3泊4日旅行とかならディズニーの近くでもいいかも。周りに何も無いけど。ただし、ダウンタウンからは遠いので(30マイル以上?)ダウンタウンをメインに見たい人はやめた方が無難(いるのかそんな人?)

行ってみるといいかも:ユニバーサルスタジオはお勧め。あとシーワールドからシャトルバスが出ているブッシュガーデンもいい感じだった。シーワールドは全部周りきれてないけど、体験型水族館みたいな感じ。イルカのショーは一見の価値あり。ディズニーは行く気も起きないくらい広い(ので行ったことない)。Wet'n Wild、アクアティカはプール。どっちも外から見ただけだが、アクアティカの方が面白そう。

食べ物:探せばいろいろある。日本食は期待しない方がいい。典型的なアメリカの食事は取らない方が健康にはいい、が、朝食のビュッフェとかは結構いい。基本外食は高めなので、長期の滞在(二週間以上)なら自炊できるホテル探してWall Martで食材買って節約してもいいかも。

時期的には5月末から6月初旬はベストな気がする。本格的に長期休暇が始まる前なので観光客が少なめで、どこのテーマパークに行っても待ち時間が少なめでいける。ただ、そんな時期に休みの取れる日本の企業はほぼないと思う。テーマパークの数とか考えると少なくとも1週間は滞在期間がほしいところ。ディズニーに行くなら倍はほしい。
余談だが、アメリカに限らず日本国外のバス、電車のスケジュールは書いてるだけと思った方がいい。レンタカーを借りずにバス、電車(乗ったこと無いが)で行くというなら心に留めておいた方がいいかも。

2009-06-02

ユニバーサルスタジオ

行ってきた。
日本のではない。フロリダのである。
とはいっても、僕がすごく早い時間にへたばったので、あまり回ってはいないが。
(シンプソンズのアトラクションみたいなのが決定的だった。コーヒーカップ並みのひどさ・・・)

写真はない。当然(T_T)
まぁ、とにかく広い。アトラクションのパートとスタジオのパートが別れていて、(ひょっとしたらもっとあるかもしれん)、それぞれをつなぐ部分もとにかく広い。歩いてのどが渇いてってどこぞのディズニーランドを思い出させるような商法かとマジで考えてしまった。(ちなみに、フロリダのディズニーは地図で見たところによると街が一つ入りそうな広さだった・・・行ったことない、行きたくない・・・)

しかし、一角はオランダ語で周りは英語、頭の中は日本語だとさすがに頭が疲れる・・・疲れの原因はこれだろうか・・・(単純に体力不足だとは思うけど。暑いしここ)

2009-05-30

water

何故かフロリダ州オーランドにいたりする。アメリカである。バケーションらしい。連行されてきた・・・
(ちなみに証拠になるものはない。携帯のカメラが使えなくなったので・・・悪名高いネットワーク自動調整のせいだ)

さて本題。標題の英単語はどのように発音しますか?いや、中学生でも分かるってバカにしたでしょ?バカにした人は是非読んでほしいなぁと。意図があっという間に汲み取れてしまった人は飛ばしてください。

カタカナで発音を書くのは好きではないのだけど、それはおいておいて。
1.ウォータ
2.ワター
どっちが正解でしょうか?アクセントは最初に置いてね(伸ばし棒は重要な要素です)

・・・

・・・・・・

・・・・・・・・・

答えはどっちもなんですね(たぶん)。違いは英語と米語(あえてこう書いてみた。要はブリティッシュかアメリカンかの違い・・・と思う)
ここで終わると何も面白くない。こんなことを書いているということはなんらかネタになるような出来事があったということだ。

話はヒューストンからオーランドに移動する際の飛行機の中で起きた。飛行機と言えばフライトアテンダント(男だったよ・・・orz)が飲み物を運んできてくれる。アメリカだし、まぁ、英語だわね。
ア「何がほしい?」
俺「ウォータ、Please」
ア「何?」
俺「ウォータ」
アテンダントが理解できないでいると、隣の人が
「ワター。me too」
っで、水が出てきた。
僕の発音が余りに下手だったのか、まったく別の単語に聞こえたからなのかは分からんが、理解されなかったという話。(オランダでは普通に通じてるから発音があまりにという選択肢は消したいところだ・・・隣の人も分かってくれたみたいだし・・・)

そういえば最近は英語と言えばブリティッシュしか聞いてなかったから、(オランダでは英国のTVがオランダ語字幕付きで流れていたりするのです)その影響だろうか・・・と信じたいところだ。

2009-05-20

話しかけられた

Leiden Centraal駅に7時。
迎えに行く時間のことである。迎えに行くといっても徒歩なので、まぁ一緒に帰る程度のことなのだが。

日課になっていることなので、どれくらいの時間がかかるかは大体把握している。10分くらいだ。いつもどおり15分前に家を出て、MP3で音楽聴きながら駅で待っていたとき、おじいさんに突如話しかけられた。
「‘!#$@* zing wel:@!&」
オランダ語で話されてもなぁ・・・ん?sing well?
英語ではないのだが、オランダ語と英語は結構似た単語が多い。どうやら待っているときに歌っていた鼻歌がマジ歌に変わりつつあったみたいだ・・・
とりあえず、ありがとうと行っておいたら、どうやら英語話者だと気づいたらしく、英語に切り替わった!?
以下会話抜粋
おじいさん(以下お)「歌手か?」
自分(以下じ)「ちがう」
お「趣味か?」
じ「そうだ」
お「うまいな。日本から来たのか?」
じ「そうだ」
お「勉強か?」
じ「違う、ライデンに住んでるんだ」
お「そうか。古い町だから何も退屈だろう」
---以下続く---
結局待ち人が来るまで続いた。しかし、自分の返事は短いのしかないな・・・orz

突如話しかけられて井戸端会議をしたのはこれが始めてである。ホームレスに金をせびられたことは多々あるが・・・
何があの老人を刺激したのか分からんが、日本語かな?、ちょっと面白い体験ではあった。

2009-05-16

RAM Disk

パソコンのメモリーを2Gに増設した。特に不自由を感じてはいなかったのだが、いろいろなことのついでというやつである。

っで、単純に増やしただけだとどうせ体感はないのでということでいろいろやってみた。まず、今まで最大でもメモリ使用量は物理+仮想でも1Gだったので、まぁページファイルはいらんだろうと消してみた。体感はそこそこといったところか?Firefoxとかちょっと速くなったイメージ。
次に、RAM Diskなるものを試してみることにした。ページファイルが本当にいらないかどうか確認していたときに偶然見つけたものだが・・・
RAM Diskって何?と最初に思ったのだが要するにRAM(メモリーのこと)上にある領域をハードディスクのように扱う技術みたい。有名な話で32bitのCPUにはメモリー4Gの壁があって、それ以上は認識してくれないのだが、この技術を使えばOSが認識する4Gのメモリー以外のあまりメモリーが超高速で動く実ディスクのようになるので、メモリーの有効活用ができる、というもの。なのだが、折角増設したし、どうせ1G以上メモリー使うことなんて無いだろうので、1GをOS用、残りをRAM Diskにしてみた。

やり方とかは適当にGoogle先生に聞いてもらえばいいと思う。興味があればだが。

っで、結果だが。とりあえず、使えそうなのはインターネット関連のキャッシュとか、プリントスプーラーのキャッシュなどの一時ファイルくらいかな。いろいろ頑張れば(バックアップようのバッチを組み込むとか)プロファイルとかでも置けそうだけど容量は所詮1Gだし、まぁ一時領域が無難かと。
(理由を説明する必要は無いと思うけど、いわゆる主記憶と呼ばれるメモリーは高速で揮発性のものなので、電源落とすとデータが壊れるんです。なので長期保存用のデータとかは置けないの)
でも、ネットのキャッシュをオンメモリーにしたら格段に速くなった。ちょっと増設した甲斐があったかな。

2009-05-14

誕生日

もちろん僕のではない。知っている人は知っているあの人のである。

オランダでの誕生日はちょっと変わっている。と僕が感じただけなのかもしれないが・・・

どうやら祝ってもらうものではなく、祝うものみたい。意味が分からない?日本だと誕生日に誰かが何かしてくれるのだが、こっちでは違う。職場で誕生日の人がいたら、ケーキを持っていくのはその人。もちろん、プレゼントはもらえるみたいなのだが、祝ってもらうより、今日はめでたい日だから一緒に祝いましょう!みたいな感じ。

っが、それだけだと怒られてしまうので、きちんと祝いました。ちょっと手の込んだ夕食と、シュークリーム(すべて手作り)を作って。まぁ、そこそこ喜んでもらえたみたいではあるので、よしとする。

そういえば、職場に持って行った寿司も僕が作ったなぁ・・・
好評だったらしいからまぁいいか・・・

2009-05-08

ジム

量産型のことではない。

最近お腹周りが気になるので、ジムに行っている。メタボというほどではないが「軽くやばい」状態なので・・・(T_T)

今月に入ってから行き始めたのだが、すでに筋肉痛。ちなみにまだ2回しか行っていない。
場所はライデンの南西。ジムの名前は知らない。地名すらもよく分からん・・・13番のバスに乗って適当な場所で降りる。Shellの横に併設されているので、まぁ分かりやすい。
費用は1回7ユーロ、40ユーロ払うと1ヶ月フリー。ちなみに年間会員になると月28ユーロなのだが、そこまでジムに行くとは思えないのでパス。これが高いのか安いのかは日本のジムに行ったことが無いのでよく分からない。(ちなみに今は1ユーロ=133円)

今月中にはお腹周りを何とかしたいなぁ・・・

2009-04-29

Queen's day

毎年4月30日はクイーンズデイで祝日になる。なにか?要するにオランダ国女王の誕生日なわけで、日本で言う天皇誕生日と同じである。
(まぁ、きたばっかりなのでよくは知らないが・・・)

祝日になる、ただそれだけなら日本の天皇誕生日と変わらないのだが、2つ(確認できたという意味で)の違いがあった。
1つ目。この日のトレードカラーはオレンジ色であること。どうしてかは聞いただけなので不確かなのだが、初代国王が自分たちをオレンジ王家と名乗ったからだそうだ。なので女王の誕生日にはオレンジの服を着たり、何かオレンジ色だったりするものが多く見られる、らしい。
2つ目。これはちょっと面白かったのだが、この日は誰でも許可無く物を売ることができる。国全体でフリーマーケットをやっているわけだ。なので人々は家にある「不用品(多分)」を人通りの多いところに並べて売っていた。しかも、店じまい後、本当に必要ないものだとその場に残っている。市の清掃員が片付けるからOKなんだそうだ。ちなみに僕は2冊の本を買って、5冊の本を店じまい後の不用品から拾った(^^;

なかなか面白いイベントだと思う。日本でも天皇誕生日に国中でなにかやればいいのに、と思った。

ベルギー

ベルギーはアントワープに行ってきた。(ちなみに27日月曜日の話)
ライデンからスキポールに移動して、そこで乗り換え。
電車に揺られて片道2時間・・・のはずだったが、何かのトラブルで3時間に延長。げんなりであった。
アントワープは、着くまで知らなかったのだが、ダイヤモンドで有名の町である。また、ロッテルダム港に次いで欧州第2位の港町としても有名。
アントワープの駅はこんな感じ。

もちろん一部だけどね。プラットフォームが複数階に渡っていて面白かった。

説明はこれくらいにして、ベルギーといえばワッフル。当然買ってみた。

さくっとした食感であった。なんというか、クロワッサンの生地をベルギーワッフルの型で焼いたって感じ。個人的には日本製のふんわりした食感の方が好みではある。
このほかにもホットチョコレートがかかったのとか、生クリームがかかったのとか試した。

観光ツアーバスに乗ってぐるりと街を一周し、気になったポイントで下車。
ガイドレコードがここで写真を撮ってはいかが?といっていた、スヘルデ川の橋の上から


なんとなくヨーロッパっぽい町並み。


三味線を弾く女、パシャリ(元ネタは何かのゲームから)

誰かはぜんぜん知らないけど、テレビカメラとか回してたし何かのロケかな?カメラ回してる人は周りの人もかなり撮影していたので、僕もばっちり写ってしまった。
そういえば、日本人観光客が山ほどいたなぁ。ド平日なのに・・・一応GWか?

こんな感じで適当に周って終了。楽しい一日であった。

2009-04-19

食の違いについて

日本食は健康的だ、なんて幻想だと思っていた。
実際、日本の住んでいるときにはそんなこと意識したことはあまりなかったし。
が、こっちに来て(まぁ、カナダにいた時もちょっと感じてはいたが)思ったことは、

・日本食が取り立てて健康ではない、ただ多品目取るのに適している
・こっちの食事は基本は少品目
・日本は主に野菜メイン(僕の主観)、こっちは肉メインの食事
・病人食(おかゆとか)という概念はあまりない
・ビタミンCを取っておけば大丈夫と考えている

他にもあるが、こんなところ。
あとは、油料理がおおいかな。ちょっと味付けが濃い気がする。繊細な味覚はあまりなく、極端。
う~ん、挙げるときりがないな。

2009-04-17

IND

オランダの移民局のことである。
ここに登録をしないと不法滞在になってしまうので、
(そうは言っても3ヶ月は大丈夫だが)
人生の墓場(と表現する人がたくさんいる何か)に片足突っ込む登録をしてきた。

登録というか申請自体は1時間程度なのだが、
2週間前に面接の予約を入れて、
登録審査に最長6ヶ月かかる(大体1ヶ月前後らしいが)という気長なもの。
まぁ、僕がやったことといえば、
サインして、出生地を答えた程度だが・・・
(他は全部やってもらった。情けない話だ)

当然のことなのだが、申請が通るまでビザが降りない。
つまり仕事が探せないということになる。
(ひょっとしたら申請中でもいけるのかな?確認しよう)
ということはしばらくは長い休暇をいやおう無しに堪能するしかないということなのだが、
何しよう・・・やっぱり勉強かな・・・

何はともあれ、やることは全部やったので、
後は野となれ山となれ。

特別訓練

全武器でクリアした。
げんなり感が増していくのがイヤだったので、クソ猿からスタート。
が、以外や以外、すんなりとクリア。
んで、慣れ親しんだレウス君以下訓練所を進めていったのだが、
難易度が下がっていくにつれ、面倒だった・・・
特にガノトトスとドスガレオス。
特定の武器だと早いのに、ほぼすべての武器で時間がかかる。
う~ん、やりなれていないのか。

何はともあれ心眼のピアスをゲット。特に使い道はないが・・・
ギルドカードコンプリートまであと10マス。
訓練所のG級とトレジャーハンターが残ってけど・・・

2009-04-11

Groningen

に行ってきた。
Leidenから電車に乗って北上すること3時間と30分。遠いよ・・・
ま、オランダの北の端っこくらいにある場所みたい。
電車の中からここは北海道か?と錯覚するくらい牧草地以外は何もない場所を通り過ぎた。う~ん、小さい国だから土地が余っているってことはないと思うのだが、あるところにはあるらしい。

Groningen(グローニンゲンではない。フローニンゲンかな?)はどちらかと言えば田舎かな?中心地は当然いろいろビルもあるし面白そうだったのだが、連れて行かれたのは郊外。なのでまぁ、ほぼ何も無い。牛とか馬とかは結構いたが。
感想としては、臭い(!?)いや、マジで。
そこら中に犬の糞がされていて臭ううえに、牛とか馬とかそうあの特有のにおいが混ざっていて、う~ん、なんともいえないかほりに・・・

オランダでは犬を買うのに犬税というのがあるのだが(犬税のおかげで、せいで?、飼い主は犬の糞を始末する必要がないらしい)、ここにはそれがないらしい。
なので、たくさんの人が犬を飼っていて、当然えらいことになっていると、そういうことらしい(真偽のほどは定かではない。そういわれただけなので)

ま、楽しかったしいいか。
往復で6時間(帰りは2時間半くらいですんだ)の小旅行であった。

2009-04-10

Scheveningen

天気がよかったから行ってきた。
ちなみに、スケベニンゲンではない。スヘイフェニンゲンが近い発音。
ここはビーチが有名(?)なのだが、特にビーチに行くということはなく、ゲーセンへ。
なぜか・・・

そこにはDDR(ダンスダンスレボリューションの略)があるから!!

まぁ、連れられていったんだけどね。
っで、久しぶりにやってきた。4年か5年ぶりくらい。
感想。
踏みっぱなしのステップで複雑なのが出ると足6でも苦しい。
踏みっぱなしのステップは練習が必要かな。
あと、全体的にステップが昔より荒くなってしまっていた。ま、昔も華麗には踏めなんだが・・・
3ステージやったらしんどかった。う~ん、若くない。

満を持して

ついにというか、今更というか、
モンスターハンターをクリアーした。
なに?という人は、ググりましょう。

装備は、G級ラージャン装備に抜撃珠 x 3、抜刀珠 x 1、隠密珠 x 2
武器は角王剣アーティラート。
持ち物は調合所1~4、光蟲 x 10、素材玉 x 10、鳴き袋 x 10、爆薬 x 10、閃光玉 x 5、おと爆弾 x 10、怪力の種 x 10、シビレ罠、落とし穴、ネット x 2、トラップツール x 2 + 回復薬と護符、爪
ネコは平和主義に回復笛、真回復笛、シビレ罠の術
ガンランスで行きたかったのだが、どう考えても僕の腕では最後のクソ猿が倒せないので断念。

レウス君は適当に退治。大剣なので飛んだら溜め3、後は適当に頭殴り。
問題なく5分未満で退治。
問題はここから。
クソティガ。落ちてくる場所に落とし穴を仕掛けておき、落ちたら溜め3あててからしこたま殴る。怒ってないときは頭メインで慎重に殴り、怒ったら閃光玉で動きを止め殴る。威嚇しているときに溜め2をこつこつあてて、10分くらい。
ナルガ。閃光玉と音爆弾でハメ殺し。落とし穴調合して、シビレ罠仕掛けて、目いっぱい溜め3あてても15分。う~ん、腕が鈍いのか・・・
クソ猿。殴れるときに殴るしかないので慎重かつ大胆に。が1死(T_T)10分から15分くらいでしとめる。合計40分ちょっとくらい。

感想:
しんどい。しかも報酬がしょぼかった(T_T)

2009-04-03

ダウン・・・

いろいろ書類の整備があったりで、ハーグの日本大使館に行ってきた。
戸籍抄本の英訳と、婚姻要件具備証明書の作成を依頼。
結婚するわけではないのだが、いるのだ。しょうがない。
上記の2部で17ユーロ。郵送の切手代が44セント。
45セント出したら、オランダには1セントはないのでおつりなし・・・

まぁ、特に問題も無くハーグで適当に昼ごはん。
ご当地バーガーのマッククロケットを食べる。
2年くらい前にルー大柴が「真っ黒けバーガー」なんて駄洒落で紹介していたなぁ・・・
味はうまい。結構病みつきになりそう。

んで、ライデンに戻るのだが、どうも調子がおかしい。
徹夜明けで何かをしなければいけなかったときのように頭が痛い。
時差ぼけが今更出たかな?
限界を感じて戻り、少し寝て、今に至る。

やはり疲れが出ているのか?
それとも精神的なものかな?

2009-04-01

到着

オランダに到着。
やることはまだあるのだが、少しゆっくりしている最中。
(もなかではない)

前にも来たことがあるとはいえ、やはり耳慣れない言語が飛び交っている。
この言語が話せる日が来るとは思えないのだが、う~ん。
そういえば、テレビの字幕がオランダ語。当たり前か・・・

ま、初日の感想なんてこんなもんだろう。

2009-03-31

さらば日本

この台詞も2回目か・・・
1ヶ月も何も書いていないは新記録だと思うが・・・

さて、タイトルどおり国外に逃亡します。
今回は期間がとりあえず特定されていません。
(まぁ、前回同様半年という可能性は0ではないのだが・・・)
行き先はオランダ。チューリップとチーズ、風車の国です。
(調べると分かりますが、もう少しあります。合法マリファナとか)

英語の次はオランダ語か・・・
たまにオランダ語の日記が書いてあったらそこそこ上達したということにしてください。

2009-02-21

IQサプリ

現在進行形で見てたりする。
それがどうしたというレベルだが・・・

っで、最近思うところがあるのだが、クイズ番組のクイズの質が下がっているというかテレビ業界の内輪ネタで盛り上がっているという気がする。IQサプリなのに常識問題ってなんだろう?
(ぶっちゃけ、IQサプリとヘキサゴンくらいしかクイズ番組みてないけど・・・世界不思議発見とかどうなってるのか知らない・・・)
テレビといえ最近特に見るものもないからテレビが(ただ)ついてるという状態が結構ある。適当にチャンネルを変えながらつまらなんなぁってことが多い。地デジ移行だあーだこーだって言って視聴者に変な焦燥感を煽っているが、それに見合うだけの何か(コンテンツの充実とか)は特になく、「地デジになるからなんだ?」っていう感じ。高い金払って機器取り付けて特にメリットなし、ってかテレビが継続して見えますって舐めてるのかなと思ってしまう。
そういえば大阪ではどのチャンネルをつけてもお笑いがやってるっていうこってり系(言ってて意味不明だな)な地域らしいが、最近この辺でもそんな感じな気がする。芸人を使ってとりあえずネタをやらしておくっていう感じの番組が多い。それでもどれ見ても笑えるとかならまだ許せるのかもしれないが、いまいちな物が大半。しかしそこにいるパネラー(違うよな?)はたいてい笑う。う~ん、芸能人(芸は無いけど芸能人?ある人いわく芸が無いことが芸らしい)との笑いの感覚が違うらしい。
何がいいたいか分からなくなってきた。いいたいことは、面白い番組が見たいです。

2009-01-24

Qt4

あまりに書かなさ過ぎて、最終更新から1ヶ月経ったか・・・

何を思ったのかQt4でプログラムを組んでいたりする。インストール自体は数ヶ月前からしていたのだが(下手すればカナダに行く前から)、使い方の勉強する気が起きずに放置していたのだったりする。
っで、最近仕事でC#を使っていて、あまり関連性はないのだけど、デザイナ使ってプログラムを作ることにそんなに違和感がなくなってきたので、ちょっとほしいものもあるし作ってみることにした。
っで、使ってみた感想。
wxWidgetよりはるかに便利なだと思う。ってか、同じことするのに書くコードの量がすごく減る気がする。昔wxGlade(だったかな?)ってデザイナで同じようにプログラム書いたことがあるが、そのときは出来上がるコードが汚くて性に合わなかったんだけど、Qt4に付属してるデザイナだと自分が書くコードとはそんなに絡んでこないので(逆に言うとイベント、Qtではシグナルとスロットだが、を自分で設定する必要があるが)コンポーネントの名称さえまじめに考えてやれば割とすっきりとしたコードが書ける。
とまだまともに動くものができてないけど感想。でも、いろんなコンポーネントもあるし、個人使用なら無料だし(配布するならソースを付属する必要あるけど、ま、個人的には関係ないが)かなりいい感じだと思う。