読者です 読者をやめる 読者になる 読者になる

第七回 カーネル/VM探検隊 に参加してきました。 #kernelvm

勉強会


http://atnd.org/event/kernelvmseven

日時:2012/04/22
会場:株式会社インターネットイニシアティブ(IIJ) 大会議室


座席表は先に作られてしまった。座席表職人敗北。
https://docs.google.com/spreadsheet/ccc?key=0Al2CkS-MBrjQdGMzVjVUVHk1aG1xQmRrN1FJWXdoX2c#gid=0


発表してる全員の内容がぶっ飛んでる、底が抜けにコワイ

今まで参加してきた勉強会にに比べると、このジャンルが一番自分の業務に近いかなと思った。
そう参加するまでは。
どうやら思い違いをしていたようだ。
話についていけない・・・
1割も理解できたかどうか・・・


「XXXがなくてホントごめんなさい」と言いながら、マサカリを飛ばす
大学生、高校生、中卒フリーター・・・
平成生まれ、こわいわー


よく「ナゴヤこわい」とか言ってたけど、ここでは、本当の恐怖を感じたのだった。





セッション

とあるCPUの論理合成

@

  • FPGAボードにPDP-11を移植した!
  • 要するにFPGAとは、レゴとかプラレールみたいなもの
  • HDL: Hardware Description Language 主流はVHDL
  • ブート時の波形
  • たいしたことじゃ無い
  • どうやらFPGAを壊した。こんなこともあろうかと、別のもの用意しておいた
  • doxygenは、VHDLにも対応している
  • ソフト屋が深入りする必要はないが、ハードを知っていればそのぶんだけお得
  • PDP-11でライバルに差をつけよう
  • 教訓:口は災の元

いきなりFPGA(Field-Programmable Gate Array)という回路の話。。。
面白そうではあるが、「たいしたことじゃない」は、信じちゃいけないキーワード・・・
準備してものが壊れたから別のものでデモって3分クッキングかw

Extreme Java

@

  • Java原人、Javaのためならなんでも。ハードウェア設計、ハードウェア実装、サーバサイドJavaもやる。」
  • Javaとは? 小型の組み込み機器等に使われるプラットフォーム、最近はパソコンで動くようになった
  • EHCI -> Ralinkドライバ-> 802.11-> TCP/IPまでJavaらしくJavaで実装した話
  • /* なぜかコケる */ という FreeBSDのRalinkドライバ
  • TCP なんでこんなプロトコルが30年以上まともに動いているのかまったく不明。二度とやりたくない
  • 組込みJavaにはGCなどない。解放?開放しません。immortal Heapで領域を確保して、プールとして扱う。自分でmalloc()/free()を書く
  • 百聞は1コーディングにしかず
  • TCP実装してみれば実力がつく
  • デバッグが容易 腐っても自分のコード
  • 半年強で実装しました。結局使われませんでした。そもそもJavaでやる必要は・・・

http://code.google.com/p/squilla/


僕の知ってるJavaではなかった・・・( ̄△ ̄;)
TCPはねぇ、使うのだけでも僕には精一杯だよ

なのは完売 とある関数のバトルプログラム

@なのは完売

  • Windows 上でのアンチフック技法(逆から見れば、フックする技法)
  • SexyHook
  • LoadLibraryAは、我らLoadLibrary四天王のなかで最弱
  • SetWindowsHookEx は魔王、LrdLoadDll が元締め
  • DLLインジェクションではなく、CreateRemoteThread()でマシン語を直接注入
  • それを防ぐには、スレッドの作成を防ぐ(今回は全部のスレッド生成を抑止)
  • 攻性防壁、ヤラレっぱなしってくやしいですよね
  • むやみに斬りかかるわけにはいかないので、特定が難しい
  • dllを削除などというコードは書いてはいけません。コマンドプロンプトさえ動かなくなる
  • 攻撃されたら、Sleep(3日)とやりましょう
  • 反撃するコードは法令を守って実装しましょう。

デバッグ用に、CreateRemoteThread()でゴニョゴニョってのはやったことあるけど
こんなことができるなんだな。
Preziの使い方もうまいな。

休憩
  • 持ち寄りのお菓子
  • Fusion-ioの1GBのUSBメモリ
  • 各種シール
コマンドとシェルスクリプトで企業システムを作る ---USP研究所の取り組み

@

  • bashでCGIを書く人
  • bashで作ったほうがインジェクションされないでしょ
  • 売上の管理や勤怠の管理などのシステムをbashで作る
  • できない情報システム部の人に最初に使わせるのがFreeBSD(最近Linuxから変えた)、vimawksedの講習をして、自分たちでシステムを作ってもらう
  • 学生さんはよく聞いて欲しい、仕様はできてから固まるというSI業界
  • 失敗しない設計を請け負うSE、失敗したらカウンセラーのお世話に、『下請けを切ればいい』というセリフも、最後は弁護士が必要
  • どう戦うか? 実績をコツコツと積み上げる。自分たちで作ってもらう。他人に作ってもらうと弁護士を雇ってる会社に作ってもらうと高いわけで、自分たちで作ってもらった方が多少質は下がるけど安いでしょ。
  • データはDB使わずテキスト、中身が見える。余計なソフトウェアはいれません。PHPは使いません。
  • パイプでプロセス分けて並列実行、マルチコアの性能をフルに使いきれる。
  • gyoコマンド、ketaコマンド


Unixはもともと特許管理の処理に使われてた。これはUnixの正しい使用方法。」と会場からのコメントがあったが、
“今でも”正しい使用方法といえるのだろうか?
ベストなシステム開発といえるんだろうか?
それに、awksedが“誰にでも”理解しやすいとは思えないんだよな。

FreeBSD 9新機能、さらに先の未来10へ : 最小特権オペレーションを実現する「Capsicum」

@

  • FreeBSD Daily Topics 読まなくてもいいからRSSを登録してください
  • FreeBSD Expert 2012 Digital Edition 技評デジタルパブリッシングから購入可能 epub形式とhtml形式がある
  • そのepubを使っての説明
  • 安定運用するためには、ZFSのバージョンを上げない
  • ZFS:じぃーえふえす、GEOM:じおん、Capsicum:かぷしかむ
  • FreeBSD9 には NFSv4 が入る
  • Mac OS X Lion も NFSv4 対応している。defaultでidを変更する。ただし自己責任で
  • BSD Installはシェルスクリプトシェルスクリプトの方が柔軟だから。
  • IPv6 オンリーのカーネル、IPv4 オンリーのカーネル、IPなしのカーネルを作れるようになっている。IPv6 対応で切り分けに便利
  • デフォルトコンパイラgcc から LLVM Clang へ移行

BSD系は触ったこと無いのでさっぱりなのだ。
シェルスクリプトの方が柔軟で、前の発表とつながるとかは面白い。

中卒フリータの日常(?タイトルがなかったような)

@

  • 118km120.1kmかけて新幹線でアルバイト
  • 中卒フリーター(オワコン最終兵器)
  • 高校行ってない
  • coockpadCOOKPADでアルバイト
  • 33分の時間を残して終了、運営「あと33分の質問できるよ」sora_h「だからLT枠で足りると言ったのに(´・ω・`)」

不備指摘があったので修正

Nyarlathotep(sora_hの発表が早く終わったので飛び入り)

@

  • ちゃんと高1になって、学校行ってます。
  • もうbrainf*ckの単純置き換え言語はいいよ
  • Esolang(Esoteric Programing Language、難解プログラミング言語)がなめられている?Esolangの怖さを思い知るが良い
  • Nyarlathotep 純粋関数型、遅延評価、型なしラムダ計算チューリング完全
  • (」・ω・)」うー:関数適用 (/・ω・)/にゃー: U combinator
  • 同級生の純粋関数型野郎


16歳こわいわ近寄らんとこ。

Redbull Time 〜翼を授ける〜

Redbullガールが、シュガーレスと普通のどちらかがいいか聞いて
開けて渡してくれる。

http://a.yfrog.com/img816/1525/utruu.jpg

https://p.twimg.com/ArElKOACQAE5wJG.jpg

http://s1-05.twitpicproxy.com/photos/large/565632787.jpg


LT

m4 で実用的プログラミング

@

  • Gnu m4 マクロ言語
  • m4は極めて実用的なプログラミングです。極めて実用的なプログラミングです
  • 数値計算をやるexpr()今回は便利すぎるので使用禁止
  • m4 チューリング完全なんじゃね?
  • そこでbrainf*ckの実装

brainf*ckを全否定された後に、brainf*ckとかw

Arduinoで耳grepつーるつくってみたよー

@

  • grep
  • 「2012/02/19 盛大な*grep TL
  • バイナリじゃないけど鳴らしてみようと思った
  • キュルゥキュルゥキュルゥキュルゥキュルゥキュルゥキュルゥキュルゥキュルゥキュルゥキュルゥキュルゥキュルゥキュルゥキュルゥキュルゥキュルゥキュルゥキュルゥキュルゥキュルゥキュルゥキュルゥキュルゥキュルゥキュルゥキュルゥキュルゥキュルゥキュルゥキュルゥキュルゥ
  • Q.「grepはどこでやるのでしょうか?」

キュルゥキュルとかセットを巻き取るような音に気をとられていたが
質問的確すぎてワロタw

Software Development with Text Editor, OS Kernel and VM

@

  • 趣味でバイナリエディタ開発してます
  • バイナリエディタでは 色で見る、耳で聞く? ギガバイト単位の巨大なファイルなので、俯瞰してみるにはいいんじゃなかな
  • 複数のことは同時に考えるのは無理
  • 未来のエディタは?
  • なにかよいアイディアがあれば話しましょう。
SAN値論理と名状しがたいSAN値Prolog

@http://www.takeoka.org/~take/ailabo/prolog/sanchi-prolog/sanchi-prolog.pdf

ソースコードSAN値 Prolog (ver.2)マニュアル

  • (」・ω・)」うー!(/・ω・)/にゃー!
  • SAN値論理
  • SAN値とは頭の正気度
  • 似た研究でファジィ論理
  • lispで書いたprologの処理系
  • にゃ?-*1 SAN値=90
軽快なPlan9 Update - Illumos-kvm上陸 -

@

  • さっきRedbull飲んだら手が震えてきて・・・
  • ゲストはネットワークにつながってないのに、ハイーパーコールを使って底を抜けば、ネットワークにつなげてしまう
  • Clojure登場
  • あっつがらない・・・
  • 筑波の学生からメンテナ募集

底を抜くってゲストOSからホストOSにアクセスすることなのね。

軽快なBHyVe

@

  • 独自ローダーからFreeBSDカーネルをゲストOSとしてロード&ブートだが、BIOS無いからブートローダが動かないという問題
  • SeaBIOSをBHyVeに載せりゃええやん→提案→却下→GPLだから
  • IntelVTでソフト割り込み:Trapしたくない、ソフト割り込みからBIOSコールだけを抽出:面倒
  • そこでPlan 9
  • vmcall:HyperVisorへVMExit、BIOSエミュレート

やっぱり底を抜くんだ。


つくっておぼえる!仮想マシン〜直前で実装編〜

@ & @

VM in Erlang ソースコードVM in Haskell ソースコード

  • ちゃんと筑波大学に通っています
  • ErlangなくせにOTPも使ってませんごめんなさい
  • すべての割り込みはメッセージ送信!
  • MIPSがWeb上で遊べるサービスあったらいいなー あとで作ります
  • Debianのせいじゃない!

Earlang、HaskellでVMって・・・つくばコワイわ

Xとかオワコンじゃね… っていう男の人って

@

  • 大阪大学に通ってます
  • X ServerとCompositorをWayland Compositorにまとめちゃえ
  • Waylandはプロトコル
  • mikutter
  • ておくれWayland
x86-64/Linuxに独自メモリ空間を勝手増設

@

ソースコード

ふつうのサラリーマンってなんだろう。

bcache でお手軽階層型ストレージ

@bcache でお手軽階層型ストレージ

  • bcacheのベンチマーク
  • iozone の結果
  • SSDとWriteThrouhとWriteBackの3つがだいたい同じ性能
  • HDDとRAID5 がだいたい同じ
  • HDDと比較してSSDが5〜10%ほど速く
TinyCC on NaCl

@Tinycc on NaCl

  • IOCCC優勝入賞したからそれを自慢するために来た
#include<stdint.h>//       4                                                
#include<stdio.h>/*      76.                               1                
                         ..2321     1       57             3                
                         21....     .       ..             .11         1   2
                    1  88..1321  2  33    5512      1      277        14   1
                    099..12....  .  ..    ....    1 4 11111...111 122 5.1  .
                  11...221.821112411123455676489  51.176543232666 902 .27  1
                  10111...1.....................11.417...........1...21..11.
                  ..2239921176566156225563322299887...6533233233182469196894
                  22...............................111......................
*///              3269548556987776665556662131223412347543332334543322223456
/*                                                                          
          13.3.37 */char C[120]  [60   ];int R[120][60],W,H,J,K,B[61][61],/*
          12.2.39 */r,i,j,c,*q  =&   H,t=7200,x,y,k;int64_t*U,T[28800],*S=/*
          11.2.40 */T,O[120],  Z[   120],v,z;void D(){for(k=-1;7200>++k;S[/*
            10.39 */k]=v)r=!         ~(v=U[k])&&*R[k/60]?2:S[k]-v?1:r;;;;}/*
             9.36 */void L(             ){for(r=1;r==1;){r=3;;for(i=0;120>/*
             9.31 */i;i++){                  for(k=z=1,j=0;v=R[i][j];j++)O/*
           8.3.32 */[i]|=(  1LL             <<v)-1<<k,k+=v,0,Z[i]=z|=1LL<</*
           7.3.30 */k++;;  v=~                (3LL<<k-2);for(j=-61;++j<60;/*
           5.3.29 */v=(   v|~                  z)&(j<0?v>>1:v<<1|1))v=S[60/*
       3.1.3.1.28 */*         i    +(j        < 0?~j:j)]|=j?v:~3;}for(z=0;/*
         1.2.4.31 ;         */    7200       >z;z++)i=z/60,j=z%60,(B[i<60?/*
           7.5.31     */i:j][   i<60?        j:i-60]=~S[z]&O[i]?~S[z]&Z[i]/*
         1.6.5.30 ;  */?r=0    :(U=O          ,1):(U=Z,2))?k=i<60?j+60:j,S/*
       5.10.12.16 */[i%    60+60*k]|=         ~U[k]:0;U=S;  S-=t*=-1;D();z/*
    5.11.5.4.12.4 */*9;  }}int main(          ){for  (;K=  scanf("%d",R [*/*
    15.2.4.4.11.5 */q+c*60]+j)<1?          q= &W,j  --,2   >++c:'\n';j =-K/*
   16.3.4.2.2.5.5 */+getchar()?j+1        :++ *q*0   );     L(   );;if (!r/*
         14.8.7.3 */)for(K=0;K<W          *60;K++)              if(K%60  </*
     12.1.4.1.6.2 */W&!B[K/60]          [ K%60 ]                  ){for(  /*
       11.3.4.6.1 */c=64;c--;         )if (!(1                     &S[K/*  ;
     10.1.8.8.5.1 */]>>c))U=        S ,000,S+=         J=14400,     D()/*  ;
         9.8.11.5 */,S[K]=~         (1LL<<c)         ,L(),S-=J,S    [K]/*   
    9.5.6.1.2.4.1 */|=r==2?          1LL<<          c:0;L(  ) ;}     q=/*  ;
        9.3.5.1.5 */&K;;for           (J=          K=i=0       ;    120/*   
        3.2.6.5.1 */>    i;                       Z[i]=k            --,/*  ;
        2.6.3.5.1 */                             i>59?q    =&J     :0,/*   ;
    2.1.2.6.3.6.1 */ *     q<                    k?*q=k    :0,    0,C[/*   ;
2.1.2.2.1.5.2.5.1 */ i  ++  ][                k  ]=' '     ){     j=k/*    ;
    2.1.2.5.5.6.3 */ =  0;  for(;         x=R[i  ][j++]            ;/*      
      4.1.9.7.5.1 */0)  k  +=sprintf   ((00,C[    i]+/*                    ;
       5.19.6.1.2 */k), "%d.",x);}i=~J;;r&1       ||puts        (         /*
         24.6.3.3 */r?"invalid":"failed");         for(;i      <H;       i/*
     24.1.2.9.7.4 */++,puts(""))for(j=~K;j  <  W;  )putchar( i<0?j<0    ||/*
        25.1.2.25 */(k=i+Z[j+60])<0?' ':C[j +  60  ][k]:j<00?(k=j+Z[i])<0?/*
          28.1.26 */' ':C[i][k]:"?X "[B[i][j]]  ) ,j++;return 0;} /* 2012 */
  • ブラウザでCをちょっと実行できるといいよね
  • アニメのキャラを描いたコード、実行するとキャラクターが小さくなる。そして更にそれがCのコード
                                       /*
                                      +
                                     +
                                    +
                                    +
                                    [         >i>n[t
                                     */   #include<stdio.h>
                        /*2w0,1m2,]_<n+a m+o>r>i>=>(['0n1'0)1;
                     */int/**/main(int/**/n,char**m){FILE*p,*q;int        A,k,a,r,i/*
                   #uinndcelfu_dset<rsitcdti_oa.nhs>i/_*/;char*d="P%"   "d\n%d\40%d"/**/
                 "\n%d\n\00wb+",b[1024],y[]="yuriyurarararayuruyuri*daijiken**akkari~n**"
          "/y*u*k/riin<ty(uyr)g,aur,arr[a1r2a82*y2*/u*r{uyu}riOcyurhiyua**rrar+*arayra*="
       "yuruyurwiyuriyurara'rariayuruyuriyuriyu>rarararayuruy9uriyu3riyurar_aBrMaPrOaWy^?"
      "*]/f]`;hvroai<dp/f*i*s/<ii(f)a{tpguat<cahfaurh(+uf)a;f}vivn+tf/g*`*w/jmaa+i`ni("/**
     */"i+k[>+b+i>++b++>l[rb";int/**/u;for(i=0;i<101;i++)y[i*2]^="~hktrvg~dmG*eoa+%squ#l2"
     ":(wn\"1l))v?wM353{/Y;lgcGp`vedllwudvOK`cct~[|ju {stkjalor(stwvne\"gt\"yogYURUYURI"[
     i]^y[i*2+1]^4;/*!*/p=(n>1&&(m[1][0]-'-'||m[1][1]  !='\0'))?fopen(m[1],y+298):stdin;
      /*y/riynrt~(^w^)],]c+h+a+r+*+*[n>)+{>f+o<r<(-m]    =<2<5<64;}-]-(m+;yry[rm*])/[*
       */q=(n<3||!(m[2][0]-'-'||m[2][1]))?stdout /*]{     }[*/:fopen(m[2],d+14);if(!p||/*
       "]<<*-]>y++>u>>+r >+u+++y>--u---r>++i+++"  <)<      ;[>-m-.>a-.-i.++n.>[(w)*/!q/**/)
    return+printf("Can "  "not\x20open\40%s\40"    ""       "for\40%sing\n",m[!p?1:2],!p?/*
  o=82]5<<+(+3+1+&.(+  m  +-+1.)<)<|<|.6>4>-+(>    m-        &-1.9-2-)-|-|.28>-w-?-m.:>([28+
 */"read":"writ");for  (   a=k=u= 0;y[u];  u=2    +u){y[k++   ]=y[u];}if((a=fread(b,1,1024/*
,mY/R*Y"R*/,p/*U*/)/*          R*/ )>/*U{  */   2&& b/*Y*/[0]/*U*/=='P' &&4==/*"y*r/y)r\}
*/sscanf(b,d,&k,& A,&           i,  &r)&&        !   (k-6&&k -5)&&r==255){u=A;if(n>3){/*
]&<1<6<?<m.-+1>3> +:+ .1>3+++     .   -m-)      -;.u+=++.1<0< <; f<o<r<(.;<([m(=)/8*/
u++;i++;}fprintf   (q,    d,k,           u      >>1,i>>1,r);u  = k-5?8:4;k=3;}else
  /*]>*/{(u)=/*{   p> >u  >t>-]s                >++(.yryr*/+(    n+14>17)?8/4:8*5/
     4;}for(r=i=0  ;  ;){u*=6;u+=                (n>3?1:0);if    (y[u]&01)fputc(/*
      <g-e<t.c>h.a r  -(-).)8+<1.                 >;+i.(<)<     <)+{+i.f>([180*/1*
      (r),q);if(y[u   ]&16)k=A;if                               (y[u]&2)k--;if(i/*
      ("^w^NAMORI; {   I*/==a/*"                               )*/){/**/i=a=(u)*11
       &255;if(1&&0>=     (a=                                 fread(b,1,1024,p))&&
        ")]i>(w)-;} {                                         /i-f-(-m--M1-0.)<{"
         [ 8]==59/* */                                       )break;i=0;}r=b[i++]
            ;u+=(/**>>                                     *..</<<<)<[[;]**/+8&*
            (y+u))?(10-              r?4:2):(y[u]         &4)?(k?2:4):2;u=y[u/*
             49;7i\(w)/;}             y}ru\=*ri[        ,mc]o;n}trientuu ren (
             */]-(int)'`';}             fclose(          p);k= +fclose( q);
              /*] <*.na/m*o{ri{                       d;^w^;}  }^_^}}
               "   */   return  k-                -1+   /*\'   '-`*/
                     (   -/*}/   */0x01        );       {;{    }}
                            ;           /*^w^*/        ;}
  • TinyCCは、JS linuxを作ってる人
  • TinyCCでGCCがビルドできるようになった。週末クソ暇だったから実装したらしい

あかりをコンパイルして、それがあかりのCコードで、さらにコンパイルして・・・
わけわからん。。。さすがIOCCCだ。

帰ってきたvinarise 予告編 in Kernel/Vim探検隊 (飛び入り)

@ソースコードVimでバイナリ編集が出来るプラグインvinarise 紹介記事

  • カーネル/Vim探検隊なのにVim成分が足りない
  • vinarise:vimバイナリエディタ実装
  • 脅威のVimScriptテクノロジー
  • みんな大好きビットマップビュー
  • この辺、日本語っぽいのわかりますか?目grepができる!





カーネル/VM探検隊の「ふつう」ってなんだろう・・・
発表者もそうだけど、Togetterの『残りを読む(5246)』って
どんだけTweetしてるんだよ。


これはこわい、近寄らんとこw

懇親会

ヘロヘロ
ほとんど話せず。
ちなみに、オレンジの服来てた。(ておくれ)



発表者の方非常にコワイ興味深い話面白かったです。
参加者のみなさんおつかれまさでした。
会場を提供してくださった。IIJさんありがとうございました。
無線LAN、HD画質の動画配信、モニタでのTwitterのTL表示など充実した設備。


*1:foo *x