For some reason, my firefox 3 and 4 didn't work well. I got horrible internet connection with it, such as google.com could be seen but not hatena.co.jp. First I thought it was because of my laptop, so I actually disassembled it and cleaned it. But unfortunately it wasn't it. Then I installed IE8 which I really didn't want to, and I really wish that was it. Well, as you can see it wasn't it, *AGAIN*.
I didn't have any idea what was wrong, I've even uninstalled my AVG which is a free virus software because I thought it has own firewall, however it didn't change any thing. Actually, I got less memory consuming as a result. But I'm kind of chicken so I've already installed new anti virus software, AVAST!. It's light and less memory than AVG so far I like it.
When I installed it, it recommended to install Google Chrome. Frankly, I've been avoiding to install it, because I felt like Google steal my private information such as the history of my browsing. I don't want them to know my porn site history XD. Just joking.
So far, it's pretty good. It's fast as they say and its style is really simple. One thing I have a problem with this. It can't import my bookmark from firefox. I think this is because my firefox's profile is broken. Does any body know how to fix it?
Syntax highlighter
2011-04-07
2011-04-01
4月1日
世間ではエイプリルフールだが、僕にとってはちょっと違う意味を持つ日。
某マイミクは同じ意味の日を「独立記念日」と名づけているが、僕はもともと独立していたのと特に名前をつける気がないので名はない。
あまり引っ張ってもしょうがないので、この日は僕がオランダに来た日。2009年4月1日に来たので今日で丸2年。
特に感慨深いということもないが、時が立つのは早いものだ。
最初の1年はいろいろわからないこともあり、不安な日々もあったと思うが、2年目はこなれたものであった。未だにオランダ語はうまく話せないし、生活は不安定ではあるが、許容範囲だろう。
こっちに来て得たものは大きい。特に昔持っていた価値観が大きく変わった気がする。主に仕事に対する考え方というやつだ。
日本にいたときは、もちろんそれが日本式なのはわかっているが、「会社が何かをしてくれるのではなく、自分が会社のために何ができるか」ということをが正義(ちょっと違うか)だった気がする。個人個人がまるで経営者にでもなったかのような考え方だと思う。仕事を通じて人間形成をするとか、会社の利益のために何ができるかとかそんなことだ。
それ自体は別に悪くないと思うし、日本という国はそうやって今の地位を気づいた部分もあると思う。でも、そこに僕(自分)はいないんだよね。
その考えがこっちに来て大きく変わった。もともとその考えに対して大きな違和感を持っていて、それが元で転職したり、カナダにワーホリにいったりしたのだが、その違和感がここに来てはっきり分かったというべきか。
こっちの人たちは、ある意味当たり前だが、日本式の考えでは働いていない。まず、自分があって会社は、その人のキャリア形成にもよるが、生活の糧を得る手段といったものだ。だから、より良い条件を提示する会社があればすぐにそちらに移る。勤続年数なんてものに意味はなく、自分が何をしたか何ができるかということにだけ意味がある。なので、会社への忠誠心とかは薄く、そもそもそんなものないと思うが、自分の生活もしくは家族が第一である。
よくあるドラマの台詞(よくあるのか?)で「仕事と私どっちが大事なの?」なんてのがあるが、この国ではそんな台詞吐くまでもなく答えは明白である。
日々の生活に特に不満はない。むしろ、もう日本に戻れないだろうという気さえしている。堕落したのかこれがあるべき姿なのかは分からないが、あまり気負って仕事しなくていいというのは心にゆとりができる。もしかしたらできすぎたのかもしれないが。
3年目は何を得るのか分からないが、楽しい1年になるという気はしている。
某マイミクは同じ意味の日を「独立記念日」と名づけているが、僕はもともと独立していたのと特に名前をつける気がないので名はない。
あまり引っ張ってもしょうがないので、この日は僕がオランダに来た日。2009年4月1日に来たので今日で丸2年。
特に感慨深いということもないが、時が立つのは早いものだ。
最初の1年はいろいろわからないこともあり、不安な日々もあったと思うが、2年目はこなれたものであった。未だにオランダ語はうまく話せないし、生活は不安定ではあるが、許容範囲だろう。
こっちに来て得たものは大きい。特に昔持っていた価値観が大きく変わった気がする。主に仕事に対する考え方というやつだ。
日本にいたときは、もちろんそれが日本式なのはわかっているが、「会社が何かをしてくれるのではなく、自分が会社のために何ができるか」ということをが正義(ちょっと違うか)だった気がする。個人個人がまるで経営者にでもなったかのような考え方だと思う。仕事を通じて人間形成をするとか、会社の利益のために何ができるかとかそんなことだ。
それ自体は別に悪くないと思うし、日本という国はそうやって今の地位を気づいた部分もあると思う。でも、そこに僕(自分)はいないんだよね。
その考えがこっちに来て大きく変わった。もともとその考えに対して大きな違和感を持っていて、それが元で転職したり、カナダにワーホリにいったりしたのだが、その違和感がここに来てはっきり分かったというべきか。
こっちの人たちは、ある意味当たり前だが、日本式の考えでは働いていない。まず、自分があって会社は、その人のキャリア形成にもよるが、生活の糧を得る手段といったものだ。だから、より良い条件を提示する会社があればすぐにそちらに移る。勤続年数なんてものに意味はなく、自分が何をしたか何ができるかということにだけ意味がある。なので、会社への忠誠心とかは薄く、そもそもそんなものないと思うが、自分の生活もしくは家族が第一である。
よくあるドラマの台詞(よくあるのか?)で「仕事と私どっちが大事なの?」なんてのがあるが、この国ではそんな台詞吐くまでもなく答えは明白である。
日々の生活に特に不満はない。むしろ、もう日本に戻れないだろうという気さえしている。堕落したのかこれがあるべき姿なのかは分からないが、あまり気負って仕事しなくていいというのは心にゆとりができる。もしかしたらできすぎたのかもしれないが。
3年目は何を得るのか分からないが、楽しい1年になるという気はしている。
2011-03-25
syntax-rules再び
レコード、コンディションができて、with-exception-handlerも上手いこと動いていそうな感じだったので、
Ypsilonにあるguardの実装を試してみようとおもったら、パターンマッチでエラーがでた。
具体的にはこんなパターン。
元々はMIT Scheme由来のものだったので、とりあえず本家でも試してみたが、こけた。一応moshでも試してみたがOKだったので、R6RS的にはOKなんだろうと推測。
ということは、足りない部分を補うか、新たに何とかするしかないということだ。ここは一発気合をいれて実装してみようと思い、まじめに仕様を読むことにした。
要求されているのは以下のとおり。
基本的なパターンマッチの部分は同じで細かい違いは別にすればなんとかなりそうだろうか。
moshはよく知らないが、YpsilonとGaucheはsyntax-rulesで現れたパターンを一度コンパイル(後でパターンマッチがしやすいように情報を集めておくという意味)して、マクロが使用された際にその情報を元に展開していくという方法を取っている。
それとは別にMIT SchemeやChibi Schemeではsyntax-rulesが現れたらそれ自体をS式を返すS式に変換し、展開時には元のS式をマクロ展開用のS式(要するに展開器)に食わせている。
前者はマクロを展開するコンパイラが展開方法を知っていないといけないが、後者はマクロを展開するタイミングだけ知っていれば後はマクロが勝手に展開してくれる。現状Sagittariusは後者の方法を取っている。(なので、Sagittariusには組み込みのマクロというのはない。マクロはS式とコンパイル時の環境をペアで取るλ式に過ぎなかったりする)
とりあえず、パターンの部分の解析からはじめてみよう。
Ypsilonにあるguardの実装を試してみようとおもったら、パターンマッチでエラーがでた。
具体的にはこんなパターン。
;; guardの実装で使われていたものの一部
(define-syntax hoge
(syntax-rules (else)
((_ (var clause ... (else clause2 ...)) b1 b2 ...)
(do-something))))
エラーとしてはellipsisが足りないらしい。元々はMIT Scheme由来のものだったので、とりあえず本家でも試してみたが、こけた。一応moshでも試してみたがOKだったので、R6RS的にはOKなんだろうと推測。
ということは、足りない部分を補うか、新たに何とかするしかないということだ。ここは一発気合をいれて実装してみようと思い、まじめに仕様を読むことにした。
要求されているのは以下のとおり。
- P が下線(_)である場合
- P がバターン変数である場合
- P がリテラル識別子であり、マクロの出力に挿入される識別子以外で P と F が両方ともマクロ出力に現れたとき、 F が P と同一の束縛を参照している場合(ふたつの名前風の識別子がどちらも何の束縛も参照しないない場合、すなわち、どちらも未定義である場合も、両方とも同じ束縛を参照しているものと考える)。※1
- P が (P1 ... Pn) の形式でF が n 要素のリストで P1 から Pn に一致する場合
- P が (P1 ... Pn . Px) の形式で F が n 要素以上のリストないしは非真正リストで、最初の n 要素が P1 から Pn に一致し、 n 番目の cdr が Px に一致する場合。
- P が (P1 ... Pk Pe <ellipsis> Pm+1 ... Pn) の形式で、 <ellipsis> が識別子 ... で、かつ F が n 要素のリストで、最初の k 要素が P1 から Pk に一致し、 次の m - k 要素が Pe に一致し、残りの n - m 要素が Pm+1 から Pn に一致する場合。
- P が (P1 ... Pk Pe <ellipsis> Pm+1 ... Pn . Px) の形式で、 <ellipsis> が識別子 ... で、かつ F が n 要素のリストないしは非真正リストで、最初の k 要素が P1 から Pk に一致し、 次の m - k 要素が Pe に一致し、残りの n - m 要素が Pm+1 から Pn に一致し、最後の n 番目の cdr が Px に一致する場合
- P が #(P1 ... Pn) の形式で F が P1 から Pn に一致する n 個の要素のベクタである場合
- P が #(P1 ... Pk Pe <ellipsis> Pm+1 ... Pn) の形式で、 <ellipsis> が識別子 ... で、かつ F が n要素以上のベクタで、その最初の k 要素が P1 から Pk に一致し、次の m - k 要素がそれぞれ Pe に一致し、残りの n - m 要素が Pm+1 から Pn に一致する場合
- P がパターンデータ(リスト、ベクタ、シンボル以外のデータ)であり、 F が equal? 手続きの意味で等しい場合
基本的なパターンマッチの部分は同じで細かい違いは別にすればなんとかなりそうだろうか。
moshはよく知らないが、YpsilonとGaucheはsyntax-rulesで現れたパターンを一度コンパイル(後でパターンマッチがしやすいように情報を集めておくという意味)して、マクロが使用された際にその情報を元に展開していくという方法を取っている。
それとは別にMIT SchemeやChibi Schemeではsyntax-rulesが現れたらそれ自体をS式を返すS式に変換し、展開時には元のS式をマクロ展開用のS式(要するに展開器)に食わせている。
前者はマクロを展開するコンパイラが展開方法を知っていないといけないが、後者はマクロを展開するタイミングだけ知っていれば後はマクロが勝手に展開してくれる。現状Sagittariusは後者の方法を取っている。(なので、Sagittariusには組み込みのマクロというのはない。マクロはS式とコンパイル時の環境をペアで取るλ式に過ぎなかったりする)
とりあえず、パターンの部分の解析からはじめてみよう。
2011-03-22
R6RSのレコード
例外機構を入れようと思ったら、避けて通れなかったので先に実装することになった。
(with-exception-handlerはすでに作ったのに・・・)
とりあえず、仕様書を読むもよく分からん。Ypsilonの実装がかなりシンプルでいい感じなのでそれを参照することにする。
まずは動作確認。
この段階でとりあえず気づいたこととしては、レコードの中身はtupleみたい。
ちなみに、Ypsilonのtupleはかなり気が利いてる仕様で、見た目は単なる配列なんだけど、先頭要素に「type:」ってついたシンボルを指定すると出力時に「type:」以降だけを出力してくれる。あたかもそれが組み込みの型かのように。
話がそれた。実際に(tuple? (make-warning))とすると真を返してくるので、間違いないだろう。
ここで問題になるのはSagittariusにはここまでシンプルかつ高機能な配列はないということ。Generic&Instanceなんて無駄にごてごてした機能はあるんだけど、こいつを使えばいいかな。
とりあえず、やってみるか。
(with-exception-handlerはすでに作ったのに・・・)
とりあえず、仕様書を読むもよく分からん。Ypsilonの実装がかなりシンプルでいい感じなのでそれを参照することにする。
まずは動作確認。
この段階でとりあえず気づいたこととしては、レコードの中身はtupleみたい。
ちなみに、Ypsilonのtupleはかなり気が利いてる仕様で、見た目は単なる配列なんだけど、先頭要素に「type:」ってついたシンボルを指定すると出力時に「type:」以降だけを出力してくれる。あたかもそれが組み込みの型かのように。
話がそれた。実際に(tuple? (make-warning))とすると真を返してくるので、間違いないだろう。
ここで問題になるのはSagittariusにはここまでシンプルかつ高機能な配列はないということ。Generic&Instanceなんて無駄にごてごてした機能はあるんだけど、こいつを使えばいいかな。
とりあえず、やってみるか。
2011-03-18
Dynamic-windがほしい
テストしながらやっているとどうしても例外を捕捉する機構がほしくなる。
というのも、定義ファイルに書いた組み込み関数の中身が間違っていたとき、現状だと例外を投げて、スタックトレースを出力して落ちる。スタックトレースにある程度どこで起きたのか書いてあるんだけど、直して走らせたら次が出てきたときにがっかりする。
そもそも、単体テストを走らせてるのに、テスト中に落ちるのはあまりに不都合な気がする。ここは一発Dynamic-windを実装して、guardとraiseの実装かね。次の目標にしよう。
(算術用の関数がまだ終わってないけど、一段楽したし)
例外周りを整備するということは、今適当に投げてる例外をちょっと整理しないとなぁ。R6RS的には例外はいくつかの階層を持ってるみたいだし。その辺も考えないと。本当に先が長い。
というのも、定義ファイルに書いた組み込み関数の中身が間違っていたとき、現状だと例外を投げて、スタックトレースを出力して落ちる。スタックトレースにある程度どこで起きたのか書いてあるんだけど、直して走らせたら次が出てきたときにがっかりする。
そもそも、単体テストを走らせてるのに、テスト中に落ちるのはあまりに不都合な気がする。ここは一発Dynamic-windを実装して、guardとraiseの実装かね。次の目標にしよう。
(算術用の関数がまだ終わってないけど、一段楽したし)
例外周りを整備するということは、今適当に投げてる例外をちょっと整理しないとなぁ。R6RS的には例外はいくつかの階層を持ってるみたいだし。その辺も考えないと。本当に先が長い。
2011-03-17
なんだか本体以外が充実していく
本体が全然進まないのに周りが進んでいく感じだ。
とりあえず横道にそれた便利ツールとして、
これをやったおかげでDirect Threaded Codeの実装が簡単にできそうだったのでついでに実装。どれくらい早くなったのかは分からないけど、とりあえずGaucheとの速度比較。
マシンスペック: ThinkPad X60 Core Duo 1.6GHzくらい?
ベンチマークプログラム: たらいの12, 6, 0
結果:
$ time ./build/sash.exe test3.scm
./build/sash.exe test3.scm 3.52s user 0.01s system 98% cpu 3.601 total
$ time gosh test3.scm
gosh test3.scm 2.91s user 0.01s system 99% cpu 2.934 total
以前と思うと少し差が縮まったか?(でも、以前はGCCの最適化オプションをデバッグのために切ってたから微妙かも)
二つ目のはコンパイルするたびに何かしら(今のところR6RSのライブラリだが)を足していたのだが、いちいち目視で確認するのがイヤになったので、簡単なのでいいから作るかと思って作った。最初は完全R6RSの範囲内で書けるようにしてたけど、諸事情によりSagittarius(というかexplicit renamingに)依存になってる。
一応機能としては、テスト結果と失敗したテストを表示する(そのままは表示されないけど、数値とか)
あと、bitwiseな計算とかがちらほらサポートされたかな。
syntax-caseの実装をとりあえず後回しにして、進められそうなところから進めてる。しかし、R6RSは標準のライブラリがかなり巨大で実装にちょっと辟易してきた・・・orz
でも負けないもん!!
とりあえず横道にそれた便利ツールとして、
- VMインストラクションの定義から実装を自動生成する仕組み
- 簡単なユニットテストフレームワーク
これをやったおかげでDirect Threaded Codeの実装が簡単にできそうだったのでついでに実装。どれくらい早くなったのかは分からないけど、とりあえずGaucheとの速度比較。
マシンスペック: ThinkPad X60 Core Duo 1.6GHzくらい?
ベンチマークプログラム: たらいの12, 6, 0
結果:
$ time ./build/sash.exe test3.scm
./build/sash.exe test3.scm 3.52s user 0.01s system 98% cpu 3.601 total
$ time gosh test3.scm
gosh test3.scm 2.91s user 0.01s system 99% cpu 2.934 total
以前と思うと少し差が縮まったか?(でも、以前はGCCの最適化オプションをデバッグのために切ってたから微妙かも)
二つ目のはコンパイルするたびに何かしら(今のところR6RSのライブラリだが)を足していたのだが、いちいち目視で確認するのがイヤになったので、簡単なのでいいから作るかと思って作った。最初は完全R6RSの範囲内で書けるようにしてたけど、諸事情によりSagittarius(というかexplicit renamingに)依存になってる。
一応機能としては、テスト結果と失敗したテストを表示する(そのままは表示されないけど、数値とか)
あと、bitwiseな計算とかがちらほらサポートされたかな。
syntax-caseの実装をとりあえず後回しにして、進められそうなところから進めてる。しかし、R6RSは標準のライブラリがかなり巨大で実装にちょっと辟易してきた・・・orz
でも負けないもん!!
2011-03-07
マクロのシグネチャを変更
(書いてたのが手違いで消えたので2回目。萎える)
define-syntaxが取る式のシグネチャを変更した。今まで2つの引数を必要としていたのに対し、1つの引数を取ることにした。ただ、S式とコンパイル時環境のペアにしただけではあるが、明示的に何が来ているのか分かりにくくなったというデメリットもある。まぁ、生のマクロをいじることはそうないだろうと思うのであまり関係はないが。
これに伴って、今まで構文キーワードだったer-macro-transformerが単なるクロージャに格下げ(?)となった。これはchibi-schemeで実装されていたマクロ変換器からアイデアをもらっている。
これらの変更をしていたので全然syntax-caseの実装が進んでいないが、パターンの解析、マッチング部分の構成、出力部の構成はsyntax-rulesの実装が流用できると思っている。問題となるのは、syntax-caseは構文オブジェクトを返す必要があるということ。
構文オブジェクト自体はあるのだが、それが返っても今の段階ではなんの意味もない。その辺を考える必要がある。
しかし、syntax-rulesが動くので、どっかからexpander(psyntaxとか)を拾ってきてしまおうかという誘惑に駆られる。いかんいかん。
define-syntaxが取る式のシグネチャを変更した。今まで2つの引数を必要としていたのに対し、1つの引数を取ることにした。ただ、S式とコンパイル時環境のペアにしただけではあるが、明示的に何が来ているのか分かりにくくなったというデメリットもある。まぁ、生のマクロをいじることはそうないだろうと思うのであまり関係はないが。
これに伴って、今まで構文キーワードだったer-macro-transformerが単なるクロージャに格下げ(?)となった。これはchibi-schemeで実装されていたマクロ変換器からアイデアをもらっている。
これらの変更をしていたので全然syntax-caseの実装が進んでいないが、パターンの解析、マッチング部分の構成、出力部の構成はsyntax-rulesの実装が流用できると思っている。問題となるのは、syntax-caseは構文オブジェクトを返す必要があるということ。
構文オブジェクト自体はあるのだが、それが返っても今の段階ではなんの意味もない。その辺を考える必要がある。
しかし、syntax-rulesが動くので、どっかからexpander(psyntaxとか)を拾ってきてしまおうかという誘惑に駆られる。いかんいかん。
2011-03-05
マクロの問題
syntax-caseを実装していて困った問題に気づいた。
問題の本質を指すコード
実装の問題になると思うのだが、Sagittariusではdefine-syntaxというキーワードはマクロかクロージャのどちらかを取る様にしてある。(以前は何でも取れた)
こんなのでも、特に問題なく動く。
(ちなみに、クロージャが取れるようにしたのはsyntax-caseを実装するためにこの構文が必要だっただけ)
syntax-rulesもライブラリで実装している今、まじめにdefine-syntaxについて何か考えるときなのかもしれない。
R6RSでこれが問題ないならあんまり気にしなくてもいいのに↓
syntax-case、かなりいいところまで行ったような気がしたけどやり直しだ・・・
問題の本質を指すコード
(define-syntax hoge
(lambda (x)
(er-macro-transformer
(lambda (form rename compare)
(display x)
`(display ,form)))))
一見特に問題ないように見えるが、ここで「x」はer-macro-transformerからは見えない。理由はいたって簡単で、er-macro-transformerの後ろに来たλ式は、それだけでコンパイルされるからである。でも、S式から中間式に変換する段階では見えているので、「x」は大域変数としては扱われない。束縛変数か、自由変数から探そうとしてこける。実装の問題になると思うのだが、Sagittariusではdefine-syntaxというキーワードはマクロかクロージャのどちらかを取る様にしてある。(以前は何でも取れた)
こんなのでも、特に問題なく動く。
(define-syntax hoge
(lambda (a b c d e)
(+ a b c d e)))
(hoge 1 2 3 4 5) ; -> 15
おそらくこの辺が問題なのだと思う。(ちなみに、クロージャが取れるようにしたのはsyntax-caseを実装するためにこの構文が必要だっただけ)
syntax-rulesもライブラリで実装している今、まじめにdefine-syntaxについて何か考えるときなのかもしれない。
R6RSでこれが問題ないならあんまり気にしなくてもいいのに↓
(define-syntax hoge
(syntax-case ()
((...))))
あぁ、でもこれじゃwith-syntaxの実装とかできなくなるのね。というか、syntax-caseってそれ自体はたんなるマッチングみたいなのか、引数取るし。syntax-case、かなりいいところまで行ったような気がしたけどやり直しだ・・・
2011-03-04
syntax-caseの実装
結局MIT Schemeのsyntax-rulesの実装を移植して現在syntax-rulesとsyntax-caseを実装中。
syntax-rulesはYpsilonのストレステストが動かないが(正しくマクロのマッチングが行われない)、まぁ通常用途には使える程度に動いてる。
っで、syntax-caseなのだが、とりあえず、動作結果を確認するために以下のようなものをYpsilonに喰わせてみた。
(fuga 1 2 3)
((1 (1 2 3)) (2 (1 2 3)) (3 (1 2 3)))
これが意味するところとしては、マクロ内で定義された構文オブジェクト意外はマクロ展開時に実行されているということ。
っで、macro-expandの部分を%macroexpandに変更してSagittariusにも喰わせてみると。こんな感じ。
問題はいくつかあって、
後者はどうしようかねぇ。考えるか。
syntax-rulesはYpsilonのストレステストが動かないが(正しくマクロのマッチングが行われない)、まぁ通常用途には使える程度に動いてる。
っで、syntax-caseなのだが、とりあえず、動作結果を確認するために以下のようなものをYpsilonに喰わせてみた。
(import (rnrs))
(define-syntax fuga
(lambda (x)
(syntax-case x ()
((_ r ...)
(begin
(display x)(newline)
(syntax
(list '(r (r ...)) ...)))))))
(display (macro-expand (fuga 1 2 3)))
で、結果はこんな感じ(fuga 1 2 3)
((1 (1 2 3)) (2 (1 2 3)) (3 (1 2 3)))
これが意味するところとしては、マクロ内で定義された構文オブジェクト意外はマクロ展開時に実行されているということ。
っで、macro-expandの部分を%macroexpandに変更してSagittariusにも喰わせてみると。こんな感じ。
(begin (display x) (newline) (#<syntax list> (#<syntax quote> (1 (1 2 3))) (#<syntax quote> (2 (1 2 3))) (#<syntax quote> (3 (1 2 3)))))ここから察するに、もう一段階実行してやって、構文オブジェクトで包まれてる部分を取り除いてやればよさそうだ。
問題はいくつかあって、
- コンパイラは構文オブジェクトを見つけた際に、(組み込みかユーザー定義かの差はあるが)マクロ展開を行おうとする
- もう一段階実行した際に、構文オブジェクト以外の部分がコンパイル実行されるため、たとえばシンボルをリストにしようとした際にVMがエラーを通知する
後者はどうしようかねぇ。考えるか。
2011-03-02
プロジェクトホスティング
GoogleのCode Hostingサービスを利用しだした。
まだ、0.0.1にも届いていないが、ちょっと不便になってきたので。
場所はここです。興味があれば。
名前はSagittariusです。
未だにsyntax-caseの実装に戸惑っているが、とりあえず、組み込みのマクロはexplicit renaminig一本にして、syntax-rulesもライブラリとして提供するようにした。
おかげで、マクロ(syntax-rules)使うとコンパイルが遅いが・・・まぁ、それはそのうち何とかしよう。
基本的にsyntax-rulesのパターンマッチとsyntax-caseのパターンマッチは同じなはずなので、流用できるのではないかと考えている。
っが、Sagittariusのdefine-syntaxは与えられたフォームを特に構文オブジェクトにラップするということをしないので、(syntax '(let ...))とかって構文が困るんだよね。というか、syntax->datumとかdatum->syntaxとかその辺にかかわる手続きをどうしようかなぁと。syntax-case構文内だけで使うってことなら、er-macro-transformerのcompareとかrenameをごにょごにょすればいいかなとかも思うけど、そうもいかないよなぁ。
そうそう、
かっちょいいロゴ作ってくれる人募集中です。
あと、syntax-caseを実装してくれる方も絶賛募集中ですw
まだ、0.0.1にも届いていないが、ちょっと不便になってきたので。
場所はここです。興味があれば。
名前はSagittariusです。
未だにsyntax-caseの実装に戸惑っているが、とりあえず、組み込みのマクロはexplicit renaminig一本にして、syntax-rulesもライブラリとして提供するようにした。
おかげで、マクロ(syntax-rules)使うとコンパイルが遅いが・・・まぁ、それはそのうち何とかしよう。
基本的にsyntax-rulesのパターンマッチとsyntax-caseのパターンマッチは同じなはずなので、流用できるのではないかと考えている。
っが、Sagittariusのdefine-syntaxは与えられたフォームを特に構文オブジェクトにラップするということをしないので、(syntax '(let ...))とかって構文が困るんだよね。というか、syntax->datumとかdatum->syntaxとかその辺にかかわる手続きをどうしようかなぁと。syntax-case構文内だけで使うってことなら、er-macro-transformerのcompareとかrenameをごにょごにょすればいいかなとかも思うけど、そうもいかないよなぁ。
そうそう、
かっちょいいロゴ作ってくれる人募集中です。
あと、syntax-caseを実装してくれる方も絶賛募集中ですw
2011-03-01
まぁここは英語圏ではないのだが
Island Life - [i]と[iː] を読んでちょっと思ったこと。(1年前の記事だが)
個人的に[i]と[iː]の違いは長母音と短母音の差だと思う。BBC Learning Englishにきっちりshort vowelsとlong vowelsに分けられているので。
少なくとも、上記のBBCから辿れる発音の講座で見られるビデオでは長いか短いかくらいしか差がないような気がする。
(個人的にイとエの中間は、eを逆さにした記号で表されるやつ(schwa)だともう。これは弱母音なので、慣れるまで発音が激ムズだった。日本語にない母音だし。あ、これはアとエの中間か?)
ここからは、単に僕の経験からなのだが、アメリカンとブリティッシュで母音の発音がかなり違うと思う。
(まぁ、聞けばすぐ分かるレベルでいろいろ違うので、言うまでもないのだが)
こっちに来てから毎年のようにフロリダに旅行で行っているのだが、そこでは、以前にも書いたが、僕の英語は割と通じない。それは、アメリカ人が自分たちの訛しか理解しないだけではなく、僕の話す英語がアメリカンではなくなってきていることにもあるのかもしれない。
(と言って、ブリティッシュというわけでもないが)
例えば、「hot」はこっちではそのまま「ホット」で通じるがアメリカ(南部訛?)だと「ハット」に近い感じにしないと店員さんは分かってくれない。
(前にも書いたなこのネタ)
そもそも、多国籍な会社で共用語として話される英語なので比較にならないが、正直だれもそんな発音の違いをつけてないと思う。ロンドン出身のイギリス人も会社にいるが、fishを「ふぇっしゅ」に近い発音で喋るようには聞こえないなぁ。
話がまとまらなくなってきた。結局言いたいことは、ここでは[i]と[iː]の違いは短いか長いかの差だということです。
[i]と[iː]の発音の癖が抜けない。つい、「イ」と「イー」で発音してしまう。実際は、音の長さではなく、[i]の方が「イ」と「エ」の中間、というかゆるい感じで、 [iː]は緊張した「イ」なんだけど、知識として知っててもうまく出てこない。
個人的に[i]と[iː]の違いは長母音と短母音の差だと思う。BBC Learning Englishにきっちりshort vowelsとlong vowelsに分けられているので。
少なくとも、上記のBBCから辿れる発音の講座で見られるビデオでは長いか短いかくらいしか差がないような気がする。
(個人的にイとエの中間は、eを逆さにした記号で表されるやつ(schwa)だともう。これは弱母音なので、慣れるまで発音が激ムズだった。日本語にない母音だし。あ、これはアとエの中間か?)
ここからは、単に僕の経験からなのだが、アメリカンとブリティッシュで母音の発音がかなり違うと思う。
(まぁ、聞けばすぐ分かるレベルでいろいろ違うので、言うまでもないのだが)
こっちに来てから毎年のようにフロリダに旅行で行っているのだが、そこでは、以前にも書いたが、僕の英語は割と通じない。それは、アメリカ人が自分たちの訛しか理解しないだけではなく、僕の話す英語がアメリカンではなくなってきていることにもあるのかもしれない。
(と言って、ブリティッシュというわけでもないが)
例えば、「hot」はこっちではそのまま「ホット」で通じるがアメリカ(南部訛?)だと「ハット」に近い感じにしないと店員さんは分かってくれない。
(前にも書いたなこのネタ)
そもそも、多国籍な会社で共用語として話される英語なので比較にならないが、正直だれもそんな発音の違いをつけてないと思う。ロンドン出身のイギリス人も会社にいるが、fishを「ふぇっしゅ」に近い発音で喋るようには聞こえないなぁ。
話がまとまらなくなってきた。結局言いたいことは、ここでは[i]と[iː]の違いは短いか長いかの差だということです。
2011-02-28
SHA BU SHA BU
こんな名前のレストランがオランダにはある。
名前の由来はもちろん日本のあの料理だ。実際、レストランのサイトには名前の由来はその料理からとったと書いてある。
さて、ここで問題。あなたは日本人(まぁ、ほぼ100%そうだと思うけど)だと仮定します。あなたはこの料理の詳細を知っています。そしてそのレストランを見ました。このレストランの看板メニューを答えなさい。(30点)
・・・
・・・・・・
・・・・・・・・・
時間切れです。あなたの答えは何だったでしょう。まぁ、こんな聞き方をしているのだから、まさか「しゃぶしゃぶ」なんて安易な答えじゃないですよね。
ちなみに、答えは寿司です!!
おかしいだろ!!!どう考えても!!!
久しぶりにしゃぶしゃぶだぁなんてはしゃいで予約いれて、HP見たら寿司がメインかよ!!即行キャンセルだぜ。
とりあえず、中国人経営日本食レストランの寿司は大抵はずれだからというのと、腹具合がいい感じにしゃぶしゃぶ用にセッティングされてたからな!!
お前それ、「四川料理」って銘打ってるのに「北京ダック」だすようなもんじゃね?
他にもいろいろ「KIMONO」とか「SUMO」とか「SAKURA」とか(まぁ桜はいいか)、突っ込みどころが多い名前のレストランがあるが、今回のは食べる前から壮大に裏切られた。
ちなみに、どうしてもしゃぶしゃぶが食べたかったので、自分で作ったとさ。
(牛肉の薄切りが売ってる日本っていいなぁと思いながらね・・・)
名前の由来はもちろん日本のあの料理だ。実際、レストランのサイトには名前の由来はその料理からとったと書いてある。
さて、ここで問題。あなたは日本人(まぁ、ほぼ100%そうだと思うけど)だと仮定します。あなたはこの料理の詳細を知っています。そしてそのレストランを見ました。このレストランの看板メニューを答えなさい。(30点)
・・・
・・・・・・
・・・・・・・・・
時間切れです。あなたの答えは何だったでしょう。まぁ、こんな聞き方をしているのだから、まさか「しゃぶしゃぶ」なんて安易な答えじゃないですよね。
ちなみに、答えは寿司です!!
おかしいだろ!!!どう考えても!!!
久しぶりにしゃぶしゃぶだぁなんてはしゃいで予約いれて、HP見たら寿司がメインかよ!!即行キャンセルだぜ。
とりあえず、中国人経営日本食レストランの寿司は大抵はずれだからというのと、腹具合がいい感じにしゃぶしゃぶ用にセッティングされてたからな!!
お前それ、「四川料理」って銘打ってるのに「北京ダック」だすようなもんじゃね?
他にもいろいろ「KIMONO」とか「SUMO」とか「SAKURA」とか(まぁ桜はいいか)、突っ込みどころが多い名前のレストランがあるが、今回のは食べる前から壮大に裏切られた。
ちなみに、どうしてもしゃぶしゃぶが食べたかったので、自分で作ったとさ。
(牛肉の薄切りが売ってる日本っていいなぁと思いながらね・・・)
2011-02-24
er-macro-transformerでsyntax-caseを実装
まだ使用としているだけだが、とりあえずChibi Schemeのsyntax-rulesが動いた。
以前書いた問題は意外と簡単で(といっても、実装の核にかかわる部分の違いだったので判明するのに少し時間がかかったが)、identifier?の判別の差だった。
Chibi Schemeではidentifier?はsymbolもしくはsyntactic-closureのどちらかも満たすものなのだが、僕の実装系にsyntactic-closureはない。またidentifier自体が一つのScheme型として存在してるので、渡された生S式から取り出したものと、renameされてidentifierに変換されたものとの比較が上手くいってなかった。
とりあえず、compare関数に渡す際にすべてrenameすることにしたが、多分これはcompare関数自体を変更した方がよさそう。現状だと単にeq?で比較なので、symbolとidentifierの比較は確実に偽になる、でもそれだと不便すぎる気がするので、わたってきた値がsymbolとidentifierの混在だったらrenameしてから比較した方がいい気がする。
この実装のいいところ(?)は(おそらく、まだ全部試してないので)srfi 46をデフォルトで実装しているところだと思う。でも、組み込んであるGauche由来のsyntax-rulesに比べるとすごく遅い。おそらく、希望的観測だが、コンパイルが遅いのだと思う。展開は速いと信じたい。(明日試す)
何とか高速化できたら、組み込みのsyntax-rulesをやめてこっちを採用したい。特に意味はないが、組み込みのマクロはer-macro-transformerだけで、残りはライブラリという位置づけにしたい。
問題は、今のところマクロはCに書き出すことができないところか。多分できなくもないんだろけど、やるなら、ちょっと(大分)考えないと。
これを足がかりにsyntax-caseが実装できたら、後は必要なライブラリをそろえるだけ。バージョン0.0.1のリリースも近いか。
以前書いた問題は意外と簡単で(といっても、実装の核にかかわる部分の違いだったので判明するのに少し時間がかかったが)、identifier?の判別の差だった。
Chibi Schemeではidentifier?はsymbolもしくはsyntactic-closureのどちらかも満たすものなのだが、僕の実装系にsyntactic-closureはない。またidentifier自体が一つのScheme型として存在してるので、渡された生S式から取り出したものと、renameされてidentifierに変換されたものとの比較が上手くいってなかった。
とりあえず、compare関数に渡す際にすべてrenameすることにしたが、多分これはcompare関数自体を変更した方がよさそう。現状だと単にeq?で比較なので、symbolとidentifierの比較は確実に偽になる、でもそれだと不便すぎる気がするので、わたってきた値がsymbolとidentifierの混在だったらrenameしてから比較した方がいい気がする。
この実装のいいところ(?)は(おそらく、まだ全部試してないので)srfi 46をデフォルトで実装しているところだと思う。でも、組み込んであるGauche由来のsyntax-rulesに比べるとすごく遅い。おそらく、希望的観測だが、コンパイルが遅いのだと思う。展開は速いと信じたい。(明日試す)
何とか高速化できたら、組み込みのsyntax-rulesをやめてこっちを採用したい。特に意味はないが、組み込みのマクロはer-macro-transformerだけで、残りはライブラリという位置づけにしたい。
問題は、今のところマクロはCに書き出すことができないところか。多分できなくもないんだろけど、やるなら、ちょっと(大分)考えないと。
これを足がかりにsyntax-caseが実装できたら、後は必要なライブラリをそろえるだけ。バージョン0.0.1のリリースも近いか。
2011-02-23
招待状
大学の後輩(とってももう直接のかかわりは無いが)から定演の招待状が届いた。
海外にも送ってくれるのはとても律儀で好感がもてる。
っが、今週末に開かれる演奏会に、今日届いていては招待する気がないとしか思えない。
届くまでに一週間かかったとしても、送ったのが2月14日の週では遅すぎないかね?
っと、こんなところ彼らが見ているわけもないだろうので、あまり意味は無いが。
ま、ちょっとした愚痴です。
(しかし、マジで行く気で3月にチケットとってたら張った押したくなるくらいの仕打ちだわ)
海外にも送ってくれるのはとても律儀で好感がもてる。
っが、今週末に開かれる演奏会に、今日届いていては招待する気がないとしか思えない。
届くまでに一週間かかったとしても、送ったのが2月14日の週では遅すぎないかね?
っと、こんなところ彼らが見ているわけもないだろうので、あまり意味は無いが。
ま、ちょっとした愚痴です。
(しかし、マジで行く気で3月にチケットとってたら張った押したくなるくらいの仕打ちだわ)
2011-02-21
与太話
変換したらこれだったけどいいのか?
皆さんはヨーロッパにどんなイメージをお持ちだろうか?例えばこんなのは僕が昔持っていたイメージ。
さて、順番に幻想を壊していきましょう。と言っても、オランダとベルギー、あとフランスの少しくらいしか知らないので、イギリスは違うとか、ドイツはもっとこうだといわれても反論はできません。突っ込みは大歓迎です。
【お洒落】
待ち行く人々を指すなら、日本人の気合にかなう国はそう多くないでしょう。こっちなんて化粧すらあんまりしてない気がします。男も女も基本ジーンズです。
【金髪美男美女ばかり】
そもそも、移民の歴史があったり、アフリカから奴隷をつれてきた歴史があるので、金髪だけではありません。(ラテン系の人は黒髪だし)。美男美女ばかりでもありません。容姿の偏差値というのは変な感じですが、日本が45~60くらいの間だとしたら、30~70とか幅がある感じです。男は基本掘りが深くて毛深いです。でも、頭髪は意外と少ないので禿がマジで多いです。女性へのコメントは控えます。
【スーツ着てビジネス】
これが意外と北米とかでも勘違いされてると思われる事項です。とりあえずオランダだとスーツ着る人いません。一応商談があるとか会社の偉い人は着てますが、普通の社員はジーンズでOK。楽なもんです。昔カナダにワーホリで行った時のホストマザーが、北米の東の方(モントリオールとか、ニューヨークとか)はヨーロッパ色が強く、ビジネスではスーツが基本、時間に厳しい、なんて行ってましたが、完全に妄想です。少なくともオランダでは。
【モダンな建物】
ニュータウンとか、ビジネス色の強い地域じゃないとそんなもんありません。アムステルダムなんて歴史を感じる建物ぐらいしかないです。まぁ、南駅まで出ればビジネス色のほうが強いので、ワールドトレードセンターとかありますが。僕の働いているロッテルダムはどちらかといえばモダン色が強いですが、やっぱりそうでもないです。
【歴史のある風景】
これは本当。ちょっと有名な都市(ライデンとか)だと歩けばそこに歴史があります。まぁ京都みたいな感じです。ま、そうは言っても古めかしい建物の隣にマクドナルドがあったりとか普通なので、あんまり歴史を感じないかも。
【陸続きなんだから、2,3ヶ国語は当たり前】
人によります。まぁ、そうは言っても英語は大抵の人が喋れると思います、がそれを期待すると裏切られることが多々あります。ヨーロッパの中では一番きれいな英語を喋るという風評があったのですが、1年前くらいにイギリスだかどこかが調査した結果、そうでもないということが実証されたそうです。まぁ、アクセントというか訛はありますね。人の事言えませんが・・・
この中に当てはまる幻想があって、見事に砕かれたならもうヨーロッパなんて怖くありません。(何かを恐れてたのか?)
皆さんはヨーロッパにどんなイメージをお持ちだろうか?例えばこんなのは僕が昔持っていたイメージ。
- お洒落
- 金髪美男美女ばかり
- スーツ着てビジネス
- モダンな建物
- 歴史のある風景
- 陸続きなんだから、2,3ヶ国語は当たり前
ヘ(^o^)ヘ ok. |∧ / / (^o^)/ If you are confident in /( ) what you can, do everything you wish, (^o^) 三 / / > \ (\\ 三 (/o^) < \ 三 ( / / く I would destroy your fuck'n fantasy.(単にこれを言いたかっただけ)
さて、順番に幻想を壊していきましょう。と言っても、オランダとベルギー、あとフランスの少しくらいしか知らないので、イギリスは違うとか、ドイツはもっとこうだといわれても反論はできません。突っ込みは大歓迎です。
【お洒落】
待ち行く人々を指すなら、日本人の気合にかなう国はそう多くないでしょう。こっちなんて化粧すらあんまりしてない気がします。男も女も基本ジーンズです。
【金髪美男美女ばかり】
そもそも、移民の歴史があったり、アフリカから奴隷をつれてきた歴史があるので、金髪だけではありません。(ラテン系の人は黒髪だし)。美男美女ばかりでもありません。容姿の偏差値というのは変な感じですが、日本が45~60くらいの間だとしたら、30~70とか幅がある感じです。男は基本掘りが深くて毛深いです。でも、頭髪は意外と少ないので禿がマジで多いです。女性へのコメントは控えます。
【スーツ着てビジネス】
これが意外と北米とかでも勘違いされてると思われる事項です。とりあえずオランダだとスーツ着る人いません。一応商談があるとか会社の偉い人は着てますが、普通の社員はジーンズでOK。楽なもんです。昔カナダにワーホリで行った時のホストマザーが、北米の東の方(モントリオールとか、ニューヨークとか)はヨーロッパ色が強く、ビジネスではスーツが基本、時間に厳しい、なんて行ってましたが、完全に妄想です。少なくともオランダでは。
【モダンな建物】
ニュータウンとか、ビジネス色の強い地域じゃないとそんなもんありません。アムステルダムなんて歴史を感じる建物ぐらいしかないです。まぁ、南駅まで出ればビジネス色のほうが強いので、ワールドトレードセンターとかありますが。僕の働いているロッテルダムはどちらかといえばモダン色が強いですが、やっぱりそうでもないです。
【歴史のある風景】
これは本当。ちょっと有名な都市(ライデンとか)だと歩けばそこに歴史があります。まぁ京都みたいな感じです。ま、そうは言っても古めかしい建物の隣にマクドナルドがあったりとか普通なので、あんまり歴史を感じないかも。
【陸続きなんだから、2,3ヶ国語は当たり前】
人によります。まぁ、そうは言っても英語は大抵の人が喋れると思います、がそれを期待すると裏切られることが多々あります。ヨーロッパの中では一番きれいな英語を喋るという風評があったのですが、1年前くらいにイギリスだかどこかが調査した結果、そうでもないということが実証されたそうです。まぁ、アクセントというか訛はありますね。人の事言えませんが・・・
この中に当てはまる幻想があって、見事に砕かれたならもうヨーロッパなんて怖くありません。(何かを恐れてたのか?)
2011-02-18
syntax-caseをexplicit renaming macroで実装するには
どうしたらいいのだろう?
自前の処理系にはer-macro-transformerがある。というか、R6RSに準拠することをとりあえずの目標にしているのだが、syntax-caseを実装するのが(個人的に)無理だったので、(まぁ、psyntaxとか他のexpanderに頼ってもよかったのだが)、とりあえず、explicit renaming macroを実装して、それを使ってsyntax-caseを実装するという手をとろうと考えたわけだ。
正直、ここまでは悪くない手だと自分では思っている。Gaucheの川合史朗さんのBlogのエントリーにsyntax-case、explicit renaming macro、それ以外の衛生的マクロ(Syntactic Closureとか)のどれか一つがあれば他のマクロはポータルに実装できるとあるので、後はその実装だけかなぁとは思ってたりするのだが、いかんせん頭が足りない。
Chibi schemeにer-macro-transformerを使ったsyntax-rulesの実装があってそれをとりあえず走らせて見たのだが、どうも動きがおかしい。
例えば、以下のコード
実際、VMのインストラクションを吐かせてみたら、
マクロを展開を試してみて、途中でこける。途中のどこかがおかしいので空のリストがcarに与えられてこける。
Chibi shcemeのsyntax-ruleの基本的な感じとしては、(まじめに追ってないので本当に感じ「feeling」だけだが)、er-macro-transformerでer-macro-transformerを作るといった処理に見える。
あれ、ちょっとまてよ、もしそうだとした、こんな感じのマクロが
でも、自前の処理系だと、マクロの展開は、マクロのコンパイル → コンパイルされたコードの適用 → 展開されたコードのコンパイル、という実行順序なので、2段階コンパイルされるということになる。1段階目でコンパイルされた時は参照(というか変数?)だったシンボルが、2段階目では変数として扱われてるということかな。
なんかちょっと見えてきたかも。試してみよう。
自前の処理系にはer-macro-transformerがある。というか、R6RSに準拠することをとりあえずの目標にしているのだが、syntax-caseを実装するのが(個人的に)無理だったので、(まぁ、psyntaxとか他のexpanderに頼ってもよかったのだが)、とりあえず、explicit renaming macroを実装して、それを使ってsyntax-caseを実装するという手をとろうと考えたわけだ。
正直、ここまでは悪くない手だと自分では思っている。Gaucheの川合史朗さんのBlogのエントリーにsyntax-case、explicit renaming macro、それ以外の衛生的マクロ(Syntactic Closureとか)のどれか一つがあれば他のマクロはポータルに実装できるとあるので、後はその実装だけかなぁとは思ってたりするのだが、いかんせん頭が足りない。
Chibi schemeにer-macro-transformerを使ったsyntax-rulesの実装があってそれをとりあえず走らせて見たのだが、どうも動きがおかしい。
例えば、以下のコード
(define-syntax test
(syntax-rules ()
((_ o)
(display o)
(test)
((_)
(newline))))
(test 'a)
(今ちょっと思い出して書いただけなので、間違いがあるかも)、通常のsyntax-rulesなら実行結果は単に「a」と改行をプリントするのだが、Chibi scheme由来のsyntax-rulesを自前の処理系で走らせると、「unbound variable o」となる。実際、VMのインストラクションを吐かせてみたら、
;; 略 GREF_PUSH o ;; グローバル変数oに束縛された値をスタックに積む GREF_CALL(1) display ;; displayをコール ;; 略なんてことになってて、そりゃ「o」なんてどこにも定義してないからなぁと納得はするのだが、どうしてそうなるのかさっぱり分からない。
マクロを展開を試してみて、途中でこける。途中のどこかがおかしいので空のリストがcarに与えられてこける。
Chibi shcemeのsyntax-ruleの基本的な感じとしては、(まじめに追ってないので本当に感じ「feeling」だけだが)、er-macro-transformerでer-macro-transformerを作るといった処理に見える。
あれ、ちょっとまてよ、もしそうだとした、こんな感じのマクロが
;; something-macroは別のとこで定義
(define-syntax a
(something-macro ()
((_) (do-something))))
こんな感じに(define-syntax a
(er-macro-transformer
(lambda (form rename compare)
;; パターンマッチングの処理とかがあって、最終的に
;; これ↓を呼ぶ
(do-something))))
展開されるということか?でも、自前の処理系だと、マクロの展開は、マクロのコンパイル → コンパイルされたコードの適用 → 展開されたコードのコンパイル、という実行順序なので、2段階コンパイルされるということになる。1段階目でコンパイルされた時は参照(というか変数?)だったシンボルが、2段階目では変数として扱われてるということかな。
なんかちょっと見えてきたかも。試してみよう。
2011-02-10
とりあえず竹内関数を動かしてみた
まだ足りないところが多いが、たらい回してみた。
ソース:
(この段階で速度的に勝てるとは思わん!!)
結果:
自分の
→ 2.62s user 0.00s system 100% cpu 2.607 total
Gauche
→ 0.01s user 0.00s system 1% cpu 0.814 total
Ypsilon
→ 0.01s user 0.00s system 1% cpu 0.755 total
mosh
→ 0.80s user 0.03s system 101% cpu 0.812 total
見方が間違ってなければこの段階で3倍程度遅いか。ダイレクトスレッドコードとか、インストラクションのマージとかまだやれそうなことが山ほどあるので、とりあえずは気にしない。
先にバイトベクターを実装しようか、コアにかかわる部分をこなしてしまおうか。
ちと考えないと。
ソース:
(define (tarai x y z)
(if (<= x y) y
(tarai (tarai (- x 1) y z)
(tarai (- y 1) z x)
(tarai (- z 1) x y))))
(display (tarai 12 6 0))
Cygwinのtimeコマンドで一応ほかの処理系とも比較してみた。(この段階で速度的に勝てるとは思わん!!)
結果:
自分の
→ 2.62s user 0.00s system 100% cpu 2.607 total
Gauche
→ 0.01s user 0.00s system 1% cpu 0.814 total
Ypsilon
→ 0.01s user 0.00s system 1% cpu 0.755 total
mosh
→ 0.80s user 0.03s system 101% cpu 0.812 total
見方が間違ってなければこの段階で3倍程度遅いか。ダイレクトスレッドコードとか、インストラクションのマージとかまだやれそうなことが山ほどあるので、とりあえずは気にしない。
先にバイトベクターを実装しようか、コアにかかわる部分をこなしてしまおうか。
ちと考えないと。
R6RSのシンボル
読み込みの部分でシンボルの解決をどうするか。
R6RSだと以下のシンボルは不正。
「.aa」「|a|」多分ほかにも。
こんな感じのシンボルがほしい場合は、string->symbolで作ってやる必要がある。しかし、ここで個人的には無視できない問題が起きる。
たとえば、ベクターを何らかの型のように使おうとしたとき、最初の要素は型の目印(タグ)にし、残りの要素をプロパティにするといった手法は良くとられるものだと思う。
例えばこんなコード。
ここからが問題で、ではここでこのentityはシリアライズ可能だとしよう。schemeならwriteで書き出してやれば、entityは読み込み可能なS式として書き出される。こんな風に:
せっかくオブジェクトをS式で簡単にシリアライズできるのに、こんなくだらない罠にはまりたくはない。writeで書き出すのはr5rs方式にして、readはYpsilon方式の「#!xxx」でスイッチできるようにした方がいいかもしれない。
そもそも、こんな使い方が間違ってる?
R6RSだと以下のシンボルは不正。
「.aa」「|a|」多分ほかにも。
こんな感じのシンボルがほしい場合は、string->symbolで作ってやる必要がある。しかし、ここで個人的には無視できない問題が起きる。
たとえば、ベクターを何らかの型のように使おうとしたとき、最初の要素は型の目印(タグ)にし、残りの要素をプロパティにするといった手法は良くとられるものだと思う。
例えばこんなコード。
(define (make-entity name desc) (vector (string->symbol ".entity") name desc))
(define (entity? e)
(and (vector? e)
(eq? (vector-ref e 0) (string->symbol ".entity"))))
これに、nameとdescのアクセサと識別用の関数を用意すれば簡易構造体である。ここからが問題で、ではここでこのentityはシリアライズ可能だとしよう。schemeならwriteで書き出してやれば、entityは読み込み可能なS式として書き出される。こんな風に:
#(.entity name desc) ; mosh #(\x2E;entity name desc) ; Ypsilon #(|.entity| name desc) ; r5rsでも、書き出されたこのタグはR6RSでは不正なシンボルなんだ。
せっかくオブジェクトをS式で簡単にシリアライズできるのに、こんなくだらない罠にはまりたくはない。writeで書き出すのはr5rs方式にして、readはYpsilon方式の「#!xxx」でスイッチできるようにした方がいいかもしれない。
そもそも、こんな使い方が間違ってる?
R6RSのライブラリ その5
まさか5つもこのメモが貼り付けられるとは・・・
ライブラリのバージョンに関する話。
R6RSのライブラリは識別子にバージョンリファレンスをつけることができる。そうこんな感じで。
import時に比較ができる、たとえばバージョン1以上とか、ということは、複数の同一識別子、別バージョンのライブラリを持つことも可能なのだろうか?
R6RSのSection 7.1に、
ということは、処理系が許せばライブラリをバージョン違いで複数定義することが可能なのだろうか?
調べてみた。
例によって使用した処理系は、Petite chez scheme(7.9.4), Ypsilon(0.9.6-update3), nmosh(0.2.6)。そのうちikarusとかも試してみたいがそれは後回し。
使用したプログラム:
バージョンの違う同一ライブラリを同時に読み込むということが実際ありえるかというと、こんなテストでもない限りありえないとは思う。そういう意味では、nmosh(おそらくSRFI-72を拡張したexpanderを使用しているscheme処理系)は現実解としてバージョンを無視。petite、およびYpsilonは同時に読み込める同一名ライブラリを1つとし、リファレンスの比較を行うといったところか。
ちなみに、nmoshで(import (rnrs (5))なんてのを試したところ普通に動いたので、おそらく上記の推測はある程度的を射ていると思う。
(これが動くのをよしとするかは、また別の問題だとは思うが)
nmoshのバージョン無視はさすがにどうかと思うので、改修の少ないpetite、Ypsilon方式で読み込める同一名ライブラリは1つとしよう。これなら現在のLibraryクラスにバージョンを追加してやるだけで済む。
しかし、R6RSには微妙な言い回しが多い気がする。expand時の(for (rnrs) expand)とか。
ライブラリのバージョンに関する話。
R6RSのライブラリは識別子にバージョンリファレンスをつけることができる。そうこんな感じで。
(library (identifier (1)) ...)バージョンは数字のリストである必要があり、import時には比較もできる。なかなかすごい機能だ。
import時に比較ができる、たとえばバージョン1以上とか、ということは、複数の同一識別子、別バージョンのライブラリを持つことも可能なのだろうか?
R6RSのSection 7.1に、
When more than one library is identified by a library reference, the choice of libraries is determined in some implementation-dependent manner.とある。
訳:
もし、2つ以上のライブラリリファレンスが識別された場合、その(ライブラリの)選択は処理系依存によって決定される。
ということは、処理系が許せばライブラリをバージョン違いで複数定義することが可能なのだろうか?
調べてみた。
例によって使用した処理系は、Petite chez scheme(7.9.4), Ypsilon(0.9.6-update3), nmosh(0.2.6)。そのうちikarusとかも試してみたいがそれは後回し。
使用したプログラム:
(library (lib)
(export test)
(import (rnrs))
(define test 'test))
(library (lib (1))
(export test)
(import (rnrs))
(define test 'test-1))
(library (lib (2))
(export test)
(import (rnrs))
(define test 'test-2))
(import (lib (1))(rnrs)) ;; (1)を取ったり、つけたり
(display test)(newline)
結果は見事自分の予想とは違っていて、petite, Ypsilonはライブラリの現在のバージョンと要求バージョンが違うといってエラー。nmoshはtest-2を返してきた、つまりバージョンリファレンス無視。バージョンの違う同一ライブラリを同時に読み込むということが実際ありえるかというと、こんなテストでもない限りありえないとは思う。そういう意味では、nmosh(おそらくSRFI-72を拡張したexpanderを使用しているscheme処理系)は現実解としてバージョンを無視。petite、およびYpsilonは同時に読み込める同一名ライブラリを1つとし、リファレンスの比較を行うといったところか。
ちなみに、nmoshで(import (rnrs (5))なんてのを試したところ普通に動いたので、おそらく上記の推測はある程度的を射ていると思う。
(これが動くのをよしとするかは、また別の問題だとは思うが)
nmoshのバージョン無視はさすがにどうかと思うので、改修の少ないpetite、Ypsilon方式で読み込める同一名ライブラリは1つとしよう。これなら現在のLibraryクラスにバージョンを追加してやるだけで済む。
しかし、R6RSには微妙な言い回しが多い気がする。expand時の(for (rnrs) expand)とか。
2011-02-01
BoehmGCで気になること
BoehmGCを使っていていろいろ気になることが起きてきた。
正直起きてほしくはない、が現実を受け入れる。使い方が悪いのか?
現象としては、おそらく回収されてはいけないメモリが回収されてるっぽい。保守的なGCにもかかわらず!!
正確には静的に置いてあるハッシュテーブルの中身がある回数参照されたあと変な値になるというもの。
詳しく調べてないし、GDBで確認するのと普通の流すので結果が変わるので調べ難い(ひどい話である)ので、断言はできないが。
DLL内でGC_INIT()を呼んで、exeメインのファイルでもGC_INIT()を呼んでいるが、これがまずいのか、それともCygwinでは静的に置いた値に対して特別な処置がいるのか、どっちかは分からない。
涙が出そうになったのでデバッグを適当に切り上げてしまった。続きはまた明日。
どうでもいい話だが、どうやってポインタが指すポインタを判別してるんだろう?
例えば
こんな感じ?
仮に、BoehmGCがこんな感じのことをしてたとして、誤回収が起きるのはどうしてだろう?もしくは、メモリを中身を書き換えてるのかも?
ソース読めば早いのだろうが、あれを読んで理解するのはかなり大変だよなぁ・・・そこまで時間をかけたくないし、なんかいい解決方法ないだろうか?
正直起きてほしくはない、が現実を受け入れる。使い方が悪いのか?
現象としては、おそらく回収されてはいけないメモリが回収されてるっぽい。保守的なGCにもかかわらず!!
正確には静的に置いてあるハッシュテーブルの中身がある回数参照されたあと変な値になるというもの。
詳しく調べてないし、GDBで確認するのと普通の流すので結果が変わるので調べ難い(ひどい話である)ので、断言はできないが。
DLL内でGC_INIT()を呼んで、exeメインのファイルでもGC_INIT()を呼んでいるが、これがまずいのか、それともCygwinでは静的に置いた値に対して特別な処置がいるのか、どっちかは分からない。
涙が出そうになったのでデバッグを適当に切り上げてしまった。続きはまた明日。
どうでもいい話だが、どうやってポインタが指すポインタを判別してるんだろう?
例えば
typedef struct a
{
int tag;
void *addr;
} A;
int main()
{
A *ap = GC_MALLOC(sizeof(A)); /* (1) */
char *strp = GC_MALLOC(10);
ap->tag = 1;
ap->addr = strp; /* (2) */
return 0;
}
プログラムに意味は無いが、こんなのがあった場合、(1)はいいだろう、スタックから辿れる。(2)はもしapがどこかで作られたものなら、strpのスタック上のアドレスは完全に消える。この場合、struct Aの中身を1byteもしくはalignのサイズ(例えば2byte)ずつ見ていき、GCが抱えるヒープ上のアドレスを保持しているかどうかというのを見るのだろうか?こんな感じ?
void follow(void *obj, size_t size)
{
uintptr_t addr = (uintptr_t)obj;
int i;
for (i = 0; i < size; i++) {
void *p = (void*)(addr + i);
/* p が指すアドレスの先がヒープを指しているか? */
if (in_heap(*p)) {
/* ヒープは割り付けたメモリのサイズを管理する */
follow((void*)*p, get_size_from_heap_header(*p));
}
}
}
これなら一応アドレスを辿れそうに見える、試してないけど。仮に、BoehmGCがこんな感じのことをしてたとして、誤回収が起きるのはどうしてだろう?もしくは、メモリを中身を書き換えてるのかも?
ソース読めば早いのだろうが、あれを読んで理解するのはかなり大変だよなぁ・・・そこまで時間をかけたくないし、なんかいい解決方法ないだろうか?
2011-01-30
エレヴェン
まずはこの動画を見てほしい。
いや、最先端だね。音声認識エレベーターとは。
でもスコティッシュアクセントには対応していなかったようだ。
これを同僚に見せられたときは思わず大爆笑してしまった。
うちの会社のCEOとマネージャーの一人はスコットランド人だけどね!!
いや、最先端だね。音声認識エレベーターとは。
でもスコティッシュアクセントには対応していなかったようだ。
これを同僚に見せられたときは思わず大爆笑してしまった。
うちの会社のCEOとマネージャーの一人はスコットランド人だけどね!!
2011-01-15
LinuxをUSBからインストール
をするための準備の話。
ちょっと古めのデスクトップが転がってて、OSが入ってない。Windowsはもちろんない。ということで、Linuxを入れようと思ったのだが、現在使ってるノートPCにはCDROMがない。
っでちょっと調べてみたらUSBからインストールできるらしい。ということでブータブルUSBを作成する。
手順。
他にも、UNetbootinってツールも試したけど、こいつにはひどい目に合わされた。バージョンが悪いのか(最新版だけど)、そもそもCDイメージをUSBにコピーするだけのツールなのか知らないけど、ブータブルなUSBならない。
これで上手くいったらSSDを買って自分のノートにLinuxを入れよう。
(その前に死んだバッテリーを換えないと。ACアダプタ抜いたら即死ぬノートPCってノートの魅力0なんですけど)
ちょっと古めのデスクトップが転がってて、OSが入ってない。Windowsはもちろんない。ということで、Linuxを入れようと思ったのだが、現在使ってるノートPCにはCDROMがない。
っでちょっと調べてみたらUSBからインストールできるらしい。ということでブータブルUSBを作成する。
手順。
- syslinuxを落としてくる。
- DAEMON Tool Liteを落としてインストール。
- Linuxのisoイメージを落とす。
- 3.を2.のツールでマウントして、中身をUSBドライブにコピー。
- USBドライブにisolinuxってフォルダがあるので、それをsyslinuxに変更。
- 5.のフォルダの中にisolinux.cfgというファイルがあるので、syslinux.cfgに変更
- syslinux.exeを叩く。(syslinux.zipで落としたなら、中のwin32フォルダにある)
C:\> syslinux.exe -maf F:
(F: はUSBドライブ名。これをC:とか自分のHDDにすると多分えらいことになる)
本当は-maでいいんだと思うけど、僕のUSBはリムーバブルと認識されてなくて、強制書き換えの-fが必要だった。
他にも、UNetbootinってツールも試したけど、こいつにはひどい目に合わされた。バージョンが悪いのか(最新版だけど)、そもそもCDイメージをUSBにコピーするだけのツールなのか知らないけど、ブータブルなUSBならない。
これで上手くいったらSSDを買って自分のノートにLinuxを入れよう。
(その前に死んだバッテリーを換えないと。ACアダプタ抜いたら即死ぬノートPCってノートの魅力0なんですけど)
2011-01-12
ワイド文字列
いろいろやってて壁にぶち当たった・・・
C言語で文字列を扱うことがこんなに面倒だとは、知ってたけど改めて痛感。
char = 1 byteはいいとして、
wchat_t != 4 byte ってか処理系依存って結構厳しい。
UCS4を内部エンコードに使いたかった(すでに過去形)のだが、WindowsのVCとCygwin GCCだとwchat_tは2byte。(Linuxだと4byteらしいけど、試してない)
マクロで
そもそも
あと、C内部で文字列を扱う際に、C文字列からUCS4変換する必要が出てくるので、文字列のコピーがどうしても必要になり、アロケーションが走る。使い捨ての文字列とかにアロケーションは走ってほしくない。
Ypsilon方式にするか。ファイルのエンコーディング -> UCS4(中間表現) -> UTF8(内部文字列)とするとCで使ってる文字列はそのまま流用できそう。
改修がすごく広範囲にわたるが今のうちにやったほうがいいだろうなぁ。
C言語で文字列を扱うことがこんなに面倒だとは、知ってたけど改めて痛感。
char = 1 byteはいいとして、
wchat_t != 4 byte ってか処理系依存って結構厳しい。
UCS4を内部エンコードに使いたかった(すでに過去形)のだが、WindowsのVCとCygwin GCCだとwchat_tは2byte。(Linuxだと4byteらしいけど、試してない)
マクロで
typedef wchar_t ucs4char; #define UC(str) L##strなんてことしたかったんだけど、無理になった・・・orz
そもそも
typedef int32_t ucs4char; /* 符号付 4byte(EOFは大抵-1だし) */
static const ucs4char msg[4] = {0x3042, 0x3044, 0x3046 0x0}; /* あいう */
static const char* cmsg = "abcde";
ってのがアセンブラ上だとなんかあんまり美味しくないようになってる。こんな感じで。L0 .long 0x3042
.long 0x3044
:
_msg .long L0
.def __somewhere
L1 .ascii "abcde\0"
.text
_cmsg .long L1
なんか、静的に配列確保してて(そういう宣言だから当たり前だが)、あんまり静的な文字列な感じがしない。あと、C内部で文字列を扱う際に、C文字列からUCS4変換する必要が出てくるので、文字列のコピーがどうしても必要になり、アロケーションが走る。使い捨ての文字列とかにアロケーションは走ってほしくない。
Ypsilon方式にするか。ファイルのエンコーディング -> UCS4(中間表現) -> UTF8(内部文字列)とするとCで使ってる文字列はそのまま流用できそう。
改修がすごく広範囲にわたるが今のうちにやったほうがいいだろうなぁ。
2011-01-08
Boehm GCを読む
正直涙が出そうになっているが、現在の所分かった(つもりでいる)部分のメモ。
あ、でも
可変構造体にしないのは、最大限にヒープを使うためなのか、可搬性のためなのかどっちなんだろう?
- 基本的な部分
- ヒープとして渡されるポインタはヘッダー情報を保持していない(ある意味当たり前)
- ファイナライザはオブジェクト(ここではポインタ)に持たせず別に管理している(finalizable_objectを格納するハッシュテーブル)
- ヒープ内部はOSのページブロック(基本4KB)ごとに分けられている(ちと不安)
- 曖昧な理解の部分
- GCのヒープはGC_arraysという構造体で一括管理してるっぽい。
- top_indexとかbottom_indexとか2KBくらいの配列を確保してるけど、この中に実際のヒープのヘッダーが入ってるっぽい。
あ、でも
struct hblkhdr
{
struct hblk *hb_next;
struct hblk *hb_prev;
struct hblk *hb_block;
/* 以下略 */
};
struct hblk
{
char hb_body[HBLKSIZE];
};
/* HBLKSIZEは基本4KB */
なんてなってるから、ヘッダーにメタ情報を持たせて(使える領域とか、どんなオブジェクト用かとか、残りブロックサイズとか)、ページブロック以下のサイズのオブジェクトに対してはhb_blockからみ使用部分を割り当てるなんて方法なのかも。可変構造体にしないのは、最大限にヒープを使うためなのか、可搬性のためなのかどっちなんだろう?
2011-01-04
これってOK?
C言語でこんなのって合法?
そのまま見ると1個しかない配列に対して5個入れてるから違法臭いけど、ポインタ自体を書き換えるのであれば合法っぽくもある。
実際、
(いや、仕様書を確認したわけじゃないけど、よく見るテクニックだからそう思ってる。実際char[1]をchar*にするとセグるし、当たり前だが)
ただ、この場合だとポインタを書き換えるのではなく、連続したメモリという扱いになるのかな?
最初のケースだと純粋に書き換えてるから、うっかり鼻から悪魔が出てきても文句が言えなさそうな気はするが。
う~ん。
static int s_value[5] = {1, 2, 3, 4, 5};
struct rec_t {
int v[1];
};
static struct s_rec_t
{
rec_t v[1];
} myth = {
{ s_value }
};
用は構造体の初期化だと思うんだけど、rec_tがint*なら合法なのはいいとして、この場合だとどうなるんだろう?そのまま見ると1個しかない配列に対して5個入れてるから違法臭いけど、ポインタ自体を書き換えるのであれば合法っぽくもある。
実際、
struct string_t
{
int size;
char value[1];
};
---
string_t *s = (string_t*)malloc(sizeof(string_t) + sizeof(char)*10);
strcpy(s->value, "abcdefghi");
s->value[10] = '\0';
なんてのは合法なんだよね。(いや、仕様書を確認したわけじゃないけど、よく見るテクニックだからそう思ってる。実際char[1]をchar*にするとセグるし、当たり前だが)
ただ、この場合だとポインタを書き換えるのではなく、連続したメモリという扱いになるのかな?
最初のケースだと純粋に書き換えてるから、うっかり鼻から悪魔が出てきても文句が言えなさそうな気はするが。
う~ん。
2011-01-01
謹賀新年
あけましておめでとうございます。
旧年はお世話になりました。本年もよろしくお願いいたします。
去年(一昨年からか?)やってる個人プロジェクト、まだあんまり形になってないけど、今年中にはなんらかの形にしたいなぁ。
個人的にもう少しな感じがしてる。(気が変わって作り直しをしなければ。何度やったか・・・)
今年はいい年になりそうな気がする。
旧年はお世話になりました。本年もよろしくお願いいたします。
去年(一昨年からか?)やってる個人プロジェクト、まだあんまり形になってないけど、今年中にはなんらかの形にしたいなぁ。
個人的にもう少しな感じがしてる。(気が変わって作り直しをしなければ。何度やったか・・・)
今年はいい年になりそうな気がする。
2010-12-29
続 C言語でオブジェクト指向
バスに揺られた帰り道に思いついた。
忘れないうちにメモしておこう。
unionを使えばいいのかもしれない。
よくよく考えてみれば、設計の段階で回避できる問題なのだからこんな感じにしたらいけそうな気がする。
(対象はSchemeのポート周り)
(どうせ、そうは行ってもそれぞれのcloseを呼ぶことになりそうな気はするので、もう少し練る必要がありそうだ)
メタクラスも考えたが、一朝一夕ではいい案が出ないのと、Scheme内で使うところまで考えないとオーバースペック(苦労に見合わないとも言う)になりそうなのでとりあえず却下。
(Glib、Gaucheのソースを見たけど結構大変そうだったので。いろいろ魅力的ではあるが、自分の手に余りそうだし、recordを使えば一応クラスっぽいのも定義できるのでという理由)
明日この方向で実装を再開しよう。
ポート周りが終わらないと始まらない辛さ・・・
忘れないうちにメモしておこう。
unionを使えばいいのかもしれない。
よくよく考えてみれば、設計の段階で回避できる問題なのだからこんな感じにしたらいけそうな気がする。
(対象はSchemeのポート周り)
struct Port
{
int type;
int direction;
int (*close)(Port*);
union {
struct BinaryPort *bport;
struct TextualPort *tport;
struct CustomPort *cport;
} impl;
};
typeでバイナリ、テキスト、またはカスタムポートか判別。directionでIN/OUTの判別。実際のポートの実装はimplで行って、closeとかすべてに共通しそうなのは上位に入れる。(どうせ、そうは行ってもそれぞれのcloseを呼ぶことになりそうな気はするので、もう少し練る必要がありそうだ)
メタクラスも考えたが、一朝一夕ではいい案が出ないのと、Scheme内で使うところまで考えないとオーバースペック(苦労に見合わないとも言う)になりそうなのでとりあえず却下。
(Glib、Gaucheのソースを見たけど結構大変そうだったので。いろいろ魅力的ではあるが、自分の手に余りそうだし、recordを使えば一応クラスっぽいのも定義できるのでという理由)
明日この方向で実装を再開しよう。
ポート周りが終わらないと始まらない辛さ・・・
C言語でオブジェクト指向
ただいま絶賛挫折中・・・orz
その昔(といっても2ヶ月くらい前か?)途中で開発方針変えたため放棄したC++のソースをCに移植してる最中でぶつかった壁。
まだぶつかってるので躓いてる壁か?
単一クラス、振る舞いは変わるが継承、多態はないのなら、こんなのでいける。
たとえばこんなの。
この辺まではいいんだよ。昔から使ってたから。問題は継承が絡んでくると意味が分からん。
vtable使うか、メタクラスを別に作って気合でアクセスするか。
(多分、メタクラスを使った方が後々いい気がする。GObjectとかを参考にするか)
くそ、C++でかければこんなことで悩まないのに・・・
みんなDLLが悪いんだ!
その昔(といっても2ヶ月くらい前か?)途中で開発方針変えたため放棄したC++のソースをCに移植してる最中でぶつかった壁。
まだぶつかってるので躓いてる壁か?
単一クラス、振る舞いは変わるが継承、多態はないのなら、こんなのでいける。
typedef struct ObjectRec Object;
struct ObjectRec
{
int x;
int y;
int (*squre)(Object*);
};
こんなことして、適当に関数ポインタに関数を突っ込んでやればいい。たとえばこんなの。
static int realSqure(Object* o)
{
return o->x * o->y;
}
static int fakeSqure(Object* o)
{
return o->x * o->x * o->y * o->y;
}
Object* makeObject(int x, int y)
{
Object* o = (Object*)malloc(sizeof(Object));
o->squre = realSqure;
o->x = x;
o->y = y;
return o;
}
Object* makeFakeObject(int x, int y)
{
Object* o = (Object*)malloc(sizeof(Object));
o->squre = fakeSqure;
o->x = x;
o->y = y;
return o;
}
これで、同じo->squreなのに違う関数にアクセスできる。この辺まではいいんだよ。昔から使ってたから。問題は継承が絡んでくると意味が分からん。
vtable使うか、メタクラスを別に作って気合でアクセスするか。
(多分、メタクラスを使った方が後々いい気がする。GObjectとかを参考にするか)
くそ、C++でかければこんなことで悩まないのに・・・
みんなDLLが悪いんだ!
2010-12-25
クロワロタwwwww
性の6時間を正すために6時間正拳突きをしようと思う。某巨大掲示板に立ったスレをまとめたもの。
クソ笑った。あほすぎる。でも、これ日本にいてリアルタイムで発見したら大阪までスネークに行ってたかもw
いや、どちらかといえばリア充寄りだと思うけどね、僕。
これだけ行動力があるのなら、もう少し建設的なことに使えばいいのに、とも思ったが。
(別に彼女を作るとかじゃなくて、勉強でもいいと思うし、昨今の政治家に対してのデモとか)
でも、個人的には愛するべきあほだと思う。
そうそう、Merry Christmas!
クソ笑った。あほすぎる。でも、これ日本にいてリアルタイムで発見したら大阪までスネークに行ってたかもw
いや、どちらかといえばリア充寄りだと思うけどね、僕。
これだけ行動力があるのなら、もう少し建設的なことに使えばいいのに、とも思ったが。
(別に彼女を作るとかじゃなくて、勉強でもいいと思うし、昨今の政治家に対してのデモとか)
でも、個人的には愛するべきあほだと思う。
そうそう、Merry Christmas!
2010-12-22
C++/Cで書き始めたい
だいぶ自前Schemeがまとまってきたので、そろそろC++かCで書き始めようと思う。
コンパイラ(+その周りのライブラリ)はコンパイルされたコードをC(多分CよりなC++)にコンバートすればいいとして、
(それでも、ライブラリのインポートとか識別子どうしようとか問題はあるけど)
どこまでをCで書いて、どこからをC++で書こうか迷い中。
迷う理由としてはこんな感じ。
(同じコンパイラ使えばいいんだけどね、実際)
2.は要らないといえば要らないが、あるとすっきりかける気がする。慣れの問題だとは思うが。
おそらく問題になりそうな部分としては、オブジェクトの扱いかなと。
結局こいつらをC++で書くと先に書いた、DLLでモジュール作成に支障が出る気がする。
Gaucheは完全にCだが、Ypsilonは一部Cで主にC++で書いてる。
見ればオブジェクトは単なるポインタで、それぞれのオブジェクト、Pairを除く、にヘッダ(単なるunsigned int)を持たせてる。
Moshは全部C++で、オブジェクトはクラスなんだけど、タグと値を保持するだけ。
(まぁ、その他便利関数が入ってるけど)
MoshとYpsilonを混ぜるのが答えになる気がする。
こんな感じで
そもそも、C++のABIがもっとポータルならいいのに。問題の一つは名前マングルにあると思うんだ、うん。
(try-catchの実装とかもそうか・・・)
コンパイラ(+その周りのライブラリ)はコンパイルされたコードをC(多分CよりなC++)にコンバートすればいいとして、
(それでも、ライブラリのインポートとか識別子どうしようとか問題はあるけど)
どこまでをCで書いて、どこからをC++で書こうか迷い中。
迷う理由としてはこんな感じ。
- C++だとバイナリ互換がない、つまりアプリケーション組み込みに向かない
- C++にはtemplate、class、関数オーバーロードなどCにはない機能がある
(同じコンパイラ使えばいいんだけどね、実際)
2.は要らないといえば要らないが、あるとすっきりかける気がする。慣れの問題だとは思うが。
おそらく問題になりそうな部分としては、オブジェクトの扱いかなと。
結局こいつらをC++で書くと先に書いた、DLLでモジュール作成に支障が出る気がする。
Gaucheは完全にCだが、Ypsilonは一部Cで主にC++で書いてる。
見ればオブジェクトは単なるポインタで、それぞれのオブジェクト、Pairを除く、にヘッダ(単なるunsigned int)を持たせてる。
Moshは全部C++で、オブジェクトはクラスなんだけど、タグと値を保持するだけ。
(まぁ、その他便利関数が入ってるけど)
MoshとYpsilonを混ぜるのが答えになる気がする。
こんな感じで
typedef struct ObjectRec
{
uint32_t tag;
void* value; //多分こいつはintptr_tとかにしないとまずい
} Object;
っで、シリアライズ可能なオブジェクトはCで書いて、PortとかシリアライズできそうにないのはC++で書けばいいかな。そもそも、C++のABIがもっとポータルならいいのに。問題の一つは名前マングルにあると思うんだ、うん。
(try-catchの実装とかもそうか・・・)
2010-12-16
続 R6RSのライブラリ その4
理由が全然違うことが発覚した・・・orz
原因はletrec-syntaxでsyntax-rulesにキーワードを入れたら正しく動作しないのが原因だった。
マクロ展開難しすぎる・・・
(ほぼ、Gaucheのを流用してるのになぜ?)
原因はletrec-syntaxでsyntax-rulesにキーワードを入れたら正しく動作しないのが原因だった。
マクロ展開難しすぎる・・・
(ほぼ、Gaucheのを流用してるのになぜ?)
R6RSのライブラリ その4
ライブラリというよりはコンパイラ自身の問題か。
現在自前コンパイラを一つのライブラリにしてコンパイルしようとしている。
コンパイラはGauche上で実装されているので、Gaucheが実行できるコンパイラとそれをR6RSのライブラリにしたコンパイラと2種類ある。
(別に管理するのは面倒なので、cond-expand等を用いてできる限り最小限の重複にしてる、つもり)
っで、ライブラリのコンパイラは一つのライブラリなのにサイズが100KBを超える。多分この辺で問題が発生してる(と思う)。
libraryのコンパイルの順序として、
参照名の解決(不完全実装)、import句の解決、export句の解決、bodyのコンパイルという順番で行っているのだが、
bodyをコンパイルするさ際に、イメージとしてbodyをbeginで包んでからコンパイルしている。
こうすることで1つコンパイル、実行、というのを繰り返さず、全体をコンパイルして実行という感じにできる。
っで、(多分)上記のサイズが問題になってくる。
メモリが足りてないような症状が出てる気がする。というのも中間表現をライブラリ毎にダンプした際に、コンパイラのダンプだけ途中で途切れているからだ。
(本当に途中。ダンプせずに実行するとベクターじゃなく#fだって起こられるのに、ダンプするとぷっつりと死ぬ)
これがWindows版Gaucheだからなのか、そもそもベクターであんまり巨大(といっても目視で16MBしか使ってないけど)なデータを使えない仕様なのかわからない。
解決案は多分いくつかあって、簡単なのでライブラリの分割かな。
ただ、ライブラリを分割するということは、内部にとどめておきたい機能を外部公開する必要がでてくるので、すごく嫌だ。
一つのファイルに複数ライブラリを記述して、参照解決の際の検索方針とかでJava風なライブラリ解決にすれば、実質使えないかもしれないが、ものすごく抵抗がある。
(将来的に直すということにして現状の解決ためということにすればいいのかもしないけど・・・)
さて、どうしたものか。
現在自前コンパイラを一つのライブラリにしてコンパイルしようとしている。
コンパイラはGauche上で実装されているので、Gaucheが実行できるコンパイラとそれをR6RSのライブラリにしたコンパイラと2種類ある。
(別に管理するのは面倒なので、cond-expand等を用いてできる限り最小限の重複にしてる、つもり)
っで、ライブラリのコンパイラは一つのライブラリなのにサイズが100KBを超える。多分この辺で問題が発生してる(と思う)。
libraryのコンパイルの順序として、
参照名の解決(不完全実装)、import句の解決、export句の解決、bodyのコンパイルという順番で行っているのだが、
bodyをコンパイルするさ際に、イメージとしてbodyをbeginで包んでからコンパイルしている。
こうすることで1つコンパイル、実行、というのを繰り返さず、全体をコンパイルして実行という感じにできる。
っで、(多分)上記のサイズが問題になってくる。
メモリが足りてないような症状が出てる気がする。というのも中間表現をライブラリ毎にダンプした際に、コンパイラのダンプだけ途中で途切れているからだ。
(本当に途中。ダンプせずに実行するとベクターじゃなく#fだって起こられるのに、ダンプするとぷっつりと死ぬ)
これがWindows版Gaucheだからなのか、そもそもベクターであんまり巨大(といっても目視で16MBしか使ってないけど)なデータを使えない仕様なのかわからない。
解決案は多分いくつかあって、簡単なのでライブラリの分割かな。
ただ、ライブラリを分割するということは、内部にとどめておきたい機能を外部公開する必要がでてくるので、すごく嫌だ。
一つのファイルに複数ライブラリを記述して、参照解決の際の検索方針とかでJava風なライブラリ解決にすれば、実質使えないかもしれないが、ものすごく抵抗がある。
(将来的に直すということにして現状の解決ためということにすればいいのかもしないけど・・・)
さて、どうしたものか。
2010-12-15
R6RSのライブラリ その3
この話題ばかりだ・・・
展開のフェーズの話。(というよりは依存関係か)
たとえばこのコード
一見何もないように見えるという段階でR6RSのライブラリについて理解してないのだが・・・orz
問題は、subの中で使われているbigger?がフェーズ0でしか参照されないこと。
subが展開されるのはひとつ前のフェーズ1なので、単純にunbound variableな例外を投げてくる。
これを解決するには、bigger?を別ライブラリにして、expandで読み込む必要がある。
まさにこれにはまっていて、
自前実装のコンパイラにライブラリを実装して、R6RSのライブラリにコンバートしてコンパイルなんてことをやっているのだが、
依存関係の解決が面倒くさすぎる。
たとえば、こんなコード
というか、すでに死んでいる・・・
(逆に考えれば、意外と適当に実装したのに、その辺もうまいこと動いているということだが・・・)
これはライブラリの仕組みが悪いのか、Schemeにマクロがあるのが悪いのか(そもそも良い悪いの問題ではないと思うが)
わからないけど、あまり相性が良くない気がする。
プログラマがいろいろなことを気をつければいいのだけど、R5RSで書いてて、R6RSにコンバートするって時に(まさに今)非常に不便・・・
展開のフェーズの話。(というよりは依存関係か)
たとえばこのコード
(library (my-lib)
(export sub)
(import (rnrs))
(define (bigger? x)
(or (> x test)))
(define-syntax sub
(lambda (x)
(syntax-case x ()
((_ a b)
(or (bigger? (syntax->datum #'a))
(syntax (let ((x b))
(- x 10))))))))
(let ()
(sub 10 x)))
このコード、一見何もないように見えるけど、走らせると死ぬ。一見何もないように見えるという段階でR6RSのライブラリについて理解してないのだが・・・orz
問題は、subの中で使われているbigger?がフェーズ0でしか参照されないこと。
subが展開されるのはひとつ前のフェーズ1なので、単純にunbound variableな例外を投げてくる。
これを解決するには、bigger?を別ライブラリにして、expandで読み込む必要がある。
まさにこれにはまっていて、
自前実装のコンパイラにライブラリを実装して、R6RSのライブラリにコンバートしてコンパイルなんてことをやっているのだが、
依存関係の解決が面倒くさすぎる。
たとえば、こんなコード
(define something 10) (define-macro (generate) `(make-vector ,(- something 5))) (define generated (generate))こんな感じのをライブラリにするとなると、somethingは外出しにしないと上記の理由で死ぬ。
というか、すでに死んでいる・・・
(逆に考えれば、意外と適当に実装したのに、その辺もうまいこと動いているということだが・・・)
これはライブラリの仕組みが悪いのか、Schemeにマクロがあるのが悪いのか(そもそも良い悪いの問題ではないと思うが)
わからないけど、あまり相性が良くない気がする。
プログラマがいろいろなことを気をつければいいのだけど、R5RSで書いてて、R6RSにコンバートするって時に(まさに今)非常に不便・・・
2010-12-14
続 R6RSのライブラリ その2
よく考えたら(define id expr)の形式で定義されるidは自前VMだとライブラリをプロパティとして持つので、
そこを参照すればいいことに気づいた。
(もともとそのためのものなので早く気づけよ)
とりあえず、importのforキーワードについてはガン無視することにした。
あまりに理解して無さすぎなのと、明確にマクロ展開時((meta 2)以降はそれ以前になるの?)とコンパイル時と分かれているわけではないので、
実装しても煩雑になる上にあまりメリットが享受できそうになかったから。(単なる言い訳)
いい加減ながらライブラリの実装がほぼ完了。あとはバージョンを残すのみ。
でも、バージョンなんてどう管理すんだ?ということで少し整理。
現在のライブラリの構造。
1は現状の構造をいじる必要があるので、少し大掛かりになりそう(そうでもないが)
あぁ、そもそも、キーを(name version)みたいにして、やればいいのか。
(rnrs (6))みたいな例だと(rnrs (6))ってそのままになるな。
(com hoge fuga)ってのだと、適当にバージョン振る必要があるから、まぁ1だろう、こうなる?(com hoge fuga (1))
ということは、バージョンが無いものに関してはバージョンを振って、あるものはそのままキーにすればいいのか。
っで、参照する際に名前とバージョンを解決すればOKと。
とりあえず、この方法で行ってみよう。
どうでもいい話題で、export-allなんてのを作れないかなとか考えていたのだが、
結構大変そうだなぁということに気づいた・・・
importしたシンボルはまぁいいとして、中で定義されてるのを引っ張り出すのが大変そう・・・
でも、rnrsとかの巨大ライブラリを書くときに、export句に全部書き出すのって大変じゃね?っていうだけの話。
そこを参照すればいいことに気づいた。
(もともとそのためのものなので早く気づけよ)
とりあえず、importのforキーワードについてはガン無視することにした。
あまりに理解して無さすぎなのと、明確にマクロ展開時((meta 2)以降はそれ以前になるの?)とコンパイル時と分かれているわけではないので、
実装しても煩雑になる上にあまりメリットが享受できそうになかったから。(単なる言い訳)
いい加減ながらライブラリの実装がほぼ完了。あとはバージョンを残すのみ。
でも、バージョンなんてどう管理すんだ?ということで少し整理。
現在のライブラリの構造。
top-libraries - 単なるハッシュテーブル
library - name, imported, exported, tableを持つクラス(もしくは構造体)になる予定
(現在は単なるベクター)
構造として
top-libraries = (lib1 => (lib1 instance)
lib2 => (lib2 instance))
こうなってるので、このどこかにバージョンをねじ込む必要がある。
案1:
もう一枚かませる。こんな感じ。
top-libraries = (lib1 => (version1 => (lib1 v1 instance)
version2 => (lib1 v2 instance))
lib2 => (version1 => ... ))
案2:
キーにしてる名前にバージョンをくっつける。
top-libraries = (lib1version1 => (lib1 v1 instance)
lib1version2 => (lib1 v2 instance))
lib2version1 => ... )
案3:
そんなことよりカラオケ行こうぜ!
3は無いとして(当然)、2だと微妙にメモリ消費が少なくなる気がするけど、バージョンマッチで死ぬ気がする。1は現状の構造をいじる必要があるので、少し大掛かりになりそう(そうでもないが)
あぁ、そもそも、キーを(name version)みたいにして、やればいいのか。
(rnrs (6))みたいな例だと(rnrs (6))ってそのままになるな。
(com hoge fuga)ってのだと、適当にバージョン振る必要があるから、まぁ1だろう、こうなる?(com hoge fuga (1))
ということは、バージョンが無いものに関してはバージョンを振って、あるものはそのままキーにすればいいのか。
っで、参照する際に名前とバージョンを解決すればOKと。
とりあえず、この方法で行ってみよう。
どうでもいい話題で、export-allなんてのを作れないかなとか考えていたのだが、
結構大変そうだなぁということに気づいた・・・
importしたシンボルはまぁいいとして、中で定義されてるのを引っ張り出すのが大変そう・・・
でも、rnrsとかの巨大ライブラリを書くときに、export句に全部書き出すのって大変じゃね?っていうだけの話。
R6RSのライブラリ その2
前回の投稿にコメントをいただいて、ちょっと舞い上がっていたり。
(と同時に、Googleか何かの検索エンジンで調べた結果、役立たずなブログにぶつかったぞ、この野郎!と思われてないか不安にもなったり・・・)
自前実装で、簡単なimportとexportを実装したら不思議な現象(いや、原因はわかっているが)に出くわした。
R6RSのライブラリのフェーズの部分というかimport句の部分なの(か?)
前回syntax-caseで書いた部分、
っで、これが実際に呼ばれる部分はmy-lib3内なので、問題が起きる。
(er-macro-transformerをsyntax-caseの代わりに使ってるからかもしれんが・・・)
書いてる途中で、単に名前解決の仕方がおかしいだけということに気づいた。
考えをまとめるのに、何かに書くというのは有効であるw
my-lib3読み込み → マクロ展開※1 → ライブラリコンパイル
という流れで、※1の展開時にmy-lib2内でexportされてないけど必須になるbigger?の解決を行えばいいのだろう。
一時的にmy-lib3内に取り込んで、展開終了時に開放すればいいか?
まじめにフェーズを実装すればいいんだろうけど、大変そうだしなぁ・・・(よく理解してないし。。。)
(と同時に、Googleか何かの検索エンジンで調べた結果、役立たずなブログにぶつかったぞ、この野郎!と思われてないか不安にもなったり・・・)
自前実装で、簡単なimportとexportを実装したら不思議な現象(いや、原因はわかっているが)に出くわした。
R6RSのライブラリのフェーズの部分というかimport句の部分なの(か?)
前回syntax-caseで書いた部分、
(library (my-lib2)
(export sub)
(import (for (my-lib1) expand)
(rnrs))
(define-syntax sub
(er-macro-transformer
(lambda (form rename compare)
(or (bigger? (cadr form))
`(let ((x ,(caddr form)))
(- x 10)))))))
(library (my-lib3)
(export result)
(import (my-lib2)
(rnrs))
(define (result x)
(sub 10 x)))
(import (my-lib3)
(rnrs))
(display (result 10))
my-lib2は展開するためにbigger?をimportしてる。っで、これが実際に呼ばれる部分はmy-lib3内なので、問題が起きる。
(er-macro-transformerをsyntax-caseの代わりに使ってるからかもしれんが・・・)
書いてる途中で、単に名前解決の仕方がおかしいだけということに気づいた。
考えをまとめるのに、何かに書くというのは有効であるw
my-lib3読み込み → マクロ展開※1 → ライブラリコンパイル
という流れで、※1の展開時にmy-lib2内でexportされてないけど必須になるbigger?の解決を行えばいいのだろう。
一時的にmy-lib3内に取り込んで、展開終了時に開放すればいいか?
まじめにフェーズを実装すればいいんだろうけど、大変そうだしなぁ・・・(よく理解してないし。。。)
2010-12-13
R6RSのライブラリ
とりあえず、ここを読んでからR6RSを読んでみた。
まぁ、理解できたが、じゃあ既存の実装はどうなってるの?と思い調べてみた。
調査対象:Petite Chez Scheme、Ypsilon、mosh(nmosh)
調査プログラム
で、結果。
run:
petite: 0
Ypsilon: 0
nmosh: error bigger?がない
expand:
petite: 0
Ypsilon: 0
nmosh: 0
(meta 0):
petite: 0
Ypsilon: 0
nmosh: error bigger?がない
(meta 1):
petite: 0
Ypsilon: 0
nmosh: 0
(meta 2):
petite: 0
Ypsilon: 0
nmosh: error bigger?がない
見た感じとして、Petite、Ypsilonはフェーズ関係をガン無視してるくさい。Shibuya.lisp #2か#3だかの資料によると、バグくさいのも実装したと言っているので、意図的?なものかもしれない。Petiteはよく知らん。
逆にnmoshはこの辺の宣言がきちんとされていないとまずいみたい。これはAndre Van Tonderのexpanderがそういう実装なのだろう。
この辺は仕様書に明確に書いてあるので、nmoshが正解なのだろうが、そんなもの考えてプログラム書きたくないなぁと思うとYpsilon実装にした方がいいのか?
まぁ、理解できたが、じゃあ既存の実装はどうなってるの?と思い調べてみた。
調査対象:Petite Chez Scheme、Ypsilon、mosh(nmosh)
調査プログラム
(library
(my-lib1 (1))
(export bigger?)
(import (rnrs))
(define (bigger? x)
(or (> x 10))))
(library (my-lib2)
(export sub)
(import (for (my-lib1) (meta 1)) ; run expand (meta 0) (meta 1) (meta 2)に適宜変更
(rnrs))
(define-syntax sub
(lambda (x)
(syntax-case x ()
((_ a b)
(or (bigger? (syntax->datum #'a))
(syntax
(let ((x b))
(- 10 b)))))))))
(library (my-lib3)
(export result)
(import (my-lib2)
(rnrs))
(define (result x)
(sub 10 x)))
(import (my-lib3)
(rnrs))
(display (result 10))
こんなの。特に何の意味もないプログラムだが、フェーズを調べるには必要十分なのでOK。で、結果。
run:
petite: 0
Ypsilon: 0
nmosh: error bigger?がない
expand:
petite: 0
Ypsilon: 0
nmosh: 0
(meta 0):
petite: 0
Ypsilon: 0
nmosh: error bigger?がない
(meta 1):
petite: 0
Ypsilon: 0
nmosh: 0
(meta 2):
petite: 0
Ypsilon: 0
nmosh: error bigger?がない
見た感じとして、Petite、Ypsilonはフェーズ関係をガン無視してるくさい。Shibuya.lisp #2か#3だかの資料によると、バグくさいのも実装したと言っているので、意図的?なものかもしれない。Petiteはよく知らん。
逆にnmoshはこの辺の宣言がきちんとされていないとまずいみたい。これはAndre Van Tonderのexpanderがそういう実装なのだろう。
この辺は仕様書に明確に書いてあるので、nmoshが正解なのだろうが、そんなもの考えてプログラム書きたくないなぁと思うとYpsilon実装にした方がいいのか?
2010-12-05
昨日の風景
今日は3度と暖かいので、雪が融けてきてる。いいことだ。
ライデン中央系の様子。
どこが道だか分からんw
近所の川(というか溝というか運河というか)の様子。
どこが水だった場所でしょう?
正解は中央部分。木の柵に見えるのは橋なのでその周りの雪は水だった場所です。
今は融けてるはず。(今日は確認して無いので不明)
今週からは暖かいはずなので、ちょっと一息といったところか。
ライデン中央系の様子。
どこが道だか分からんw
近所の川(というか溝というか運河というか)の様子。
どこが水だった場所でしょう?
正解は中央部分。木の柵に見えるのは橋なのでその周りの雪は水だった場所です。
今は融けてるはず。(今日は確認して無いので不明)
今週からは暖かいはずなので、ちょっと一息といったところか。
2010-12-01
寒い!!
今週くらいから急に、しかもとてつもなく寒くなった。
現在午前7時、気温-6度!!
天気予報によると、風が強いので体感は-20度(!?)くらいらしい。
ようこそミニ氷河期へ。
地球温暖化とはいったいなんだったのか・・・
現在午前7時、気温-6度!!
天気予報によると、風が強いので体感は-20度(!?)くらいらしい。
ようこそミニ氷河期へ。
地球温暖化とはいったいなんだったのか・・・
2010-11-15
メジャーデビュー決まりました
Mixiで変なバトンを踏んだので・・・
これ、マイミクの部分どうすればいいんだよ・・・
しかも、足跡残らねえよ・・・
内容は以下。
☆☆☆☆☆☆☆☆☆☆☆☆
バンドバトン♪♪
見てしまった人は必ずやること♪
足跡に残るので逃げられませんよ♪
タイトルは『メジャーデビュー決まりました』にすること♪
見た以上は必ずコメントすること♪
♪本名は?
⇒外部ブログなのでさすがに伏せさせてくださいm(_ _)m
♪ステージネームは?
⇒ねえよ
♪担当パートは?
⇒Topテナー
♪そのパートを選んだ理由は?
⇒低音が出ないから、High Cとかその辺の音が出る人があんまりいないから
♪メインで使ってる楽器はどんなの?
⇒ファルセットと実声の中間
♪それを選んだ理由は?
⇒高音をきれいに出すにはと試行錯誤した結果、あんまり力まずそこそこ張れるから
♪その楽器のPRポイントは?
⇒High G(ソプラノのG)くらいまでがんばれば出せます(使い物にはならんが・・・)
♪歴はどれくらい?
⇒そろそろ10年か(でも、ここ2年はやってないからもっと少ないか)
♪初めて完コピーした曲は?
⇒ゴスペラーズの星屑の街かな
♪その曲を選んだ理由は?
⇒アカペラの曲で有名なのは少ないのよ
♪憧れのミュージシャンは?
⇒昔はパバロッティ、今は誰だろ?
♪好きなミュージシャンは?
⇒たくさん
♪好きな曲を1曲挙げるとすると?
⇒一曲なんて無理です・・・
♪好きなジャンルは?
⇒最近はHipHopとかも聞くようになったし、おそらく演歌以外すべてかと
でも、あんまり意味不明なジャンルは聞かない
♪今バンド組んでる?
⇒組んでない。
オランダ在住で、アカペラやりたい人やりませんか?w
♪バンド組んでる人はバンド名を教えて下さい
⇒組んでない
♪プロは目指してる?
⇒プロってなに?
♪ライブの失敗談はありますか?
⇒結婚式で歌ったときに、オルガンの演奏がまったく聞こえず、意味不明になった
♪担当パートの楽器にいくらぐらい遣った?
⇒無料、タダ、Free、Gratis
♪生まれ変わってもバンドをやるならパートは何がいい?
⇒楽器を使うパートかな・・・でもアカペラも楽しいんだよね・・・
♪付き合う前の好きな異性をライブに呼んだことはある?
⇒ない
♪その異性とはいい感じになった?
⇒ない
♪その異性と今は?
⇒何の質問だこれ?
♪このバトンを見た人は必ずやらなければなりませんが、中でも特にやってほしいマイミクを5人挙げて下さい
⇒マイミク少ないのに・・・
Rogさん
Zestさん
まっけんじーさん
ラフマさん
うまmiさん
バンド組んでない人は、架空のバンドを想定してくださいm(_ _)m
上三人はB.G.M.でOKだと思います。
♪最後になりますが、音楽は世界を救うと思いますか?
⇒戦闘なんてくだらねぜ、俺の歌を聞け~!!!
こうですか?
以上
☆☆☆☆☆☆☆☆☆☆☆☆
これ、マイミクの部分どうすればいいんだよ・・・
しかも、足跡残らねえよ・・・
内容は以下。
☆☆☆☆☆☆☆☆☆☆☆☆
バンドバトン♪♪
見てしまった人は必ずやること♪
足跡に残るので逃げられませんよ♪
タイトルは『メジャーデビュー決まりました』にすること♪
見た以上は必ずコメントすること♪
♪本名は?
⇒外部ブログなのでさすがに伏せさせてくださいm(_ _)m
♪ステージネームは?
⇒ねえよ
♪担当パートは?
⇒Topテナー
♪そのパートを選んだ理由は?
⇒低音が出ないから、High Cとかその辺の音が出る人があんまりいないから
♪メインで使ってる楽器はどんなの?
⇒ファルセットと実声の中間
♪それを選んだ理由は?
⇒高音をきれいに出すにはと試行錯誤した結果、あんまり力まずそこそこ張れるから
♪その楽器のPRポイントは?
⇒High G(ソプラノのG)くらいまでがんばれば出せます(使い物にはならんが・・・)
♪歴はどれくらい?
⇒そろそろ10年か(でも、ここ2年はやってないからもっと少ないか)
♪初めて完コピーした曲は?
⇒ゴスペラーズの星屑の街かな
♪その曲を選んだ理由は?
⇒アカペラの曲で有名なのは少ないのよ
♪憧れのミュージシャンは?
⇒昔はパバロッティ、今は誰だろ?
♪好きなミュージシャンは?
⇒たくさん
♪好きな曲を1曲挙げるとすると?
⇒一曲なんて無理です・・・
♪好きなジャンルは?
⇒最近はHipHopとかも聞くようになったし、おそらく演歌以外すべてかと
でも、あんまり意味不明なジャンルは聞かない
♪今バンド組んでる?
⇒組んでない。
オランダ在住で、アカペラやりたい人やりませんか?w
♪バンド組んでる人はバンド名を教えて下さい
⇒組んでない
♪プロは目指してる?
⇒プロってなに?
♪ライブの失敗談はありますか?
⇒結婚式で歌ったときに、オルガンの演奏がまったく聞こえず、意味不明になった
♪担当パートの楽器にいくらぐらい遣った?
⇒無料、タダ、Free、Gratis
♪生まれ変わってもバンドをやるならパートは何がいい?
⇒楽器を使うパートかな・・・でもアカペラも楽しいんだよね・・・
♪付き合う前の好きな異性をライブに呼んだことはある?
⇒ない
♪その異性とはいい感じになった?
⇒ない
♪その異性と今は?
⇒何の質問だこれ?
♪このバトンを見た人は必ずやらなければなりませんが、中でも特にやってほしいマイミクを5人挙げて下さい
⇒マイミク少ないのに・・・
Rogさん
Zestさん
まっけんじーさん
ラフマさん
うまmiさん
バンド組んでない人は、架空のバンドを想定してくださいm(_ _)m
上三人はB.G.M.でOKだと思います。
♪最後になりますが、音楽は世界を救うと思いますか?
⇒戦闘なんてくだらねぜ、俺の歌を聞け~!!!
こうですか?
以上
☆☆☆☆☆☆☆☆☆☆☆☆
2010-11-12
syntax-case続き
とりあえず、こういう方針でいこうという考えをまとめておく。
syntax-case自体はコンパイラとは関係ない(ないことはないが)、ライブラリとする。
define-syntaxで定義された構文は変換器を返し、変換器が変換する。
(Gaucheはそうしてると思う。ソース見る限り・・・今のところsyntax-rules限定っぽいけど)
define-syntaxで定義された構文にS式が与えられた場合、構文オブジェクトとしてすべての引数を与える。
こんな感じ?
(print 1 2) -> (transformer syntax-rules '(syntax-object (print 1 2)))
: with-syntaxは略
-> (transformer syntax-case '(syntax-object ...#;多分この辺にsyntax-rulesで作られたtempleteが入る (print 1 2)))
正しいのかよくわからん。その上、どう実装していいのかもよくわからん・・・
syntax-case自体はコンパイラとは関係ない(ないことはないが)、ライブラリとする。
define-syntaxで定義された構文は変換器を返し、変換器が変換する。
(Gaucheはそうしてると思う。ソース見る限り・・・今のところsyntax-rules限定っぽいけど)
define-syntaxで定義された構文にS式が与えられた場合、構文オブジェクトとしてすべての引数を与える。
こんな感じ?
(define-syntax sample
(lambda (x)
(syntax-case x ()
....)))
(sample 1 2 3) ;; <- この1 2 3っていうのがsyntax-caseによって処理されるために構文オブジェクトになる
ということは、マクロを展開する際に、S式をいったん構文オブジェクトにする必要がありそう。
これで、syntax-caseを定義するとすると
(define-syntax syntax-case
(lambda (x)
... ;; いろいろ定義がいりそう?
;; x は構文オブジェクト。matchはAndrew Wrightみたいなの(構文オブジェクトにも対応)
(match x
((_ e ((? literal? literals) ...) clauses ...)
...)))) ;; きっといろいろする
っで、こいつ自体が変換器なので、syntax-rulesはこう書いて
(define-syntax with-syntax
(lambda (x)
(syntax-case x ()
((_ () e1 e2 ...) (syntax (begin e1 e2 ...)))
((_ ((out in)) e1 e2 ...) (syntax (syntax-case in ()
(out (begin e1 e2 ...)))))
((_ ((out in) ...) e1 e2 ...) (syntax (syntax-case (list in ...) ()
((out ...) (begin e1 e2 ...))))))))
(define-syntax syntax-rules
(lambda (x)
(define clause
(lambda (y)
(syntax-case y ()
(((keyword . pattern) template)
(syntax ((dummy . pattern) (syntax template))))
(_
(syntax-violation 'syntax-rules "Invalid expression" x)))))
(syntax-case x ()
((_ (k ...) cl ...)
(for-all identifier? (syntax (k ...)))
(with-syntax (((cl ...) (map clause (syntax (cl ...)))))
(syntax
(lambda (x) (syntax-case x (k ...) cl ...))))))))
syntax-rulesで定義された構文は
構文 -> syntax-rules変換器 -> syntax-case変換器 -> ごにょごにょ
という感じになるはず。
こんなのは
(define-syntax print
(syntax-rules ()
((_ o)
(begin (display o) (newline)))
((_ o1 o2 ...)
(begin
(display o1)(newline)
(print o2 ...)))))
(print 1 2)
こうなる?(print 1 2) -> (transformer syntax-rules '(syntax-object (print 1 2)))
: with-syntaxは略
-> (transformer syntax-case '(syntax-object ...#;多分この辺にsyntax-rulesで作られたtempleteが入る (print 1 2)))
正しいのかよくわからん。その上、どう実装していいのかもよくわからん・・・
syntax-caseの実装
Schemeの話。
マクロの展開を実装しようとした際に、syntax-caseがどうしてもキーワードになる。
これはなんだ?
いや、何かはわかっているんだけど、R6RSの仕様書を見ると、こいつはライブラリだと書かれている。
っで、いろいろなR6RS準拠の処理系で試したところ、
どうもこいつはキーワードっぽい動きをする。(defineとかlambdaとか見たいな)
ということは、組み込みか、(define-syntax ...)で定義されたものかという気がする。
っで、仕様書にはライブラリと書かれている・・・
syntax-rulesとかはsytax-caseで定義できるみたいだが、
syntax-caseはどうやって定義するのだろう?
こんな感じ?
ちなみに、psyntaxはよく知らないけど、
YpsilonとかAndre van Tonderのexpanderとかだと割りと組み込みみたいな書き方してる。
(コンパイラが持ってるわけじゃないからライブラリ?)
細かいこと考えなくてもいい?
う~ん。
マクロの展開を実装しようとした際に、syntax-caseがどうしてもキーワードになる。
これはなんだ?
いや、何かはわかっているんだけど、R6RSの仕様書を見ると、こいつはライブラリだと書かれている。
っで、いろいろなR6RS準拠の処理系で試したところ、
どうもこいつはキーワードっぽい動きをする。(defineとかlambdaとか見たいな)
ということは、組み込みか、(define-syntax ...)で定義されたものかという気がする。
っで、仕様書にはライブラリと書かれている・・・
syntax-rulesとかはsytax-caseで定義できるみたいだが、
syntax-caseはどうやって定義するのだろう?
こんな感じ?
(define-syntax syntax-case
(lambda (form literal rules)
...))
っで、適当にパースすればOK?ちなみに、psyntaxはよく知らないけど、
YpsilonとかAndre van Tonderのexpanderとかだと割りと組み込みみたいな書き方してる。
(コンパイラが持ってるわけじゃないからライブラリ?)
細かいこと考えなくてもいい?
う~ん。
2010-11-05
【尖閣ビデオ】見た!!!!
昨日の夜(といっても日本時間なら午前5時か6時くらい)にYoutubeにアップされていたビデオを見た。
中国は真っ黒です!!
これみて、コツンと当たったとか、日本側が悪いとか言ってるアホ議員がいるということが正直信じられない。
個人的な意見だけど、これ逆の立場だったら中国は最大級の外交カードとして使うだろう。
そもそも、領海侵犯してる漁船が体当たり+逃亡なんてロシアとかアメリカに対してやったら船がこの世から消えてるレベル。
この動画の2分くらいのところから:
明らかにぶつけにきて、かつ逃亡。
こっちの方は海保の船「みずき」が黒煙を上げてる:
これでこんな穴が船体右側に空くわけがない!!!
ってか、仮に先端部が当たってあいたとして、真四角の穴が開くわけないだろ!!
これで船員を釈放した無能議員とか死んでいいんじゃね?
中国は真っ黒です!!
これみて、コツンと当たったとか、日本側が悪いとか言ってるアホ議員がいるということが正直信じられない。
個人的な意見だけど、これ逆の立場だったら中国は最大級の外交カードとして使うだろう。
そもそも、領海侵犯してる漁船が体当たり+逃亡なんてロシアとかアメリカに対してやったら船がこの世から消えてるレベル。
この動画の2分くらいのところから:
明らかにぶつけにきて、かつ逃亡。
こっちの方は海保の船「みずき」が黒煙を上げてる:
これでこんな穴が船体右側に空くわけがない!!!
ってか、仮に先端部が当たってあいたとして、真四角の穴が開くわけないだろ!!
これで船員を釈放した無能議員とか死んでいいんじゃね?
2010-11-02
Infoseekが終了した
まぁ、2ヶ月くらい前から知っていたことではあるが、自分の過去のHPも一緒に消えた。
(メンテナンスしてなかった上に、FTPのパスワード忘れちゃったのでどうにでもなれ状態ではあったが・・・)
困るなぁと思うのは、自分のとは違って有益な情報を載せてるサイトが結構多かったので、移転せずに消えてしまったらいやだなぁということ。
有料のサービスは残るとのことなので、有益サイトがそっちだったらいいなぁ・・・
(メンテナンスしてなかった上に、FTPのパスワード忘れちゃったのでどうにでもなれ状態ではあったが・・・)
困るなぁと思うのは、自分のとは違って有益な情報を載せてるサイトが結構多かったので、移転せずに消えてしまったらいやだなぁということ。
有料のサービスは残るとのことなので、有益サイトがそっちだったらいいなぁ・・・
2010-10-28
Movie: It Could Happen to You(邦題:あなたに降る夢)
1994年なんだこれ・・・
実話をヒントに作られた映画。ジャンルはラブコメでいいのかな?
あらすじと実話は適当にググってください。
感想。ニコラス・ケイジ演じるチャーリーの駄目男っぷりと、その妻の強欲っぷりが素敵な映画。
ブリジット・フォンダ演じるイヴォインヌの薄幸ぶりもかな?
いや、まだ観てるんだけど実は、今のところの感想として、宝くじは結婚してから買っては駄目だね。当たったらいろいろ火種にしかならない気がする。
ってか、ニューヨーカーとマスコミは主人公2人に振り回されすぎ。宝くじが当たったからといってそこまで追跡されんと思うぞ。
(書いてる途中で終わった)
なんというか、女が腐ったような男(イヴォインヌの元夫)とか嫌いなタイプの人間が出てくる映画ってあまり好きじゃなかったり・・・
借金背負わせて逃げたくせに、2億入ったから戻ってくるって、どの面下げて(ryって感じ。
個人的に最後のお約束は要らないんじゃないかなぁとは思った。別に強欲妻は勝ち逃げでもよくね?金手に入れるために裁判して、60過ぎのおじいちゃんと結婚までしたんだから?
ま、お約束がないといかんのだろうけど、ハリウッド映画って。
見る価値は、野郎だけでなら0かな。
実話をヒントに作られた映画。ジャンルはラブコメでいいのかな?
あらすじと実話は適当にググってください。
感想。ニコラス・ケイジ演じるチャーリーの駄目男っぷりと、その妻の強欲っぷりが素敵な映画。
ブリジット・フォンダ演じるイヴォインヌの薄幸ぶりもかな?
いや、まだ観てるんだけど実は、今のところの感想として、宝くじは結婚してから買っては駄目だね。当たったらいろいろ火種にしかならない気がする。
ってか、ニューヨーカーとマスコミは主人公2人に振り回されすぎ。宝くじが当たったからといってそこまで追跡されんと思うぞ。
(書いてる途中で終わった)
なんというか、女が腐ったような男(イヴォインヌの元夫)とか嫌いなタイプの人間が出てくる映画ってあまり好きじゃなかったり・・・
借金背負わせて逃げたくせに、2億入ったから戻ってくるって、どの面下げて(ryって感じ。
個人的に最後のお約束は要らないんじゃないかなぁとは思った。別に強欲妻は勝ち逃げでもよくね?金手に入れるために裁判して、60過ぎのおじいちゃんと結婚までしたんだから?
ま、お約束がないといかんのだろうけど、ハリウッド映画って。
見る価値は、野郎だけでなら0かな。
2010-10-20
寒い!!!
先週くらいから急激に寒くなった。
最低気温が3度とかある・・・
んで、今日は雹が降ってきた!!!
どうやら上空には寒気団があるくさい。
まだ10月なのに冬の到来を感じる。
12月とかになったら氷点下確定コースかなぁ?
-10度とか去年だけのことだと思いたい・・・
最低気温が3度とかある・・・
んで、今日は雹が降ってきた!!!
どうやら上空には寒気団があるくさい。
まだ10月なのに冬の到来を感じる。
12月とかになったら氷点下確定コースかなぁ?
-10度とか去年だけのことだと思いたい・・・
2010-10-15
契約更改の話
僕自身の契約更改は順調に終わり、無事に正社員になったわけだが、
そうでは無い人もいたという話。
実際知ったのは今日(昨日?)なのだが、僕より二週間早く入社した人が8月の段階で契約延長(もしくは正社員になる契約)をしないということだった。
そういえば今週の頭から姿を見てないなぁ、と思っていたらその通知のメールと、PC撤去が同時できた。
(ちなみに、席は僕の目の前)
理由は知らない。あまり一緒に仕事したことはないが(一時期同じプロジェクトにいたくらい)、可もなく不可もなくという感じの仕事ぶりだった気がする。
(個人的には汚いコードを書くなぁとは思っていたが・・・)
まぁ、理由は以下のどれかなのは自明で、
・解雇
・自主退職
ってか大別するとこの2つしかないわけで。
8月の時点ですでに話し合っていたということは、おそらく後者かな?
僕が契約更改の話を受け取ったのは9月に入ってからだし。最近まで何かのプロジェクトに参加してたみたいだし。
もし、解雇だとしたら、当然それは僕だったかもしれなくて、なんて考えるとちょっと複雑な気分であった。
そうでは無い人もいたという話。
実際知ったのは今日(昨日?)なのだが、僕より二週間早く入社した人が8月の段階で契約延長(もしくは正社員になる契約)をしないということだった。
そういえば今週の頭から姿を見てないなぁ、と思っていたらその通知のメールと、PC撤去が同時できた。
(ちなみに、席は僕の目の前)
理由は知らない。あまり一緒に仕事したことはないが(一時期同じプロジェクトにいたくらい)、可もなく不可もなくという感じの仕事ぶりだった気がする。
(個人的には汚いコードを書くなぁとは思っていたが・・・)
まぁ、理由は以下のどれかなのは自明で、
・解雇
・自主退職
ってか大別するとこの2つしかないわけで。
8月の時点ですでに話し合っていたということは、おそらく後者かな?
僕が契約更改の話を受け取ったのは9月に入ってからだし。最近まで何かのプロジェクトに参加してたみたいだし。
もし、解雇だとしたら、当然それは僕だったかもしれなくて、なんて考えるとちょっと複雑な気分であった。
2010-10-01
ハッシュテーブルの検索
超有名なデータ格納の方法の一つ。
諸事情により、自前でハッシュマップとハッシュセットを作る必要があったので、作ってみた。
理論上計算回数がΟ(1)でいけるはずなんだけど、どうもそんな感じがしない。
っで、STLのsetと自作ハッシュセットで比較してみた。
結論だけ言うと、
ハッシュセットは早いけど遅い。
なんのことだ?と思うかもしれないけどそんな感じ。
実装の都合上、衝突が起きた際に得られたハッシュ関数で得られたハッシュ値を増やして空きを探したり、
要素が存在しているか検索しているのだが、これがまずい。
無限の箱があってハッシュ値も衝突がおき得ないのならΟ(1)なんだろうけど、箱は有限。っで箱が50000とか超えた時に、存在しない値の検索をすると、ループが50000回走る。つまりΟ(n)になる。
う~ん、存在する値だとものすごく早くてそれこそΟ(1)に近い値が出るんだけど、う~ん。
衝突時にリストにしてもいいけど、メモリ管理が面倒な気がする・・・う~ん・・・
どうでもいいけど、
「Ο」これ「O(アルファベット)」じゃなくて「Ο(オミクロン)」だったのね。初めて知った^^;
諸事情により、自前でハッシュマップとハッシュセットを作る必要があったので、作ってみた。
理論上計算回数がΟ(1)でいけるはずなんだけど、どうもそんな感じがしない。
っで、STLのsetと自作ハッシュセットで比較してみた。
結論だけ言うと、
ハッシュセットは早いけど遅い。
なんのことだ?と思うかもしれないけどそんな感じ。
実装の都合上、衝突が起きた際に得られたハッシュ関数で得られたハッシュ値を増やして空きを探したり、
要素が存在しているか検索しているのだが、これがまずい。
無限の箱があってハッシュ値も衝突がおき得ないのならΟ(1)なんだろうけど、箱は有限。っで箱が50000とか超えた時に、存在しない値の検索をすると、ループが50000回走る。つまりΟ(n)になる。
う~ん、存在する値だとものすごく早くてそれこそΟ(1)に近い値が出るんだけど、う~ん。
衝突時にリストにしてもいいけど、メモリ管理が面倒な気がする・・・う~ん・・・
どうでもいいけど、
「Ο」これ「O(アルファベット)」じゃなくて「Ο(オミクロン)」だったのね。初めて知った^^;
契約更改
今の職場についてほぼ1年が過ぎようとしている。
契約は最初は1年契約なので、今日契約の更新の面接があった。
結果、無事正社員に昇格!
昇給もしたし、う~ん、いいことだ。
オランダだと一年で正社員になるというのは珍しいらしく、普通はなんだかんだ契約の延長だけというのが間々あるらしい。
マネージャー(日本語に直すとなんだ?部長とかそれ以上?)との面接で、
働きぶりに満足してるし、ここで働いてほしいというようなことも言ってもらえたのだが、
しかし、正直ほとんど何もしてないに近いくらい楽な仕事なのだが、
いいのだろうかと不安になる。
(もちろんやることはやっているのだが、いかんせん楽すぎる)
ま、プログラマは天職なんだということにしておこう。
契約は最初は1年契約なので、今日契約の更新の面接があった。
結果、無事正社員に昇格!
昇給もしたし、う~ん、いいことだ。
オランダだと一年で正社員になるというのは珍しいらしく、普通はなんだかんだ契約の延長だけというのが間々あるらしい。
マネージャー(日本語に直すとなんだ?部長とかそれ以上?)との面接で、
働きぶりに満足してるし、ここで働いてほしいというようなことも言ってもらえたのだが、
しかし、正直ほとんど何もしてないに近いくらい楽な仕事なのだが、
いいのだろうかと不安になる。
(もちろんやることはやっているのだが、いかんせん楽すぎる)
ま、プログラマは天職なんだということにしておこう。
iPhone
いろいろな経緯からiPhoneが今手元にある。
3Gなので一つ前のだ。
PDAかつiPodに電話がついてる感じで、正直もてあましてる感が大きいが今のところ気にいっている。
誰か、お勧めアプリを教えてくれ!
3Gなので一つ前のだ。
PDAかつiPodに電話がついてる感じで、正直もてあましてる感が大きいが今のところ気にいっている。
誰か、お勧めアプリを教えてくれ!
2010-09-26
Cygwinのメモリ
Cygwinだけなのか、Mingwもなのか、そもそもC++の企画なのか分からんけど、メモリの確保ではまった話。
Cygwin上のGCCで(正確にはG++)1M以上のメモリを確保して、そのメモリに生でアクセスしようとしたらセグメンテーションフォールトが起きた。
なんでだろうと思ったが、プログラム全体で見ると動いていたのでとりあえず放置していたのが、やっぱりおかしいよなぁと思って検証してみた。
検証プログラム
実際はtestクラスの詳細はスタティックライブラリにしてある。スタティックライブラリの制限かなとも思ったので。
結果。
そもそも最初のnewで死んでた。
帰ってきたアドレスが、0x7fea0008。完全に死亡アドレスです。
理由は分からんが、アウトなんだろう。
しょうがないのでとりあえずWin32APIのVirtualAllocを使って回避。こっちならOKっぽい。
この制限があると、多き目のメモリープールとか不可能になる気がするが、どうなんだろう?
ってか、一気にメガ単位で確保しちゃ駄目ってこと?
誰か理由教えて(´;ω;`)
2011/10/25 追記
ひょっとしたらこの辺と関係あるかも=>Cygwinのヒープ
Cygwin上のGCCで(正確にはG++)1M以上のメモリを確保して、そのメモリに生でアクセスしようとしたらセグメンテーションフォールトが起きた。
なんでだろうと思ったが、プログラム全体で見ると動いていたのでとりあえず放置していたのが、やっぱりおかしいよなぁと思って検証してみた。
検証プログラム
#include "test-a.h" #includetest-a.hはtestクラスを持ち、そのコンストラクタ内で1Mのメモリをoperator newで確保し、printメソッドでメモリアドレスをプリントする。それだけ。int main() { void* p = (void*)new char[1024* 1024]; printf("%p\n", p); test t; t.print(); test *t2 = new test(); t2->print(); delete t2; return 0; }
実際はtestクラスの詳細はスタティックライブラリにしてある。スタティックライブラリの制限かなとも思ったので。
結果。
そもそも最初のnewで死んでた。
帰ってきたアドレスが、0x7fea0008。完全に死亡アドレスです。
理由は分からんが、アウトなんだろう。
しょうがないのでとりあえずWin32APIのVirtualAllocを使って回避。こっちならOKっぽい。
この制限があると、多き目のメモリープールとか不可能になる気がするが、どうなんだろう?
ってか、一気にメガ単位で確保しちゃ駄目ってこと?
誰か理由教えて(´;ω;`)
2011/10/25 追記
ひょっとしたらこの辺と関係あるかも=>Cygwinのヒープ
2010-09-13
英語の発音について
英語の発音で日ごろ理不尽に感じてることをちょっと書いてみる。
(なんで今更こんなことをとか自分で突っ込み)
同スペル、異発音
Houston:
/ˈhjuːstən/ ≒ ひゅーすとん と発音すればテキサス州の都市(が有名、ほかにもある)
/ˈhaʊstən/ ≒ はうすとん と発音すればニューヨーク市の通りの名前(が有名、ほかにもある)
読みにくい系
simultaneously:
/ˌsī-məl-ˈtā-nē-əs-ly/ ≒ さいみゅるてにあうすりぃ。
ちなみにsimulateは/ˈsim-yə-ˌlāt/ ≒ しみゅれいと だったりする。(個人的に前者は米語だと思ってる)。
cupboard:
/ˈkʌbərd/ ≒ かばーど。知らなきゃ読めない。
ちなみに、boardは/bord/ ≒ ぼーど なので、後半だけ見ると同スペル、異発音かも。
nature:
/ˈnā-chər/ ≒ ねいちゃー。でもこれ、naturalになると/ˈna-chə-rəl/ ≒ なちゅらる になる。
英語と米語で発音が違う系
tomato:
「これが、"とめいと"だと!」と中学に入ってまず間違いなくショックを受けた言葉の一つだと思う。でも、英語(イギリス系)だと"とまーと"と発音したりする。ちなみに、tamagoは「ためいご」ではないのであしからず。
あんまりぱっと思いつかなかった。
この手のねたは需要があるかテストもかねて投稿してみたり。
(なんで今更こんなことをとか自分で突っ込み)
同スペル、異発音
Houston:
/ˈhjuːstən/ ≒ ひゅーすとん と発音すればテキサス州の都市(が有名、ほかにもある)
/ˈhaʊstən/ ≒ はうすとん と発音すればニューヨーク市の通りの名前(が有名、ほかにもある)
読みにくい系
simultaneously:
/ˌsī-məl-ˈtā-nē-əs-ly/ ≒ さいみゅるてにあうすりぃ。
ちなみにsimulateは/ˈsim-yə-ˌlāt/ ≒ しみゅれいと だったりする。(個人的に前者は米語だと思ってる)。
cupboard:
/ˈkʌbərd/ ≒ かばーど。知らなきゃ読めない。
ちなみに、boardは/bord/ ≒ ぼーど なので、後半だけ見ると同スペル、異発音かも。
nature:
/ˈnā-chər/ ≒ ねいちゃー。でもこれ、naturalになると/ˈna-chə-rəl/ ≒ なちゅらる になる。
英語と米語で発音が違う系
tomato:
「これが、"とめいと"だと!」と中学に入ってまず間違いなくショックを受けた言葉の一つだと思う。でも、英語(イギリス系)だと"とまーと"と発音したりする。ちなみに、tamagoは「ためいご」ではないのであしからず。
あんまりぱっと思いつかなかった。
この手のねたは需要があるかテストもかねて投稿してみたり。
2010-09-03
Java: Preferenceクラス
Javaのことを書くなんて本当はしたくないがあまりにネタがないので。
(Schemeの方は遅々として進まん・・・orz)
仕事は当然Javaを使うのだが、APIではまった話。
Preferenceというクラスがあるのだが、こいつは設定とか値をプラットフォーム固有の方法で永続化して使いまわせる便利なもの(のはず)
っで、今のプロジェクトでこいつを使っているのだが、なんか値がおかしい。
Windowsなので、レジストリに登録されるのだが、どうも1個しか値が存在してない。
っで調べてみた。
JavaDocによると、こいつはノードを取得する際にクラスを要求するくせに、値の保存はパッケージごとに行われるということ。クラスを要求するのは、パッケージ名を取得するためだけみたい。
つまり、
foo.bar.Hogeと、foo.bar.FugaっていうクラスでPreferenceを使うと値が共有されるらしい。
この方がありがたい人もいれば、そうじゃない人もいるだろう。僕は後者なわけだが・・・
foo.bar.configなんてパッケージを作ってその下にいくつかの設定値クラスなんかを作った場合問題になる、というか僕の問題はまさにこれ。
パッケージごとに一個の永続値って需要があるのだろうか?
ドキュメントをしっかり読めば早期発見できた問題ではあるが・・・
(Schemeの方は遅々として進まん・・・orz)
仕事は当然Javaを使うのだが、APIではまった話。
Preferenceというクラスがあるのだが、こいつは設定とか値をプラットフォーム固有の方法で永続化して使いまわせる便利なもの(のはず)
っで、今のプロジェクトでこいつを使っているのだが、なんか値がおかしい。
Windowsなので、レジストリに登録されるのだが、どうも1個しか値が存在してない。
っで調べてみた。
JavaDocによると、こいつはノードを取得する際にクラスを要求するくせに、値の保存はパッケージごとに行われるということ。クラスを要求するのは、パッケージ名を取得するためだけみたい。
つまり、
foo.bar.Hogeと、foo.bar.FugaっていうクラスでPreferenceを使うと値が共有されるらしい。
この方がありがたい人もいれば、そうじゃない人もいるだろう。僕は後者なわけだが・・・
foo.bar.configなんてパッケージを作ってその下にいくつかの設定値クラスなんかを作った場合問題になる、というか僕の問題はまさにこれ。
パッケージごとに一個の永続値って需要があるのだろうか?
ドキュメントをしっかり読めば早期発見できた問題ではあるが・・・
2010-08-15
魚
前回から1ヶ月くらい離れてるなぁ・・・
日本にいたときは便利だったなぁという話。
スーパーとかなら切り身で売ってるけど、
マーケットで魚を買うとあまり魚はきれいになっていない。
頭、内臓、鱗のことだけど。
鮮度とか安さとかならきっと上なんだと思うけど、よくて内臓くらいまでか、さばいてくれるの?
しょうがないので、包丁で鱗を落とすし、三枚にもおろす。
(身が骨の方にたくさんつくときもあるが)
この辺のサービスは絶対的に日本の方がいい気がする。
しても、追加料金取るとかざらだし。
こっちの人たちあんまり客を大切にしないイメージ。
日本が過剰サービス過ぎなのか?
日本にいたときは便利だったなぁという話。
スーパーとかなら切り身で売ってるけど、
マーケットで魚を買うとあまり魚はきれいになっていない。
頭、内臓、鱗のことだけど。
鮮度とか安さとかならきっと上なんだと思うけど、よくて内臓くらいまでか、さばいてくれるの?
しょうがないので、包丁で鱗を落とすし、三枚にもおろす。
(身が骨の方にたくさんつくときもあるが)
この辺のサービスは絶対的に日本の方がいい気がする。
しても、追加料金取るとかざらだし。
こっちの人たちあんまり客を大切にしないイメージ。
日本が過剰サービス過ぎなのか?
2010-07-16
どれが正しいんだ?
Schemeでdefine-syntaxの実装をしないといけないことに気づき、ちょっと調査。
単にマクロ展開のタイミングの話なのかな?
結果。
Chezは正常終了。最後の(test x 1)で展開されると思われてincfマクロは展開されず。
Ypisilonは最後の(test x 1)でincfの定義がない(多分、マクロで上書きされたから?)と怒る。
Moshはincfが複数定義されたといって例外。
それぞれの結果はこれ。
Chez
------------
procedure
3
procedure
2
define incf as define-syntax!
3
procedure
4
------------
Ypsilon
------------
procedure
3
procedure
2
define incf as define-syntax!
3
error: unbound variable incf
backtrace:
0 (incf x i)
..."D:/home/t.kato/test.scm" line 18
1 (test x 1)
..."D:/home/t.kato/test.scm" line 29
------------
mosh
------------
Condition components:
1. &who who: incf
2. &message message: "multiple definitions of identifier"
3. &syntax form: incf
subform: #f
Exception:
error in raise: returned from non-continuable exception
Stack trace:
1. throw:
2. (raise c): baselib.scm:943
3. apply:
------------
これだけバラバラだとどれが正しいのかわからない・・・
単にマクロ展開のタイミングの話なのかな?
(import (rnrs))
(define (print x)
(display x)
(newline))
(define x 1)
(define (incf x . i)
(if (pair? i)
(begin (set! x (+ x (car i)))
(print "procedure")
x)
(begin (set! x (+ x 1))
(print "procedure")
x)))
(print (incf x 2))
(define (test x i)
(print (incf x i)))
(test x 1)
(print "define incf as define-syntax!")
(set! x 1)
(define-syntax incf
(syntax-rules ()
((_ x) (begin (set! x (+ x 1)) x))
((_ x i) (begin (set! x (+ x i)) x))))
(print (incf x 2))
(test x 1)
こんなコードを、Chez(7.9.4)、Ypsilon(0.9.6-update3)、Mosh(0.2.5)に食わせてみる。結果。
Chezは正常終了。最後の(test x 1)で展開されると思われてincfマクロは展開されず。
Ypisilonは最後の(test x 1)でincfの定義がない(多分、マクロで上書きされたから?)と怒る。
Moshはincfが複数定義されたといって例外。
それぞれの結果はこれ。
Chez
------------
procedure
3
procedure
2
define incf as define-syntax!
3
procedure
4
------------
Ypsilon
------------
procedure
3
procedure
2
define incf as define-syntax!
3
error: unbound variable incf
backtrace:
0 (incf x i)
..."D:/home/t.kato/test.scm" line 18
1 (test x 1)
..."D:/home/t.kato/test.scm" line 29
------------
mosh
------------
Condition components:
1. &who who: incf
2. &message message: "multiple definitions of identifier"
3. &syntax form: incf
subform: #f
Exception:
error in raise: returned from non-continuable exception
Stack trace:
1. throw:
2. (raise c): baselib.scm:943
3. apply:
------------
これだけバラバラだとどれが正しいのかわからない・・・
2010-07-09
英語で仕事をするということ
最近、楽天の社長が社内公用語を英語にするという記事を読んだのと、
それに反応してソニーかどこかの人がTwitterで、そんなことするくらいなら公用語をC言語にする、などといったのを読んだので無駄に反応してみた。
個人的な意見。
まったく無駄だと思います。
日本に本社があって、社長も日本人で、働いてる人の95%以上が日本人の環境で、英語にする意味がない。こっちで働いていて、使用言語はオランダ語ではなく英語なわけだが、オランダ人同士が会議している場所だと当然オランダ語。
そもそも、怪しい英語で会議しても意味なくね?英語が喋れることが最重要事項な会社って、翻訳会社か何かだと思う。楽天はそっち系に変わるのかね?
できることなら日本語環境がいいなぁと思う人の独り言・・・
それに反応してソニーかどこかの人がTwitterで、そんなことするくらいなら公用語をC言語にする、などといったのを読んだので無駄に反応してみた。
個人的な意見。
まったく無駄だと思います。
日本に本社があって、社長も日本人で、働いてる人の95%以上が日本人の環境で、英語にする意味がない。こっちで働いていて、使用言語はオランダ語ではなく英語なわけだが、オランダ人同士が会議している場所だと当然オランダ語。
そもそも、怪しい英語で会議しても意味なくね?英語が喋れることが最重要事項な会社って、翻訳会社か何かだと思う。楽天はそっち系に変わるのかね?
できることなら日本語環境がいいなぁと思う人の独り言・・・
2010-07-02
街が揺れた日
その日は暑い夏の日だった。仕事帰りの私はいつもと同じ道を歩いていた。
突如凄まじい轟音とともに街が一瞬揺れた!
えぇ、その瞬間がオランダがブラジルを下したことが決定した瞬間です。
正直、1点とったのかなと思ったんだけど、勝ってました。
ブラジルにですよ。信じられん。
ブラジルに勝てたということはそのまま優勝ということもありえるなぁ。
突如凄まじい轟音とともに街が一瞬揺れた!
えぇ、その瞬間がオランダがブラジルを下したことが決定した瞬間です。
正直、1点とったのかなと思ったんだけど、勝ってました。
ブラジルにですよ。信じられん。
ブラジルに勝てたということはそのまま優勝ということもありえるなぁ。
2010-06-30
C++で書き始めた
Scheme処理系をC++で書き始めた。
(実際は片付いてない問題が多々あるのだが・・・)
とりあえず、コードがVectorで構成されているのでVectorを。あと物が動くとやはりうれしいので、Fixnumなクラスを作成。
xyzzyの参考に(パチッてとも言う)、クラスのタグ付けとか、即値の判定とか作成。
っで、適当にごにょごにょして動かす。
(+ 1 2 3)をコンパイルした結果をC++のオブジェクトに置き換えたものが動いた。
説明が長い・・・
気になる点としては、現状だとコードはベクターの中にベクターが入れ子になるように作ってあるのだが、これだとメモリー効率が激しく悪い気がする。
Schemeで書いてるときは気にしなかったのだが、C++で書いてみると一つのコードを書くのにベクターの割り当てが激しく出てくる感じ。
コンパイラを書き換えて全部フラットにするべきだろうか・・・するべきなんだろうなぁ・・・
(実際は片付いてない問題が多々あるのだが・・・)
とりあえず、コードがVectorで構成されているのでVectorを。あと物が動くとやはりうれしいので、Fixnumなクラスを作成。
xyzzyの参考に(パチッてとも言う)、クラスのタグ付けとか、即値の判定とか作成。
っで、適当にごにょごにょして動かす。
(+ 1 2 3)をコンパイルした結果をC++のオブジェクトに置き換えたものが動いた。
説明が長い・・・
気になる点としては、現状だとコードはベクターの中にベクターが入れ子になるように作ってあるのだが、これだとメモリー効率が激しく悪い気がする。
Schemeで書いてるときは気にしなかったのだが、C++で書いてみると一つのコードを書くのにベクターの割り当てが激しく出てくる感じ。
コンパイラを書き換えて全部フラットにするべきだろうか・・・するべきなんだろうなぁ・・・
2010-06-24
ワールドカップ
日本が3-1でデンマークに勝った!!
何が起きてるんだろう?天変地異の前触れか?
どうでもいいが、ここオランダではサッカーがあるとえらいことになる。
僕の住んでるライデンにはちょっとした広場が街の中央にあるのだが、そこにパブリックビューがあって結構な人が集まっていた。
酒が飲めればいいのか、騒げればいいのか、純粋にサッカーが好きなのかどれなのかは分からないが、街中がやかましい。
噂によると、サッカーの観戦をするために仕事を病欠する人がいるそうだ。
そんな国。
何が起きてるんだろう?天変地異の前触れか?
どうでもいいが、ここオランダではサッカーがあるとえらいことになる。
僕の住んでるライデンにはちょっとした広場が街の中央にあるのだが、そこにパブリックビューがあって結構な人が集まっていた。
酒が飲めればいいのか、騒げればいいのか、純粋にサッカーが好きなのかどれなのかは分からないが、街中がやかましい。
噂によると、サッカーの観戦をするために仕事を病欠する人がいるそうだ。
そんな国。
2010-06-22
letのフレーム
A正規化の話だったりする。
たとえばこんなコード(変な数字が入ってるのはα変換後だから)
前回、継続周りで不具合が起きることを踏まえて、letが現れたらフレームを作るようにコンパイラとVMを修正したのだが、その影響で単なるたらいまわし関数がスタックオーバーフローを起こすようになった。
原因は、この大量のlet。これだけコードが増大すれば当然VMのインストラクションも増大する。どれだけ影響があるかスタックを1000から10000にして上記の関数でベンチマークをとってみた。
4秒が14秒に・・・orz
後の最適化がしやすいようにと思ってのA正規化だが、ちょっとないなぁ・・・
今のところこいつの恩恵って、変数の寿命がわかりやすいことだけだし・・・
どうしよう。
たとえばこんなコード(変な数字が入ってるのはα変換後だから)
(define
tarai
(lambda
(x.1 y.2 z.3)
(if
(not (< y.2 x.1))
y.2
(tarai
(tarai (- x.1 1) y.2 z.3)
(tarai (- y.2 1) z.3 x.1)
(tarai (- z.3 1) x.1 y.2))))
こいつをA正規形にするとこうなる
(define
tarai
(lambda
(x.1 y.2 z.3)
(let
((#:G267 (< y.2 x.1)))
(let
((#:G268 (not #:G267)))
(if
#:G268
y.2
(let
((#:G269 (- x.1 1)))
(let
((#:G270 (tarai #:G269 y.2 z.3)))
(let
((#:G271 (- y.2 1)))
(let
((#:G272 (tarai #:G271 z.3 x.1)))
(let
((#:G273 (- z.3 1)))
(let
((#:G274 (tarai #:G273 x.1 y.2)))
(tarai #:G270 #:G272 #:G274)))))))))))
見てのとおりコードが増大。それだけならまだいいのだが(よくないが)、問題はコードの増大に伴ってletが出現していること。前回、継続周りで不具合が起きることを踏まえて、letが現れたらフレームを作るようにコンパイラとVMを修正したのだが、その影響で単なるたらいまわし関数がスタックオーバーフローを起こすようになった。
原因は、この大量のlet。これだけコードが増大すれば当然VMのインストラクションも増大する。どれだけ影響があるかスタックを1000から10000にして上記の関数でベンチマークをとってみた。
4秒が14秒に・・・orz
後の最適化がしやすいようにと思ってのA正規化だが、ちょっとないなぁ・・・
今のところこいつの恩恵って、変数の寿命がわかりやすいことだけだし・・・
どうしよう。
2010-06-18
スタックポインタ、フレームポインタ
Schemeのコンパイラの話。
3impという論文のコンパイラを参考に作っているわけだが、スタックポインタとフレームポインタではまった。
(ってか、今でも解決してない)
ここにあるスタックとフレームの関係を参考にして、letのコンパイルをしたのだが、上手くいかない。
原因は分かっている。本来はletごとにフレームを作成して自由変数とかの解決をしないといけないのに、フレームを作るコストを嫌って、letが続く限り一つのローカルフレームのようにしたから。
そもそも、letではフレームを作ってないので、フレーム情報があることを前提にしているVMインストラクションでおかしなことが起きる。
どうしよう。
とりあえず、Gaucheがletをどう処理してるのかdisasmしてみた。
...
let毎にフレーム作ってる・・・
やっぱりそうするべきかなぁ?でもA正規化後ってあほかと思うほどletが増えるんだよなぁ・・・
その辺も踏まえてどうしよう。
3impという論文のコンパイラを参考に作っているわけだが、スタックポインタとフレームポインタではまった。
(ってか、今でも解決してない)
ここにあるスタックとフレームの関係を参考にして、letのコンパイルをしたのだが、上手くいかない。
原因は分かっている。本来はletごとにフレームを作成して自由変数とかの解決をしないといけないのに、フレームを作るコストを嫌って、letが続く限り一つのローカルフレームのようにしたから。
そもそも、letではフレームを作ってないので、フレーム情報があることを前提にしているVMインストラクションでおかしなことが起きる。
どうしよう。
とりあえず、Gaucheがletをどう処理してるのかdisasmしてみた。
...
let毎にフレーム作ってる・・・
やっぱりそうするべきかなぁ?でもA正規化後ってあほかと思うほどletが増えるんだよなぁ・・・
その辺も踏まえてどうしよう。
2010-06-15
コンパイル
いろいろ弄って、letをコンパイルできるようにした。
意外と上手くいくもんだ。四苦八苦したけど・・・
っで、たらいまわし関数を動かしてみたら、10,5,0の引数で36秒かかる・・・
まぁ、schemeをscheme上で動かしてるのでオーバーヘッドとかもあるだろう。っがあまりに遅いのでできそうな高速化を施すことに。
現状リストでVMのインストラクションを書いていたが、全部ベクターに変更。でも、面倒くさがりなので、
ベクターの中にベクターを入れるといういんちき(?)をして、データ構造は特に変更しない。
勢いあまってVMにプログラムカウンタをつけてみたけど、要らん気がする。まぁいいや。
これで、一時的に5倍くらい早くなった。
次にインストラクションを今後のために数値に変更。これは逆に遅くなった。
考えられそうな理由は現状プリミティブの実装がかなり適当で、シンボルと数値の比較が一つのcond文に混在している。なので、シンボルの比較を先にしないと、Gaucheに怒られた。っで先に回したら鈍足に・・・
比較の分だけ遅くなるわね。
逆に言えば、よく使われるインストラクションは前の方に持ってくると幸せになれるか?
っで、とりあえずプリミティブをいんちきせずにコンパイルするようにしている最中。
物が動いてくるとやはり楽しい。
意外と上手くいくもんだ。四苦八苦したけど・・・
っで、たらいまわし関数を動かしてみたら、10,5,0の引数で36秒かかる・・・
まぁ、schemeをscheme上で動かしてるのでオーバーヘッドとかもあるだろう。っがあまりに遅いのでできそうな高速化を施すことに。
現状リストでVMのインストラクションを書いていたが、全部ベクターに変更。でも、面倒くさがりなので、
ベクターの中にベクターを入れるといういんちき(?)をして、データ構造は特に変更しない。
勢いあまってVMにプログラムカウンタをつけてみたけど、要らん気がする。まぁいいや。
これで、一時的に5倍くらい早くなった。
次にインストラクションを今後のために数値に変更。これは逆に遅くなった。
考えられそうな理由は現状プリミティブの実装がかなり適当で、シンボルと数値の比較が一つのcond文に混在している。なので、シンボルの比較を先にしないと、Gaucheに怒られた。っで先に回したら鈍足に・・・
比較の分だけ遅くなるわね。
逆に言えば、よく使われるインストラクションは前の方に持ってくると幸せになれるか?
っで、とりあえずプリミティブをいんちきせずにコンパイルするようにしている最中。
物が動いてくるとやはり楽しい。
2010-06-14
カメルーンに勝った
ワールドカップの話。
職場が半日だれも仕事しないくらいオランダはサッカーが熱い(個人的にはどうでもいいが)
職場で点が入るたびに雄たけびが聞こえてくるくらい。
っで、それのあおりで日本VSカメルーンを少し見た。
あれ?勝ってる?
1-0で日本が勝った・・・
とりあえず、前評判を的確に表していたであろうコピペ。
う~ん、何が起きたんだろう?
職場が半日だれも仕事しないくらいオランダはサッカーが熱い(個人的にはどうでもいいが)
職場で点が入るたびに雄たけびが聞こえてくるくらい。
っで、それのあおりで日本VSカメルーンを少し見た。
あれ?勝ってる?
1-0で日本が勝った・・・
とりあえず、前評判を的確に表していたであろうコピペ。
A B 南アフリカ「ガチ抽選をした結果がこれだよ!」 アルゼンチン「なんだ楽勝じゃん」 メキシコ「南アフリカ乙」 ナイジェリア「2位ならなんとか」 ウルグアイ「南アフリカ乙」 韓国「\( ^o^)/」 フランス「実質シードワロスww」 ギリシャ「2位ならなんとか」 C D イングランド「アジアとやらせろよ」 ドイツ「そこそこの組み合わせかな」 アメリカ「微妙・・・」 オーストラリア「2位いけるな」 アルジェリア「無理くさい」 セルビア「2位いけるな」 スロベニア「微妙・・・」 ガーナ 「2位いけるな」 E F オランダ「まぁ、おk」 イタリア「楽勝www」 デンマーク「日本には勝つとして・・・」 パラグアイ「ニュージーには勝つ」 日本「なかなかいい組み合わせだな(キリッ」 ニュージーランド「なにこの無理ゲー?」 カメルーン「日本には勝つとして・・・」 スロバキア 「ニュージーには勝つ」 G H ブラジル「1位通過するよ」 スペイン「楽勝すぐるww」 北朝鮮「どうしてこうなった!」 スイス「ホンジュラスには勝つ」 コートジボワール「1位通過するよ」 ホンジュラス「まぁ、がんばる」 ポルトガル「1位通過するよ」 チリ 「ホンジュラスには勝つ」
う~ん、何が起きたんだろう?
ミーはおフランス帰りざんす
ということで、パリに行ってきました。
パッケージツアーというのは今までの人生でほとんど経験がないので(修学旅行等除く)それなりにいい経験になったかなと。
言葉の壁さえ考えなければ、交通費、朝食、夕食、セーヌ川のボートツアー、その他いろいろ混みで150ユーロは安いのではないかな。
パリの街は思っていた以上になじむなぁとちょっと感じた。
そこらじゅうで言われていた、犬の糞の問題は特になく、きれいだったし。
っが、街はきれいでも人は・・・
パリで運転する必要がある人はかなりの胆力が必要になるだろうなぁと。
時間がないので適当。
パッケージツアーというのは今までの人生でほとんど経験がないので(修学旅行等除く)それなりにいい経験になったかなと。
言葉の壁さえ考えなければ、交通費、朝食、夕食、セーヌ川のボートツアー、その他いろいろ混みで150ユーロは安いのではないかな。
パリの街は思っていた以上になじむなぁとちょっと感じた。
そこらじゅうで言われていた、犬の糞の問題は特になく、きれいだったし。
っが、街はきれいでも人は・・・
パリで運転する必要がある人はかなりの胆力が必要になるだろうなぁと。
時間がないので適当。
2010-06-09
やっつけA正規形拡張
とりあえず、オリジナルのA正規形で問題かなと思ったのが以下の点。
1. letが変数一つって扱い難いので複数取るように変更。(let (<binds>) <body>)というが普通のletなのでこれを取るようにし、<binds>の(変数 値)という式を一つずつ正規化後letを再構築。
2. condは
letrecとletrec*はバインド変数だけ正規化してそのまま放置。とりあえずこれでいいか?
3. オリジナルは(display 'a)というのが(let ((r 'a)) (display r))ってなってたので、さすがにあほらしいかと思い、quoteは正規化しないことにした。
っで、とりあえず3impのコンパイラでコンパイルしてみた。
おぉ、コンパイルできた。
っが、コンパイラにletをコンパイルする記述はない・・・さて、考えるか・・・
- letが引数一つ
- cond、letrec等の必要そうな構文がない(condはif文で書きかえれるけど・・・)
- quoteしたものも正規化する
1. letが変数一つって扱い難いので複数取るように変更。(let (<binds>) <body>)というが普通のletなのでこれを取るようにし、<binds>の(変数 値)という式を一つずつ正規化後letを再構築。
2. condは
(cond (<pred1> <then1>)
(<pred2> <then2>)
(else <then>)
という式なので、pred1 ... pred2をこんな感じに(let ((p1 (normalize <pred1>))) ; 以下predの数だけっでthenを正規化してcondを再構築。
letrecとletrec*はバインド変数だけ正規化してそのまま放置。とりあえずこれでいいか?
3. オリジナルは(display 'a)というのが(let ((r 'a)) (display r))ってなってたので、さすがにあほらしいかと思い、quoteは正規化しないことにした。
っで、とりあえず3impのコンパイラでコンパイルしてみた。
おぉ、コンパイルできた。
っが、コンパイラにletをコンパイルする記述はない・・・さて、考えるか・・・
2010-06-08
A正規形に切り替える
CPS変換がどうにも上手くいかない。
なんとかなるんだろうけど、涙が出そうになってきたので断念。
一応、それ以外の理由として、
(Gauche上で動かしてるのでしょうがない)
ということで、A正規形に切り替えることにする。
A正規形はCPS変換後逆CPS変換した形に極めて近い気がする。すべての継続の結果を変数として確保するので、スタックの肥大化が問題かな?
ここが詳しい。別に論文も読むといいと思う。
論文の最後にアルゴリズムをschemeで実装した例がある。
問題はこいつはCore SchemeというSchemeのサブセットを対象としているので、いろんな部分で限定的。(letrecとかないし・・・condとかどうするんだろう?)
その辺りを自前で拡張することができればよさそうだ。できるかな?
なんとかなるんだろうけど、涙が出そうになってきたので断念。
一応、それ以外の理由として、
- コードの肥大化がすさまじい
- 変換することによって、関数のシグネチャが変わる(継続を渡すように変更するため)
- ベンチマークで脅威の低速を叩き出してる
(Gauche上で動かしてるのでしょうがない)
ということで、A正規形に切り替えることにする。
A正規形はCPS変換後逆CPS変換した形に極めて近い気がする。すべての継続の結果を変数として確保するので、スタックの肥大化が問題かな?
ここが詳しい。別に論文も読むといいと思う。
論文の最後にアルゴリズムをschemeで実装した例がある。
問題はこいつはCore SchemeというSchemeのサブセットを対象としているので、いろんな部分で限定的。(letrecとかないし・・・condとかどうするんだろう?)
その辺りを自前で拡張することができればよさそうだ。できるかな?
2010-06-07
コメントの仕方
コメントの仕方が分からないという指摘が累計2件ほどたまったので(少ない)
蛇足ではあると思うけど書いてみる。
コメントしたいと思う投稿の一番下にある、数字 + コメントという(このブログだと緑)のリンクをクリックする。
するとなんとも味気ないコメント投稿画面が現れるので、大き目のテキストエリアにコメントを書き込む。
スパム防止機能があるので、コメントのテキストエリアの下にあるフィールドに画像の英数字を入力。
投稿者のIDを選択。OpenIDはよく分かっていないが、Googleアカウントがあればそれでもいいし、そんなもの無いなら名前/URLを選択し名前を入力。もちろん匿名でも構わない。
最後に投稿ボタンを押せば完了。
bloggerのコメントはきっと共通だと思うので、これで他のbloggerにもコメントができる!
さぁ、早速この投稿にコメントして練習だ!
蛇足ではあると思うけど書いてみる。
コメントしたいと思う投稿の一番下にある、数字 + コメントという(このブログだと緑)のリンクをクリックする。
するとなんとも味気ないコメント投稿画面が現れるので、大き目のテキストエリアにコメントを書き込む。
スパム防止機能があるので、コメントのテキストエリアの下にあるフィールドに画像の英数字を入力。
投稿者のIDを選択。OpenIDはよく分かっていないが、Googleアカウントがあればそれでもいいし、そんなもの無いなら名前/URLを選択し名前を入力。もちろん匿名でも構わない。
最後に投稿ボタンを押せば完了。
bloggerのコメントはきっと共通だと思うので、これで他のbloggerにもコメントができる!
さぁ、早速この投稿にコメントして練習だ!
2010-06-03
ぬか喜びだった件・・・
前述のベンチマークだが、手動CPS変換が間違っていた。
正しくはこう
どう考えてもなしの方向っぽいです、本当に(ry
正しくはこう
(define (<=/cps x y k) (k (<= x y)))
(define (-/cps x y k) (k (- x y)))
(define tarai-cps
(lambda (x y z k)
(<=/cps x y
(lambda (b)
(if b
;ここが違う
(k y)
(-/cps x 1
(lambda (x2)
(tarai-cps x2 y z
(lambda (t1)
(-/cps y 1
(lambda (y2)
(tarai-cps y2 z x
(lambda (t2)
(-/cps z 1
(lambda (z2)
(tarai-cps z2 x y
(lambda (t3)
;ここも
(tarai-cps t1 t2 t3 k))))))))))))))))))
(time (tarai-cps 10 5 0 (lambda (x) x)))
っで、ベンチマークの結果。Petite Chez Scheme 7.9.4
(time (tarai-org 10 ...))
no collections
16 ms elapsed cpu time
0 ms elapsed real time
0 bytes allocated
(time (tarai-cps 10 ...))
10 collections
125 ms elapsed cpu time, including 0 ms collecting
0 ms elapsed real time, including 0 ms collecting
44600752 bytes allocated, including 42111448 bytes reclaimed
(time (tarai-anf 10 ...))
7 collections
78 ms elapsed cpu time, including 0 ms collecting
0 ms elapsed real time, including 0 ms collecting
29505120 bytes allocated, including 29499488 bytes reclaimed
(time (tarai-lambda 10 ...))
7 collections
78 ms elapsed cpu time, including 0 ms collecting
0 ms elapsed real time, including 0 ms collecting
29505120 bytes allocated, including 29490760 bytes reclaimed
Gauche 0.9
;(time (tarai-org 10 5 0))
; real 0.016
; user 0.015
; sys 0.000
;(time (tarai-cps 10 5 0 (lambda (x) x)))
; real 0.453
; user 0.407
; sys 0.047
;(time (tarai-anf 10 5 0))
; real 0.031
; user 0.031
; sys 0.000
;(time (tarai-lambda 10 5 0))
; real 0.422
; user 0.375
; sys 0.047
圧倒的じゃないか。。。orzどう考えてもなしの方向っぽいです、本当に(ry
ベンチマーク
CPS変換の勉強中にANF(A-normal form)との共通点を見つけて、
ひょっとしてCPS変換しなくてもA正規化すればいいのでは?
という誘惑にかられたことから、ちょっとベンチマークとってみた。
(どっちが速度が出るか比較したかった。速い方がいいじゃん!)
使用したコードは以下
Gaucheのdisasm関数でコンパイル結果を見てみたが、末尾最適化が効いてるのかな?
Chez Schemeの結果からアロケーションが結構発生するみたいだけど、それを踏まえてもありと思わせる結果である。
でも、これってこれらのVMがCPS変換されたコードを速く走らせるのであって、CPS変換されたコードが無条件で速くなるわけではないんだよなぁ・・・
う~ん・・・
ひょっとしてCPS変換しなくてもA正規化すればいいのでは?
という誘惑にかられたことから、ちょっとベンチマークとってみた。
(どっちが速度が出るか比較したかった。速い方がいいじゃん!)
使用したコードは以下
(define tarai-org
(lambda (x y z)
(if (<= x y)
y
(tarai-org (tarai-org (- x 1) y z)
(tarai-org (- y 1) z x)
(tarai-org (- z 1) x y)))))
(time (tarai-org 10 5 0))
(define (<=/cps x y k) (k (<= x y)))
(define (-/cps x y k) (k (- x y)))
(define tarai-cps
(lambda (x y z k)
(<=/cps
x y
(lambda (b)
(if b
y
(-/cps
x 1
(lambda (x2)
(tarai-cps
x2 y z
(lambda (t1)
(-/cps
y 1
(lambda (y2)
(tarai-cps
y2 z x
(lambda (t2)
(-/cps
z 1
(lambda (z2)
(tarai-cps
z2 x y
(lambda (t3)
(k (tarai-cps t1 t2 t3)))))))))))))))))))
(time (tarai-cps 10 5 0 (lambda (x) x)))
(define tarai-anf
(lambda (x y z)
(let ((G139 (<= x y)))
(if G139
y
(let ((G140 (- x 1)))
(let ((G141 (tarai-anf G140 y z)))
(let ((G142 (- y 1)))
(let ((G143 (tarai-anf G142 z x)))
(let ((G144 (- z 1)))
(let ((G145 (tarai-anf G144 x y)))
(tarai-anf G141 G143 G145)))))))))))
(time (tarai-anf 10 5 0))
(define tarai-lambda
(lambda (x y z)
((lambda (G143)
(if G143
y
((lambda (G144)
((lambda (G145)
((lambda (G146)
((lambda (G147)
((lambda (G148)
((lambda (G149)
(tarai-lambda G145 G147 G149))
(tarai-lambda G148 x y)))
(- z 1)))
(tarai-lambda G146 z x)))
(- y 1)))
(tarai-lambda G144 y z)))
(- x 1))))
(<= x y))))
(time (tarai-lambda 10 5 0))
tarai-orgが元のたらいまわし関数。以下、-cps、-anf、-lambdaと続くが、順に元の関数のお手製CPS変換、A正規化、A正規化後letをlambdaに変換したものとなっている。
っで、以下がベンチマーク結果
Petite Chez Scheme 7.9.4
(time (tarai-org 10 ...))
no collections
16 ms elapsed cpu time
0 ms elapsed real time
0 bytes allocated
(time (tarai-cps 10 ...))
no collections
0 ms elapsed cpu time
0 ms elapsed real time
840 bytes allocated
(time (tarai-anf 10 ...))
7 collections
78 ms elapsed cpu time, including 0 ms collecting
0 ms elapsed real time, including 0 ms collecting
29505472 bytes allocated, including 29469704 bytes reclaimed
(time (tarai-lambda 10 ...))
7 collections
78 ms elapsed cpu time, including 0 ms collecting
0 ms elapsed real time, including 0 ms collecting
29505120 bytes allocated, including 29489216 bytes reclaimed
Gauche 0.9
;(time (tarai-org 10 5 0))
; real 0.016
; user 0.016
; sys 0.000
;(time (tarai-cps 10 5 0 (lambda (x) x)))
; real 0.000
; user 0.000
; sys 0.000
;(time (tarai-anf 10 5 0))
; real 0.031
; user 0.031
; sys 0.000
;(time (tarai-lambda 10 5 0))
; real 0.437
; user 0.359
; sys 0.078
個人的には超意外にもCPSが一番早かった!!Gaucheのdisasm関数でコンパイル結果を見てみたが、末尾最適化が効いてるのかな?
Chez Schemeの結果からアロケーションが結構発生するみたいだけど、それを踏まえてもありと思わせる結果である。
でも、これってこれらのVMがCPS変換されたコードを速く走らせるのであって、CPS変換されたコードが無条件で速くなるわけではないんだよなぁ・・・
う~ん・・・
2010-06-01
CPS変換
とりあえず基本的なことを勉強してみた。
とにかく、すべてのλ抽象は次に計算される継続を持てばいいみたいで、こんな感じに変換される。
(この辺は知っていた・・・つもり)
ということは、継続を取る引数を定義しないといけない・・・
こんな感じ。
っで、これ見ると分かるのだが、継続渡しのプログラムは戻り値を次の継続に渡すので必然的に渡される継続の引数は1つに固定される。
引数を一つに固定して、あだこだするというと、カリー化が思い浮かぶが、やらにゃならんのだろうか・・・
とりあえず、用事ができたのでここまで。続きは帰ってきてから。
-----------------
帰ってきた。
引数を一つに固定したくないという思いをいただいたので(誰からだよ!)
継続の戻り値が多値なら問題ないかと。とりあえず、実験。
まぁ、どうでもいいや。
こう書けば一応複数の引数を何とかできそうだが、いいのか?
とりあえず、最初のプログラムを手動CPS変換してみる。
と思ったが、CPS変換で生じたλ抽象って、この場合だと(* x y)の戻り値を引数にするのだから、1つ固定でも問題ない気がする。もちろん、 (values 1 2)見たいな多値を返すんだとしたら問題かもしれないが、Schemeは多値をそのままでは扱えないので、やっぱり問題ない気がする。
例みたいな、defineをCPS変換する際には関係ないのだろう、きっと・・・
とにかく、すべてのλ抽象は次に計算される継続を持てばいいみたいで、こんな感じに変換される。
(この辺は知っていた・・・つもり)
; 変換前
(define (pyth x y)
(sqrt (+ (* x x) (* y y))))
; 変換後
(define (pyth x y k)
(* x x (lambda (x2)
(* y y (lambda (y2)
(+ x2 y2 (lambda (x2py2)
(sqrt x2py2 k))))))))
CPS変換するとこうなる。プログラムは継続渡しスタイルなので、「*」、「+」といったプリミティブでさえ、引数に継続を取る。ということは、継続を取る引数を定義しないといけない・・・
こんな感じ。
(define (cps/* x y k) (k (* x y))) (define (cps/+ x y k) (k (+ x y))) (define (cps/sqrt x k) (k (sqrt x)))上記のプログラムの*、+及びsqrtをCPSなプリミティブに置き換えれば動く。面倒・・・
っで、これ見ると分かるのだが、継続渡しのプログラムは戻り値を次の継続に渡すので必然的に渡される継続の引数は1つに固定される。
引数を一つに固定して、あだこだするというと、カリー化が思い浮かぶが、やらにゃならんのだろうか・・・
とりあえず、用事ができたのでここまで。続きは帰ってきてから。
-----------------
帰ってきた。
引数を一つに固定したくないという思いをいただいたので(誰からだよ!)
継続の戻り値が多値なら問題ないかと。とりあえず、実験。
(define (cps/+ k . arg)(k (apply + arg))) (call-with-values (lambda () (values (lambda (k) k) 1 2 3)) cps/+)call-with-valuesが内部で何してるのか実はよく分かっていないが、動きから第二引数に第一引数の戻り値をapplyしてるのではないかと・・・
まぁ、どうでもいいや。
こう書けば一応複数の引数を何とかできそうだが、いいのか?
とりあえず、最初のプログラムを手動CPS変換してみる。
と思ったが、CPS変換で生じたλ抽象って、この場合だと(* x y)の戻り値を引数にするのだから、1つ固定でも問題ない気がする。もちろん、 (values 1 2)見たいな多値を返すんだとしたら問題かもしれないが、Schemeは多値をそのままでは扱えないので、やっぱり問題ない気がする。
例みたいな、defineをCPS変換する際には関係ないのだろう、きっと・・・
2010-05-30
ラムダ計算 入門
SchemeでSchemeのコンパイラを作っているのだが、いろいろやるに当たって必要になったので勉強中。
(泥縄とかそういう突っ込みはいらない)
ラムダ計算入門のPDFが分かりやすかったのでこれを元に入門編を勉強。
とりあえずラムダ計算の定義。
Schemeで変数を定義するときにlet式を使うが、let式もlambdaに変換できる。
(SICPで出たが復習)
(let ((x 1)) <body>) -> ((lambda (x) <body>) 1)
λ式に対して関数適用をするといった感じ?
β簡約
いくつかやり方があるらしい。とりあえず資料にあったのは、R-Beta、R-App1、R-App2とR-Absの4つ。
じゃあ、正確には[c/a]bdじゃないのだろうかと、ちと疑問。
例は資料になかったので自分で考えた。間違い指摘大歓迎!!
α変換
変数名を一意に変換すること。こんな感じ(まんま資料から)。
(λx.λy.xy)y -α変換-> (λx.λy'.xy')y -β簡約-> λy'.yy'
最初の式のyと適用されるyは異なる変数だが同名がつけられている。このまま簡約すると式の意味が変わるので変数名を変えようというだけの話。
仰々しい名前が着いてるけど、変数名の衝突を防ぐだけ・・・
とりあえず、入門の入門としてはこれくらいにする。
1時間の勉強内容としてはこんなもんだろう・・・
最終的にはSabry&WadlerのCPS変換の実装をSchemeでできるまでには習得したい・・・
(泥縄とかそういう突っ込みはいらない)
ラムダ計算入門のPDFが分かりやすかったのでこれを元に入門編を勉強。
とりあえずラムダ計算の定義。
e(λ式) ::= x (変数)
| λx.e (λ抽象)
| e1e2 (関数適用)
この辺は余裕。Schemeで変数を定義するときにlet式を使うが、let式もlambdaに変換できる。
(SICPで出たが復習)
(let ((x 1)) <body>) -> ((lambda (x) <body>) 1)
λ式に対して関数適用をするといった感じ?
β簡約
いくつかやり方があるらしい。とりあえず資料にあったのは、R-Beta、R-App1、R-App2とR-Absの4つ。
R-Beta: -------------------------- (λx.e1)e2 -> [e2/x]e1 例: (λx.x)y -> y (λx.λy.x)z -> λy.z[e2/x]e1はe1の変数xにe2を代入したという意味。
R-App1:
e1 -> e1'
-----------------
e1e2 -> e1'e2
例:
(λa.b)cd -> bd
λ式は左結合なので、(λa.b)cdは実際は((λa.b)c)dとなる。R-Betaで(λa.b)cが[c/a]bになって、このbに対してdを適用するということ。じゃあ、正確には[c/a]bdじゃないのだろうかと、ちと疑問。
R-App2:
e2 -> e2'
-----------------
e1e2 -> e1e2'
例:
a((λx.x)b) -> ab
R-App2はR-App1のe2版。つまり引数に対してβ簡約をするということ。例は資料になかったので自分で考えた。間違い指摘大歓迎!!
R-Abs:
e -> e'
-------------------
λx.e -> λx.e'
例:
λx.(λy.y)x -> λx.x
λ抽象に対しての簡約。実行時に関数を評価するMLでは必要ないらしい。でも、簡約=最適化だとすればコンパイル時に評価しなくてもいいので、簡約はしておきたいなぁ。ということでこれも必要としておこう。α変換
変数名を一意に変換すること。こんな感じ(まんま資料から)。
(λx.λy.xy)y -α変換-> (λx.λy'.xy')y -β簡約-> λy'.yy'
最初の式のyと適用されるyは異なる変数だが同名がつけられている。このまま簡約すると式の意味が変わるので変数名を変えようというだけの話。
仰々しい名前が着いてるけど、変数名の衝突を防ぐだけ・・・
とりあえず、入門の入門としてはこれくらいにする。
1時間の勉強内容としてはこんなもんだろう・・・
最終的にはSabry&WadlerのCPS変換の実装をSchemeでできるまでには習得したい・・・
2010-05-23
New York最終日
書いてる時間がおかしいが、まぁ無事に帰ってきた後ということで^^;
特に何もない、実は(じゃあ書くなよ)
飛行場の近くにあるモールでランチ取っただけという話。
飛行場はNewarkという飛行場。なんとも紛らわしい名前だ。
んでもって、あほかというほど混んでた。
飛行場でいつも気になるのは、清掃のおばちゃんじゃないけど、係員みたいな人は大抵アメリカ人じゃない発音の英語を話すこと。
大抵インド系かスペイン系。
そういえばタクシーの運ちゃんとかバスの運ちゃんもスペイン系が多かったなぁ。
この辺りは移民が着く仕事なんだろうか?
帰りの飛行機は特に問題なく7時間弱で到着。
特に時差ぼけも無く、普通のフライトだった。
どうでもいいが、今回の旅行で分かったことがある。
僕は英語が話せない・・・(T_T)
特に何もない、実は(じゃあ書くなよ)
飛行場の近くにあるモールでランチ取っただけという話。
飛行場はNewarkという飛行場。なんとも紛らわしい名前だ。
んでもって、あほかというほど混んでた。
飛行場でいつも気になるのは、清掃のおばちゃんじゃないけど、係員みたいな人は大抵アメリカ人じゃない発音の英語を話すこと。
大抵インド系かスペイン系。
そういえばタクシーの運ちゃんとかバスの運ちゃんもスペイン系が多かったなぁ。
この辺りは移民が着く仕事なんだろうか?
帰りの飛行機は特に問題なく7時間弱で到着。
特に時差ぼけも無く、普通のフライトだった。
どうでもいいが、今回の旅行で分かったことがある。
僕は英語が話せない・・・(T_T)
2010-05-21
New York四日目
四日目もニューヨーク。
今日はツアーバスには乗らずいろいろぶらぶら。
といっても、あんまりどこにも行ってないなぁ。
お茶して、
自由の女神をフェリーから見て、
セントラルパークで(大分遅い)昼食をとって(17時)、
チャイナタウンで買い物して、
終了。
セントラルパークはかなりいい感じの公園だった。
都会の雑踏を完全に忘れることができるというか、まぁそんな感じ。
しかも、やたらでかい!
もう来ることはないと思うが、もし機会があればレンタル自転車で一周してみたいなぁ。
今日はツアーバスには乗らずいろいろぶらぶら。
といっても、あんまりどこにも行ってないなぁ。
お茶して、
自由の女神をフェリーから見て、
セントラルパークで(大分遅い)昼食をとって(17時)、
チャイナタウンで買い物して、
終了。
セントラルパークはかなりいい感じの公園だった。
都会の雑踏を完全に忘れることができるというか、まぁそんな感じ。
しかも、やたらでかい!
もう来ることはないと思うが、もし機会があればレンタル自転車で一周してみたいなぁ。
2010-05-20
New York三日目
今日もNew York。
New YorkというかManhattanは基本的に3つの地域(?)から成り立つっぽい。
Uptown、MidtownそれにDowntownの3つ。DowntownにはWall Streetとか経済の中心っぽいところがあり、UptownはHarlemとか居住地っぽい感じ。
個人的にHarlemって聞くとスラム街ってイメージがあったのだが、それは今や昔の話で今は(バスのガイドさんの話によると)完全に安全らしい。
どうでもいいのだがUptownにはコロンビア大学があり、コロンビア大学というとシヴァ、アレクサンドライトなどの漫画が思い浮かぶ。
(浮かぶ人の方が少ないだろう上に、20年近く前の漫画だったりする)
個人的に、あの漫画のManhattan描写はなんだかいろいろ違うような気が今更ながらにしたが、20年くらい前なので当時はそうだったのかもしれない。どうでもいい話。
ちなみに、コロンビア大学はもっとも学費が高い私立大学の一つらしい。っで、同じくManhattanにあるニューヨーク大学は年間5万ドル(500万円くらい?)ほどするらしい。漫画の中の話とは言え、彼らはものすごく金持ちだったのだろう・・・
そんなことを考えながら観光バスのUptownツアーを終了し、タイムズスクエアに戻る。っで、何故か吉野家で昼食。
味はまぁまぁだったのだが、なぜ吉野家に寿司があるんだろう?
その後Downtownツアーのバスに乗り、ナイトツアーでManhattan → Brooklyn → Manhattanと移動。無いとツアーのガイドのおっさんがやたら面白い人だった。
ちょっとだけこの街に慣れてきた気がするが、やはり肌に合わない・・・
New YorkというかManhattanは基本的に3つの地域(?)から成り立つっぽい。
Uptown、MidtownそれにDowntownの3つ。DowntownにはWall Streetとか経済の中心っぽいところがあり、UptownはHarlemとか居住地っぽい感じ。
個人的にHarlemって聞くとスラム街ってイメージがあったのだが、それは今や昔の話で今は(バスのガイドさんの話によると)完全に安全らしい。
どうでもいいのだがUptownにはコロンビア大学があり、コロンビア大学というとシヴァ、アレクサンドライトなどの漫画が思い浮かぶ。
(浮かぶ人の方が少ないだろう上に、20年近く前の漫画だったりする)
個人的に、あの漫画のManhattan描写はなんだかいろいろ違うような気が今更ながらにしたが、20年くらい前なので当時はそうだったのかもしれない。どうでもいい話。
ちなみに、コロンビア大学はもっとも学費が高い私立大学の一つらしい。っで、同じくManhattanにあるニューヨーク大学は年間5万ドル(500万円くらい?)ほどするらしい。漫画の中の話とは言え、彼らはものすごく金持ちだったのだろう・・・
そんなことを考えながら観光バスのUptownツアーを終了し、タイムズスクエアに戻る。っで、何故か吉野家で昼食。
味はまぁまぁだったのだが、なぜ吉野家に寿司があるんだろう?
その後Downtownツアーのバスに乗り、ナイトツアーでManhattan → Brooklyn → Manhattanと移動。無いとツアーのガイドのおっさんがやたら面白い人だった。
ちょっとだけこの街に慣れてきた気がするが、やはり肌に合わない・・・
2010-05-19
New York二日目
今日は普通の時間に起きたのでそれなりに元気。
ホテルで朝食を取ってシャトルバスでManhattanへ。
あいにくの雨なので適当にぶらぶら。
(セントラルパークとか行ってみたいところはあるのだが、雨だしやめた。明日)
タイムススクエアとかそれっぽいとこを見た感じ。
48時間乗り降り自由の観光バスのチケットを買い、それに乗って時間をつぶす。
雨なので説明を聞いてもそれそのものは見えない・・・
無駄金払った気分orz
明日があるさ!
そんな感じでとりあえず二日目終了。
ホテルで朝食を取ってシャトルバスでManhattanへ。
あいにくの雨なので適当にぶらぶら。
(セントラルパークとか行ってみたいところはあるのだが、雨だしやめた。明日)
タイムススクエアとかそれっぽいとこを見た感じ。
48時間乗り降り自由の観光バスのチケットを買い、それに乗って時間をつぶす。
雨なので説明を聞いてもそれそのものは見えない・・・
無駄金払った気分orz
明日があるさ!
そんな感じでとりあえず二日目終了。
2010-05-18
New York一日目
無事に飛行機に乗れ、無事にNew Yorkに到着。
実際にはNew Jerseyだったりするが、まぁ主に活動するところはNew Yorkになるので細かいことは気にしない。
とりあえず、今日も4時おきだったりするので、ホテルに到着し次第爆睡・・・
う~ん。
飛行場からホテルまでまぁ距離があって、電車に乗る必要があったのだが、その車窓から覗いた世界がなんだかセピア色だった。
う~ん、とりあえずすでに自分になじまないなぁという雰囲気が漂っている・・・
実際にはNew Jerseyだったりするが、まぁ主に活動するところはNew Yorkになるので細かいことは気にしない。
とりあえず、今日も4時おきだったりするので、ホテルに到着し次第爆睡・・・
う~ん。
飛行場からホテルまでまぁ距離があって、電車に乗る必要があったのだが、その車窓から覗いた世界がなんだかセピア色だった。
う~ん、とりあえずすでに自分になじまないなぁという雰囲気が漂っている・・・
2010-05-17
Orlandおまけ
Orlandoを出発する予定だったのだが、いろいろあって飛行機に乗れなかった・・・
ということで、おまけの一日。
朝4時起きという超睡眠不足に加えて連日の疲れから何もできなかったけど・・・
とりあえず、シーワールドに行っておしまい。
明日は本当にNew Yorkのはず・・・
ということで、おまけの一日。
朝4時起きという超睡眠不足に加えて連日の疲れから何もできなかったけど・・・
とりあえず、シーワールドに行っておしまい。
明日は本当にNew Yorkのはず・・・
2010-05-16
Orland最終日
諸事情により、6日目と7日目はスキップ。
最終日。今日はユニバーサルスタジオに行ってきた。新しいジェットコースターがあったのだが、60分待ちとかだったので断念。
適当に他のを堪能して一日終了。
かなり歩いたので足が痛い。
今日がOrlando最終日。次はニューヨーク。
どうでもいいが、昨日と一昨日で韓国人が嫌いから大嫌いになった。やつらは本当におかしい。
最終日。今日はユニバーサルスタジオに行ってきた。新しいジェットコースターがあったのだが、60分待ちとかだったので断念。
適当に他のを堪能して一日終了。
かなり歩いたので足が痛い。
今日がOrlando最終日。次はニューヨーク。
どうでもいいが、昨日と一昨日で韓国人が嫌いから大嫌いになった。やつらは本当におかしい。
2010-05-13
Orlando五日目
今日はアクアティカで泳いだ。
前回いけなかったウォータースライダーを制覇したので、ちょっと満足。
やはりシーズンより少し早いせいか、人がまばら。いいことだが、ちと(気温的に)寒かった・・・
っで、疲れたので早めに切り上げて、適当に休憩してからIron Man 2を観ることに。
きっとまだ日本では上映されて無いだろうのでネタはばらさない方向で。
(ってか前作は上映されたのか?)
感想。近作はコメディー色が結構だされている感じで、笑いどころが結構あった。
内容的にはまずまず。突っ込みどころも多々あったが、個人的には観て損はないと思えた。
Iron Manの役者とシャーロックホームズの役者が一緒なのだが(名前を失念・・・)、この人いい演技をするなぁと思う。この手の自信過剰で子供っぽさのある役がはまり役なのか、この人自身がすばらしい役者なのか(もしくは両方か)分からんけど。
そういえば、映画館からの帰りにパトカーがIHop(レストラン)に10台くらい停まってるを見た。きっと強盗が入ったのだろう・・・
怖い・・・
前回いけなかったウォータースライダーを制覇したので、ちょっと満足。
やはりシーズンより少し早いせいか、人がまばら。いいことだが、ちと(気温的に)寒かった・・・
っで、疲れたので早めに切り上げて、適当に休憩してからIron Man 2を観ることに。
きっとまだ日本では上映されて無いだろうのでネタはばらさない方向で。
(ってか前作は上映されたのか?)
感想。近作はコメディー色が結構だされている感じで、笑いどころが結構あった。
内容的にはまずまず。突っ込みどころも多々あったが、個人的には観て損はないと思えた。
Iron Manの役者とシャーロックホームズの役者が一緒なのだが(名前を失念・・・)、この人いい演技をするなぁと思う。この手の自信過剰で子供っぽさのある役がはまり役なのか、この人自身がすばらしい役者なのか(もしくは両方か)分からんけど。
そういえば、映画館からの帰りにパトカーがIHop(レストラン)に10台くらい停まってるを見た。きっと強盗が入ったのだろう・・・
怖い・・・
2010-05-12
Orlando四日目
今日はブッシュガーデンに行ってきた。
特筆するようなことは実はないのだが、とりあえず人は少なめだった。
どうでもいいのだが、この時期のフロリダは天気が微妙。昼間はあほかと思うほど暑いのに、夜になると冷える。ってか、寒い。
レストランとかバスとかガンガンに冷房が効いてるので、長袖を着ないと寒くてしょうがない。っが外は暑い(昼限定)。
更にどうでもいいのだが、枕が替わったせいか眠りが浅く疲れが取れない。毎日寝不足で太陽の下はきつい・・・
特筆するようなことは実はないのだが、とりあえず人は少なめだった。
どうでもいいのだが、この時期のフロリダは天気が微妙。昼間はあほかと思うほど暑いのに、夜になると冷える。ってか、寒い。
レストランとかバスとかガンガンに冷房が効いてるので、長袖を着ないと寒くてしょうがない。っが外は暑い(昼限定)。
更にどうでもいいのだが、枕が替わったせいか眠りが浅く疲れが取れない。毎日寝不足で太陽の下はきつい・・・
2010-05-11
Orlando三日目
今日はシーワールドに行ってきた。
入園する前に、一悶着あったのでその話と+α
シーワールド、アクアティカ、ブッシュガーデン、その他といくつかのテーマパークは経営者が同じっぽいのでいくつか周るなちょっとお得なチケットがある。
っでそのチケットを買った際に、何を間違ったのか名前のつづりが違った。っで、正しいのにしてくれといったら、
「問題ない」
との一言。どう考えてもおかしい。
チケットに必要に応じてID(大概パスポート)を見せてもらうことがあるなんて注意書きがあって、チケットの名前とIDの名前が食い違ってたら問題にしかならないはずだ。
っが、チケット売り場のおばさんは問題ないの一点張り。しょうがないのでカスタマーサービスへ。
っが、さらにここでも問題ないと言われる。
しょうがないので、ID要求されたらどうなるんだってわざわざ説明したら、その人の判断では決定できないので上司に指示を仰ぐといって中に入ってった。
結論を言えばチケットは無事交換されたのだが、どう考えても手際というかいろいろおかしすぎ。
訴訟大国のくせに、訴えられたらどうするんだって突込みどころが山ほどある気がする。
まだローシーズンなのか、どこもかしももガラガラ。世界的な不景気で旅行者が少ないのかもしれないが、これでは路頭に迷う人がでるんじゃねぇの?ってくらいガラガラ。
実際、去年あったホテルとか、レストランとか結構消えているので路頭に迷っているのだろうが・・・
まぁ、待ち時間が少ないというのはこちらにとってはうれしいことなのでどうでもいいが。
どうでもいい話。
アメリカという国柄なのか、フロリダだからなのかは分からないが、こっちにきて英語を話すことにすごく抵抗を感じる。抵抗というか、(元々そんなに正しくはないが)発音がどうも違うらしい。っで、少しでも発音が違うと理解されない・・・
でも、観光地なんだし旅行者が全員正しい(何をもって正しいというか知らんが)英語が喋れるわけないので、理解しようとする姿勢が必要だと思うのだが、それも見受けられない・・・orz
なので、なんか居心地が悪いというか、そんな感じ。
ちなみに今日通じなかった英語はなんと「hot」!
今まで通じなかったことは無いのだが、こっちで「ホット」という通じない。どちらかと言えば(厳密には違う)「ハット」に近い発音がアメリカ訛り(南部だけかも)っぽい。
waterと同じ感じだわね。
個人的には、「聞き返さないと分からないほどの差はない気がする」のだがどうだろう?
特に「hot tea」って言ったら、少なくとも「tea」の部分は分かるだろうと言いたい。メニューにアイスティーはないんだし。そこも違うかも?それは・・・
入園する前に、一悶着あったのでその話と+α
シーワールド、アクアティカ、ブッシュガーデン、その他といくつかのテーマパークは経営者が同じっぽいのでいくつか周るなちょっとお得なチケットがある。
っでそのチケットを買った際に、何を間違ったのか名前のつづりが違った。っで、正しいのにしてくれといったら、
「問題ない」
との一言。どう考えてもおかしい。
チケットに必要に応じてID(大概パスポート)を見せてもらうことがあるなんて注意書きがあって、チケットの名前とIDの名前が食い違ってたら問題にしかならないはずだ。
っが、チケット売り場のおばさんは問題ないの一点張り。しょうがないのでカスタマーサービスへ。
っが、さらにここでも問題ないと言われる。
しょうがないので、ID要求されたらどうなるんだってわざわざ説明したら、その人の判断では決定できないので上司に指示を仰ぐといって中に入ってった。
結論を言えばチケットは無事交換されたのだが、どう考えても手際というかいろいろおかしすぎ。
訴訟大国のくせに、訴えられたらどうするんだって突込みどころが山ほどある気がする。
まだローシーズンなのか、どこもかしももガラガラ。世界的な不景気で旅行者が少ないのかもしれないが、これでは路頭に迷う人がでるんじゃねぇの?ってくらいガラガラ。
実際、去年あったホテルとか、レストランとか結構消えているので路頭に迷っているのだろうが・・・
まぁ、待ち時間が少ないというのはこちらにとってはうれしいことなのでどうでもいいが。
どうでもいい話。
アメリカという国柄なのか、フロリダだからなのかは分からないが、こっちにきて英語を話すことにすごく抵抗を感じる。抵抗というか、(元々そんなに正しくはないが)発音がどうも違うらしい。っで、少しでも発音が違うと理解されない・・・
でも、観光地なんだし旅行者が全員正しい(何をもって正しいというか知らんが)英語が喋れるわけないので、理解しようとする姿勢が必要だと思うのだが、それも見受けられない・・・orz
なので、なんか居心地が悪いというか、そんな感じ。
ちなみに今日通じなかった英語はなんと「hot」!
今まで通じなかったことは無いのだが、こっちで「ホット」という通じない。どちらかと言えば(厳密には違う)「ハット」に近い発音がアメリカ訛り(南部だけかも)っぽい。
waterと同じ感じだわね。
個人的には、「聞き返さないと分からないほどの差はない気がする」のだがどうだろう?
特に「hot tea」って言ったら、少なくとも「tea」の部分は分かるだろうと言いたい。メニューにアイスティーはないんだし。そこも違うかも?それは・・・
2010-05-10
Orlando二日目
ひたすらショッピングな1日であった。ぐったり・・・
ショッピングモールを3つくらいはしごするという地獄のような一日・・・
主にアウトレットなのだが、こっちのアウトレットは結構豪快に(普通なのかもしれないが)値引きをする。今日は母の日ということで50%引きだった。
しかし、それって裏を返せば50%引いても利益がでるってことだよね?
通常価格がどれだけぼられてるのかよく分かる。ブランド名ってつけたもん勝ちだなぁ。
ショッピングモールを3つくらいはしごするという地獄のような一日・・・
主にアウトレットなのだが、こっちのアウトレットは結構豪快に(普通なのかもしれないが)値引きをする。今日は母の日ということで50%引きだった。
しかし、それって裏を返せば50%引いても利益がでるってことだよね?
通常価格がどれだけぼられてるのかよく分かる。ブランド名ってつけたもん勝ちだなぁ。
2010-05-09
Orlando一日目
昨日(時差の関係でいつだかもはや分かってないが・・・)飛行機に乗ってアメリカに出発した。
行きの飛行機の中でアイスランドの噴火が見えたのは貴重な体験だったと言えるだろう。
(写真も撮ったけど、いろいろ無いから載せれない。気が向いたら)
まずはNew Yorkでアメリカに入国。なんだか今回の入国審査はえらく人種差別を感じたが、まぁアメリカだしこんなもんだろうと勝手に納得しておく。
(でも、白人は一言交わして他は根掘り葉掘り聞くってさすがにどうよ!)
っで、トランスファーでオーランドへ。
特に何かすることもなく、ウォールマートへ行って飲み物当の買い物。
その後夕食で現在に至る。
一日目だしこんなもんだろう。
時差ぼけはないと思うのだが、旅の疲れでやたら眠い・・・
行きの飛行機の中でアイスランドの噴火が見えたのは貴重な体験だったと言えるだろう。
(写真も撮ったけど、いろいろ無いから載せれない。気が向いたら)
まずはNew Yorkでアメリカに入国。なんだか今回の入国審査はえらく人種差別を感じたが、まぁアメリカだしこんなもんだろうと勝手に納得しておく。
(でも、白人は一言交わして他は根掘り葉掘り聞くってさすがにどうよ!)
っで、トランスファーでオーランドへ。
特に何かすることもなく、ウォールマートへ行って飲み物当の買い物。
その後夕食で現在に至る。
一日目だしこんなもんだろう。
時差ぼけはないと思うのだが、旅の疲れでやたら眠い・・・
2010-05-07
出発前夜
なぜか標題の後ろに「の夜」という馬から落馬するみたいな表現にしたくなった。
何故だ?
明日の朝にアメリカに向かって出発。
休暇です。2週間ほど行ってきます。
こっちにきて本当にありがたいなぁと思っているのはこの有給二週間とか普通に取れること!
日本にいたときは1週間でさえ不可能だったのに・・・
(まぁ、その分いろいろサービスは悪いが、24時間のコンビニなんてここではありえん)
アメリカといえば、普天間の問題が深刻化しているようです。
ひっくり返したかと思えば、やっぱり元に戻したいと言ってみたり、そうじゃないとその日のうちに撤回したり。
鳩山由紀夫氏(あえて総理とは呼ばない)は本当に妄言癖がおありのようです。
(正直、今のところ自分とは関係ないので)情報をしっかり選別せず、マスコミの言うなりに民主党に投票した人たち、つまり国民に原因の一端があるので、しっかり苦しんで次回に活かしてもらいたいなぁと。
マスコミは事実を流せばいいんだよ。変な情報操作すんな!
(言いたかっただけ)
口蹄病のこととかもぜんぜん報道されてないみたいだし・・・
どうなってるのかね、日本・・・
何故だ?
明日の朝にアメリカに向かって出発。
休暇です。2週間ほど行ってきます。
こっちにきて本当にありがたいなぁと思っているのはこの有給二週間とか普通に取れること!
日本にいたときは1週間でさえ不可能だったのに・・・
(まぁ、その分いろいろサービスは悪いが、24時間のコンビニなんてここではありえん)
アメリカといえば、普天間の問題が深刻化しているようです。
ひっくり返したかと思えば、やっぱり元に戻したいと言ってみたり、そうじゃないとその日のうちに撤回したり。
鳩山由紀夫氏(あえて総理とは呼ばない)は本当に妄言癖がおありのようです。
(正直、今のところ自分とは関係ないので)情報をしっかり選別せず、マスコミの言うなりに民主党に投票した人たち、つまり国民に原因の一端があるので、しっかり苦しんで次回に活かしてもらいたいなぁと。
マスコミは事実を流せばいいんだよ。変な情報操作すんな!
(言いたかっただけ)
口蹄病のこととかもぜんぜん報道されてないみたいだし・・・
どうなってるのかね、日本・・・
2010-04-30
OS: GRUBの続きの続き
前回GRUBでカーネルイメージが読み込めたと思って喜んでいたのだが、VRAM周りのコードが上手く動いていなかった。
GRUBが最初に読み込む部分はアセンブラで書いているのだが、カーネルのコード(になる予定)から戻ってきたときには文字列が表示されるのに、コード内部で表示しようとしたら意図しない文字が表示されていた。
それでもって、自分で作ったVRAM用のクラスを使うとGRUBが再起動しまくりで、大変なことになっていた。
何が原因か分からなかったので、とりあえずデバッグすることに。
qemuのデバッグってどうやるのかとググって見たら、こんなページに遭遇。
-sと-Sオプションをつけるのね。意味は調べてないけど・・・
っで、gdbをカーネルイメージを引数にして起動。
(gdb) target remote localhost:1234
このコマンドでqemuに接続してすれば、普通にブレークポイントとか設定可能。
っで、動かしてみたところ、GRUBはELF形式にしか対応してないことが判明。
Cygwinで作ってるので、PE形式なイメージなわけで、どうしろと?
クロスコンパイラを作るのか?(GCCのターゲット指定でコンパイルだと思う)
と思っていたが、objcopyでバイナリ形式にしたら動いた。
まぁ、とりあえずこれでいいか。GRUB周りで苦しむのは本意ではないし・・・
どうでもいいが、調べている過程でmultiboot.hを覗いたのだが、カーネルに渡す構造体のなかにVBEの情報が入ってた。
まぁ、そのうち対応する予定なので、自前でなんだかやらなくても済んだかもと期待しておこう。
(でも、先にメモリとか割り込みテーブルとかやることは満載・・・)
GRUBが最初に読み込む部分はアセンブラで書いているのだが、カーネルのコード(になる予定)から戻ってきたときには文字列が表示されるのに、コード内部で表示しようとしたら意図しない文字が表示されていた。
それでもって、自分で作ったVRAM用のクラスを使うとGRUBが再起動しまくりで、大変なことになっていた。
何が原因か分からなかったので、とりあえずデバッグすることに。
qemuのデバッグってどうやるのかとググって見たら、こんなページに遭遇。
-sと-Sオプションをつけるのね。意味は調べてないけど・・・
っで、gdbをカーネルイメージを引数にして起動。
(gdb) target remote localhost:1234
このコマンドでqemuに接続してすれば、普通にブレークポイントとか設定可能。
っで、動かしてみたところ、GRUBはELF形式にしか対応してないことが判明。
Cygwinで作ってるので、PE形式なイメージなわけで、どうしろと?
クロスコンパイラを作るのか?(GCCのターゲット指定でコンパイルだと思う)
と思っていたが、objcopyでバイナリ形式にしたら動いた。
まぁ、とりあえずこれでいいか。GRUB周りで苦しむのは本意ではないし・・・
どうでもいいが、調べている過程でmultiboot.hを覗いたのだが、カーネルに渡す構造体のなかにVBEの情報が入ってた。
まぁ、そのうち対応する予定なので、自前でなんだかやらなくても済んだかもと期待しておこう。
(でも、先にメモリとか割り込みテーブルとかやることは満載・・・)
2010-04-29
歯のクリーニング
今までの人生ではじめての経験であった。
今までそんなものとは無縁で生きてきたのだが、折角保険に入ってるし使わないともったいないとそそのかされて行って来た。
・・・
・・・・・・
・・・・・・・・・
涙が出るほど痛かった。
おかしいだろ!
歯を削るのと同じ機械だと思われるものでがりがり何かを削られて(多分歯石)、そのあとポリッシャーで表面を磨くという工程だったと思うのだが、
30分が永遠に続くんじゃないかと思えたくらい地獄の時間であった。
歯科衛生士さん(でいいのかな?)話によると、少なくとも6ヶ月に1回は行った方いいそうだ。
年に2回もあの地獄を味わうのかと思うと・・・
歯磨きの重要性を思い知った瞬間だった。
今までそんなものとは無縁で生きてきたのだが、折角保険に入ってるし使わないともったいないとそそのかされて行って来た。
・・・
・・・・・・
・・・・・・・・・
涙が出るほど痛かった。
おかしいだろ!
歯を削るのと同じ機械だと思われるものでがりがり何かを削られて(多分歯石)、そのあとポリッシャーで表面を磨くという工程だったと思うのだが、
30分が永遠に続くんじゃないかと思えたくらい地獄の時間であった。
歯科衛生士さん(でいいのかな?)話によると、少なくとも6ヶ月に1回は行った方いいそうだ。
年に2回もあの地獄を味わうのかと思うと・・・
歯磨きの重要性を思い知った瞬間だった。
2010-04-16
暗いニュースが多いなぁ・・・
日本の政治関連のニュースを読んでいると暗いニュースしかみない。
まぁ、税金は払ってないし個人的にはあまり関係ないのだがやはり読んでいると辛い。
ポーランド大統領の国葬に出席しない総理大臣とか、
オバマ大統領にLoopyと呼ばれる総理大臣とか、
ジミンガーと叫んで自分の責任を放り出す総理大臣とか、
普天間基地の話はマスコミが報道し過ぎたせいで国民が知りすぎたなんて言っちゃう総理大臣とか、
そのくせ桜を見る会は開く総理大臣とか、
会話全文を読んでも質疑応答になってない回答をする総理大臣とか、
そもそも、国会に出ることが嫌いで仕事するのも嫌いそうに見える総理大臣とか
そんな感じの洒落で済むものから洒落にならないレベルのものまでたくさん。
(どれをとっても洒落にはならんが・・・)
ま、それを報道しない(らしい)マスコミも大問題だろうし、傀儡政権の裏でとんでも法案を無理やり通そうとしている民主党幹事長がいるらしいけど・・・
大丈夫なんだろうか、日本・・・
個人的に一番問題だなと思うのは、こんな状態になってもデモ一つ起こさない国民だろうと思ったり・・・
もはや政治家は役に立たないどころか、敵でしかない状態なのだから何か行動を起こす人がいてもよくないか?
(といって自分が起こすわけでもないので、やはり僕も問題な国民の一人・・・)
まぁ、税金は払ってないし個人的にはあまり関係ないのだがやはり読んでいると辛い。
ポーランド大統領の国葬に出席しない総理大臣とか、
オバマ大統領にLoopyと呼ばれる総理大臣とか、
ジミンガーと叫んで自分の責任を放り出す総理大臣とか、
普天間基地の話はマスコミが報道し過ぎたせいで国民が知りすぎたなんて言っちゃう総理大臣とか、
そのくせ桜を見る会は開く総理大臣とか、
会話全文を読んでも質疑応答になってない回答をする総理大臣とか、
そもそも、国会に出ることが嫌いで仕事するのも嫌いそうに見える総理大臣とか
そんな感じの洒落で済むものから洒落にならないレベルのものまでたくさん。
(どれをとっても洒落にはならんが・・・)
ま、それを報道しない(らしい)マスコミも大問題だろうし、傀儡政権の裏でとんでも法案を無理やり通そうとしている民主党幹事長がいるらしいけど・・・
大丈夫なんだろうか、日本・・・
個人的に一番問題だなと思うのは、こんな状態になってもデモ一つ起こさない国民だろうと思ったり・・・
もはや政治家は役に立たないどころか、敵でしかない状態なのだから何か行動を起こす人がいてもよくないか?
(といって自分が起こすわけでもないので、やはり僕も問題な国民の一人・・・)
2010-04-10
OS: GRUBの続き
昨日のエントリーで、いまいち動かないと書いたが、少し前進した。
マルチブートに関してヘッダー等がいるので、GRUBのサイトからmultiboot-0.6.96をダウンロード。その中にboot.Sというファイルとkernel.cというファイルがあるのでコピー。
(とりあえず、動作確認できればいいので・・・)
っで、普通にビルド。
_edataが定義されてないと怒られる。
なんだこれ?
Google先生に聞いてみる。
・・・
・・・・・・
・・・・・・・・・
.dataセクションの終わりを示すポインタらしい。
うわさによるとリンカーが自動で作るものらしいが、CygwinのGCCではなのかGCC 3.4.4ではなのかは知らないが作ってくれないらしい。
とうことで、リンカスクリプトを書く。
というか、ここから拝借。
cygwinではelf-i386はサポートされてない(というかpe-i386しかサポートされてない)ので、OUTPUT_FORMATの行を削除。OUTPUT_ARCHも、まぁいらんかなと思い、削除。
っで、make。
なんか表示された。
激しく文字化けというか、意味不明の文字ばかり見えるが、とりあえず何か表示されているのでよしとしよう。
あとはカーネルっぽくいろいろ作るだか(というかそれが一番大変だと思うが・・・)
マルチブートに関してヘッダー等がいるので、GRUBのサイトからmultiboot-0.6.96をダウンロード。その中にboot.Sというファイルとkernel.cというファイルがあるのでコピー。
(とりあえず、動作確認できればいいので・・・)
っで、普通にビルド。
_edataが定義されてないと怒られる。
なんだこれ?
Google先生に聞いてみる。
・・・
・・・・・・
・・・・・・・・・
.dataセクションの終わりを示すポインタらしい。
うわさによるとリンカーが自動で作るものらしいが、CygwinのGCCではなのかGCC 3.4.4ではなのかは知らないが作ってくれないらしい。
とうことで、リンカスクリプトを書く。
というか、ここから拝借。
cygwinではelf-i386はサポートされてない(というかpe-i386しかサポートされてない)ので、OUTPUT_FORMATの行を削除。OUTPUT_ARCHも、まぁいらんかなと思い、削除。
っで、make。
なんか表示された。
激しく文字化けというか、意味不明の文字ばかり見えるが、とりあえず何か表示されているのでよしとしよう。
あとはカーネルっぽくいろいろ作るだか(というかそれが一番大変だと思うが・・・)
2010-04-09
OS: GRUBをCygwinで無理やり使う
ここ3日くらい調べてようやくなんとかなった。
ひょっとして同じところで躓いてる人がいるかもしれないので、メモ。
用意するもの:
Cygwin(当然か)
VFD(ここから)
あらかじめ、fstabに以下を記述。
grub-installでFDイメージにインストール。このとき、デバイスは/dev/fd0を指定する。
面倒なので、スクリプト書いた。
きっと必要に応じて、イメージのdevice.mapとかを編集すればいいはず。とりあえず、GRUBが起動するところまでは確認。
あとは、自前のカーネルを読み込むだけなのだが、grub.cfgの書き方がいまいち分かっていない・・・
それとも、カーネルの方がまずいのかな?
「error: attempt to seek outside of file」
ってエラーだからカーネルかな・・・
調べないと・・・
ひょっとして同じところで躓いてる人がいるかもしれないので、メモ。
用意するもの:
Cygwin(当然か)
VFD(ここから)
あらかじめ、fstabに以下を記述。
a: /cygdrive/a vfat binary,posix=0 0 0っで、ddでFDサイズのファイルを作って、VFDで開いてフォーマットしたら、
grub-installでFDイメージにインストール。このとき、デバイスは/dev/fd0を指定する。
面倒なので、スクリプト書いた。
#!/bin/sh -x # generate floppy image with grub2. grub=/lib/grub/i386-pc file=fd.img vfd=/cygdrive/d/bin/vfd/vfd fd0=/cygdrive/a # create floppy image. dd if=/dev/zero of=$file bs=1k count=1440 $vfd open $file # format $vfd format # いらないかも・・・ mkdir -p $fd0/boot/grub # 適当にモジュールを指定しているので、必要なもの不必要なものは調べる。 grub-install --modules="_chain ls pc multiboot gpt fat boot reboot configfile cat help " --root-directory=$fd0 /dev/fd0 # grub.cfgは作ってくれないので、別途コピー cp grub.cfg $fd0/boot/grub $vfd save $vfd closeこんな感じ。
きっと必要に応じて、イメージのdevice.mapとかを編集すればいいはず。とりあえず、GRUBが起動するところまでは確認。
あとは、自前のカーネルを読み込むだけなのだが、grub.cfgの書き方がいまいち分かっていない・・・
それとも、カーネルの方がまずいのかな?
「error: attempt to seek outside of file」
ってエラーだからカーネルかな・・・
調べないと・・・
2010-04-03
小ネタ
あまりに書いてないので小ネタを小出しに・・・
(半分くらい下ネタかも・・・)
日本にいたときのこと。
(こないだの帰省の時です)
栄スカイルのABCマートに靴を買いにいった。ものすごい勢いで地域が特定されているが気にしない・・・
大抵そういう店はBGMが流れているが、そのとき流れていた曲の一部に「ピーナッツ」って言っていると思われる部分があった。
でも、どう聞いても聞こえ方がNGな聞こえ方・・・
「ッツ」が「ス」に聞こえる・・・
どう考えてもアウトだろうと思った瞬間だった。
気合で探してみた。
くるりの愉快なピーナッツという曲みたい。
3:58秒くらいが個人的にはアウト・・・
いい曲だとは思うのだが、そこが印象に残りすぎる・・・
(半分くらい下ネタかも・・・)
日本にいたときのこと。
(こないだの帰省の時です)
栄スカイルのABCマートに靴を買いにいった。ものすごい勢いで地域が特定されているが気にしない・・・
大抵そういう店はBGMが流れているが、そのとき流れていた曲の一部に「ピーナッツ」って言っていると思われる部分があった。
でも、どう聞いても聞こえ方がNGな聞こえ方・・・
「ッツ」が「ス」に聞こえる・・・
どう考えてもアウトだろうと思った瞬間だった。
気合で探してみた。
くるりの愉快なピーナッツという曲みたい。
3:58秒くらいが個人的にはアウト・・・
いい曲だとは思うのだが、そこが印象に残りすぎる・・・
2010-03-19
最終日
明日の朝に日本を発つ。
8時40分の飛行機なので、チェックインは6時半くらいか?
ここ読んでて暇でこのクソ朝早くにこれそうな人は見送りに来てくれるとすごくうれしい、と明に言ってみよう。
最初にオランダに渡ったときは新天地に移動みたいな感じだったので、そうでもなかったが、今回は少し寂しい気がする。
やはりここにはいろいろ残してきたんだなぁと実感した。
涙で前が見えないということはないが、そんな気分。
8時40分の飛行機なので、チェックインは6時半くらいか?
ここ読んでて暇でこのクソ朝早くにこれそうな人は見送りに来てくれるとすごくうれしい、と明に言ってみよう。
最初にオランダに渡ったときは新天地に移動みたいな感じだったので、そうでもなかったが、今回は少し寂しい気がする。
やはりここにはいろいろ残してきたんだなぁと実感した。
涙で前が見えないということはないが、そんな気分。
2010-03-14
定演
行ってきた。
久しぶりに会えた先輩とかもいらっしゃってちょっとした同窓会の気分。
演奏自体は、合同はよかった。
後は、Topが抜きすぎで・・・少人数で大人数の歌い方をしていても映えんだろうと思うのだが・・・
2年後の合同は計画を立てて立つ予定でいこう。
久しぶりに会えた先輩とかもいらっしゃってちょっとした同窓会の気分。
演奏自体は、合同はよかった。
後は、Topが抜きすぎで・・・少人数で大人数の歌い方をしていても映えんだろうと思うのだが・・・
2年後の合同は計画を立てて立つ予定でいこう。
2010-03-11
今更ながら
日本にいます。
先週の土曜日に戻っていました。
現在とりあえず日本を堪能してます。
高速が高い・・・
日本語が話せるっていいなぁ・・・
道とか分からなくてもとりあえずコンビニで聞けるとか便利すぎ!!
一応来週までいます。
先週の土曜日に戻っていました。
現在とりあえず日本を堪能してます。
高速が高い・・・
日本語が話せるっていいなぁ・・・
道とか分からなくてもとりあえずコンビニで聞けるとか便利すぎ!!
一応来週までいます。
2010-02-27
2010-02-26
鞍替え
長年(大学3年の時から)xyzzyを使ってきたが、諸事情によりEmacsを使うことにした。
職場のPCが英語だから文字化けするとか、将来的にLinuxを使う予定があるとか、利用者人口が多いのでスクリプトが充実してるとか、まぁ理由はいろいろ。
xyzzy自体がEmacsのCommonLisp版みたいなものなので鞍替えしてもそんなに違和感はない、っがさすがに個人的な設定とかはしないと些細な違いに戸惑う。
大きなのは、C-hのHelpだろう。
後は今まで使ってきたxyzzy-lispをemacs-lispからみつければ終了。
まぁ時間はそんなにかからない。
個人的にはさくさく動いたxyzzyの方がいいかなぁとも思いながら、Emacsももっさり感を除けばいい感じなので満足。
しばらくは平行して使うことになるかな。
それにしても、xyzzyのフォルダごとグレップとかの昨日ってEmacsにもあるのかな?
職場のPCが英語だから文字化けするとか、将来的にLinuxを使う予定があるとか、利用者人口が多いのでスクリプトが充実してるとか、まぁ理由はいろいろ。
xyzzy自体がEmacsのCommonLisp版みたいなものなので鞍替えしてもそんなに違和感はない、っがさすがに個人的な設定とかはしないと些細な違いに戸惑う。
大きなのは、C-hのHelpだろう。
後は今まで使ってきたxyzzy-lispをemacs-lispからみつければ終了。
まぁ時間はそんなにかからない。
個人的にはさくさく動いたxyzzyの方がいいかなぁとも思いながら、Emacsももっさり感を除けばいい感じなので満足。
しばらくは平行して使うことになるかな。
それにしても、xyzzyのフォルダごとグレップとかの昨日ってEmacsにもあるのかな?
2010-02-23
招待状
大学の時に所属していた合唱団から定期演奏会の招待状が届いた。
正直驚き!!
実家の方に届くものだと思っていた。心意気はすばらしい!
ま、呼ばれなくても行くつもりだったけどね。
それはそれと置いておいて、微妙なダメだし。
今日届いても、航空券、有給とうはどう考えても間に合いません。最低2ヶ月はほしいです。
しかし、壮大な曲ばかりで驚いた。
雪花もあるし・・・懐かしい。もう歌えんが・・・
今メンバー何人なんだろう?
正直驚き!!
実家の方に届くものだと思っていた。心意気はすばらしい!
ま、呼ばれなくても行くつもりだったけどね。
それはそれと置いておいて、微妙なダメだし。
今日届いても、航空券、有給とうはどう考えても間に合いません。最低2ヶ月はほしいです。
しかし、壮大な曲ばかりで驚いた。
雪花もあるし・・・懐かしい。もう歌えんが・・・
今メンバー何人なんだろう?
2010-02-15
C++: グローバル領域
GCの続き。
スタックからルートを取得する方法は理解したが、グローバル変数はどうするんだろうと調べてみた。
メモリの領域は、スタック、データ、テキストの3つに分かれていて、テキストが実コード、スタックはスタック、っでデータ領域にグローバル変数とかが入るらしい。
じゃあ、これを取得すればいいんじゃん!なんて思ったのだが、調べてもそんなもの頭と底をとる方法がない。普通こんなもん意識しないから、ある意味当たり前か・・・
とりあえず、試してみてだめだったこと。
DSセグメントレジスタを16ビット左シフトした値を頭とし、最初にヒープから取得したアドレスを底として捜査。
→ 無理。よく見るとグローバルなアドレスはヒープよりも下にある。
ちなみに、もう一つ問題があって、こんなコードが不正になる。
理由:GCでアドレスが変わるので、例えばpが0x0032fec8を指していて、GC後に0x0033fda8になったとすると、実際に変数pが指している値はそのまま前の値になって不正になる。
スタックポインタの指す値を上書きしてるから大丈夫かと思ったら、甘かった・・・う~ん・・・
原因はスタックポインタ上にアドレスが無いから。
なぜ?
少し処理を足すとスタックが上書きされたりして、グローバル変数なのに問答無用で回収されたり・・・
なぜだ・・・
スタックからルートを取得する方法は理解したが、グローバル変数はどうするんだろうと調べてみた。
メモリの領域は、スタック、データ、テキストの3つに分かれていて、テキストが実コード、スタックはスタック、っでデータ領域にグローバル変数とかが入るらしい。
じゃあ、これを取得すればいいんじゃん!なんて思ったのだが、調べてもそんなもの頭と底をとる方法がない。普通こんなもん意識しないから、ある意味当たり前か・・・
とりあえず、試してみてだめだったこと。
DSセグメントレジスタを16ビット左シフトした値を頭とし、最初にヒープから取得したアドレスを底として捜査。
→ 無理。よく見るとグローバルなアドレスはヒープよりも下にある。
ちなみに、もう一つ問題があって、こんなコードが不正になる。
int *p = (int*)gc_malloc(sizeof(int) * 4); // とりあえず4つ確保 p[0] = 1; p[1] = 2; gc_collect(); // p[0] == 0 !!コレクターを呼び出さなくても、GCが走れば不正になる。
理由:GCでアドレスが変わるので、例えばpが0x0032fec8を指していて、GC後に0x0033fda8になったとすると、実際に変数pが指している値はそのまま前の値になって不正になる。
スタックポインタの指す値を上書きしてるから大丈夫かと思ったら、甘かった・・・う~ん・・・
2010/02/18追記
実際には上記の不正は違っていて、回収されてはいけない値が回収されていた。原因はスタックポインタ上にアドレスが無いから。
なぜ?
少し処理を足すとスタックが上書きされたりして、グローバル変数なのに問答無用で回収されたり・・・
なぜだ・・・
2010-02-11
C++: Copy GC
C++ではなくてCの話だが、まぁいいや。
いろいろな理由があってガーベジコレクションの勉強をしている。
BoehmGCを使えばいいのだが、ちょっとした理由からそれができないので・・・
っで、とりあえず保守的GCかPreciseGCしか知らなかったので調べてみた。
結構いろいろ種類があるが、Mostly-copying GCがよさげかなと(根拠なし)思い、その元となったCopy GCを実装してみた。
といってもこのページをとりあえず理解のために写経しただけとも言う。
基本の考え方は、ヒープとルートが分かればなんとかなりそうな感じ。
っが、どうやってルート調べるのかがすごく疑問だった。
それを解決してくれたのがこのページ
一般教養としてのGarbage Collection
ぜんぜん一般教養ではないと思うが・・・
ルートは基本スタック上につまれている変数から辿れるポインタだと思えばよさそう。
なら、ESPの値を引っ張ってくればいいだけじゃん、と思い実装。
動いた!
このままでは使えないのでもう少し調べないとなぁ・・・
(Mostly-copying GCの実装って難しいのかな?ぜんぜん見ない・・・)
いろいろな理由があってガーベジコレクションの勉強をしている。
BoehmGCを使えばいいのだが、ちょっとした理由からそれができないので・・・
っで、とりあえず保守的GCかPreciseGCしか知らなかったので調べてみた。
結構いろいろ種類があるが、Mostly-copying GCがよさげかなと(根拠なし)思い、その元となったCopy GCを実装してみた。
といってもこのページをとりあえず理解のために写経しただけとも言う。
基本の考え方は、ヒープとルートが分かればなんとかなりそうな感じ。
っが、どうやってルート調べるのかがすごく疑問だった。
それを解決してくれたのがこのページ
一般教養としてのGarbage Collection
ぜんぜん一般教養ではないと思うが・・・
ルートは基本スタック上につまれている変数から辿れるポインタだと思えばよさそう。
なら、ESPの値を引っ張ってくればいいだけじゃん、と思い実装。
動いた!
このままでは使えないのでもう少し調べないとなぁ・・・
(Mostly-copying GCの実装って難しいのかな?ぜんぜん見ない・・・)
2010-02-10
movie: AVATAR
土曜日に観たので、実は4日くらい前・・・
アバターを観てきた。リアルの世界にパンドラがないって言って自殺(?)しちゃう人がでたやつ。
以下、多分にネタバレ注意。
物語は他の星に移民する地球人の一人、ジェイクを中心に進められる。
このジェイク君(といっても、見た目は僕より年上だったから、30以上か?)がものすごくガキ!精神的に。
個人的に副題は、ジェイク成長物語だと思っている。
宣伝(?)どおり彼は下半身不随で車椅子。なので、動く体を手に入れられてはしゃぐ。っで、はしゃぎすぎて他のメンバーとはぐれ、アバターの村にの娘に命を助けられる。
これはチャンスとばかりに地球軍がジェイクにスパイを命じ、ジェイクはアバターの生態(といっても言語とか生活習慣とか)を探る。
正直、この辺までは微妙。いや、アクションとかは多めでいいんだけど、ジェイクが図体の割りにガキっぽくて見てていらいらした。
っで、しばらくすると、地球軍が領地を広げるために木をなぎ倒していく。止めようとするジェイク。相手は鉄の塊、メインカメラを素手で壊して終了。
っが、当然カメラなので自分の姿が映り、謹慎処分をくらう。
地球軍は何故か星を侵略して自分たちの物にしたいらしく、戦争をしかける。
っで、後はお約束の勧善懲悪(ではないが)なアクションで地球軍を倒し、ジェイクがアバターに生まれ変わって終了。
どこに欝になる要素があったのか分からんかった。
個人的には、白人 VS ネイティブアメリカンって感じ。この映画の中では、アバター、自然の動物が一体になって星を侵略から守ったけど、
歴史上では卑怯な白人がネイティブアメリカンから土地を奪い取ったんだよなぁ、とか思いながら観てた。
軍隊とか、地球連合軍なのにすごくアメリカっぽい感じだったし(ものすごく偏見が混じってます)
2度観たいとは思わない感じの映画。でもCGとかアクションとかはよかった。
ストーリーは正直2流だなぁと感じた。
(何様のつもりだ、俺・・・)
アバターを観てきた。リアルの世界にパンドラがないって言って自殺(?)しちゃう人がでたやつ。
以下、多分にネタバレ注意。
物語は他の星に移民する地球人の一人、ジェイクを中心に進められる。
このジェイク君(といっても、見た目は僕より年上だったから、30以上か?)がものすごくガキ!精神的に。
個人的に副題は、ジェイク成長物語だと思っている。
宣伝(?)どおり彼は下半身不随で車椅子。なので、動く体を手に入れられてはしゃぐ。っで、はしゃぎすぎて他のメンバーとはぐれ、アバターの村にの娘に命を助けられる。
これはチャンスとばかりに地球軍がジェイクにスパイを命じ、ジェイクはアバターの生態(といっても言語とか生活習慣とか)を探る。
正直、この辺までは微妙。いや、アクションとかは多めでいいんだけど、ジェイクが図体の割りにガキっぽくて見てていらいらした。
っで、しばらくすると、地球軍が領地を広げるために木をなぎ倒していく。止めようとするジェイク。相手は鉄の塊、メインカメラを素手で壊して終了。
っが、当然カメラなので自分の姿が映り、謹慎処分をくらう。
地球軍は何故か星を侵略して自分たちの物にしたいらしく、戦争をしかける。
っで、後はお約束の勧善懲悪(ではないが)なアクションで地球軍を倒し、ジェイクがアバターに生まれ変わって終了。
どこに欝になる要素があったのか分からんかった。
個人的には、白人 VS ネイティブアメリカンって感じ。この映画の中では、アバター、自然の動物が一体になって星を侵略から守ったけど、
歴史上では卑怯な白人がネイティブアメリカンから土地を奪い取ったんだよなぁ、とか思いながら観てた。
軍隊とか、地球連合軍なのにすごくアメリカっぽい感じだったし(ものすごく偏見が混じってます)
2度観たいとは思わない感じの映画。でもCGとかアクションとかはよかった。
ストーリーは正直2流だなぁと感じた。
(何様のつもりだ、俺・・・)
2010-02-05
電話
以前はほとんどなかったのに、今更になって結構頻繁(といっても月1程度)にエージェントから電話がかかってくる。
正直今更・・・
たいていMonsterBoardから来てるんだけど、ぜんぜん更新してないのにどうして引っかかるんだ?
(まぁ、未だに職探し中のステータスにしてあるのも問題か・・・)
ようやく景気が上向いてきて求人が増えたか、時期的なものか、単にこの業界が慢性的な人手不足かのどれかだとは思うが。
結構条件いいのが多いのよね・・・本当に何で今頃・・・
正直今更・・・
たいていMonsterBoardから来てるんだけど、ぜんぜん更新してないのにどうして引っかかるんだ?
(まぁ、未だに職探し中のステータスにしてあるのも問題か・・・)
ようやく景気が上向いてきて求人が増えたか、時期的なものか、単にこの業界が慢性的な人手不足かのどれかだとは思うが。
結構条件いいのが多いのよね・・・本当に何で今頃・・・
2010-02-02
Linux: UbuntuをVirtualBoxで試してみた
会社のPCでだが・・・
とりあえず、デフォルトでインストール。
ものすごく簡単だった。ネットで調べる必要がないくらいに。
デフォルトのWMがGnomeなので、KDEに変更。
初めて触ったWMがKDEなのでKDE好き(^^;
使用感。
Linuxのディストリビューションなんて、Fedora、Redhat(ほぼFedoraと一緒)、Debianくらいしか構ったことないし、
デスクトップLinuxで本格的に使ってたのはDebianだけなのであまり比較はできないが、
個人的には気に入った。
外側がKDEな上にUbuntu自体がDebianを元に作られてるのである意味当たり前か。
いろいろやるのにsudoしなきゃならないところとか、GUI上だとMaxかよって突っ込みを入れたくなる頻度でパスワード求められるけど。
ちなみに、
DebianをVirtualBox上で試そうと思ったんだけど、インストールが上手くいかなかった・・・
これ実機でもこの調子だとしたら、やっぱりきついよなぁ・・・
次にPC買ったらUbuntuかな。
(OSなしのPCが安く売ってればだけど・・・でもWindows7とかに特に魅力を感じないんだよね・・・)
とりあえず、デフォルトでインストール。
ものすごく簡単だった。ネットで調べる必要がないくらいに。
デフォルトのWMがGnomeなので、KDEに変更。
初めて触ったWMがKDEなのでKDE好き(^^;
使用感。
Linuxのディストリビューションなんて、Fedora、Redhat(ほぼFedoraと一緒)、Debianくらいしか構ったことないし、
デスクトップLinuxで本格的に使ってたのはDebianだけなのであまり比較はできないが、
個人的には気に入った。
外側がKDEな上にUbuntu自体がDebianを元に作られてるのである意味当たり前か。
いろいろやるのにsudoしなきゃならないところとか、GUI上だとMaxかよって突っ込みを入れたくなる頻度でパスワード求められるけど。
ちなみに、
DebianをVirtualBox上で試そうと思ったんだけど、インストールが上手くいかなかった・・・
これ実機でもこの調子だとしたら、やっぱりきついよなぁ・・・
次にPC買ったらUbuntuかな。
(OSなしのPCが安く売ってればだけど・・・でもWindows7とかに特に魅力を感じないんだよね・・・)
Subscribe to:
Posts (Atom)