Gentoo install on Virtualbox

Gentooをインストールしたことがなかったので, Gentooハンドブック通りにやってみる. 日本語版が更新されてないのがよく分かった. 環境 uname -a: Linux debian 3.13-1-amd64 #1 SMP Debian 3.13.7-1 (2014-03-25)x86_64 GNU/Linux Virtualbox 4.3.6 1. Gentoo Linuxのインストールについて シンプル,先進的なメタディストリビューション システム全体をスクラッチからでも,コンパイル済みからでも, 半分だけでもおk 2. 適切なインストールメディアの選択 http://mirrors.stuhome.net/gentoo/releases/x86/autobuilds/current-iso/install-x86-minimal-20140401.isoを使った GentooインストールCDは独立したGentoo環境を含むブート可能CD install-x86-minimal-<release>.iso ディスク容量が104MBしか使わない 必ずネットワーク上環境が必要 stage3 tarball 本マニュアルの対象 現在でもstage1, stage2は配布している ドキュメントもある 書き込んでブートする http://www.gentoo.org/main/en/mirrors.xmlから取ってくる releases/x86/autobuilds/current-iso パラメータを指定する 例えばgentooカーネルにカーネルパラメータdopcmciaを指定するなら, boot: gentoo dopcmciaみたいにする 普通に boot: gentooってやった すぐにキーボードを変更する. 22 JPにする 3. ネットワーク設定 勝手につながってたので飛ばす proxyの設定はこのタイミングで net-setup, pppoe-setup, pptpを使う net-setupが一般的 もし,カーネルモジュール(ドライバ)に不足があれば 手動でやる ls /lib/modules3.12.13-gentoo/kernel/drivers/net/ から見つけて modprode pcnet32とする 無線の場合はiwconfigでチェック iwconfig eth0 essid hogehogeman iwconfig eth0 key 1234hoehogeman 4....

April 6, 2014

scheme REPLとガベージコレクション

REPL 普通のREPL. 相変わらずパイプで繋いでる. トップレベルにS式を打ち込む度に流し込んでやるとできた. 逆アセンブル (disasm ..)とかいう命令を追加した. こんな感じで逆アセンブルした結果を確認できる. >>(disasm (+ 1 2 3)) === code === 0 0x12000002 ;FRAME 1 0x0000003c ;15 2 0x25000002 ;CONSTNUM 3 0x0000000c ;3 4 0x13000002 ;ARGUMEMT 5 0x25000002 ;CONSTNUM 6 0x00000008 ;2 7 0x13000002 ;ARGUMEMT 8 0x25000002 ;CONSTNUM 9 0x00000004 ;1 10 0x13000002 ;ARGUMEMT 11 0x03000002 ;REFER_GLOBAL 12 0x094bf2f3 ;+ 13 0x15000002 ;APPLY 14 0x0000000c ;3 15 0x27000002 ;DISASM 16 0x00000002 ;HALT ガベージコレクション cheneyのcopy gcを実装して埋め込んだ. 同じ大きさのFrom空間とTo空間という二つの領域を確保しておいて, From空間にallocateしていく. From空間が満タンになれば,ルートオブジェクト(レジスタとかシンボルテーブルとか)から たどれるオブジェクトをすべてTo空間にコピーする. 全部のコピーが終われば,From空間とTo空間を交換する. 単純なアルゴリズムともいえるけど,ルートを忘れやすいので注意が必要. ヒープの効率が悪くなったり,保守的GCじゃないなどデメリットがある. まあヒープは現状問題ないだろうし,スタックやレジスタの要素がオブジェクトかプリミティブ かは判定できるのでexactなGCで問題ない. メリットは,フラグメンテーションが起こらない,キャッシュと相性がよいなど素晴らしい. ここまでは,copy gcの話....

March 7, 2014

scheme VMをCで書く

オブジェクトの表現 二つの型(vm_data型とvm_obj構造体)を使っている. vm_data型にはprimitiveな型や定数,そしてオブジェクトへの参照を入れる. 保守的なGCとか大変そうなので,1ワードの中にタグを含めることにした. 下位ビットで判定する. 単純にtypedef intptr_t vm_data;としている. 整数 ....00 上位30bitで符号付き整数を表現 文字 .00000 上位8bitで表現 true .00101 false .01001 nil .01101 undefined .10101 ボックス ....10 vm_dataへの参照 vm_obj ....11 vm_objへの参照 vm_obj構造体は,その他もろもろのオブジェクトを入れる. こんな感じで,文字列,シンボル,クロージャ,ペア,スタックオブジェクト を表現する. struct vm_obj { unsigned char tag; union{ char *string; char *symbol; vm_data *closure; struct { vm_data *p; int size; } stack; struct { vm_data *car; vm_data *cdr; } pair; } u; }; 実行 コンパイラまでは,以前と同じものを使う. とりあえず,パイプで受け渡しするようにしている. compile.scmはschemeで書いたscheme->バイトコードのコンパイラ, vmはCで書いたVM. 不格好だが,こんな感じで実行する. replはまだない....

February 28, 2014

3imp 伝統的マクロとバイトコードの変換

伝統的マクロ VMの方は触らずに,コンパイラの方だけを修正した. マクロ展開時と定義時にマクロテーブルに追加したり,参照したりするようにしている. トップレベル変数とは名前空間が違うけど,これでいいよな… ということで以下のようにletとかbeginとかいろいろ自由に拡張できるようになった. また時間があれば他のマクロシステムも増やしたい. (define-macro let (lambda (binds . bodies) (cons (append (list 'lambda (map (lambda (x) (car x)) binds)) bodies) (map (lambda (x) (cadr x)) binds)))) (let ((a 10)) (+ a 1)) バイトコードをかっこよく 今までのバイトコードは下のような感じで,次の命令を繋げていく構造だった. schemeで扱うには適しているようなだけど,後々VMをCで書きたいのでもっと線形な感じにしたい. (frame (halt) (constant 2 (argument (constant 1 (argument (close 0 (refer-local 1 (return 2)) (apply))))))) こんな感じにした. これでCとのインターフェイスも簡単にかけそう. 0 frame 9 戻り番地を9にしてフレームを作る 1 constant 2 定数2をaccumulatorにロード 2 argument スタックにつむ 3 constant 1 定数1をaccumulatorにロード 4 argument スタックにつむ 5 close 0 7 8 7番地から8番地を本体にするclosureオブジェクトをaccumulatorにロード 6 apply そのclosureオブジェクトを適用 7 refer-local 1 2つめのローカル変数をロード 8 return 2 レジスタからローカル変数2つ取り除いて復元 9 halt おわり この作業はなかなか大変だった. 問題点はclosureだった. closureをトップレベル変数に束縛しない限りは,そのclosureに対応するバイトコードが存在するから, closureオブジェクトには単純に,#(開始番地 終了番地)を入れておけばいい. しかし,トップレベル変数に束縛した場合は,呼び出し時には開始番地や終了番地が分かったところでそのバイトコードの自体がないので,呼び出せない. 色々考えてみる...

February 18, 2014

3imp トップレベル変数とプリミティブな関数

3imp 4.7に書かれているトップレベル変数とプリミティブ関数を実装した. トップレベル変数 実装方針が2つ挙げられていた. 一つ目は,今までの自由変数のようにクロージャ生成時にdisplay closureの中に 全部つっこんでしまう方法. 簡単らしいが,あんまり気が乗らないので却下. これをやっちゃうと,当然すべてのdisplay closureが膨らんでしまうし, いろんな場所から参照されてboxが…の話になってしまう. 二つ目は,トップレベル用を自由変数と別に管理する方法. トップレベル変数,自由変数,束縛変数を区別する. これならdisplay closureは小さいままだし,boxもいらない. こっちを採用した. 変更点は,以下のあたり. find-free 式xの中に含まれている自由変数を検索する関数. トップレベルかどうかを判定を追加する. compile-lookup 変数xと,(ローカル変数のリスト . 自由変数のリスト)を受け取り,変数xが3種類のうちどこに属するかを調べる関数(その後,適切な関数を呼ぶ). ローカル変数 -> 自由変数 -> トップレベルで検索する. collect-free クロージャの生成時にdisplay closureにつっこむ自由変数の値を集める関数. display closureにつっこむべき値は,呼び出し元の束縛変数か自由変数のはず. プリミティブ関数 プリミティブな関数も関数なので,トップレベルにそのクロージャオブジェクトを あらかじめおいておく. 呼び出す場合は,他のクロージャ同様,引数を渡してコールフレームを作ってー…と やっている. 1引数の場合でもわざわざスタックに積んでいるのでもったいない気はするが, 2引数のときに,一方はレジスタでもう一方はスタックでというのは分かりにくいので とりあえずこの方針でいく. 複文 ついでにlambda式で複文をかけるようにした.

February 15, 2014

3imp 4.1 スタックベース

3impのchap4.1の備忘録です. schemeから,第一級関数,継続,末尾最適化を取り除いた簡単な例です. レジスタ a: accumulator,汎用的に使う x: 次の命令 e: 一つ外側のスコープのフレーム s: スタックトップ コールフレーム 静的リンク(pushed last) 1st argument : : last argument next expression(返りアドレス) 動的リンク(pushed last) 命令 継続はないから,conti,nuateはない. (halt) VMをhaltする. accumulatorの値を結果とする (refer n m x) 静的リンクをたどる n…現在のフレームからのオフセット (constant obj x) 定数objをaccumulatorにつっこみ,xをセット (close vars body x) functionalを作る (test then else) accumulatorがnullかどうかチェックし,nextかelseをnext expressionにセットする. (assign var x) varにaccumulatorを束縛 次の式をxにセットする. (frame x ret) 動的リンクとretからフレームの土台を作る (argument x) accumulatorの値をスタックにプッシュ 次の式をxにセットする. (apply) 静的リンクを取り出して,プッシュ 次の式をclosure本体にする. この時点でフレームが完成する (return n) 動的リンクとnext expressionを除いたフレームのサイズ つまりフレームトップからnを引くと,next expression, 動的リンクが取り出せる これでフレームを消して,動的リンク元のフレームに戻る 例 ((lambda (x y) (x y)) (lambda (x) (if x 10 20)) #f) (frame (halt) (constant #f (argument (close (refer 0 0 (test (constant 10 (return 2)) (constant 20 (return 2)))) (argument (close (frame (return 3) (refer 0 1 (argument (refer 0 0 (apply))))) (apply))))))) 1....

February 13, 2014

3imp ヒープ型VM

3impを3章まで読んだので備忘録です. 以前にschemeっぽいのを書いたのでもうちょっとマシなのを作りたいという ことです. 3impは,schemeの処理系をheapベース,stackベース,stringベースの三種類で 具体的に紹介してくれているありがたい論文です. 特に3章heapベースのVMの動きを書き残しておきます. コンパイラ schemeコード -> コンパイラ -> 中間コード -> VMで実行 という流れなので,まずschemeコードから中間コードへのコンパイラを作ります. 継続渡しとでもいうのかな. 基本的に前から後ろに命令が流れていきます. コンパイラの詳細は論文にあるので省略します. ;; schemeコード (if #f 10 20) ↓ ;; 中間コード (constant #f (test (constant 10 (halt)) (constant 20 (halt)))) VMの仕様 レジスタと中間コードの仕様は以下の通りです. まず,VMには以下の5つのレジスタがあります. レジスタa - the accumulator 関数の返値,定数や変数のロード,関数の引数,条件式など汎用的に使う トップレベルまで返ってくると計算結果が格納されている 例: 10, (1 2 3) レジスタx - the next expression 次に評価すべき式(中間コード)を格納 実際は評価すべき式がリストとして渡されますが,car部分の式が次に評価すべき式 例: (constant #f (test …)) レジスタe - the current environments 現在の変数の割り当て(環境)を格納 クロージャ適用の際に,その引数が新しく追加され環境が更新される 変数名は特に意味がないので(後述します),値だけ入れておく リストの先頭が直近のスコープです. 例: ((1 2 3) (#t #f) ()), () レジスタr - the current rib 関数呼び出しの際に,引数のリストとして使われる 引数を評価したレジスタaの値を,consしていく 例: (1 2 3), () レジスタs - the current stack コールフレーム 関数呼び出し時に追加され,呼び出し元の(x e r s)をこの順で格納 関数から戻るときはここに待避させたレジスタを復元 call/ccで継続オブジェクトとして取り出したり,割り付けたりする 例: ((return) (1 2 3) () ()), () 中間コードは以下の通りです....

February 6, 2014

piでベアメタルプログラミング

0. はじめに 実機でhello worldを目標に簡単なブートプログラムを書きます. せっかく友人からもらったraspberry piを遊ばせているので いいおもちゃになりそうです. ただ,ほとんどhttp://wiki.osdev.org/ARM_RaspberryPi_Tutorial_Cを参考にしているので 詳細を知りたい方は原文を読んでいただけたらと思います. 前半はエミュレータとクロスコンパイラの準備です. 全部コピペしてくれれば動くようにはしているつもりです. 対象はraspberry pi Model Bと呼ばれるものです.(これしか持ってないです) wikipediaより cpu: 700 MHz / ARM1176JZF-S コア (ARM11 ファミリ) ボード: BCM2835 メモリ: 512MB 内蔵SSDやHDは搭載しない代わりに,SDカードを記憶装置として使います. ブートもSDカードからです. 1. エミュレータ まずqemuを使って,raspbianが動作するか確認します. もともとインストールされていたqemuは qemu-system-arm -cpu ?にarm1176は含まれていますが qemu-system-arm -M ?にBCM2835ボードが含まれていないようなので, 代わりにversatilepbを使います. そのため実機とエミュレータでハードウェアのアドレス(GIOやUART)が 変わるので注意が必要です. -cpuでcpuの種類,-mでメモリサイズ(MB),-hdaでイメージファイル, -appendでを指定します. -kernelでホスト環境にカーネルのファイルを指定します. raspbianのイメージファイルはここから. http://www.raspberrypi.org/downloads $ wget http://xecdesign.com/downloads/linux-qemu/kernel-qemu $ wget http://files.velocix.com/c1410/images/raspbian/2012-10-28-wheezy-raspbian/2012-10-28-wheezy-raspbian.zip $ unzip 2012-10-28-wheezy-raspbian.zip $ qemu-system-arm \ -kernel kernel-qemu \ -M versatilepb \ -cpu arm1176 -m 256 \ -append "root=/dev/sda2 panic=1" -hda 2012-10-28-wheezy-raspbian....

January 13, 2014

2013年総括

明けましておめでとうございます. 少し遅れたが昨年2013年を振り返ってみる. unix v6読書会 受付の方から鍵を借りれたらこっちのもん 7回くらい開催した 8回目どうしよう 来てくれるかな… セキュリティ・キャンプ 熊猫さん,忠鉢さんとLSMを使ったセキュリティモジュールを作る 中途半端なまま残ってる カーネルvm なおたさんに誘っていただいた ちょっとだけ運営の手伝い(足手まとい) 次回以降… googleブートキャンプ スパゲティのうえにマシュマロ乗っけたやつ mixi challenge mixiっぽいsnsでカモネギさんと遊んだ kc3 怖いbrainfuckerがいた mruby読書会 シンボルテーブルのところ p Class.class.class.classのやつ ouccの旅 徳島で麻雀 モンバス 四星玉,スピッツなどなどのやつ しゃちほこ 広島,長崎のどこか ちょいと遠くまでさらわれる zeppなんば 限定フリーライブ 2列目のやつ 愛知県体育館 単独ライブ ことしの鯱夏は武道館 ガンバ大阪 アレアレガンバレアレガンバレのやつ 12節山形(万博) デズモンドのアタマがこわかった 35節愛媛(万博) みかんにやられた 40節熊本(万博) うさみん戻ってくる 4-0圧勝で自動昇格 41節山形(万博) j2優勝 藤春MVP かじさんカミカミ

January 4, 2014

((schemeっぽい処理系)を書いてみた)

schemeっぽい処理系jellyfishを書いてみました. ここ においています. ただ,あくまでもオレオレ実装なのでRnRSには 対応していません. schemeは,処理系の自作としては定番のようですが, その割には解説した記事が少ないと感じます. ここでは簡単ですが,その実装方法などを書きたいと思います. 読者として想定しているのはbrainfuck処理系を書いてみて, もう少し高級?なオレオレ処理系(schemeに限らず)を書きたいな と思ってるそんな方々です. なんや簡単やんと思っていただけたら幸いです. jellyfishではこんなプログラムが動いてくれます. 簡単な組み込み関数(evalを含む),高階関数は実装しています. ; ; quick sort ; (define (part c y x) (if (null? y) '() (if (c (car y) x) (cons (car y) (part c (cdr y) x)) (part c (cdr y) x)))) (define (quicksort x) (if (null? x) '() ((lambda (pivot) (append (quicksort (part < x pivot)) (cons (car x) (quicksort (part > x pivot))))) (car x)))) ; ; fizz buzz ; (define check_fizzbuzz (lambda (x) (if (= (modulo x 15) 0) "FizzBuzz" (if (= (modulo x 5) 0) "Buzz" (if (= (modulo x 3) 0) "Fizz" x))))) (define fizzbuzz (lambda (a b) (if (> a b) nil (begin (display (check_fizzbuzz a) " ") (fizzbuzz (+ a 1) b))))) (define x '(fizzbuzz 1 50)) (display x " => ") (eval x) (newline) (define x '(quicksort '(32 77 70 21 3 2 73))) (display x " => " (eval x)) (newline) まず,以下のようなことを考えてみます....

December 24, 2013

vimをコンパイルしてみた

未だneocomplecache.vimを 使っているのでそろそろneocomplete.vimへ移行したいなと思い 調べてみるとどうやらluaサポートのあるvim が必要とのこと.この例ではpythonサポートも含めています. パッケージ持ってきても良かったんですが vimをソースからコンパイルしたことなかったので やってみました. $ brew install mercurial $ mkdir /usr/local/vim-7.4 $ cd /usr/local/src $ hg clone https://vim.googlecode.com/hg/ vim $ cd vim/src $ ./configure --enable-luainterp=yes \ --with-lua-prefix=/usr/local/Cellar/lua/5.1.5 \ --enable-pythoninterp=yes \ --with-python-config-dir=/usr/lib/python2.7/config \ --prefix=/usr/local/vim-7.4 $ make $ make install –with-lua-prefix –with-python-config-dir は環境に依存するので注意してください. (configureのメッセージや,make後のvim –versionで正しく設定されているか確認できます.) これで,/usr/local/vim-7.4/bin/vimにインストールされます. pathを通せば完了です. ( export PATH="/usr/local/vim-7.4/bin:$PATH" ) :lua print("hello") のようにすると,luaインタプリタがちゃんと動いているのを確認できます. .vimrcは以下のようにすればneocompleteとneocomplecacheの共存も可能です. if has('lua') && ( (v:version == 703 && has('patch885')) || v:version >= 704) " neocompleteの設定 else " neocomplcacheの設定 end

November 19, 2013

pdp11の遊び方

V6のコードリーディングをやってると,pdp11のエミュレータsimhの使い方とか クロスコンパイラの使い方を知っているといろいろ捗ると思うのでそのまとめです. やってることは, クロスコンパイラを使ってpdp11のa.out-pdp11フォーマットの実行ファイルを作る. simhでそれを実行させてメモリ・レジスタの内容を確認する.(simhの仮想ディスクに実子ファイルを割り当ててブートする.) pdp11では基本的に8進で書かれることが多いので注意です. クロスコンパイラ binuitlsとgccは以下のものを使いました. OS Xでのインストール手順を貼っておきます. binuitls 2.23 gcc 3.4.6 $ wget http://ftp.gnu.org/gnu/binutils/binutils-2.23.tar.gz $ tar xvf binutils-2.23.tar.gz $ cd binuitls-2.23 $ ./configure --target=pdp11-aout --prefix=/hogehoge $ make $ make install $ brew install libmpc $ brew install gmp $ brew install mpfr $ wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-4.8.2/gcc-4.8.2.tar.gz $ tar xvf gcc-4.8.2.tar.gz $ cd gcc-4.8.2 $ mkdir work # 別ディレクトリから $ cd work $ ../configure --target=pdp11-aout --prefix=/hogehoge $ make $ make install $ pdp11-aout-acc hello....

November 16, 2013

debianパッケージメモ

とりあえず # display xrandr xrandr --output VGA1 -- mode 1280x1024 --right-of HDMI2 xrandr --output HDMI2 -- mode 1920x1080 # xfce apt-get install xfce4 apt-get install xfce4-goodies # ime apt-get install ibus-anthy apt-get install ibus-mozc ibus-setup # flash # add /etc/apt/sources.list # deb ftp://ftp.debian.org/debian stable main contrib non-free apt-get update apt-get install flashplugin-nonfree # git apt-get install git git config --global user.name "bobuhiro11" git config --global user.email "hogehoge@hoge.com" ssh-keygen # vim # for python support apt-get install vim-gnome # skype # download from http://www....

November 1, 2013

プレゼンツールrabbit

プレゼンをしたり,pdfを出力したりできる markdown又はRD jpeg,pngもそのまま埋め込み $ gem install rabbit $ rabbit-2.1.1/lib/rabbit/theme # テーマ一覧 $ rabbit sample.rd # 実行 $ rabbit -p -o sample.pdf sample.rd # pdf出力 # To run with it without system install. # % ruby -I./lib bin/rabbit -f sample/rabbit-implementation.rd # $Id$ = 第4回 UNIX V6 読書会 : subtitle 6章 シグナルの話 : author @bobuhiro11 : institution : theme clear-blue = PDP11/40 * ((*16bit*)) CPU (1Word = 16bit) * 物理メモリ((*256KB*))(2^18) * 18bitのアドレス * 仮想メモリ((*64KB*))(2^16) * 16bitのアドレス = PSW 15-14 現在のモード(00:カーネル 11:ユーザ) 13-12 以前のモード(00:カーネル 11:ユーザ) 5-7 プロセッサ優先度 4 トラップビット 3 Nフラグ 2 Zフラグ 1 Vフラグ 0 Cフラグ

November 1, 2013

Javaでスレッドの同期処理

同期処理の方法やデッドロックを防ぐ注意点など. 以下のような仕組みを持つものを,同期プリミティブと呼びます. (セマフォやモニタなど) 共有資源の排他処理 スレッドのwait,wakeup処理 モニタ javaでは同期プリミティブにモニタという仕組みを使っています. モニタとは,スレッド間で共有したいデータをメソッドなどで包んで そのメソッド内部でしか読み書きが出来ない状態にして, さらに同時に1つのスレッドからしか侵入出来ないようにしたもの. これで,モニタ内部のデータは排他処理ができるようになります. javaでは,共有データにprivate修飾子をつけ,メソッドにsynchronized修飾子 をつけることで,メソッド単位でモニタを実現できます. また,モニタを使って,条件の同期(condition Synchronization)を行います. javaにはスレッドのwait,wakeupに関して以下の3つが準備されているので, これを使います. public final void notify() オブジェクトを待っている1つのスレッドを起こす public final void notifyAll() オブジェクトを待っている全てのスレッドを起こす public final void wait() throws InterruptedException 他のスレッドに起こされるのを待つ.モニタに関連するSynchronizationロックはすべて解除. 起こされたら,実行を再開する前にモニタを再獲得しなければならない. 例えば,0からNまでの整数間を動くカウンタは以下のように実装します. Counter::inc()やCounter::dec()内では,if文の代わりにwhile文を使います. (if文だとwait()から起きたときに,再評価されないので眠っている間に変更されている可能性がある) いくつのスレッドが待っているか分からないときは,notifyAll()で起こします. (必要以上に待つのを防ぐため) public class Counter { private int count; private int N; public Counter(int max){ count = 0; N = max; } public int get(){ return count; } synchronized void inc() throws InterruptedException{ while(count==N) wait(); count++; notifyAll(); } synchronized void dec() throws InterruptedException{ while(count==0) wait(); count--; notifyAll(); } } public class IncRunnable implements Runnable{ private Counter counter; public IncRunnable(Counter c){ counter = c; } @Override public void run() { while(true){ try { counter....

October 25, 2013

Rubyの実装一覧のメモ

MRI(Matz’s Ruby Implementation) C言語で実装 本家 1.9.x以後,YARVを取り込む mruby 軽量版,組込み用 JRuby Javaで実装され,JVM上で実行 インタプリタ,JITコンパイル(デフォルト),AOTコンパイル JRubyからJava,JavaからJRubyを呼び出せる IronRuby .NET上で実行 .NETライブラリが使える MacRuby 0.5以前はVARV,それ以降はLLVM JITコンパイル,AOTコンパイル OSX上で動作 Rubinius 殆どrubyで実装 JITコンパイル(マシンコードへのAOTコンパイルは無理?) バイトコード用の仮想マシンはC++で実装 バイトコードからマシンコードはLLVM MagLev Smalltalk VM上で実行 Cardinal Parrot Virtual Machine上で実行 HotRuby javascriptとactionscriptで実装 ブラウザ上で実行 Topaz RPython(Pythonのサブセット)で記述 PyPy(Python -> 機械語のJITコンパイル)と同じ仕組み? Crystal ruby風文法 C言語の関数が呼び出せる JITコンパイル,AOTコンパイル(マシンコード)

October 24, 2013

GCM - Google クラウドメッセージング

GCMの使用を強いられたので,メモです. GCMはサーバからandroidアプリに対して, push通知を送る仕組み・サービスです. 2012/6/26に,公開されたようです. それ以前は,C2DMを使って実装していました. 簡単なサンプルですが,メモとして残しておきます. こちらに置いています. http://developer.android.com/google/gcm/index.html,http://www.kotemaru.org/2013/07/28/android-push-message.htmlから,一部引用しています. 仕組み Googleのサーバを,GCMサーバ 自身のサーバを,自サーバ と呼ぶことにします. はじめにGCMサーバから,端末のID( レジスタID )を取得する. レジスタIDを自サーバへ送信する. 自サーバから,レジスタIDを設定し,メッセージをGCMサーバへ送る. GCMサーバから各端末にメッセージが送信され,push通知される. 準備 まず,https://code.google.com/apis/console/から GoogleAPIを取得します. Service一覧から,Google Cloud Messaging for Androidのstatusをonにします. API ACCESSから,Create new Server Keyを選択し,API Keyを取得します. ここで,2つの情報を確認しておきます. API Key: 自サーバから,GCMサーバへメッセージを送信する場合に使う. Key for server appsに書かれています.“Jfdsah82…“のようなもの. Sender id: アプリから,自サーバへメッセージを送信する場合に使う.URLのprojectの後ろの数値です.“4352…“のようなもの. 1. クライアントの実装 古いですが,Google APIs 10で実装しました. はじめに,Android SDK ManagerからGoogleCloudMessaging for Android Libraryをインストールします.次に,{Android SDKディレクトリ}/extras/google/gcm/gcm-client/dist/gcm-src.jarを,プロジェクトに追加します.(srcディレクトリで右クリック => Archive Fileで追加できます) マニフェストファイル マニフェストファイルに以下のようにpermissionを追加します. BEGIN,ENDで囲ったところを追加してください. com.example.comのところはプロジェクトのパッケージ名に変更します. <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.gcm_reciever" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="10" /> <!...

October 22, 2013

セキュリティ・キャンプ2013

August 21, 2013

LSMについて調べてみた.(続き)

一つ前のエントリで動かなかったサンプルが,動くようになりました.カーネルパニックが起こっていたので,static int __init bobulsm_init(void)を中心に調べて行きました. 結局,security_module_enable()を呼び出していなかったのが原因でした.初期化の段階で既に読み込まれているかチェックするために,register_security(&bobulsm_ops)の前に呼び出さなければならないようです. カーネルパラメータにsecurity=bobulsmを追加する(grepの設定ファイルを修正,または起動時にshift押しっぱなし)と正しく動きました.mkdirが呼ばれる度に,メッセージが増えていく様子が確認出来ました. $ dmesg | grep bobulsm [ 0.000000] Kernel command line: BOOT_IMAGE=/boot/vmlinuz-3.8.8 root=UUID=b5af552c-3516-48dc-8175-b7ce91be3e60 ro crashkernel=384M-2G:64M,2G-:128M security=bobulsm [ 0.004045] bobulsm: registered surely. [ 0.170644] bobulsm: inode_mkdir called. [ 0.170664] bobulsm: inode_mkdir called. [ 0.170997] bobulsm: inode_mkdir called. 参考: https://www.kernel.org/doc/htmldocs/kernel-api/API-security-module-enable.html

July 5, 2013

LSMについて調べてみた.

LSMとは LSM(Linux Security Module)とは,kernel2.6から実装されたセキュリティフレームワーク.SELinuxやTOMOYO Linuxでも使われていて,チェックが必要な箇所でフックがおこり,登録されたコールバック関数が呼び出される. インターフェースの外から サンプルを書いてたんですけど,上手くいかなかったので,コピペはやめたほうがいいです. /* bobulsm.c */ static int bobulsm_inode_mkdir(struct inode *inode, struct dentry *dentry, umode_t mask) { printk("bobulsm: inode_mkdir called.\n"); /* Return 0 if permission is granted. */ return -EPERM; } static struct security_operations bobulsm_ops = { .name = "bobulsm", .inode_mkdir = bobulsm_inode_mkdir, }; static int __init bobulsm_init(void){ if (register_security(&bobulsm_ops)) panic("bobulsm: Occurred an error at register_security(&bobuhiro11lsm_ops).\n"); else printk("bobulsm: registered surely.\n"); return 0; } security_initcall(bobulsm_init); MODULE_DESCRIPTION("BOBULSM"); security_operations構造体に,イベントが発生した時にやらせたい関数を登録します.ここでは,ディレクトリの作成時に,呼び出されるように,inode_mkdirメンバにbobulsm_inode_mkdirを登録しました.これで,ディレクトリ作成時に,bobulsm_inode_mkdirが呼ばれるはずです. cd linux-3....

June 5, 2013