「宗像教授異考録」第13集
歴史研究(?)マンガの新作。宗像教授自身の過去にまつわる「源氏物語昆虫記」と、火山ネタの「赤神 黒神」という、最近の2つの路線を一話ずつ収録。
元ネタリストは、ネタバレなので「続きを読む」で。
「無限の住人」26巻
牙を持たぬ人間の…「貧者の刃」
山の民の対決。
TokyuRuby会議02でLTしてきました
Rubyイベント(飲み会?)のTokyuRuby会議02に参加して、LTしてきました。
ちょっと前に試作したReadRhineネタです。プレゼン中にもあるように、ひさしぶりに動かしてみたらバグが出て、会場で直してたりしました。
ちなみに、タイトルスライドで使ってる手書き風フォントは「Y.OzFont」、本編の下のほうで字幕風に使ってるフォントは「てあとる16フォント」です。
「Software Design」2010年6月号
技術評論社
特集がUbuntu 10.04。UpstartやUECまでしっかり解説してるところがUbuntu Magazineとの差別化か。Ubuntu Monthly Reportとか、Netbook Editionの人のインタビューとかあって、Ubuntu色が強い号。
あと関数型言語。第3特集は、第4章の「手続き脳と関数脳の違いを知る」が面白かった。なんというか、関数型らしからぬ紆余曲折っぽい感じが参考になる。ほか、dankogaiさんのエッセイがいきなりチャーチ数とYコンビネータだったり、Emacs連載がなぜかYコンビネータを含むλ計算だったり。関数型以外でも、Konoha連載がCPUの分岐予測やlikelyの話だったり、JavaScript連載がWeb Workersだったりと、言語系のちょっと突っ込んだ話がいろいろ。
「日経Linux」2010年6月号
なぜかUbuntu 10.04のレビュー記事を2pだけ書きました。β版の時期に書いたので、ごく一般的な話です。
第103回カーネル読書会でLinux Collaboration Summitの話を聴いた
第103回カーネル読書会に参加してきました。今回のお題は、サンフランシスコで開催されたLinux Collaboration Summitの参加報告。(なぜか)トレーサー技術関係の方々が中心にスピーカーになって話してくれました。
あと、Cerevoの中の人が来て、ちょうど同じ日に発表された「CEREVO CAM live!」でUstream中継してくれました。
このへんの参加報告は後で重要になるキーワードが出てくるので、とりあえずメモ。
杉田さん
- Linux Collaboration Summitとは
- 2010.4.14-16
- 招待制
- 500名
- Googleが「FORK YOU」Tシャツを配ってた
- Nexus Oneも全員に
- キーノート
- 一部はLinux Foundationがビデオで公開
- Jim Zemlin
- 最近の状況
- MeeGoなど
- IBMのVPのDan Frye
- IBMのOSS/Linuxへの取り組み
- 活動の歴史
- NokiaのVPのAri Jaaksi、IntelのImad Sousou
- MeeGo(別々にそれぞれ)
- GoogleのChris Dibona
- GoogleのOSSの取り組みを紹介
- コミュニティへの歩み寄りか?
- トレーシングセッション
- ftrace、ftrace、kprobes、LTTng、uprobesなど、各種トレーサのメンテナが参加して発表、議論
- Ericssonのテレコム向けシステムワイドトレース機能
- トレースデータのフォーマットを統一しようという提案。これからMLで議論
- 2000年前半はトレーサ苦難の時代
- カーネル2.4
- LKST、LTT:upstreamで不採用
- LTTを軽量化してLTTng、採用を働きかけている
- LTTngの要素が由来のtracepointがupstreamで採用。原形なし
- LKSTのチームはSystemTapプロジェクトと合流。Kprobesがupstreamで採用。その流れででてきたuprobesは苦戦中
- ftraceはupstreamで採用
- Perf tools:採用
- LINUXCON Japan 2010
- 9/27-29
- ボランティア募集中
- (よしおか)LKSTが採用されなかった理由は、今どう思うか
- (杉田)カーネルのいろいろな部分に影響がある大きなものを、完成してから出した。反省をふまえ、今は調整しながら完成させていくようにしている
よしおかさん
- IBMのキーノートがすごかった
- ツールチェーンの話
- gcc、gdbなど
- ptraceがイケてないのでutrace、とか、じゃLinusをどう説得するか、とか
- gccは進化してる
- リンク時最適化とか、プロファイルベースの最適化とか
- gdb
- 性能改善、C++/Pythonのサポート
- face to faceとオンラインの両輪で話が進む
加藤(楽天)さん
- Solarisの人が見たCollaboration Summit
- 基調講演
- Linux Kernel What's Next
- カーネルメンテナーのパネルディスカッション
- カーネル開発者の高齢化。Solarisも同じ
- ドキュメントの整備が課題
- wifi driver (Broadcom) がLinux標準に組み込まれていない
- ユーザー空間とカーネル空間の両方をトレースする(DTraceのような)はないか、という質問
- Ftrace、LTTngなど多くのプロジェクト
- プロジェクトは統合しない、という答え。Solarisと違うアプローチ
- Linux Kernel What's Next
- Tracing Session
- Ftrace
- うまくできていると思った
- ユーザーフレンドリー。変数をかえるだけでデバッグをオンオフとか
- カーネルにデフォルトで入っている
- オンにするとトレース情報をリングバッファに格納。APIで情報を取得
- オーバーヘッドが少ない
- debugfsをマウントして、命令を書き込む
- 面倒なのでtrace-cmdツールがある
- trace.datファイルを読み込む
- big endianでもlittle endianでも
- Ftrace
- Filesystem Session
- ATA 4KiBセクタサイズの問題
- アラインメント
- 2.6.32で修正済み
- Filesystem Panel Discussion
- 新しいデバイスへの対応(SSD、Fusion I/Oなど)
- 巨大データの話
- HPCCで取り扱うファイルシステム
- ATA 4KiBセクタサイズの問題
- Solarisの人から見て
- 開発スピードが速く、多くのツール
- 複数企業が貢献
- トレーサーツールに期待
- 資源管理がしっかりしている
- Solarisにしかないかと誤解していた
- チューニングパラメータがいっぱいあってチューニングしがいがあるOS
- そこでトレーシング機能が有効
安井(楽天)さん
- カーネルの開発者からカーネルのユーザ、ベンダまで交流する場
- サーバー系だけじゃなくてデスクトップ系やモバイル系も
- MeeGoのセッションに人が集まっていた
- キーノート
- Jim Zemlin
- お金の使い方が変ってきている
- ハードからサービスへ
- そこでオープンソース
- お金の使い方が変ってきている
- クラウドのパネル
- 定義が広すぎて話が発散w
- 「コミュニティを妨害する方法」というキーノートw
- クローズディスカッション
- 沈黙を守る
- など
- Jim Zemlin
- クラウド
- 自動車のフォードはスケーラブルだから大きくなった
- スケールする企業が大きくなる
- プロプラはライセンスがスケールしない
- そこでオープンソース
- RedHatのDeltacloudプロジェクト
- RESTでいろいろなサービスをサポート
- jclouds
- Deltacloudと同じような感じだがストレージに強い
- Virtualzation
- 13%程度のコスト削減になっている
- OpenVZ
- ネームスペースにIDがない
- virtio
- Filesystem
- Fusion I/OやSSDに対応するファイルシステムはどれがベストか
- 検証が必要
clj-gae-blankでClojure + GAE/J
引き続きTokyo.clj #2メモ。makingさんが、GAE/J(Google App Engine for Java)を使うためのライブラリ群と、それを使ったサンプルclj-gae-blank(名前に反して簡易ゲストブック)を公開しているので、中身を調べつついじってみる。
とりあえず動かす
必要なもの
- Java
- Leiningen
- GAE-J SDK
プロジェクトをダウンロードしてリネーム
$ git clone http://github.com/making/clj-gae-blank.git $ mv clj-gae-blank gb $ cd gb $ mv src/clj_gae_blank.clj src/gb.clj $ mv src/clj_gae_blank src/gb
project.cljを編集
名前だけ変更。
(defproject clj-gae-blank "0.1.0-SNAPSHOT" :description "a blank project for clojure on GAE" ↓ (defproject clj-gae-blank "0.1.0-SNAPSHOT" :description "guestbook by clojure on GAE"
:namespaces [clj-gae-blank]) ↓ :namespaces [gb])
war/WEB-INF/web.xmlを編集
「clj-gae-blank」と「clj_gae_blank」を「gb」に。
src/gb.cljの中身と編集
メイン処理のソース。名前だけ変更。
(ns clj-gae-blank ↓ (ns gb
[clj-gae-blank hello guestbook])) ↓ [gb hello guestbook]))
ちなみに、こんな感じ(↓)でCompojureでURLルーティングしている。
(defroutes app (GET "/greet" req (greet req)) (GET "/*" _ (hello))) (defservice app)
Compojureのこのへんの仕様は変更が激しそう。
src/gb/hello.cljの中身と編集
表示のアクション。hiccupを使ってHTMLを生成している。名前だけ変更。
(ns clj-gae-blank.hello ↓ (ns gb.hello
[clj-gae-blank.guestbook] ↓ [gb.guestbook]
src/gb/guestbook.cljの中身と編集
投稿のアクションと、データストアまわり。名前だけ変更。
(ns clj-gae-blank.guestbook ↓ (ns gb.guestbook
[clj-gae-blank.guestbook] ↓ [gb.guestbook]
ちなみに、同じmakingさんのclj-gae-dsを使ってデータストアに投稿内容を格納し、"/"にリダイレクトしている。あと、表示のときは、clj-gae-dsでデータストアから取り出している。
(defn show-greets [] (for [x (take 20 (query-seq (-> (q "Greeting") (srt :date :desc))))] [:p (h (get-prop x :name)) " " (h (get-prop x :content)) " " (h (get-prop x :date))]))
ビルド、実行
$ lein deps $ lein compile $ dev_appserver.sh war
ブラウザでhttp://localhost:8080/にアクセス。
データストアがwar/WEB-INF/appengine-generatedの下に作られる。
情報: The backing store, /path/to/gb/war/WEB-INF/appengine-generated/local_db.bin, does not exist. It will be created.
Googleアカウント認証
Googleアカウント認証を試すため、投稿するのにGoogleアカウントでの認証を求めるようにしてみる。
src/gb/hello.clj
nsの:useに追加。clj-gae-usersライブラリは最初からproject.cljで指定されている。
[am.ik.clj-gae-users.core]
ユーザー名はGoogleアカウント入力から取るので、入力フォームのHTMLを生成するgreet-form関数のうち、名前の入力フォームを削る。
"name:" [:input {:name :name :type :text}] [:br]
greet-form関数をラップして、認証しているかどうかで分ける関数を追加。user-logged-in?やcreate-login-url、create-logout-urlはclj-gae-usersのもの。
(defn login-or-form [] (if (user-logged-in?) [:div (greet-form) [:p [:a {:href (create-logout-url "/")} "Logout"]]] [:div [:a {:href (create-login-url "/")} "Login"]] ))
helloの中。
(greet-form) ↓ (login-or-form)
src/gb/guestbook.clj
同じくnsの:useに追加。
[am.ik.clj-gae-users.core]
投稿アクションのgreet。let中、名前をHTTPリクエストからではなく、get-current-user-map(clj-gae-usersのもの)を使ってGoogleアカウント情報から。で、letとその中のds-putをuser-logged-in?が真のときのみ評価するようにして、redirectはそこから出す。
(defn greet [req] (if (user-logged-in?) (let [content (get-in req [:params "content"]) name ((get-current-user-map) :nickname) entity (map-entity "Greeting" :content content :name name :date (java.util.Date.))] (ds-put entity))) (redirect "/"))
コンパイル、実行
「Login」をクリックするとログイン画面に。
SDKのローカルサーバーだと、パスワードなしで認証が通ったことになる。
ログインすると入力フォームが表示される。
ユーザー別の表示
データストアとCompjureを試すため、特定ユーザーの発言だけをフィルタリング表示できるようにしてみる。
src/gb.clj
URLルーティングに1つ追加。
(GET "/u/:id" req (user-greetings ((req :route-params) "id")))
src/gb/hello.clj
データストアから、ユーザー名に合致したものだけをシーケンスとして取ってくる関数を作る。show-greetsでの処理に「(flt "name" = user)」を追加。SQLのWHERE節っぽい。
(defn query-user-entries [user] (query-seq (-> (q "Greeting") (flt "name" = user) (srt "date" :desc))) )
これを使ってuser-greetingsを実装。
(defn user-greetings [user] (html [:html [:head [:title (h user) "'s messages"]] [:h1 (h user) "'s messages"] (for [x (take 20 (query-user-entries user))] [:p (h (get-prop x :name)) " " (h (get-prop x :content)) " " (h (get-prop x :date)) ])]))
hを使えるようにnsの:useを変更。
(:use [hiccup.core :only [html]] ↓ (:use [hiccup.core :only [html h]]
で、ビルドして実行して、「http://localhost:8080/u/ユーザー名」にアクセスすると、そのユーザーの発言だけ表示する。ただし、"@"とかが入ったユーザー名は扱えないので、"@"とかが入ってない名前でログインして投稿する必要がある。
変更2010-05-09:投稿時のuser-logged-in?チェックが抜けていたので追加
Clojure 1.2でProtocolを試す
Tokyo.clj #2で、最近出たClojure 1.2でProtocolという仕組みが追加されたと聞いた。解説ビデオによると、マルチメソッドと似たようなことを、オーバーヘッド少なく実行するものらしい。
とりあえず試す。Clojure 1.2は、masa_edwさんの解説の方法で使う。
まずdefprotocolでProtocolを定義。SujiMojiというProtocolの中で、2引数を取る関数tasuと、1引数を取る関数nibaiを定義してみる。Javaのinterfaceと同じで、実装を含まない。
(defprotocol SujiMoji (tasu [a b]) (nibai [a]) )
でProtocolに対する実装。いくつかの方法があるようだけど、extend-protocolを使って、第1引数の型で処理を分けてみる。
(extend-protocol SujiMoji java.lang.String (tasu [a b] (str a b)) (nibai [a] (str a a)) java.lang.Integer (tasu [a b] (+ a b)) (nibai [a] (* a 2)) )
呼び出すコード。
(defn -main [] (println (tasu "123" "45")) (println (tasu 123 45)) (println (nibai "123")) (println (nibai 123)) )
ビルドしたあと、実行。
$ java -jar sujimoji-standalone.jar 12345 168 123123 246
とりあえず、それらしい結果になった。
Clojure + RingでHello World
Tokyo.clj #2に参加中。#1からClojureさわってなかったので、いちから復習しているところ。
とりあえずRingのHello Worldから。といってもコピペ。Ringは、WSGIとかRackとかのClojure版みたいなものらしい。
まずLeiningenでプロジェクトを作る。
$ lein new hello $ cd hello
project.cljをエディタで編集。
- :dependenciesに[ring/ring "0.2.0"]を追加
- いちおう:descriptionを変更
つまりこんな感じ。
(defproject hello "1.0.0-SNAPSHOT" :description "Hello, World" :dependencies [[org.clojure/clojure "1.1.0"] [org.clojure/clojure-contrib "1.1.0"] [ring/ring "0.2.0"] ])
src/hello/core.cljをエディタで編集。といっても、RingのREADMEにある"Hello World"のソースをコピペするだけ。へー、本当にWSGIとかRackとかPlackとかみたいなんだ。
インタプリタで実行。
$ lein deps $ lein repl src/hello/core.clj
ブラウザでhttp://localhost:8080/にアクセス。
成功。
次に、ビルドして.jarを作ってみる。まず、src/hello/core.cljのrun-jettyの呼び出しを、-main関数に入れる。
(defn -main [] (run-jetty app {:port 8080}) )
同じファイルのns指定に、:gen-classを付ける。
(ns hello.core (:gen-class))
project.cljのdefprojectに「:main hello.core」を追加。そのうえでビルド。
$ lein uberjar
実行。
$ java -jar hello-standalone.jar
成功。
すでに動いているFirefoxにURL等を渡すしくみ
メモ。
Firefoxがすでに動いているとき、URLなどの引数を指定してもう一つFirefoxを起動しようとすると、元のFirefoxにその引数が渡ってページを開く。
実装方法としては、Unix(X)系の場合、XChangePropertyで値を渡してるようだ(widget/src/xremoteclient/XRemoteClient.cpp)。
「WEB+DB PRESS」vol.56
技術評論社
売り上げランキング: 343
頓知・の井口さんとアンカテのessaさんの対談が面白かった。私物Macを取り上げられた話とか、2001年の話とか、世界を記述するとか、オルタナティブの相互作用とか。
新連載「アルゴリズム実践教室」では、はてなおやさんがベイジアンフィルタの実装を解説。理論からコードに落とすときに丸めるポイントなどがリアルで面白い。
ほか、セコンさんのiPhoneサイトノウハウとか、YappoさんのUI連載とか、hnwさんのPHPのハマりどころ連載とか、富豪増井さんの新連載とか、ミックさんのDBとトレードオフの話とか、牧大輔さんのAnyEvent解説とか、いろいろ。
「過防備都市」
1か月以上前の話だけど、「厚生労働省:ホームレスの実態に関する全国調査(概数調査)結果」によると、ホームレスの起居場所として都市公園の割合が少しずつだけど減っているらしい。
これを見て「過防備都市」を連想した。
寝られないように作ったベンチや、防犯住宅、監視カメラ、小学校といった「監視社会」化現象を、建築学者の目から論じる新書。
Ubuntu 10.04ではX.orgをどこで設定するか
X.orgがHALを使わなくなった
ここ何バージョンかのUbuntuでは、X Window System(X.org)の入力デバイスなどの設定を、/etc/X11/xorg.confではなくてHALですることになっていました。
が、Ubuntu 10.04のX.orgはHALを使わず、udevと直にやりとりするように変わりました。
設定をどうする?
Ubuntu 10.04のα版とかではudevにX.orgの設定を入れるようになっていたようです(私は試してません)。
が、それも大変なので、「Bug #546933 in xorg-server (Ubuntu): “FFE: xorg.conf.d/inputclass backport”」なんて提案があって、正式版ではxorg.conf.dというディレクトリに、1件(1デバイス?)ごとに1ファイルで設定を置くようになってます。この設定はホットプラグ対応になっていて、MatchProductディレクティブとかでデバイスに合致した奴が読み込まれるそうです。ちなみに、これはX.org 1.8からのバックポートだとか(ソースを見ると、dpatchで適用されています)。
で、どこのxorg.conf.d?
では、そのxorg.conf.dディレクトリはどこのディレクトリの下にあるのでしょうか。さきほどのBug #546933では、「users/admins should use /etc/X11/xorg.conf.d」と書かれていたりします。また、「man Xorg」をすると、以下のような記述があります。
/etc/X11/xorg.conf.d Server configuration directory. /etc/X11/xorg.conf.d-4 Server configuration directory. /etc/xorg.conf.d Server configuration directory. /usr/etc/xorg.conf.d Server configuration directory. /usr/lib/X11/xorg.conf.d Server configuration directory.
と思って/etc/X11/xorg.conf.dを作って設定ファイルを置いてみたところ、どうやらほかの設定が読み込まれなくなったようで、入力が効かなくなりました。しょんぼり。recovery modeで起動していそいそとファイルを消しました。
しょうがないのでソースをちょいと見てみると、ROOT_CONFIGDIRPATHで指定された順番でディレクトリを調べて、最初に見付かったディレクトリだけを使うようです。
なので、結論としては、「Ubuntu Weekly Topics」のとおり、「すでに設定の置かれている/usr/lib/X11/xorg.conf.dにファイルを追加する」のがいいようです。
$ grep 'Using config directory' /var/log/Xorg.0.log (==) Using config directory: "/usr/lib/X11/xorg.conf.d"
Ubuntu 10.04で追加された日本語フォント
Ubuntu 10.04のリポジトリでは、9.10から比較して、日本語フォントがいくつか追加されているようです。
- ttf-aoyagi-kouzan-t
- ttf-ipafont-jisx0208
- ttf-komatuna
- ttf-kouzan-mouhitsu
- ttf-monapo
- ttf-mplus
- ttf-takao
- ttf-takao-gothic
- ttf-takao-mincho
- ttf-takao-pgothic
- ttf-umeplus
- otf-ipaexfont
- otf-ipaexfont-gothic
- otf-ipaexfont-mincho
- otf-ipafont-gothic
- otf-ipafont-mincho
- otf-yozvox-yozfont
標準リポジトリで日本語フォントが増えるのはありがたいことですね。青柳衡山フォントや衡山毛筆フォントは、年賀状などに便利なんじゃないでしょうか。
変更2010-06-19
「日経Linux」の記事を執筆したときに知ったotf-*を追加。TokyuRuby会議02の発表でも使ったY.OzFontは面白いですね。
Ubuntu 10.04で削除されたパッケージ
Ubuntu 9.10とUbuntu 10.04のパッケージ一覧を比較して、標準リポジトリから削除されているらしいパッケージを抽出し(2,000個強)、その中から目立ったものをいくつか。
- helix-player
- iiimf
- howm
- qwik
- kazehakase
- scrapbook
- tomoe
- b2evolution
- gnu-smalltalk
- yaird
日本関係のソフトが並んでるのは、単に私の目についたというだけです。
その他、FirefoxなどMozilla関連の拡張機能のパッケージ名が「xul-ext-*」に整理されているとか、sun-java-*がデフォルトでオフなpartnerリポジトリ行き(openjdk-*推奨?)とかいろいろ。デフォルトでオフといっても、Synapticでチェックボックスをクリックすればいいだけですが。
Ubuntu 10.04ではrpm2cpioが独立
Ubuntuでrpmファイルを展開するのにrpm2cpioコマンドを使う場合、いままではrpmパッケージを入れる必要がありました。rpmファイルをインストールするんじゃないんだから、という感じですね。
Ubuntu 10.04(Lucid)では、rpm2cpioが独立したパッケージになりました。めでたしめでたし…というほどのことでもないか。
ちなみに、Debianでも次のsqueezeでrpm2cpioが独立するようです(というかDebianが元だと思う)。
「新仮面ライダーSPIRITS」2巻、「Z-END」1巻
「新仮面ライダーSPIRITS」は、1号2号邂逅編を経て、本編のバダン戦に。1号の苦悩と、アマゾンをめぐるあれこれが中心。バイクアクションもいいね。ちなみに、あのキャラが新登場、あのキャラが再登場。
巻末の座談会で、村枝アニキがスカイ・スーパー1のころには一時的に「卒業」していたという話を読んで、ちょっと安心した。いや、完璧にフォローしていた超人かと思ってたのでw
「ジエンド」から変わって「Z-END」として再スタート。元の話の続きなのかな、それともよく似たパラレルワールドなのかな。エピソード完結形になってるのもあって、ちょっと印象が違って見える。これはこれでいいね。なにより、入間ちゃんが大活躍。