<?xml version="1.0" encoding="UTF-8" ?>
<rss version='2.0'><channel><title>Kahua HEAD</title
><link>http://khead.kahua.org/kahua-web/show</link
><description>Recent changes...</description
><lastBuildDate>Wed, 26 Nov 2008 12:31:32 +0900</lastBuildDate
><pubDate>Thu, 09 Oct 2008 13:05:15 +0900</pubDate
><docs>http://blogs.law.harvard.edu/tech/rss</docs
><generator>kahua-web 0.4_pre2</generator
><item><title>Kahua HEAD: Top Page</title
><link>http://khead.kahua.org/kahua-web/show</link
><pubDate>Thu, 09 Oct 2008 13:05:15 +0900</pubDate
><description>&lt;div&gt;&lt;h2 id=&#39;H-1i7ie2fb9dnz3&#39;&gt;Kahua HEAD へようこそ
&lt;/h2
&gt;&lt;p&gt;Kahua とそのアプリケーションである kahua-web について議論したり、実験したりするためのサイトです。
実験サイトということは、
&lt;/p
&gt;&lt;ul&gt;&lt;li&gt;Kahua は常に Subversion リポジトリの最新のものを使う
&lt;/li
&gt;&lt;li&gt;kahua-web は常に Subversion リポジトリの最新のものを使う
&lt;/li
&gt;&lt;li&gt;頻繁に再起動されるとおもわれる
&lt;/li
&gt;&lt;li&gt;使い勝手が突然変更されるかもしれない
&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;p&gt;今のところ、
&lt;/p
&gt;&lt;ul&gt;&lt;li&gt;この kahua-web にはだれでも login できます。つまり、だれでも編集できます。
&lt;/li
&gt;&lt;li&gt;Kahua の配布物に含まれているサンプルプログラムの動作を見ることができます
&lt;ul&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/Kahua%20Demo&#39;&gt;Kahua Demo&lt;/a
&gt;
&lt;/li
&gt;&lt;/ul
&gt;&lt;/li
&gt;&lt;li&gt;他のコンテンツはどれも放置状態でかなり古くなっています。特に&lt;a href=&#39;/kahua-web/show/eg&#39;&gt;Enjoy Gauche&lt;/a
&gt;はかなり古いです。
&lt;/li
&gt;&lt;/ul
&gt;&lt;h3 id=&#39;H-1l5qzery1zrov&#39;&gt;関連リンク
&lt;/h3
&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&#39;http://www.kahua.org/cgi-bin/kahua.fcgi/kahua-web/&#39;&gt;Kahua Project&lt;/a
&gt;
&lt;/li
&gt;&lt;li&gt;&lt;a href=&#39;http://practical-scheme.net/gauche/index-j.html&#39;&gt;Gauche&lt;/a
&gt;
&lt;/li
&gt;&lt;li&gt;&lt;a href=&#39;http://practical-scheme.net/wiliki/wiliki.cgi&#39;&gt;Gaucheの作者shiroさんのWiLiKi&lt;/a
&gt;
&lt;/li
&gt;&lt;/ul
&gt;&lt;hr /&gt;&lt;h2 id=&#39;H-39r08xhiid2&#39;&gt;What&amp;#39;s New
&lt;/h2
&gt;&lt;ul&gt;&lt;li&gt; (2008-10-09): 本当に久しぶりに、kheadで動作させているKahuaをtrunk(1.1_pre19)に入れ替えました。
&lt;/li
&gt;&lt;li&gt; (2007-08-31): Kahuaをstable1_0ブランチ先端(1.0.7_pre2)に変更しました。Kahua DemoのWiki-Ikiでログインできなかった不具合が直っています。
&lt;/li
&gt;&lt;li&gt; (2007-08-01): Kahuaを1.0.6に変更しました。
&lt;/li
&gt;&lt;li&gt; (2007-07-23): 新サーバへの移行を完了しました。
&lt;/li
&gt;&lt;li&gt; (2007-07-19): KHeadを新サーバに移行し、&lt;a href=&#39;http://khead.kahua.org/&#39;&gt;http://khead.kahua.org/&lt;/a
&gt; に変更しました。週末までに順次kahua.orgのサーバ/サービスを移行していきます。
&lt;/li
&gt;&lt;li&gt; (2007-07-08): kahua-webをHEAD(0.4_pre2)に変更しました。
&lt;/li
&gt;&lt;li&gt; (2007-07-05): Kahuaをstable1_0ブランチ先端(1.0.6_pre0)に、kahua-webをHEAD(0.4_pre1)に変更し、RSSのdescriptionにページデータを含める機能を再度有効にしました。
&lt;/li
&gt;&lt;li&gt; (2007-07-05): RSSのdescriptionとしてページデータをそのまま含める機能を一時的にOFFにしました。
&lt;/li
&gt;&lt;li&gt; (2007-07-04): kahua-webをHEAD(0.4_pre0)に変更しました。RSSにページ全体をdescriptionとして含めるようになりました。ただし、まだいくつかバグが残っています。RSSの順番と日付がおかしくなっているのはその影響です。
&lt;/li
&gt;&lt;li&gt; (2007-07-01): Kahuaを1.0.5に変更しました。
&lt;/li
&gt;&lt;li&gt; (2007-06-29): Kahuaをstable1_0ブランチ先端(1.0.5_pre2)に変更しました。&lt;a href=&#39;/kahua-web/show/Kahua%20Demo&#39;&gt;Kahua Demo&lt;/a
&gt;に挙げているサンプルのコードを最近のテクニックに基づくものにしました。
&lt;/li
&gt;&lt;li&gt; (2007-06-29): Kahuaをstable1_0ブランチ先端(1.0.5_pre1)に変更しました。
&lt;/li
&gt;&lt;li&gt; (2007-06-19): Kahuaをstable1_0ブランチ先端(1.0.5_pre0)に更新しました。ごくまれにインデックスキャッシュがおかしくなる不具合が修正されているはずです。
&lt;/li
&gt;&lt;li&gt; (2007-06-12): kahua-webを0.3.1リリース版に変更しました。
&lt;/li
&gt;&lt;li&gt; (2007-06-12): kahua-webをHEAD(0.3.1_pre3)に変更しました。NewsやRecent Changesの書式を変えてみました。
&lt;/li
&gt;&lt;li&gt; (2007-06-11): kahua-webをHEAD(0.3.1_pre1-&amp;gt;0.3.1_pre2)に変更しました。ページの探索にインデックススロットを使うようになったので、以前よりはぐっと軽くなったはずです。
&lt;/li
&gt;&lt;li&gt; (2007-06-08): kahua-webをHEAD(0.3.1_pre0)に変更しました。また、side-paneに「Kahua開発日記」のRSSをインクルードしてみました。
&lt;/li
&gt;&lt;li&gt; (2007-06-04): kahua-webをHEAD(0.3_pre11)に変更しました。また、諸般の事情により、Kahuaをstable1_0枝先端に変更しました。
&lt;/li
&gt;&lt;li&gt; (2007-05-29): kahua-webをHEAD(0.3_pre10)に変更しました。トップページの扱いが変更され、&amp;quot;/$admin/home&amp;quot; という名前のページを編集しなくても、編集リンクから編集画面に入れるようになりました。
&lt;/li
&gt;&lt;li&gt; (2007-05-28): kahua-webをHEAD(0.3_pre9)に変更しました。コメントフォームに素朴なSPAMチェック機構を組み込んであります。
&lt;/li
&gt;&lt;li&gt; (2007-05-23): kahua-webをHEAD(0.3_pre8)に変更しました。
&lt;/li
&gt;&lt;li&gt; (2007-05-23): kahua-webをHEAD(0.3_pre7)に変更しました。RSSまわりの改良を行っています。
&lt;/li
&gt;&lt;li&gt; (2007-05-22): kahua-webをHEAD(0.3_pre6)に変更しました。レイアウトを元に戻しました。カラーリングはそのままです。
&lt;/li
&gt;&lt;li&gt; (2007-05-18): kahua-webをHEAD(0.3_pre5)に変更しました。認証関係を整理&amp;amp;強化しました。さらにレイアウトとカラーリングを変更しました。
&lt;/li
&gt;&lt;li&gt; (2007-05-17): kahua-webをHEAD(0.3_pre4)に変更しました。静的コンテンツを埋め込むためのマクロを大幅に拡張しています(がnon-member-editな環境では動かないので、あまり意味はないかも)。
&lt;/li
&gt;&lt;li&gt; (2007-05-15): kahua-webをHEAD(0.3_pre2)に変更しました。スタイルを微調整中です。
&lt;/li
&gt;&lt;li&gt; (2007-05-14): kahua-webをHEAD(0.3_pre1)に変更し、スタイルも大幅に書き換えました。
&lt;/li
&gt;&lt;li&gt; (2007-04-26): KahuaをHEAD(1.1_pre4)に変更しました。
&lt;/li
&gt;&lt;li&gt; (2007-04-13): KahuaをHEAD(1.1_pre2)に更新しました。
&lt;/li
&gt;&lt;li&gt; (2007-04-12): KahuaをHEAD(1.1_pre1)に更新しました。
&lt;/li
&gt;&lt;li&gt; (2007-03-01): SPAMコメントが多すぎる(そればっかりともいう)ので、コメント欄を閉鎖しました。対策を施してから順次再公開します。
&lt;/li
&gt;&lt;li&gt; (2007-02-15): stable1_0ブランチの変更をHEADにマージしたので、KahuaをHEAD(1.1_pre0)に更新しました。
&lt;/li
&gt;&lt;li&gt; (2007-02-14): Kahuaをstable1_0ブランチ先端にアップデートしました。問題がなければこれが1.0.2になります。
&lt;/li
&gt;&lt;li&gt; (2007-01-31): Gaucheを0.8.9に、Kahuaを1.0.1にアップデートしました。
&lt;/li
&gt;&lt;li&gt; (2007-01-18): Kahuaをstable1_0ブランチ先端にアップデートしました。問題がなければこれが1.0.1になります。
&lt;/li
&gt;&lt;li&gt; (2007-01-12): KahuaをCVSのstable1_0ブランチ先端にアップデートしました。
&lt;/li
&gt;&lt;/ul
&gt;&lt;p&gt;&lt;a href=&#39;/kahua-web/show/UpdateLog&#39;&gt;&amp;gt;&amp;gt;2006年以前&lt;/a
&gt;
&lt;/p
&gt;&lt;/div
&gt;</description
></item
><item><title>実験室</title
><link>http://khead.kahua.org/kahua-web/show/Lab/%e5%ae%9f%e9%a8%93%e5%ae%a4</link
><pubDate>Fri, 22 Feb 2008 15:19:45 +0900</pubDate
><description>&lt;div&gt;&lt;h2 id=&#39;H-2un2v5x9f4xqs&#39;&gt;実験的な実装やアイデア
&lt;/h2
&gt;&lt;hr /&gt;&lt;h3 id=&#39;H-b9tv59n01may&#39;&gt;[[kahua.css//S式CSSインタプリタ]]
&lt;/h3
&gt;&lt;p&gt;S式CSSインタプリタ、色オブジェクト
&lt;/p
&gt;&lt;h3 id=&#39;H-vrwbihaftu6i&#39;&gt;[[kahua.js//S式JavaScriptインタプリタ]]
&lt;/h3
&gt;&lt;p&gt;S式JavaScriptインタプリタ
&lt;/p
&gt;&lt;h3 id=&#39;H-2li2mrg1gl1yt&#39;&gt;[[キャッシュ機構]]
&lt;/h3
&gt;&lt;p&gt;ページのキャッシュ
&lt;/p
&gt;&lt;h3 id=&#39;H-32uy4wstt2ixs&#39;&gt;[[永続データのマイグレーション]]
&lt;/h3
&gt;&lt;p&gt;プロセスを跨いだデータマイグレーション
&lt;/p
&gt;&lt;h3 id=&#39;H-2zo194213skyi&#39;&gt;[[エントリのディスパッチ]]
&lt;/h3
&gt;&lt;/div
&gt;</description
></item
><item><title>部品化テクノロジ</title
><link>http://khead.kahua.org/kahua-web/show/Lab/%e9%83%a8%e5%93%81%e5%8c%96%e3%83%86%e3%82%af%e3%83%8e%e3%83%ad%e3%82%b8</link
><pubDate>Fri, 22 Feb 2008 15:19:26 +0900</pubDate
><description>&lt;div&gt;&lt;/div
&gt;</description
></item
><item><title>注意事項_</title
><link>http://khead.kahua.org/kahua-web/show/%e6%b3%a8%e6%84%8f%e4%ba%8b%e9%a0%85_</link
><pubDate>Thu, 19 Jul 2007 14:28:56 +0900</pubDate
><description>&lt;div&gt;&lt;h2 id=&#39;H-2sawprpjq5u4r&#39;&gt;Safari さま、何がいけないのでしょうか
&lt;/h2
&gt;&lt;ul&gt;&lt;li&gt;Safari でこのページにアクセスしてから login しようとしても
login できない。
&lt;/li
&gt;&lt;li&gt;Safari でトップページにアクセスして login してからこのページに来ると
logout してしまう。
&lt;/li
&gt;&lt;li&gt;[[利用方法]]のページでもおなじ
&lt;/li
&gt;&lt;li&gt;新しいサーバに移し、charset=UTF-8で運用を開始したところ、現象が変わった。(2007-07-19)
&lt;ul&gt;&lt;li&gt;Safariでこのページにログインしようとするとログインできずにトップページに飛ばされる。このとき、showの後ろに「注意事項」がUTF-8な文字列としてURLエンコードされた文字列の最後の2bytes分が失われた状態で続いている。
&lt;/li
&gt;&lt;li&gt;他のページでログイン後、このページに来てもログアウトしなくなっている。この時、showの後ろは「注意事項」という文字列がエンコードされずに表示されている。
&lt;/li
&gt;&lt;li&gt;[[利用方法]]のページではこの不具合は発生しない。
&lt;/li
&gt;&lt;li&gt;「注意事項」を「注意事項_」にリネームすると問題は発生しない。
&lt;/li
&gt;&lt;/ul
&gt;&lt;/li
&gt;&lt;/ul
&gt;&lt;h2 id=&#39;H-2kcdx0srcbj44&#39;&gt;ごめんなさい　ＩＥ６さま
&lt;/h2
&gt;&lt;p&gt;IE6 さまの名誉を傷つけるような発言をしたことをお詫びいたします。
&lt;/p
&gt;&lt;p&gt;ことの経緯
&lt;/p
&gt;&lt;ul&gt;&lt;li&gt;IE6 でこのページにアクセスしてから login するとエラーになる
&lt;/li
&gt;&lt;li&gt;IE6 でトップページにアクセスして login してからこのページに来て、
  編集し、commitボタンをクリックするとエラーになる
&lt;/li
&gt;&lt;li&gt;でも[[利用方法]]のページではエラーはでない
&lt;/li
&gt;&lt;/ul
&gt;&lt;p&gt;ということがあったために、つい、IE6 さまの名誉を傷つけるような発言をしてしまいました。ゴメンナさい。
&lt;/p
&gt;&lt;p&gt;原因は、login や commit ボタンをクリックしたあとに戻るページの URL が
URL エンコードされていなかったためでした。Mozilla 系のブラウザではそのような
不具合が観測されなかったため今まで見逃していたようです。
&lt;/p
&gt;&lt;/div
&gt;</description
></item
><item><title>Kahua Demo</title
><link>http://khead.kahua.org/kahua-web/show/Kahua%20Demo</link
><pubDate>Thu, 19 Jul 2007 00:45:50 +0900</pubDate
><description>&lt;div&gt;&lt;p&gt;Kahua の配布物に含まれる Sample アプリケーションの動作を見ることができます。
&lt;/p
&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&#39;http://khead.kahua.org/lambdabooks&#39;&gt;lambdabooks&lt;/a
&gt;
&lt;/li
&gt;&lt;li&gt;&lt;a href=&#39;http://khead.kahua.org/wiki-iki&#39;&gt;wiki-iki&lt;/a
&gt;
&lt;/li
&gt;&lt;li&gt;&lt;a href=&#39;http://khead.kahua.org/login&#39;&gt;login&lt;/a
&gt;
&lt;/li
&gt;&lt;li&gt;&lt;a href=&#39;http://khead.kahua.org/nqueen&#39;&gt;nqueen&lt;/a
&gt;
&lt;/li
&gt;&lt;li&gt;&lt;a href=&#39;http://khead.kahua.org/lazy-nqueen&#39;&gt;lazy-nqueen&lt;/a
&gt;
&lt;/li
&gt;&lt;li&gt;&lt;a href=&#39;http://khead.kahua.org/foldlist&#39;&gt;foldlist&lt;/a
&gt;
&lt;/li
&gt;&lt;li&gt;&lt;a href=&#39;http://khead.kahua.org/lambdacalcul&#39;&gt;lambdacalcul&lt;/a
&gt;
&lt;/li
&gt;&lt;/ul
&gt;&lt;/div
&gt;</description
></item
><item><title>UpdateLog</title
><link>http://khead.kahua.org/kahua-web/show/UpdateLog</link
><pubDate>Wed, 11 Jul 2007 10:20:11 +0900</pubDate
><description>&lt;div&gt;&lt;h2 id=&#39;H-1acb40t6&#39;&gt;2006
&lt;/h2
&gt;&lt;p&gt;&lt;ul&gt;&lt;li&gt; (2006-12-28): Kahua 1.0にアップデートしました。
&lt;/li
&gt;&lt;li&gt; (2006-12-27): KahuaをCVS HEAD(1.0rc)にアップデートしました。
&lt;/li
&gt;&lt;li&gt; (2006-12-22): KahuaをCVS HEADにアップデートしました。
&lt;/li
&gt;&lt;li&gt; (2006-12-14): Kahua 0.9.1にアップデートしました。
&lt;/li
&gt;&lt;li&gt; (2006-12-13): Kahua 0.9にアップデートしました。
&lt;/li
&gt;&lt;li&gt; (2006-11-21): Kahua 0.8にアップデートしました。
&lt;/li
&gt;&lt;li&gt; (2006-11-20): KahuaをCVS HEADに入れ替えました。問題がなければこれが0.8になります。
&lt;/li
&gt;&lt;li&gt; (2006-09-29): Kahua-0.7、kahua-web-0.2.6にアップデートしました。
&lt;/li
&gt;&lt;li&gt; (2006-09-28): Kahua/kahua-webともにCVS HEAD版に更新しました。問題がなければ 0.7/0.2.6 として間もなくリリースします。
&lt;/li
&gt;&lt;li&gt; (2006-09-28): 誰でもログインして書き込める設定に戻しました。
&lt;/li
&gt;&lt;li&gt; (2006-09-21): CVS HEAD版に更新しました。トランザクションまわりの改良中です。
&lt;/li
&gt;&lt;li&gt; (2006-09-21): 都合により、しばらくの間、書き込みできるのは正規アカウントユーザのみとします。ご了承ください。
&lt;/li
&gt;&lt;li&gt; (2006-09-08): Kahua-0.6にアップデートしました。
&lt;/li
&gt;&lt;li&gt; (2006-08-05): Kahua-0.5.1、kahua-web-0.2.5にアップデートしました。
&lt;/li
&gt;&lt;li&gt; (2006-08-02): 稼働環境となるKahua、kahua-webをHEADのものに入れ替えました。ちなみにGaucheもCVS HEAD+unofficial patchesというチャレンジャーなもので動かしています。
&lt;/li
&gt;&lt;li&gt; (2006-07-05): 稼働環境となるKahuaを開発ブランチ先端のものに入れ替えました。
&lt;/li
&gt;&lt;/ul
&gt;
&lt;/p
&gt;&lt;h2 id=&#39;H-1acb40t1&#39;&gt;2005
&lt;/h2
&gt;&lt;p&gt;&lt;ul&gt;&lt;li&gt; (2005-05-24): &lt;a href=&#39;/kahua-web/show/%e3%83%89%e7%b4%a0%e4%ba%ba%e3%81%a8Kahua&#39;&gt;ド素人とKahua&lt;/a
&gt;始めました。
&lt;a href=&#39;/kahua-web/show/dkj/%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab&#39;&gt;インストール&lt;/a
&gt;を追加しました。
&lt;/li
&gt;&lt;li&gt; (2005-03-18): Enjoy Gauche
&lt;a href=&#39;http://www.kahua.org/cgi-bin/khead.fcgi/kahua-web/show/eg/&#39;&gt;Additional Online Meterial&lt;/a
&gt;を追加しました。
&lt;/li
&gt;&lt;li&gt; (2005-02-08): Enjoy Gauche
&lt;a href=&#39;http://www.kahua.org/cgi-bin/khead.fcgi/kahua-web/show/eg/iteration&#39;&gt;8章 繰り返し&lt;/a
&gt;  8.3節、8.4節 8.5節を追加しました。
&lt;/li
&gt;&lt;li&gt; (2005-02-01): Enjoy Gauche
8章 を追加しました。
&lt;/li
&gt;&lt;li&gt;(2005-01-24): Enjoy Gauche
&lt;a href=&#39;http://www.kahua.org/cgi-bin/khead.fcgi/kahua-web/show/eg/data&#39;&gt;7章データ&lt;/a
&gt; を追加しました。
&lt;/li
&gt;&lt;li&gt;(2005-01-17): Enjoy Gauche &lt;a href=&#39;http://www.kahua.org/cgi-bin/khead.fcgi/kahua-web/show/eg/script#H-8d7s40&#39;&gt;6.4. 例: 華氏摂氏変換&lt;/a
&gt; を追加しました。
&lt;/li
&gt;&lt;li&gt;(2005-01-11): &lt;a href=&#39;/kahua-web/show/eg/debug&#39;&gt;「B. Gauche でのデバッグ」&lt;/a
&gt;を書きました。
&lt;/li
&gt;&lt;li&gt;(2005-01-07): &lt;a href=&#39;/kahua-web/show/Kahua%20Bug&#39;&gt;Kahuaのバグ報告用&lt;/a
&gt;のページと&lt;a href=&#39;/kahua-web/show/Kahua%20Wish%20List&#39;&gt;Kahuaへの要望用&lt;/a
&gt;のページを作りました。
&lt;/li
&gt;&lt;/ul
&gt;
&lt;/p
&gt;&lt;/div
&gt;</description
></item
><item><title>iteration</title
><link>http://khead.kahua.org/kahua-web/show/eg/iteration</link
><pubDate>Fri, 06 Jul 2007 11:14:44 +0900</pubDate
><description>&lt;div&gt;&lt;hr /&gt;&lt;p&gt;##(toc)
&lt;/p
&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/Enjoy%20Gauche&#39;&gt;Enjoy Gauche の目次&lt;/a
&gt;
&lt;/li
&gt;&lt;/ul
&gt;&lt;hr /&gt;&lt;h2 id=&#39;H-1oxc8ixt238zp&#39;&gt;8. 繰り返し
&lt;/h2
&gt;&lt;p&gt;プログラムでは、「繰り返し」同じ計算をするということが良くあります。
例えば、&lt;a href=&#39;/kahua-web/show/eg/recursion&#39;&gt;5. 再帰&lt;/a
&gt;の章の問題 5.1.はまさにそれにあたります。
&lt;/p
&gt;&lt;p&gt;ここでは、練習問題 5.1. を解きながら、「繰り返し」について考えてみましょう。
&lt;/p
&gt;&lt;h3 id=&#39;H-3sqvoxedkfnzv&#39;&gt;8.1. 「n 以下の非負整数の和」
&lt;/h3
&gt;&lt;p&gt;求める関数を sum としましょう。こんなふうに考えると簡単です。
&lt;/p
&gt;&lt;ol&gt;&lt;li&gt;自明な場合、n = 0 の場合、これは明かに 0 です。
&lt;/li
&gt;&lt;li&gt;0 から n までの和は、n 足す、0 から n - 1 までの和です。
&lt;/li
&gt;&lt;/ol
&gt;&lt;p&gt;これらを、定義にまとめると
&lt;/p
&gt;&lt;pre&gt;(define (sum n)
  (if (= n 0)
      0
      (+ n (sum (- n 1)))))
&lt;/pre
&gt;&lt;p&gt;実行してみましょう。
&lt;/p
&gt;&lt;pre&gt;gosh&amp;gt; (sum 0)
0
gosh&amp;gt; (sum 1)
1
gosh&amp;gt; (sum 10)
55
&lt;/pre
&gt;&lt;h4 id=&#39;H-2a0sdxleb69yv&#39;&gt;8.1.1. ロバストに
&lt;/h4
&gt;&lt;p&gt;つぎに行くまえにちょいとまわり道をします。
上で定義した関数はとりあえず正しく動作しますか？
ほんとに大丈夫ですか？
&lt;/p
&gt;&lt;p&gt;ではちょっといじめてみましょうか。
&lt;/p
&gt;&lt;pre&gt;gosh&amp;gt; (sum -1) ^C ;; 止まらないので Control-C で強制終了させる
*** ERROR: unhandled signal 2 (SIGINT)
Stack Trace:
_______________________________________
  0  (sum (- n 1))
        At line 4 of &amp;quot;(stdin)&amp;quot;
  1  (sum (- n 1))
        At line 4 of &amp;quot;(stdin)&amp;quot;
  2  (sum (- n 1))
        At line 4 of &amp;quot;(stdin)&amp;quot;
...
&lt;/pre
&gt;&lt;p&gt;なにが起ってますか？traceしてみましょう。
&lt;/p
&gt;&lt;pre&gt;gosh&amp;gt; (use ggc.debug.trace)
(#&amp;lt;module ggc.debug.trace&amp;gt; #&amp;lt;module gauche.interactive&amp;gt;)
gosh&amp;gt; (trace sum)
#&amp;lt;closure 0x8ae1c00(x)&amp;gt;
gosh&amp;gt; (sum -1) ^C ;; 止まらないので Control-C で強制終了させる
(sum -1)
0:(sum -1)
1:  (sum -2)
2:    (sum -3)
3:      (sum -4)
4:        (sum -5)
5:          (sum -6)
6:            (sum -7)
7:    *** ERROR: unhandled signal 2 (SIGINT)
...
&lt;/pre
&gt;&lt;p&gt;こりゃだめですよね。問題は、sum の引数が、非負でなければならないのに
負の数を与えてしまった。からです。すこし、修正しましょう。
&lt;/p
&gt;&lt;pre&gt;(define (sum n)
  (if (negative? n)
      (error &amp;quot;Not non-negative number -- SUM &amp;quot; n)
      (if (= 0 n)
          0
          (+ n (sum (- n 1))))))
&lt;/pre
&gt;&lt;p&gt;与えられた引数が、負だったらエラーになるようにしました。
&lt;/p
&gt;&lt;pre&gt;gosh&amp;gt; (sum -1)
*** ERROR: Not non-negative number -- SUM -1
Stack Trace:
_______________________________________
&lt;/pre
&gt;&lt;p&gt;大丈夫かなぁ。
&lt;/p
&gt;&lt;pre&gt;gosh&amp;gt; (sum 5.5)
*** ERROR: Not non-negative number -- SUM  -0.5
Stack Trace:
_______________________________________
  0  (sum (- n 1))
        At line 25 of &amp;quot;(stdin)&amp;quot;
  1  (sum (- n 1))
        At line 25 of &amp;quot;(stdin)&amp;quot;
  2  (sum (- n 1))
        At line 25 of &amp;quot;(stdin)&amp;quot;
  3  (sum (- n 1))
        At line 25 of &amp;quot;(stdin)&amp;quot;
  4  (sum (- n 1))
        At line 25 of &amp;quot;(stdin)&amp;quot;
  5  (sum (- n 1))
        At line 25 of &amp;quot;(stdin)&amp;quot;
&lt;/pre
&gt;&lt;p&gt;ちょっと、エラーメッセージが変ですよね。「整数じゃなくちゃダメだよ」という
メッセージにしたいですね。
&lt;/p
&gt;&lt;pre&gt;(define (sum n)
  (cond ((not (integer? n)) (error &amp;quot;Not integer -- SUM&amp;quot; n))
        ((negative? n) (error &amp;quot;Not non-negative number -- SUM&amp;quot; n))
        (else (if (zero? n)
                  0
                  (+ n (sum (- n 1)))))))
&lt;/pre
&gt;&lt;p&gt;cond は条件によって分岐するためのスペシャルフォーム(特殊形式)です。
さてどうでしょう。
&lt;/p
&gt;&lt;pre&gt;gosh&amp;gt; (sum 3.5)
*** ERROR: Not integer -- SUM 3.5
Stack Trace:
_______________________________________
gosh&amp;gt; (sum -2)
*** ERROR: Not non-negative number -- SUM -2
Stack Trace:
_______________________________________
gosh&amp;gt; (sum 10.0)
55.0
gosh&amp;gt; (use ggc.debug.trace)
(#&amp;lt;module ggc.debug.trace&amp;gt; #&amp;lt;module gauche.interactive&amp;gt;)
gosh&amp;gt; (trace sum)
#&amp;lt;closure 0x8ae17a0(x)&amp;gt;
gosh&amp;gt; (sum 5)
0:(sum 5)
1:  (sum 4)
2:    (sum 3)
3:      (sum 2)
4:        (sum 1)
5:          (sum 0)
            -&amp;gt;0
          -&amp;gt;1
        -&amp;gt;3
      -&amp;gt;6
    -&amp;gt;10
  -&amp;gt;15
; trace: sum has been called 6 times.
15
&lt;/pre
&gt;&lt;p&gt;まぁこんなとこですか？
&lt;/p
&gt;&lt;h3 id=&#39;H-3c0c6kwd4nur0&#39;&gt;8.2. 繰り返しのパターン
&lt;/h3
&gt;&lt;p&gt;繰り返しのあらわれる関数の定義にはあるパターンが存在します。
&lt;/p
&gt;&lt;h4 id=&#39;H-28k6qt45r9d0r&#39;&gt;8.2.1. 和と階乗との比較
&lt;/h4
&gt;&lt;p&gt;では、&lt;a href=&#39;/kahua-web/show/eg/recursion&#39;&gt;5. 再帰&lt;/a
&gt;で定義した階乗計算と比較してみましょう。
両方とも(ロバストではない)素朴な実装で比べてみます。関数名を
同じにすると、
&lt;/p
&gt;&lt;p&gt;和
&lt;/p
&gt;&lt;pre&gt;(define (f n)
  (if (= n 0)
      0
      (+ n (f (- n 1)))))
&lt;/pre
&gt;&lt;p&gt;階乗
&lt;/p
&gt;&lt;pre&gt;(define (f n)
  (if (= n 0)
      1
      (* n (f (- n 1)))))
&lt;/pre
&gt;&lt;p&gt;そっくりですねぇ。違いは
&lt;/p
&gt;&lt;ul&gt;&lt;li&gt;n = 0 だったときに返す値(一方は 0 で他方は 1)
&lt;/li
&gt;&lt;li&gt;+ か * か
です。
&lt;/li
&gt;&lt;/ul
&gt;&lt;h4 id=&#39;H-102nokgj5sarw&#39;&gt;8.2.2. 繰り返しパターンを関数にする
&lt;/h4
&gt;&lt;p&gt;このように構造がそっくりで一部だけ違うというのなら、その相違する
部分を引数にして、和や階乗を計算する関数を生成することができます。
&lt;/p
&gt;&lt;pre&gt;(define (accumulator-gen b i)
  (lambda (n)
    (if (= n 0)
        i
        (b n ((accumulator-gen b i) (- n 1))))))
&lt;/pre
&gt;&lt;ul&gt;&lt;li&gt;引数の b は二つの数値を引数としてとり、数値を返す関数。
したがって、+ とか * も b に渡せる関数です。
&lt;/li
&gt;&lt;li&gt;引数の i は、作った関数の引数が 0 であったときに返す数。
&lt;/li
&gt;&lt;/ul
&gt;&lt;p&gt;こうすると、たとえば、階乗を計算する関数 fact は
&lt;/p
&gt;&lt;pre&gt;gosh&amp;gt; (define fact (accumulator-gen * 1))
fact
gosh&amp;gt; (fact 10)
3628800
&lt;/pre
&gt;&lt;p&gt;和を計算する方は
&lt;/p
&gt;&lt;pre&gt;gosh&amp;gt; (define sum (accumulator-gen + 0))
sum
gosh&amp;gt; (sum 10)
55
&lt;/pre
&gt;&lt;p&gt;さらに便利なことに、n以下の非負整数の自乗の和というのは、
&lt;/p
&gt;&lt;pre&gt;(accumulator-gen (lambda (x y) (+ (square x) y)) 0)
&lt;/pre
&gt;&lt;p&gt;と定義できますよね。(実行してみる前に、じっくり考えて下さい)
&lt;/p
&gt;&lt;pre&gt;gosh&amp;gt; (define (square x) (* x x))
square
gosh&amp;gt; (define sum-squares (accumulator-gen (lambda (x y) (+ (square x) y)) 0))
sum-squares
gosh&amp;gt; (sum-squares 10)
385
&lt;/pre
&gt;&lt;p&gt;このようにプログラムの中で自由自在に関数つくれるのが、Gauche の醍醐味です。
&lt;/p
&gt;&lt;h3 id=&#39;H-1t56330cav37a&#39;&gt;8.3. もうひとつ別の繰り返しパターン
&lt;/h3
&gt;&lt;h4 id=&#39;H-pb4esj2womex&#39;&gt;8.3.1. 「n 以下の非負整数の和」ふたたび
&lt;/h4
&gt;&lt;p&gt;8.1. とは違う考えかたで、「n 以下の非負整数の和」を考えてみましょう。
&lt;/p
&gt;&lt;ul&gt;&lt;li&gt;1. 0に1を足す
&lt;/li
&gt;&lt;li&gt;2. その結果に2を足す
&lt;/li
&gt;&lt;li&gt;3. その結果に3を足す
&lt;/li
&gt;&lt;/ul
&gt;&lt;ul&gt;&lt;li&gt;n. その結果にnを足す
&lt;/li
&gt;&lt;li&gt;nになったのでおわり
&lt;/li
&gt;&lt;/ul
&gt;&lt;p&gt;という手順です。もうすこしプログラム風にいえば、
&lt;/p
&gt;&lt;ol&gt;&lt;li&gt;計算のあるステップは、それまでの部分的な結果とカウンタをもらって、
新しい部分的な結果と更新されたカウンタを計算して次のステップに行く。
&lt;/li
&gt;&lt;li&gt;もらった、カウンタの値が n を超えていたらそのとき貰った部分的な
結果を最終結果として返す
&lt;/li
&gt;&lt;/ol
&gt;&lt;p&gt;というものです。この方針で、まず「n 以下の非負整数の和」を定義して
みましょう。とりあえず関数の名前を sum-iter とでもしておきましょう。
&lt;/p
&gt;&lt;pre&gt;(define (sum-iter partial-sum counter max-count)
  (if (&amp;gt; counter max-count)
      partial-sum
      (sum-iter (+ partial-sum counter) (+ counter 1) max-count)))
&lt;/pre
&gt;&lt;p&gt;これでいいはずです。これで例えば、0 から 10 までの和ということなら、
&lt;/p
&gt;&lt;pre&gt;gosh&amp;gt; (sum-iter 0 0 10)
55
&lt;/pre
&gt;&lt;p&gt;ちゃんと計算できましたね。まえの sum と、この sum-iter の計算が進む様子を
手でシミュレートして比較してみましょう。まず、(sum 5)から
&lt;/p
&gt;&lt;pre&gt;(sum 5)
(+ 5 (sum 4))
(+ 5 (+ 4 (sum 3)))
(+ 5 (+ 4 (+ 3 (sum 2))))
(+ 5 (+ 4 (+ 3 (+ 2 (sum 1)))))
(+ 5 (+ 4 (+ 3 (+ 2 (+ 1 (sum 0))))))
(+ 5 (+ 4 (+ 3 (+ 2 (+ 1 0)))))
(+ 5 (+ 4 (+ 3 (+ 2 1))))
(+ 5 (+ 4 (+ 3 3)))
(+ 5 (+ 4 6))
(+ 5 10)
15
&lt;/pre
&gt;&lt;p&gt;つぎに、(sum-iter 0 0 5)
&lt;/p
&gt;&lt;pre&gt;(sum-iter 0 0 5)
(sum-iter 0 1 5)
(sum-iter 1 2 5)
(sum-iter 3 3 5)
(sum-iter 6 4 5)
(sum-iter 10 5 5)
(sum-iter 15 6 5)
15
&lt;/pre
&gt;&lt;p&gt;これを見ると、sum の方は、だんだん長く(括弧の入れ子が深く)なって、
それから、だんだんそれが短く(括弧の入れ子が浅く)なっているのに
対して、sum-iter の方は、長さが(括弧の入れ子の深さが)変らないことが
わかります。
&lt;/p
&gt;&lt;p&gt;sum のような括弧の入れ子が深くなって、ふたたび浅くなるような
パターンの繰り返し計算のプロセスのことを、再帰的プロセスといいます。
また、sum-iter のような括弧の入れ子が変化しないような繰り返し計算の
プロセスのことを、反復的プロセスといいます。再帰的プロセス、反復的
プロセスというのは、関数の定義が再帰的かどうかということではありません。
&lt;/p
&gt;&lt;h4 id=&#39;H-1nmvhz401rb8c&#39;&gt;8.3.2. 内部定義
&lt;/h4
&gt;&lt;p&gt;「n以下の非負整数の和」を計算するのに必要な情報は、n の具体的な値だけです。
ところが、sum-iter では引数が3つもあります。以下のようにすると、
引数ひとつだけの、sum-bis が構成できます。
&lt;/p
&gt;&lt;pre&gt;(define (sum-bis n)
  (define (iter partial-sum counter)
    (if (&amp;gt; counter n)
        partial-sum
        (iter (+ partial-sum counter) (+ counter 1))))
  (iter 0 0))
&lt;/pre
&gt;&lt;p&gt;まず、この定義でちゃんと動くことを確かめましょう。
&lt;/p
&gt;&lt;pre&gt;gosh&amp;gt; (sum-bis 5)
15
gosh&amp;gt; (sum-bis 10)
55
&lt;/pre
&gt;&lt;p&gt;では、sum-bis の定義がどのように構成されているのか見てみましょう。
&lt;/p
&gt;&lt;pre&gt;(define (sum-bis n)
  ...
  (iter 0 0))
&lt;/pre
&gt;&lt;p&gt;のようになっていますので、(sum-bis 5) と呼びだすと、(iter 0 0) の
結果が返ってきます。この iter が、sum-bis の定義の中に定義されている
内部定義の関数です。それが
&lt;/p
&gt;&lt;pre&gt;  (define (iter partial-sum counter)
    (if (&amp;gt; counter n)
        partial-sum
        (iter (+ partial-sum counter) (+ counter 1))))
&lt;/pre
&gt;&lt;p&gt;の部分です。さて、注意深いかたなら、この iter の定義と先の節で定義した
sum-iter とが少しだけ違うということに気づいたと思います。それは引数の
数です。sum-iter の第3引数であった、max-count がなくなっています。
&lt;/p
&gt;&lt;p&gt;最初の if 式でカウンタが n を超えたかどうかの判断をしていますね。
この n はどこから来たのでしょう。iter の引数として来たわけではありません。
これは、sum-bis の引数としてきた n です。このように内部定義の関数は、
外側の関数の引数の定義を参照することができます、いいかえれば、
iterが実際に呼ばれる前に定義されていれば、iterは自分の引数ではない変数を
参照することができます。
&lt;/p
&gt;&lt;h4 id=&#39;H-3r47bg35yzmwq&#39;&gt;8.3.3. もうひとつの繰り返しパターンの関数
&lt;/h4
&gt;&lt;p&gt;8.2.2. でやったように、反復的プロセスの繰り返しパターンの関数を作って
みましょう。もう簡単ですね。
&lt;/p
&gt;&lt;pre&gt;(define (accumulator-gen-bis b i)
  (lambda (n)
    (define (iter partial-result count)
      (if (&amp;gt; count n)
          partial-result
          (iter (b partial-result count) (+ count 1))))
    (iter i 1)))
&lt;/pre
&gt;&lt;p&gt;そうすると、sum-bis は
&lt;/p
&gt;&lt;pre&gt;gosh&amp;gt; (define sum-bis (accumulator-gen-bis + 0))
sum-bis
gosh&amp;gt; (sum-bis 5)
15
gosh&amp;gt; (sum-bis 10)
55
&lt;/pre
&gt;&lt;h3 id=&#39;H-32t970b6rdsko&#39;&gt;8.4. 練習問題
&lt;/h3
&gt;&lt;p&gt;&lt;strong&gt;問題 8.1&lt;/strong
&gt;&lt;br /&gt;
accumulator-gen-bis を使って、階乗を求める関数 fact-bis を定義しなさい。
&lt;/p
&gt;&lt;p&gt;&lt;strong&gt;問題 8.2.&lt;/strong
&gt;&lt;br /&gt;
accumulator-gen-bis を使って、n以下の非負整数の自乗の和を求める関数を
定義しなさい。
&lt;/p
&gt;&lt;h3 id=&#39;H-3133frnp7a95u&#39;&gt;8.5. 小難しい話
&lt;/h3
&gt;&lt;h4 id=&#39;H-3vnkkspw5u1d9&#39;&gt;8.5.1. 高階関数
&lt;/h4
&gt;&lt;p&gt;関数を引数としたり、返り値が関数であったり、あるいは、その両方であるような
関数のことを高階関数といいます。高階関数が定義できるような
プログラミング言語のことを「関数が第一級の計算対象(first-class object)
である言語」といいます。この属性は、関数型とよばれるようなプログラミング
言語の特徴です。 Gauche をはじめ、あらゆる Scheme、Lisp はこのような
「関数が第一級の計算対象(first-class object)」の言語です。
Scheme や Lisp が関数型言語の範疇にいれられことがあるのは、この性質を
もつというのがその理由です。
&lt;/p
&gt;&lt;h4 id=&#39;H-2jbrrwplwlus6&#39;&gt;8.5.2. 末尾再帰
&lt;/h4
&gt;&lt;p&gt;計算パターンが再帰プロセスなるような繰り返し計算が正しく行えるのは、
Gauche の処理系が、次にするべき計算を記憶してくれるからです。
どういうことかというと、上の手でおこなったシミュレーションでは、
&lt;/p
&gt;&lt;pre&gt;(+ 5 (sum 4))
&lt;/pre
&gt;&lt;p&gt;という部分の計算は、(sum 4) の計算を行って (sum 4) の結果が返ってきたとき
「そのあと 5 をそれに足す」ということ(これを継続といいます)を覚えて
いるということです。
&lt;/p
&gt;&lt;p&gt;一寸処理系を苛めてみましょう。
&lt;/p
&gt;&lt;pre&gt;gosh&amp;gt; (sum 10000000)
GC Warning: Out of Memory!  Returning NIL!
out of memory (20).  aborting...

Process scheme exited abnormally with code 1
&lt;/pre
&gt;&lt;p&gt;ああ、可愛いそうに、継続を覚えておく領域がたりなくなってお亡くなりに。。。
&lt;/p
&gt;&lt;p&gt;ところが、計算パターンが反復プロセスになるような繰り返し計算の場合には
このような覚えておくべき継続はありません。そのかわりに、部分計算を
partial-sum (あるいは partial-result)という変数で明示的に保持し、
それを次のステップに渡しています。引数は増えますが、Gaucheの処理系が
裏で覚えなくてもよいことになります。
&lt;/p
&gt;&lt;p&gt;では同じ計算をやらせてみましょう。
&lt;/p
&gt;&lt;pre&gt;gosh&amp;gt; (sum-bis 10000000)
5000000050000000
&lt;/pre
&gt;&lt;p&gt;ちょっと時間はかかりましたが、ちゃんと計算できましたね。
&lt;/p
&gt;&lt;p&gt;このような計算パターンが反復プロセスになるような繰り返し計算の定義は
定義パターンの形から、「末尾再帰」といいます。
&lt;/p
&gt;&lt;p&gt;Scheme の処理系では、末尾再帰で定義された計算は、継続を保存する必要が
ないので保存しないようにすることになっています。
&lt;/p
&gt;&lt;/div
&gt;</description
></item
><item><title>KahuaSeminar</title
><link>http://khead.kahua.org/kahua-web/show/KahuaSeminar</link
><pubDate>Wed, 04 Jul 2007 14:01:57 +0900</pubDate
><description>&lt;div&gt;&lt;h3 id=&#39;H-3daj8mu0vynmx&#39;&gt;Kahua セミナー(3)
&lt;/h3
&gt;&lt;p&gt;第3回Kahuaセミナーの発表資料やセッションの内容をベースにしたチュートリアルを
&lt;a href=&#39;http://www.kahua.org/cgi-bin/kahua.fcgi/kahua-web/show/news/Seminar&#39;&gt;公開&lt;/a
&gt;しています。ご利用ください。
&lt;/p
&gt;&lt;h2 id=&#39;H-1zji8t9ye5wi5&#39;&gt;インストールのデモで使ったコマンド列
&lt;/h2
&gt;&lt;pre&gt;      % tar xzf Kahua-1.0.1.tgz
      % cd Kahua-1.0.1
      % ./configure --prefix=/usr/local/kahua ?
      --with-site-bundle=/tmp/examples
      % make
      % make -s check
      % sudo make install
      % PATH=/usr/local/kahua/bin:$PATH
      % kahua-package create /tmp/examples
      % rm /tmp/examples/app-servers
      % make install-examples
&lt;/pre
&gt;&lt;h2 id=&#39;H-15usjplvnjy0g&#39;&gt;スーパバイザの起動
&lt;/h2
&gt;&lt;pre&gt;% kahua-spvr -S /tmp/examples -H 8888
&lt;/pre
&gt;&lt;h2 id=&#39;H-14mgtv1d085uq&#39;&gt;開発ユーザ追加
&lt;/h2
&gt;&lt;pre&gt;% kahua-admin -S /tmp/examples
spvr&amp;gt; ls
wno   pid type         since        wid
  0 22056 lambdabooks  Jan 19 18:03 h0o:cjt3
  1 22057 wiki-iki     Jan 19 18:03 h0p:4wjzv
  2 22058 login        Jan 19 18:03 h0q:5sklz
spvr&amp;gt; reload  
(lambdabooks wiki-iki login foldlist lambdacalcul nqueen lazy-nqueen)
spvr&amp;gt; adduser bizenn hogehoge
done
spvr&amp;gt; lsuser
(&amp;quot;bizenn&amp;quot;)
spvr&amp;gt; 
&lt;/pre
&gt;&lt;h2 id=&#39;H-3fkg8g0lmt3f&#39;&gt;kahua-shell
&lt;/h2
&gt;&lt;pre&gt;% kahua-shell -S /tmp/examples
Welcome to Kahua.
username: bizenn
password: 
wno type         since        wid
  0 lambdabooks  Jan 19 18:03 h0o:cjt3
  2 login        Jan 19 18:03 h0q:5sklz
  3 wiki-iki     Jan 19 18:04 h2c:2jja9
select wno&amp;gt; 0

lambdabooks(h0o:cjt3)&amp;gt; (map identity (make-kahua-collection &amp;lt;kahua-user&amp;gt;))
(#&amp;lt;&amp;lt;kahua-user&amp;gt; 0x12991a0&amp;gt; #&amp;lt;&amp;lt;kahua-user&amp;gt; 0x12a5478&amp;gt;)
lambdabooks(h0o:cjt3)&amp;gt;
&lt;/pre
&gt;&lt;h2 id=&#39;H-1aww0qqg5wvad&#39;&gt;Emacsとの連携
&lt;/h2
&gt;&lt;pre&gt;kahua.elをEmacsのload-pathが通ったディレクトリにコピーします。

% cp emacs/kahua.el ~/lib/elisp

.emacsに以下のコードを追加する。

(require &amp;#39;kahua)
(append &amp;#39;((&amp;quot;??.kahua$&amp;quot; . kahua-mode)) auto-mode-alist)
(custom-set-variables
 &amp;#39;(kahua-site-bundle &amp;quot;/tmp/examples&amp;quot;))

Emacsからkahua-adminを呼んでみましょう。
M-x run-kahua

Emacsからkahua-shellを呼んでみましょう。
M-x run-kahua-shell

&lt;/pre
&gt;&lt;/div
&gt;</description
></item
><item><title>日誌</title
><link>http://khead.kahua.org/kahua-web/show/%e6%97%a5%e8%aa%8c</link
><pubDate>Wed, 04 Jul 2007 14:00:20 +0900</pubDate
><description>&lt;div&gt;&lt;p&gt;Kahua の開発や、Kahuaのアプリケーションの運用の記録
&lt;/p
&gt;&lt;p&gt;不定期更新の予定
&lt;/p
&gt;&lt;hr /&gt;&lt;p&gt;不定期っつーても古過ぎ。消しちゃおうかしら。
&lt;/p
&gt;&lt;hr /&gt;&lt;p&gt;&lt;h2 id=&#39;H-1v618jeh718&#39;&gt;2004-08-04
&lt;/h2
&gt;&lt;h3 id=&#39;H-1ezkprxak1ez&#39;&gt;/. ed によりOSS-WEBパンク
&lt;/h3
&gt;&lt;p&gt;(株)タイムインターメディアのサイトで、Kahua のアプリケーション kahua-web を
つかって、08/02 より、OpenSource WEB を運営しはじめました。
&lt;/p
&gt;&lt;p&gt;「ゆっくり、試行錯誤しながら、少しずつ、コンテンツを蓄えていこう。
アクセスは徐々に増せればいいでしょう」なんて悠長なことをほざいていたら。。。
/. ed されてアクセスが想定を超えてバクハツ。大富豪 Kahua を
慎しやかなマシンで動かしていたものだから、贅沢な Kahua にメモリを
食われて、大量のスワップアウトが発生。おかげで、Load アベレージが
激増、個々のプロセスがスローダウン。しまいには、コンソールからの操作も
できなくなるありさま。そのときの経過を今後の教訓として記憶に留めるために
公開します。
&lt;/p
&gt;&lt;p&gt;「イタイ」気な技術者のタコっ気たっぷりの対応を御笑覧あれ。
&lt;/p
&gt;&lt;h4 id=&#39;H-1ezl0lji3fsz&#39;&gt;経過
&lt;/h4
&gt;&lt;ul&gt;&lt;li&gt;06:51   /. に「Open Source WEB」に関する投稿。
&lt;/li
&gt;&lt;/ul
&gt;&lt;ul&gt;&lt;li&gt;08:48   /. ed になったせいで、アクセスが重くなっているとの一報のメールが、
Kahua 開発メイリングリストにとどく。プロセス監視などサービスの挙動に
留意せよとの注意も書かれていた。
&lt;/li
&gt;&lt;/ul
&gt;&lt;ul&gt;&lt;li&gt;10:00頃 アクセスが重いことに気づく。この時点でまだ先のメールは、
読んでいなかった。これはプロセス監視をしないといけないなぁと、
具体的方法を知らないのに、悠長に、どんな方法があるかしらん。とか考えていた。
&lt;/li
&gt;&lt;/ul
&gt;&lt;ul&gt;&lt;li&gt;10:50頃 Socket エラーのメッセージが画面が出ていることに気づいた。
Kahua 開発メイリングリストのメールに気づく。
&lt;/li
&gt;&lt;/ul
&gt;&lt;ul&gt;&lt;li&gt;11:14   Kahua 開発メイリングリストに先のエラーメッセージとともに、メールを
を投稿
&lt;/li
&gt;&lt;/ul
&gt;&lt;ul&gt;&lt;li&gt;11:30頃 サーバにリモートでログインできなくなっていることに気づく。サーバ機
管理者にやっと相談。コンソールでログインを試みるが、既にコンソールからの
ログインに5分以上かかるような状態。どうする？
&lt;/li
&gt;&lt;li&gt;12:00頃 サービスを別のプチブルマシンに移動することを決断。社内に待機中の
マシンはあるものの、すでに予約済み。ううむ。。。。 稼働中の、スペックの
良いマシンに載せることを決定。元のサーバ機をリブート。OSS-WEBのサービス停止。
移動作業開始。
&lt;/li
&gt;&lt;/ul
&gt;&lt;ul&gt;&lt;li&gt;18:00頃 さんざんてこずったあげくに、移動完了。
&lt;/li
&gt;&lt;li&gt;web アクセス解析ツールの仕込み
&lt;/li
&gt;&lt;li&gt;バックアップ用スクリプト仕込み
&lt;/li
&gt;&lt;/ul
&gt;&lt;ul&gt;&lt;li&gt;20:00頃 すでにアクセスが減っている。おおよそのところは安定しているように
見える。
&lt;/li
&gt;&lt;/ul
&gt;&lt;h4 id=&#39;H-1ezl0i9fqdpd&#39;&gt;数字
&lt;/h4
&gt;&lt;h5 id=&#39;H-1adlib346cl3u&#39;&gt;旧いマシン
&lt;/h5
&gt;&lt;ul&gt;&lt;li&gt;PC:     K6 500MHz
&lt;/li
&gt;&lt;li&gt;Memory:    256MB
&lt;/li
&gt;&lt;li&gt;Swap:      512MB
&lt;/li
&gt;&lt;li&gt;OS:     FreeBSD 4.8-RELEASE-p23
&lt;/li
&gt;&lt;/ul
&gt;&lt;h5 id=&#39;H-s7mvixdh8a5p&#39;&gt;新しいマシン
&lt;/h5
&gt;&lt;ul&gt;&lt;li&gt;PC:     Pentium 4 2.4GHz
&lt;/li
&gt;&lt;li&gt;Memory: 1 GB
&lt;/li
&gt;&lt;li&gt;Swap:   1 GB
&lt;/li
&gt;&lt;li&gt;OS:     Debian GNU/Linux 3.0 woody
&lt;/li
&gt;&lt;/ul
&gt;&lt;h5 id=&#39;H-123fukakbtsu6&#39;&gt;Apache のアクセスログ
&lt;/h5
&gt;&lt;p&gt;06:30 から 30分間毎のOSS-WEBへのアクセス(KahuaのCGIブリッジへの
GET リクエスト)
&lt;/p
&gt;&lt;table class=&#39;inbody&#39; border=&#39;1&#39; cellspacing=&#39;0&#39;&gt;&lt;tr class=&#39;inbody&#39;&gt;&lt;td class=&#39;inbody&#39;&gt;時間帯  
&lt;/td
&gt;&lt;td class=&#39;inbody&#39;&gt; GET 
&lt;/td
&gt;&lt;/tr
&gt;&lt;tr class=&#39;inbody&#39;&gt;&lt;td class=&#39;inbody&#39;&gt;06:30 - 
&lt;/td
&gt;&lt;td class=&#39;inbody&#39;&gt;  23 
&lt;/td
&gt;&lt;/tr
&gt;&lt;tr class=&#39;inbody&#39;&gt;&lt;td class=&#39;inbody&#39;&gt;07:00 - 
&lt;/td
&gt;&lt;td class=&#39;inbody&#39;&gt; 229 
&lt;/td
&gt;&lt;/tr
&gt;&lt;tr class=&#39;inbody&#39;&gt;&lt;td class=&#39;inbody&#39;&gt;07:30 - 
&lt;/td
&gt;&lt;td class=&#39;inbody&#39;&gt; 387 
&lt;/td
&gt;&lt;/tr
&gt;&lt;tr class=&#39;inbody&#39;&gt;&lt;td class=&#39;inbody&#39;&gt;08:00 - 
&lt;/td
&gt;&lt;td class=&#39;inbody&#39;&gt; 460 
&lt;/td
&gt;&lt;/tr
&gt;&lt;tr class=&#39;inbody&#39;&gt;&lt;td class=&#39;inbody&#39;&gt;08:30 - 
&lt;/td
&gt;&lt;td class=&#39;inbody&#39;&gt; 792 
&lt;/td
&gt;&lt;/tr
&gt;&lt;tr class=&#39;inbody&#39;&gt;&lt;td class=&#39;inbody&#39;&gt;09:00 - 
&lt;/td
&gt;&lt;td class=&#39;inbody&#39;&gt; 801 
&lt;/td
&gt;&lt;/tr
&gt;&lt;tr class=&#39;inbody&#39;&gt;&lt;td class=&#39;inbody&#39;&gt;09:30 - 
&lt;/td
&gt;&lt;td class=&#39;inbody&#39;&gt; 790 
&lt;/td
&gt;&lt;/tr
&gt;&lt;tr class=&#39;inbody&#39;&gt;&lt;td class=&#39;inbody&#39;&gt;10:00 - 
&lt;/td
&gt;&lt;td class=&#39;inbody&#39;&gt; 813 
&lt;/td
&gt;&lt;/tr
&gt;&lt;tr class=&#39;inbody&#39;&gt;&lt;td class=&#39;inbody&#39;&gt;10:30 - 
&lt;/td
&gt;&lt;td class=&#39;inbody&#39;&gt; 704 
&lt;/td
&gt;&lt;/tr
&gt;&lt;tr class=&#39;inbody&#39;&gt;&lt;td class=&#39;inbody&#39;&gt;11:00 - 
&lt;/td
&gt;&lt;td class=&#39;inbody&#39;&gt; 676 
&lt;/td
&gt;&lt;/tr
&gt;&lt;tr class=&#39;inbody&#39;&gt;&lt;td class=&#39;inbody&#39;&gt;11:30 - 
&lt;/td
&gt;&lt;td class=&#39;inbody&#39;&gt; 687 
&lt;/td
&gt;&lt;/tr
&gt;&lt;tr class=&#39;inbody&#39;&gt;&lt;td class=&#39;inbody&#39;&gt;12:00 - 
&lt;/td
&gt;&lt;td class=&#39;inbody&#39;&gt; 497 
&lt;/td
&gt;&lt;/tr
&gt;&lt;/table
&gt;&lt;h5 id=&#39;H-1jlz0hipipioo&#39;&gt;12:18 ころに System を再起動する直前のプロセス
&lt;/h5
&gt;&lt;table class=&#39;inbody&#39; border=&#39;1&#39; cellspacing=&#39;0&#39;&gt;&lt;tr class=&#39;inbody&#39;&gt;&lt;td class=&#39;inbody&#39;&gt;プロセス総数                  
&lt;/td
&gt;&lt;td class=&#39;inbody&#39;&gt;313
&lt;/td
&gt;&lt;/tr
&gt;&lt;tr class=&#39;inbody&#39;&gt;&lt;td class=&#39;inbody&#39;&gt;KahuaのCGIブリッジのプロセス  
&lt;/td
&gt;&lt;td class=&#39;inbody&#39;&gt;115
&lt;/td
&gt;&lt;/tr
&gt;&lt;tr class=&#39;inbody&#39;&gt;&lt;td class=&#39;inbody&#39;&gt;ApacheのHTTPdプロセス         
&lt;/td
&gt;&lt;td class=&#39;inbody&#39;&gt;157
&lt;/td
&gt;&lt;/tr
&gt;&lt;tr class=&#39;inbody&#39;&gt;&lt;td class=&#39;inbody&#39;&gt;SwapOut                       
&lt;/td
&gt;&lt;td class=&#39;inbody&#39;&gt;240 MB (記録がなく記憶の値)
&lt;/td
&gt;&lt;/tr
&gt;&lt;/table
&gt;
&lt;/p
&gt;&lt;/div
&gt;</description
></item
><item><title>Enjoy Gauche</title
><link>http://khead.kahua.org/kahua-web/show/Enjoy%20Gauche</link
><pubDate>Wed, 04 Jul 2007 13:59:46 +0900</pubDate
><description>&lt;div&gt;&lt;p&gt;いっしょに Gauche プログラミングを楽しみましょう。
&lt;/p
&gt;&lt;p&gt;これから少しずつGaucheプログラミングのガイドを書いていきます。
ご意見、ご感想、ご指摘、ご提案などありましたら、コメントフォームから
どんどん書き込んでください。
##(toc)
&lt;/p
&gt;&lt;hr /&gt;&lt;h2 id=&#39;H-30p9iebcewzjd&#39;&gt;Enjoy Gauche 目次
&lt;/h2
&gt;&lt;p&gt;##(toc &amp;quot;eg/intro&amp;quot;)
##(toc &amp;quot;eg/define&amp;quot;)
##(toc &amp;quot;eg/source&amp;quot;)
##(toc &amp;quot;eg/emacs&amp;quot;)
##(toc &amp;quot;eg/recursion&amp;quot;)
##(toc &amp;quot;eg/script&amp;quot;)
##(toc &amp;quot;eg/data&amp;quot;)
##(toc &amp;quot;eg/iteration&amp;quot;)
##(toc &amp;quot;eg/install&amp;quot;)
##(toc &amp;quot;eg/debug&amp;quot;)
&lt;/p
&gt;&lt;hr /&gt;&lt;h2 id=&#39;H-mf0upcu31qlb&#39;&gt;Enjoy Gauche 全般に関するコメント
&lt;/h2
&gt;&lt;p&gt;この記事全般についてのご意見、ご感想、ご指摘、ご提案などありましたら、どしどし
記入してくださいまっせ。
&lt;/p
&gt;&lt;p&gt;&lt;p&gt;(コメント欄記入の際の注意)
&lt;/p
&gt;&lt;ul&gt;&lt;li&gt;再編集はできません
&lt;/li
&gt;&lt;li&gt;一行を適当な長さで改行してくださいませ
&lt;/li
&gt;&lt;li&gt;Name欄が空だとコメントが追加されませんのでニックネームを記入してください
&lt;/li
&gt;&lt;/ul
&gt;
&lt;/p
&gt;&lt;hr /&gt;&lt;h2 id=&#39;H-1kfgt4gexpynh&#39;&gt;Additional Online Material
&lt;/h2
&gt;&lt;p&gt;Gaucheプログラミング関連で、これまで公開してきた資料を紹介します。(2005.3.18)
&lt;/p
&gt;&lt;ul&gt;&lt;li&gt;Kahua でたのしい Web プログラミング (&lt;a href=&#39;http://www.kahua.org/kahua/docserv/ipax200405/enjoykahua/index.html&#39;&gt;HTML&lt;/a
&gt;)|(&lt;a href=&#39;http://www.kahua.org/kahua/docserv/ipax200405/enjoykahua/enjoykahua.tgz&#39;&gt;tarball(3.4MB)&lt;/a
&gt;)
&lt;/li
&gt;&lt;li&gt;GaucheによるSchemeプログラミング  
(&lt;a href=&#39;http://www.kahua.org/kahua/docserv/seminar200402/scheme/index.html&#39;&gt;HTML&lt;/a
&gt;)
(&lt;a href=&#39;http://www.kahua.org/kahua/docserv/seminar200402/scheme.tar.gz&#39;&gt;tarball(2.3MB)&lt;/a
&gt;)
&lt;/li
&gt;&lt;li&gt;継続渡しによるWebアプリケーション
(&lt;a href=&#39;http://www.kahua.org/kahua/docserv/seminar200402/cps/index.html&#39;&gt;HTML&lt;/a
&gt;)
(&lt;a href=&#39;http://www.kahua.org/kahua/docserv/seminar200402/cps.tar.gz&#39;&gt;tarball(2MB)&lt;/a
&gt;)
&lt;/li
&gt;&lt;/ul
&gt;&lt;hr /&gt;&lt;p&gt;
&lt;/p
&gt;&lt;/div
&gt;</description
></item
><item><title>Site Map</title
><link>http://khead.kahua.org/kahua-web/show/Site%20Map</link
><pubDate>Wed, 04 Jul 2007 13:58:54 +0900</pubDate
><description>&lt;div&gt;&lt;ul&gt;&lt;li&gt;Kahua デモ
&lt;ul&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/Kahua%20Demo&#39;&gt;Kahua Demo&lt;/a
&gt;&lt;/li
&gt;&lt;/ul
&gt;
&lt;/li
&gt;&lt;li&gt;たのしい Gauche
&lt;ul&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/Enjoy%20Gauche&#39;&gt;Enjoy Gauche&lt;/a
&gt;&lt;/li
&gt;&lt;/ul
&gt;
&lt;/li
&gt;&lt;li&gt;ド素人とKahua
&lt;ul&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/%e3%83%89%e7%b4%a0%e4%ba%ba%e3%81%a8Kahua&#39;&gt;ド素人とKahua&lt;/a
&gt;&lt;/li
&gt;&lt;/ul
&gt;
&lt;/li
&gt;&lt;li&gt;Enjoy Kahua
&lt;ul&gt;&lt;/ul
&gt;
&lt;/li
&gt;&lt;li&gt;[[SandBox//練習ページ]]
&lt;/li
&gt;&lt;/ul
&gt;&lt;ul&gt;&lt;li&gt;[[SICP読書会]]
&lt;/li
&gt;&lt;/ul
&gt;&lt;h2 id=&#39;H-24s2ywu4tghl&#39;&gt;個人ページ:
&lt;/h2
&gt;&lt;ul&gt;&lt;li&gt;[[nobsun]]
&lt;/li
&gt;&lt;li&gt;[[hoti]]
&lt;/li
&gt;&lt;li&gt;[[yasuyuki]]
&lt;/li
&gt;&lt;li&gt;[[moheji]]
&lt;/li
&gt;&lt;li&gt;[[shibata]]
&lt;/li
&gt;&lt;/ul
&gt;&lt;/div
&gt;</description
></item
><item><title>ド素人とKahua</title
><link>http://khead.kahua.org/kahua-web/show/%e3%83%89%e7%b4%a0%e4%ba%ba%e3%81%a8Kahua</link
><pubDate>Wed, 04 Jul 2007 13:58:34 +0900</pubDate
><description>&lt;div&gt;&lt;p&gt;Kahuaは簡単にプログラムができるらしい。
では、ド素人の私がKahuaを使えるようになるのか？
実際にやってみていきたいと思います。
&lt;/p
&gt;&lt;p&gt;##(toc)
&lt;/p
&gt;&lt;hr /&gt;&lt;p&gt;1. [[dkj/インストール]] (2005.5.24)
&lt;/p
&gt;&lt;/div
&gt;</description
></item
><item><title>eg</title
><link>http://khead.kahua.org/kahua-web/show/eg</link
><pubDate>Wed, 04 Jul 2007 13:58:13 +0900</pubDate
><description>&lt;div&gt;&lt;p&gt;&lt;p&gt;いっしょに Gauche プログラミングを楽しみましょう。
&lt;/p
&gt;&lt;p&gt;これから少しずつGaucheプログラミングのガイドを書いていきます。
ご意見、ご感想、ご指摘、ご提案などありましたら、コメントフォームから
どんどん書き込んでください。
&lt;ul&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/Enjoy%20Gauche#H-30p9iebcewzjd&#39;&gt;Enjoy Gauche 目次&lt;/a
&gt;&lt;/li
&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/Enjoy%20Gauche#H-mf0upcu31qlb&#39;&gt;Enjoy Gauche 全般に関するコメント&lt;/a
&gt;&lt;/li
&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/Enjoy%20Gauche#H-1kfgt4gexpynh&#39;&gt;Additional Online Material&lt;/a
&gt;&lt;/li
&gt;&lt;/ul
&gt;
&lt;/p
&gt;&lt;hr /&gt;&lt;h2 id=&#39;H-30p9iebcewzjd&#39;&gt;Enjoy Gauche 目次
&lt;/h2
&gt;&lt;p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/intro#H-25q9cszg9cgs&#39;&gt;1. イントロダクション&lt;/a
&gt;&lt;/li
&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/intro#H-1xatlstwel85i&#39;&gt;1.1. はじめに&lt;/a
&gt;&lt;/li
&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/intro#H-2bhdfwgtr510x&#39;&gt;1.1.1. このガイドブックの目指すもの&lt;/a
&gt;&lt;/li
&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/intro#H-1kz8oj2wz09dh&#39;&gt;1.1.2. Gauche プログラミングを楽しむために&lt;/a
&gt;&lt;/li
&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/intro#H-vzy6hjk7ohdl&#39;&gt;1.1.3. 構成&lt;/a
&gt;&lt;/li
&gt;&lt;/ul
&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/intro#H-2d6hxhr932exn&#39;&gt;1.2. Gauche を対話モードで起動してみよう&lt;/a
&gt;&lt;/li
&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/intro#H-35q2cfwtyhwj4&#39;&gt;1.2.1 起動と終了&lt;/a
&gt;&lt;/li
&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/intro#H-2eg6iksthelhw&#39;&gt;1.2.2. 式&lt;/a
&gt;&lt;/li
&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/intro#H-3o1bgtm71t2zi&#39;&gt;1.2.3. データ&lt;/a
&gt;&lt;/li
&gt;&lt;/ul
&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/intro#H-a0ywceotr01k&#39;&gt;1.3. 要約&lt;/a
&gt;&lt;/li
&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/intro#H-260vc83dgs8l&#39;&gt;1.4. Tips&lt;/a
&gt;&lt;/li
&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/intro#H-266d3is3si8ni&#39;&gt;1.4.1. 2つ以上の任意個の引数をとる演算子および手続き&lt;/a
&gt;&lt;/li
&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/intro#H-1dgulxjqf0zkw&#39;&gt;1.4.2. 演算子あるいは手続きの名前&lt;/a
&gt;&lt;/li
&gt;&lt;/ul
&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/intro#H-d4ng3t0mnhrd&#39;&gt;1.5. 練習問題&lt;/a
&gt;&lt;/li
&gt;&lt;/ul
&gt;&lt;/ul
&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/define#H-2tzjsapsghwbk&#39;&gt;2. 名前を付ける&lt;/a
&gt;&lt;/li
&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/define#H-1d64fxbjiml5x&#39;&gt;2.1. 算数の問題&lt;/a
&gt;&lt;/li
&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/define#H-9zyuo6c4x39e&#39;&gt;2.1.1. 値に名前をつける&lt;/a
&gt;&lt;/li
&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/define#H-2hv90xvwhfqi4&#39;&gt;2.1.2. 式に名前をつける&lt;/a
&gt;&lt;/li
&gt;&lt;/ul
&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/define#H-320dz2t9rjjzo&#39;&gt;2.2. 関数&lt;/a
&gt;&lt;/li
&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/define#H-1djybfd45qyqi&#39;&gt;2.2.1 関数の定義&lt;/a
&gt;&lt;/li
&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/define#H-285xzyp5rlbbf&#39;&gt;2.2.2. 関数に名前を付ける&lt;/a
&gt;&lt;/li
&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/define#H-2cjenha65umpq&#39;&gt;2.2.3. 関数の使い方&lt;/a
&gt;&lt;/li
&gt;&lt;/ul
&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/define#H-2l6ht2hepy5qc&#39;&gt;2.3. 関数定義のもうひとつの書法&lt;/a
&gt;&lt;/li
&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/define#H-3p2pivg9tfn0b&#39;&gt;2.4 練習問題&lt;/a
&gt;&lt;/li
&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/define#H-yztfye19s63w&#39;&gt;2.5 ちょっと小難しい用語&lt;/a
&gt;&lt;/li
&gt;&lt;/ul
&gt;&lt;/ul
&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/source#H-1y2psiip8od3a&#39;&gt;3. プログラムファイル&lt;/a
&gt;&lt;/li
&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/source#H-21ku3rziw03pd&#39;&gt;3.1. 前章までのおさらい&lt;/a
&gt;&lt;/li
&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/source#H-v2tgs6kmwzeb&#39;&gt;3.2. プログラムの保存&lt;/a
&gt;&lt;/li
&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/source#H-7bhra5lar6zb&#39;&gt;3.3. プログラムの読み込み&lt;/a
&gt;&lt;/li
&gt;&lt;/ul
&gt;&lt;/ul
&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/emacs#H-tjaj88fzvtwx&#39;&gt;4. Emacs のすすめ&lt;/a
&gt;&lt;/li
&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/emacs#H-212fch573lpao&#39;&gt;4.1. おまじない&lt;/a
&gt;&lt;/li
&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/emacs#H-2i4v3kk7do3zo&#39;&gt;4.2. カーソル移動&lt;/a
&gt;&lt;/li
&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/emacs#H-3mu3rhfxi35oq&#39;&gt;4.3. ファイルのロードおよびＳ式の評価&lt;/a
&gt;&lt;/li
&gt;&lt;/ul
&gt;&lt;/ul
&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/recursion#H-2aggaqez0e&#39;&gt;5. 再帰&lt;/a
&gt;&lt;/li
&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/recursion#H-2ost228ypx44f&#39;&gt;5.1. 階乗の計算&lt;/a
&gt;&lt;/li
&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/recursion#H-2z24q1cjynn89&#39;&gt;5.2. 再帰的なデータ構造&lt;/a
&gt;&lt;/li
&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/recursion#H-2zd2zg5cob9fx&#39;&gt;5.2.1. データの合成&lt;/a
&gt;&lt;/li
&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/recursion#H-hro9uxpcx7lq&#39;&gt;5.2.2. リスト&lt;/a
&gt;&lt;/li
&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/recursion#H-16307rh0gi3rf&#39;&gt;5.2.3. リスト構造は再帰構造&lt;/a
&gt;&lt;/li
&gt;&lt;/ul
&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/recursion#H-3lq0sfhcj5xsr&#39;&gt;5.3. 組合せの列挙&lt;/a
&gt;&lt;/li
&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/recursion#H-3eaa27vju1s7q&#39;&gt;5.4. 練習問題&lt;/a
&gt;&lt;/li
&gt;&lt;/ul
&gt;&lt;/ul
&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/script#H-3qv1ivwag2633&#39;&gt;6. スクリプトプログラム&lt;/a
&gt;&lt;/li
&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/script#H-13bzohvv5bl6n&#39;&gt;6.1. シェルコマンド&lt;/a
&gt;&lt;/li
&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/script#H-3n2vs6d6hyw85&#39;&gt;6.2. スクリプトプログラムの書き方&lt;/a
&gt;&lt;/li
&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/script#H-1lhvf6iw3n0s0&#39;&gt;6.3. main の評価&lt;/a
&gt;&lt;/li
&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/script#H-2a45pmg69m63v&#39;&gt;6.4. 例: 華氏摂氏変換&lt;/a
&gt;&lt;/li
&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/script#H-2183mzy40z7mo&#39;&gt;6.4.1. args はリスト&lt;/a
&gt;&lt;/li
&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/script#H-1rtatqe9b2wh1&#39;&gt;6.4.2. リスト args の要素は文字列&lt;/a
&gt;&lt;/li
&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/script#H-957q977ejx1y&#39;&gt;6.4.3. 印字 print&lt;/a
&gt;&lt;/li
&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/script#H-2f3jslt1ih0ea&#39;&gt;6.4.4. c2f 摂氏から華氏への変換&lt;/a
&gt;&lt;/li
&gt;&lt;/ul
&gt;&lt;/ul
&gt;&lt;/ul
&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/data#H-1ik3maxjaqo34&#39;&gt;7. データ&lt;/a
&gt;&lt;/li
&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/data#H-14ors5re3dz2j&#39;&gt;7.1. 論理値&lt;/a
&gt;&lt;/li
&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/data#H-3ubr7r33q71nr&#39;&gt;7.1.1. 論理値に関する述語&lt;/a
&gt;&lt;/li
&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/data#H-3f5e4s2l5ttxs&#39;&gt;7.1.2. not 関数&lt;/a
&gt;&lt;/li
&gt;&lt;/ul
&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/data#H-1rcyltwn6hgpp&#39;&gt;7.2. 数値&lt;/a
&gt;&lt;/li
&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/data#H-1j8ngnc37qeqp&#39;&gt;7.2.1. 数値に関する述語&lt;/a
&gt;&lt;/li
&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/data#H-2shnh0ptb6ne0&#39;&gt;7.2.2. 比較演算&lt;/a
&gt;&lt;/li
&gt;&lt;/ul
&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/data#H-1rcytdzyin02u&#39;&gt;7.3. 文字&lt;/a
&gt;&lt;/li
&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/data#H-3r4qc38pe907r&#39;&gt;7.3.1. 文字に関する述語&lt;/a
&gt;&lt;/li
&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/data#H-2lvauyipafz3c&#39;&gt;7.3.2. 文字の比較&lt;/a
&gt;&lt;/li
&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/data#H-17wme6cx3gpiw&#39;&gt;7.3.3. 文字の種類に関する述語&lt;/a
&gt;&lt;/li
&gt;&lt;/ul
&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/data#H-1ibibnbgpv3hd&#39;&gt;7.4. シンボル&lt;/a
&gt;&lt;/li
&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/data#H-2lcwjtvn56p16&#39;&gt;7.4.1. クウォート&lt;/a
&gt;&lt;/li
&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/data#H-26u61i7ubiak6&#39;&gt;7.4.2. シンボルに関する述語&lt;/a
&gt;&lt;/li
&gt;&lt;/ul
&gt;&lt;/ul
&gt;&lt;/ul
&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/iteration#H-1oxc8ixt238zp&#39;&gt;8. 繰り返し&lt;/a
&gt;&lt;/li
&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/iteration#H-3sqvoxedkfnzv&#39;&gt;8.1. 「n 以下の非負整数の和」&lt;/a
&gt;&lt;/li
&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/iteration#H-2a0sdxleb69yv&#39;&gt;8.1.1. ロバストに&lt;/a
&gt;&lt;/li
&gt;&lt;/ul
&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/iteration#H-3c0c6kwd4nur0&#39;&gt;8.2. 繰り返しのパターン&lt;/a
&gt;&lt;/li
&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/iteration#H-28k6qt45r9d0r&#39;&gt;8.2.1. 和と階乗との比較&lt;/a
&gt;&lt;/li
&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/iteration#H-102nokgj5sarw&#39;&gt;8.2.2. 繰り返しパターンを関数にする&lt;/a
&gt;&lt;/li
&gt;&lt;/ul
&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/iteration#H-1t56330cav37a&#39;&gt;8.3. もうひとつ別の繰り返しパターン&lt;/a
&gt;&lt;/li
&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/iteration#H-pb4esj2womex&#39;&gt;8.3.1. 「n 以下の非負整数の和」ふたたび&lt;/a
&gt;&lt;/li
&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/iteration#H-1nmvhz401rb8c&#39;&gt;8.3.2. 内部定義&lt;/a
&gt;&lt;/li
&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/iteration#H-3r47bg35yzmwq&#39;&gt;8.3.3. もうひとつの繰り返しパターンの関数&lt;/a
&gt;&lt;/li
&gt;&lt;/ul
&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/iteration#H-32t970b6rdsko&#39;&gt;8.4. 練習問題&lt;/a
&gt;&lt;/li
&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/iteration#H-3133frnp7a95u&#39;&gt;8.5. 小難しい話&lt;/a
&gt;&lt;/li
&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/iteration#H-3vnkkspw5u1d9&#39;&gt;8.5.1. 高階関数&lt;/a
&gt;&lt;/li
&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/iteration#H-2jbrrwplwlus6&#39;&gt;8.5.2. 末尾再帰&lt;/a
&gt;&lt;/li
&gt;&lt;/ul
&gt;&lt;/ul
&gt;&lt;/ul
&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/install#H-2c6owssv0hv9&#39;&gt;A. Gaucheのインストール&lt;/a
&gt;&lt;/li
&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/install#H-8ls3vgu41zn7&#39;&gt;A.1. 正式リリースからのビルド&lt;/a
&gt;&lt;/li
&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/install#H-b95w5d8c4409&#39;&gt;A.1.1. ソースアーカイブファイルの取得&lt;/a
&gt;&lt;/li
&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/install#H-3phphgwiy7io2&#39;&gt;A.1.2. アーカイブファイルからのビルド&lt;/a
&gt;&lt;/li
&gt;&lt;/ul
&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/install#H-3trgibrlzx0e6&#39;&gt;A.2. CVS リポジトリ&lt;/a
&gt;&lt;/li
&gt;&lt;/ul
&gt;&lt;/ul
&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/debug#H-1rk5hz288s9jz&#39;&gt;B. Gauche でのデバッグ&lt;/a
&gt;&lt;/li
&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/debug#H-1y0zgd2axxycp&#39;&gt;B.1. リーダマクロ #?=expr&lt;/a
&gt;&lt;/li
&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/eg/debug#H-2g5yhsg3a8mdq&#39;&gt;B.2. ggc.debug.trace&lt;/a
&gt;&lt;/li
&gt;&lt;/ul
&gt;&lt;/ul
&gt;
&lt;/p
&gt;&lt;hr /&gt;&lt;h2 id=&#39;H-mf0upcu31qlb&#39;&gt;Enjoy Gauche 全般に関するコメント
&lt;/h2
&gt;&lt;p&gt;この記事全般についてのご意見、ご感想、ご指摘、ご提案などありましたら、どしどし
記入してくださいまっせ。
&lt;/p
&gt;&lt;p&gt;&lt;p&gt;(コメント欄記入の際の注意)
&lt;/p
&gt;&lt;ul&gt;&lt;li&gt;再編集はできません
&lt;/li
&gt;&lt;li&gt;一行を適当な長さで改行してくださいませ
&lt;/li
&gt;&lt;li&gt;Name欄が空だとコメントが追加されませんのでニックネームを記入してください
&lt;/li
&gt;&lt;/ul
&gt;
&lt;/p
&gt;&lt;hr /&gt;&lt;h2 id=&#39;H-1kfgt4gexpynh&#39;&gt;Additional Online Material
&lt;/h2
&gt;&lt;p&gt;Gaucheプログラミング関連で、これまで公開してきた資料を紹介します。(2005.3.18)
&lt;/p
&gt;&lt;ul&gt;&lt;li&gt;Kahua でたのしい Web プログラミング (&lt;a href=&#39;http://www.kahua.org/kahua/docserv/ipax200405/enjoykahua/index.html&#39;&gt;HTML&lt;/a
&gt;)|(&lt;a href=&#39;http://www.kahua.org/kahua/docserv/ipax200405/enjoykahua/enjoykahua.tgz&#39;&gt;tarball(3.4MB)&lt;/a
&gt;)
&lt;/li
&gt;&lt;li&gt;GaucheによるSchemeプログラミング  
(&lt;a href=&#39;http://www.kahua.org/kahua/docserv/seminar200402/scheme/index.html&#39;&gt;HTML&lt;/a
&gt;)
(&lt;a href=&#39;http://www.kahua.org/kahua/docserv/seminar200402/scheme.tar.gz&#39;&gt;tarball(2.3MB)&lt;/a
&gt;)
&lt;/li
&gt;&lt;li&gt;継続渡しによるWebアプリケーション
(&lt;a href=&#39;http://www.kahua.org/kahua/docserv/seminar200402/cps/index.html&#39;&gt;HTML&lt;/a
&gt;)
(&lt;a href=&#39;http://www.kahua.org/kahua/docserv/seminar200402/cps.tar.gz&#39;&gt;tarball(2MB)&lt;/a
&gt;)
&lt;/li
&gt;&lt;/ul
&gt;&lt;hr /&gt;&lt;p&gt;&lt;div class=&#39;simplecommentmacro&#39;&gt;&lt;div class=&#39;commentform&#39;&gt;&lt;form method=&#39;POST&#39; action=&#39;/kahua-web/1-81v:1qrxw-1tnpr6&#39;&gt;&lt;div&gt;Name: &lt;input type=&#39;text&#39; name=&#39;author&#39; size=&#39;20&#39; maxlength=&#39;20&#39; /&gt;&lt;/div
&gt;&lt;div&gt;Comment: &lt;textarea name=&#39;contents&#39; cols=&#39;70&#39; rows=&#39;3&#39;&gt;&lt;/textarea
&gt;&lt;/div
&gt;&lt;div&gt;&lt;input type=&#39;submit&#39; value=&#39;Submit a comment&#39; /&gt;&lt;/div
&gt;&lt;/form
&gt;&lt;/div
&gt;&lt;div class=&#39;comments&#39;&gt;&lt;div class=&#39;comment&#39;&gt;&lt;div class=&#39;comment-header&#39;&gt;くに: (Sun Nov 13 00:02:42 2005
)&lt;/div
&gt;&lt;div class=&#39;comment-contents&#39;&gt;&lt;pre&gt;横スクロールバーが出て読みにくいところが
あるのですが、なんとかならないでしょうか？
&lt;/pre
&gt;&lt;/div
&gt;&lt;/div
&gt;&lt;div class=&#39;comment&#39;&gt;&lt;div class=&#39;comment-header&#39;&gt;び: (Mon May 28 18:08:53 2007
)&lt;/div
&gt;&lt;div class=&#39;comment-contents&#39;&gt;&lt;pre&gt;あまりにコメントSPAMがひどかったので長らく閉鎖していましたが、コメント欄を復活して
みました。素朴なコメントSPAMチェックを行っています。
&lt;/pre
&gt;&lt;/div
&gt;&lt;/div
&gt;&lt;div class=&#39;comment&#39;&gt;&lt;div class=&#39;comment-header&#39;&gt;び: (Mon May 28 18:13:59 2007
)&lt;/div
&gt;&lt;div class=&#39;comment-contents&#39;&gt;&lt;pre&gt;なお、URLは本文中にひとつしか含められません。また、HTMLタグは解釈しません。
BBcodeも同様です。いずれも含まれた場合はコメントSPAMであると判断します。
&lt;/pre
&gt;&lt;/div
&gt;&lt;/div
&gt;&lt;div class=&#39;comment&#39;&gt;&lt;div class=&#39;comment-header&#39;&gt;び: (Mon May 28 18:24:37 2007
)&lt;/div
&gt;&lt;div class=&#39;comment-contents&#39;&gt;&lt;pre&gt;しばらく試験運用した後、SPAM判断のルールは適宜変更します。
&lt;/pre
&gt;&lt;/div
&gt;&lt;/div
&gt;&lt;div class=&#39;comment&#39;&gt;&lt;div class=&#39;comment-header&#39;&gt;び: (Tue Jun  5 12:34:44 2007
)&lt;/div
&gt;&lt;div class=&#39;comment-contents&#39;&gt;&lt;pre&gt;何だかよくわからない英語のメッセージを削除しました。
&lt;/pre
&gt;&lt;/div
&gt;&lt;/div
&gt;&lt;div class=&#39;comment&#39;&gt;&lt;div class=&#39;comment-header&#39;&gt;び: (Fri Jun  8 09:06:55 2007
)&lt;/div
&gt;&lt;div class=&#39;comment-contents&#39;&gt;&lt;pre&gt;preに対して、overflow: auto; を設定しました。これで、ページ全体に横スクロールバーが出てしまう問題は
(一部のブラウザを除けば)回避できると思います。単にコメントごとに横スクロールバーが出るようになるだけ
なのですが。
&lt;/pre
&gt;&lt;/div
&gt;&lt;/div
&gt;&lt;div class=&#39;comment&#39;&gt;&lt;div class=&#39;comment-header&#39;&gt;９℃: (Thu Jul  5 12:42:17 2007
)&lt;/div
&gt;&lt;div class=&#39;comment-contents&#39;&gt;&lt;pre&gt;gauche初心者で、いろいろ参考にさせていただいております。

こちらに書くことがどうか分からないのですが、
8.3.3. にある accumulator-gen-bis の定義について。

最後の行にある
(iter i 0)))
は
(iter i 1)))
とすべきではないでしょうか？

現状の定義で、練習問題8.1にある
階乗の定義
(define fact-bis
  (accumulator-gen-bis * 1))
を行うと引数に関わらず0が返ります。

(iter 1 0)
=(iter (* 1 0) (+ 0 1))
=(iter 0 1)
=(iter (* 0 1) (+ 1 1))
=(iter 0 2) -&amp;gt; 0 (at n=1) -&amp;gt;1が返るべき
=(iter (* 0 2) (+ 2 1))
=(iter 0 3) -&amp;gt; 0 (at n=2) -&amp;gt;2が返るべき

count を1から始めると正しく動作します。
(iter 1 1)
=(iter (* 1 1) (+ 1 1))
=(iter 1 2) -&amp;gt; 1 (at n=1) 1!=1
=(iter (* 1 2) (+ 2 1))
=(iter 2 3) -&amp;gt; 2 (at n=2) 2!=2
=(iter (* 2 3) (+ 3 1))
=(iter 6 4) -&amp;gt; 6 (at n=3) 3!=6

countを1からにしても、sum-bisには問題ありませんでした。count=0の処理を行っても0を加算するだけなので。

…それとも、accumulator-gen-bis の引数を工夫して何かうまくできるものなのでしょうか。
&lt;/pre
&gt;&lt;/div
&gt;&lt;/div
&gt;&lt;div class=&#39;comment&#39;&gt;&lt;div class=&#39;comment-header&#39;&gt;び: (Fri Jul  6 11:17:23 2007
)&lt;/div
&gt;&lt;div class=&#39;comment-contents&#39;&gt;&lt;pre&gt;ありがとうございます。ご指摘の通りだと思うので修正しました。そもそも繰り返し回数がcount+1になっちゃい
ますからね。
&lt;/pre
&gt;&lt;/div
&gt;&lt;/div
&gt;&lt;div class=&#39;comment&#39;&gt;&lt;div class=&#39;comment-header&#39;&gt;び: (Fri Jul  6 11:35:27 2007
)&lt;/div
&gt;&lt;div class=&#39;comment-contents&#39;&gt;&lt;pre&gt;&amp;gt; 繰り返し回数がcount+1に
count+1じゃなくてn+1だった...

なお、「Easy Gauche」はほぼ放置状態なので、ひょっとすると、こちらの方がいいかもしれません。
http://karetta.jp/book/gauche-hacks
&lt;/pre
&gt;&lt;/div
&gt;&lt;/div
&gt;&lt;/div
&gt;&lt;/div
&gt;
&lt;/p
&gt;
&lt;/p
&gt;&lt;/div
&gt;</description
></item
><item><title>debug</title
><link>http://khead.kahua.org/kahua-web/show/eg/debug</link
><pubDate>Thu, 01 Mar 2007 17:35:03 +0900</pubDate
><description>&lt;div&gt;&lt;hr /&gt;&lt;p&gt;##(toc)
&lt;/p
&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/Enjoy%20Gauche&#39;&gt;Enjoy Gauche の目次&lt;/a
&gt;
&lt;/li
&gt;&lt;/ul
&gt;&lt;hr /&gt;&lt;h2 id=&#39;H-1rk5hz288s9jz&#39;&gt;B. Gauche でのデバッグ
&lt;/h2
&gt;&lt;p&gt;プログラムが、思いどおり動かないとき、原因を探る必要があります。
それぞれの手続き(プロシージャ)が「意図したとおり動いているか」を知る
必要があります。
&lt;/p
&gt;&lt;h3 id=&#39;H-1y0zgd2axxycp&#39;&gt;B.1. リーダマクロ #?=&lt;em&gt;expr&lt;/em
&gt;
&lt;/h3
&gt;&lt;p&gt;これは、C 言語をつかったプログラミングでは、「printf デバッグ」などと
言われることのある古典的なデバッグ手法のためのマクロです。
#?=&lt;em&gt;expr&lt;/em
&gt; は (debug-print &lt;em&gt;expr&lt;/em
&gt;) のように読まれ、これは、&lt;em&gt;expr&lt;/em
&gt; を
評価してその値を返しますが、評価の直前に評価する式を、
評価直後にその値を、印字します。
&lt;/p
&gt;&lt;p&gt;以下は、リファレンスマニュアルにある例です。
&lt;/p
&gt;&lt;pre&gt;gosh&amp;gt; #?=(+ 2 3)
#?=&amp;quot;(stdin)&amp;quot;:1:(+ 2 3)
#?-    5
5
&lt;/pre
&gt;&lt;pre&gt;gosh&amp;gt; #?=(begin (print &amp;quot;foo&amp;quot;) (values &amp;#39;a &amp;#39;b &amp;#39;c))
#?=&amp;quot;(stdin)&amp;quot;:2:(begin (print &amp;quot;foo&amp;quot;) (values &amp;#39;a &amp;#39;b &amp;#39;c))
foo
#?-    a
#?+    b
#?+    c
a
b
c
&lt;/pre
&gt;&lt;pre&gt;gosh&amp;gt; (define (fact n)
        (if (zero? n)
            1
            (* n #?=(fact (- n 1)))))
fact
gosh&amp;gt; (fact 5)
#?=&amp;quot;(stdin)&amp;quot;:6:(fact (- n 1))
#?=&amp;quot;(stdin)&amp;quot;:6:(fact (- n 1))
#?=&amp;quot;(stdin)&amp;quot;:6:(fact (- n 1))
#?=&amp;quot;(stdin)&amp;quot;:6:(fact (- n 1))
#?=&amp;quot;(stdin)&amp;quot;:6:(fact (- n 1))
#?-    1
#?-    1
#?-    2
#?-    6
#?-    24
120
&lt;/pre
&gt;&lt;h3 id=&#39;H-2g5yhsg3a8mdq&#39;&gt;B.2. ggc.debug.trace
&lt;/h3
&gt;&lt;p&gt;&lt;a href=&#39;http://homepage.mac.com/skimu/ggc/&#39;&gt;skim さんの ggc ライブラリ&lt;/a
&gt;に
ggc.debug.trace というモジュールがあります。これには、trace という
マクロとuntrace というマクロが定義されています。trace を使うと、手続き
の呼出しをその引数の値とともに追跡することができます。untrace は
trace を解除するマクロです。
&lt;/p
&gt;&lt;pre&gt;gosh&amp;gt; (use ggc.debug.trace)
(#&amp;lt;module ggc.debug.trace&amp;gt; #&amp;lt;module gauche.interactive&amp;gt;)
gosh&amp;gt; (define (tarai x y z)
        (if (&amp;lt;= x y)
            y
            (tarai (tarai (- x 1) y z)
                   (tarai (- y 1) z x)
                   (tarai (- z 1) x y))))
tarai
gosh&amp;gt; (trace tarai)
#&amp;lt;closure 0x806b500(x)&amp;gt;
gosh&amp;gt; (tarai 4 2 1)
0:(tarai 4 2 1)
1:  (tarai 3 2 1)
2:    (tarai 2 2 1)
      -&amp;gt;2
2:    (tarai 1 1 3)
      -&amp;gt;1
2:    (tarai 0 3 2)
      -&amp;gt;3
2:    (tarai 2 1 3)
3:      (tarai 1 1 3)
        -&amp;gt;1
3:      (tarai 0 3 2)
        -&amp;gt;3
3:      (tarai 2 2 1)
        -&amp;gt;2
3:      (tarai 1 3 2)
        -&amp;gt;3
      -&amp;gt;3
    -&amp;gt;3
1:  (tarai 1 1 4)
    -&amp;gt;1
1:  (tarai 0 4 2)
    -&amp;gt;4
1:  (tarai 3 1 4)
2:    (tarai 2 1 4)
3:      (tarai 1 1 4)
        -&amp;gt;1
3:      (tarai 0 4 2)
        -&amp;gt;4
3:      (tarai 3 2 1)
4:        (tarai 2 2 1)
          -&amp;gt;2
4:        (tarai 1 1 3)
          -&amp;gt;1
4:        (tarai 0 3 2)
          -&amp;gt;3
4:        (tarai 2 1 3)
5:          (tarai 1 1 3)
            -&amp;gt;1
5:          (tarai 0 3 2)
            -&amp;gt;3
5:          (tarai 2 2 1)
            -&amp;gt;2
5:          (tarai 1 3 2)
            -&amp;gt;3
          -&amp;gt;3
        -&amp;gt;3
3:      (tarai 1 4 3)
        -&amp;gt;4
      -&amp;gt;4
2:    (tarai 0 4 3)
      -&amp;gt;4
2:    (tarai 3 3 1)
      -&amp;gt;3
2:    (tarai 4 4 3)
      -&amp;gt;4
    -&amp;gt;4
  -&amp;gt;4
; trace: tarai has been called 29 times.
4
gosh&amp;gt; (untrace)
()
gosh&amp;gt; (tarai 4 2 1)
4
&lt;/pre
&gt;&lt;/div
&gt;</description
></item
><item><title>install</title
><link>http://khead.kahua.org/kahua-web/show/eg/install</link
><pubDate>Thu, 01 Mar 2007 17:34:24 +0900</pubDate
><description>&lt;div&gt;&lt;hr /&gt;&lt;p&gt;##(toc)
&lt;/p
&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&#39;/kahua-web/show/Enjoy%20Gauche&#39;&gt;Enjoy Gauche の目次&lt;/a
&gt;
&lt;/li
&gt;&lt;/ul
&gt;&lt;hr /&gt;&lt;h2 id=&#39;H-2c6owssv0hv9&#39;&gt;A. Gaucheのインストール
&lt;/h2
&gt;&lt;p&gt;Gauche はソースアーカイブとして配布されています。Debian GNU/Linux や FreeBSD
などのパッケージとしても配布されているようですが、最新のものではありません。
最新のものを使うには、ソースアーカイブファイルをダウンロードして、自分で
ビルドしてインストールする必要があります。したがって、gcc や make が
お使いのシステムにインストールされていることが必要です。
&lt;/p
&gt;&lt;h3 id=&#39;H-8ls3vgu41zn7&#39;&gt;A.1. 正式リリースからのビルド
&lt;/h3
&gt;&lt;h4 id=&#39;H-b95w5d8c4409&#39;&gt;A.1.1. ソースアーカイブファイルの取得
&lt;/h4
&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&#39;http://practical-scheme.net/gauche/index-j.html&#39;&gt;Gauche の公式サイト(日本語)&lt;/a
&gt;
へブラウザでアクセス
&lt;/li
&gt;&lt;li&gt;&lt;a href=&#39;http://www.shiro.dreamhost.com/scheme/gauche/download-j.html&#39;&gt;ダウンロードのページ&lt;/a
&gt;へ移動。
ここに簡単なインストール方法が書いてあります。
&lt;/li
&gt;&lt;li&gt;ダウンロードのページにの最初の方に、ダウンロードのためのリンクがあります。
現時点では&lt;a href=&#39;http://prdownloads.sourceforge.net/gauche/Gauche-0.8.7.tgz&#39;&gt;Gauche-0.8.7.tgz&lt;/a
&gt;
が最新バージョンです
&lt;/li
&gt;&lt;li&gt;ダウンロードのためのリンクをクリックすると、ミラーサイトの一覧が
でてきますので、適当なところの Download 欄をクリックして、
ソースアーカイブファイルを取得して、適当なディレクトリに保存してください。
&lt;/li
&gt;&lt;/ul
&gt;&lt;h4 id=&#39;H-3phphgwiy7io2&#39;&gt;A.1.2. アーカイブファイルからのビルド
&lt;/h4
&gt;&lt;ul&gt;&lt;li&gt;1. 展開&lt;br /&gt;
ソースアーカイブファイルを適当なディレクトリに保存したら、これを展開します。
&lt;pre&gt;$ tar zxf Gauche-0.8.3.tgz
&lt;/pre
&gt;&lt;/li
&gt;&lt;/ul
&gt;&lt;ul&gt;&lt;li&gt;2. ディレクトリ移動&lt;br /&gt;
展開すると、Gauche-0.8.3 というサブディレクトリができて、そのディレクトリ
以下にソースコードが展開されています。このサブディレクトリに移動します。
&lt;pre&gt;$ cd Gauche-0.8.3
&lt;/pre
&gt;&lt;/li
&gt;&lt;/ul
&gt;&lt;ul&gt;&lt;li&gt;3. configure&lt;br /&gt;
configure スクリプトを起動します。configure スクリプトにはいろいろな
オプションがあります。その内容が知りたければ、まず、
&lt;pre&gt;$ ./configure --help
&lt;/pre
&gt;とやって、下さい。なにも指定しない場合には、Gauche は /usr/local 配下の
サブディレクトリにインストールされます。ここでは、$HOME/gauche 以下に
インストールすることにします。
&lt;pre&gt;./configure --prefix=$HOME/gauche
&lt;/pre
&gt;configure スクリプトの実行 log は config.log というファイルに保存されます。
&lt;/li
&gt;&lt;/ul
&gt;&lt;ul&gt;&lt;li&gt;4. ビルドおよびチェック&lt;br /&gt;
configure がエラーなく終了したら、次は、ビルドします。
&lt;pre&gt;$ make
&lt;/pre
&gt;これも、エラーなく終了したら、チェックを走らせます。
&lt;pre&gt;$ make check
&lt;/pre
&gt;いろいろなテストが行われ、すべてパスしたら、
&lt;pre&gt;$ make install
&lt;/pre
&gt;します。
&lt;/li
&gt;&lt;/ul
&gt;&lt;ul&gt;&lt;li&gt;5. パスの設定&lt;br /&gt;
Gauche のインタープリタがフルパスでなくても起動できるように環境変数 PATH
を設定します。シェルが bash なら、
&lt;pre&gt;$ export PATH=$HOME/gauche/bin:$PATH
&lt;/pre
&gt;とします。$HOME/.bashrc に
&lt;pre&gt;export PATH=$HOME/gauche/bin:$PATH
&lt;/pre
&gt;と書いておけば、ログインのたびに環境変数を設定する必要がなくなります。
&lt;/li
&gt;&lt;/ul
&gt;&lt;ul&gt;&lt;li&gt;6. バージョンの確認&lt;br /&gt;
-V オプションを付けて、gosh を起動します。
&lt;pre&gt;$ gosh -V
Gauche scheme interpreter, version 0.8.3 [euc-jp]
&lt;/pre
&gt;これでインストールが終りです。
&lt;/li
&gt;&lt;/ul
&gt;&lt;h3 id=&#39;H-3trgibrlzx0e6&#39;&gt;A.2. CVS リポジトリ
&lt;/h3
&gt;&lt;p&gt;最先端のバージョンの「追っかけ」をやりたければ、sourceforge の cvs 
リポジトリが利用できます。
&lt;/p
&gt;&lt;p&gt;ただし、CVS リポジトリのものをビルドするには最新の正式リリースの
ソースアーカイブから作成した Gauche がインストールされている必要が
あります。また、2.54 以上のバージョンの autoconf が必要です。
&lt;/p
&gt;&lt;ul&gt;&lt;li&gt;1. cvs ログイン&lt;br /&gt;
最初のcvsアクセスの時だけ、login が必要です。
&lt;pre&gt;$ cvs -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/gauche login
&lt;/pre
&gt;パスワードを訊かれますが、何も入れず、ENTERキーを押してください。
&lt;/li
&gt;&lt;/ul
&gt;&lt;ul&gt;&lt;li&gt;2. チェックアウト&lt;br /&gt;
cvs login でエラーがでなければ、以下のようにするとGaucheの最先端の
ソースファイル一式がチェックアウトできます。
&lt;pre&gt;$ cvs -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/gauche checkout Gauche
&lt;/pre
&gt;&lt;/li
&gt;&lt;/ul
&gt;&lt;ul&gt;&lt;li&gt;3. 準備
configure ファイルなどの準備をします。
&lt;pre&gt;$ cd Gauche
$ ./DIST gen
&lt;/pre
&gt;&lt;/li
&gt;&lt;/ul
&gt;&lt;ul&gt;&lt;li&gt;4. configure、make、make check、make install
ここからは、正式リリースのソースアーカイブファイルからのビルドと同じ手順です。
&lt;pre&gt;$ ./configure --prefix=$HOME
$ make
$ make check
$ make install
$ export $PATH=$HOME/gauche/bin:$PATH
&lt;/pre
&gt;&lt;/li
&gt;&lt;/ul
&gt;&lt;ul&gt;&lt;li&gt;5. ワーキングディレクトリの更新
ワーキングディレクトリ内で、
&lt;pre&gt;cvs up -dP
&lt;/pre
&gt;とすれば、いつでも最新の状態になります。
&lt;/li
&gt;&lt;/ul
&gt;&lt;/div
&gt;</description
></item
></channel
></rss
>
