2011年12月21日 [長年日記] 編集
# [haskell]Haskell Advent Calendar 2011: 「簡約!? λカ娘(二期)」とHaskell製OSの紹介
突然でゲソが、コミックマーケット81に関数型の本が出るでゲソ。 みんな買ってほしいでゲソ。
第0章 クラスタリングしなイカ? 第1章 Copilot への希望と絶望の相転移 # <= コレ書いた 第2章 加速しなイカ?! 第3章 Java VM 上で tail call しなイカ? 第4章 関数型イカガール第 3 話 第5章 映画けいさん!
がもくじで、@master_qは第1章を書いたらしいでゲソ。 この章は Copilot というHaskellのDSLを使ったプログラミングの話でゲソ。 Copilotを使うとHaskellの中でDSLを使って作った設計が ライブラリ依存の少ないC言語ソースコードに変換できるでゲソ。
今日はどうして↑のような記事を書きたくなったのか、 という話をしようと思うでゲソ。
みんなこの日記記事をどんなOSの上で見ているでゲソ? Windows,Mac,Linux,FreeBSD,iPad,Android,BeOS,超漢字、そんなところじゃなイカ? そのOSはどんな言語で書かれているかもちろん知っていると思うでゲソ。 おそらくはC言語、良くてC++でゲソ。 (Java OSやLispマシンで見ている人はたぶんいないと思うでゲソ。) 設計者の願望としては、 できればもっと安全な言語でkernelや基盤ライブラリを設計したいところでゲソ。 よく考えてみて欲しいでゲソ。 アプリケーションはメモリ破壊を起こすとSEGVや動作不良を起こすだけでゲソ。 しかしkernelがメモリ破壊を起こしたらシステム全体が停止してしまうでゲソ! アプリケーションではなく、むしろkernelにこそ型安全が必要なんじゃなイカ。
じゃぁコンパイルも持っている関数型言語で作られたOSはないのでゲソ? その試みはあるんでゲソ。 今日はその中からHouse というプロジェクトを紹介するでゲソ。
まずはHouseがどんなものか見てみるでゲソ。http://web.cecs.pdx.edu/~kennyg/house/House.iso からcdromイメージをダウンロードして起動してみるでゲソ。
$ ls -l House.iso -rw-r--r-- 1 kiwamu kiwamu 3311616 1月 23 2009 House.iso $ qemu-system-i386 -cdrom House.iso
grubが起動したでゲソ。 。。。なんかgraphics modeとかいきなり書いたるでゲソ。 気になるからgraphics modeで起動するでゲソ。
うぼぁー!なんかウィンドウシステムが起動したでゲソ!すごいでゲソ! qemuのネットワークデバイスには対応してないみたいでゲソが、 telnetコマンドもあるでゲソ。
ところでこのHouseはいったいどこからどこまでがHaskellで書かれているんでゲソ? ソースコードのREADMEからひろう限りだと
------- C land
start.S | Load static, flat-memory GDT (segment descriptors)
| Initialize the memory to 0xCC (IA32 breakpoint instruction)
| Initialize the C stack
| Jump to c_start
c_start.c | Initialize PIC (IRQs 0-15 mapped to interrupts 0x20-0x2F)
| Initialize IDT (interrupt vectors)
| Initialize Haskell block allocator (MBlock_init)
| Pass control to the RTS
------- Haskell land
Main.hs | Start a console driver which handles a basic x86 text console
| Start a keyboard controller
| Start an idle thread
| Bind the keyboard and console driver to a simple Readline clone
| which allows shell-like interaction with the system
すごいじゃなイカ。 初期化以外はHaskellで書かれているでゲソ。
さっきのウィンドウシステム上でのプログラムはkernel/Gadgets にありそうでゲソ。 そしてkernel/userにはユーザ空間で動作するプログラムがC言語で書かれているでゲソ。。。
来年のお正月にはA Principled Approach to Operating System Construction in Haskellを読みながらHouseのソースコードをゆっくり読むのがいいかもでゲソー。
[2011/12/22追記] LighthouseとHouseの2つのプロジェクトについて文章の中でごちゃまぜに使っていたが、 @shelarcyさんから 「House をLightweight Concurrency Primitives for GHCを使って OS のスケジューラーを実装するよう改良したのが Lighthouse です。」 との指摘をもらって、"Lighthouse"という単語を全て"House"に置き換えた。
2011年12月07日 [長年日記] 編集
# [netbsd]カーネル/VM Advent Calendar 7日目: NetBSD bootloaderのカスタマイズとテスト手順
みなさんNetBSD使ってるでゲソ? NetBSDの海は美しいでゲソ。泳いでいるだけで幸せな気分になるでゲソ。 NetBSDにはlibsaのようなkernelのない場所でも使えるライブラリもそろっていて bootloaderでもallocなどが使えて楽チンでゲソ。 今日はNetBSD bootloaderのコンパイルとそのテスト手順について解説するでゲソ。 なにはともあれNetBSDのソースコードを入手するでゲソ。
$ pwd /home/kiwamu/src/netbsd/5.1 $ cvs -d :pserver:anoncvs@anoncvs.netbsd.org:/cvsroot login $ cvs -d :pserver:anoncvs@anoncvs.netbsd.org:/cvsroot co -r netbsd-5-1-RELEASE src $ cd src/
次にツールチェーンだけコンパイルしてPATHを通すでゲソ。
$ pwd /home/kiwamu/src/netbsd/5.1/src $ ./build.sh -m i386 tools $ ln -sf ~/src/netbsd/5.1/src/tooldir.Linux-3.1.0-1-amd64-x86_64/bin ~/tooldir_netbsd5.1 $ echo $PATH /home/kiwamu/tooldir_netbsd5.1:/home/kiwamu/bin:... $ which nbmake-i386 /home/kiwamu/tooldir_netbsd5.1/nbmake-i386
bootxxとbootをコンパイルするでゲソ。
$ pwd /home/kiwamu/src/netbsd/5.1/src/sys/arch/i386/stand/bootxx/bootxx_cd9660 $ nbmake-i386 $ cd ../../boot/ $ pwd /home/kiwamu/src/netbsd/5.1/src/sys/arch/i386/stand/boot $ nbmake-i386
これでNetBSD bootloaderのコンパイルが完了したでゲソ。 とりあえずqemu上で実行してみるでゲッソ!
$ pwd
/home/kiwamu/src/netbsd/5.1/src/sys/arch/i386/stand/boot
$ vi qemu.sh
#!/bin/sh
rm -rf cdrom bootxx_cd9660 boot.iso
mkdir -p cdrom
cp biosboot/boot cdrom/
cp ../bootxx/bootxx_cd9660/bootxx_cd9660 ./
qemu-img create boot.iso 16M
nbmakefs -t cd9660 -o 'bootimage=i386;bootxx_cd9660,no-emul-boot' boot.iso cdrom
qemu-system-i386 -curses -cdrom boot.iso
$ chmod +x qemu.sh
$ ./qemu.sh
>> NetBSD/x86 BIOS Boot, Revision 5.2 (from NetBSD 5.1)
>> Memory: 637/130048 k
Press return to boot now, any other key for boot menu
booting cd0a:netbsd - starting in 0 seconds.
> help
commands are:
boot [xdNx:][filename] [-12acdqsvxz]
(ex. "hd0a:netbsd.old -s"
ls [path]
dev xd[N[x]]:
consdev {pc|com[0123]|com[0123]kbd|auto}
modules {enabled|disabled}
load {path_to_module}
multiboot [xdNx:][filename] [<args>]
help|?
quit
>
うん。ちゃんと起動したでゲソ。qemuは偉大でゲソ! せっかくなのでなんかコマンドを追加してみなイカ?
$ pwd
/home/kiwamu/src/netbsd/5.1/src/sys/arch/i386/stand/boot
$ cvs diff -u
Index: boot2.c
===================================================================
RCS file: /home/kiwamu/cvs_mirror/NetBSD-CVSROOT/src/sys/arch/i386/stand/boot/boot2.c,v
retrieving revision 1.38.4.2
diff -c -u -r1.38.4.2 boot2.c
--- boot2.c 14 Feb 2010 14:01:08 -0000 1.38.4.2
+++ boot2.c 7 Dec 2011 06:00:35 -0000
@@ -134,6 +134,8 @@
void command_modules(char *);
void command_load(char *);
void command_multiboot(char *);
+void command_fib(char *);
+void fib(int, int, int);
const struct bootblk_command commands[] = {
{ "help", command_help },
@@ -146,6 +148,7 @@
{ "modules", command_modules },
{ "load", command_load },
{ "multiboot", command_multiboot },
+ { "fib", command_fib },
{ NULL, NULL },
};
@@ -860,3 +863,36 @@
printf("boot returned\n");
}
+void
+fib(int n, int f1, int f2)
+{
+ int f3;
+
+ if (n <= 0) {
+ return;
+ }
+ n--;
+
+ f3 = f1 + f2;
+ printf("%d\n", f3);
+
+ fib(n, f2, f3);
+}
+
+void
+command_fib(char *arg)
+{
+ int num;
+
+ num = atoi(arg);
+ switch (num) {
+ case 0:
+ return;
+ case 1:
+ printf("0\n");
+ return;
+ }
+ printf("0\n1\n");
+
+ fib(num - 2, 0, 1);
+}
$ nbmake-i386
$ ./qemu.sh
>> NetBSD/x86 BIOS Boot, Revision 5.2 (from NetBSD 5.1)
>> Memory: 637/130048 k
Press return to boot now, any other key for boot menu
booting cd0a:netbsd - starting in 0 seconds.
> fib 10
0
1
1
2
3
5
8
13
21
34
>
ちゃんとコマンド追加されてるでゲッソ。 NetBSDの海は楽しいじゃなイカー。
[修正: 2011/12/08]
* @h_kenkenさんから「libsa に malloc は無い気が。。。alloc はありますが。」 との指摘を受けて、s/malloc/alloc/
2011年11月14日 [長年日記] 編集
# [haskell]第4回 スタートHaskellに参加してきました
Programming Haskell Chapter8 (@ruiccさん) と 対話プログラム (@Lost_dog_さん) に今回の資料が置いてあるみたいです。 また、今回の演習問題のソースコードやテストコードは yuzutechnology/Community-StartHaskell2011 - GitHub にあるので、いつでも参照できます。
今回、特に参考になったのが@ruiccさんの資料です。 プログラミングHaskell という本で急激に難しくなる8章について、非常にわかりやすい解説が聞けました。 なかなかあそこまで図示によって解説できる人はいないのではないかと思います。 頭の中がすっきりした気分になりました。
今回の生放送はjustin.tvで配信しました。 やはりustreamよりも圧倒的に楽です。 録画は スタートHaskell#4-1 から#4-4まで撮りました。 写真はいつも通り Flickr: start_haskell にまとめてあります。
2011年11月02日 [長年日記] 編集
# [haskell][gui][carettah]下北沢オープンソースCafeでCarettahの使い方を発表してきました
Haskellのライトユーザを増やしたいなーと思って、 下北沢オープンソースCafe - Haskell Jelly! #30 に参加してきました。
オープンソースCafeでは毎週水曜日にフリーランスの方々があつまって、 おのおのの仕事を同じカフェでやってるみたいです。 お洒落空間です! 土曜日にはハッカソンをやってるみたいなので、 やる気を注入したい方は行ってみると面白いと思います。
ぼくは自作プレゼンツールの Carettah の使い方の説明と、Haskellでのプログラミングについて素人なりにアピールしてきました。楽しさが伝わったらよいのですが。。。
あと、フリーランスで仕事をされている方はtwitterよりもfacebookに多く出没するんだなーという実感も収穫でした。
2011年10月23日 [長年日記] 編集
# [haskell][debian]筑波大でHaskellとDebianについて発表してきたよ
第81回 東京エリア Debian 勉強会@筑波大学 にて、以下の内容で発表してみました。 ちょっと詰め込みすぎたかもしれないです。。。
* Haskellの紹介 * cabalの使い方 * cabalの問題 * HackageのDebianパッケージ化手法 * DebianパッケージをDebianプロジェクトに登録する手順
プレゼン資料はこちら。
2011年09月14日 [長年日記] 編集
# [ustream][justintv][ffmpeg]ffmpegを使った動画配信について(もしくはjustin.tvのすすめ)
最近勉強会に参加することがあり、その度にustream動画配信をやってきました。 手持ちの環境はDebianなのと貧乏なのでwebcamで配信していたこともあり、 動画の画質が低く、ご迷惑をかけていました。
どうもffmpegを使えばwebcamでも高画質配信できるらしいという話があって、ずーっと気になってました。
のようなスクリプトを書くことで/dev/video1に見えるwebcamをH.264形式で動画配信できるみたいです。(ustream対応版はURLが違うだけなので割愛)
しかし IEEE1394カメラとたった一行でUstream.tv高画質配信できた での指摘の通り2分ぐらい動画配信しているとffmpegが落ちます。 調べてみるとav_interleaved_write_frame()関数を呼んだ後にSIGBUS終了しているようです。 ffmpegの中でSIGBUS起きた場合の復帰処理は入ってなくて、 仮にSIGBUSを無視してもエラーメッセージを表示してexitしてしまいます。 (それでいいのかな。。。)
念のためwiresharkしてみると、、、
はい、見事にFIN,ACKパンチをサーバ側からくらってます。
ffmpegがずーとcloseされちゃってるポートにwriteしまくって、しまいにはRSTパンチがサーバから連続して来ます。
念のためFIN,ACKパケットをフィルタしてみました。
で、これは「貧乏人はustream動画配信とかモテなことはするな」ということなのかなーと思っていたら Broadcasting using x11grabr and ffmpeg on Justin.tv or Ustream のような記事を見つけました。justin.tvでも同様にffmpegで配信できて、しかもffmpegを起動するだけでwebブラウザからスタートボタン押下なしに配信開始するみたいです。 で、ffmpegでjustin.tv動画配信してみたら、FIN,ACKされないじゃないですか!
以上「ustreamはクソ。justin.tv最高」などと中二病っぽい記事をお送りしました。
2011年08月10日 [長年日記] 編集
# [haskell][xmonad]XMonadの設定例
XMonadに移行する際にやりたかったのは。。。
* 電源コード繋ってない時にノートPC閉じたらサスペンド * 電源コード繋ってる時にノートPC閉じたら画面だけ暗く * skype,uim,音量などの操作をappletでやりたい * xsessionなどウィンドウマネージャ以外の場所になるべく設定を分散しない
ということでした。それ以外GNOMEの機能はほとんど使っていなかったです。 で、どうやら Xmonad/Config archive/John Goerzen's Configuration が自分が欲しい設定に近いようでした。
まずxmodmapを設定して、capslockをctrlキーにします。
それからxmobar(デスクトップの一番上に出ている文字列表示)を設定します。 日付表示を日本っぽくしています。それから表示幅を画面の80%にして、 残り20%をtrayerのために空けておきます。
最後にXMonadの設定。 main関数の最初の方で trayer,gnome-power-manager,gnome-volume-control-applet,nm-applet,xmodmap,xmobar を起動しています。 trayerはgtk appletを画面右上に表示してくれます。 gnome-power-managerを起動しておくと、サスペンド移行がgnomeっぽく。 nm-appletはネットワーク接続を自動検出。 その他、skype,dropbox,uimなどもtrayerにappletアイコンを出してくれます。
あとは @pi8027さんのプレゼン資料(pdf) を見て、色々用意されているLayoutを試してみたいところです。
2011年08月08日 [長年日記] 編集
# [book][haskell]同人誌「λカ娘」に記事を書きました
ぶっく@C80 - 参照透明な海を守る会 からサンプルpdfがダウンロードできます。 面白そうだったら コミケ二日目YUHAブース に来ていただけるとうれしいです!
中身を解説しますとイカ娘っぽい Haskell 本です。 目次は以下のような感じ。結構ガチな記事満載です。
0: 関数型イカ娘とは! 1: β簡約!λカ娘 2: 数をつくらなイカ? 3: 関数型イカガール 4: 加速しなイカ? 5: OSを侵略しなイカ? #<= この記事を僕が書きました
個人的に一番面白いと思う記事は「4: 加速しなイカ?」です。 HaskellでGPGPUする話でして、ベンチマークまでしています。 さあCUDAに勝てるのか?はたまた、汚れた海のままなのか? そして記事の最後には、、、、、、!という感じです。
2011年07月25日 [長年日記] 編集
# [haskell]第0回 スタートHaskellでLT発表してきました!
160人もあつまって盛況でした。 先生役をひきうけてくれたTravisさんの丁寧な解説がよかったと思います。 LTをやることで、色々な人がHaskell界隈にはいるんだというアピールにもなったのではないでしょうか。
当日の雰囲気は↓を見てみてください。
- 当日の写真
- ustream録画 - @takatayoshitakeさんありがとうございます!
- ぼくのプレゼン資料 - ちゃんとDebian宣伝したよ!
次回からはもっと皆で議論しながら学習できるような場になるといいですね。 わからないところを質問しあうことで上達がはやくなると思います。





_ masterq [JoachimからメールがあってDDやDMでなくても "> [Q2] Can the person as not ..]
_ masterq [JoachimからメールがあってDDやDMでなくてもpkg-haskellチームになれるそうです!]