akemasiteomedetouzagoimasu. _
3回くらい「書かなさすぎだろ」って言われたので今年はもう少し頑張ろうと思う。 _
_ Phantom types
前々から _
int a[10]; int x = 4; int y = 6; return a[x+y];
こういうのコンパイルエラーにできないかと思ってたんだけど、Phantom typeとかそれらへんがそれっぽいな。 _
http://www.haskell.org/haskellwiki/Phantom_type _
http://www.haskell.org/haskellwiki/Type_arithmetic _
冬休みの宿題だな。冬休みの宿題多すぎ。 _
そろそろ東京帰るよ。 _
今年の正月は反省すべき点が多かったけど、帰ったら忘れるだろう。 _
_ Phantom type
C++のテンプレートの特殊化を整理したものという理解でいいか…帰ったらGADTあたり調べる。 _
ところでテンプレートの特殊化ってC++起源なんかな? _
指摘されたところによると、僕の喋りかたは30代を感じさせるらしい。明るい喋りかたを目指してたのだけど、何か方向性を誤っていたようだ。 _
というわけで調子に乗って↓を読んでみたのだけど、さっぱりわからなかった。 _
Simple unification-based type inference for GADTs _
…まあ、ここらへんはまた実装する機会(そんなのあるのか?)ができたときに読むか… _
C++のテンプレートの特殊化は宣言した箇所で閉じてなくて、あとで追加できる(ライブラリをユーザが拡張できる…ちゃんと用語を調べよう)のだけど、GADTではそれができない、data ... whereで宣言した以上の型を追加できないように見える。これって微妙じゃないかな。 _
鼻毛の白髪について考えるブログ _
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++は素晴らしくて素晴らしい言語だけど、もはやフロントエンドが誰にも書けないのが厳しいな。 _
Hey!4時だZE! _
結局今日は仕事のコード書いてた。 _
_ CILで学ぶOCaml
うーん。ニコニコ見てた。 _
そんなに使うの難しくないか。Frontc.parse して返ってきたfileをへろへろすれば大丈夫。 _
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
今日なんもしてないぜ。 _
仕方ないので先週の話でも書く。先週家賃払ったんですよ、家賃、締めきりは去年の12月中のやつね。まあ、それはいいんだけど、そしたら何の脈絡もなく大家さんが鳩サブレくれたんですよ、鳩サブレ。 _
どういう意味なんかなー、年始の挨拶に鳩サブレなんかなー、よくわからんなー。ってふと考えたところ、これって「私のハートを受けとって」っていうフラグなんかなー、とか思ったのだった。 _
ちなみに大家さんは20後半くらいの美人の人。 _
とかいう設定が脳内をよぎった(というのはしょっちゅうのことです)。鳩サブレはおいしくいただきました。 _
実際の大家さんはおばちゃんとおばあちゃんの中間くらいの人で、おじちゃんとおじいさんの中間くらいの人と夫婦のように見えるけど名字が違ってしかも、よくわからんけど、半年前くらい家賃渡しにいったらどちらでも無いおっちゃんがいた。 _
あの人達はどういう関連の人達なんだろうか謎とかほんとどうでもいいな。 _
はてなリポジトリ欲しい! _
やたら眠い。違うな眠いとかじゃなくて布団に入る以外やることが無い。 _
寒い。また今日もなんもしなかった。日記になんもしなかったことを書くのってどうなんだろうな。 _
あとifconfigやrouteが許されるのは小学生までらしいということを知った。IPRoute2を使ったほうがいいらしい。でも僕にはどう違うかわからん。ネットワークは一度真面目に勉強しようと思い続けてはや10年(ということはないが)。 _
寒い。 _
全然作業進まんな。調べものとかやらないといけなかったのに。う…うまくいかないのが世の中だなんて割り切りたくないんだからね! _
寒い。 _
体感的にはこの冬一番の寒さなんだが。あとうまくいってないのは世の中じゃなくて僕の頭の中。 _
_ CILではじめるOCamlプログラミング
あまりにもなんもやらないのもアレなので一応なんかやるか。 _
やりたいこととしてはコマンドラインでプログラムとループの行番号を指定すると、そのループに対してナニをする、というような感じ。 _
とりあえず、行番号を指定すると、そのループを取り出す、というところまでやってみる。 _
まずは…どうしたらいいかな _
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)
一応動いた。(説明とか無し) _
次はループの中から計算とかロードとかを抜き出してみる。(来週に続く。多分) _
寒い。 _
ぐんにょり。最近平日も朝起きれない… _
_ 仮想化技術は何故必要か
そもそも仮想化技術ってどういうの?って話だが。ここでは最近話題の仮想化技術を仮想化技術である、としておこう。 _
仮想化技術というのは、なんで必要なんか?と、いうのが疑問。 _
本来なら、このレイヤはOSが行うべきだった部分のはず。 _
別に仮想化技術が無くても、素のMMUとOSでも、今の仮想化技術がやりたいようなこと…論理的なハードウェアとか、リソースの分配、例外からの保護…というのは何の問題も無く実装できるはず。 _
問題があるとすれば、SMT(Simultaneous Multithreading)なCPUの上で、片方のスレッドがキャッシュを汚し続けて仮想環境の外の世界のリアルタイム性能に影響を与えられる…とかの場合しか思い付かない。 _
多段MMUがあるおかげで、QEMUのように、ほぼユーザ空間だけで仮想PC/ATを作れる、というのはあるけど、それでもインターフェースが変わってしまうけど、OSが適切な仮想環境を作れるインターフェースを用意してればできるはず。というか、Windowsのサブシステムってそれ? _
いや…結局全ては過去互換の問題だとは思うが。ソフトウェアの問題をハードウェアの機能拡張によって修正する、なんて素敵な話だろうか! _
(無数にあるソフトウェアと数個しかないハードウェアの実装とどっちを修正するかという問題だけど…) _
_ FFTプレイ日記
ムスラム派かな!実家の押入れ探してムスラム本でも見つけてくるかね!(私信:多分2/9あたりに家帰ります。よろしく) _
というのはどうでもよくて…勉強しよう、しようとだけ思い続けて10年がたとうとしていたFFTだが、ついに彼と出会う日が来てしまったようだ。 _
プログラム書くわけじゃないけど。他人が書いたコードのレビューに参加する程度の能力が必要だという設定。今日言われて明日本番です!なんていう付け焼き刃かしら!というか日毎に勉強するテーマが変わる僕ってなんてアルハギークかしら! _
信号処理屋ワナビーであるところのwoさんは資料だけはいっぱいあるのだ。(いっぱいは無いが) _
よし、覚えた、くーりーさんとてゅーきーさんね。これで明日から知ったかぶれるよ。 _
「ああ、なるほど、ここらへんの係数がくーりーさんなわけね」
よしシャワーでも浴びるか!(全然進んでない) _
_ FFTプレイ日記2日目ブログ(最終回)
よし1%ぐらい理解した。 _
大体そもそも僕はO(N)とO(logN)のっどっちがいいかわからないぐらいの計算量オンチなのでN^2とNlogNはどっちがよいのかわからないのだった。 _
僕はM = M + 1/N - 1/Nとかいう考えかたは絶対思い付かんのでFFTは思い付かないな。まあいいか。ビット反転が必要な理由くらいはわかった。 _
_ [lifehack] 英語初心者が1ヶ月で人前で話せるくらいにまでなる方法ブログ
というのはないものか。 _
コーディングスタイルはなるべく問題が起こらないようにできる限り人にあわせるようにしてたつもりなんだけど… _
v if ( a ) { func( x ); } ^
こういう括弧のあとにスペース入れるのって少数派だと昨日まで知らんかった。これは矯正すべき。僕は一体何を見てコーディングスタイル学んだんだろうな。 _
近所の猫がたまに家に来るんだけど、昨日は家に入って風呂桶に溜まった水を飲んで帰っていった。 _
その水はやめたほうがいい、という言葉を伝えきれなかったあたりに、コミュニケーションの難しさというものを感じる。 _
_ リアルで僕を知っていてかつこのページを見てしまった人向けガイドライン
会社の人がこのページ見つけたらしい。イエーイ、見てるー? _
本名で検索したら出てくるからな…(はてなのほうが) _
なんかあったときのために見てしまった人向けガイドラインを書いた _
_ ほげほげ
すご。なんか尋常じゃないな… _
_ しかしこれ
トップページのHTML書きかえるにはHaskellのソース変更しないといけないとか酷いな。 _
_ 17bitの値ふたつをかけて32bitのレジスタに放りこんだときの値の範囲について言えることは
任意の32bit値をとるか。 _
_ いいかげん
なんでもいいからコード書けよ。 _
_ 結局昨日あのあとは
アンサイクロペたんに関する知識を手に入れただけだった。 _
_ とりあえずなんでもいいから
コード書いた。全然進まねー。 _
いや、速度はどうでもよくて、明日も作業が続くか続かないかが重要なんだ。 _
_ だがしかし
よく考えたらこれとほぼ同じコードを過去に書いている! _
寝すぎ。 _
_ ゲーセンが生まれる瞬間
近くに行く用事があったのでついでに久し振りに川口へ行った。先週。(先週ブログ)。10ヶ月ぶりくらいか。 _
そしたら、パチンコ屋がゲーセンになってた!なんという!ゲーセンが潰れる瞬間は何回も見てきたけど、ゲーセンが生まれたのは初めて見た!感動の瞬間! _
あと、書泉ブックドームが二階までになってた。ショックだわー。僕が初めてあそこに行ったときは、すごい量の本があって、なんか嬉しくなったもんだが、あれも過去の話。 _
というか閉店すんのか!どっちにしても二度と行くことは無いと思うから関係無い話ではあるけど… _
確かに文教堂があったのはヤバかったな。僕自信ほとんど文教堂しか行かなかったし… _
_ 超メモ
x86命令フォーマット(しかしこの話題以前一回調べてるな…) _
うーん。bintransのi386.lispがよくできてる。 _
プレフィクスで分類。 _
オペコードによって挙動が変わるのはしかたない。プレフィクスによって挙動が変わるし。 _
オペコードごとに付けられるプレフィックスは違う。 _
→ 同じニーモニックでも全然違う命令としたほうがいい。 _
挙動が変わるプレフィクスとあまり変わらないプレフィクス _
lock → 変わらない _
hint → 変わらない _
rep, repne → 変わる _
seg → 変わる _
オペランドサイズ → 変わる _
アドレスサイズ → 変わる _
simd → 必須 _
ニーモニック _
- 変わるプレフィクス1 _
-- 付けられる変わらないプレフィクス1 _
--- 必須プレフィクス, オペコード1-1 _
--- 必須プレフィクス, オペコード1-2 _
- 変わるプレフィクス2 _
-- 付けられる変わらないプレフィクス2 _
--- 必須プレフィクス, オペコード2-1 _
--- 必須プレフィクス, オペコード2-2 _
--- 必須プレフィクス, オペコード2-3 _
オペコードで分類 _
おぺこーど表記→/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の何かでも入れるか… _
いや、何をやってるんだ… _
_ 64bitにした
これは見てるだけで心に余裕が持てる… _
$ free total used free shared buffers cached Mem: 6122972 1930600 4192372 0 90920 1448892 -/+ buffers/cache: 390788 5732184 Swap: 1044216 0 1044216
$ df -h Filesystem サイズ 使用 残り 使用% マウント位置 /dev/sda6 35G 2.4G 31G 8% /
/usrをまるごとramdiskにするとかできそうだな…やらないが。 _
64bitになって一番嬉しいのは、*scratch*バッファでたくさん計算できることだろうか。 _
なんかSATAがエラー出すとかの問題があったけどケーブル別のコネクタに挿したら問題無くなった。 _
_ 最近なんかみんなやけにPHPの話題ばっか書いてると思ってたんだけど、その理由を今日知った件について
load、store命令がいかに駄目か、という話 _
…えーと… _
いや、今日会社でメモリの同期の話があったのだけど、重箱の隅つつきみたいなことをやると誰も正しいプログラムは何なのかがわからない、まあ、迷ったときは一番確実なのを使っとけ、(x86だとcpuid?)みたいな結論になっていやそんなもんなんだなー。と。僕のこれまで書いてきたコードも多分間違ってたしな…こんなのでみんなプログラム書いてて問題じゃないのかなー、これって、_beginthreadとかpthread_createとか一度でも書いたことがあるなら、確実に把握しておかないといけないことのはずだよなー、とか思ったとかいうような。 _
マルチコア、マルチプロセッサ環境でのメモリの読み書きというのはload、storeのふたつのオペレーションだけで表現できるものではなくて、裏ではもっと複雑な色々があるのだけど、うんぬん、つまり、「メモリなめるな」と言いたかったんだけど、あれ?なんで真面目な話してるんだ… _
そうじゃなくて…簡単なものに留まってしまう人達を否定するのはどうなん…ってこの話題絶対機械語を知らない子供達とかとネタが被るぜ!要するに、もっと上のレベルの人から見ればみんなどっこいどっこいって話だ! _
10年以内に、一回くらいはメモリオーダリングの問題によって引き起こされるセキュリティーホールが見つかることだろう!多分!そのときに、例えば、(ありえないけど)コヒーレンシの制御とか全部ソフトウェアでやらないといけないプロセッサがあったとして、それを使ってる人達に、「これだから簡単なload、storeばっか使ってるプログラマは駄目なんだ」とか言われたらどうするんだ的なアレな。 _
そして500年以内に、一回くらいは、量子の移動の問題によって引き起こされるセキュリティーホールが見つかることだろう(400年後に量子の移動をキューイングするqqueueができて、それにフェンスを入れるqfenceとかいう命令がx86に実装されるんだぜ!)!そんなときに、例えば、量子の移動とか全部手でやらないといけないプロセッサがあったとして、それを使ってる人達に、「これだから半導体とか使ってるプログラマは駄目なんだ」とか言われたらどうするんだ的なアレな!! _