<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6713053201246254610</id><updated>2011-11-28T08:36:17.105+09:00</updated><category term='Objective Caml'/><category term='JRuby'/><category term='Glassfish'/><category term='Common Lisp'/><category term='WEBrick'/><category term='NetBeans'/><category term='J2EE'/><category term='IDE'/><category term='Ruby'/><category term='Rails'/><title type='text'>A life with Programming</title><subtitle type='html'>プログラミング大好きな中年男の日常。</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://fjhooker.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6713053201246254610/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://fjhooker.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>じょりちょこ</name><uri>http://www.blogger.com/profile/07616002137958212816</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_lfeTtzBiupk/SNT-4UlgamI/AAAAAAAAABo/DaNzCqXEfek/S220/portlait.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>18</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6713053201246254610.post-1703927235917432538</id><published>2011-05-18T08:59:00.008+09:00</published><updated>2011-05-24T07:32:24.376+09:00</updated><title type='text'>Antiwebの設計 - プロセス</title><content type='html'>&lt;p&gt;パフォーマンスとセキュリティのために、Antiwebは一群のunixプロセスである。本稿は異なるプロセスの役割と責任を述べる。&lt;/p&gt;&lt;p&gt;下図はプロセスと実行中のAntiwebシステムの責任を図示したものである。&lt;/p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-Rho1ZuNIWdg/TdMOus8r7QI/AAAAAAAAADM/uChCLwzZ1MU/s1600/processes2.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 315px; height: 320px;" src="http://3.bp.blogspot.com/-Rho1ZuNIWdg/TdMOus8r7QI/AAAAAAAAADM/uChCLwzZ1MU/s320/processes2.png" alt="" id="BLOGGER_PHOTO_ID_5607842156508867842" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p  style=" font-weight: bold;font-family:arial;"&gt;&lt;span style="font-size:130%;"&gt;ハブ(Hub)プロセス&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;ハブプロセスは通常、Antiwebシステムにおいてもっとも忙しいプロセスである。その責務は以下のとおり。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;unixソケットを通じて新しい接続を受け付ける。その接続はワーカープロセスにつなげられるか、あるいはスーパーバイザ接続につなげられるかする。&lt;/li&gt;&lt;li&gt;インターネットからHTTP接続を受け付ける。リクエストされた仮想ホスト(vhost)に基づいて接続を適用すべきワーカーを決定し、接続から読み込んだデータをunixソケット越しにワーカーに流す。このプロセスで、ハブプロセス中のソケットを閉じるので、そのソケットはワーカーにおいてのみ開かれていることになる。&lt;/li&gt;&lt;li&gt;ワーカープロセスからのすべてのログメッセージを受け取り、それをロガープロセスに転送する。&lt;/li&gt;&lt;li&gt;プロセス間メッセージをルーティングする(たとえばスーパーバイザ接続)。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;他にハブについて注記すること:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;ハブプロセスは、ハブ設定ファイルにおいて指定されたユーザないしUIDにおいて動作する。&lt;/li&gt;&lt;li&gt;そのプロセスが権限を持たない空ディレクトリに対してchroot()される。&lt;/li&gt;&lt;/ul&gt;（訳注：Antiwebがどれほどセキュリティを意識しているかを述べている。）&lt;br /&gt;&lt;br /&gt;&lt;p  style=" font-weight: bold;font-family:arial;"&gt;&lt;span style="font-size:130%;"&gt;ロガー(Logger)プロセス&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;ロガープロセスはハブプロセスとunixソケットで接続している。その唯一の仕事はハブプロセスからログメッセージを受け取って、それらをディスクに書き込むことである。ワーカーがログプロセスを作ると、それがハブを通じてロガープロセスにルーティングされる。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;ハブ設定ファイルにおいて指定されたユーザないしUIDにおいて動作する。&lt;/li&gt;&lt;li&gt;書き込み権限を持つaw_logディレクトリにchroot()される。&lt;/li&gt;&lt;li&gt;ロガープロセスはログファイルをchmod()するので、ログファイルは全体に読み書き可となることはけっしてない。&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p  style=" font-weight: bold;font-family:arial;"&gt;&lt;span style="font-size:130%;"&gt;ワーカー(Worker)プロセス&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;ワーカープロセスはHTTPリクエスト処理の重量挙げを行なう。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://hoytech.com/antiweb/manual.awp/worker.html#UID"&gt;worker conf&lt;/a&gt;に指定されたユーザないしUIDにおいて動作する。&lt;/li&gt;&lt;li&gt;オプションとして &lt;a href="http://hoytech.com/antiweb/manual.awp/worker.html#CHROOT"&gt;chroot()&lt;/a&gt;される。&lt;/li&gt;&lt;li&gt;クライアントソケットと接続して転送されるので、ワーカープロセスは後続のHTTPリクエストをこれらのソケットにおいて処理する。それらはハブを経由しない。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span class="tip"&gt;&lt;b&gt;&lt;u&gt;Antiweb Tip&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;なぜ複数のワーカーを動作させたいか？&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;権限を分けたvhosts&lt;/li&gt;&lt;li&gt;SMP/マルチコア&lt;/li&gt;&lt;li&gt;ディスクレイテンシの縮小&lt;/li&gt;&lt;/ul&gt;  起動時、各ワーカープロセスはその設定ファイルを読み、HTTPリクエストをディスパッチするための関数をコンパイルする。この関数は与えられたマウントポイントとその他の存在する機能を処理する。起動後、ワーカープロセスはこの設定ファイルを二度と開かない。新しい設定ファイルを提供する唯一の方法は、スーパーバイザプロセスを使ってメッセージを送ることである。これは設定ファイルを含まないルートにワーカーをchroot()させるために不可欠のことだ。&lt;br /&gt;ハブによってそのワーカープロセスが関心を持つべきvhostsを登録すると、そのワーカープロセスはハブ接続を「ロック」して追加のvhostsを登録できないようにする。vhostsを後で追加するには、その接続は手動でスーパーバイザプロセスからアンロックしなければならない(これは、ワーカー設定を&lt;a href="http://hoytech.com/antiweb/manual.awp/faq.html#RELOADING-WORKER-CONF"&gt;-reload&lt;/a&gt;するときに舞台裏で起きることだ --- これと関係する  &lt;a href="http://hoytech.com/antiweb/manual.awp/faq.html#RELOAD-ATTACK"&gt;unlikely attack&lt;/a&gt;  の可能性を見よ)。正しくないワーカー設定を-reloadさせようとすると、Antiwebは新しい設定をインストールせず、もとの設定を使い続ける。ワーカー設定を-reloadしてそれが正しくコンパイルされたが、HTTPリクエストの処理中に何かエラーが生じた場合、Antiwebはワーカーを殺してその理由をsyslogに記録する。&lt;br /&gt;&lt;br /&gt;&lt;fieldset&gt;&lt;legend&gt;権限の分割&lt;/legend&gt;&lt;ul&gt;&lt;li&gt;ワーカープロセスが自身に属していないvhostsの接続を盗むことはできない。&lt;/li&gt;&lt;li&gt;ワーカープロセスが他のワーカーによって作られたログメッセージをインターセプトすることはできない。&lt;/li&gt;&lt;/ul&gt;&lt;/fieldset&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6713053201246254610-1703927235917432538?l=fjhooker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjhooker.blogspot.com/feeds/1703927235917432538/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6713053201246254610&amp;postID=1703927235917432538' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6713053201246254610/posts/default/1703927235917432538'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6713053201246254610/posts/default/1703927235917432538'/><link rel='alternate' type='text/html' href='http://fjhooker.blogspot.com/2011/05/antiweb_18.html' title='Antiwebの設計 - プロセス'/><author><name>じょりちょこ</name><uri>http://www.blogger.com/profile/07616002137958212816</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_lfeTtzBiupk/SNT-4UlgamI/AAAAAAAAABo/DaNzCqXEfek/S220/portlait.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-Rho1ZuNIWdg/TdMOus8r7QI/AAAAAAAAADM/uChCLwzZ1MU/s72-c/processes2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6713053201246254610.post-941297462618020935</id><published>2011-05-18T06:59:00.003+09:00</published><updated>2011-05-18T07:18:23.036+09:00</updated><title type='text'>Antiwebの設計 - メモリ管理</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Verdana, Arial, sans-serif; font-size: medium; "&gt;&lt;p&gt;Antiwebにおいてもっとも重要なメモリ管理システムはlispのガベージコレクタである。AntiwebをサポートするCommon Lispの実装の多くは、すばらしいガベージコレクタを持っているので、負荷の高いベンチマーク以外ではけっして止まっているように見えることはないはずである。&lt;/p&gt;&lt;p&gt;lispの外側では、Antiwebは2つの重要なデータ構造 &lt;b&gt;conns&lt;/b&gt; および &lt;b&gt;ioblocks &lt;/b&gt;を持つ。これらのデータ構造はファイル&lt;b&gt;src/libantiweb.h&lt;/b&gt;に定義されている。 拡張子と関係なく、これはCのヘッダファイルではない。lispとCコンパイラの双方でパースできる特殊な書式である。&lt;/p&gt;&lt;p&gt;Antiwebプロセスによって使われているメモリのを-roomコマンドでブレークダウンすることができる。CMUCLを使ってワーカを探索する様子を以下に示す。&lt;/p&gt;&lt;pre style="background: #EEE; border: 1px solid #888; color: black; padding: 1em; white-space: pre;"&gt;# antiweb -room /var/aw/example.conf&lt;br /&gt;&lt;br /&gt;"---ANTIWEB MEMORY STATS---&lt;br /&gt;Dynamic Space Usage:        1,946,272 bytes (out of  512 MB).&lt;br /&gt;Read-Only Space Usage:     24,024,304 bytes (out of  256 MB).&lt;br /&gt;Static Space Usage:         3,665,792 bytes (out of  256 MB).&lt;br /&gt;Control Stack Usage:            1,636 bytes (out of  128 MB).&lt;br /&gt;Binding Stack Usage:               88 bytes (out of  128 MB).&lt;br /&gt;The current dynamic space is 0.&lt;br /&gt;Garbage collection is currently enabled.&lt;br /&gt;&lt;br /&gt;conns and ioblocks:&lt;br /&gt;Allocated conns:     2, 470 bytes&lt;br /&gt;Allocated ioblocks:  1, 4112 bytes, 14 in use, 99.7% overhead&lt;br /&gt;Free conns:          2, 470 bytes&lt;br /&gt;Free ioblocks:       514, 2113568 bytes&lt;br /&gt;Total:               2118620 bytes + malloc overhead&lt;br /&gt;---END OF ANTIWEB MEMORY STATS---"&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;ファイル &lt;b&gt;src/libantiweb.c&lt;/b&gt; を読んでみると、Antiwebがconn構造体とioblock構造体をmalloc()しながら、それらをけっしてfree()しないことに気づくであろう。Antiwebは、その構造体を使い終わったら、それをフリーリストにプッシュする。次に必要になったときは、直近にフリーリストにプッシュしたものをポップする。connおよびioblock構造体は常に同一の大きさであるので、これがAntiwebに可能なのである。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;メモリの解放は危険とみなす&lt;/b&gt;&lt;/p&gt;&lt;p&gt;上記の &lt;b&gt;-room&lt;/b&gt; の出力において、connおよびioblockの数値は&lt;b&gt;高水位に&lt;/b&gt;表示されている。トラフィックが重いとき、より多くのメモリが割り当てられる。トラフィックが落ち着くと、フリーリストの底の方は必要に応じてカーネルによってスワップアウトされる。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6713053201246254610-941297462618020935?l=fjhooker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjhooker.blogspot.com/feeds/941297462618020935/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6713053201246254610&amp;postID=941297462618020935' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6713053201246254610/posts/default/941297462618020935'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6713053201246254610/posts/default/941297462618020935'/><link rel='alternate' type='text/html' href='http://fjhooker.blogspot.com/2011/05/antiweb.html' title='Antiwebの設計 - メモリ管理'/><author><name>じょりちょこ</name><uri>http://www.blogger.com/profile/07616002137958212816</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_lfeTtzBiupk/SNT-4UlgamI/AAAAAAAAABo/DaNzCqXEfek/S220/portlait.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6713053201246254610.post-8233893240164438948</id><published>2010-12-31T17:08:00.006+09:00</published><updated>2011-05-18T06:58:58.983+09:00</updated><title type='text'>Antiwebの設計 - サーバ設計</title><content type='html'>nginx、lighttpd、fhttpd、そしてAntiweb3と同じように、Antiweb4は&lt;b&gt;&lt;span class="Apple-style-span"&gt;非同期&lt;/span&gt;&lt;/b&gt;ないし&lt;b&gt;&lt;span class="Apple-style-span"&gt;イベントベース&lt;/span&gt;&lt;/b&gt;ないし&lt;b&gt;&lt;span class="Apple-style-span"&gt;ノンブロッキング&lt;/span&gt;&lt;/b&gt;なサーバです。つまり、複数のクライアント接続を単一のスレッドで制御します。Antiwebシステムはunixプロセスの集まりです。接続はプロセス間で&lt;a href="http://www.openbsd.org/cgi-bin/man.cgi?query=sendmsg"&gt;sendmsg()&lt;/a&gt;によって転送されます。これが生じると、ソケットから最初に読まれたデータはそのソケット自身を通じて転送されます。ソケットは常に送信側のプロセスにおいて閉じられます。&lt;div&gt;ひとつのプロセスの中で多重接続を行なうため、Antiwebは&lt;b&gt;src/libantiweb.h&lt;/b&gt;に定義されている状態機械データ構造を使います。Antiwebは、level-triggeredモードにおいて、kqueue()またはepoll()のいずれかのステートフルなイベントAPIを必要とします。&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;32bit linux/CMUCLシステムにおいて、10000の非アクティヴなkeepalive接続は約3Mのユーザ空間メモリを消費した（2つのlispイメージに加えて）。&lt;/li&gt;&lt;li&gt;非アクティヴなkeepalive接続の数は新しい接続において取るに足らない性能影響を持つ。&lt;/li&gt;&lt;/ul&gt;ファイルの送信には3つのモードがある。すなわち、中、小、大である。&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;中:&lt;/b&gt; これらのファイルはファイルのデータをユーザ空間にコピーするのを避けるためにmmap()される（メモリーマップされる）。データはファイルシステムから直接カーネルのソケットバッファにコピーされる。&lt;/li&gt;&lt;li&gt;&lt;b&gt;小:&lt;/b&gt; これらのファイルはユーザ空間バッファに読まれる。というのは、小さなread()は往々にしてmmap()+munmap()より安価だからである。&lt;/li&gt;&lt;li&gt;&lt;b&gt;大:&lt;/b&gt; Antiwebは大きなファイルにユーザ空間バッファを使う。これは多数の大きなファイルをクライアントが並列に要求した場合にディスクスラッシングを起こすのを避けるためであり（&lt;a href="http://blog.lighttpd.net/articles/2005/11/11/optimizing-lighty-for-high-concurrent-large-file-downloads"&gt;lighttpdからのアイデア&lt;/a&gt;である）、また32bitシステムでアドレス空間を使い切ってしまうのを避けるためでもある。&lt;/li&gt;&lt;/ol&gt;そいつをスーパーサイズしろ: Antiwebは64bitのoff_t型とlispの桁数無制限の整数をすべてのシステムで使っているので、Antiwebはいかなる容量のファイルでも扱うことができる。また、3つすべての送信モードにおいて&lt;a href="http://hoytech.com/antiweb/manual.awp/worker.html#DOWNLOAD-RESUMING"&gt;ダウンロード再開&lt;/a&gt;をサポートしている。&lt;/div&gt;&lt;div&gt;Antiwebのデータ構造は&lt;b&gt;&lt;span class="Apple-style-span"&gt;パイプライン&lt;/span&gt;&lt;/b&gt;のために設計されている。Antiwebは&lt;b&gt;&lt;span class="Apple-style-span"&gt;ベクター型I/O&lt;/span&gt;&lt;/b&gt;（scatter-gather I/Oとしても知られている）をほとんど全面的に使っている。Antiwebの内部メッセージパッシングプロトコルもパイプラインを使っている。たとえば、ひとつのHTTP接続があって、それが小さなファイルについて2つのリクエストがあり、中くらいのファイルのリクエストが1つ続いてパイプラインされているとき、単一のwritev()システムコールで以下のように対応する。&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;最初の2つのファイルのためのHTTPヘッダとファイルコンテント&lt;/li&gt;&lt;li&gt;中くらいのファイルのためのHTTPヘッダ&lt;/li&gt;&lt;li&gt;カーネルバッファを満たすまで中くらいのファイルをメモリにマップする&lt;/li&gt;&lt;/ul&gt;続いて、生成されたログメッセージをすべてハブプロセスにwritev()で書き込む。ハブはログメッセージをロガープロセスに別のwritev()で転送する。最後に、ロガープロセスがメッセージを&lt;b&gt;axslog&lt;/b&gt;ファイルに追記する。&lt;/div&gt;&lt;div&gt;ワーカープロセスの接続統計が見たいなら、&lt;a href="http://hoytech.com/antiweb/manual.awp/faq.html#STATS"&gt;-stats&lt;/a&gt;コマンドを使う。&lt;/div&gt;&lt;br /&gt;&lt;pre style="color: #000; padding: 8px; font-family: courier; background-color: #fee; border: 1px solid #666;"&gt;# antiweb -stats /var/aw/example.conf&lt;br /&gt;...&lt;br /&gt;Keepalive Time: 65 seconds&lt;br /&gt;Total Connections: 41  HTTP requests: 72  Avg reqs/conn: 1.8&lt;br /&gt;File descriptor usage (estimate): 17/32767&lt;br /&gt;Current Connections: 11&lt;br /&gt;Keepalives: 7  Sending files to: 2&lt;br /&gt;Proxy: Sources: 0  Sinks: 0  Idle: 0&lt;br /&gt;Timers: 0  Hub: 1  Unix Connections: 1&lt;br /&gt;Lingering: 0  Zombies: 0&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;ふだんは愛しているけれど、ときどきパイプラインは悪い。Antiwebは特定のレスポンスにおいてパーシステントなHTTP接続を切断する。&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;4XXおよび5XX HTTPエラー&lt;/b&gt; - niktoのようなウェブ脆弱性スキャナがそのリクエストの95%以上をこれらのエラーとするとき、blindになるのを防ぐ。&lt;/li&gt;&lt;li&gt;&lt;b&gt;ディレクトリリスト&lt;/b&gt; - パイプラインが再帰的にクロールするのを防ぐ。&lt;/li&gt;&lt;/ul&gt;接続を完了するとき、Antiwebはソケットと、HTTP/1.1で要求されているようにlingerの書き込みディレクションを切断する。AntiwebはHTTP/0.9およびHTTP/1.0のクライアントを常にgracefullyにデグレードする。Antiwebは第一級のIPv6サポートを持っている。もし、4XXおよび5XXエラーをパイプラインしたいなら、2つの選択肢がある。&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Antiwebの&lt;a href="http://hoytech.com/antiweb/manual.awp/worker.html#REWRITE"&gt;rewriteモジュール&lt;/a&gt;を使って問題のあるリクエストを実在するファイルへのリクエストに変更する。&lt;/li&gt;&lt;li&gt;Antiwebの&lt;a href="http://hoytech.com/antiweb/manual.awp/worker.html#FAST-FILES"&gt;fast-filesモジュール&lt;/a&gt;を使う。これはメモリキャッシュであって静的なコンテントの加速化、HTTPヘッダの事前生成、ネガティヴキャッシュ、そして404エラーの永続化/パイプライン化をサポートしている。&lt;/li&gt;&lt;/ol&gt;Antiwebは最初からセキュリティを意識して設計されている。Antiwebの設計中に下された設計上の決定を以下に列挙する。&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;仮想ホストは&lt;b&gt;プロキシを使わずに&lt;/b&gt;権限を分離している。ハブが接続を扱うべきワーカーを決定すると、ハブはワーカープロセスにソケットし、その接続についてそれ以上のことは一切行なわない。ワーカープロセスはハブと異なるUIDsの下で動作する（ワーカープロセスもそれぞれ異なる）。ワーカーはオプションとして&lt;a href="http://hoytech.com/antiweb/manual.awp/worker.html#CHROOT"&gt;chroot&lt;/a&gt;することがある。&lt;/li&gt;&lt;li&gt;ワーカーはログファイルにアクセスしない。すべてのログメッセージはUnixソケットを通じてハブに送られる。続いて、ハブはそのメッセージをロガープロセスに送る。つまり、ワーカープロセスはそれまでに生成されたログメッセージを盗むことがないし、他のワーカープロセスによって生成されたログメッセージを盗むこともない。同様にハブはそれまでに生成されたログメッセージを盗むことがない。&lt;/li&gt;&lt;li&gt;&lt;a href="http://hoytech.com/antiweb/manual.awp/design.html#CGI-PROCESS"&gt;CGIプロセス&lt;/a&gt;はリソース制限によって制約できる。&lt;/li&gt;&lt;li&gt;unicodeをサポートしないLispであっても、Antiwebは内部データならびにファイル名を&lt;a href="http://hoytech.com/antiweb/manual.awp/design.html#UNICODE"&gt;UTF-8&lt;/a&gt;でエンコードする。これにはすべてのコードポイントを最短の表現となるようにし、不正なサロゲートペアがないように検証することが含まれている。(訳者注：本当だろうか？ 大言壮語ではないか？)&lt;/li&gt;&lt;li&gt;Antiwebプロセスは予期せぬ状態のイベントの後始末や回復をけっして試みない。実行できなかったプロセスは&lt;a href="http://hoytech.com/antiweb/manual.awp/faq.html#ERLANG"&gt;失敗&lt;/a&gt;する。失敗しなかったプロセスは終了後に後始末される。&lt;/li&gt;&lt;/ul&gt;Antiwebには&lt;a href="http://hoytech.com/antiweb/manual.awp/awp.html"&gt;Anti Webpages&lt;/a&gt;と呼ばれるWebページを構築する実験的な技術が含まれている。これはPerlに触発されたプログラムで、意味のある空白類でページレイアウトを表現したり、HTML/CSS/Javascriptを貼り合わせたりといった機能を持つ。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6713053201246254610-8233893240164438948?l=fjhooker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjhooker.blogspot.com/feeds/8233893240164438948/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6713053201246254610&amp;postID=8233893240164438948' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6713053201246254610/posts/default/8233893240164438948'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6713053201246254610/posts/default/8233893240164438948'/><link rel='alternate' type='text/html' href='http://fjhooker.blogspot.com/2010/12/antiweb.html' title='Antiwebの設計 - サーバ設計'/><author><name>じょりちょこ</name><uri>http://www.blogger.com/profile/07616002137958212816</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_lfeTtzBiupk/SNT-4UlgamI/AAAAAAAAABo/DaNzCqXEfek/S220/portlait.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6713053201246254610.post-2895957238558928684</id><published>2010-12-31T16:51:00.002+09:00</published><updated>2010-12-31T17:04:36.590+09:00</updated><title type='text'>Antiwebの設計 - Antiwebの新世代</title><content type='html'>Antiwebは、&lt;a href="http://hoytech.com/"&gt;Hoytech&lt;/a&gt;によって、Common Lisp、C、そしてPerlで書かれたウェブサーバである。Antiwebは「コンセプトの検証」ではないし、「実験的なコード」でもない。Antiwebの中心的な設計は（この設計書に解説しているとおり）次の10年以上にわたって安定して使えることを意図している。&lt;br /&gt;Antiweb4に強い影響を与えたウェブサーバは&lt;a href="http://nginx.net/"&gt;nginx&lt;/a&gt;と&lt;a href="http://www.lighttpd.net/"&gt;lighttpd&lt;/a&gt;の2つである。Antiwebを設計するにあたって、これらやその他の優れたサーバを自由に探検させてもらった。もうひとつ影響されたサーバを挙げるなら、&lt;a href="http://fhttpd.org/"&gt;fhttpd&lt;/a&gt;がそれに挙げられる。&lt;div&gt;なぜまたウェブサーバか？ われわれの意見では、上記のサーバを用いるときの最大の問題として、それらがlispで書かれていない、ということがある。われわれが学んだサーバは、拡張言語で接木されている（nginxにはPerlが、lighttpdにはLuaが採用されている）。Antiwebは違う。他の言語を使うCプログラムとするのではなく、AntiwebはC（とPerl）を使うLispプログラムなのである。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6713053201246254610-2895957238558928684?l=fjhooker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjhooker.blogspot.com/feeds/2895957238558928684/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6713053201246254610&amp;postID=2895957238558928684' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6713053201246254610/posts/default/2895957238558928684'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6713053201246254610/posts/default/2895957238558928684'/><link rel='alternate' type='text/html' href='http://fjhooker.blogspot.com/2010/12/antiweb-antiweb.html' title='Antiwebの設計 - Antiwebの新世代'/><author><name>じょりちょこ</name><uri>http://www.blogger.com/profile/07616002137958212816</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_lfeTtzBiupk/SNT-4UlgamI/AAAAAAAAABo/DaNzCqXEfek/S220/portlait.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6713053201246254610.post-7677900105326167712</id><published>2010-12-31T08:50:00.002+09:00</published><updated>2010-12-31T09:20:03.764+09:00</updated><title type='text'>Anti Webpages - ページとレイアウト</title><content type='html'>Anti Webpageは.awpで終わるファイルである。ほとんどすべてのAntiwebのファイル同様、.awpファイルはconfsである。各.awpファイルはあなたのウェブサイトの.awp/ディレクトリへのマップである。このディレクトリには複数のページを持つことができ、それぞれはxconfで示される。以下に、1つの&lt;b&gt;ページ&lt;/b&gt;xconfを持つ、簡単な.awpファイルを示す。&lt;br /&gt;&lt;pre style="border: 1px solid #666; background-color: #fee; font-family: courier; padding: 8px;"&gt;(page "index.html"&lt;br /&gt;:layout #"&lt;br /&gt;content                        |&lt;br /&gt;"#&lt;br /&gt;:content #"Hello world!"# )&lt;br /&gt;&lt;/pre&gt;&lt;ul&gt;&lt;li&gt; 文字列は正規の二重引用符 (") ないし特殊な #" および "# で区切ることができる。この特殊引用符は引用符文字、バックスラッシュなどをエスケープせずに含ませることができる。&lt;/li&gt;&lt;li&gt;:layoutオプションはawpファイルのセグメントを置くためのものである。そこにはバーティカルバー （|) を終端とする行が最低一行必要になる。すべてのバーティカルバーは「並んでいる」べきである。&lt;/li&gt;&lt;/ul&gt; 上記の例では、:contentセグメントがページの真ん中にある。複数のポジションを示すには複数のバーを使う。たとえば以下のコードでは:contentをページの右端に表示するように指示している。&lt;br /&gt;&lt;pre style="border: 1px solid #666; background-color: #fee; font-family: courier; padding: 8px;"&gt;(page "index.html"&lt;br /&gt;:layout #"&lt;br /&gt;               | content |&lt;br /&gt;"#&lt;br /&gt;:content #"Hello world!"#&lt;br /&gt;)&lt;br /&gt;&lt;/pre&gt;別の書き方もある。位置修正子 locator modifier (@) を使ってセグメントの位置を示すことができる。以下の例は同じ意味を持つ。&lt;br /&gt;&lt;pre style="border: 1px solid #666; background-color: #fee; font-family: courier; padding: 8px;"&gt;(page "index.html"&lt;br /&gt;:layout #"&lt;br /&gt;content@r&lt;br /&gt;"#&lt;br /&gt;:content #"Hello world!"#&lt;br /&gt;)&lt;br /&gt;&lt;/pre&gt;@rはそのエリアの右に配置することを示す。使用可能な修正子は@r @l @t @b @tl @tr @bl @br である(ただし文字の順序は問題にしない)。やや複雑な例を示そう。&lt;br /&gt;&lt;pre style="border: 1px solid #666; background-color: #fee; font-family: courier; padding: 8px;"&gt;(page "index.html"&lt;br /&gt;:title "Antiweb Manual"&lt;br /&gt;&lt;br /&gt;:layout-width 800&lt;br /&gt;:layout #"&lt;br /&gt;logo@r |  |          header@l         |  slogan  |&lt;br /&gt;nav@rt |  |          content@tl                  |&lt;br /&gt;                     footer                    |&lt;br /&gt;"#&lt;br /&gt;&lt;br /&gt;:header #"&amp;lt;h1&amp;gt;&amp;lt;u&amp;gt;Antiweb Manual&amp;lt;/u&amp;gt;&amp;lt;/h1&amp;gt;"#&lt;br /&gt;)&lt;br /&gt;&lt;/pre&gt;上記の.awpファイルがレンダリングされると、ひとつのセグメントが表示され (:header) 、残りはNILとなる、というのはまだそれを追加していないからである。レイアウトとは関係ない特殊キーワードがある。&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;:title&lt;/b&gt; - このページのHTMLタイトル。&lt;/li&gt;&lt;li&gt;&lt;b&gt;:css&lt;/b&gt; - CSSコード。複数の:cssパラメータをおいてよい。すべてHTMLページの上部のCSSブロックに追加される。&lt;/li&gt;&lt;li&gt;&lt;b&gt;:js&lt;/b&gt; - Javascriptコード。複数の:jsパラメータをおいてよい。すべてHTMLページの上部のJavascriptブロックに追加される。&lt;/li&gt;&lt;li&gt;&lt;b&gt;:js-end&lt;/b&gt; - &lt;b&gt;:js&lt;/b&gt;と同じだが、そのコードはページの上部ではなく、ページの下部のJavascriptブロックに追加される。&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6713053201246254610-7677900105326167712?l=fjhooker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjhooker.blogspot.com/feeds/7677900105326167712/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6713053201246254610&amp;postID=7677900105326167712' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6713053201246254610/posts/default/7677900105326167712'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6713053201246254610/posts/default/7677900105326167712'/><link rel='alternate' type='text/html' href='http://fjhooker.blogspot.com/2010/12/anti-webpages_31.html' title='Anti Webpages - ページとレイアウト'/><author><name>じょりちょこ</name><uri>http://www.blogger.com/profile/07616002137958212816</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_lfeTtzBiupk/SNT-4UlgamI/AAAAAAAAABo/DaNzCqXEfek/S220/portlait.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6713053201246254610.post-8861637812059078693</id><published>2010-12-31T08:39:00.002+09:00</published><updated>2010-12-31T08:50:10.195+09:00</updated><title type='text'>Anti Webpages</title><content type='html'>Anti Webpagesは、実験的で革新的な、Webコンテンツの新しい生成方法である。Antiwebのサーバ部分は、Antiweb Pagesから切り離されており、より直球である --- Antiwebサーバ自身の成し遂げていることと言えば、可能な限り効率的でセキュアにHTTP 1.1を実装しているということに尽きる。これはちょっとおかしな感じがする。Antiweb Pagesは安定していない、というのは、その実際の仕様がそのうちに変更され得るという意味においてのことである（そう近い話とも考えていないが）。&lt;div&gt;Anti Webpagesの要点は、静的なHTMLファイルを生成することであり、それもAntiwebによって非常に効率的に生成できることにある。Anti WebpagesはAJAXコールバックとフラットファイルないしBerkeleyDBデータストアをサポートするが、基本的には静的コンテンツまわりを処理することがすべてであり、このマニュアルに記載されているのがすべてである。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6713053201246254610-8861637812059078693?l=fjhooker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjhooker.blogspot.com/feeds/8861637812059078693/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6713053201246254610&amp;postID=8861637812059078693' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6713053201246254610/posts/default/8861637812059078693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6713053201246254610/posts/default/8861637812059078693'/><link rel='alternate' type='text/html' href='http://fjhooker.blogspot.com/2010/12/anti-webpages.html' title='Anti Webpages'/><author><name>じょりちょこ</name><uri>http://www.blogger.com/profile/07616002137958212816</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_lfeTtzBiupk/SNT-4UlgamI/AAAAAAAAABo/DaNzCqXEfek/S220/portlait.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6713053201246254610.post-2212067836079083999</id><published>2010-11-23T18:41:00.004+09:00</published><updated>2010-11-23T20:07:16.027+09:00</updated><title type='text'>CMUCL</title><content type='html'>CMUCLを使って、Antiweb環境を構築しようと思う。&lt;br /&gt;&lt;br /&gt;SBCLを使わずにCMUCLを使うのは、Doug Hoyteに敬意を払ってのことである（ミーハー）。&lt;br /&gt;&lt;br /&gt;日本語を使う場合、SBCLの方が何かと便利なのであるが、SLIMEを使わないことを決めたので（これもDougへのオマージュ）、表面的な便利さは捨てて、ハードコアにCMUCLを使ってみることにしたのである。&lt;br /&gt;&lt;br /&gt;おいらがGMOから借りているVirtual Private Serverは、すでにUbuntu Serverに入れ替えてある。&lt;br /&gt;&lt;br /&gt;だから、Ubuntu Serverを自宅PC（恥ずかしながらWindows Vista 64bitである）のVirtual BoxにUbuntu Serverを入れて、そこで環境構築を練習しよう。&lt;br /&gt;&lt;br /&gt;---&lt;br /&gt;&lt;br /&gt;む？ 64bitダメなの？&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6713053201246254610-2212067836079083999?l=fjhooker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjhooker.blogspot.com/feeds/2212067836079083999/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6713053201246254610&amp;postID=2212067836079083999' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6713053201246254610/posts/default/2212067836079083999'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6713053201246254610/posts/default/2212067836079083999'/><link rel='alternate' type='text/html' href='http://fjhooker.blogspot.com/2010/11/cmucl.html' title='CMUCL'/><author><name>じょりちょこ</name><uri>http://www.blogger.com/profile/07616002137958212816</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_lfeTtzBiupk/SNT-4UlgamI/AAAAAAAAABo/DaNzCqXEfek/S220/portlait.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6713053201246254610.post-6381064946712592125</id><published>2010-10-10T20:11:00.002+09:00</published><updated>2010-10-10T20:27:05.206+09:00</updated><title type='text'>James - ユーザの追加</title><content type='html'>&lt;p&gt;ユーザアカウントはサービスを横断して共有される。共通ユーザレポジトリはJamesサービスを横断して共有される。つまり、POP3メールアカウントを作成し、パスワードを設定すれば、同じアカウントがSMTPおよびNNTPの認証にも使えるということである。&lt;/p&gt; &lt;a name="Before You Add Accounts"&gt;&lt;/a&gt;&lt;div class="section"&gt;&lt;h3&gt;アカウントを追加する前に&lt;/h3&gt; &lt;p&gt;Jamesでは、ユーザアカウントはリモートマネージャを通じて作成される。だから、インストールが完了したら、まずリモートマネージャを設定することが、ユーザ追加の最初のステップとなる。リモートマネージャの設定についてはここを参照のこと。少なくとも1つの管理者アカウントを設定し、リモートマネージャを有効にすることが必要である。&lt;/p&gt;また、ユーザを追加する前に、ユーザレポジトリの設定を正しく行なうことも必要だ。もしユーザを追加した後でレポジトリタイプをファイルからデータベースに変更すると、ユーザデータを失うことになる。これらの値の取り扱いには注意して欲しい。&lt;br /&gt;&lt;br /&gt;これを完了させたら、Jamesを再起動して設定変更を稼働中のシステムに確実に反映させること。これでようやくユーザアカウントを作成できる準備が整った。&lt;br /&gt;&lt;br /&gt;ひとたびJamesが起動してリスニングを始めると、ユーザの追加はきわめてシンプルである。&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;リモートマネージャがリスニングしているホストの当該ポートにtelnetする。コマンドラインのtelnetクライアントでは、一般に「telnet &lt;host&gt; &lt;port&gt;」と打鍵する。&lt;host&gt;にはJamesのホスト名を、&lt;port&gt;にはJamesのconfig.xmlに指定したリモートマネージャのポートを指定する。&lt;/li&gt;&lt;li&gt;管理者のユーザIDとパスワードのためにプロンプトが出るので、Jamesのconfig.xmlに指定した値を入力する。&lt;/li&gt;&lt;li&gt;ログインしたら、「adduser &lt;user&gt; &lt;password&gt;」と打鍵する。&lt;user&gt;にはユーザ名を、&lt;password&gt;にはそのアカウントのパスワードを指定する。ユーザ名には完全なemailアドレスを指定するべきでは&lt;span style="font-weight: bold;"&gt;ない&lt;/span&gt;ことに注意。むしろ、すべてのemailアドレスは&lt;user&gt;@&lt;domain&gt;の形式(&lt;domain&gt;には&lt;servernames&gt;ブロックに指定した値のいずれかを指定する)がこのアカウントにデフォルトで配送されるものとして使われる。Mailetはこのデフォルトの振る舞いを変更できる。&lt;/li&gt;&lt;li&gt;作成したいユーザすべてについてステップ3を繰り返す。&lt;/li&gt;&lt;/ol&gt;以上です。ユーザアカウントは作成され、すべてのJamesサービスで使用可能となります。&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6713053201246254610-6381064946712592125?l=fjhooker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjhooker.blogspot.com/feeds/6381064946712592125/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6713053201246254610&amp;postID=6381064946712592125' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6713053201246254610/posts/default/6381064946712592125'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6713053201246254610/posts/default/6381064946712592125'/><link rel='alternate' type='text/html' href='http://fjhooker.blogspot.com/2010/10/james_10.html' title='James - ユーザの追加'/><author><name>じょりちょこ</name><uri>http://www.blogger.com/profile/07616002137958212816</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_lfeTtzBiupk/SNT-4UlgamI/AAAAAAAAABo/DaNzCqXEfek/S220/portlait.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6713053201246254610.post-7245665002912443454</id><published>2010-10-10T19:44:00.004+09:00</published><updated>2010-10-10T20:41:20.933+09:00</updated><title type='text'>James - グローバルサーバ設定</title><content type='html'>&lt;p&gt;ひとつのコンポーネントに落とし込むことのできないグローバルな設定ブロックがいくつかあります。それらはサーバを横断してグローバルな影響を与えます。いくつかのブロックは非常に重要であり、一方で多くの場合無視されるものもありますが、もっとも洗練されたサーバ管理者にとっては重要なものです。&lt;/p&gt;&lt;div class="section"&gt;&lt;h3&gt;Jamesブロック&lt;br /&gt;&lt;/h3&gt; &lt;p&gt;この設定ブロックは&lt;strong&gt;James&lt;/strong&gt;タグで定義されます。すべての管理者はこのブロックをインストール時に調整する必要があります。属性はありませんが、いくつかの子があり、すべて必須です。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;postmaster&lt;/strong&gt; - この要素の中身はpostmasterのメールアドレスです。このアドレスはJamesから送信されるすべてのエラーメッセージの送信者アドレスとして使われます。また、postmaster@&lt;サーバ名&gt;宛てのすべてのメッセージは、このメールアドレスにリダイレクトされます。(&lt;サーバ名&gt;には、Jamesが取り扱っているドメイン名のいずれかが入ります。)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;usernames&lt;/strong&gt; - この要素は中身を持ちませんが、三つの必須の真偽値の属性を持ちます。その属性というのは、&lt;strong&gt;ignoreCase&lt;/strong&gt;、&lt;strong&gt;enabledAliases&lt;/strong&gt;、そして&lt;strong&gt;enableForwarding&lt;/strong&gt;.です。ignoreCaseはemailのユーザ名を大文字小文字を無視するか、無視しないかを決定します。enabledAliasesは、ローカルユーザのエイリアシングを有効にするかどうかを決めます。最後に、enableForwardingはリモートユーザへの転送を有効にするかどうかを決めます。&lt;/li&gt;&lt;li&gt;&lt;strong&gt;servernames&lt;/strong&gt; - この要素はサーバがローカルとして取り扱うメールドメインとIPアドレスを定義します。二つの真偽値の属性 -  &lt;strong&gt;autodetect&lt;/strong&gt;および&lt;strong&gt;autodetectIP&lt;/strong&gt;があります。autodetectは、真にすると、サーバに自身のホスト名を確認させて、ローカルメールドメインに追加させます。autodetectIPはサーバに自身のIPアドレスを確認させて、ローカルメールドメインに追加させます。これらの属性の他に、このタグは0個以上の&lt;span style="font-weight: bold;"&gt;servername&lt;/span&gt;子要素を持ちます。&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;servername&lt;/strong&gt; - 単一のホスト名またはIPアドレス。サーバがローカルとみなすメールドメインに追加される。&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;strong&gt;inboxRepository&lt;/strong&gt; - これは単一の子要素を保持するシンプルなコンテナタグです。&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;repository&lt;/strong&gt; - これはメールレポジトリを定義するもので、ローカルに配送されたメールを保持するのに使われる。この要素は中身を持たない。必須属性&lt;strong&gt;type&lt;/strong&gt;は常に"MAIL"にセットされる。必須属性&lt;strong&gt;repositoryURL&lt;/strong&gt;はレポジトリを指定するのに使う(レポジトリ設定セクションを参照のこと)。&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;  &lt;/div&gt; &lt;a name="The Connectionmanager Block"&gt;&lt;/a&gt;&lt;div class="section"&gt;&lt;h3&gt;Connectionmanagerブロック&lt;br /&gt;&lt;/h3&gt;  このブロックは一般的な接続管理を成業する。二つの要素がある。&lt;ul&gt;&lt;li&gt;&lt;strong&gt;idle-timeout&lt;/strong&gt; - ミリ秒でクライアントの接続をタイムアウトさせるまでの時間を指定する。値を与えないと、デフォルトで5分、すなわち300000ミリ秒となる。値0はクライアントソケットをタイムアウトさせないことを意味する。&lt;/li&gt;&lt;li&gt;&lt;strong&gt;max-connections&lt;/strong&gt; - max-connectionsパラメータはこの接続マネージャが許容する最大の同時接続数のデフォルトを指定する。この値は個々のサービスによって上書きできる。値を与えないと、デフォルトで30になる。値0は接続マネージャに上限を与えないことを意味するが、他のコンポーネントによるリソースの制限(たとえば最大スレッド数)が接続を開く数を制限することにはなる。&lt;/li&gt;&lt;/ul&gt;  &lt;/div&gt; &lt;a name="The Objectstorage Block"&gt;&lt;/a&gt;&lt;div class="section"&gt;&lt;h3&gt;Objectstorageブロック。&lt;br /&gt;&lt;/h3&gt; 低レベルのファイルレポジトリからファイルへの写像を制御するブロック。修正する必要はない。&lt;br /&gt;&lt;/div&gt;&lt;div class="section"&gt;&lt;h3&gt;Socketmanagerブロック&lt;br /&gt;&lt;/h3&gt; このブロックはJames内部で利用可能なソケットのタイプを制御する。SSLを有効にするのでなければ、このブロックを修正する必要はない。TLSを使う場合には修正の必要があるので、TLSの使用セクションを参照のこと。&lt;br /&gt;&lt;/div&gt;&lt;div class="section"&gt;&lt;h3&gt;Threadmanagerブロック&lt;br /&gt;&lt;/h3&gt; このブロックはJames内部で利用可能なスレッドプールを制御する。エキスパートの管理者だけがこの設定を修正すべきである。&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6713053201246254610-7245665002912443454?l=fjhooker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjhooker.blogspot.com/feeds/7245665002912443454/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6713053201246254610&amp;postID=7245665002912443454' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6713053201246254610/posts/default/7245665002912443454'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6713053201246254610/posts/default/7245665002912443454'/><link rel='alternate' type='text/html' href='http://fjhooker.blogspot.com/2010/10/james.html' title='James - グローバルサーバ設定'/><author><name>じょりちょこ</name><uri>http://www.blogger.com/profile/07616002137958212816</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_lfeTtzBiupk/SNT-4UlgamI/AAAAAAAAABo/DaNzCqXEfek/S220/portlait.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6713053201246254610.post-6339016674075761088</id><published>2010-07-23T07:02:00.002+09:00</published><updated>2010-07-23T07:09:55.736+09:00</updated><title type='text'>Twitterクライアントを作ってみる</title><content type='html'>Twitterクライアントを作ってみることにした。&lt;div&gt;Javaで、Maven2とNetBeansを使い、TDDで。&lt;/div&gt;&lt;div&gt;テーマは以下のとおり。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. Javaの道具に慣れる(今でも普通に仕事をしているけど、いまだにJavaに魅力を感じていないので)。&lt;/div&gt;&lt;div&gt;2. Twitter APIに親しむ(そのうちにTwitter APIを使った仕事がありそうだし)。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;単にTwitterクライアントを作るだけなら、Rubyあたりがもっとも手っ取り早い。&lt;/div&gt;&lt;div&gt;Common Lisp（Emacs + SLIMEないしLispWorks)という手もあるね。&lt;/div&gt;&lt;div&gt;でも、それは会社の仕事にはつながっていかないからなあ。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6713053201246254610-6339016674075761088?l=fjhooker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjhooker.blogspot.com/feeds/6339016674075761088/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6713053201246254610&amp;postID=6339016674075761088' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6713053201246254610/posts/default/6339016674075761088'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6713053201246254610/posts/default/6339016674075761088'/><link rel='alternate' type='text/html' href='http://fjhooker.blogspot.com/2010/07/twitter.html' title='Twitterクライアントを作ってみる'/><author><name>じょりちょこ</name><uri>http://www.blogger.com/profile/07616002137958212816</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_lfeTtzBiupk/SNT-4UlgamI/AAAAAAAAABo/DaNzCqXEfek/S220/portlait.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6713053201246254610.post-7777517047822462604</id><published>2009-10-21T23:17:00.001+09:00</published><updated>2009-10-21T23:20:58.487+09:00</updated><title type='text'>SKKSERV on Ubuntu</title><content type='html'>UbuntuでSKKを使いたい場合の情報はネット上にほとんどない。&lt;br /&gt;&lt;br /&gt;なんでだろう？　と思ったら、ddskkとdbskkd-cdbをパッケージマネージャからインストールして、inetdを再起動するだけで良いからだった。&lt;br /&gt;&lt;br /&gt;ただし、inetdのことは少しメモしておく価値があると思う。Ubuntuのデフォルトのinetdはopenbsd-inetdなので、起動スクリプトも/etc/init.d/openbsd-inetdである。/etc/init.d/inetdが見当たらないので、少し戸惑ってしまった。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6713053201246254610-7777517047822462604?l=fjhooker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjhooker.blogspot.com/feeds/7777517047822462604/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6713053201246254610&amp;postID=7777517047822462604' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6713053201246254610/posts/default/7777517047822462604'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6713053201246254610/posts/default/7777517047822462604'/><link rel='alternate' type='text/html' href='http://fjhooker.blogspot.com/2009/10/skkserv-on-ubuntu.html' title='SKKSERV on Ubuntu'/><author><name>じょりちょこ</name><uri>http://www.blogger.com/profile/07616002137958212816</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_lfeTtzBiupk/SNT-4UlgamI/AAAAAAAAABo/DaNzCqXEfek/S220/portlait.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6713053201246254610.post-692744561495031091</id><published>2009-10-04T23:57:00.003+09:00</published><updated>2009-10-05T00:27:23.289+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='J2EE'/><title type='text'>J2EE復習</title><content type='html'>部下に教える必要があり、J2EEを復習することに。&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;で、まずはTomcatのことなんだけど。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;うちの会社ではTomcatが標準として採用されている（一応、断っておくと、非標準のサーブレットコンテナを採用することは禁止されていない。単に、標準的にサポートされているのがTomcatだということだ）。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Tomcatと同じようなサーブレットコンテナとしては、まずJettyが思いつく。他にはWebLogic、WebSphere、Resinなどがあるようだ。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;JettyはTomcatと比較して軽量なサーブレットコンテナとして定評があるようだ。2009年10月4日現在で比較すると、Tomcat 6.xがServlet 2.5/JSP 2.1をサポートしており、最新リリースは6.0.20、Jetty 6.xがServlet 2.5/JSP 2.0をサポートしており、JSP 2.1をサポートしているJetty 7.xはRCである。Jettyは今のところ、6.1.21が最新安定版ということになるようだ。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;WebLogicやWebSphereは、その開発環境や運用ツールも込みで選択されるものだから、直接の比較対象にはならない。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Resinはどうか？ ResinはNTTデータがサポートを提供しているくらいであるから、エンタープライズ向けに十分の実績があると思われる。評判によれば非常に高速で安定しているらしい。現状、4.0.1が有償版となっており、3.1.9がGPLで配布されている。まあ、有償版といっても、1CPUあたり$699というから、ビジネスで使う分にはそう高価なものではない。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;J2EEを選択する理由というのは、一般に、性能云々より、信頼性や保守性が重要な要求としてあり、その上で性能が問題となったときのスケーラビリティにしかるべき選択肢があること、というのが動機となる。とにかく実行時性能を追求するようなケースでJ2EEを選択するということはさほどない（もちろんJ2EEで高速なWebアプリケーションを追求することは可能であるが、大人数で開発するJ2EEアプリケーションはしばしば低速である）。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;だから、メジャーであるという理由でTomcatを選ぶのは道理なのである。だが、一方でJettyやResinにも十分な実績があり、その原因にTomcatの遅さ、不安定さというものがあるのも事実だ。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;とりあえずJettyとResinはどちらも使えるようにしておこう。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6713053201246254610-692744561495031091?l=fjhooker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjhooker.blogspot.com/feeds/692744561495031091/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6713053201246254610&amp;postID=692744561495031091' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6713053201246254610/posts/default/692744561495031091'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6713053201246254610/posts/default/692744561495031091'/><link rel='alternate' type='text/html' href='http://fjhooker.blogspot.com/2009/10/j2ee.html' title='J2EE復習'/><author><name>じょりちょこ</name><uri>http://www.blogger.com/profile/07616002137958212816</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_lfeTtzBiupk/SNT-4UlgamI/AAAAAAAAABo/DaNzCqXEfek/S220/portlait.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6713053201246254610.post-3070600560055120607</id><published>2008-10-04T20:55:00.002+09:00</published><updated>2008-10-04T21:19:05.200+09:00</updated><title type='text'>Apacheのログ解析</title><content type='html'>手垢のついたテーマではあるが、ここ2年ほど色々痛い目にあってきたので、ここいらでその経験を活かしたソリューションに仕上げたい。&lt;br /&gt;&lt;br /&gt;まず、注意しなければならないのはメモリとCPUを節約しなければならないということだ。アクセスが増えてきたにも関わらず、予算の関係でサーバを増強できないということは、ままある。だいいち、お金があるなら、RTmetricsのようなアプライアンスを導入できるし、その方が良い。予算がない場合が問題なのだ。&lt;br /&gt;&lt;br /&gt;WebサーバとDBサーバを1台のサーバ機が兼任しているような環境で、しかもアクセスの増加にあえいでいるような局面でメモリとCPUを贅沢に使うわけにはいかない。だからRubyは選択肢から外さないといけない。なにしろRubyは遅いから。&lt;br /&gt;&lt;br /&gt;C/C++という選択も駄目だ。サーバ機がどんなOSで動いているかわからない。多数のサーバOSをサポートするのはできないことではないが、検証環境を揃えるだけの予算がないし、そこまで性能が必要なわけでもない。&lt;br /&gt;&lt;br /&gt;Javaは悪くない選択だ。まずは順当というところだろう。たいていのOSでJavaは稼動しているし、パフォーマンスも悪くない。&lt;br /&gt;&lt;br /&gt;Objective CamlとCommon Lispも有力な候補だ。どちらもたいていのサーバOSで稼動するし、ネイティブコードにコンパイルできる。DBとの連携にも支障がない。&lt;br /&gt;&lt;br /&gt;ほかにも候補はあるが、この3つの言語でそれぞれに実装してみよう。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6713053201246254610-3070600560055120607?l=fjhooker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjhooker.blogspot.com/feeds/3070600560055120607/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6713053201246254610&amp;postID=3070600560055120607' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6713053201246254610/posts/default/3070600560055120607'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6713053201246254610/posts/default/3070600560055120607'/><link rel='alternate' type='text/html' href='http://fjhooker.blogspot.com/2008/10/apache.html' title='Apacheのログ解析'/><author><name>じょりちょこ</name><uri>http://www.blogger.com/profile/07616002137958212816</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_lfeTtzBiupk/SNT-4UlgamI/AAAAAAAAABo/DaNzCqXEfek/S220/portlait.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6713053201246254610.post-4934038926479078947</id><published>2008-10-04T17:48:00.001+09:00</published><updated>2008-10-04T17:48:54.129+09:00</updated><title type='text'>いろいろひどい目にあった</title><content type='html'>腐らず再開しよう。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6713053201246254610-4934038926479078947?l=fjhooker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjhooker.blogspot.com/feeds/4934038926479078947/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6713053201246254610&amp;postID=4934038926479078947' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6713053201246254610/posts/default/4934038926479078947'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6713053201246254610/posts/default/4934038926479078947'/><link rel='alternate' type='text/html' href='http://fjhooker.blogspot.com/2008/10/blog-post.html' title='いろいろひどい目にあった'/><author><name>じょりちょこ</name><uri>http://www.blogger.com/profile/07616002137958212816</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_lfeTtzBiupk/SNT-4UlgamI/AAAAAAAAABo/DaNzCqXEfek/S220/portlait.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6713053201246254610.post-7846750772294549804</id><published>2008-09-21T09:06:00.001+09:00</published><updated>2008-09-21T09:06:40.478+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IDE'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='NetBeans'/><title type='text'>NetBeansのRubyサポート</title><content type='html'>うわさには聞いていたが、かなり賢い。&lt;br /&gt;Rubyのコードを解釈して補完してくれたりするのだが、Rubyの構文は人間には優しいがコンピュータには厄介な代物なので、よくやったなあと感心する。&lt;br /&gt;これでIDEがないとプログラミングできないタイプの人もRailsに来るんじゃないかな。&lt;br /&gt;&lt;br /&gt;# 本当はそういう奴はプログラミングの世界に来るべきじゃないんだが。&lt;br /&gt;   &lt;div class="flockcredit" style="text-align: right; color: #CCC; font-size: x-small;"&gt;Blogged with the &lt;a href="http://www.flock.com/blogged-with-flock" style="color: #999; font-weight: bold;" target="_new" title="Flock Browser"&gt;Flock Browser&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6713053201246254610-7846750772294549804?l=fjhooker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjhooker.blogspot.com/feeds/7846750772294549804/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6713053201246254610&amp;postID=7846750772294549804' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6713053201246254610/posts/default/7846750772294549804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6713053201246254610/posts/default/7846750772294549804'/><link rel='alternate' type='text/html' href='http://fjhooker.blogspot.com/2008/09/netbeansruby.html' title='NetBeansのRubyサポート'/><author><name>じょりちょこ</name><uri>http://www.blogger.com/profile/07616002137958212816</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_lfeTtzBiupk/SNT-4UlgamI/AAAAAAAAABo/DaNzCqXEfek/S220/portlait.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6713053201246254610.post-8679303338670251034</id><published>2008-09-21T08:37:00.002+09:00</published><updated>2008-09-21T08:41:45.662+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JRuby'/><category scheme='http://www.blogger.com/atom/ns#' term='Glassfish'/><category scheme='http://www.blogger.com/atom/ns#' term='WEBrick'/><category scheme='http://www.blogger.com/atom/ns#' term='Rails'/><category scheme='http://www.blogger.com/atom/ns#' term='NetBeans'/><title type='text'>NetBeans+JRuby+Rails</title><content type='html'>何気にNetBeansのRubyサポートはいい。&lt;br /&gt;Glassfishの上でJRuby on Railsがさくっと動く。今はWEBrickベースなようだが、Glashfishを前提にした本番環境が出てくるだろうね。期待しよう。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6713053201246254610-8679303338670251034?l=fjhooker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjhooker.blogspot.com/feeds/8679303338670251034/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6713053201246254610&amp;postID=8679303338670251034' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6713053201246254610/posts/default/8679303338670251034'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6713053201246254610/posts/default/8679303338670251034'/><link rel='alternate' type='text/html' href='http://fjhooker.blogspot.com/2008/09/netbeansjrubyrails.html' title='NetBeans+JRuby+Rails'/><author><name>じょりちょこ</name><uri>http://www.blogger.com/profile/07616002137958212816</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_lfeTtzBiupk/SNT-4UlgamI/AAAAAAAAABo/DaNzCqXEfek/S220/portlait.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6713053201246254610.post-2438861653808281290</id><published>2008-09-20T23:22:00.003+09:00</published><updated>2008-09-21T08:36:47.678+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Common Lisp'/><title type='text'>Common Lispの美点</title><content type='html'>t2ruさんの&lt;a href="http://d.hatena.ne.jp/t2ru/20080912/1221250077"&gt;Common Lispの美点&lt;/a&gt;を読んで。&lt;br /&gt;&lt;br /&gt;あえて付け加えるなら、最適化のための汚いコードをマクロの背後に隠すことができる点も強みとして加えてもいいかなあ。&lt;br /&gt;現実のアプリケーションでは、いったん出来上がったコードに最適化のためのコードやアドホックな修正のためのコードが追加されることが多い。そうすると、普通の言語ではどんどん本来の処理が見えにくくなってしまう。その点、Common Lispなら大丈夫だ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6713053201246254610-2438861653808281290?l=fjhooker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjhooker.blogspot.com/feeds/2438861653808281290/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6713053201246254610&amp;postID=2438861653808281290' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6713053201246254610/posts/default/2438861653808281290'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6713053201246254610/posts/default/2438861653808281290'/><link rel='alternate' type='text/html' href='http://fjhooker.blogspot.com/2008/09/common-lisp.html' title='Common Lispの美点'/><author><name>じょりちょこ</name><uri>http://www.blogger.com/profile/07616002137958212816</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_lfeTtzBiupk/SNT-4UlgamI/AAAAAAAAABo/DaNzCqXEfek/S220/portlait.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6713053201246254610.post-6401107658238986466</id><published>2008-09-20T22:00:00.003+09:00</published><updated>2008-09-20T22:17:51.926+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Common Lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='Objective Caml'/><title type='text'>Objective Camlの使いどころ</title><content type='html'>カリー化がわかってみると、Objective Camlは良さげに思えてきた。&lt;br /&gt;しかし、実際に何に使おうと思案してみると、意外に使いどころがない。&lt;br /&gt;&lt;br /&gt;いや、どんな応用に使っても良いんだろうとは思う。&lt;br /&gt;だが、僕にとっては速度を気にしないならRubyがfirst choiceで、速度が重要なのであればCommon Lispがfirst choiceになっている。そこに割って入るには、相応に理由付けが必要だ。&lt;br /&gt;&lt;br /&gt;Ocamlのストロングポイントは、静的型付けの安全で効率的な実行可能ファイルを（Javaあたりなどと比べて）より短いコードで書けるところにあるだろう。&lt;br /&gt;静的型付けという点を除くと、だいたいCommon Lispの方が勝る。特にコードが短くなる点と表現の自由度という点では勝負にならない。&lt;br /&gt;だから、あえてOcamlを使うからには、プログラムの正しさをコンパイラで確認したいというニーズが必要だ。つまり、性能と正確さが要求されるケースだ。&lt;br /&gt;&lt;br /&gt;その要求が成立するには、仕様をフォーマルに記述しうる状況が必要だ。RubyやCommon Lispには柔軟性があるから、仕様がフィックスしていない案件で力を発揮する。僕の仕事では、仕様がフィックスしないことの方が多いのだ。&lt;br /&gt;&lt;br /&gt;ここ数日、Apacheのアクセスログを解析する高速なプログラムを書きたいと思っていて、Common Lispでやろうかと思っていたのだが、これこそOcamlの出番のように思われる。すでに運用中のプログラムがあるので、仕様はもう固まっているからだ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6713053201246254610-6401107658238986466?l=fjhooker.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjhooker.blogspot.com/feeds/6401107658238986466/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6713053201246254610&amp;postID=6401107658238986466' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6713053201246254610/posts/default/6401107658238986466'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6713053201246254610/posts/default/6401107658238986466'/><link rel='alternate' type='text/html' href='http://fjhooker.blogspot.com/2008/09/objective-caml.html' title='Objective Camlの使いどころ'/><author><name>じょりちょこ</name><uri>http://www.blogger.com/profile/07616002137958212816</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_lfeTtzBiupk/SNT-4UlgamI/AAAAAAAAABo/DaNzCqXEfek/S220/portlait.JPG'/></author><thr:total>0</thr:total></entry></feed>
