================================================================================ * 2008-12-05 * 告知しろと言われたので(1ヶ月ほど前に) 最近 http://d.hatena.ne.jp/w_o/ こっちに書いてます あとこの日記ツールAtomのマシンにしてから初めて動かすのだけど、1.5年分の記録を日記にするのに44秒かかるとか酷い ================================================================================ * 2008-09-18 昔書いたコードが読めねー。 ================================================================================ * 2008-09-15 * つつついにやってしもうたよ 今日間違えて会社行った。照明付いてなかったときは何事かと思ったよ。僕としてはあまり一般人の枠から積極的にはみ出たいとは思っていないのでこれはショック。 生活するうえで祝日を知るしくみが無いので仕方ないとは言えるが。むしろ今まで間違えなかったのが奇跡ともいえる。 まあ、今月は今までと違ってちゃんとスケジュール決まってないうえにひとりのプロジェクトやってたから、というのが大きいだろうな。 今月はあと来週の火曜日が休みなので注意すること!!!!! * そういえばマザーボードかえた 三週間くらいまえ。なんとなく。LGA775初めて見て感動した。 適当に余ったパーツで実家のマシンでもつくるかと思ったがハードル高いな。具体的に言うとOffice。Officeパッケージ版買うとそれだけで安いPCと同じくらいだからなぁ… あと実家の人達は | などやっており、僕よりもマシンパワーを必要としていると言える。なので、Celeron Dがうをんうをん言いながら動いてるのを見るとなんとも言えない気分になる。 あと、メーカー製のマシンに付いてくるOEMのWindowsてどのパーツに付いてることになってるのだろうか?マザーボード? * 桜の名所が毛虫の名所に変わるとき 毛虫って誰に許可を得て公道で緑色の物体を吐き出してるわけ?命張ったギャグのつもり? * 昨日の続き もうちょっと書いておく。 つまり、僕としては、「プログラミング言語は実行時の速度を中心にして設計されるべき」と、したい、という話。 別にこれは社会的な流行に逆らってやろうという意味を含んでるわけではなくて(含んでるが)、ちゃんとした根拠があって、それは、「パフォーマンスを求めるプログラミングは年々難しくなっていってる」という点だ。 かつて、速いプログラムというのは、なるべくサイクルが少なくなるように命令を並べることであった。しかし、CPUがキャッシュを積み、複雑な命令を実装し、並列化され、それがネットワーク上に分散するようになり、「速いプログラム」が満たすべき条件というのははっきりとは決められなくなってきている。 ハードウェアの進化のおかげで、大抵の問題は最適化しなくても十分な速度で動くようになってはいるものの、しかし、未だに「速ければ速いほどいいよ」という世界も存在している。ここにふかーい溝があって、今までのプログラミングパラダイムは「ちまい最適化はしなくてもいい問題」のほうにばかり進化してきたので、「速ければ速いほどいいよ」という世界から見た場合にそういったレイヤが全て障害物として立ち塞がるという状況になっている(と思う)。なので基本的に最適化する場合は、抽象化するレイヤなどはなるべく入りこまないようなプログラミングスタイルが好まれる(というか僕が好んでいる)。 で、アプリケーションの記述の抽象化、という点で、プログラミング言語ができることは枝葉の部分を除いてもうあまり無いだろうことは、構造化プログラミング、オブジェクト指向、関数型というパラダイムを通じて皆さんご存知のことだろうと思う。結局この部分で重要なことは、「ちゃんとした仕様があること」「その仕様をきれいに設計できてること」で、プログラミング言語ができることは、せいぜい、「設計の部分でなるべく明らかな間違いが入らないこと」ぐらい。 (実際には「ライブラリが整備されてること」が最も重要なんだけど…これは面倒なので考えない) だけど、「実行速度の向上」という点では、プログラミング言語ができることはまだあるだろう、という話だ。例えば、昨日書いた上位レベルでのスケジューリングとか。あと、これからは命令数よりもメモリアクセスの最適化のほうが必要になってくる場面があると予想され、今までの「フラットなメモリ」だけを想定した言語は全て平等に糞になるとも予想できる。そこらへんをどう扱うか、とか考えるほうがドリームがあるだろう、というような。 つまり、もうしばらくは「どれだけアプリケーションのモデルの抽象をうまく扱えるか」というのは遠慮しようじゃないか、むしろ速度向上を目指そうで!というのが、僕の主張である。 話がずれてきた & なんか偉そうになってきたので、とりあえずこのへんで終わっておく。(すごく中途半端) とは言っても、今の時代、パフォーマンスが求められるのは行列の乗算だけである、という点は十分に考えておく必要があり、つまり、僕が作りたいプログラミング言語は行列のかけ算が書けるプログラミング言語だということだったんだね!(←「かける」と「書ける」をかけている(←「かける」と「書ける」と「かける」をかけている(←(ry(←(r(←( * イベント処理とスレッド あんま考えがまとまってないのでうやむやに書いてたのだけど、ツッコまれたのでもうちょっと書いておく。 性能を考えなかった場合、イベントを複数スレッドで処理する、例えば「パケットの到着を待つスレッドをバックグラウンドで動かします」的なアーキテクチャは糞だと思う、というような話。 ここでは、 | があって、「ある状態のときにイベントが発生すると、なんか出力して状態遷移する処理」を「イベント処理」としておく。 ただのオートマトンのような気がするが、問題をややこしくするために、「大人の事情により、マシンの全状態は曖昧に定義されてるし、イベントは気分によって減ったり増えたりする」と、しておく。 イベント処理で起こる代表的な問題は次の二点であると思う。 |
    |
  1. 抽象的な状態と実際の状態変数の間で整合性がとれてないタイミングでイベントが発生する
  2. |
  3. 状態とイベントの全組み合わせが列挙されてない
  4. |
で、マルチスレッドでイベント処理すると、この問題を大変ややこしくするわけである。 まず、整合性。 抽象的な状態と実際の状態変数の間で整合性がとれてない、というのは、下のコードで、 \begin{verbatim} struct { int size; /* サイズ */ int remain; /* 残り */ int usage; /* 使用量 */ }buffer; func () { buffer.remain--; /* (!) */ buffer.usage++; } \end{verbatim} (!)で示した箇所のことをいう、としておく。ここでは面倒なので抽象的な状態を定義してないが、大体(size = remain + usage)を満たしてることを仮定して抽象的な状態を定義してる、としておいてほしい。 そうすると、この(!)で示した箇所では、実際の状態変数 buffer は抽象的な状態としては無効な状態になっている、とかいうような。 イベント処理では、この整合性がとれていないタイミングでイベントが発生すると、正しい処理ではなくなる。 で、この問題はシングルスレッドの場合とマルチスレッドの場合では都合が違って、マルチスレッドのほうが | という点で、大変めんどくさい。 まず、検証という点、シングルスレッドでは、「整合性がとれてないタイミングでイベント読み出し関数を呼ばない」ことを検証する必要があり、マルチスレッドの場合は「整合性がとれてないタイミングでは状態変数の更新ががアトミックにされていること」を検証する必要がある。 さて、ここで大きな違いは、シングルスレッド版は、「うっかり付けてないこと」を検証するのに対し、マルチスレッド版は、「うっかり忘れてないこと」を検証する、という点だ。どちらが大変か、というと、僕の個人的な経験でいうと、後者のほうが大変であると思う。「付けている箇所」を列挙するのは簡単だけど、「忘れている箇所」を列挙するのは簡単ではない。 「そんなことはない」という人がいれば、僕はあなたと議論する必要があるように感じる。 で、ここまで、状態変数の整合性の検証がめんどくさい、という話。次に、状態の列挙の話。 マルチスレッドによって、プログラムが書きやすくなる、なんていうことはありえない、というようなことが言いたい。 (あまり僕の思考としてまとまってないので以下の記述も全然まとまっていない) まず、重要なのは、「アプリケーションの状態は一箇所にまとまってるべき」という点。アトミックな更新をする、という点でも、状態の検証をやりやすいように、という意味でも、これは重要であると思う。 あれ?違うな。言いたいこととしては、 Q. マルチスレッドにすると嬉しいのってどんな場面ですか? A. そんな場面はありません ということなのだけど、なんか色々問題が混ざってるな。なんだ? | あたり?イベント処理をマルチスレッドでやるのは、ここらの問題をごっちゃにしてしまってるような気がするのだよな。 ちゃんとまとめるつもりがまとまらなかった。すいません。 ================================================================================ * 2008-09-14 またレベル上げゲーをやってしまった… レベル上げゲーに近付かない仕組みが必要だよな。というかお金でレベルが買えるゲームとかやるといいのか。 * 並列プログラミングしよう 前から真面目に書こうと思ってたけど、最近真面目にテキスト書く力が衰えてる気がするので、適当に書いとく。 ほんとはもうちょっと科学的に書いて会社で使えるようにしたいのだけど、全然科学的じゃないのでここに書いておく。 とりあえず思い付きで書いて、あとで真面目な文書にしたいという欲求は若干あるが、それが面倒くさい重力圏を脱出するだけの力があるかどうかは不明(おそらくない) (なお、これは僕の個人的な考えであり、会社としてこういう考えが普及してるというようなのではありません。) * マルチスレッドに対する姿勢 まず、僕の中では、「マルチスレッドにするのは性能のため」という考えかたがある。 性能向上以外の目的でマルチスレッドにするのは、おそらく間違いである、ということだ。 何故か?というと、このテキストは科学的な考察を入れない予定なので、その点についてはうやむやにしておく。 一言で言うと、「マルチスレッド化は問題をわかりにくくするから」。イベントの検証漏れなどは、シングルスレッドプログラミングでは、「プログラムが書けない」という問題として現れるが、マルチスレッドプログラミングでは「タイミングの問題」として現れることがある。 前者のほうが問題が露見しやすいので前者が問題っぽいけど、実際は後者のほうが根が深いことは考えるまでもなく明らか(考えるまでもなくメソッド) 後者のほうがライブラリの疎結合的に美しく見えてしまうので、イベントをスレッドで扱うライブラリはいくつかあるが、そのようなライブラリは早くこの世から無くなってほしいと思う。 …と、なんか長くなりそうだな。このへんの話は本題とあまり関係無いので、別の機会に書く。 僕の中では並列、並行プログラミングの目的は、性能向上のためであり、それ以外の目的はない、という点だけ書きたかった。 * 概要 マルチスレッドとか書いてるが、別にマルチスレッドについて書きたいのではない。 並列プログラミングというのは、もっと抽象的にできて、例えば、以下のようなものはひとつの考えかたで、抽象化して扱うことができると思う。(実際にはもっとある) | で、書きたいこととしては、こういうのを一括して扱うにはどういうモデルにすればいいか、という話。 * 全体図 まず、登場人物は、以下のふたり。 | 「スケジューラ」は中心にあるCPUだと考えてもらうとありがたい。「計算ノード」はCPUとは限らないで、たとえば、HDDとかUIの向こうにいる人間なども含む、としておく。 なお、「計算ノード」は、「実際に物体があること」が期待される。僕の目的は効率向上なので、「実際に計算する物体が存在するか、しないか」は重要な違いです。また、あとあと書く(かもしれない)計算ノードの特性も実際の物体のそれを正しく表現しているほうがよい。 (と、いうのは、「アクターモデルとどう違うの?」と聞かれたときにこう答えるようにしよう、という僕の決意) 一個のスケジューラに複数の計算ノードがぶらさがってるという感じを想像してみてください。 んで、スケジューラが計算ノードにrequestを投げて、しばらくするとreplyが返ってくるというような感じ。 実際にはこれは階層化されてるのだけど、階層化してるのはどう扱ったらいいか考えてないのでそれは保留で。 これだけだと、よく見かけるメッセージパッシングモデルのような気がしてつまらないので、もうちょっと手を加える。 計算ノードは、「request buffer」と「reply buffer」を持つ、というようにする。 requestやreplyは直接やりとりするのではなくて、このバッファを介してやりとりする。 request buffer と reply buffer は直接的なデータ構造ではないかもしれない。 例えば、CPUに対して命令を投げる場合を考えると、それはコンパイラ中にあるグラフ構造、ということになるし、人間に対して画面表示を出す場合を考えると、画面の状態がこの「request buffer」ということになる。(あと、音声も含まれるかもしれない) で、request bufferとreply bufferは、「容量」という特性を持つ。 この「容量」は、そのまま、requestやreplyを入れておける数のことを示す。 全体図としてはこのくらいか。と、いうのも、図を描くのが面倒になってきたからだ。 さて、このようなモデルを考えると、「並列化したときの最適なスケジューリング」と、いうのは以下の制約をなるべく満たすようにしよう、という努力である、と見做すことができる |
    |
  1. 各計算ノードに付いてる request buffer をなるべくからっぽにしないようにする
  2. |
  3. 各計算ノードに付いてる request buffer, response buffer はなるべく満杯にならないようにする
  4. |
まず、(1)は、暇な計算ノードを作らない、という意味。で、(2)は、リソース不足で効率悪くなるのを防ぐ、という意味。 さて、このようなモデルを考えた場合、何が嬉しいのかというと…何が嬉しいのだろうか。書いててわからんな。 でも経験的に言って、こういうように考えると嬉しい場面は確かにあるので…えーと。また気が向いたら続きを書く。 実際には以下のパラメータがあって、 | そういううにょうにょを満たす必要があるのだけど、そういうの教科書にのってそうなので、ここでは書かない。 * で、何が言いたいかというと 並列プログラミングのためのプログラミング言語というのは、ここらへんをうまくやってくれる言語である、と思うのだよな。 C言語とそのコンパイラがやった仕事のひとつに、CPUという小さな世界でスケジューリングをうまくやった、というのがあるはず。 | これと同じことをもっと上のレベルでもやれば、それで「並列プログラミングのためのプログラミング言語」になれると思う、という話で。 たとえば、ここにA、Bというタスクがあって、それぞれ、「(1)ファイルからread(2)計算(3)結果をwrite」を1000回くりかえすというタスクだとする。 並列の世界では、これの最適なコードは、 \begin{verbatim} read start A read start B read start A read start B read wait A calc start A read wait B calc start B loop 498 write A write B read start A read start B read wait A read wait B calc start A calc start B ... end loop calc wait A calc wait B write A write B \end{verbatim} 途中で面倒になって適当になってるが、大体こんな感じになる。こんなコード誰が書きたいと思うだろうか。僕が思う。さらに、これを書いたうえで、A、Bのデータ入出力量、計算時間などのパラメータによってアーキテクチャごとにスケジューリングを変えないといけないというオマケ付きである。 ふつうは↓こう書きたいはず。 \begin{verbatim} func A read A calc A write A func B read B calc B write B loop 1000 A() B() \end{verbatim} で、ここで、 | ぐらいわかれば、下の簡単なコードから上のよくわからんコードを生成するのは不可能ではないはず(多分)。 さらに、プログラミング言語にread,write,calcのレイテンシやマシンのリソースを表現するだけの機能があれば、「CPUが一個しかない場合はシングルスレッドコードを生成する」「タスクAのcalcの中に計算レイテンシが長い部分があれば、その途中にタスクBのcalcを入れてレイテンシを隠蔽する」とかのようなことも不可能ではないと思う。 で、で、で、ここから先は考えてないので終了。 ================================================================================ * 2008-09-11 /homeのパーティションが/より大きくなってた。(大分昔から) * C言語むずかしいです \begin{verbatim} int func(int a[const]) { } \end{verbatim} C99ではこれが合法だと知ったときの衝撃は筆舌に尽くしがたい。(「筆舌に尽くしがたい」と書くことでテキストの最後をうやむやにするメソッド) 最近Cの文法を真面目に見直す機会があったのだけど、Cの宣言文ってほんとカオスだな。 ================================================================================ * 2008-09-06 * なんか 追記:書こうとしたらしいが書いてなかった ================================================================================ * 2008-09-04 * 今巷で話題のシンプル、軽量なあのブラウザを試してみたよ あのブラウザ 今(というか今日)巷(僕の周辺四人くらい)で(二分くらい)話題の(CSSやJavaScriptが無くて)シンプル、軽量なあのブラウザを試してみた。 これだったらw3mでいいんじゃね?などの批判があったが、僕が画像が出てほしいので、w3mよりはdilloのほうが好き。 w3m-imgは「画像がふよーんて浮いてる」としか言いようがなくてあまり好きではない。 事の経緯は、謎のマシンにGentooを入れて、Firefoxのビルドをするのは嫌だったので、使ってみた次第。 まあ、やっぱりサクサク動くのは快感だな。手元にあった3.2GHzのマシンでもサクサク動いて感動した(←僕しかわからないネタ) Firefoxは何が重いのか考えさせられる瞬間であるな。テキストレンダリング、imgレンダリングとテーブルレンダリングはdilloで十分動いてるので、それ以外の部分が重いということになる。 あと、「最近はwebブラウザが動く性能があれば十分」とか言うけど、C7とかのマシンにLinux入れて本当にFirefoxが動く性能に逹してるのかは謎だな。 あと超関係無いが、まともなブラウザ使ってやることがRSSリーダ読むとかの人ってなんなの? でもやっぱりJavaScriptが無いのは困るなぁ…具体的に言うと、JavaScriptを有効にしないとコメントが見られない仕組みを導入しているブログなどはさっさと滅んでほしいと思ってしまう。 ================================================================================ * 2008-09-03 * 「明日やる」は やらないの意味である * あと permalinkもどきがわかりにくくてすいません。 * ↑ これpermalinkもどき ↑ これ空行 です ================================================================================ * 2008-08-31 * reのjit rejit 32bitでしか動かないです。あとベンチマークとか取った覚えがないので性能謎です。 今確認したら'+*?|'が実装してあった。フェアな対決をするには'[]'がいるなー。明日やります多分。 あときっとこれまともにアルゴリズムっぽいことしてるの \begin{verbatim} | mov edx, [INPUT_PTR] | cmp edx, c | match_failure | add INPUT_PTR, 4 \end{verbatim} この部分だけだな 手書き vs 手書き vs LLVM vs Lispマクロ vs grep とかで正規表現対決とかかな… LLVMはomoさんがやっておられるのでそれでいいか * デスマーチを避けるのに必要なもの デスマーチを回避できない一番の理由は、「そういう状況になってしまった背景を知ってしまってるから」というのがあるよな。 まあ、このへんについてはそのうちまとめて書く…と思ってたけど、結局書いてないので、適当に書いておくと会社に入れ込んでしまった時点で、負けなんだとかそういう。 今の仕事はまあ、入れ込んでしまうだけの要素があるのでその点では負けだったんだなー。 あと、デスマーチをやめられない理由として、あまりにそのプロジェクトのことばっかり考えてしまうので(ほかのこと考える余裕ない)あまりに心を占拠してしまって、「オレ、あの娘のこと好きなんじゃないか…」的勘違いとでもいうべきなんだかアレがあるよな。というか、8月ほんと、夢の中でもそのプログラムのことばっかり考えてて具体的には、マップファイル見てたり、アドレスに襲われたりする夢を見てた。 まあ、なんか、そういう。 * 言葉責めのアレ 問い詰めてきた。喉が痛いといいながら、7時間ほんとに喋りつづけたあろはさんお疲れさまです。 筆記具持っていくの忘れたのが酷いな。記憶に残ってるのは…闇世界とか中二病とかそういう。 ETは胡散臭くなくなったというのが収穫かな。 つまり、僕が感じてた胡散臭さは「人間的な判断が入る余地が無いので正しい」みたいな理解をしてて「えーー」というような感じだったのだけど、 | の部分で、人間の判断が入る余地がある感じだったので、納得できる範囲かなーとかいう感じで。 あと、あろはさんがソッチ方面に進んだ謎という点では、もとはAIからの流れでソッチへ行ったとのことなので、これも納得。 * ただ、これでET使いたくなったかというと全然そんなことは無いな。 何故か?僕は「自動変換して、最適なプログラムを出すためにパラメータを満たすコードを出したり、候補をいくつか出したりする」とかは有用だと最近は考えてるので、「高級な記述とマシン依存の記述の分離」は欲しいと思うのだけど、やっぱ、「正しさの証明」が欲しいとは思わないのだよな。何故思わないか?まあ、そこらへんは僕がデバッグ好きなのが影響してるかもしれない。僕は別にコード書きたいからコード書いてるのではなくて、デバッグしたいからコードを書いてるのである、という設定である。 あとodzさんの謎(?)が解けたのでよかった。 * あとみんな ついった書きすぎだろ…ついったは情報が分散される点とか文書書きたい欲が発散されてしまうとかの点で弱く有害だと考えているので最近の流行はどうかと思うのだけど、なんとかならないかなぁ… ================================================================================ * 2008-08-30 * なんとか 仕事は、まあ、なんとかなった。 お葬式状態だったのが、一週間の余裕を持って一区切り状態まで持っていけたのだし、まあ、比較的よくやった方なんではないかな… * 一般的な単語 http://info.dwango.co.jp/sp/ 一般的な単語を固有名詞にするのはどうかと思うのだが。どうかと思うのですがどうでしょうか?というか実際に困ることがあるのでやめてほしい、というかやめてほしかったというか。 * LL Future 行かなかった。 あれ?なんで行かなかったんだっけ… 行く理由はあんまり無いけど、行かない理由も無くて、それでも去年は行ってたと思うのだけど… * 言葉責め 明日か、というか今日か。9時に家出れば間にあいそう。 * 大復活 そういえば一周終わった。というかオートボム簡単すぎじゃないかと書こうとしたけど、そうやって「これ簡単すぎじゃね?」とか言うやつが平成初期に一度シューティングを滅ぼしたのだということを学ばなかったのだろうか我々は。 二週目条件て何? あとラスボスってもう攻略されてんのか…最近は早いなぁ ================================================================================ * 2008-08-24 まあ…なんとか… * 来週の予習 もう来週か…短い8月だったなァ…そもそも来週行けるのだろうか…? 一番問い詰めたいことは、あまり技術的なことではなくて、「どうやったらこういう胡散臭い技術にのめりこむのか」という点なのだけど、そういうの聞いてしまっていいのかなぁ。 胡散臭いと思う点は何か? やっぱり「この場合はこう美しく書ける」という具体例が無い点かな… オブジェクト指向は「犬猫畜生にわんわんにゃんにゃん言わせるパラダイム」アスペクト指向は「ロギングするためのパラダイム」というのはネタなのだけど、それでも、やっぱり、犬猫畜生の鳴き声を区別できると嬉しい場面やアルゴリズムの記述とロギングの記述が分割できると嬉しいという場面は確かにあるので、その動機と利点は理解できるから、少なくとも胡散臭い技術では無いのだよな。 けど漠然と「素晴らしい素晴らしい」ばかり書いてあるとなんだかなぁ…って気分になる。 で、まあ、「胡散臭いと感じる」というのは、つまり「有用かどうかの判断ができない状態」であるわけでそれは背景と利点を勉強すれば「有用か無用かの判断」ができるのだから、胡散臭いと感じているのは単に僕の勉強不足と言えるわけで、どうでもいいのだけど、それでも僕はあろはさんの宣伝だけを読んでても、「これを勉強したいなぁ」とは思わないのだよな。 いや、勉強する気が全く起きないというわけではなく、技術的な興味はあるのだけど、他の作業よりも優先して勉強したいと思うところまではいかないという意味で。 で、あろはさんがどうやってソッチ方面にのめりこむようになっていったのか、が気になる点なんだよな。もうなんか宗教にのめりこんだ人達のドキュメンタリを楽しむぐらいのノリなので非常に失礼な話なんだが。 * この日記ツール あとそろそろこの日記ツールがHTML生成するのに10秒とかかかるようになってるのでなんとかしたほうがいいな。 確実にどっかオーダー的にヤバい処理があると思うのだが。というかどっか何も考えずに文字列の連結をやってるところがいくつかあるので多分そこだと思うのだけど… ================================================================================ * 2008-08-19 * お詫び 賢明な当サイトの読者の皆様は、僕がデスマーチに巻き込まれた際は、 「こんなんやってられっかー」 とかいってブチ切れる展開を期待されてたかと思いますが、特にそのようなことは無く、粛々と巻き込まれることになりました。 皆様の期待を裏切ったことをお詫びいたします もうこれで「俺デスマに巻き込まれたこと無いんだZE!」とか言えなくなるな。 * 会社バレとか 最近ここを読んでる弊社社員の数が無視できない程度の人数になってきてる気がするな。 とりあえずわかってるだけで7人くらい。 バレてマズいことは書いてないつもりだけど、でも、気分的な制限は結構大きいな。 いや、会社の愚痴とかではなく…例えば、「あさひきゅんとちゅっちゅしたいよぉ」とかうっかり書いてしまったら、明日会社行けないなぁ…とかそういううっかりできない制限 * _ 例えば、↑でうっかり書いてしまったので明日会社行きづらい。 * OSはどうやってプログラマブルなコプロセッサからの割り込みをユーザ空間に見せるべきか 具体的に言うと、GP2Xの片方のCPUからの割り込み(誰もわからない)とか。 10msec程度の処理をコプロセッサにやらすなら、readとかでブロックすればいいのだけど、それより小さい場合どうするか。 コプロセッサとの通信レイテンシの大きさは、解決できる問題の幅に影響を与えるので、できればハード的なレイテンシの限界まで小さくなってほしいのだが。 ================================================================================ * 2008-07-31 * あれ? 書かなさすぎ。僕がいかに毎日を無駄に過ごしているかがよくわかるな。書くことと言ったら虫が発生した系の話しかない。 * 行きます。 * 最近アクペクト指向的なものが欲しくなってる気がするな。 でもアスペクト指向では足りないんだよなー。 具体的には、変換したあとのコードが再編集可能になっていてほしい。 で、そういう自動変換したあとのコードが可読である、というのが最近の流行なわけなんだけど、そういうのをやりたいとなると、複雑な構文を持つ言語や、ひとつの処理に対して、複数の表現を持つ言語というのが、問題になってくる。 最近C++でなくてCを書きたくなるのは僕のそのへんの心境の変化から来てるのかもしれんというか、僕の超個人的な心境の変化をここに書いたところで誰かのメリットになるのか謎。 自動変換をかけやすい言語というのは、超抽象的なプログラミングという点でも、C言語を超える最適化するプログラミングという点でも有用である、という気がするのでプログラミング言語はそっちの方向に進化してほしい、と思っており、ある変な方向へ極端に尖って進化してしまったLLはさっさと滅んでほしい * LLふーちゃん というわけでLLなんたらは「LLは滅ぶべき」とかの話があれば行きたいと思うのだが。遠い将来には滅ぶべきという意見は多数の人に受け入れられると思うので、未来をテーマにするならあってもおかしくないと思うが。 ================================================================================ * 2008-07-16 久しぶりにまともな文が書いてある小説読んだ。 あれだなー。最近まともなテキスト読むのを敬遠してたのは、この読んだあとの何とも言えない感じを体験したくなかったからなんだな。 読後感と言うやつだろうか。残念ながら人と感情を共有できないので、「爽やかな読後感」というやつがどんなものかわからないが、僕としてはあまり爽やかな気分にはならないので、どっちかというと鬱屈とした読後感というか。 * データ並列の技術って枯れてるってほんまか 「枯れてる」の定義がむずかしい。 * 除算と条件分岐とロード Core2のSSE2の倍精度除算ってレイテンシ10ちょいぐらいなのか。頭おかしいんじゃないか。 もう除算は遅いなんていうのは都市伝説になっていくのだろうか。いや、でも、パイプライン化されてないし、一回しか実行できないから、簡単な命令と比べたら数十倍ぐらい遅いのか。そう考えれば納得いかないでもない。 さて、プログラマにとって、「除算がおっそい」というのは、比較的浸透している考えかたであろうと思う。 では、「分岐がおっそい」、「ロードがおっっそい」というのは、どのくらい浸透しているのだろうか。 分岐はそれなりに浸透してる気がする。 ロードはどうだろうか? 除算や分岐の最適化は局所的な変更で対応できるけど、ロードの最適化はそれなりに大きな視点で変更しないといけないから、あとまわしにされるケースが多いか。 * 公式が出してるGPUの資料で詳細スペックて http://intellinuxgraphics.org/documentation.html Intelのやつぐらいか。 Intelのオープンソースへのとりくみってどういうポリシーでやってんだろうな。IBMとかはLinux滅んだらなんらかの影響があるって感じがするが、Intelは? こんなのもあるなhttp://www.x.org/docs/AMD/ あとで読む系(読まないという意味) * CTM とか CAL とか 今日までGPUプログラミングっていうと、高レベルAPIがどーんとあるイメージだったのだけど、AMDのはそうでもないな。 僕は割り込み、ISA、DMA転送が丸見えのほうが好みなのでやるならこれかな。やらないが。 * プログラミングとか苦手な人にプログラミングを教えるのが可能だと思っている人は、自分が苦手なものにぶち当たって挫折したことないのだろうか どんなジャンルでも、苦手な人の言葉として「何がわからないのかわからない」と、いうのがあると思う。 僕は過去に何度か、そういうのにぶち当たってきたことがある。野球、バスケ、音楽。 そういうのがあるので「何がわからないのかわからない」状態というのはまあ理解できる。 「何がわからないのかわからない」というのは、本当に何もわからない状態で、まあ、何もわからないのである。 と、いうような体験があるので、「何がわからないのかわからない」っていう人がいても、穏かな気分で受け入れることができる。良いか悪いかは知らない。 * 適性が無い人には何を教えても無駄とか考えてる教育者って何なの? 分からない人に教えても無駄とか考えてる人は滅ぶべき。 ================================================================================ * 2008-07-11 * x86むずい http://alohakun.blog7.fc2.com/blog-entry-952.html これ読んで、「そんなに難しくねーし。基本抑えれば簡単だし」みたいな文書を書いてたのだけど、やっぱりむずかしかった。 \begin{verbatim} addl %eax, %edx addl %ebx, %ebx \end{verbatim} \begin{verbatim} addl %eax, %edx leal (%ebx,%ebx), %ebx \end{verbatim} これ、Core2だと、下のほうが速いのだけど、理由が謎すぎる。 下が1[cycle]で妥当。上が1.33[cycle]で少し遅い。lealのほうがうーおぷすたくさんになって遅いとかならまだ理解できるが… 計測コード ちなみに \begin{verbatim} addl %eax, %edx leal 2(%ebx,%ebx), %ebx \end{verbatim} これも1[cycle] ================================================================================ * 2008-07-09 生きてるよ。 * http://www.asakura.co.jp/books/isbn/978-4-254-12173-5/ COINSの本とかあんのか。 http://www.a-qual.com/cosy/index.html あと商用のそれ系のってあるんだな。 ================================================================================ * 2008-07-05 帰りの新幹線。充電してくるの忘れたな。今京都駅で、残り11910mWh。これ東京まで保つかな? 近くのスーパー行ったら魚屋のところで魚泳いでて、それ見ながら、 「あー、そういえば小さいころはこうやって泳いでる魚見てボーっとしてたなー。あれは小さい子だからできたことで、今みたいにオッサンになった自分がこれボーっと見てたらもはや不審者だよなー」 とかボーっと考えながら魚見てたので、もはや不審者だった。 * テレビと世代交代 久し振りにテレビ見る。最近テレビ見て思うのは、バラエティ番組の世代交代って歪んでるよなーっていう。 普通、世代交代というと、FIFOなんだけど、バラエティ番組の世代って、一番上の世代が固定してて入れかわらず、新人が入ってきて新人が中堅になる前にフェードアウトしてるよなーって感じがする。 司会者達は僕がテレビ見てた頃(5年くらい前)から変わってないんだよなー。 あと20年もすればあの人達も年齢的に限界がくるのだろうから、さすがにフェードアウトすると思うけど、その頃まで今のテレビが残ってるだろうか? カラーテレビを飾った人達は、カラーテレビの終焉とともにフェードアウトしていくのだろうなーとか。だからどうって話でも無いが。 * Crusoe Crusoeの話もうちょっと書いた。 つってもこれから公開なのでこれでやっとバージョン1だが。 あと調べるべき点は、 |
    |
  1. 分岐予測の詳細。プロファイルフィードバックとかほんとにやってんのか?
  2. |
  3. 間接ジャンプどうやってんか
  4. |
  5. Efficeonでの比較
  6. |
もうやる気ないのでやらないけど。 Efficeonとか手元に無いしな。あとCrusoeはそれなりに資料あるけどEfficeon資料無さすぎ。 * 今から書く ================================================================================ * 2008-07-03 大阪暑い。たまたま今が暑いだけらしいが。 なんか電車止まった。 私鉄とか経費削減で人員が少なすぎて、電車が止まった時の対応がすごい。駅で説明とか無いし。東京のJRは恵まれてるなぁ…と、思う。 まあ、東京のJRとかしょっちゅう電車止まって対応が慣れてるとかだと思うので、どうかと思うが。 * ハチサン世代として一言言っておくか ハチロク世代に関して言うと、けまらしい以外の感情を持ったことが無いので、ハチロク世代が叩かれているのを見ると、なんとも言えない清々しい気分になるので、人としてどうかと思う。 まあ、見ず知らずの人に偉そうに物を教えるのは、色々と日本人として難しいものがあるよな。と、思う。そうでない人も多いだろうけど。 ここで、ハチサン世代がいかにセカイ系かをもとにした話を書こうとしたけど、記憶違いだった(エヴァはリアル中二のころではなかった) ブギーポップとかリアル中二なんだがなー * うちで飼ってたカブトムシが死んだ と言っても、すでにおとといこっちに来た時点でほとんど動いてなかったけど。生きてるカブトムシがひっくり返ってるのを見たこと無いのに、なんで死んでるカブトムシはひっくり返ってるのか謎だったのだけど、死にかけてるカブトムシは自分の力で起きあがれないから、一回ひっくり返ったら終わりなんだなーとか、そういう感じで、夏休みは命の大切さを学ぶのだった。 * 最適化されて読めないコードと読めるコードはどっちが価値が上かな… きれいなコードを改変して読めないようにしたものを人に受け入れてもらうにはどうすればいいか… * Crusoe よく考えたら関数のインライン展開しないのはかなり不味いな。Efficeonで変わった大きい点は基本ブロック越えてスケジュールする点かな?でも、関数呼び出しや、virtual method呼び出しをスケジュールするとは思えないんだよなぁ。 というか、関数呼び出しで繋がってる基本ブロックをぶつ切りにするのは罪が思いな。 で、この問題の根が深い点は、x86だとあまり問題が無いという点にあって… x86は今生き残ってるプロセッサの中では静的命令スケジュールの点で特殊すぎる。けど、世の中の殆どがARMとx86で、これらはセグメント(て何?)が違うのである分野は殆どx86だけ。特殊なものが特殊で無いという間違った世の中になり、インライン展開はcall命令を減らすもの、ループ展開は分岐命令を減らすものになってしまった! 否否否!レジスタが多いマシンでは。インライン展開、ループ展開は、主にスケジュールの可能性を上げるために必要なのだ。 CrusoeのSoftware Optimization Guideにはループの中には最低でも10命令は並べろ、と書いてある。さて、あなたが最近書いたコードの中にある基本ブロック、つまり、call or jmp 命令以外の命令が連続してる数はいくつ?10個以上の命令が入ってる基本ブロックの割合は?基本的には、全ての基本ブロックは、10個以上の命令を持っておくべき。しかし!x86は、基本ブロックがそれより短い場合でも動いてしまう!何故か?x86はそのArchitectureの定義に「アウトオブオーダーであること」と書いてあるからだ。嘘です。x86の世界ではインオーダーマシンは思い思いと言われ、「こんなの省電力の世界でしか使えないよ」と言われてしまう!なんてこった!違う。プロセッサが悪いんじゃない!プログラマが糞なのだ! virtual method呼び出しの、インライン展開しない関数の、エイリアスを考えてないload,storeの、短かいループのコストを、本当のコストを考えなおすべき!べき、羃、^^^∧∧ヘヘ! なんか全然関係無い話を書いてた。みんなx86-64にして、Atomにして、それなりのコードを書くようにすればx86の静的スケジューリングの特殊性も減ると思うのだけど。 あとやっぱimulのレイテンシ13はでかすぎだろ。ARMとかでも3,4ぐらいみたいだし。 ================================================================================ * 2008-07-01 なんか休みとれたので大阪へ向かう。 * 周回遅れすぎるCrusoe大研究 手元に持ち運びできるマシンがCrusoeのマシンしかないのでそれを使う。 CMSの謎については前から気になってたのでこの機会に少し調べて書いた。 もうちょっと頑張って基本ブロック越えたときとか、プロファイルフィードバックどのくらいしてるのかとか見ればよいかもしれんがベンチマーク方法思い付かないので略。 エイリアス検出の仕組みは面白いな。普通のマシンにもあれば…と思ったけど、普通のマシンは例外のトラップでOSが絡んできて遅過ぎるので使いものにならないか。 ぱっと見た感じ、同クロックのPentium3に近いくらいの性能は出そうなんだけど、世間の評価としては、同クロックのP6,K7と比べると性能半分くらいなんだよな。 何が悪かったのか。キャッシュ?ベンチマークでは無い実際のコードでは駄目なのか?FPU,DIV,MULとかがヤバかったのか?まあ、もう滅びたプロセッサなのであまり真面目に調べてもしかたないのだけど。 ================================================================================ * 2008-06-25 test ================================================================================ * 2008-06-17 emerge が終わらないので適当に何か書く。(GCC, X, wine, kdeをコンパイルしてた) と思ったら終わったので何も書かない。 ssh-keygen --help はいつか何か失敗しそうで怖い。 ================================================================================ * 2008-06-16 今日は待ちに待った'/dev/sdaX has been mounted N times without being checking'の日。 あなたはこの突然やってきた自由な時間、何をして過ごしますか? まあ爪切り探してた。俺は人生の何%を爪切り探すのに使っているんだろうな。あと爪切り探してるときにホチキス見つけると「これ爪切りにならんかな…」とか考えてしまうあたりにニューラルネットワークの神秘を感じる。 * ゲームしてたら土日終わるとかやめてほしいんだが ゲーセン行くために外出するとか久し振りだぜ! 5のビット地帯らへんまで15億くらい。ボムゲーと思ってたんだけど、パワースタイルやってみたらいい感じだな。ただ4ボスと5中ボスで2ミスずつ決定みたいな感じなのでそこらへんで詰んでる。 あと家でMGS4とか。大変MGSっぽくてよいですね。 | * 小さな生命について ゴミは捨てたので決着は付いたと思ったら、まだたくさんいてた。どうも台所自体から発生してるっぽいな。というわけで掃除などした。 食物連鎖ピラミッドの頂点たる我々がピラミッド底辺から三番目くらいの生物に行動を決められるというのはどうかと思うところである。まあ掃除するいい機会なのでいいけど。 掃除したら小さな虫としかいいようのない虫が5匹ほど! * 小(ちい)さな命(いのち)を育(そだ)てるために僕(ぼく)らができるみっつのこと! 素晴らしい星、宇宙船地球号。この地球号の素晴らしさを守るためには、僕達ひとりひとりが行動しなければなりません。 でも、それは難しいことではないのです。ほんの少し、行動するだけで、世界は変えていけるのです。 ここでは、その例として、小さな命を育てるために僕等ができることを挙げてみましょう。 |
    |
  1. 魚を食べて生ゴミを創ろう
  2. |
  3. ゴミはすぐに集積所に持っていかないで一週間ぐらい放置しよう
  4. |
  5. 台所は掃除しないようにしよう
  6. |
* しかしこの時期になると毎年小さな命ネタをやってる気がするな 僕がいかに学習してないかがわかる記録であるといえる。 というわけで来年の小さな命ネタを楽しみに待っててね! ================================================================================ * 2008-06-11 うーん。家が臭い。 どのぐらい臭いかというと、たまに家に来る猫が、家に入るのを躊躇してたぐらい臭い。 「これはちょっとした異臭騒ぎだなー」とかどうでもいいことを考えてたら、昨日になって、小さな生命が誕生してた。 都会のひとりぐらしの家での異臭騒ぎが一転、感動の生命誕生の瞬間になるなんて、誰が想像できただろうか。 普段の生活で感動とかの潤い系は求めてないのでできれば遠慮していただきたいところだが… とりあえず、一週間しないうちに大変なことになるのはやめてほしい。まあ、そのために萌えるゴミの日は週に二回あるんだって話だが…3日で溜まるゴミってほんの少しだからゴミ袋がもったいないんだよな… ================================================================================ * 2008-06-08 これは新記録。そして輝く延滞利息額の文字。 要因としては、 | あたりか。先月まじめに仕事しすぎなので対策すべき。 * ついに休み早くおきた 何もせずに8時に目が覚めた。これは快挙。昨日大分飲んでたので起きたときフラフラだったけど… で、秋葉原へ行ってた。いや…うーん。 * 通り魔に対抗する術はあるか 覚悟を決めた一般人vsパニクってる一般人ではどっちが強いか、っていう話で、護身用のナイフとか使いものにならないんだよな… 確率としては交通事故のほうが上なんだから、そういうのに対する策を練ってる暇があったら信号ちゃんと守って無理な横断はしないようにしましょうとしか。 あと地震対策か。 * なんか書いたが ボツ。 ================================================================================ * 2008-06-06 * read writeのパフォーマンスはページ境界に揃ってるか揃ってないかで影響を受けるか? \begin{verbatim} #define _GNU_SOURCE #include <sys/mman.h> #include <fcntl.h> #include <unistd.h> #include <sys/time.h> #include <sys/types.h> #include <sys/stat.h> #include <string.h> #include <stdio.h> #define N 8 #define P 4096 #define L 1024 char buffer[P*(N+1)] __attribute__((aligned(4096))); static int getm() { struct timeval tv; gettimeofday(&tv, NULL); return tv.tv_sec*1000 + tv.tv_usec/1000; } static void readtest(int fd, int off) { int begin, end, i; begin = getm(); for (i=0; i<L; i++) { pread(fd, buffer+off, P*N); } end = getm(); printf("read:%d:%d\n", off, end-begin); } static void writetest(int fd, int off) { int begin, end, i; begin = getm(); for (i=0; i<L; i++) { pwrite(fd, buffer+off, P*N, 0); } end = getm(); printf("write:%d:%d\n", off, end-begin); } int main() { int fd = open("buffer.bin", O_RDWR|O_CREAT, 0666); memset(buffer, 0, sizeof(buffer)); posix_fallocate(fd, 0, P*N); pwrite(fd, buffer, P*N, 0); writetest(fd, 0); writetest(fd, 1); writetest(fd, 4); writetest(fd, 8); writetest(fd, 16); writetest(fd, 64); writetest(fd, 128); pread(fd, buffer, P*N, 0); readtest(fd, 0); readtest(fd, 1); readtest(fd, 4); readtest(fd, 8); readtest(fd, 16); readtest(fd, 64); readtest(fd, 128); } \end{verbatim} \begin{verbatim} write:0:15 write:1:18 write:4:15 write:8:15 write:16:15 write:64:15 write:128:15 read:0:7 read:1:28 read:4:25 read:8:24 read:16:15 read:64:8 read:128:7 \end{verbatim} writeは1byteが遅い以外は関係無し。 readは64byteに揃ってると速いっぽいな。でもページとかは関係無さげ。 ================================================================================ * 2008-06-01 ぐーぐとかほげ。 あとなんとかする。 * とりあえずカーネルはできた。なんか進むペースが亀だが。 ここ見れば大体解決する。 ただ、config は make orion5x_defconfig っぽいな。 Gentooのcrossdevはクロスコンパイラ欲しいときすごく便利。 なのでみんなGentoo使うべき。とは思わない。 けど、今のあり余るマシンパワーを何に使うかというと、Gentoo使うぐらいしか用途が思い付かない。 * 大復活 なんかエスプガルーダ2の続編って感じが… | ================================================================================ * 2008-05-25 うげー。ごはん炊くよりも凍ったごはん温める電子レンジのほうが消費電力多い… * シリアル接続無しで玄箱Proのカーネル気軽に入れ換えたい とりあえず書いた。カーネル入れ換えるのは来週だな。気が向いたらそのとき説明もうちょっと書く。 「シリアル接続無しで」とか偉そうに書いてる割に僕は失敗して結局シリアル付けたので信憑性は薄い。 あと久し振りに半田ごてを握り火傷するなどした。 * 大復活 近くにあった。ので四回ほど。 面白いことは面白いが寿命削るほどやる気が出ないあたり僕も衰えたように思う。 中ボス、ボス以外で死ぬリスクほぼゼロのハイパーはなんだろう…とりあえずは道中で緊急回避がわりに使えばいいのかな… * 風呂エンド 今日こそ風呂エンド見る!と思って、打ち返し無しでやったのだけど、やっぱり勇気が無くて見れなかった。 まあクリアできたのでよい。ラスボスにボム効くのが簡単クリアゲーとして大きいように思う。 ================================================================================ * 2008-05-23 ガイドラインが読まれていないことが発覚したので少しだけ見やすい位置に移動した。 * もうARMもPPCもログイン可能なマシンが二台づつあるからそろそろx86以外も自粛しないといかんな。 ================================================================================ * 2008-05-22 風邪はなおった。基本的に「寝ればなおる」と信じて寝ればなおる。 ================================================================================ * 2008-05-21 風邪ひいてしまった。 風邪ひくのは社会人として最低の行為だと思っているので、しかし、僕は立派な社会人ではないので大丈夫なのだった。 サボるのは本人幸せだからいいのだけど、風邪ひくのは誰も幸せにならないので全力で阻止すべき。 * とりあえず… マシン買わない…と誓ったものの、x86じゃなかったらいいという俺ルールがあったのを思い出して、玄箱Pro買ってきた。 うーん…これシリアル無しでカーネル入れ換えるのかなり辛いんじゃないのか… でもシリアルあればNANDの中身入れ換えとかもできそうだな。どうするか…無しでやりたいが。 * ワット あと、なんかむしゃくしゃしてワットチェッカーも買った。 今の我が家の電気料金とワットチェッカーの値段から考えて4年ぐらいしないと原価償却しないんだが… とりあえず 色々測った 。気が向いたら増やしていく。 ================================================================================ * 2008-05-17 今日は午前中に起きた!! 平日はどうせ会社行くために起きるので早起きとかどうでもよかったのだけど、なんのために早起きしていたかというと、休日も午前中に起きるためになんかそういうためだったのだ。 まあ目的は達成されたといえる。 で、何してたかというと、何してたんだろう…もう一日終わりか…まあニコニコ見てないだけ救われてる気がする。あと引っ越して1年3ヶ月で始めて最寄り駅付近の散歩などした。 * あとフレッツのIPv6をなんとかした。 僕の認識が間違ってなければ多分フレッツのv6から名前で接続できる(確認しようがない)…と思ったのだけど、さすがにこのマシンを見えるようにする勇気はないな。 どうするか、と思ったところで、なんかマシン買う理由が見つかった気がするのでよくないと思った。 * Everyday Shooter 何故か全方位シューで良作を出し続けるPS3のダウンロードゲーに新しいのが出てた。 こういう感じのゲームがPS3のゲームになってるという感じが新鮮だなぁ… ================================================================================ * 2008-05-16 http://community.osdev.info/index.php?segmentation あー、そういえば、Kの人は「DEPなんか無くても486には保護機能がある」とかも言ってたな。 問題は移植性が無くなるのと、コンパイラのサポートが必要な点か。 あと、遅いのは「CPU設計の際にあまり工夫をしないせいであろう」て書いてあるけど、バイト単位の保護はそれなりにコスト大きいのでは、という気もする。 いや、一番つらいのはユーザプログラムに対応が必要な点が厳しい点か。 でもフラグメンテーションとか一番下のレイヤから一番上のレイヤまでが強力して手を取り合わないと対応できないんだから、ユーザープログラムも対応しろよ、という気がする。 起動後しばらくすると、ラージページとかヒュージページが作れないとか、今でもフラグメンテーションは大きな問題を起こしてるわけだし… 単一CPU、単一メモリレイヤというのを仮定している点の問題…とか書こうと思ったら会社行く時間だった。 ================================================================================ * 2008-05-15 * セグメンテーション と思ったが、そんな使いかたは無理か。 というか変換したあとがリニアアドレスなんだから単なるオフセット以上の意味が無いか。 ================================================================================ * 2008-05-14 * 今日も起きた と思ったけど、もう会社行く時間だな。何してたんだ。 * 久し振りにはじめてよむ486などを読んだ そういやx86のセグメンテーションを有効活用してるOSって無いんかな。 なんとかすればユーザーレベルでアドレス変換みたいなそんなあんなxxvfdsaf!! 時間が無い。 ================================================================================ * 2008-05-11 * 画期的なシステム開発した ふとん可哀想なのでどけるか… ================================================================================ * 2008-05-09 二日続けて早く起きた。これはかつてない快挙。 なんかゲーム感覚で早起きしてる気がするな。基本的に怠惰な生活を送ろうとすることに対して、どう対処するかというゲーム。 作業の効率化を名目としたゲームって結構あるような気がする。liifehack(w) とかもゲーム感覚的側面がありそうだし。 他にも食費減らすとか。 男のひとりぐらしで食費がボトルネックになることなんてまずありえなくて、節約したいのなら、もっと他の点から攻めるべき。具体的にいうと、PC何台も買うなよ…とか。 でも節約しようとすると、食費の削減から始めてしまうのは、それがゲーム感覚的に面白いから、というのがあるのでないかな。 * また 揺れすぎだろ… * またまた 揺れすぎだろ… ================================================================================ * 2008-05-08 * 地震たん \begin{verbatim} 「ね〜起きてよ〜」 ゆっさゆっさ \end{verbatim} ================================================================================ * 2008-05-06 * なんか部屋の掃除するたびに模様替えしてるような 3,4ヶ月に一回くらいしか掃除しないからなんだが… 左からPS3、PC、ThinkPad…Mac入れるの忘れてた。 夏配置は布団とPCが隣あう必要が無いので配置の自由度が上がる とりあえず30分ぐらい使ってわかったことは、寝ながら操作するのはしんどい。 こうかな… ================================================================================ * 2008-05-05 * ひどいな 何もしないで寝てるのか起きてるのかわからない状況を続けていたところ、休みあまりに何もしなかったので後悔の末に発狂する夢を見て起きた。 なんとかするか… * とりあえず 部屋を片付けるなどした。 * こういうって文法どういう意図で作ってあるんだ \begin{verbatim} int func() { int; } \end{verbatim} ================================================================================ * 2008-05-02 休んだ。 * 久し振りにX11 http://tronche.com/gui/x/icccm/ http://standards.freedesktop.org/wm-spec/wm-spec-1.4.html ちょっと見てたんだけど、よく考えたらWMIIの挙動はマイナーなんだから、それ用の仕様なんてないよな… やりたかったのは、常に浮かんでるウィンドウにするというの。普通のWMだとそっちが標準だろ常考。 * memcpy 構造がmemcpyだけでコピーできるかどうか。 memcpyだけでコピーできると嬉しい点 | ネットワークの向こう側はエンディアン問題があるが… 安心して使えるって何だ。 * MAX_PATH readdirやらのバッファサイズはどうすれば正しいんだ… 絶対パスの長さは決まってなくて、ディレクトリ名を含まないファイル名の長さはMAX_PATHが最大でいいか。 http://msdn.microsoft.com/en-us/library/aa365740(VS.85).aspx WIN32_FIND_DATAの中がMAX_PATHしかないから拡張子の_MAX_EXT入れるとFindFirstFileが使えない場合がありそうな気がするんだけど。 http://risky-safety.org/zinnia/doc/maxpath.html MAX_PATHとか名前が誤解招きそうで素敵すぎるな。 しかし、ファイル名とか将来システムのバージョンが上がったら変わりそうな値がコンパイル時定数になってるのはどうなんだろうか。ファイル名が256文字超えるなんて使ってるほうの責任といえなくもないが、例えば、ファイル名をデータベースに使ったりするような斬新なシステムがあった場合に、(どうでもよすぎるので略) http://itpro.nikkeibp.co.jp/article/COLUMN/20080104/290425/ getdentsとかがMAX_PATHに依存しないインターフェースになってるので、OS自作の人達はこれ参考にすべき。 http://www.linux.or.jp/JM/html/LDP_man-pages/man2/getdents.2.html * 絶対パスの長さてどのくらいまで大丈夫だろうか。 \begin{verbatim} $ pwd | wc 1 1 88438 \end{verbatim} ここらへんで諦めた。 \begin{verbatim} $ find | wc 2484 2484 66045767 $ tree | wc 854 2554 1108757 $ ls **/* | wc zsh: 引数リストが長すぎます: ls 0 0 0 $ echo **/* | wc 1 2483 66043280 \end{verbatim} treeはなんか間違ってんな… \begin{verbatim} $ java shell-init: error retrieving current directory: getcwd: cannot access parent directories: ファイル名が長すぎます Error occurred during initialization of VM java.lang.Error: Properties init: Could not determine current working directory. at java.lang.System.initProperties(Native Method) at java.lang.System.initializeSystemClass(System.java:1072) $ ghci shell-init: error retrieving current directory: getcwd: cannot access parent directories: ファイル名が長すぎます ___ ___ _ / _ \ /\ /\/ __(_) / /_\// /_/ / / | | GHC Interactive, version 6.6.1, for Haskell 98. / /_\\/ __ / /___| | http://www.haskell.org/ghc/ \____/\/ /_/\____/|_| Type :? for help. Loading package base ... linking ... done. getCurrentDirectory: invalid argument (File name too long) \end{verbatim} m9 * readdirのバッファサイズてなんだ readdirはバッファサイズ考えなくていいだろ… * getcwd(NULL,0)の秘密 http://www.linux.or.jp/JM/html/LDP_man-pages/man3/getcwd.3.html glibc拡張で必要な長さのバッファが確保される…とあるけど、これ絶対パスが長過ぎると失敗するのか。覚えておこう。 glibcのソースはこんな感じ↓ \begin{verbatim} #ifndef NO_ALLOCATION size_t alloc_size = size; if (size == 0) { if (buf != NULL) { __set_errno (EINVAL); return NULL; } alloc_size = MAX (PATH_MAX, __getpagesize ()); } \end{verbatim} で、alloc_sizeが足りない場合は、リトライせずにNULLを返してる。 * unkownって書くたびに うんこのことが思い出される。 世の中にはbugzillaを使っただけでうんこのことを思い出す人もいることだろう。 * 消えてなくなれ って英語で言うとなんだろ…FUCK? FUCKは便利単語である。 ================================================================================ * 2008-04-30 ん。四月おわった。 * 29日の件 一応作ったのもったいないので置いておく http://morihyphen.hp.infoseek.co.jp/files/shesellsshells.tar.gz 何のことかわからない人は多分見てもわからないと思うので放置でよいです。使いかたは、 \begin{verbatim} 適当なTTFをfont.ttfとして置く。 $ make -C npr $ make $ ./main \end{verbatim} 多分Linuxでしか動きません とりあえず若かったなとか的な。 作業してて人の話聞いてないのが定番になりつつあるので次々回ぐらいにはなんとかしたい。 収穫としては、やる気出ないときは絵から始めるとよいのがわかった。 ================================================================================ * 2008-04-28 * YAbe ネタが思い付かん なんでもいいから画面出すか… ================================================================================ * 2008-04-26 * 今日のメモ(おとといだが) 携帯電話は電池残量少なくても一日我慢すると思いがちだが、それは、電話かかってきたときに困ります。 * どうでもいいから LANケーブルを引っこ抜け!!!!!!!!! * とにもかくにも 引っこ抜KEEE。 * 結局web見てた ================================================================================ * 2008-04-18 * GCC日記 一日で終わった。ちなみにあれは、IBMのだと、 \begin{verbatim} if (__builtin_expect(cond,cond)) {} \end{verbatim} とかでできる。が、なんか駄目だったので、あれを書いた次第なのだけど、もう一度見直してみたら、全然駄目じゃなかったのでどうでもよかった。 * 俺と客 今のお客さんはリアルではほんの数分くらいしか会ったことないのだけど、Unreal Tournament(Tournamentが書けない)をやってるとかの影響で5回くらい殺しあったことがある。最近はCOD4とか気味。 (そういえばなんで出向してるのにお客さんに会ってないんだろうか…) * さて大阪にでも行くかと思ったら既に新幹線終電だった。新幹線終電は9時20分ぐらいなので覚えておくように。 ================================================================================ * 2008-04-14 * ドラクエ そういえばドラクエのIとIIをやってなかったのでやってみることにした。とりあえず一日で竜王まで到達した、が、とりあえず世界の半分をもらって、そこでやる気を失ったのが昨日。また来週あたりにやろうと思う。 ドラクエI/IIやるのが一番簡単な機種って何かな…とりあえず手元にあるのがGBAだけなのでGBCのやつをやってんだが、今なら携帯のでもよかったか。 エミュレータはやってるとなんか虚しくなるのでやらない。 GBCって意外と色数あるんだな。記憶ではもっとショボいんだけど、多分スーパーゲームボーイで起動したモノクロのソフトの色数とかの記憶とごっちゃになってる気がする。 * 久し振りにGCCでも弄るか… と思ったのは既に二週間前の話か(quilt書いてたらへん)。起動するまでに二週間かかるマシンだと思っていただければよろしい。 * 何をやりたいか 条件分岐をなんとかす。 アーキテクチャによっては、分岐する命令のちょっと前に分岐先を指定して、分岐ヒントにする、というようなものがある。 具体的にいうとCell/B.E.のSPUとか。(というか他に知らん)。 結構よくできていて、仕組みは超簡単なのに、ソフトウェアさえうまくなっていれば、分岐ミスを0にできるというもの。 \begin{verbatim} hbr branch, target # branchというアドレスでtargetにジャンプするというヒント hoge fuga foo bar nanika doreka branch: bne target \end{verbatim} 例えば、完全にランダムに、どっちかに分岐するというプログラムがあるとする。 \begin{verbatim} if ( nanika_rand_0_or_1() ) { hogehoge(); } else { foobar(); } \end{verbatim} この場合、分岐の条件が決まってから分岐命令に到達するまでのところに命令がスケジューリングできるなら、 \begin{verbatim} bool cond = nanika_rand_0_or_1(); nanika_shori(); void *target = cond? lableA : labelB; sugoi_shori(); hint(branch, target); totemo_sugoi_shori(); branch: goto *target; labelA: hogehoge(); labelB: foobar(); \end{verbatim} こんな感じにして条件分岐ミスのペナルティを0にできる… …というアーキテクチャになってるのだけど、GCCだとこれが表現できない…ことはなくて、上のようにLabels as Values 拡張使って無理すればできるのだけど、上のだとコードの質が微妙なんだよな。 というわけで、なんとかする、という話。 * SPUのコードはどれか。 GCCの4.3.0からSPUが公式でサポートされてます→gcc/config/spu/spu.c。 * さてどうするか 対象コードは以下。最初に無駄なコード入れてるのはbasic blockそれなりに長くするため。あんまり短いと逆効果なので。 \begin{verbatim} #include __vector signed int a[16]; int func(int b) { a[0] = spu_splats(0); a[1] = spu_splats(0); a[2] = spu_splats(0); a[3] = spu_splats(0); a[4] = spu_splats(0); a[5] = spu_splats(0); a[6] = spu_splats(0); if (b) { puts("a"); } else { puts("c"); } } \end{verbatim} 分岐のコードを出してるのは、spu.c:950行目あたり。 …さて、ここからどうするか。 この処理を以下のように変更したい。 分岐の前のbasic blockがある程度の長さ(20命令以上)で、かつ、パイプラインが埋まってないときに、gen_rtx_IF_THEN_ELSEとかしてるのをselbとかにする。 RTL的に言うと、 \begin{verbatim} (jump_insn 21 20 0 cond.c:14 (set (pc) (if_then_else (eq:SI (reg:SI 146) (const_int 0 [0x0])) (label_ref 0) (pc))) -1 (nil)) \end{verbatim} こうなってるのを、えーと…どうすりゃいいんだ…RTLが読めないのだった。超適当に書くと、 \begin{verbatim} (set (reg:SI 3 $3 (label_ref hoge1))) (set (reg:SI 4 $4 (label_ref hoge2))) (set (reg:SI 4 $4 (reg:SI $3) (reg:SI $4) (reg:SI $5))) (set (pc) (reg $4)) \end{verbatim} こんな感じ? 問題: これのjumpしないほうのbasic blockの先頭ラベルが無い。(hoge2) * 簡単に用語解説 abbreviations_and_acronymsこれ読め。 * うん?上のコードはああなるのか…ちょっと微妙だな…でもこれまた別の問題なので今度(今度ていつだ)。SPUは分岐予測とか無いので、無条件分岐もちゃんとヒント付けないと分岐ミスするのである!! * べーしっくぶろっくのらべるをとろう どうするか…とりあえず、cfunから辿っていって、線形探索すれば取れそうではある。 ラベルが指してるとこの次のRTXはおそらくNOTE_INSN_BASIC_BLOCKだからそこから取る。んで一個戻って、そっちじゃないほうのをとれば…なんか無駄だな。 cfgrtl.cとか見ると、start[INSN_UID (rtx)]で取れるっぽいな。と思ったら違った。これそのループの前で調べてんな。 アーキテクチャ依存部でbasic block取るのはあんまりやらないみたいだな。i386とrs6000でも一箇所づつしかやってないくらいだからそうなんだろう。 * さてパスでも書くか アーキテクチャが特定の条件を満たしたら条件分岐を条件mov + 間接ジャンプに置き換えるパスとか書けばいいんか…なんか少々の変更では済まなくなってくるな… まあでもIf-conversionとか終わってからのほうがよさげなのでそっちのほうがよさげ。 WritingANewPass とりあえず、短くて何やってるか理解できそうなdce.c(dead code elimination)とか参考にするか… * べーしくぶろっく巡りかた \begin{verbatim} basic_block bb; FOR_EACH_BB (bb) { } \end{verbatim} で関数中のbasic blockをめぐる。 \begin{verbatim} rtx insn; FOR_BB_INSNS (bb, insn) {} \end{verbatim} でbasic block中の命令をいてれーとする。命令を消す可能性があるときは、FOR_BB_INSNS_SAFEを使う。 ふむ。全くわからんな。→なんというしょうもない間違い。treeのifcvtとrtlのifcvtを間違えていた。 code_labelとlabel_refは違う。 おえ。なんかsuccsを持ってるbasic blockの終わりはconditional jumpで終われない…のとは違うか。なんかfall thruとかちゃんとしないといかんっぽいな。まあひとことでいうとだるくなってきた。道のりが遠すぎる。こんなの。また来年(多分)!いや、遠すぎないよ。実質やるのこれだけだし…(ほんとか?) 明日への希望 : force_nonfallthuruのちゃんとした使いかた。あとtablejumpとか参考にしてなんとかする。あとちゃんとテキストにしてまとめるとよい。 * あとの問題は basic blockを超えて最適化されない。レジスタが余ってて、パイプラインスカスカだったら当機実行とかしてほしい。上のだと、hbrが破壊されなかったら前のbbでやるとか…こっちのほうが簡単かも? ================================================================================ * 2008-04-04 やべー最近虫ふたウルトラstage1で終わるよ。 色んな能力が衰えていくという話でした。 * 新世代 そういえばついにリアルで「SVNは使ったことあるけどCVSは使ったことない」人がいた。(というのを知ったのは三週間前の話ブログである) そのうち「単一リポジトリってなんですか?」っていう人が生まれたりするのかなー。 しかし、CVSやらRCSやらを使ってた時代から考えると(そんな時代知らんが)、まさか、バージョン管理ツールが著名な宗教戦争ネタのひとつに数えられるようになるとは予想だにしなかったよなー(そんな時代知らんが)。 読者への宿題:著名な宗教戦争を10個ほど挙げなさい。1個でもいいです。挙げなくてもいいです。 * immutableなOS 思考実験 - immutableな言語 リンク先とはあまり関係無いけど…タイトル見て思い出した。immutableなOSというものを考えたりする。たまに。 immutableなOSでは、ファイルシステムがimmutableだとする。デバイスはどう扱えばいいかは特に思い付いてない。アプリケーション内(ひとつの閉じた仮想環境内)でのメモリやら変数の扱いはどうでもよいとする。 使い方は以下のような感じ。 1. 起動すると、一個のディレクトリツリーができる。んで、シェルが起動する \begin{verbatim} [1] $ \end{verbatim} この日記ツール糞か!半角の$が入力できねーぜ!以降、プロンプトはzsh気分でお送りいたします。数字はシェルがいくつ入れ子になってるかを示してます(説明になってない) \begin{verbatim} [1] % \end{verbatim} 2. プログラムを起動すると、そのプログラムがディレクトリツリーに対してどういう副作用を及ぼすか、が帰ってくる \begin{verbatim} [1] % cp a b cp a b = {subeffect copy a to b} [1] % \end{verbatim} この時点ではファイルシステムは変更されない。コピーは行われない。 \begin{verbatim} [1] % x=cp a b [1] % print x {subeffect copy a to b} [1] % \end{verbatim} 副作用は変数に入れて持ち運べるみたいな感じにする。副作用はapplyとかで適用できる。applyに副作用を渡して、その後にプログラム名を書くことで、副作用を適用したディレクトリツリーの中でプログラムを実行できる。 \begin{verbatim} [1] % apply --help Usage: apply SUBEFFECT PROGRAM [1] % apply x shell # <- 副作用x を適用した環境の中でシェルを動かす [2] % \end{verbatim} などとする。ここまでしか考えてない。あとは複数のディレクトリツリーをマージして作ったディレクトリツリーの下でプログラムを動かすとかそういう。 さて、こうすると何が嬉しいか?何も嬉しくない。こういう「変更できない」というルールは「変更できるハードウェア」を表現するのがすごく遠まわりになるだけなので僕の好みではない(じゃあなんで書いたんだ)。 以下の点を考える Q. 1. このOSは使いやすいか? 2. 柔軟性、堅牢性的な意味でどうか? 3. 性能はどうか A. 1. 質問が曖昧です 2. 運用しだい 3. 効率は既存のおsよりも良くなる。(JavaやHaskellが強力な最適化ができるからCよりも効率が良い的な意味で) ================================================================================ * 2008-04-03 電車力というものがある。いや、無い。今思い付いた。 と思ったが、神によると既にある言葉ということなのでここでは電車カということにしておく。(どうせ二度と言及しないのでどうでもいい) 目的地まで行くのに、間違えないで電車に乗ったり、スムーズに乗り換えるとかいったような能力を指す。 徒歩で通勤するようになってから電車カが落ちたように感じていた。間違えて逆向きの電車に乗ってしまうなんて、空想上の生き物だけが引き起こせるファンタジーだと思ってたんだけど、まあ、何回かやってしまった。(よく使う駅だというのに) 僕の電車カの衰えを時系列順に並べると以下のようになる。 |
    |
  1. 小学生ぐらい : 子供らしく乗り換え駅を覚えるのが好きだった
  2. |
  3. しばらく : とりあえず覚えてたのでなんとかなった
  4. |
  5. 就職 : 長野とか電車ほぼ無いので乗らなかった。ただ、乗り間違えとかすると悲惨なことになるので、時刻表は見てた
  6. |
  7. 埼玉来た : 2,3分に一回電車くるので時刻表とか必要無くなった
  8. |
  9. いま : 怖くて電車のれない
  10. |
だから何?電車カの衰えはあるので皆さん気を付けましょうという話でした。 いや…物事を理解している状態から理解できない状態への遷移とかちゃんと記録してあると面白いのにな…と思う。逆もあって、理解できてない状態から理解してる状態への遷移中はどういう思考をたどってるのか、というか、こっちのほうが興味あるが。 人に物を教えるときに、自分は知らなかった時はどういう思考をしてたかが全く思い出せないんだよな。人に教えてるときは、「こんな簡単なこともわからんのか…」とか思うけど、実際自分が理解したときはどうだったかいうのをよく考えて思い出してみると、やっぱり一週間とか数ヶ月とかかけて理解してるものとかがあったりなかったり。 それはいいんだが…最近電車通勤しがちなので、電車カは回復しつつある。 ところで電車通勤というと、最近、電車のなかでふたりエッチ読んでる人をみかけて、僕が少し電車に乗らなかった間に世間というのは進歩したものだと思った…と思ったが、アレな感じの新聞読む人は昔からいたような気がするのでそうでもないか。ところで電車内でああいう新聞読んでる人って一体…とか思ったが、まあ、人のことをいちいち詮索するのはよくないことである、と考えてしまうのは日本人のよくない点である。 例えば推測するに、おうちに帰ると家族がいるので、「さすがに家族の前ではちょっと…」っていう感じだから、電車の中で発散するしかない、という設定はどうだろうか。ひとりぐらしの人間にはわからない苦悩なんだろうきっと。 さらに言うなら、ナニなアレの隠しカというのがあって、ひとりぐらししてると、ナニなアレを隠したりする必要が無くなるため、そういうのを隠したりする能力が失われる、というのがあって、デスクトップにアレな画像を置いてしまったりなどする。 * 新入社員の時期になった この時期になるといつも驚かされるのは、僕がいまだにクビにならずに済んでいるという点である。もう四年にもなるのか…この世に奇跡というものがあるとすれば、それは僕が社会人だというのがそれに該当すると思う。 ================================================================================ * 2008-03-28 なんかWindowsでスリープに入ったあと、Linux起動するとイーサ変っぽいな… * quilt quiltはパッチ管理するツールということでいいだろうか https://savannah.nongnu.org/projects/quilt バージョン管理みたいなことをパッチだけでできるというツール バージョン管理ツール使えよ…って話だが、バージョン管理には無いquiltの利点として、とりあえず僕が思い付くのは、データベースがテキストだということだろうか。 | あと、ちょろっとメタデータがあるけど、これもただのリストとオリジナルのコピーなので、とりあえずfindとcatだけで内容が見れる。 今日までややこしそうと思っててあんまり見なかったんだけど、よく見るとこれ僕の好みっぽい構造だな。 詳しくは、このへん(PDF)を読んでもらうとして、(こうして人に勧めておいて自分は読んでないドキュメントが増えるのだった)適当に使いかただけ。 \begin{verbatim} $ ls Makefile a.c b.c $ cat Makefile all: exe exe: a.o b.o gcc -o $@ $^n clean: rm *.o exe * $ cat a.c int main() { b(); } $ cat b.c int b() {} \end{verbatim} こんな感じのディレクトリがあるとする。この状態で、 \begin{verbatim} $ quilt new add-factor.diff \end{verbatim} とする。これで新しくパッチを作る。 んで、編集したいファイルをadd \begin{verbatim} $ quilt add b.c \end{verbatim} もしくは、直接ちょろっとエディタで開いて編集するだけなら、 \begin{verbatim} $ quilt edit b.c \end{verbatim} とすると、addして、EDITORで開いてくれる。 んで適当に編集。 \begin{verbatim} $ quilt diff Index: q/b.c =================================================================== --- q.orig/b.c +++ q/b.c @@ -1 +1,7 @@ +int fac(int i) +{ + if (i==0) + return 1; + return fac(i-1)*i; +} int b() {} \end{verbatim} とすると、差分が確認できるはず。 \begin{verbatim} $ quilt refresh \end{verbatim} refresh すると、上の差分のパッチができる。 もう一個パッチを作る \begin{verbatim} $ quilt new hello.diff $ quilt edit a.c $ quilt diff Index: q/a.c =================================================================== --- q.orig/a.c +++ q/a.c @@ -1 +1,2 @@ -int main() { b(); } +void hello() { puts("hello"); } +int main() { hello(); b(); } \end{verbatim} 新しくパッチを作って編集。 んで、popでパッチを取り消せる \begin{verbatim} $ quilt pop \end{verbatim} これでadd-factor.diffだけが当てられた状態になる。 もう一個パッチ作成 \begin{verbatim} $ quilt new call-factor.diff \end{verbatim} これで、add-factor.diffとhello.diffの間に、call-factor.diffを入れられる。 \begin{verbatim} $ quilt edit b.c $ quilt diff Index: q/b.c =================================================================== --- q.orig/b.c +++ q/b.c @@ -4,4 +4,4 @@ int fac(int i) return 1; return fac(i-1)*i; } -int b() {} +int b() { fac(30); } $ quilt refresh \end{verbatim} んで、push、popなどすればパッチを当てている状態を簡単に切りかえられる \begin{verbatim} $ quilt pop -a # 全パッチはずす $ quilt push # add-factor.diff適用 $ quilt push # call-factor.diff適用 $ quilt push # hello.diff適用 $ quilt pop 2 # hello.diff call-factor.diff はずす $ quilt push -a # 全パッチ適用 \end{verbatim} 大体こんな感じ。あと、野良パッチを適用するのはfoldとかで。 データベースが非常に簡単な構造になってて、patches/seriesに、パッチのリストが書いてあり、.pc/以下にパッチごとのオリジナルのコピーと、どのパッチを適用しているかを書いてあるapplied-patchesがあって、あと、quiltのデータベースのバージョン(多分)が書いてある.versionがあって、以上。 という、もはやシェルスクリプトでなんとかなんじゃねーの、っていうぐらいというか、実際シェルスクリプトで書いてある。 問題はドキュメントが無い。上のPDFとmanぐらい。けどシェルスクリプトだからソース見りゃいいか…というかmanがあるのにドキュメントが無いっていう考えが素敵だな。ぐーるるでけんせくできないものはどくめんとじゃない!!! というか、ドキュメントが無い…という考えかたが間違いか。manだけで記述できるくらい仕様がシンプルだというほうが正しいな。 * FSIJ 今年はGCC行き忘れるという失態を犯してしまったのでメモ。これは行く http://www.fsij.org/homepage/wiki/MonthlyMeeting2008Apr ================================================================================ * 2008-03-26 生きてるます。 * C言語による最新アルゴリズム辞典(AA) logとかってどうやって書くんじゃい、って感じになったので、買って5年目にして(かどうかは忘れたけど)ようやく役に立つ日が来たようだな。 別に書くわけではないんだけど。例えば、精度はいらないから速度が欲しい、NaNの事は考えなくていい、値の範囲がわかってる、等の条件がある場合に、中身がわかってないと工夫できないよなー、と今日必要になったので今まさに本棚から引っ張り出してきた。(そしてまだ何も勉強していない) あと、例えば、二回atanfを呼ぶとして、xが同じでyだけが違うときは最適化できるか否か、とか、そういう系。 そして、なんでatan2はyとxが逆なんだろうな…(あんまり関係無い) math.hの関数実装一覧を眺めたいときは、glibcのソースかなー。 あと、Bulletに含まれてるsimdmathとかが良い。X86の実装が無いけど… * 最近なんか今の仕事無くなった時の将来がやたら不安だな 最内ループしか書いてないからな… \begin{verbatim} 面接官(以下、麺)「前職では何をされてましたか?」 w(以下、w)「ループをアンロールしてました」 麺「ループをアンロール?それはどのような作業でしょうか?」 w「for (i=0; i<N; i++) となっているのを for (i=0; i<N; i+=4) と書きかえて、中身を4回コピペする仕事です」 麺「…それだけですか…?」 w「それで満足いかなかったらfor (i=0; i<N; i+=8)と書きかえて、ループ本体を8個にします」 麺「…それで…」 w「それで満足いかなかったらfor (i=0; i<N; i+=16)と書きかえて、ループ本体を16個にします」 麺「…それは自動化できるのでは?」 w「できると思います」 麺「ではなぜ自動化しないのですか…」 w「さあ…なぜなんでしょうか…」 麺「…えーと、他には?」 w「関数を見つけたらinline修飾子を付けます」 麺「それで…?」 w「え….cから.hに移動する…とか…?」 麺「それで…?」 w「…」 \end{verbatim} それで…? 僕も明日からレールの上でルビー動かすような感じに生きていきたい所存であります!!!! * installkernelの引数は手で入力しないでいい なんてこった!make installでいける!もう3年くらい勘違いしてた! この日記ツール糞か!$の半角が入力できん! ================================================================================ * 2008-03-24 hoge ================================================================================ * 2008-03-17 んーなんかオンボートのEtherが変だな…リンクしないてなんだ…壊れてんか… あれ?繋がった。謎げ。 * 出向 ん。すごい環境だな。 何がすごいかというとUnreal Tournament 3の試合をやるという風習があるとかいうような。 あと隣の人がずっとWikipedia見てた。 * installkernelするときにカーネルのバージョンがわからない。menu.lstを書くときにカーネルのバージョンがわからない。 man testするとbashのマニュアルが出てきてむずい…と思ったら今の環境そんなことなかった zshの履歴保存の仕方がわからなくていつも悩む。HISTFILE,HISTSIZE,SAVEHISTだYO! あとほげほげ。 * 最近アセンブリ言語が一番美しいと感じるようになってるな。 書いてるプログラムがほとんど最内ループとかばっかりなのでGUIプログラミングとかできる気がしない。 ================================================================================ * 2008-03-10 * floatの加算とintのインクリメントを同時に計算する \begin{verbatim} int ix,iy; float fx, fy; while ( ... ) { ix ++; iy ++; fx += dx; fy += dy; } \end{verbatim} こんな感じのコードがあったとする。 今のCPUは大体 int もしくは float ならば4並列で計算する演算器が付いてるので、この演算を一回でやりたいとする。が、intとfloatを混在させるのはできない。が、0〜8388607(=(1<<23)-1)の範囲でインクリメントするだけならなんとかなる、という話。 \begin{verbatim} #include <stdio.h> float tof(int x) { float *p = (float*)&x; return *p; } int toi(float x) { int *p = (int*)&x; return *p; } int main() { int i; float sum = 2.0f-(1.0f/(1<<23)); // 0x3fffffff float i1 = -(1.0f/(1<<23)); for (i=0; i<((1<<23)-1); i++) { sum += i1; } printf("%d %d\n", (1<<23)-1, toi(sum)^(0x3fffffff)); return 0; } \end{verbatim} こんなコードを考える。2.0f-(1.0f/(1<<23)) = 0x3fffffff。で、これに、-(1.0f/(1<<23))を足してやると、整数のデクリメントになる。 そんで、最後に指数部のマスク、仮数部の反転を行えば、色々あって、floatの加算で整数のインクリメントをしたことにできる。指数部は3f800000固定なので、3f800000 | 0x007fffffとのxorを取ればこの指数部マスクと仮数部反転が同時にできる。 これを使って、最初のコードは、 \begin{verbatim} #include <xmmintrin.h> #include <stdio.h> float tof(int x) { float *p = (float*)&x; return *p; } int toi(float x) { int *p = (int*)&x; return *p; } int func( int n, float x, float y, float dx, float dy ) { float f = 2.0f-(1.0f/(1<<23)); float i1 = -(1.0f/(1<<23)); int i; float result[4]; int mask[4] = {0,0,0x3fffffff,0x3fffffff}; __m128 vsum = _mm_setr_ps(x,y,f,f); __m128 vinc = _mm_setr_ps(dx,dy,i1,i1); __m128 vmask = _mm_load_ps((float*)mask); _mm_store_ps(result,vsum); for (i=0; i<n; i++) { vsum = _mm_add_ps(vsum,vinc); } vsum = _mm_xor_ps(vsum, vmask); _mm_store_ps(result,vsum); printf("%f %f %d %d\n", result[0], result[1], toi(result[2]), toi(result[3])); } int main() { func( 30, 0.5, 1.0, 0.5, 1.0 ); } \end{verbatim} こんな感じに書ける。と思ったら最適化したらブッ壊れてた。 \begin{verbatim} union fi{ int i; float f; }; float tof(int x) { union fi fi; fi.i = x; return fi.f; } int toi(float x) { union fi fi; fi.f = x; return fi.i; } \end{verbatim} こうか… ================================================================================ * 2008-03-09 帰ってきた。(のは昨日) ================================================================================ * 2008-03-03 今から海外。何も準備してないがいいのか。 いや、今から準備するか…あと一時間しか無いが…。 メール見れないので連絡する場合はテレパスなどをご利用ください。 そろそろ真面目になんとかしたほうが。 ================================================================================ * 2008-02-26 久し振りにX Windowなんぞをビルド中。僕はXが無いとメール見れない人間なのだ。 こんなに依存があるのか…めんどいな。 しかしこのマシンconfigureおっそいな。distccならぬdistconfigureが欲しい。 環境を必要としてるのはリンカとプリプロセッサで、プリプロセッサとかは無視していいので、どっかのマシンでコンパイル、ローカルでリンク、と分けて、conf.cを複数コンパイルするときは、一個次のコンパイルと、今のリンクは並行して実行できるので、そのへんを云々。 しかし、今のシェルスクリプトという仕組みではそういう最適化はできない、コマンドがどういう影響を及ぼすかはシェルにはわかんないのでシェルは|や&が書かれた時以外は複数のコマンドを並行して実行するなんてことは出来ない。gccが一個前のgccの処理結果に依存するなんていうことはまず有り得ないけど、しかし、シェルは、その可能性がある限り、そういう最適化を行うことはできない。 マルチコアCPU向けのカーネルというのがあるかどうかはわからんが、上のような問題を引き起こさないように注意深くシステムを作っていけば、マルチコアCPU向けのシステムというのを作ることは可能だろう。 ほんとか?distconfigureの場合だと、GCCではコンパイラとリンカが別プロセスになっているので、これを分割することができる、が、これ以上分割できない。そうなってくると、「プログラムをリンクする」という行為をなんとかしたく思う。 が…まあいいか。ここらへんはまた今度書く。と、思ったが、そんなに書くことは無かった。 まあ、プログラムの最適化のための解析は、そのうちグローバルな依存関係の解析のほうが重要になってくる。のかなーとか。 * 12時 寝るげ。 * 2時 寝てない。 上の考えかたは問題があって、今のシェルスクリプトは「順序入れかえによる問題が起こらない」という仕様になってるので、「順序入れかえできない」のだけど、上の考えかたは、「正しく依存関係を記述しないと順序入れかえが起こって問題が起こるよ」という仕様にすることによって、順序入れかえが可能な仕様を実現してるので、問題はほとんど解決していない。 さて、では、何が嬉しいか?何も嬉しくない。 いや、仕様では、「依存性をちゃんと記述しなかった場合の動作は保証しない」とかになるはずなので、これを、「静的な検証で依存関係が正しくないとわかったは実行不可にする」とかにしてもよくなる。シェルスクリプトの場合は、正しく依存関係書いてないものを実行不可にするのは無理…という部分で違いが出てくる。 依存性を記述しないといけない面倒さは、多分依存性推論とかでなんとかなるだろう。なるの?推論しきれない部分は人間に書かせるようにする。 というわけでシステムの構成として、「並行実行を考慮したシステムの仕様」があって、「今のシェルスクリプトに大体近いもの…に若干手で依存性を書いたもの」をつくる。んで、あとは「依存性推論」「依存性検証」「並行実行最適化」を通して実行可能オブジェクトができる、ようにすれば、安全かつ、CPU数でスケールするシステムができる…と思う。 やっとxorg-serverがコンパイルできる環境になった。前はxlibとかが揃ってる環境でxserverコンパイルしたから簡単だったんだな…あのときはXFree86だったなぁ。これからはXFree86とか知らない人がでてくるのかなー。いや、XFree86とXorgで何が違うかなんてユーザレベルではわからんけど… 「昔はデバイス挿すたびにX再起動してなぁ…」って書こうと思ったら、hotplugするにはdbusが必要らしいということがわかった。dbusて結局なんだ? * 誰だプリプロセッサは無視していいとか言った奴 主にぷりぷろせすが遅かった。 \begin{verbatim} $ distccmon-text 1 15182 Compile xaaWrapper.c 192.168.10.100[1] 15244 Preprocess xaaPaintWin.c 192.168.10.100[2] 15711 Preprocess xaaRect.c 192.168.10.100[0] 15776 Preprocess xaaLineMisc.c 192.168.10.100[1] 15805 Preprocess xaaBitOrder.c 192.168.10.100[2] 15711 Preprocess xaaRect.c 192.168.10.100[0] 15776 Preprocess xaaLineMisc.c 192.168.10.100[1] 16086 Preprocess xaaFillPoly.c 192.168.10.100[0] 16086 Preprocess xaaFillPoly.c 192.168.10.100[0] 16086 Preprocess xaaFillPoly.c 192.168.10.100[0] 16347 Preprocess xaaWideLine.c 192.168.10.100[1] 16366 Preprocess xaaTables.c 192.168.10.100[2] 16086 Receive xaaFillPoly.c 192.168.10.100[0] 16347 Preprocess xaaWideLine.c 192.168.10.100[1] \end{verbatim} このマシン無理かなぁ…諦めるんじゃない!昔XFree86をビルドしたときはMMXPen133MHzとかだっただろ。 ================================================================================ * 2008-02-22 * 今週 というわけで、今週は、「朝5時に起きるぞ」と誓ったものの、結局起きたのは八時でしかし、これは、いつも9時30分に起きてる社会人失格の僕としてはまあまあそれなりの成果で、一応4日続いたので、三日坊主ではなく、そんであと、近くに座ってる人が面白い人だと知ったりとか、あの人が会社やめるだとか聞いたりとか、それ関連で、Googleは今日からは敵であり、僕はあと一週間でFFTを極めねばならず、そして、明日からは頑張ろうと思いつつも、そんな色々も他人にとってはどうでもいいことというか、そんな考えも全て酔った勢いでしかなくて、明日の僕にとってはどうでもいいことで、何もかも全て忘れてるんだろうなーとかいう。 まとめると、久し振りに色々と刺激ある一週間だったように思う。 * RSSが嫌いな理由 あんまり真面目じゃない話ばっかり書いててもアレなので、真面目じゃない話も書いておく。 どこぞでRSSについて書いてあって、RSSリーダを使わない人間が一方的に推論されてたように感じて何か一言言いたくなったので書いておく。読者の皆さまにおいては、この文章は久し振りにアルコール入った状態で勢いだけで書いてるという点を念頭に置いて読んでほしいように思う。 まず、RSSリーダを使う一番の問題点は、「誰のを読んでるのかわからなくなる」、という点。 わかりやすく言うと、「sumiiさんがなんかいつもと違うノリで文章書いてるなー」とか思ったら、odzさんの文章を読んでいた、とか、そういう現象だと理解してもらえるとありがたい。 我々(なんで複数形?)の短期記憶は限界時間が3秒しかなく、3秒後には、どこのURLを入力したのか覚えておらず、つまり、CSSというのは、自分がナニを閲覧しているのかを忘れないための重要な情報である、ということだ。 真のモヒカン族は「誰が書いた文章なのかは問題ではない」と考えるところだが、我々(なん?)はモヒモヒしてないので、一番重要な情報は、ドコのダレのプライバシックな情報であり、誰が書いたかは意味が無い文章などは何の意味も無い文章であることを理解していただきたく。(←なんでメール書くと「いただきたく」で文を終えてしまうのだろうか我々は) 我々がぶろっぐに求めているものはプライバシックな情報…具体的に言うと、誰と誰がつきあってるか、であり、それ以外の情報は全て0bitであり、すなわち、「誰が書いたか」が最も重要な情報であり、しかし短期記憶の無い我々は、そのCSSが貴重な情報源であり、すなわち、本文よりもCSSのほうが大事だから、CSSを削ってしまうRSSリーダはその情報量が0bitである、ということである。(結論が本文と同じくらい長い文章) そして、どうでもいいはなしなのであるが、どうでもいいはなしであるが故に、上の点より重要な点として、我々(なんで複数系?)は、別に情報を集めるために、webを見てるわけではない、という点である。 我々(なん?)は、情報を集めたくて、webを見ているのではない。 ちゃんとした情報が欲しいのなら、まず、ブラウザを閉じて、PCをシャットダウンし、自分が今、何を求めているのかを整理し、本屋へ赴き、本を探し、図書館へ行き、本を探し、じっくりと、その根底にある理論を理解すべきである、ということは十分に理性としては把握しているのである。 しかし、そんな我々(?)が何故PCを起動し、ブラウザを起動し、どうでもいいぶっろぐを読んでいるかというと、つまり、ちゃんとした情報なんか欲しくなくて、いかに無駄な時間を潰すか、が重要な課題であるからであって、そして、無駄な時間というのは、必要な作業のための時間を削って生まれた貴重な時間であることを理解していただきたいところであるが、こんな文章で情報が伝わると思ったら大間違いである。 つまり、我々は、貴重な無駄な時間を過ごすためにwebを閲覧もしくはブラウジングしてる(卵、もしくはエッグしてる)のであって、効率良く情報を集めるなんていうのは、全くもって本末転倒なのである。 しかし、webから情報収集できるから素晴らしい、という考えと、webからは情報収集できないから素晴らしい、という考えのまいんどディバイド(て何?)はどこから生まれるんだろうな。二時だから寝るよ。 ================================================================================ * 2008-02-21 早く帰った。 早く起きて早く会社行って早く帰って早く寝るのを目標に… * というわけで寝るぞ 寝るぞ * うむ 寝るぞ(早く寝ろ) ================================================================================ * 2008-02-19 8時に起きるのは世間的には早起きとは言わないよ! ================================================================================ * 2008-02-14 というわけで京都から帰ってきた。(いつの話だ) 向こうは雪でした。 * sizeof http://www.kt.rim.or.jp/%7ekbk/zakkicho/08/zakkicho0802b.html#D20080212-3 http://d.hatena.ne.jp/isshiki/20080213/p1 投げっぱなしネタの捕捉どうもありがとうございます。 C99準拠らしいので、ついうっかり // のコメント使っちゃうような人はバンバン使っても構わないということですね! あとC++ではそもそも可変長配列駄目なんじゃないでしょうか。とか書こうと思ったけどC/C++の規格ってちゃんと読んだことないな… 原典を当たろうとか言う人は是非ともISO/IEC 9899, 14882を読もう!こうして人に勧めておいて自分は読んでないリストが追加されるのだった。 * mmsp2 MMU付きのARMとMMU無しのARMが共有メモリで繋がってるという素敵アーキテクチャだとかいう話を聞いてGP2Xを買いそうになってた。 意味も無くCPUとかデバイスのデータシート読むのが好きな人には垂涎ものの参考リンク http://archive.gp2x.de/cgi-bin/cfiles.cgi?0,0,0,0,19,2132 これがARM940Tを使ったoggデコーダらしいですよ。 ぱっと見たところ、0xc0000000周辺に片方のCPUの制御レジスタ… http://mudiweb.com/gp2x/MP2520F_Manual_Eng_V1.0.pdf これの4.3のリストか…があって、リセットかけれる。このとき下6bitが共有メモリの上位8bitになる…なので0x30000000が共有メモリ んで、table5-13に書いてあるA940TCLKを落として940Tを止める、んで、共有メモリにプログラムをロード、パラメータ設定したあと、んで、ほげほげか(面倒になってきた) でも、http://svn.gp2x.com/gp2x/tag/kernel-f200/4.0.0/drivers/char/dualcpu.cこれ見る限り共有メモリのデータ壊すと、標準のデコーダとかのプログラム破壊されそうなんだけどどうなんかな… 必要な時になるとモジュールロードするようになってるから、毎回初期化されてんかな…うーん。これはやっぱ買うしか…ないのか…買わないよ…頑張る… ================================================================================ * 2008-02-10 http://www.mesdigital.com/english/Products/product_mmsp2.asp これがプログラマぶるなのか… うーーーーーーーんぉえーーーー。のぅおおおーーー(色々悩み中) ================================================================================ * 2008-02-08 * ほげほげ 明日京都 そして明後日も京都 鶴橋から京都へ行くには何がいいんかな…JRか…ふむ。 * autotoolsは使う度に殺意しか湧かないな 今日は aclocal -I というものをおぼえたよ! バージョン管理とかdiffとかと相性忘すぎるんだけどみんなどうしてんかな… Makefile.inを含めない→automakeのバージョン違いで死亡 Makefile.inを含める→パッチの9割がconfigureとMakefile.inで死亡 * F・F・T!F・F・T! なんか面白くなってきてしまった…やっぱ自動生成かな… とりあえず連休中にPPCのアドレス変換かFFTを覚えたいところ。 * sizeofが定数でない件 \begin{verbatim} int a(int n) { int x[n]; printf("%d\n",sizeof(x)); } int main() { a(10); } \end{verbatim} 隣の人がこういうコードを書いててびっくりした。動くらしい。これってC99準拠なんだろうか。 ん〜。templateに渡したらどうなんのだろうか。 \begin{verbatim} #include template < int N > class A {}; int a(int n) { int x[n]; A<sizeof(x)> a; printf("%d\n",sizeof(x)); } int main() { a(10); } \end{verbatim} \begin{verbatim} sizeof.cpp: In function 'int a(int)': sizeof.cpp:6: error: '((((long unsigned int)(((long int)n) - 1)) + 1u) * 4u)' is not a valid template argument for type 'int' because it is a non-constant expression \end{verbatim} ふむ。この式はどっから出てくんのかな。 * 何しないといけないんだ。 アレとアレ忘れない。図書館に本返す(行けるか?)。FFT。仮想アドレス。アレ。京都の地理に詳しくなる(もう無理)。ネタ考える(多分もう無理)。 ================================================================================ * 2008-02-07 * やばい今週仕事しすぎ しかしこれを仕事と言ってたら真面目に仕事してる人に怒られ気味。 ネタが作れない… これは一晩二時間でサクっと作れるネタを考えるしかないな。 * [lifehack] ティッシュと一緒に洗ってしまった衣類を画期的になんとかする10の方法 我慢して着る * いい加減「〜10の〜」とか書いて10書かないで面白がる癖やめたほうがいいな 人にパタヘネを読めと言っておいて実は自分が読んでない 人に読めと言っておいて読んでないシリーズ http://udrepper.livejournal.com/19557.html http://www.iecc.com/linker/ ================================================================================ * 2008-02-05 * 最もタメになる初心者用言語はFF12 最も十字キーを使う言語はカルネージハート。 sendmail.cfとかChameleonの型システムとか書こうと思ったがよく考えたらどっちも全然知らない。 今年の目標はCahemelon理解できるとこぐらいかなぁ… ところで千言万語て書籍化しないのだろうか。 * FFTプレイ日記 結局必要になった。書けないが。 * やべ カルネージハートかぶりすぎ。 ================================================================================ * 2008-02-03 * 「雪程度で遅れが出る東京の電車m9」…とか、30分に一回しか走らない電車と2分に一回走る電車を一緒にしてもらっては困るブログ 週末天気悪いとか…困る。 * そろそろいい加減「〜ブログ」とかタイトル付けて面白がる癖やめたほうがいいな Rubyの人ってどうして深読みすれば「Ruby使いはいかにすばらしいか」と読み取れなくもない文書をwebに置けるのだろうか。 なかなかそういうことって考えても恥ずかしくて書けないのだけど。 いや、そういう意図は無くてもwebには読み取ってしまう人はいるし…書いてる人なら、無理すればそういう風に読み取れるというのはわかるだろうし… ↑とか書いて思ったけど、この文も深読みできるな…。 上の文は、「どうやったらアルファブロガーになれるか、つまりギーク(笑)なテキストが書けるようになるか」以上の意味はありません。 そうか、恥ずかしい文かどうかの問題ではなくて、「恥ずかし文だと深読みしすぎる人達」のための対策を行うか行わないかの違いか。 * 並列プログラミングが今後も流行らない10の理由 |
    |
  1. そもそも計算性能が求められてない。求められてる分野は全体で見るとちょっとなので、 | そういう人達が全員並列方面へ向かったとしても流行りにはならない
  2. |
  3. 無駄な手間が増えるわりに性能以外の恩恵が無い
  4. |
  5. そもそも並列化に頼らなくてもプログラムを見直すだけで10倍くらいになる
  6. |
  7. そもそも並列化に頼らなくてもお気に入りの言語を捨ててCで書きなおすだけで10倍くらいになる
  8. |
  9. 3.,4.を組み合わせれば100倍くらいになる
  10. |
  11. 8コア、16コアあったとして、その性能をフルに発揮してもたかだか8倍、16倍にしかならない(実際はもっと低い)
  12. |
* White Setubun \begin{verbatim} 「まるで僕等を祝ってくれてるようだね…赤鬼くん…」 「キモいよ」 \end{verbatim} ================================================================================ * 2008-01-31 * 64bitにした これは見てるだけで心に余裕が持てる… \begin{verbatim} $ free total used free shared buffers cached Mem: 6122972 1930600 4192372 0 90920 1448892 -/+ buffers/cache: 390788 5732184 Swap: 1044216 0 1044216 \end{verbatim} \begin{verbatim} $ df -h Filesystem サイズ 使用 残り 使用% マウント位置 /dev/sda6 35G 2.4G 31G 8% / \end{verbatim} /usrをまるごとramdiskにするとかできそうだな…やらないが。 64bitになって一番嬉しいのは、*scratch*バッファでたくさん計算できることだろうか。 なんかSATAがエラー出すとかの問題があったけどケーブル別のコネクタに挿したら問題無くなった。 * 最近なんかみんなやけにPHPの話題ばっか書いてると思ってたんだけど、その理由を今日知った件について load、store命令がいかに駄目か、という話 |
    |
  • 色んなプロセッサが同時に読んだり書いたりするせいで新たな命令mfenceが必要
  • |
  • キャッシュに書いてるのかメモリに書いてるのか区別できない
  • |
  • オブジェクト指向機能が壊れている
  • |
  • lambdaが無い
  • |
  • load,storeを使って書かれたたくさんのアプリがあるが、どれも正しく同期命令が発行されていない(本当?)
  • |
  • 「load、storeはMFCに比べるとわかりやすい」と言われる。確かにそうかもしれないが、おかげでどれだけの同期問題が放置されていることか
  • |
…えーと… いや、今日会社でメモリの同期の話があったのだけど、重箱の隅つつきみたいなことをやると誰も正しいプログラムは何なのかがわからない、まあ、迷ったときは一番確実なのを使っとけ、(x86だとcpuid?)みたいな結論になっていやそんなもんなんだなー。と。僕のこれまで書いてきたコードも多分間違ってたしな…こんなのでみんなプログラム書いてて問題じゃないのかなー、これって、_beginthreadとかpthread_createとか一度でも書いたことがあるなら、確実に把握しておかないといけないことのはずだよなー、とか思ったとかいうような。 マルチコア、マルチプロセッサ環境でのメモリの読み書きというのはload、storeのふたつのオペレーションだけで表現できるものではなくて、裏ではもっと複雑な色々があるのだけど、うんぬん、つまり、「メモリなめるな」と言いたかったんだけど、あれ?なんで真面目な話してるんだ… そうじゃなくて…簡単なものに留まってしまう人達を否定するのはどうなん…ってこの話題絶対機械語を知らない子供達とかとネタが被るぜ!要するに、もっと上のレベルの人から見ればみんなどっこいどっこいって話だ! 10年以内に、一回くらいはメモリオーダリングの問題によって引き起こされるセキュリティーホールが見つかることだろう!多分!そのときに、例えば、(ありえないけど)コヒーレンシの制御とか全部ソフトウェアでやらないといけないプロセッサがあったとして、それを使ってる人達に、「これだから簡単なload、storeばっか使ってるプログラマは駄目なんだ」とか言われたらどうするんだ的なアレな。 そして500年以内に、一回くらいは、量子の移動の問題によって引き起こされるセキュリティーホールが見つかることだろう(400年後に量子の移動をキューイングするqqueueができて、それにフェンスを入れるqfenceとかいう命令がx86に実装されるんだぜ!)!そんなときに、例えば、量子の移動とか全部手でやらないといけないプロセッサがあったとして、それを使ってる人達に、「これだから半導体とか使ってるプログラマは駄目なんだ」とか言われたらどうするんだ的なアレな!! ================================================================================ * 2008-01-27 * 超メモ x86命令フォーマット(しかしこの話題以前一回調べてるな…) うーん。bintransのi386.lispがよくできてる。 プレフィクスで分類。 |
    |
  • lock(f0)できる
  • |
  • rep(f2)できる
  • |
  • repne(f3)できる
  • |
  • セグメント、ヒントが付けられる
  • |
  • 66できる
  • |
  • 67できる
  • |
  • f2 0f 必須
  • |
  • f3 0f 必須
  • |
  • 66 0f 必須
  • |
  • 0f 必須
  • |
オペコードによって挙動が変わるのはしかたない。プレフィクスによって挙動が変わるし。 オペコードごとに付けられるプレフィックスは違う。 → 同じニーモニックでも全然違う命令としたほうがいい。 挙動が変わるプレフィクスとあまり変わらないプレフィクス lock → 変わらない hint → 変わらない rep, repne → 変わる seg → 変わる オペランドサイズ → 変わる アドレスサイズ → 変わる simd → 必須 ニーモニック - 変わるプレフィクス1 -- 付けられる変わらないプレフィクス1 --- 必須プレフィクス, オペコード1-1 --- 必須プレフィクス, オペコード1-2 - 変わるプレフィクス2 -- 付けられる変わらないプレフィクス2 --- 必須プレフィクス, オペコード2-1 --- 必須プレフィクス, オペコード2-2 --- 必須プレフィクス, オペコード2-3 オペコードで分類 |
    |
  • 特定バイト
  • |
  • 命令中にオペランド (movとか)
  • |
  • modrmでrがオペランド
  • |
  • modrmでrがオペコード
  • |
おぺこーど表記→/rとかのマニュアルとかnasmのやつに載ってるみたいなのでいい。 ほげほげする。 * 間違いそうだな ダブルワードは32bit。 * 今時64bitを考えないとかありえないな。 これを読んだほうがいい。 http://www.intel.co.jp/jp/download/index.htm intelさん日本語資料用意してくれてるので助かる。 ややこしいぜ! REXプレフィクス無し→rax〜rspが使えるオペランドは32bit REXプレフィクスあり→ModR/Mによる そうでもないぜ! 基本的には、ModR/Mが付けられるものにはREXが付けられて、REXが付いてないときは上位32bitが符号拡張される以外は32bitと同じ。 REXが付くとそれぞれビット見ろ。 あと32bit dispがRIP相対になる。 * 5時30分 変な時間に2時間くらい寝た(ついに俺は例の猫と一緒に寝てしまった)んだけど、このまま起きるべきか寝るべきか… 忘れてたんだけどこのディスク60GBくらい空白が…64bitの何かでも入れるか… いや、何をやってるんだ… ================================================================================ * 2008-01-26 寝すぎ。 * ゲーセンが生まれる瞬間 近くに行く用事があったのでついでに久し振りに川口へ行った。先週。(先週ブログ)。10ヶ月ぶりくらいか。 そしたら、パチンコ屋がゲーセンになってた!なんという!ゲーセンが潰れる瞬間は何回も見てきたけど、ゲーセンが生まれたのは初めて見た!感動の瞬間! あと、書泉ブックドームが二階までになってた。ショックだわー。僕が初めてあそこに行ったときは、すごい量の本があって、なんか嬉しくなったもんだが、あれも過去の話。 というか閉店すんのか!どっちにしても二度と行くことは無いと思うから関係無い話ではあるけど… 参考 確かに文教堂があったのはヤバかったな。僕自信ほとんど文教堂しか行かなかったし… ================================================================================ * 2008-01-23 * 結局昨日あのあとは アンサイクロペたんに関する知識を手に入れただけだった。 * とりあえずなんでもいいから コード書いた。全然進まねー。 いや、速度はどうでもよくて、明日も作業が続くか続かないかが重要なんだ。 * だがしかし よく考えたらこれとほぼ同じコードを過去に書いている! ================================================================================ * 2008-01-22 近所の猫がたまに家に来るんだけど、昨日は家に入って風呂桶に溜まった水を飲んで帰っていった。 その水はやめたほうがいい、という言葉を伝えきれなかったあたりに、コミュニケーションの難しさというものを感じる。 * リアルで僕を知っていてかつこのページを見てしまった人向けガイドライン 会社の人がこのページ見つけたらしい。イエーイ、見てるー? 本名で検索したら出てくるからな…(はてなのほうが) なんかあったときのために見てしまった人向けガイドラインを書いた * ほげほげ http://okmij.org/ftp/ すご。なんか尋常じゃないな… * しかしこれ トップページのHTML書きかえるにはHaskellのソース変更しないといけないとか酷いな。 * 17bitの値ふたつをかけて32bitのレジスタに放りこんだときの値の範囲について言えることは 任意の32bit値をとるか。 * いいかげん なんでもいいからコード書けよ。 ================================================================================ * 2008-01-16 コーディングスタイルはなるべく問題が起こらないようにできる限り人にあわせるようにしてたつもりなんだけど… \begin{verbatim} v if ( a ) { func( x ); } ^ \end{verbatim} こういう括弧のあとにスペース入れるのって少数派だと昨日まで知らんかった。これは矯正すべき。僕は一体何を見てコーディングスタイル学んだんだろうな。 ================================================================================ * 2008-01-15 ぐんにょり。最近平日も朝起きれない… * 仮想化技術は何故必要か そもそも仮想化技術ってどういうの?って話だが。ここでは最近話題の仮想化技術を仮想化技術である、としておこう。 仮想化技術というのは、なんで必要なんか?と、いうのが疑問。 本来なら、このレイヤはOSが行うべきだった部分のはず。 別に仮想化技術が無くても、素のMMUとOSでも、今の仮想化技術がやりたいようなこと…論理的なハードウェアとか、リソースの分配、例外からの保護…というのは何の問題も無く実装できるはず。 問題があるとすれば、SMT(Simultaneous Multithreading)なCPUの上で、片方のスレッドがキャッシュを汚し続けて仮想環境の外の世界のリアルタイム性能に影響を与えられる…とかの場合しか思い付かない。 多段MMUがあるおかげで、QEMUのように、ほぼユーザ空間だけで仮想PC/ATを作れる、というのはあるけど、それでもインターフェースが変わってしまうけど、OSが適切な仮想環境を作れるインターフェースを用意してればできるはず。というか、Windowsのサブシステムってそれ? いや…結局全ては過去互換の問題だとは思うが。ソフトウェアの問題をハードウェアの機能拡張によって修正する、なんて素敵な話だろうか! (無数にあるソフトウェアと数個しかないハードウェアの実装とどっちを修正するかという問題だけど…) * FFTプレイ日記 ムスラム派かな!実家の押入れ探してムスラム本でも見つけてくるかね!(私信:多分2/9あたりに家帰ります。よろしく) というのはどうでもよくて…勉強しよう、しようとだけ思い続けて10年がたとうとしていたFFTだが、ついに彼と出会う日が来てしまったようだ。 プログラム書くわけじゃないけど。他人が書いたコードのレビューに参加する程度の能力が必要だという設定。今日言われて明日本番です!なんていう付け焼き刃かしら!というか日毎に勉強するテーマが変わる僕ってなんてアルハギークかしら! 信号処理屋ワナビーであるところのwoさんは資料だけはいっぱいあるのだ。(いっぱいは無いが) よし、覚えた、くーりーさんとてゅーきーさんね。これで明日から知ったかぶれるよ。 \begin{verbatim} 「ああ、なるほど、ここらへんの係数がくーりーさんなわけね」 \end{verbatim} よしシャワーでも浴びるか!(全然進んでない) * FFTプレイ日記2日目ブログ(最終回) よし1%ぐらい理解した。 大体そもそも僕はO(N)とO(logN)のっどっちがいいかわからないぐらいの計算量オンチなのでN^2とNlogNはどっちがよいのかわからないのだった。 僕はM = M + 1/N - 1/Nとかいう考えかたは絶対思い付かんのでFFTは思い付かないな。まあいいか。ビット反転が必要な理由くらいはわかった。 * [lifehack] 英語初心者が1ヶ月で人前で話せるくらいにまでなる方法ブログ というのはないものか。 ================================================================================ * 2008-01-14 http://lwn.net/Articles/259339/ このへんのキーワード追いかけていけばなんかわかるかな… でも寝るか… ================================================================================ * 2008-01-13 はてなリポジトリ欲しい! やたら眠い。違うな眠いとかじゃなくて布団に入る以外やることが無い。 * 寒い。また今日もなんもしなかった。日記になんもしなかったことを書くのってどうなんだろうな。 あとifconfigやrouteが許されるのは小学生までらしいということを知った。IPRoute2を使ったほうがいいらしい。でも僕にはどう違うかわからん。ネットワークは一度真面目に勉強しようと思い続けてはや10年(ということはないが)。 寒い。 全然作業進まんな。調べものとかやらないといけなかったのに。う…うまくいかないのが世の中だなんて割り切りたくないんだからね! 寒い。 体感的にはこの冬一番の寒さなんだが。あとうまくいってないのは世の中じゃなくて僕の頭の中。 * CILではじめるOCamlプログラミング あまりにもなんもやらないのもアレなので一応なんかやるか。 やりたいこととしてはコマンドラインでプログラムとループの行番号を指定すると、そのループに対してナニをする、というような感じ。 とりあえず、行番号を指定すると、そのループを取り出す、というところまでやってみる。 まずは…どうしたらいいかな \begin{verbatim} exception NotFound class loopFinder line stmtref : Cil.cilVisitor = object (self) inherit Cil.nopCilVisitor method vstmt ( stmt : Cil.stmt ) = match stmt.Cil.skind with Cil.Loop (body,{Cil.line=l},_,_) when l=line -> stmtref := Some stmt; Cil.SkipChildren | _ -> Cil.DoChildren end let sel_loop file lineno = let loop = ref None in let visitor = new loopFinder lineno loop in Cil.visitCilFile visitor file; match !loop with None -> raise NotFound | Some loop -> loop let _ = if Array.length Sys.argv < 3 then print_string "e-\n" else let file = Sys.argv.(1) in let lineno = int_of_string (Sys.argv.(2)) in let f = Frontc.parse file () in let loop = sel_loop f lineno in Pretty.fprint stdout 80 (Cil.printStmt Cil.defaultCilPrinter () loop) \end{verbatim} 一応動いた。(説明とか無し) 次はループの中から計算とかロードとかを抜き出してみる。(来週に続く。多分) 寒い。 ================================================================================ * 2008-01-11 今日なんもしてないぜ。 仕方ないので先週の話でも書く。先週家賃払ったんですよ、家賃、締めきりは去年の12月中のやつね。まあ、それはいいんだけど、そしたら何の脈絡もなく大家さんが鳩サブレくれたんですよ、鳩サブレ。 どういう意味なんかなー、年始の挨拶に鳩サブレなんかなー、よくわからんなー。ってふと考えたところ、これって「私のハートを受けとって」っていうフラグなんかなー、とか思ったのだった。 ちなみに大家さんは20後半くらいの美人の人。 * とかいう設定が脳内をよぎった(というのはしょっちゅうのことです)。鳩サブレはおいしくいただきました。 実際の大家さんはおばちゃんとおばあちゃんの中間くらいの人で、おじちゃんとおじいさんの中間くらいの人と夫婦のように見えるけど名字が違ってしかも、よくわからんけど、半年前くらい家賃渡しにいったらどちらでも無いおっちゃんがいた。 あの人達はどういう関連の人達なんだろうか謎とかほんとどうでもいいな。 ================================================================================ * 2008-01-09 Hey!4時だZE! 結局今日は仕事のコード書いてた。 * CILで学ぶOCaml うーん。ニコニコ見てた。 そんなに使うの難しくないか。Frontc.parse して返ってきたfileをへろへろすれば大丈夫。 \begin{verbatim} let _ = if Array.length Sys.argv < 2 then print_string "e-\n" else let f = Frontc.parse Sys.argv.(1) () in List.iter (fun a-> let loc = Cil.get_globalLoc a in if loc = Cil.builtinLoc then () else match a with (Cil.GFun (f,loc)) -> print_endline (f.Cil.svar.Cil.vname) | _ -> ()) f.Cil.globals \end{verbatim} ================================================================================ * 2008-01-08 鼻毛の白髪について考えるブログ * Phantom typeの理解は間違ってたらしい!レベル1からやりなおせ! * 社内で無職状態というステキな状態なのでどうやってこのステキな時間を過ごすかという状態なのだが。 OCamlでC弄る(?)ライブラリってなんじゃったかいな… そうそう、CIL。 http://sourceforge.net/projects/cil ぐにょぐにょごにょごにょするC to Cトランスレータが欲しいな、と30分くらい前に思ったのだった。 やりたいことは、ループの中から、ロード、計算、ストアを抜き出してインオーダCPUでもいい感じに並べ替えるとかいうような。21世紀にもなって何故いまだにインオーダCPUなのか! http://hal.cs.berkeley.edu/cil/ext.html どうやったらいいかな…ロード、ストア対象ポインタの増加が一定なことをチェックして(誘導変数とかそのへん)、ぐにょぐにょげにょげにょ。 うん、OCamlがわからん。さすがに会社でOCamlを勉強するのは気が引ける…でも調べものとか会社のほうがはかどるから会社でやりたいんだよな… あと、プログラムC++で書いてあるのだよな…better Cぐらいの使いかたしかしてないと思うので問題無いと思うけど。C++は素晴らしくて素晴らしい言語だけど、もはやフロントエンドが誰にも書けないのが厳しいな。 ================================================================================ * 2008-01-06 指摘されたところによると、僕の喋りかたは30代を感じさせるらしい。明るい喋りかたを目指してたのだけど、何か方向性を誤っていたようだ。 * というわけで調子に乗って↓を読んでみたのだけど、さっぱりわからなかった。 Simple unification-based type inference for GADTs …まあ、ここらへんはまた実装する機会(そんなのあるのか?)ができたときに読むか… C++のテンプレートの特殊化は宣言した箇所で閉じてなくて、あとで追加できる(ライブラリをユーザが拡張できる…ちゃんと用語を調べよう)のだけど、GADTではそれができない、data ... whereで宣言した以上の型を追加できないように見える。これって微妙じゃないかな。 ================================================================================ * 2008-01-05 そろそろ東京帰るよ。 今年の正月は反省すべき点が多かったけど、帰ったら忘れるだろう。 * Phantom type C++のテンプレートの特殊化を整理したものという理解でいいか…帰ったらGADTあたり調べる。 ところでテンプレートの特殊化ってC++起源なんかな? ================================================================================ * 2008-01-03 akemasiteomedetouzagoimasu. * 3回くらい「書かなさすぎだろ」って言われたので今年はもう少し頑張ろうと思う。 * Phantom types 前々から \begin{verbatim} int a[10]; int x = 4; int y = 6; return a[x+y]; \end{verbatim} こういうのコンパイルエラーにできないかと思ってたんだけど、Phantom typeとかそれらへんがそれっぽいな。 http://www.haskell.org/haskellwiki/Phantom_type http://www.haskell.org/haskellwiki/Type_arithmetic 冬休みの宿題だな。冬休みの宿題多すぎ。 ================================================================================ * 2007-12-31 書こうと思ったけど、ちゃんとした設備がないと書けないのだった。仕方無いのでこっちに書く。あとであっちに移す(予定) * 2007まとめ 何があったっけ…仕事が変わった。仕事はなんか良い感じなのでいいと思う。問題としては仕事しかしてないことか。来年は仕事以外のネタも頑張ろうと思う。 仕事はいい感じというか、社会人としてどうかというような感じなので大丈夫なのか。社会人レベルは去年より大分落ちたと思うというか、学生と同じくらいのレベルになったと思う。 仕事は何してんだろう…これ仕事なんかなぁ… 1月から4月は何してたんだろう。思い出せない。 ろくにゲームしなかったな。ゲーセンが遠くなったなどの理由が挙げられる。あと、虫ふたウルトラ2ボスで限界を感じて心が折れたと思う。デススマイルズもあんまやらんかったな、雷電4も3ボス倒せるか倒せないかくらいでやめてしまった…いややめてないんだけど、まだそっから進歩してない。 あと一番時間かけたゲームって永遠のアセリアとかじゃないかとか思うのだけどそれってどうなの?いや、ディスガイア2かユグドラのほうが時間長いかもしれんが…どっちにしてもアレだな、そういうゲームしかやってないのかと。 12月はDark Mistやってたな。久し振りに真面目に攻略とかやったと思う。 あとなんだ。ネタはたまったので来年はちゃんとコード書こう。すごい人と比べるとコード書く速度がすごく遅いんだよな…コード書く速度上げよう。 ================================================================================ * 2007-12-30 よし年賀状ほぼ書き終わった。 なんか一日仕事になってしまったな。一日仕事になった主な原因はニコニコ見てたせいなんだが… 掃除も目標の7割くらいやったし、何か食べたし、クリーニングも行ったし、最低ラインは守れたか。 今年のまとめは明日書く。環境はまあいいや。でかいThinkpadを持っていこう。問題としてはCAVEのアレに行けなくなってしまったことくらい。 * LFSについて 別にメインマシンをやっちゃったわけではなくて、そこらへんにあったマシンに入れてます。 これ このマシンは適当にOS入れ替えたくなったときの犠牲者に選ばれる役をやってます。今まで入れたものはOpenBSD,FreeBSD,NetBSD,Debian,VectorLinux,Plamo(入れようとして失敗して諦めた),Ubuntu(何故か遅すぎた)と、LFS。 LFSやって勉強になるかどうかは微妙だな…まあ、Linux初めて半年くらいの人がやるといいかも。 一点勉強になったことがあるとすれば、「Sending processes the TERM signal」は全部のプロセスにシグナル送ってるわけじゃないってことか… Sysvinit * あとどこへともなく書いとくと、HPはマイナーなメーカーじゃないです! * 来年の僕へ インクジェット用紙と普通の用紙を間違えないでください。 ================================================================================ * 2007-12-29 とりあえず今日やること |
    |
  • 年賀状書く(遅いよ)
  • |
  • 今年まとめ書く
  • |
  • 環境つくる(ついにLFSに手を出したのだった。とりあえず動いてます)
  • |
  • 掃除する!
  • |
  • 何か食べる
  • |
  • クリーニング!
  • |
溜めすぎだろ…半分くらいは先週にやっておくべきだった。 ================================================================================ * 2007-12-04 行きてます。 もうなんかすっかり余った時間でテキスト書く習慣が無くなってしまった。 多分しばらくこのくらいのペースでしか書かないかと思います。見てる人すいません。 ================================================================================ * 2007-11-22 * 寒い ================================================================================ * 2007-11-19 * 24 一週間くらい前。 とりあえず「24」の続きを借りてきて見た。 * こ…この俺が気配だけで圧倒されるなんて… * 肥大化しすぎた消費者の権利について考える社会派ブログ ================================================================================ * 2007-11-05 家賃を払ったのだった。 * [GAME] KENKO-SHINDAN 健康診断。採血したあと貧血起こしてくたばるのだった。 昔は姉が「採血したあと貧血する」とか言ったのを聞いて「どんだけ貧弱やねん」と言ってたものだが、まあ、人のこと言えない。ごめんなさ。い。 ================================================================================ * 2007-11-04 アカンよ。 * 俺は今から一時間でArrowを理解するぞ! 結論 : 無理 13:18 無理かどうかはやってみないとわからないよ! とりあえず最初にArrowという名前を見たのがここなのでここを入り口にする。なんかすごいらしい。 次ここんでここ(英語だけど図があるからわかるよ) (13:23 ほんとに3分しか読んでないよ!なんという流し読み!) なんか書くか。とりあえず、MonadはMonadクラスにならないといけないけど、Arrowはただの関数が使える分簡単ではありそう。 \begin{verbatim} import Control.Arrow a::Int->Int a x = x*2 b::Int->Int b x = x*4 c = (arr a) >>> (arr b) \end{verbatim} \begin{verbatim} Ambiguous type variable `a' in the constraint: `Arrow a' arising from use of `>>>' at Arrow.hs:9:4-22 Possible cause: the monomorphism restriction applied to the following: c :: a Int Int (bound at Arrow.hs:9:0) Probable fix: give these definition(s) an explicit type signature or use -fno-monomorphism-restriction \end{verbatim} e-.wakaran..(13:42) よし、1%ぐらい理解した。(まだ書けないけど) Monad <-> Arrowを行き来するのが Kelisli (Monad->Arrow), runKleisli(Arrow->Monad)。名前がわかりにくいよ。 よし飽きてきた。50分しか持続しなかったな!違う俺はインベーダーやるんじゃなかったのか!(14:07) 全然関係無いことしてた(14:17) * 現代人はその目の前の仕事の忙しさのあまり本来やるべきだった仕事、やりたかった仕事を忘れてはいないだろうか 具体的にいうと家賃を払ってない * tcc の -g よくわからんな…そもそも全く動いてないような…そのうち。 * HTML書き間違えるなんて アホだな… あとFirefox殺してたらしいのを修正 ================================================================================ * 2007-10-30 よよよ。二ヶ月にわたるスランプを脱出した気がする!気がするだけ! * デスマ 終わった。白いほう。最後ボムごり押しなのは反省すべき。 大分良かった。初心者からスコアラー、メガネまで幅広くサポートという点においては素晴らしいとしか言いようがないな。 とりあえず打ち返しありクリアできるぐらいまでは頑張るか。 * Oblivion これすごいな。PS3っぽいゲームをやろうということでやったんだがPCのほうをやるべきだった。 ================================================================================ * 2007-10-25 ここのCAPTCHAはh_sakuraiさんを止めるためにあるのかもしれないな… 回答がわからないときは適当にリロードすると「J」のやつが出ます。多分。 ちょっと簡単なやつを一問追加しておいた。全部で3問。 * 昨日から四回くらいSKKのチュートリアルを起動してるよ…(C-x t) 最近ミスタイプ増えたかな…近くにTODあれば練習するのだけど http://sega-pc.com/tod2/ ふむ…アーケードではないのか ================================================================================ * 2007-10-24 なんという素晴らしい継続力だろうか! * 自作OSでリアルタイム性が重要である理由 反省して長めの文でも書く。OSが書きたくなったときはリアルタイム性について考えることによって罪悪感が薄れる、という話。 たまにOSが書きたくなる。 まだ一行も書いたことないけど。色々とやりたいことはあるのだけど、別に無くても困らないし… まあ、とにかく、色々とやりたいネタがある。のだけど、しかし、結局のところどれもこれもわざわざOSとして作らなくてもSmalltalk的解決方法で、ほぎゃーっと既存のOSの上で閉じた環境作ればそれで十分な範囲のネタなんだよな。MMUとか欲しくなったとしても、kvmがあればどうにでもなるし。 わざわざOSスクラッチしてまでやらないといけないことってあんまり無いのだよな。 LinuxやWindows相当のものですら、QEMUやらVMWareなどのように既存のOSの上で動く閉じた環境として実装できるわけで、つまり、Linux相当のものを実装したくなった場合でさえ、それをOSとして実装するメリットは全く無いのである。 さて、で、OSを実装してるときに、「それってわざわざOSとして実装する必要あんの?」と聞かれたときに、どう答えるか、という問題である。 「新しいデバイスが欲しくなって」→「Linuxのドライバ書けば?」 「今のOSはメモリやCPUパワーを使いすぎだ!」→「新しいマシン買えば?Linuxで環境選べば?」 「ファイルシステムを革新したくて…」→「FUSE使えば?Smalltalk的解決で問題あるの?」 「黙れ!批判しかしないこの老害が!」→「何言ってんだゆとり世代が!」 そんなときのために、OSを自作するときは、常に常にリアルタイム性を意識し続けるのである。リアルタイム性というのは、一番下のレイヤから一番てっぺんのレイヤまで一貫して設計されないと実現されない性質である。もし、中間にひとつでもリアルタイム性を維持できないレイヤがあればそれで破綻してしまう。既存のOSの上で動くシステムでは決して実現できない性質である。 OSを作るときは常にリアルタイム性を意識しよう。「そのOSの長所は?」と聞かれたときは常に「リアルタイム処理を実現できます」と答えよう。これでありとあらゆる「既存のOSと何が違うの?」という質問に正々堂々胸を張って答えられるのである。 また、リアルタイム性を維持する方法を考えるのは、それなりにおもしろい話題であると思う。リアルタイム性が要求された瞬間に、既存の「1割の状況を切り捨てることによって9割の場合で大体うまくいく」ヌルい技術、よーするに、スワップ、GC、プリエンプションありのスケジューラ、などは全て滅びることになる。(そんなOSを一体誰が望んでいるというのか!) バランスよくトレードオフを選択するなんていうことは許されない!状況を的確に分析し、必要な物、必要で無い物を選択し、常に最適な方法を選び続けなければならないのだ! * リアルタイム性を維持するには OK。さて、どうすれば一番低レベルなレイヤからてっぺんまで一貫してリアルタイム性を維持できるだろうか。 もちろんここで、「ドライバの仕様を一切決めないことによってリアルタイム性を維持する」というITRON的回答(よーするに全部お前らでなんとかしろということだ!)もあるが、まあ、それはおいといて、デスクトップOSのように、それなりに色んなデバイスも扱えることを前提としてリアルタイム性をどうやって維持するかについて考えよう。 もちろんここでそれを考えるのは僕の仕事ではなくここを読んでいるみんなの仕事だ! (なお、以下では「リアルタイム実行が不可能であることを検出できる」「時間内に処理できなかった場合を時間内に検出できる」あたりが実現できてればリアルタイム性が維持できているものとしている。そういうのはリアルタイム性を維持できたとはいわない) 1. 基本 スワップもプリエンプションも無い世界というのも辛いので、そういうのを許す「非リアルタイムタスク」と、途中でプリエンプションしないが、制約の多い(デバイス、ファイルへアクセスできない、アクセスできるメモリ領域が小さいなど)「リアルタイムタスク」とに分ける。「非リアルタイムタスク」は既存OSのタスクと同じでよい。 2. リアルタイムタスク リアルタイムタスクを作るときは、「開始から終了までの時間の予想最悪値」「いつまでに終わらせるべきか」「例外処理ハンドラ」「例外処理ハンドラの処理時間最悪値」「例外が発生してから終了までに許される時間」をパラメータとして渡す。 |
 err_t create_rt_task( program_t program, 
|                             time_t process_time, 
|                             time_t must_finish_before, 
|                             excpt_handler_t exp, 
|                             time_t exept_proc_time, 
|                             time_t except_finish_must_before ) 
OSの状態的にどう見てもmust_finish_beforeまでに終わりそうにない場合はエラー返す。渡したタスクが予想時間内に終わらなかった場合このタスクを作ったタスクに例外が投げられる。 3. 割り込み マルチコアシステムだった場合は割り込み処理するのとリアルタイムタスクを処理するCPUを分ける。コア一個だった場合はどうしようか。 register_irq_handlerに、「割り込み処理に必要な時間最悪値」「割り込みが発生する間隔の最低値」「例外処理ハンドラ」「例外処理の時間最悪値」「ハンドラが登録されるまでに許される時間」を渡す。 |
 register_irq_handler( handler_t hdl, 
|                             time_t proc_time,
|                             time_t interval,
|                             excpt_handler_t exp,
|                             time_t exept_proc_time,
|                             time_t except_finish_must_before,
|                             time_t must_register_before ) 
これに従って、「何ms処理すると何回割り込みが入って割り込み処理時間が最悪どのくらい」というのが取得できるAPIをつくる。 |
 time_t calc_irq_handler_time( time_t process_time );
「割り込み優先度」はタスクキューの状態と割り込みハンドラの登録状態をみてOSが動的に割り当てる。 こうすることで、他の行儀悪いタスクのせいでシステム全体のリアルタイム性が損なわれる、ということは無くなるはず。リアルタイム性もメモリ等と同様のシステムの資源のひとつとして、OSの管理下に置ける、というわけだ。 (もちろんそんなことはない。例えば、SMTなアーキテクチャで片スレッドがキャッシュを洗い続けたらどうなるか。) 別になんていうことはない、基本は、常に「自分がどのくらい処理時間がかかるか、どのぐらいまでに処理を終えたいか」を伝え続ける、というだけである。もちろん、そんな面倒なシステムは誰も使わないのだが。 というのは全体的に嘘で、リアルタイム性というのは、そんなに簡単に維持できるものでもなく、ハードウェアも含めたシステム全体で考えないとどうにもならないのである。例えば、本当にリアルタイム性が必要な場面ではHDDアクセスやネットワーク等I/Oも含めてリアルタイム性を実現しないといけないだろう(全然知らんが)。そうなってくると、…えーと、どうなるの? ================================================================================ * 2007-10-22 今週の目標:一日一行でもいいので書く。 うーん なんかすごいかっこいいな… しか(最近ネガティブ文書きすぎなので自粛)。 ================================================================================ * 2007-10-21 みなさんげんきですかわたしは元気です。 なんかもうあかんな… * デスマ やってきた。4回くらいやって多分ラスボスらへん。最初見たときは「これダメなんじゃないか」と思ったけど、そうでもないな。稼ぎかた理解してジャラジャラできるようになれば良いかも。 |
    |
  • CAVEってZ座標違いでショット当てられない敵はやらないポリシーで素晴らしいと思ってたのだけどなんか若干見かけるな…うーん。
  • |
  • なんか文字でセリフが…それはやらないポリシーだと思ってたのだけどそうでもないのかな…。わかりやすくていいんだけど、やっぱなんかこれやると同人シューっぽくなる気が…
  • |
  • 生物の絵が大分有機的な動きしてる気がする
  • |
  • 最初に助けられた人がスカートの中見てる気が…
  • |
それなりに近くにゲーセンがあるのがわかった。自転車で15分くらい。虫無印、ふたり、雷電4、デスマといったのがあって僕としては非常に良い。 ================================================================================ * 2007-10-14 最近無駄な休日を過ごしたことについてしか書いてないのはいかがなものか。 /sys/block てなんで /sys/class/block にならないの…と思ったけど、あー、キャラクタデバイスとブロックデバイスで分けてんのかな。そうだとすれば納得いく。 とりあえずNetBSDを入れてみたんだが…何をするのんだったっけ。 |
    |
  • システムコール一覧をとりあえず
  • |
  • BSDカーネルは読みやすいとかいうけどほんまかい(Linuxは大分読み易いと思うのだけどなー)
  • |
  • kqueue,kevent 系
  • |
  • スレッドらへん
  • |
  • sysfsみたいな系がどうなってるか
  • |
あたりか…いつやるんだ。 ================================================================================ * 2007-10-09 ここ数週間くらいですごく毛が薄くなったような気がするのだけど気のせいだろうか。 3個くらい思い当たる原因があるので、なんとかする。 本当に減ってるかどうかわからんのが際どいな。プロファイラ的なものが必要。 TODO : ヘアプロファイラを書く。 書けるもんじゃない。 三連休の楽しみが三日伸ばしたヒゲを剃るとかなので終わってるというかなんでそんなに毛の話題ばっかり。 ================================================================================ * 2007-10-07 * http://labs.cybozu.co.jp/blog/mitsunari/2007/10/x86_1.html こんな感じかな… 3-1,9,10あたりが挫折。 2は寝たら思い付いたがこれでええんか?3-2は少し調べた。4はどっかで読んだ。5,6,は少し調べた。7は自信無し。8はだいぶ調べた。9は一晩考えてわからんかった。10は見てもない。 ================================================================================ * 2007-10-03 久しぶりに満員電車乗った。(←twitterに書けとかいわれそうな文章だな) * フリップフラップ見た ================================================================================ * 2007-10-01 霜ネタに対するリミッターが弱くなってるよなー、と、最近よく思うのだけど、これが年をとるということかもしれない。 だからどうした。(今日は先に書いておく)一定周期で情報の勉強をちゃんとしたいなー、と思うのだけど、思うだけ。 Tyconって見るたびにタイ子さんが連想されるのだが。 ================================================================================ * 2007-09-30 今月は俺史上最も何もしなかった一ヶ月だったように思う。 焼きそばの麺が一玉余ってたので、適当に買ってきたら、塩焼きそばの粉が付いてて、いや、僕ってどこに目を付けてんだろうな。まあ、ソース塩焼きそばを食べたという話。問題無かった。 ところでいつも思うのだけど、自炊って資源の無駄遣いなんじゃなかろうか。ゴミ的にも、熱エネルギー的にも。値段は安いが。 まあ、一人暮らしだから問題なんだろうな。つまり、(ここからどうでもいい話に発展する) \begin{verbatim} 「嫁さんに望むものはなんですか?」 「ディメンジョンが足りてないぐらいがちょうどいいと思います」 \end{verbatim} * 俺とHugs ようやく9ヶ月前の問題に戻ってきた。僕はこの9ヶ月何をしてたんだろうな。 このコード、9ヶ月前に、「中途半端な状態で置いといたら、次そこから再開できるだろう」とか思って中途半端な状態なんだけど、今の僕にはもう何がなんだかわからない。 Hugsのコード読めばどっかに書いてあると思うのだけど、Hugsのコードが僕には読めなかった。これなんでもかんでもCell型で表現してるように見えるのだけど、ひどいんじゃないか?snd(snd(e))とかなんだかわかんねよ。 あと、Hugsでぐぐると、なんか世界が広がりそうだったので危ない。これとGマシーンが関連したら面白げとか思ったけど、別に関連しなかった。関連しても別に面白くない。 ================================================================================ * 2007-09-27 特に何もない。 * 品川駅からLenovoの広告無くなった追悼 ボルのエンジニア、食べられるPC開発中。 いただきます。 |

 

 

ボルのエンジニア、合体するPC研究中。 合体しなくても変形すれば許される気がする |

 

 

ボルのエンジニア、ハードウェアエラーが起こるPC開発中。 「ええ、はい、それはですね、エラーチェック試験サポート機能でして、ええ、はい。」 |

 

 

ボルのエンジニア、代名詞が多いPC開発中。 「ええ、はい、それはですね、あれがそれなんです、ええ、はい、そう、それです。」 |

 

 

ボルのエンジニア、格闘に使えるPC開発中。 撲殺事件、PCとの関連か?各局でPCが登場するドラマ、ニュースを自粛へ。 ================================================================================ * 2007-09-26 もげー。 Xbox360のVMXレジスタ128個ってどんな命令フォーマットになってんの?っていうのはかねてより(3時間くらい)の疑問だったのだけど、この資料を見てた。(こういうのってどうやって調べてんの?) |
| vandc128
|                                           | これが6bit目
||0 0 0 1 0 1|  VD128  |  VA128  |  VB128  |A|1 0 1 0|a|1|VDh|VBh|
|                         |これがA reg下位5bit        | これが5bit目
| 
なんかやっぱりすごく無理してんだなー。Aレジスタを示すインデックスが三個所にある。これってハードウェア的にはどうなん? 固定長の既存の命令を拡張してレジスタ128本の命令セットが作れるのだったら、ARMとかレジスタ64本持っててもよさそうなもんだが? ================================================================================ * 2007-09-25 住んでるところのアパートらへんに猫がおって、たまに階段上がったところで寝てるんやけど、その猫が大変肝の座ったおかたで何をやっても反応しないという。 が、昨日はなんか、珍しく活動してて、玄関開けたら家に入ってきた。が、それだけ。しばらくしたら帰っていった。(オチなし) * Linuxを知らない俺達 PS3LinuxでLVMな環境で 20070817 のカーネルを入れる方法。最新のLVMはps3diskに対応してるので、最新のLVMを入れる。2.02.28だと動いた。(LVM2)。あと、Device-mapperも最新にしないといけないよう。(Device Mapper) ところでDevice Mapperて何?カーネルとlibdevmapperとlvmツールがどういう連携してるとか全くわかんないよな。 !これできみもliぬっくすますたーだ! |
    |
  • LVMの挙動を説明できる
  • |
  • USBメモリが差されてからKDEのデスクトップにアイコンが表示されるまでの挙動を説明できる
  • |
  • gtk、pango、atkがなんなのか説明できる
  • |
  • initrdがどうなるか説明できる
  • |
  • upstartとnashでも
  • |
  • gitが使える
  • |
  • システムコールの数を間違えない。(300個超えてるよ)
  • |
  • 「リナックス」って発音されるとブチ切れる (僕はリナックス派である)
  • |
すごく遠回しな教えて君。 システムコールって2.6.0の時点で既に274個あるんやね。 *BSDてどうなんかな?ひとつぐらいはOpenBSDかFreeBSDの環境があったらいいと思うのだけど。(と思いはじめてもう5年くらい) * epoll_pwaitを使おう epoll_waitのためのselectにおけるpselectみたいなもん。(説明略) お。vmspliceとかteeとかってなんじゃら?そのうち見る。(多分見ない) ================================================================================ * 2007-09-24 生きてまs。 ほんもののヒキコモリみたいな3日だった。 * バカップル 駅などの公共の場で、まあ、なんだかんだなわけなんだけど、60歳超えてると思われるような夫婦のような人がなんかそんなような感じだった。 * なんか真面目な話でも書こうと思ったのだけど、ネタが出てこない。 UNIX magazineの10月号を読んだ。知ったかぶるにはいいぐらいの内容かなー。Itanium2は一度見てみたいな。一番手軽に変えるItaniumマシンて何? ================================================================================ * 2007-09-09 毎週日曜は敗因を書いていったほうがいいかもな…書かないけど。何の敗因?今日の敗因は朝起きて(一応朝に起きたのに!)ワンダ巨像動画見てたとかだろうか。 * 君もカーネルをヲッチしよう! Linux Kernel Watchが復活したらしいとかの噂を聞いた。 http://www.atmarkit.co.jp/flinux/index/indexfiles/watchindex.html 噂聞いたついでに、「Linux Kernel Watchが休んでる間にあんな感じの内容を書いてればWeb人気ものになれたんじゃね?」みたいな話をしてて、確かにそれはアリだったかなー、とは思う。問題としては僕はLKML読んでないとかだろうか。 でも、LKML読まなくても、LWNだけ流し読みして劣化日本語でそれっぽいこと書いておけば大丈夫だったかも。 日本語の資料はいつでも不足してるからというか、これぞまさに言語の壁を突いたニッポン的ソフトエワビジネッス! * さんまの季節です!さんまの季節は食べ物考えなくてよいから楽だなー。 僕はそもそも「同じ物ばっかり食べてると飽きる」という仕組みが実装されてないので、大体なんでもよいのだけど、さんまだったら毎日どころか朝昼晩と食べても良いぐらいで、いや、さすがにそれはないと思った。 ================================================================================ * 2007-09-08 明日からは頑張ろうと思うたびに本当に頑張ってたら今頃僕は * 増田的 先日の内容は、なんか増田みたいなキモい内容だな。 (そうか?そうでもない気が。) 何故増田はあれほど独特のキモい文化を持っているのだろうか?匿名な何かシステムを作ったところで、キモい文章を書く文化が生まれるだろうか?増田にあって他に無いものは? * 増田によるCプログラミング入門 俺がはじめて #include を書いたのは、エディタを立ちあげてすぐだったころのように記憶している。 あのときは #include の意味なんてわからなかった。 次にあらわれた文字は、main という文字だった。そして、hello world。この人達は誰に向かって挨拶しているのだろうか。そしてputsが何なのかもわからない。 これを入力し終えたら、コンパイルというものが必要らしい。コンパイルが何かわからなかったので、俺はそこでペンを置いた。 * まあ 微妙。二度とやらない。 今日のTODO: 本返す、本返す用意、本売る、髪切る、3分のネタを考える。 ================================================================================ * 2007-09-05 やる気落としすぎ。 * ささやかでも貧しくてもいい、どうかせめて等身大の幸せを 誰ぞの結婚式の二次会に参加。午後の四時に家を出るのに電車が分単位でヤバいとかはなんとかしたほうがいい。 とかはまあいいとして…結婚というと、いつごろだか知らんけど、id:nonomachon2nd の人が結婚してた。 我々(何故複数形?)は、人並の幸せを放棄することによって、それなりに自由かつフリーダムな生活を謳歌している。例えば、夜の一時に思い付きで家を飛びでてエロ漫画買いに行ったり。そしたら、警察に呼び止められて(3回も)、自転車の防犯登録が長野県になってる理由を問い詰められたり…確かに、あんな時間に自転車でうろついてるのは不審者ですが…(この物語はフィクションです)。 まあ、それはいいとして、生活の色々なものがLazy Evaluation的になっているのが許されているのは、非コミュの特権であると言ってもいいだろう。(非コミュだから孤独な時間を幸せに感じてしまうのか、孤独な時間を幸せに感じられるから非コミュになっていくのか、それとも、「非コミュ」ってどう意味なのか…鶏と卵はどちらが非コミュだろうか…卵と玉子の違いは…?) なんの話だ。まあ、結論を言うと、僕も色々なしがらみを捨てて全国旅行に出たらなんかそれなりにアレだったりするのかなー。まあ、nonomachon氏のweb上のキャラが演出上ああなっていただけで、実際はもともとまっとうな人間だったという可能性は否定できないが。 いや、別に人並の幸せが欲しいとかではないのだけど…今の生活を捨ててまで欲しいものなんてないし。ただ、20歳を過ぎたあとでも価値観は変えられるのかなー、とかいうようなことを思った。 あと、妻子いなくても40ぐらいまでは平気そうだけど、50歳越えるとなんか色々無理そうだな…せめてもの救いは、男は30過ぎて結婚してなくても世間体が悪くならないことか。 なんの話だ。まあ、妻子いなくても、お金持ちになってメイドさんがたくさんいる豪邸にでも住めばいいか。問題は僕にメイド属性が無いことだが。そもそもそれ以前に今の日本にメイドはいるのか?家事手伝いとかがそうなのだろうか。そうだ、むしろ僕が家事手伝いになればよいのではないだろうか。将来の夢は家事手伝いです。 ぼくは、おおきくなったら、にーとか、かじてつだいか、じたくけいびいんになりたいです。ささやかとかまずしいのはいやです。 * 家事手伝いでぐぐったらでてきた http://www.008008.jp/life/housework/index.html あとぐぐるというと、もしかして機能は謎だなー http://www.google.co.jp/search?q=axtu- ================================================================================ * 2007-08-26 最近なんか一週間何もしなかった反省に日曜にちょろっと一時間くらいコード書くというのが多いような。 * みんなプログラムの名前決めるときどうやってる? 最近なんかプログラムの名前決めるのに二時間、コード書くの一時間、終了。みたいなのが多いな。nulluiとかもコード書いたよりも名前考えてた時間のほうが長いし。(そんなことはないです) みんなどうやって名前決めてるのだろうか? とりあえず僕の決めかたとしては、大体、以下の条件を満たすものをひたすら考える。という方法。 |
    |
  • 既存の名詞にない
  • |
  • ぐぐってあまり無いもの
  • |
  • 洒落っぽいの
  • |
と、思ったけど、あまりちゃんと準拠してるやつが無いな…あまり方針は無いということで。 ================================================================================ * 2007-08-23 UIのレイアウトって連立一次方程式にならんかと思ったけど、不等式があるのだよな。連立不等式って何が解として出てくるのかすらワカラン。中学生からやりなおせ! nullui 続きをやった。と、言っても、わかりにくくしただけ。 いや、なんか、並列化できそうなデータにしてたら、わかりにくくなってしまって… 並列化に向いたデータ構造の第一歩は、読むところと書くところを分ける、というところだろうか。多分。このへんについてはおいおい。 別にレイアウトのアルゴリズムを考えたかったわけでもないし、並列化がやりたかったわけでもないのだけど…何やってるのだろうか。LLで生産性が上がる理由のひとつに、以下略。 * まず最初は、一番効率のよい方法で実装し、徐々に使いやすいインターフェースにしていく 効率を悪くするのはあとでもできるけど、インターフェースをわかりにくくするのは最初しかできない。(この考えかたのデメリットを3秒以内に5つあげなさい) * 最近Cのマクロ使いすぎ emacs22になってCC Modeが良くなった。Haskellのモナドがわかってきた。などが理由に挙げられる。 ================================================================================ * 2007-08-22 というわけで計測しなおし。 pthread_cond 5500 〜 6000 share 500〜800 ぐらい。妥当なところか。ちなみに、 2KBのmemcpyが 400〜500 free(mallo(4))を2回で 500〜800 ふむ。 ================================================================================ * 2007-08-21 こういうのを書いてた。 説明はもうちょっと色々できてから書こうと思ってるのだけど、とりあえず、「GTKとかQTみたいなレイアウトがしたいけど、ウィジェットの実装とかはいらない」、というときのためのレイアウトエンジン。(まだちょっとしかないけど) UIとレイアウトエンジンは分離できるのではないかなー、という試み。インターフェースわかりにくいけど、とりあえずこんな感じでいけるのではないかな。 * レイアウトアルゴリズムについて考えない レイアウトのアルゴリズムって、なんか、「だんだんそれっぽくなるように近づけていく」ようなループになってしまうのだけど(上のソースだと、199行目から)、なんか、もっと一発でビシーっと決まるようなアルゴリズムって無いかな? まあ別によいのだけど…UIのオブジェクト数なんて、多くて数十個だから、問題にはならないのだと思う。 とりあえず、アルゴリズムはそれでいいとして、謎なのは、折り返しが許されてるような…横幅を小さくすると、縦幅が大きくなって…とかの場合。 テキスト入力なら、スクロールバー付けるとかでごまかせるけど…あー、横幅を柔軟に変えられるようにして、それで縦幅が決まるようにすればいいか…それだと、今のサイズ要求だと無理だな…サイズ要求する場合は、常に最大横幅を云々。まあ、おいおい考える。(多分そこまではやらない) * あと最近、「シンボルテーブル」「可変長配列」「メモリプール」があれば嬉しい、というのがわかってきた(npr/* がそれ)。今回はシンボルテーブル使ってないけど。 libnpr は Not Portable Runtime Library です。僕の気分によってインターフェースが変わるのであまりポータブルではないライブラリです。 あー、あと、nulluiは「ぬるい」とでも読んでください。UIが無くてぬるいライブラリ、とか、そういう名前です。コードは好きなようにしてもらって構わないです。 * どのぐらい思い処理だと並列化して意味あるかな たとえば上のレイアウトアルゴリズムだと、結構綺麗に割れるのだけど、あんまり重くない。こういうのをぱぱーっと並列化したら、効果出るのかね? \begin{verbatim} #include <pthread.h> #include <stdio.h> #include <string.h> #define N (4096*10) pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t start = PTHREAD_COND_INITIALIZER; pthread_cond_t t1_wait = PTHREAD_COND_INITIALIZER; pthread_cond_t t2_wait = PTHREAD_COND_INITIALIZER; pthread_barrier_t barrier; int share; int fini = 0; int share2; #define get(v) asm __volatile__("rdtsc": "=a"(v)::"edx") void *t1( void *p ) { int i; int b,a; pthread_barrier_wait( &barrier ); get(b); for ( i=0; i<N; i++ ) { pthread_mutex_lock( &lock ); pthread_cond_wait( &t2_wait, &lock ); pthread_mutex_unlock( &lock ); } get(a); fini = 1; printf("%d\n", (a-b)/1024 ); return NULL; } void *t2( void *p ) { pthread_barrier_wait( &barrier ); while ( 1 ) { pthread_cond_signal( &t2_wait ); asm("":::"memory"); if ( fini ) break; } return NULL; } void *u1( void *p ) { int i; int b,a; pthread_barrier_wait( &barrier ); share2 = 1; get(b); for ( i=0; i<N; i++ ) { share = 0; while ( !share ) { asm("lfence":::"memory"); } } get(a); printf("%d\n", (a-b)/1024 ); return NULL; } void *u2( void *p ) { pthread_barrier_wait( &barrier ); while ( 1 ) { share = 1; asm __volatile__ ("sfence":::"memory"); } return NULL; } #define STRING_(A) #A #define STRING(A) STRING_(A) int main() { pthread_t t[2]; void *ret; int a, b; #define COPY (4096*4) char *buf0 = malloc(COPY); char *buf1 = malloc(COPY); memset( buf0, 0, COPY ); memset( buf1, 0, COPY ); get(b); memcpy( buf1, buf0, COPY ); get(a); printf("memcpy[" STRING(COPY) "] %d\n",a-b); pthread_barrier_init( &barrier, NULL, 3 ); pthread_create( &t[0], NULL, t1, NULL ); pthread_create( &t[1], NULL, t2, NULL ); pthread_barrier_wait( &barrier ); pthread_join( t[0], &ret ); pthread_join( t[1], &ret ); pthread_create( &t[0], NULL, u1, NULL ); pthread_create( &t[1], NULL, u2, NULL ); pthread_barrier_wait( &barrier ); pthread_join( t[0], &ret ); } \end{verbatim} 手元の環境(Core2 E6600)だと大体 pthread_cond → 230000 〜 280000 share → 20000 〜 30000 うーん。16KBのmemcpyが 25000 ぐらいなので…32KBコピーする処理より短い処理だと並列化の意味が無いってところか…キャッシュとかあるのでよくわからんが。 追記(8/22):上の計測間違ってます。(/1024がおかしい) ================================================================================ * 2007-08-19 寝すぎ。最近休みの日は半分くらい寝てる気が。 ================================================================================ * 2007-08-17 * C言語の volatile は共有変数に使っても全く何の役にも立たない。 これ知らなんだ…↓カーネルの/Documentationaに入ってた。 http://kernel.org/doc/Documentation/volatile-considered-harmful.txt C言語のvolatileはスレッド、プロセスの同期とかの目的には全く全然ちっとも使えない、ただ単に最適化が無くなって遅くなるだけ、という話。確かに言われたらその通りなんだけど…この情報はもっと広まるべきだよな。 とりあえずvolatileでぐぐると kosakiさん5位なのでもっと頑張って! http://mkosaki.blog46.fc2.com/blog-entry-91.html -- ↑と、あとでちょっと調べてみたところ、そういう情報はゴロゴロ見つかるし、あと、多分どっかで見たり聞いたりしてるはずなのに知らないって大変アレだな。人の話を聞いてない。 ひょっとして常識では…?これは恥ずい。 -- 常識を知らないから恥ずかしい、という考えが日本人的だよな… もっと、自分はそうなんだから仕方ないじゃないか、というような考えかたを持つようにしないと…(というような脅迫観念にとらわれてるあたりが日本人的) ================================================================================ * 2007-08-14 Linuxイベント事情は、色々と案はあるけど、まだ具体的には決まっていない、という状況のよう。 あとで(いつ?)keventとか見る。(keventは終わってしまったらしいが) あとなんか。これ系→http://people.redhat.com/drepper/newni.pdf(ネットワークの話だけどイベントシステムについても書いてある。id:moriyoshiさんによる日本語概要) というのは、これを読んでて、こういうのを書きたくなったので、書いてたのだけど…上のを読んでたら朝が近付いてきたのと、あと、まあ、Linuxのイベント事情はまだ混沌としてる、というのがわかったので、どうでもよくなった。またそのうちカーネルが2.8とかになったら書く(多分書かない)。いや、でもLinuxてこのまま2.6のまま続きそうだよな… あと、書いてみたものの、どうにも使えなかったコードをもったいないので↓に置いておく。pthread_createを使わないスレッドの作成。スレッドの終了をfutexで見る、というようになってるところが、ふーん、ていうような感じ。どうでもよい。このコードを書くときに、syscall関数は使ってはいけない、ということにしばらく気付かなかったのは秘密だ(秘密じゃない) \begin{verbatim} #define _BSD_SOURCE #include <unistd.h> #include <sys/syscall.h> #include <sys/types.h> #include <sched.h> #include <stddef.h> #include <sys/syscall.h> #include <linux/futex.h> #include <stdio.h> int f(void *p) { puts("e-"); } #define STACK_SIZE 4096 char stack[STACK_SIZE]; #define sys_clone( ret, flags,stk,pid_ptr,tls,cid_ptr ) \ asm __volatile__("int $0x80\n\t" \ "cmpl $0, %%eax\n\t" \ "jne 1f\n\t" \ "2:\n\t" \ "ret \n\t" \ "1:\n\t" \ : "=a"(ret) \ : "a"(SYS_clone), \ "b"(flags), \ "c"(stk), \ "d"(pid_ptr), \ "S"(tls), \ "D"(cid_ptr) \ :"memory") #define sys_exit(code) asm __volatile__ ( "int $0x80" : :"a"(SYS_exit), "b"(code) ) void start() { sleep ( 1 ); sys_exit( 0 ); } int main() { int x; int tid; int parent; int child; //_exit(1 ); *((void**)(stack+STACK_SIZE-4)) = start; child = 0; sys_clone( tid, CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_THREAD|CLONE_SIGHAND|CLONE_CHILD_CLEARTID|CLONE_PARENT_SETTID|CLONE_CHILD_SETTID|CLONE_SYSVSEM, stack+STACK_SIZE-4, &parent, NULL, &child ); if ( tid == 0 ) { sys_exit( 0 ); } sleep( 1 ); printf("%d %d %d\n",tid,parent,child); puts( "wait child"); syscall( SYS_futex, &child, FUTEX_WAIT, NULL, child); puts( "child dead"); } \end{verbatim} それはそうと、ようやくudevのルールを書けるようになりました。あと、最近のLinuxはLVM使っててinitrd無しでは起動できない、というのを今日知りました。まあ、なんとかする。initrd徹底解説とかもあればおもしろいかもしれんなー誰か書いて。いや、おもしろいか?そうでもないかも。Linuxムズカシヨ。 ================================================================================ * 2007-08-13 最近の物忘れのヤバさは自分が何やってたか忘れているにも関わらず作業を続けている点にあるだろう。何を探しているかわからないままに何かを探し続けるその姿はもはや歌になったらかっこいいんじゃないかと思った。 それはそうとFUTEX_FD無くなっちゃうのかー(2007/6に無くなる予定らしいです)。Linuxイベント事情はどうなっていくんかなー。 \begin{verbatim} FUTEX_FD はもともと競合が起きやすいため \end{verbatim} http://www.linux.or.jp/JM/html/LDP_man-pages/man2/futex.2.html むむ。さっぱりわからん… ================================================================================ * 2007-08-08 ものわすれがはげしい。 ここ3年くらいずっとなのだけど、僕は色々と貴重な経験を無駄遣いしてるよな…もっと、こう、ミーハー魂をだね…(ぶろぐを印刷して、それにサインをもらうというのはどうだろうか) * 最近の流行 最近男子校に通ってる人と女子校に通ってる人と会話する機会があった。んで、流行は何かとか聞いたのだけど、大変アレだったのでここにメモしておく。 |
    |
  • ビリーのなんたらかんたらは共通して流行しているよう
  • |
  • 男子校で「ウホッ」が流行ってるのはヤバイ
  • |
  • ルイズ描いてたけどあれは流行りだったのかな…聞いとけばよかった(と、今思った)
  • |
  • PSP派。けど、モンハンの時代は終わってる(ちなみにうちの会社ではモンハンは現役である)
  • |
  • ジョジョは最初から読んでるらしい
  • |
  • 女子校での流行は、「ポケモン(初代)」「エヴァ」「ときメモ(初代)」らしい
  • |
ホントかよ。それ、アンタ、ワタシたちが中学生の頃の話よ。まあ、サンプル数合計3なので有効なデータなのかどうかは知らない。 女子高生と仲良くしたい人達は「ポケモン」「エヴァ」「ときメモ」を話題にするとよいですよ。 さて、(ここでwebはジェネレーションギャップをなくす的な話を書こうと思ったがやっぱりやめる) * 今日の日能研 見かけたのおとといだけど。参考 日能研の問題といえば、たまに本気でわからなくてすこぶる不愉快な気分になることがあるのだけど、今回はわかったのでよい。 しかし、本当にこれ、正解なのだろうか。ここで、○をあげている人の条件は、Aさんと同じ条件のはず。(その人から見た場合、○1、×3になる) つまり、○を挙げている人は、すぐに手をあげることだって可能なはずだ。ではなぜそうしないかというと、ここで、実は「誰かを間違わせると他の人全員に点が入る」と、いうような…いや、それじゃ駄目か。 (まあ、なんかかけひきになるゲームになるんじゃないかと思ったのだけど…) * 流行 まあいいか。やっぱり書いておくと、我々付近の世代はなんか流行的なものをwebに残してしまっているので、我々より下の世代は、一晩あればその知識を会話ができる程度に身につけることができるわけであり、そこでジェネレーショナルなギャップ(世代別GP(だからなんだよ))は無くなってしまう…とみせかけて、我々は、高校生とか中学生とかの流行とか調べるほど熱いものは持っていないので、ギャップでもなく、平等でもなく、もっと一方的なものになってしまう。こっちは向こうのこと知らないが、向こうはこっちのこと知ってる。 これなんかを一晩かけて一通り読めば、相手と対等に渡り合うくらいはできるだろう。 あと、我々より上の世代は、webに記録とか残してないので、我々は上の世代に対して一方的な攻撃というものができない。例えば、「パパはニュースキャスター」(最近なんかその名前を聞いたのでなんとなく…)とか言われても、その感想を書いたぷろぐとかを見つけることはできない。なので、我々より上の世代とは平等にギャップが存在する。これを読んでもとても勝てる気はしない。 だから…だからといって特に考察等はない。 * 過去に行けるとしたら、どういう知識を持っていけば一番世界にインパクトを与えられるだろうか プログラミングの知識を持って江戸時代に行ったところで、世界に何ひとつインパクトを与えることができないとかいうような。パラドックスとかは気にしないとして。物体は持っていってはいけない。過去の世界にいきなり全裸の自分がいると考えてほしい。 |
  • 石器時代に行く → 体力が無さすぎて死ぬ。
  • |
  • 弥生時代に行く → 体力が無さすぎて死ぬ。
言葉が伝わらないのでどうしようもない。 |
  • 戦国時代に行く → とりあえず面白そうなので明智光秀を殺そうとするも体力が無さすぎて遂行不可能
  • |
  • 江戸時代に行く → 普通に村人として生活できそうだね。でも農民とかで飢饉とかで体力無くて死ぬ
やっぱり体力が一番大事ですね…もう無理だと思っても5回ぐらいは気合いでなんとかなる少年漫画的な体力が必要です(しつこい) |
  • 昭和に行く → 戦争に招集されて体力が無くて死ぬ
  • |
  • 現代に行く → 全裸なので逮捕
================================================================================ * 2007-08-05 あついですわ。 * 昨日まとめ |
    |
  • サイボウズ・ラボは何を研究しているのか?
  • |
  • 色々と読み方があやしい
  • |
  • アレ
  • |
  • あれ
  • |
  • mallocなんとかす
  • |
  • view
  • |
「アレ」とか書くと絶対あとで忘れるので注意(あたりまえ) あついですわ。 ================================================================================ * 2007-08-04 3日くらい大阪へ行ってた。 それでは今日はどこかへ行きます。(場所知らない。これから調べる) 当日券買えるらしいのでチケットねーよという人も大丈夫らしいですよ↓ http://karetta.jp/article/blog/ll-spirit/084165 * クマゼミ/ミンミンゼミ境界はどこらへんにあるのだろうか 関東にはクマゼミがいらっしゃらないようで。 大阪にいたころはミンミンゼミってほとんど見なかったんだけどなー(なので、テレビやら漫画やらでセミの鳴き声の代表が「ミーンミーン」なのが不思議だった) http://motchie.blog29.fc2.com/blog-entry-212.html ふむ…箱根か…(箱根がどこなのかあんまり知らない) ================================================================================ * 2007-07-30 * NANNDAKA ぅえ?もうちょっと頑張ろう。 * 俺と先週 先週は、なんか生活リズムを生み出すために、早く寝て、朝早く起きて作業しようというのをやっていたのだった。結果は6戦6敗だった。おかげでおうちではPCも触らない早く眠るという健康的な生活を享受できることに。毎日8〜10時間くらい寝てた。自分はもう十分な時間寝たと思ったところからさらに5回くらいは眠れる気がする(←ウザい) * あなたは 「頑張ろう」ばっかり書いてあるweb日記についてどう思うか? いつも気になるんだけど、ああいうのを見て買う人っておるのんかな… ================================================================================ * 2007-07-22 先週のアレ。一応ソースだけ置いときます。注意:説明などは一切ありません。どうしても詳しく知りたい人はメールで… -- prettyprinterおよび似たようなものに関する比較的どうでもよい考察。木構造のようなものを文字列にダンプするときに、reallocするのが嫌だという人も世の中にはおられることと思う。それをなんとかできないだろうかとかいうような。話。 \begin{verbatim} #include <stdio.h> #include <stdlib.h> struct tree { struct tree * l; struct tree * r; char c; }; struct string { char *buf; int len; int buflen; }; void dump_tree( struct string *s, struct tree *t ) { if ( t->l ) dump_tree( s, t->l ); if ( s->buflen == s->len-1 ) { s->buflen *= 2; s->buf = realloc( s->buf, s->buflen ); } s->buf[s->len] = t->c; s->len++; if ( t->r ) dump_tree( s, t->r ); } struct tree * make_tree( struct tree *l, struct tree *r, char c) { struct tree *n = malloc( sizeof(struct tree) ); n->l = l; n->r = r; n->c = c; return n; } int main() { struct string str; struct tree *t = make_tree( NULL, NULL, 'h' ); struct tree *t2 = make_tree( NULL, NULL, 'l' ); t = make_tree( t, t2, 'e' ); str.len = 0; str.buflen = 17; str.buf = malloc( 17 ); dump_tree( &str, t ); str.buf[str.len] = '\0'; puts( str.buf ); return 0; } \end{verbatim} こういうrealloc。(最近こういうこと考える度に、「最近のマシンでは誤差なので放置したほうがいい」っていう考えになるので嫌だな…) これは、realloc無しの形にできるのではないか、というのが、ここ3ヶ月くらいの僕の研究の中心だった。(最近あんまり更新してなかったのはそのせい。嘘です)あと、なんとかしてFirefoxのクリップボードとXのクリップボードが同期できないか、というのが、これから10年ぐらいの課題であることはいうまでもない。 …じゃなくて、 なんと、これを継続渡しモドキ(多分)にして、再帰的なアレにすることによって、realllocが消せるのである。 \begin{verbatim} #include <stdio.h> #include <stdlib.h> struct tree { struct tree * l; struct tree * r; char c; }; struct cont_node { struct tree *node; struct cont_node *chain; }; struct str_node { struct str_node *chain; char c; int len; }; char * dump_tree2( struct tree *t, struct cont_node *cont_chain, struct str_node *str_chain ); char * dump_tree2_pass2( struct tree *t, struct cont_node *cont_chain, struct str_node *str_chain ) { struct str_node s; s.chain=str_chain; s.c = t->c; s.len = str_chain->len+1; if ( t->r ) { return dump_tree2( t->r, cont_chain, &s ); } else { if ( cont_chain ) return dump_tree2_pass2( cont_chain->node, cont_chain->chain, &s ); else { char *buf = malloc( s.len ); str_chain = &s; buf[ s.len] = '\0'; while ( str_chain->len ) { buf[ str_chain->len-1 ] = str_chain->c; str_chain = str_chain->chain; } return buf; } } } char * dump_tree2( struct tree *t, struct cont_node *cont_chain, struct str_node *str_chain ) { if ( t->l ) { struct cont_node cont; cont.node = t; cont.chain = cont_chain; return dump_tree2( t->l, &cont, str_chain ); } else { return dump_tree2_pass2( t, cont_chain, str_chain ); } } struct tree * make_tree( struct tree *l, struct tree *r, char c) { struct tree *n = malloc( sizeof(struct tree) ); n->l = l; n->r = r; n->c = c; return n; } int main() { struct str_node strchain; struct tree *t = make_tree( NULL, NULL, 'h' ); struct tree *t2 = make_tree( NULL, NULL, 'l' ); t = make_tree( t, t2, 'e' ); strchain.len = 0; puts(dump_tree2( t, NULL, &strchain )); return 0; } \end{verbatim} おかげさまでただのツリーをダンプするコードもこんなに大きくなりました! まず、CPS変換をがんばって、dump_treeの中で最後の部分以外returnしないようにする。そうすると、そこまで辿ってきたノードを全てスタック上の変数に乗せることができるので、そこらへんをなんだかんだしてアレがソレ。 -- こうやってちゃんとした説明の部分をゴマカした文章ばっかり書いてるから仕事でも駄目な文章しか書けないのだよな… よし、ちゃんと説明を書こう↓ (妖精さんが書いてくれます) -- と思ったけど、これって最初にサイズ調べておくのとどう違うの? -- まあ。なんとか。 ================================================================================ * 2007-07-18 ^へヘ∧人入λ。 ================================================================================ * 2007-07-15 さてなんか作るか…ってもう20時だった。 -- 妖夢見ててふと思ったのだけど、萌え霊能者というのはありかもしれないな。「あなたの背後にいるのは…〜…です。あなたの知らないあいだにドジっ娘イベントを発生させているようですね。」とかそういう感じで。 |
|

「あなたの背後にいるのは…メイドさんの格好をした…」

|

「貴様、メイドさんって言っておけば何でも萌えになると思ったら大間違いだぞ。」

|

「ひいっ。すいません…間違いました。あなたの後ろにいるのは、普段はツ…」

|

「貴様、ツンデレって言っておけば何でも萌えになると思ったら大間違いだぞ。」

|

「あひぃ。」

|
-- 問題です。"sh"でぐぐったときに一番上に出てくるものはなんでしょう |
    |
  1. UNIX系OSで使われるスクリプト言語
  2. |
  3. ルネサス製 32bit CPU
  4. |
  5. C++でGPUプログラムが書けるライブラリ
  6. |
  7. 学園ものギャルゲ
  8. |
正解 -- SHというといつも思うのだけど、名前に「super」とか付けるときは少し考えたほうがよくて、SHは「Super H」という名前なのだけど、何がどうスーパーなのかわからない。 例えば、USBの転送速度の規格には、「High Speed」と「Full Speed」があるのだけど、どっちが速いのかわからない。 -- さて、なんか作るか…ってもう21時になろうとしているのだった。 ================================================================================ * 2007-07-14 古典電脳物語半分くらい読んだ。今までつまらなさそうだったので特に気にしてなかったんだけど、おもしろい。 「CPUの創りかた」がCPUの話だとしたら、「マザーボードの創りかた」みたいな感じだろうか。あとプラス昔話。真面目な文章のようでくだらない話が書いてあったりして素敵。 けど、実際に作ってみようとは思わないのだよな…ここらへんに僕が似非ハッカー止まりな理由があると思うので、もう少し深く追求する必要がありそうだ。いや。ない。(反語(ではない)) Tiny BASICのソースでも読むか…(多分) -- おげー昼やん。さっき時計見たときは9時ぐらいだったはずだが? -- Linuxは2.6になって以降知らないうちに色々機能が付いてるよなー。uinputというドライバがあって、ユーザ空間でinputドライバが書けるぽい。なんか無いかなー、と、思ったものの、ただのinputではどうしようもないな…umouseとかがあれば。 と思ってぐぐるとなんかこんなのがあった。Linux関係無いけど。あとでなんとかする。 ================================================================================ * 2007-07-13 lifehack的な何か。 というわけで、一日一時間くらい時間ができて、新しいマシンもあるし、何をやってるかというと、二日くらい永夜抄をやってた。 現代日本というのは、アレやらコレやらを封印しても、まだ時間潰しのネタがあるので困る。そういえば24のシーズン2とかも見た。大変よかった。 まあいいや。 永夜抄(ここでWikipedia20分。現代日本というのは略)はなんか前やったときはスペルプラクティスの存在が許せなくてあまり好きではなかったのだけど、今やってみたらそうでもなかった。あとなまりすぎ。 ================================================================================ * 2007-07-10 マシンが新しくなった。はやい。(が、まだ環境の移行ができてないのでこれを書いてるのはPS3) -- 2.6.22の変更を見てたら見つけた。 これってあの問題を解決するやつじゃね? POSIXのシグナルには終わってる点がひとつあった。 シグナルの影響で予期せぬところで非同期な処理が入ると、色々と困る場合はシグナルをブロックするのだけど、そうすると、readが中断できない、とかそういう問題。 ので、これまでは、そこらへんをなんとかするために、sigsafeのような不思議なライブラリを使うとか、readする前になんかパイプとあわせてselectしておいて通知するときはパイプに1byte書くとか自分で仕組みを作る必要があった。(はず。自分ではそういうの書いたことないのでよくわからない。) しかし、そこでこのsignalfdを使えばなんと!…どうなるのだろうか。調べてないのでわからないのだった。いや、多分、signalが届いたときになんかデータ(signalfd_siginfo?)が読めるようになるのだと思うけど…そのうち試す。 -- Linux Kernel Watchてあれが最終回だったんかな… -- JavaScriptが見れなくて困ってるという人は↓に「正」の文字を書いてください。 あと、コメントのCGIとかがPerlで書いてあるのでHaskellで日記システムを作ったというのは間違いじゃないかとの指摘があったけど、あの一文を書いた時点では全部Haskellで書いてあったので大丈夫です。 ================================================================================ * 2007-07-04 Haskell強化月間はこれを読むべきだったなー。これの下にある図とか知ってれば何かの役に立つだろうし。 昨日気付いたのだった。遅い。ソースコードのHACKINGとか前一瞬開いた覚えがあるんだが。何で気付かなかったんだ。目が節穴。 あー。ビデオ見れねー。(そもそも英語聞き取るのが無理という問題があるが) なんかHaskellの人というと、文書なんか残さない、残しても不思議な文書しか残さない。というイメージがあったのだけど、結構僕でも読める文書だなー。ほんとのハッカーの世界は文書も書ける人がうようよしてるのだろうね。 -- あと、Webで見てる限りHaskellの人が最近Arrowばっかり言ってるようなイメージがあるので、Haskell強化月間はArrowを勉強するべきだった。 -- 過去を振り返る男 ================================================================================ * 2007-07-03 最近やってる仕事が結構クロック削ったりパイプラインなんかしたりするような結構憧れてた仕事なんだけど、なんか、いやーこれで身につく技術って全然応用利かない技術だな…いや、非常に楽しいし、一生これで食べていけるなら一生やってもいいくらいなのだけど… ちまちまクロック削る仕事ってあと何年くらい生き残るのかな… -- そういえば僕の中でHaskell強化月間が終わってた。僕はこの一ヶ月で何を成し遂げることができただろうか何も成し遂げてない。 -- 一年の日数は奇数なので一年の半分は今日(3日)か昨日(2日)の昼の12:00なんじゃないかと思った。 ================================================================================ * 2007-07-01 気が付けば一年も半分終わりですがさて問題です!正しい一年の半分はどこにあるでしょう!(今年の場合) |
    |
  1. 6/30と7/1の間
  2. |
  3. 7/1と7/2の間
  4. |
  5. 7/2と7/3の間
  6. |
いや、僕も答知らんが。でも、多分2月が前半にあるからまだ半分過ぎてないよな。多分。 -- 久し振りに家でコード書いてたら、この環境g++がインストールされてネーZE!僕一体何ヶ月家でC++のコード書いてないんだろうね! Fedora 7(もうFC7じゃないよ!)がインストールされてるということは…まあ…一ヶ月くらいか。 ================================================================================ * 2007-06-28 ほいコメントできた。 ニコニコ見ながら、あんな感じでコメント付けられないかなー、と思ったので、なんかやってみたけど、全然違うと思った。(ニコニコ見過ぎ) 行ごとにコメント付けられます的な。 とりあえずこんな感じでいいだろ。今から間違えてアップロードしてしまったファイル達を消す作業に。 -- そういえばShinobiって攻略動画映えするんじゃないかなー、と思って、ニコニコ探してみたけど、ニコニコばっかだと思った。(いや、そんなに見てるわけじゃないけど) いや、そうじゃなくて…あんまり攻略動画無かったという話。タイムアタックとか何も無さすぎて地味だな…いや、なんかボス一瞬で倒してしまって、なにこのクソゲーって感じが。 -- あー、あと、JavaScriptが有効になってないとコメントは見れません。 ================================================================================ * 2007-06-23 ほい過去ログできた。 あとはコメント機能が付けばよいな。 アクセス解析とかはどこかのを借りればよいか。僕も弱ったものである。 -- 別にprintfのようなデカい物を持ち出してこなくても、mallocが変な実装になってるのでそれを見ればよいと思った。(libraries/base/Foreign/Marshal/Alloc.hs) \begin{verbatim} malloc :: Storable a => IO (Ptr a) malloc = doMalloc undefined where doMalloc :: Storable b => b -> IO (Ptr b) doMalloc dummy = mallocBytes (sizeOf dummy) \end{verbatim} Haskellのmallocは引数をとらない。どうやってるかというと、undefinedの型が a(なんと呼べばいい?)になってて、それが推論のときになんだかんだ。 面白いけど、ちょっとトリッキーな気が。もうちょっとスッキリとする方法は無かったのかいなー。 -- どっかのプログラミング言語はシェルスクリプトを超えられるか。 リテラルの話。を、書かない。(最近書かなさすぎ) -- 書きたいコードネタが色々たまってきたのだけど、なんもしてないな…なんかなー。 ================================================================================ * 2007-06-21 酔ってる。 -- 酔ってるついでに、前書くとか言って書いてないのの続き。 と思ったけど酔いすぎて書けにい。 というか、続きで書きたかったことは、ここの人が僕よりも詳しく書いてくださったようで、僕の出番は無いと思った。 -- あと、HaskellのPrintfがおもしろいと思ったのだけど、ここ らへんで書いてあることなんじゃないかなーと思った。(実はよくわかっていない) -- HaskellのPrintfの挙動として、面白いのは、 \begin{verbatim} Prelude> "a" == Text.Printf.printf "a" True Prelude> :type (Text.Printf.printf "a")::IO() (Text.Printf.printf "a")::IO() :: IO () Prelude> :type (Text.Printf.printf "a")::(Int->String) (Text.Printf.printf "a")::(Int->String) :: Int -> String Prelude> (Text.Printf.printf "a%d") 3 a3*** exception: Prelude.undefined -- このエラーはなんだ。 \end{verbatim} 文脈に応じて型が変わるというところだと思う。で、ここらへんが型クラスを駆使して色々やっているの(らしいここの最後のほう)だけど、今読んだらわからんかった。 わかる範囲で説明しておく。(注意:ここで読んだことは人には絶対に言わないこと) まず、printfが返す型は、PrintfTypeのインスタンス。 \begin{verbatim} Prelude> :type Text.Printf.printf Text.Printf.printf :: (Text.Printf.PrintfType r) => String -> r \end{verbatim} ここで、IO()が返った場合、Stringが返った場合、フォーマットに対応するパラメータが引数で渡された場合、を、上でsyd_sydさんが書いてたテクニックを使って、場合分けする。 \begin{verbatim} instance (IsChar c) => PrintfType [c] where spr fmt args = map fromChar (uprintf fmt (reverse args)) instance PrintfType (IO a) where spr fmt args = do putStr (uprintf fmt (reverse args)) return undefined instance (PrintfArg a, PrintfType r) => PrintfType (a -> r) where spr fmt args = \ a -> spr fmt (toUPrintf a : args) \end{verbatim} 上から順番に、Stringを返す場合、IO aを返す場合、フォーマットに対応できるパラメータ(↓このへん) \begin{verbatim} instance PrintfArg Int where toUPrintf i = UInt i instance PrintfArg Integer where toUPrintf i = UInteger i instance PrintfArg Float where toUPrintf f = UFloat f instance PrintfArg Double where toUPrintf d = UDouble d \end{verbatim} なんかそんな。んで、ぐにょぐにょ。(酷い終わりかた) ================================================================================ * 2007-06-19 思い出した。HTMLでリスト作るためにHTML直打ちする必要があったんだった。そのための記法が必要だったのでParsec持ち出したんだ。 最近ゲーム途中すぎ。↓途中のゲームと止めてる理由とひとこと感想 |
    |
    おーでぃんすふぃあ
    |
    20時間くらいやってるのだけど。終わるのか…?グラフィックは素晴らしすぎ。同じステージ繰り返しすぎ。 | 死ぬ理由の大半が中ボスのジャンプ回避できなくて死ぬとか
    |
    アーマードコア4
    |
    まあ良い。ただなんかハングアップして2時間無駄になるとかそんな感じだった。
    |
    雷電4
    |
    結構ツボ。僕はこういうの好きなんだなー。ただ近くにない
    |
    むちむち
    |
    もうちょっと頑張りたい。ただ近くにない
    |
あとマジカルホップやってたらShinobiってどんなゲームじゃったかなー、とか思って、積んでたShinobiを崩し初めた。なんか二段ジャンプの仕様が想定してたのと違う…攻撃当てたあとはもう一回ジャンプできると思ってたのだけど、できないな…こんなんだったけ。 やっぱShinobiは良いなー。ちゃんとアクションゲームって感じ。 マジカルホップをもうちょっとShinobiに近づけたらどうかな…ゲージが長くなってふよふよ浮いてられるのも良いけど、もっと、「倒し続けないと落ちる」感をなんとか。 -- permalinkもどき。まだ過去ログのほうが無いので、linkじゃない。そもそもweb上にpermanentなものを作ることはできるか?仕組みとしてはできてても、炎上して脱走、脱走時に全削除とかやったら終わりなわけで。皆さんは気になるサイトは保存しましょう!(これたしかTERRAZINEの人が言ってたような) Jでは保存用に最適なテキストバージョンも用意しています。(というか今用意した) \begin{verbatim} test \end{verbatim} -- ミラーしてるときはアップロードする前に向こうのを取得しておくこと!(というか、不要なディレクトリを含めないでよい方法を調べる) ================================================================================ * 2007-06-18 関数型言語のアレは2over(記憶が正しければ)。ワナビーすぎ。 - ニコニコ見てたら朝。月曜から何やってるんだ… Parsec使いかた忘れたな…ていうかこれにParsec使うのはオーバースペックもいいところ。 まあいい。動いた。ところでParsecって日本語とかどうなんだろ…というか、Haskellの多バイトって…? アレ…なんか書きたかったからわざわざParsecなんて持ち出してきたんじゃなかったっけ…忘れた。眠い寝る。 - ワナビーってどういう意味かしら。 ================================================================================ * 2007-06-17 うん。はてなは「はてな飽きたけど他のに乗りかえるのもめんどい」感があって、長いことそのままだったのだけど、なんか自作したかったのでこっちに移動。 HTML生成システム作りなおし。Haskellで書いたよ。まだ色々足りないけど(TODO: コメント機能、過去ログ、アップロード、その他)。あと消えてしまった06-01-29と06-02-02を復元する。 外見的には昔のスタイルから色変えただけという気もするが。そんな時はHTMLを見てください。きちんとインデントされてます! いや、もはやスタイルなんていらねーよ!むしろRSSさえ出しておけばみんな満足なんだろ!ああ!web2.0の究極の形が、余計な外観を一切排除したRSSファイルでやりとりするとかなのだとしたら、文明の発達とは一体何だったのだろうか!どうでもいいけど、このスタイルは、黒板風をイメージしてるのだけど…微妙な…何が足りないかなー。(引っかいたときに嫌な音が出るとかだろうか?) そして、このサイトにバナーなどというのがあったことを思い出したのだった(あとでなんとかする→http://morihyphen.hp.infoseek.co.jp/image/banner.png)。かつて昔のwebサイトの自己主張にはねー、バナーというのがあってねー、それぞれの管理人がイタい主張をしてたのだよー。(イタくないのもあっただろうけど)。 今のぶろぐ世代の管理人達はどうやってイタい主張をしてるのかなー。 どうでもよい話として(昔のこのサイトのメインコンテンツは「どうでもいいはなし」だったことを覚えているか!)、僕が本名ではなくて、名前がH.N.になってるのは、出身がそういう文化だったからというのがあるよなー。(ほんとどうでもよい) あとTODO: aboutをなんとか。(長野で働いてない)