詳細を見る"よい子のためのFLOSSまんが"「うぶんちゅ!」の今回は、テクニカルなオチで来た。巻頭特集「重大トラブル完全レスキュー」は、ありがちなトラブルを徹底的にシューティング。標準ディレクトリの解説など、「はじめてのコマンド&端末入門」ともども、比較的地味だけどいざというときに役に立つことを解説している。「自分だけのUbuntuを自作する」は、あの「萌え☆彡OS」を題材に、UbuntuのカスタマイズCD作成を紹介。あと、「10.04LTSアーリープレビュー」で、Firefoxのバージョンが固定されなくなることを知った。第3・4章は、Linuxサーバーの動作状況を確認する基礎を解説している。松信さんの「MySQL完全理解への道」の今回は、比較的いじる可能性が多いという設定パラメータを解説。Jagielskiのインタビューとか、Emacsのちょっと便利なライブラリの紹介とか、ちょっと尖ったリバースプロキシVarnishの紹介とか、Firefoxのネットブック向けカスタマイズとか。詳細を見る「軽蔑いたす。詳細を見る本書でClojure言語を面白く学んだ。書籍としても、日本語がこなれていて読みやすい。Clojureは、JavaVMで動くLispで、変更不可能(immutable)なデータによる並行関数型言語だそうな。言語仕様の組み合わせはもちろん、それ以上に割り切りのセンスがいいと思った。よーし、GAE/JでClojureとcompojureを使って並行処理をキメちゃうぞ、とか思ったけど、GAE/Jではスレッドを作れないのであった。Lispとか)との差分について部分的に写経したメモ。sidにパッケージがある。clojure依存関係で、openjdk6等が入ってなければ入る。関数とか値とか関数はdefnで定義。仮引数はリストじゃなくてベクタ。3)4束縛自体もvarという型の値。hoge)で参照できる。lambdaじゃなくてfn。この場合、引数は1つなら%、複数なら%1、%2...。5)8値はdefで定義。3)4シーケンス、遅延評価carとcdrのかわりにfirstとrest。c)リスト以外の「シーケンス」なデータ型も同じように扱える。\c)シーケンスとして抽象化された値(上の返り値など)をREPLが表示するときには、仮にリストとして見える。シーケンスは遅延評価。iterate関数は第1引数の関数を順に適用した無限シーケンスを返す。takeは先頭からn個の値を返す。3)ちなみに()とnilは別。nil)false制御構造的なナニカcondはカッコのレベルが1つ少なく、条件と評価する式の交代リスト。関数型なので暗黙のprognは不要ということか。'high)highprognやbeginに相当するのはdo。Clojureではdoほげほげという名前は副作用を意識したものにつける慣習らしい。2)2「..」は、値を順番に関数の引数にする。Haskellの$みたいというか、アナフォリックマクロ的なことをメソッドチェーンやパイプ風にやるマクロ。(first))aloopとrecurは、無名の名前付きlet(?)というところ。3)6loopなしだとrecurは関数自身の再帰に。3)6Clojureでは関数は末尾再帰などの最適化はしないが、recurなら最適化する。VMで実行しやすいようにとか。再帰やループよりシーケンスを使うのがClojure流、ということらしい。forは制御構造ではなくシーケンスの内包表記。15)シーケンスは遅延評価なので、下のprintlnはhogeの値がREPLなどに参照されるまで実行されない。n)))#'user/hogeすべての評価を強制するには、値が必要ならdoall、不要ならdorun。n))))12#'user/hogeマップ型、セット型ほかの言語でハッシュとかハッシュテーブルとかディクショナリとか呼ぶデータ構造は、closureではマップ型。52})#'user/mClojureでは「,」は空白なので、こう書いても同じ。52})#'user/mちなみに、構文クォート(準クォート)では「,」「,@」のかわりに「~」「~@」を使う。マップ型は関数として参照できる。:foo)51RubyとかPythonとかにあるようなセット型もある。4)nilメタデータオブジェクトにはメタデータというデータを付けられる。21}本書の本文では^fooという表記(リーダーマクロ)が使われているけど、訳注にもあるとおり古い仕様なので、使うと警告が出る。21}関数定義などのvarにdoc-stringや型定義を付けられる。1"}JavaとのつながりClojureのデータ型はJavaのクラスと一対一対応。Javaの標準クラスで表現できるものは表現する。"abc")java.lang.StringJavaのメソッドの呼び出し。"abc")"ABC"new。(java.util.Random.))#'user/rndstaticメソッド。(Math/PI)3.141592653589793マルチメソッド総称関数。defmultiで名前とディスパッチを定義し、defmethodで処理を実装する。string"上の「class」は単なる判定関数。型以外の条件でも分岐できる。Lispのスペシャル変数に相当するのが、スレッドローカルな束縛。変数を定義だけしておく。b)#'user/b次に自由変数を参照している関数を定義する。b))#'user/hogeこの関数をletから呼び出すと、レキシカルスコープなのでエラーになる。(NO_SOURCE_FILE:0)letと同じ書式でbindngを使うと値が渡る。let同様、bindingの外では使えない。(hoge))8スレッドローカルな束縛はset!で値を変更できる。推奨されない、最後の手段らしい。7)(hoge)))12値を共有するためのナニカClojureでは原則、データは変更不可能(immutable)。マップに追加するには、元のマップに値を追加した新しいマップを作ることになる。fuga)falseたいていは困らないけど、複数のスレッドなどから同じデータを参照したり操作したりする場合には困る。いうときにはatomとかrefとかを使う。元のデータを参照するオブジェクトを間にはさんで間接参照し、新しい値をそのatomやrefに登録しなおす感じ。そのatomとかrefとかを共有すれば、同じデータを参照したり操作したりできる。foo)または@foo。1}参照先を変更するには、atomではreset!。5}refではref-set。refの参照先を変更するにはdosyncでロックをかける必要がある。1}refのほうが手間は増えるけど、dosyncにより複数のrefを整合性を保って更新できる(STM)。加藤元浩氏のミステリ漫画がまたまた同時発売。あいかわらず高レベルをキープしていて、楽しんだ。以下、ネタバレは含まないように注意してるつもりだけど、念のためご注意を。詳細を見る「Q.E.D.」35巻は、「二人の容疑者」と「クリスマス・プレゼント」の2編を収録。「二人の容疑者」は、ビジュアル伏線にやられた。「クリスマス・プレゼント」は、ミステリー同好会をからめた学園祭ドタバタコメディーで、ラストでにっこり。詳細を見る「C.M.B.」13巻は、「夏草」「霧の山荘」「アサド」「オルゴール」の4編を収録。純粋な本格ミステリじゃないけど、いずれもアッと言わせる展開が印象的。あと、「夏草」は何か遠くを見た気分にさせ、「霧の山荘」は切ない。詳細を見る特集が「Linuxで蘇る中古パソコン」で、定番の記事だなあと思って読んだら、第2部の1万円台の中古ノートPC編が面白かった。ディスクI/Oを中心に、地味で地道なパフォーマンスチューニング(いわばファインチューニング)が解説されていて、参考になる。|軽量MTA「esmtp」を試してみた家庭LAN内で動かしているLinuxサーバーで、cronとかのデーモンが出すメールを受け取ろうと思いました。LinuxのMTAというと、Postfixやsendmail、あるいはqmailやexim4などが使われています。デーモンからのメールをマシン内でローカルに受け取るだけだし、送信頻度も高くないので、ちょっと大袈裟な気がします。そこで、esmtpを試してみました。esmtpって?esmtpは、ローカル配送はprocmailなどのMDAに丸投げ、外部への配送は外部サーバーにSMTPで丸投げ(スマートホスト)、という簡易MTAです。/etc/aliasesも、いまのところ使えません(Roadmapには載っている)。そのぶん小さいのが特徴です。インストールDebian、Ubuntu、Fedoraなどにはパッケージがあります。CentOSならEPELで。以下、Debianの例。本体のesmtpと、sendmail互換インターフェイスのesmtp-runの2パッケージに分かれています。procmailデーモンはなく、SMTPポートもリッスンしていません。/usr/sbin/sendmail"みたいなことをやるパッケージのようです。試す自分宛のメールを送ってみます。mail.txtemasakaにメールが届きます。mail.sendmailの標準にインターフェイスを合わせているので、/usr/sbin/sendmailや/usr/lib/sendmailを呼んでメールを出すデーモンやらMUAやらであれば、メールを送れます。/usr/bin/mailqや/usr/bin/newaliasesもあります。newaliasesは機能しないダミーです。root宛のメールなどを自分のメールボックスにすべてのメールを自分のメールボックスに集約するには、aliasesが使えないので、procmailでこんな(↓)ふうに設定すればいいのかな(危険はないか、教えてえらい人)。/etc/procmailrc:0/var/mail/emasakaなんかprocmailの意味がないような気もしますが。設定ファイル設定ファイルは/etc/esmtprc(全体設定)または~/.esmtprc(個人設定)。~/.esmtprcのパーミッションは710またはそれより厳しい値(600とか)にしておかないと警告メッセージが出ます。外部にメールを送るには、設定ファイルでSMTPサーバーを指定します。AuthやTLSにも対応しているようです。実験は面倒なのでパス。procmail以外のMDAに変えたいときも、設定ファイルで指定します。デフォルトは以下のとおり。%T"まとめesmtpを使うと、常駐デーモンなしでローカルのメールを配送できます。aliasesは欲しいところです。Labs勉強会でPlan9の話を聞いてきたGREEで開催されている「オープンソーステクノロジー勉強会」で、Plan9の話をやるというので聞いてきました。GREEとPlan9という組み合わせはちょっと不思議でしたが、GoogleのGo言語からの流れなのかもしれません。Plan9のお話:高野(@oraccha)さん産総研の高野さんが、Plan9について解説しました。Plan9は、オリジナルUnixを作った人たちがその後に開発したOSで、「UnixよりUnixらしい」のを目指しているそうです。ちなみに、開発メンバーのほとんどはGoogleに行って、Go言語とかを作ってるようです。Plan9の特徴は「すべてがファイル」であること。ネットワークやウィンドウシステムなどもprocfsやsysfsのようにファイルとして見えるそうです。ネットワークアドレスや共有メモリなどは例外だそうです。/dev/screenを読めば画面全体のスクリーンショットがとれるし、/dev/windowを読めばそのプロセスのウィンドウのスクリーンショットがとれる、というのを実演していました。ファイルの名前空間はプロセスごとに分かれているので、/dev/windowがそのプロセスごとに違うそうです。ネットワークも同じで、コネクション1つがディレクトリとして見えて、その中にdata(データの読み書き)とかstatus(状態)とかremote(接続先のIPアドレスとポートが読める)とかが見えてました。接続するときは、/net/tcp/cloneに書き込むと新しいコネクションが作られるそうです。192.168.0.1:80そのため、ネットワーク用のシステムコールはなく、通常のopen、write、closeを使うとのこと。ioctl()もなくて、listen()でブロックする仕様。ラッパーとしてCライブラリも用意されていて、GoのGoのdial()はそのライブラリ由来だとか。高野さんは、「Unixカーネル=I/O多重化装置」「Plan9カーネル=サービスの多重化装置」とまとめていました。最近はスタンドアロン版もターミナル+fossil(ファイルサーバー)ファイルの内容のSHA1がIDにプロセスのリターンバリューは整数じゃなくて文字列(emasaka注:シグナルも整数じゃなくて文字列らしい。GeneでもPlan9が動いてるSheevaPlugでPlan9が動いた!質疑応答で、Plan9にはselect相当のものやノンブロッキングreadがないらしいけど、どうやってネットワークプログラミングをするのでしょうか、と質問してみました。質問がわかりづらかったようですが、懇親会で高野さんと話したところによると、selectがなくてすべてマルチスレッドで処理するモデルという回答でした。Limbo/Infernoのスレッドは並行処理ではなくてコルーチンのようなものだけど、I/O待ちでコンテキストが切り替わるので、そのあたりをうまく処理できる、のだそうです。スレッドやGoroutineは相互にChannelの読み書きで通信するので、そのあたりもコンテキストの制御モデルに合っているようです。軽快なPlan9:斎藤(@go_vm)さん筑波大の斉藤さんは、「みなさん今日帰ってPlan9をインストールすると思いますがw」という言葉を枕に、仮想化ハイパーバイザーのKVM上でPlan9を動かした話を紹介しました。前半は、同人誌「軽快なPlan9」の話。研究室でPlan9が流行って、なぜかGlendaのぬいぐるみを作った人もいたとか。ビッグサイトのイベントに出店したところ、3時間すこしで50部完売したそうです。若い人よりはおじさんが興味を持ったようで、「マネージャーに買ってこいと言われたので...」という謎のお客さんもいたとか。後半はその内容の紹介。実はPlan9というよりKVMのほうを中心としたネタだそうです。KVM上でPlan9を動かしてみたけどネットワークが使えない。そこで、ホストOSに通信処理を丸投げするようにKVMを改造したのだそうです。具体的には、ゲストマシン側でCPUのVMCALL命令を実行してKVMに制御を移し、ホストマシンのコンテキストでソケットを開いて、そのデータをゲストマシンに書き込む、という荒技だそうです。名付けて「VM床抜き」。これでPlan9からインターネットにアクセスして操作方法を調べられる、というオチで締めました。詳細を見る村井純さんが、いまのインターネットの主にインフラ面で動いていることを、教科書的に総括している本。村井さんのビジョンってぶれてないなあ、とか、村井さんのビジョンに世の中が追いついてきたのかな、とかそんな感想。中国がらみの話は、ちょっと考えさせられた。「カタリベ」みたく主人公が空回りするストーリーになると、より自分の好みかも。関数型言語shの文法一覧です。他の関数型言語をある程度知っている人がこれを読めば、shの基礎をマスターしてshを書けるようになっています。以下、Clojureあたりを想定して説明します。注意:これは基礎文法最速マスターねたのパロディです。動作は本物ですが、意味はコジツケです。REPLshの処理系は、POSIX準拠のUnix系環境であれば標準で用意されています。REPLを起動するには、shを実行します。shすると、プロンプトが表示されます。$shのほかに、REPLに行編集機能を付けたbash・zsh・tcshなどもありますが、ここでは割愛します。REPLとして使うほかに、あらかじめ用意したスクリプトをshで実行することもできます。hogeシーケンスshの扱うデータは、すべて、ある単位(ラインと呼びます)のデータが並んだシーケンスです。seq関数(Linuxで使えます)は、指定した範囲の整数が並んだシーケンスを返します。3123厳密には、シーケンスはfdというモナド(って何?)のようなものにくるまれています。REPLは、式を評価して得られたシーケンスをfdから受けとり、1ライン1行で表示します。関数の返す値をほかの関数に渡す関数の返す値をほかの関数に渡すには、"|"を使います。212head関数は、渡されたシーケンスの先頭からn要素を取り出す関数です。反対に、tail関数は、渡されたシーケンスの末尾からn要素を取り出す関数です。39899100シーケンスを結合する関数の返すシーケンスと、別の関数が返すシーケンスを結合するには、";"を使います。12101112注意が必要なのは、";"は"|"より優先順位が低いことです。";"を優先するには"{}"で囲みます。312102つ目のseq関数の後にも";"が付いていることに注意してください。これは、シーケンスの末尾との結合を意味します。"()"で囲む方法もあります。"()"の場合は、2つ目のseq関数の後に";"は付きません。"()"の場合は、全体が新たなシーケンスを意味するためです。関数が返すシーケンスは、すべて計算されてから次の関数に渡されるのではなく、必要な部分だけ計算されます。yes関数は無限に続くシーケンスを返します。101010101010(以下略)これを上記のhead関数に渡すと、yes関数の計算が終わってから(つまり無限時間後に)head関数に渡されるわけではなく、必要な値だけが渡ります。新たに関数を定義するには、以下のように書きます。foo101010この"{}"は、「シーケンスを結合する」で解説した"{}"と同じものです。そのため、"()"で定義することもできます。foo101010いわば、シーケンスの一連の処理に名前を付けたものといえます。オプションは"$番号"で参照します。3123mapmap相当の処理は、以下のように書きます。nがnへの値の束縛、doが処理の開始、doneが処理の終端に当たります。$((~))は数値演算してその値を取り出す操作です。echoは値を返す操作を意味します。doの前やdoneの前の";"は、"{}"と同様にシーケンスの先頭や末尾との結合を意味します。この場合の";"はwhileの中のものとみなされるため、"|"より優先されます。内包表記シーケンスを作る内包表記には、forを使います。条件が真のときと偽のときとで値を変えるには、以下のように書きます。44"[]"が条件、"&&"の後が真のとき、"||"の後が偽のときです。再帰seqのように無限に自然数列のシーケンスを返す関数naturalは、再帰を使って以下のように書けます。501234高階関数、クロージャ関数や無名関数を、関数の引数に渡すこともできます。'Helo'"Heloevalは、渡された関数や無名関数を呼び出すことを意味します。Lispでいうapplyやfuncallに相当します。$n"として渡された中の"$n"には、呼び出し先の環境ではなく、呼び出し元のレキシカルな環境での値が束縛されているわけです。funarg問題を解決したクロージャですね。Byb0nerAppendixemasakaフリーター。