<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>snipsnipsnip.github.io</title>
<link href="http://snipsnipsnip.github.io" />
<link type="application/atom+xml" rel="self" href="http://snipsnipsnip.github.io/atom.xml" />
<updated>2015-12-03T21:09:36+00:00</updated>
<id>http://snipsnipsnip.github.io</id>
<author><name>snipsnipsnip</name></author>


  <entry>
  <id>http://snipsnipsnip.github.io/2015/10/21/byflow</id>
  <link type="text/html" rel="alternate" href="http://snipsnipsnip.github.io/2015/10/21/byflow.html" />
  <title>byflowなくなってた</title>
  <updated>2015-10-21T04:07:00+00:00</updated>
  <content type="html"><![CDATA[<p>byflowというamazon商品にコメントをつけられるサイトがなくなっていた。CSVでエクスポートしそびれたので、掘り出せたぶんをいくつか書きなおそうと思う。</p>

<h2 id="git-junio-c-hamanohttpwwwamazoncojpoasin4798023809taikaisyu-22"><a href="http://www.amazon.co.jp/o/ASIN/4798023809/taikaisyu-22">入門 Git: Junio C. Hamano</a></h2>

<p><a href="http://www.amazon.co.jp/o/ASIN/4798023809/taikaisyu-22"><img src="http://ecx.images-amazon.com/images/I/41R5gj5VRFL._AC_UL160.jpg" alt="入門 Git" /></a></p>

<p>この本を見つけるまでさっぱりGitの使い方がわからなかった。</p>

<p>解説がいきなりGitリポジトリの内部構造から始まるので少し面食らう（SVNの入門書でFSFSをやる本はないと思う）が、やってみるとそれが使う上で必要な最小限ということがわかる。</p>

<p>それがすんだらワークフローの例とそれに必要なコマンドや設定が用例で紹介される。これがチュートリアルのようになっていて、読みながら試すとクローンからリベースまでひと通り覚えられるようになっている。</p>

<p>間にちょこちょこ挟まるLinuxコミュニティの事情が楽しい。</p>

<h2 id="smalltalk-kent-beckhttpwwwamazoncojpoasin4894717549taikaisyu-22"><a href="http://www.amazon.co.jp/o/ASIN/4894717549/taikaisyu-22">ケント・ベックのSmalltalkベストプラクティス・パターン―シンプル・デザインへの宝石集: Kent Beck</a></h2>

<p><a href="http://www.amazon.co.jp/o/ASIN/4894717549/taikaisyu-22"><img src="http://ecx.images-amazon.com/images/I/5164YAE2H1L._AC_UL160.jpg" alt="ケント・ベックのSmalltalkベストプラクティス・パターン―シンプル・デザインへの宝石集: Kent Beck" /></a></p>

<p>メソッドの名前のつけかたやクラスを小分けする手順など、一冊たっぷり筆者のプログラム設計の好みやイディオムが解説してある。</p>

<p>「メソッドが長くて困っています」→「分割しましょう、こういう手順です」のようなQ&amp;A方式で構成されている。</p>

<p>全記事が参照しあっていて、読んでいて飽きない。</p>

<p>プログラム言語はSmalltalkではあるが、内容はオブジェクト指向言語にはほぼそのまま応用できる。</p>

<p>同筆者によるJava向けに書き換えたような「実装パターン」という本があるが、こちらのほうが厚くてお得。</p>

<h2 id="michael-c-feathershttpwwwamazoncojpoasin4798116831taikaisyu-22"><a href="http://www.amazon.co.jp/o/ASIN/4798116831/taikaisyu-22">レガシーコード改善ガイド: Michael C. Feathers</a></h2>

<h2 id="todo">todo</h2>

<ul>
  <li>他は忘れたので思い出したら追記する。</li>
</ul>
]]></content>
  </entry>



  <entry>
  <id>http://snipsnipsnip.github.io/2013/12/02/sourcetree-for-windows-on-transifex</id>
  <link type="text/html" rel="alternate" href="http://snipsnipsnip.github.io/2013/12/02/sourcetree-for-windows-on-transifex.html" />
  <title>SourceTree for Windowsの翻訳に参加した</title>
  <updated>2013-12-02T12:00:00+00:00</updated>
  <content type="html"><![CDATA[<p><a href="https://www.transifex.com/projects/p/sourcetree-for-windows/">Transifex</a>にSourceTree for Windowsの翻訳プロジェクトが今月初め頃に立ち上がったのを見つけて、アナウンスもされない内に勝手に参加して作業した。Mac版からリソースを引き継ぐ用意もあっただろうに悪いことをしたと思う。(追記: 9日に<a href="http://blog.sourcetreeapp.com/2013/12/09/help-translate-sourcetree-for-windows/">アナウンス</a>が公式サイトに載った。2014年初頭に翻訳の入った版を出したいらしい)</p>

<p>日本語化を試したい人は<a href="https://bitbucket.org/snipsnipsnip/sourcetree.resources.ja">こちら</a>を参照。</p>

<ul id="markdown-toc">
  <li><a href="#section">作業中勝手に判断したもの</a></li>
  <li><a href="#sourcetree">日本語化されたSourceTreeに関する感想</a></li>
  <li><a href="#sourcetree-for-windows">日本語化してSourcetree for Windowsが使えるよ</a></li>
</ul>

<p><a href="https://bytebucket.org/snipsnipsnip/sourcetree.resources.ja/wiki/working.png"><img src="https://bytebucket.org/snipsnipsnip/sourcetree.resources.ja/wiki/working.png" alt="Screen Shot" /></a></p>

<h2 id="section">作業中勝手に判断したもの</h2>

<ul>
  <li>キャッシュとインデックスとステージ</li>
</ul>

<p>Gitは「キャッシュ」と「インデックス」と「ステージングエリア」というほぼ同じ意味の用語がある。だいぶ前に内部用語としてのキャッシュからインデックスと名前が変わった。オプションでもcacheという単語の代わりにindexと指定して使えることが多い。データをインデックスに追加するとことをステージングというので、初心者に向けて解説する時にはインデックスのことをステージングエリアと説明するのが最近の流れというのが僕の印象だが、とりあえずステージとキャッシュを使わず「インデックスに追加」と「インデックスから削除」のように統一した。</p>

<ul>
  <li>スタッシュとシェルブとシェルフ</li>
</ul>

<p>スタッシュとシェルブ。前者はmercurialの機能で後者はgitの機能。スタッフのsstreetingさんという人がshelveを一時退避と訳していたのでそれに従ったが、一応（stash）と（shelve）と括弧をつけた。</p>

<p>シェルブとシェルフは英語版でも微妙で、shelveは棚上げするという動詞で、単純に類推すると棚上げした変更内容はshelfに収まるのだろう。実際GUIを見ると棚上げした内容の一覧は”shelves”という見出しがついている。シェルフはある程度カタカナ語として通用すると思うが、シェルブでも充分類推は出来るだろう。どう訳したもんか。</p>

<ul>
  <li>メニュー項目のショートカットキー</li>
</ul>

<p>windowsでは&amp;hogeと書いたらhがショートカットとなるはずだが、なんかプロジェクトでは_hogeというふうになっている。で、sstreetingさんは_を無視して普通に単語として訳しているのでそれに従った。いいのだろうか。通常の流儀ならほげ (&amp;h) のように訳すもんだけど。</p>

<ul>
  <li>tracking/matching/current/nothing</li>
</ul>

<p>Gitのpush.defaultの設定項目の用語。キーワードによってgit pushとだけ打ち込んだ時のコマンドの動作が変わるという仕組み。それぞれ定訳を見たことがないので、日本語に単に訳すと検索するとき苦労するだろうと思ってmatching（対応するブランチ）のように括弧で注釈をつける形にした。</p>

<ul>
  <li>コマンドの日本語名</li>
</ul>

<p>Mercurial用語とかGit用語が困る。hg updateはgit resetと似たようなコマンドらしい。updateというと普通更新と訳してしまう。見分けづらい。リセットはリセットのままカタカナ語共通でいいのだが。hg graftはgit cherry-pickと同様。これはスタッフのsstreetingさんが接ぎ木と訳していたのでそれに従う。</p>

<ul>
  <li>gitとmercurialでの用語の違い</li>
</ul>

<p>gitのfetch＝hgのpull、gitのpull＝hgのrebaseという妙な関係にある。hgのfetchはgitのfetchとmergeを続けて実行する感じ(fast-forwardしない)。hgのtransplantはcherry-pickにあたるのかな。gitのrebaseはhgのgraft。これは翻訳というより僕の知識の問題だが。</p>

<ul>
  <li>working copyの訳語</li>
</ul>

<p>作業コピーと作業ツリーでsstreetingさんの訳がゆれている。作業コピーのほうが馴染みがあるのでそっちにした。</p>

<h2 id="sourcetree">日本語化されたSourceTreeに関する感想</h2>

<p>漢字でボタンが出るようになって操作が早くなったのが嬉しい。それが嬉しい程度には使っているが、まだ常用はしていない。自分はもともとGUIとCUIを同時に使う口で、gitk+CUIで満足していた。なのでSourceTreeを使うとしたらgitkの代替を期待する。そうなると、解像度低めの自分にはSourceTreeはウィンドウ面積が大きいのが辛い。色々な機能は確実にgit guiより便利なので、ペインが隠せたりツールバーがカスタマイズできたりするようになればgitkから乗り換えると思う。</p>

<h2 id="sourcetree-for-windows">日本語化してSourcetree for Windowsが使えるよ</h2>

<p>2014-01-20現在公式でのローカライズ版のリリースはまだないが、今のバージョンでももともと日本語化は可能になっている。SourceTreeのフォルダを開いて、リソースDLLを差し替えればいい。</p>

<p>幸いリソースDLLをビルドするキットを作っている人(<a href="https://bitbucket.org/koty/sourcetree.resources.ja">@koty氏</a>)がいたので、日本語化の結果はすぐに試すことができた。日本語化を試したい人は<a href="https://bitbucket.org/snipsnipsnip/sourcetree.resources.ja">こちらを参照</a>。</p>

]]></content>
  </entry>



  <entry>
  <id>http://snipsnipsnip.github.io/2012/09/01/burning-ship-of-mandelbrot-and-julia</id>
  <link type="text/html" rel="alternate" href="http://snipsnipsnip.github.io/2012/09/01/burning-ship-of-mandelbrot-and-julia.html" />
  <title>マンデルブロとジュリアの燃える船ビューア</title>
  <updated>2012-09-01T08:04:00+00:00</updated>
  <content type="html"><![CDATA[<p><a href="http://gist.github.com/raw/525284/8e509ea5c5377c165f930fb4f3454c0b8657a8f5/mandelbrot.zip"><img src="https://gist.github.com/snipsnipsnip/525284/raw/cb58714b86bc24eaffd75f82aa33da0abd0d8ea7/screenshot.png" alt="マンデルブロとジュリアの燃える船ビューア" /></a></p>

<h2 id="section">ダウンロード</h2>

<p><a href="http://gist.github.com/raw/525284/8e509ea5c5377c165f930fb4f3454c0b8657a8f5/mandelbrot.zip">mandelbrot.zip</a></p>

<p><a href="http://gist.github.com/525284">gist:525284</a></p>

<p>SDLでマンデルブロー集合のビューアを作った。右クリックでぐりぐりすると四次元的な構造体だというのがよくわかる。緑が発散までの回数、赤青は発散した向き。</p>

<h2 id="section-1">操作</h2>

<table>
  <thead>
    <tr>
      <th>操作</th>
      <th>効果</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>ドラッグ</td>
      <td>移動</td>
    </tr>
    <tr>
      <td>ダブルクリック</td>
      <td>移動</td>
    </tr>
    <tr>
      <td>マウスホイール</td>
      <td>拡大・縮小</td>
    </tr>
    <tr>
      <td>右ドラッグ</td>
      <td>定数の調整</td>
    </tr>
    <tr>
      <td>右クリック</td>
      <td>モード切り替え (ジュリア集合とか)</td>
    </tr>
    <tr>
      <td>左クリックしながらマウスホイール</td>
      <td>繰り返し回数の調整</td>
    </tr>
    <tr>
      <td>右クリックしながらマウスホイール</td>
      <td>モード切り替え (ジュリア集合とか)</td>
    </tr>
    <tr>
      <td>マウスホイールをクリック</td>
      <td>リセット</td>
    </tr>
  </tbody>
</table>

<p>(<a href="http://tmblr.co/ZxaFSy_Gpc_">tumblr</a>からの移植記事です)</p>
]]></content>
  </entry>



  <entry>
  <id>http://snipsnipsnip.github.io/2012/04/10/joel-spolsky-s-evidence-based-scheduling</id>
  <link type="text/html" rel="alternate" href="http://snipsnipsnip.github.io/2012/04/10/joel-spolsky-s-evidence-based-scheduling.html" />
  <title>事例によるスケジューリング</title>
  <updated>2012-04-10T10:43:00+00:00</updated>
  <content type="html"><![CDATA[<p><a href="http://www.joelonsoftware.com/items/2007/10/26.html">Joel Spolskyの記事</a>を訳した。方法論というより、単なるアルゴリズムの説明。<a href="http://local.joelonsoftware.com/wiki/%E4%BA%8B%E4%BE%8B%E3%81%AB%E3%82%88%E3%82%8B%E3%82%B9%E3%82%B1%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%B0">翻訳wiki</a>に置いたが、こちらにも転載。ミスの指摘など歓迎。</p>
<h2>事例によるスケジューリング</h2>
<p>2007年10月26日 金曜</p>
<p>ソフトウェア開発者はスケジュールを作りたがらない。大抵はなしですまそうとする。「出来上がったときが<abbr title="ship date (1) ソフトウェアが実際完成する日。 (2) プロジェクトの納期。">完成日</abbr>さ！」と元気一杯見栄を切ってボスを喜ばせ、活気づいたままどこかにスケジュールは忘れ去られてしまう。</p>
<p>スケジュールがあるとしても、半端なものであることが多い。誰か一人によってしぶしぶ作られて、共有フォルダのどこかに置かれて、忘れ去られる。2年後、キャビネットの底で古びたプリントを見つけた人が反省会に持ってきてネタにするのだ。</p>
<p>「見ろよこれ。Rubyで1から書き直すのを2週間ですます予定だったらしい」</p>
<div style="float: right;"><img src="http://local.joelonsoftware.com/mediawiki/images/1/1e/26a.jpg" alt="26a.jpg" width="240" height="161" /></div>
<p>笑えるね。まだその真っ最中ならなおさら。</p>
<p>できることなら、やる価値のあるタスクだけに時間を注ぎたいだろう。しかし、一番やる価値のある仕事を決めるには、どの程度時間がかかるのか知る必要がある。「飛び跳ねる紙クリップ」機能と「金融計算関数を追加」機能のどちらに手をつけるか決めるには、それぞれにかかる時間を知らねばならない。</p>
<p>なぜ開発者はスケジュールを作らないのだろうか？理由は二つある。（１）作るのが面倒だ。（２）本当にそのとおりになるわけがない。正確にならないとわかっているスケジュールを誰がわざわざ作ろうとするだろう？</p>
<p>去年Fog Creekは、どれほど文句の多い開発者でも使いたくなるほど簡単なシステムを開発した。そして、我々の知る限り、このシステムはかなり信頼性の高い予測をしてくれる。名前は <abbr title="事例によるスケジューリング Evidence Based Scheduling"><span style="color: green;">EBS</span></abbr>（Evidence Based Scheduling：事例をもとにしたスケジューリング）と言う。</p>
<p>タスクがいつ始まっていつ終わったかの<strong>事例</strong>を、タイムカードなどの記録から集める。それらからスケジュールの将来を予測する。計算の結果となるのは<abbr title="ship date (1) ソフトウェアが実際完成する日。 (2) プロジェクトの納期。">完成予想日</abbr>ひとつではなく、<abbr title="confidence distribution curve">完成する確率を日付ごとに並べたグラフ</abbr>だ。</p>
<p>それはこういう見た目になる。</p>
<div><div class="thumbinner" style="border: 1px solid gray; background-color: #eee; text-align: center; width: 472px;"><p><img style="border: 1px solid gray;" src="http://local.joelonsoftware.com/mediawiki/images/9/98/20071026-1.png" alt="" width="470" height="250" /></p><div class="thumbcaption">(訳注: バーンダウン図に見えるが全く別物。</div><div class="thumbcaption">言うなれば横軸の日付でバーンダウン図が100％になる確率)</div></div></div>
<p>曲線が急であればあるほど、その日にリリースできると自信を持って言えることになる。</p>
<p>やり方を説明しよう。</p>
<h2>1) 粉々にする</h2>
<p>単位を日数や週の数で立てたスケジュールはうまくいかない事を我々はよく知っている。</p>
<p>タスクを小さく分けて行って、単位が<strong>時間</strong>になるまで細かく分けよう。16時間以下がいい。</p>
<p>分けることで、あなたがやるべきことの中身を実際に考えるように仕向けることができる。<em>foo</em> サブルーチンを書く。ダイアログボックスを作る。Fizzbottファイルをパースする。一つ一つの開発タスクにかかる時間は簡単に予想がつく。なぜなら、前にあなたは似たようなことをやったことがあるからだ。</p>
<p>あなたが大雑把な開発者なら、3週間程度の大きいタスクを作ることがあるだろう（「Ajax画像エディタを実装」とか）。そういう時あなたは、<em>実際にどう作業するかを考えずにすましている</em>。一つ一つの手順を詳細に想像せずに。実際何をするのかわかっていなければ、かかる時間を見積るのは不可能だ。</p>
<p>タスクの限度を16時間にしたのは、開発者に機能そのものを<em>デザイン</em>させるためだ。3週間で派手な「Ajax画像エディタ」を細かい設計なしに作ろうとするのは、言わせてもらえば<em>正気じゃない</em>。</p>
<p>どんな手順を踏んで作るのか把握せずに作ろうとしても、そのステップをいくつか踏み忘れたままで終わるだろう。</p>
<h2>2) 時間を記録する</h2>
<p>タスクにかかる時間を正確に予想するのは難しい。他の仕事が割り込んでくるかもしれない。予想もしないバグが出てきたり、ミーティングもあるだろう。Windowsが年貢の納めどきを迎えて、開発マシンを丸ごと再インストールする羽目になるかもしれない。</p>
<p>これらにどれだけ確保すればよいのだろう。いや、トラブルの類が全くなかったとしても、そのサブルーチンを書くのにどれだけかかるのか予想がつくだろうか？</p>
<p>実際のところ、不可能だ。</p>
<p>タイムシートをつけよう。各タスクにどれだけ時間がかかったか記録をとる。タスクが終わった後、実際かかった時間が予想とどれだけ違うか比べることができる。</p>
<p>その記録をグラフ上に点を打っていくと、各人にこういうグラフができあがる。</p>
<p><img src="http://local.joelonsoftware.com/mediawiki/images/b/bc/20071026-2.png" alt="20071026-2.png" width="369" height="376" /></p>
<p>点のひとつひとつは完了したタスクを表している。横の座標が予想した時間で、縦の座標が実際に完了するのにかかった時間だ。予想の時間を実際の時間で割ると、そのタスクの<abbr title="velocity タスクの予想所要時間を実際かかった経過時間で割ったもの"><span style="color: navy;">勢い</span></abbr>がわかる。タスクが予想とよりどれだけ早く済んだか、という割合だ。</p>
<p>プロジェクトを進めながらこのグラフに点を打っていくことで、開発者ごとに<abbr title="velocity タスクの予想所要時間を実際かかった経過時間で割ったもの"><span style="color: navy;">勢い</span></abbr>のレコードが溜まってゆく。</p>
<ul><li> <abbr title="perfect estimator"><span style="color: maroon;">完璧な開発者</span></abbr>は、実際いれば伝説に残る存在だが、想像上にしかいない。全て予想通りの時間でぴったりタスクを済ませる。<br /> つまり、<abbr title="velocity タスクの予想所要時間を実際かかった経過時間で割ったもの"><span style="color: navy;">勢い</span></abbr>の記録は <tt style="font-size: 12pt;"> {1, 1, 1, 1, 1, ... } </tt> のようになる。</li><li> 典型的な、<abbr title="bad estimator"><span style="color: maroon;">予想下手な開発者</span></abbr>は、グラフ上にバラバラな点を打つ。長めに予想することもあれば、短すぎることもある。<br /> この場合の記録は、例えば <tt style="font-size: 12pt;"> {0.1, 0.5, 1.7, 0.2, 1.2, 0.9, 13.0} </tt> のようになる。</li><li> 多くの開発者はスケールを取り違えるが、相対的には概ねよい予想をする。<br /> 予想外のバグ修正やミーティング、コーヒーブレイク、うるさく心配するボスの割り込みなどがあいまって、ほとんどのタスクは予想より長くかかる。<br /> こういった<abbr title="common estimator"><span style="color: maroon;">平均的な開発者</span></abbr>は、たいてい１以下で、ぶれの少ない<abbr title="velocity タスクの予想所要時間を実際かかった経過時間で割ったもの"><span style="color: navy;">勢い</span></abbr>のレコードを残す。例えば<tt style="font-size: 12pt;"> {0.6, 0.5, 0.6, 0.6, 0.5, 0.6, 0.7, 0.6} </tt> のようになる。</li></ul>
<p>タスクの予想は、開発者が経験を積むにつれて精度が上がってゆく。なので、古い<abbr title="velocity タスクの予想所要時間を実際かかった経過時間で割ったもの"><span style="color: navy;">勢い</span></abbr>の記録、例えば６ヶ月より前のものは勘定に入れないほうがよいだろう。</p>
<p>チームに新しい開発者が加わった時には予想の記録がないが、その場合は下手な方で仮定しておく。広い範囲で<abbr title="velocity タスクの予想所要時間を実際かかった経過時間で割ったもの"><span style="color: navy;">勢い</span></abbr>のダミーの記録を用意しておいて、6つほどタスクをすませるまではそれを計算に使う。</p>
<h2>3) 未来をシミュレートする</h2>
<p>タスクをすべてこなしたら出荷できるとすると、プロジェクトの<abbr title="ship date (1) ソフトウェアが実際完成する日。 (2) プロジェクトの納期。">出荷日</abbr>は単に全タスクの予想時間を足し合わせれば出てくる。この方法はもっともらしく見えるがうまくいかない。</p>
<p>代わりに <abbr title="事例によるスケジューリング Evidence Based Scheduling"><span style="color: green;">EBS</span></abbr> ではモンテカルロ法で<abbr title="ship date (1) ソフトウェアが実際完成する日。 (2) プロジェクトの納期。">出荷日</abbr>を推測する。</p>
<p>プロジェクトの将来のシナリオを100通りシミュレートする。ありえるシナリオのそれぞれは1%に対応する。それらの<abbr title="ship date (1) ソフトウェアが実際完成する日。 (2) プロジェクトの納期。">出荷日</abbr>を頻度表として集計すると、それぞれの日付について完成する確率のグラフができあがる。</p>
<p>シナリオを計算するとき、各タスクの予想時間をその開発者の<abbr title="velocity タスクの予想所要時間を実際かかった経過時間で割ったもの"><span style="color: navy;">勢い</span></abbr>で割る。この<abbr title="velocity タスクの予想所要時間を実際かかった経過時間で割ったもの"><span style="color: navy;">勢い</span></abbr>はステップ2で集めた履歴からランダムに選んだものだ。</p>
<p>たとえばある未来ではこの開発者のタスクはこうなる。</p>
<p><img src="http://local.joelonsoftware.com/mediawiki/images/1/1f/20071026-3.png" alt="20071026-3.png" width="487" height="94" /></p>
<p>これを100回繰り返そう。合計一つは1%の可能性を持つので、あなたは任意の日に出荷できる確率を知ることができる。</p>
<p>先ほどの開発者たちがどうなるか見てみよう：</p>
<ul><li> <abbr title="perfect estimator"><span style="color: maroon;">完璧な開発者</span></abbr>の場合、常に<abbr title="velocity タスクの予想所要時間を実際かかった経過時間で割ったもの"><span style="color: navy;">勢い</span></abbr>は1だ。この<abbr title="velocity タスクの予想所要時間を実際かかった経過時間で割ったもの"><span style="color: navy;">勢い</span></abbr>で割ってもタスクの予想時間には何の影響もない。つまり、シミュレーションは100回すべてで同じ<abbr title="ship date (1) ソフトウェアが実際完成する日。 (2) プロジェクトの納期。">出荷日</abbr>をはじき出し、その確率は100%である。まるでおとぎ話だ。</li><li> <abbr title="bad estimator"><span style="color: maroon;">予想下手な開発者</span></abbr>の場合、<abbr title="velocity タスクの予想所要時間を実際かかった経過時間で割ったもの"><span style="color: navy;">勢い</span></abbr>は広く分布する。範囲は0.1から13.0までというところだろう。<br /> この中からランダムに選んで値を割るから、シミュレーションの結果は毎回大きく変動する。<abbr title="ship date (1) ソフトウェアが実際完成する日。 (2) プロジェクトの納期。">出荷日</abbr>の確率は浅く広く分布し、明日出荷できるかもしれないし、遠い未来かもしれない。とはいえ、読み取れることはある：あなたは<abbr title="ship date (1) ソフトウェアが実際完成する日。 (2) プロジェクトの納期。">出荷日</abbr>に自信を持ってはならない。</li><li> <abbr title="common estimator"><span style="color: maroon;">平均的な開発者</span></abbr>は互いによく似た<abbr title="velocity タスクの予想所要時間を実際かかった経過時間で割ったもの"><span style="color: navy;">勢い</span></abbr>を持つ。<tt style="font-size: 12pt;"> {0.6, 0.5, 0.6, 0.6, 0.5, 0.6, 0.7, 0.6} </tt> のようになる。<br /> これらの中から選んで割ると、各タスクの予想時間は割り増しで計算される。8時間のタスクは13時間になるか、あるいは他では15時間になる。</li></ul>
<p>このように、 <abbr title="事例によるスケジューリング Evidence Based Scheduling"><span style="color: green;">EBS</span></abbr> はあなたの楽観的な見通しを補ってくれる。予測はあなた本人による<em>実証済みの、実例の記録</em>によって、あなたの楽観さ度合いとぴったり<em>同じだけ</em>補われる。<abbr title="velocity タスクの予想所要時間を実際かかった経過時間で割ったもの"><span style="color: navy;">勢い</span></abbr>が0.6の前後あたりで狭く分布するので、<abbr title="ship date (1) ソフトウェアが実際完成する日。 (2) プロジェクトの納期。">出荷日</abbr>の範囲も狭い範囲に収まる。</p>
<p>モンテカルロシミュレーションでは毎回、時間単位のデータをカレンダー上の単位に変換しなければならない。その差異には各開発者の出勤予定、旅行、休日の日なども考慮する必要がある。また、最後に仕事を終えるのがどの開発者か判別しなければならない。なぜなら、そのとき初めてチーム全体の仕事が終わるからだ。</p>
<p>こういった計算は骨が折れるが、幸いなことに、骨を折るのはコンピュータの得意とするところだ。</p>
<h2>強迫症になる必要はない</h2>
<p>この間行った釣り旅行についてボスが武勇伝を長々と語り出したらどうすればよいだろう？いても仕方がないのに経営会議に出なければならなくなったら？コーヒーブレイクは？新人のために開発環境をセットアップしてやるのに気づいたら半日使ってしまったら？</p>
<p>Brettと私がFog Creekでこの手法を開発している時、こういった突発的で時間を食う事に頭を悩ませていた。時にはこの種の時間の合計が開発にかけた時間を超すことすらある。</p>
<p>こういったことにもタスクを立てるべきだろうか？時間を予想して、タイムシートで記録をつければよいのだろうか？</p>
<div><div class="thumbinner" style="border: 1px solid gray; background-color: #eee; text-align: center; width: 462px;"><p><img style="border: 1px solid gray;" src="http://local.joelonsoftware.com/mediawiki/images/7/74/20071026-4.png" alt="" width="460" height="223" /></p><div class="thumbcaption">真面目につけた場合のタイムシート。 「ブログを読む」「企業ミッション委員会ミーティング」「クラスパスの問題を調査」「Eclipse 再インストール」<br /> 「就職希望者と面談」「HTMLページの背景を青にする」「コーヒーブレイク」「クラスパスの問題を調査」&hellip;</div></div></div>
<p>まあ、そうしたいならできないことはない。 <abbr title="事例によるスケジューリング Evidence Based Scheduling"><span style="color: green;">EBS</span></abbr> はそれでもうまく働く。</p>
<p><em>しかし、そうする必要はない。</em></p>
<p>実のところ、 <abbr title="事例によるスケジューリング Evidence Based Scheduling"><span style="color: green;">EBS</span></abbr> はよく動いてくれる。何のタスクの最中にどんな仕事が舞い込んだとしても、あなたはただ<em>時計を動かしてさえいればよい</em>。不安に思うだろうが、 <abbr title="事例によるスケジューリング Evidence Based Scheduling"><span style="color: green;">EBS</span></abbr> はそれでも良い予測を生む。</p>
<p>簡単な例を紹介しよう。簡単にするために、ここにジョンという平凡なプログラマがいたとする。彼の仕事はどこかの低級<em>な</em>言語の必要とする、一行のゲッターとセッターを書くというものだ。</p>
<blockquote style="font-family: monospace; white-space: pre-wrap; font-size: 12pt;"><p>private int width;<br /> public int getWidth () { return width; }<br /> public void setWidth (int _width) { width = _width; }</p></blockquote>
<p>いやいや、わかっている。あほらしい例だが、あなたはこういう奴を見たことが<em>あるはず</em>だ。</p>
<p>ともかく、このゲッターなりセッターなりを書くのに彼は毎回2時間かかる。従って、彼のタスクの予想時間はこのようになる：</p>
<blockquote style="font-family: monospace; white-space: pre-wrap; font-size: 12pt;"><p>{ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, &hellip; }</p></blockquote>
<div style="float: right;"><img src="http://local.joelonsoftware.com/mediawiki/images/1/10/26fish.jpg" alt="26fish.jpg" width="240" height="160" /></div>
<p>さて、彼は仕事中かわいそうなことに頻繁にボスに邪魔される。ボスは<span title="marlin fishing">マカジキ釣り</span>について語りだすと2時間は止まらない。</p>
<p>もちろんジョンは「マカジキについての退屈な雑談」と名付けたタスクをタイムシートに増やしてもいいが、この行いは政治的に適切とは言い難い。</p>
<p>代わりにジョンはそのとき開いていたタスクに時間をそのまま記入する。実際の経過時間の記録はこうなる。</p>
<blockquote style="font-family: monospace; white-space: pre-wrap; font-size: 12pt;"><p>{ 2, 2, 2, 2, <strong>4</strong>, 2, 2, 2, 2, <strong>4</strong>, 2, &hellip; }</p></blockquote>
<p>これを予想時間とあわせて<abbr title="velocity タスクの予想所要時間を実際かかった経過時間で割ったもの"><span style="color: navy;">勢い</span></abbr>を計算すると、このようになる。</p>
<blockquote style="font-family: monospace; white-space: pre-wrap; font-size: 12pt;"><p>{1, 1, 1, 1, <strong>0.5</strong>, 1, 1, 1, 1, <strong>0.5</strong>, 1, &hellip; }</p></blockquote>
<p>モンテカルロシミュレーションにはどう影響するだろうか。予想の2時間が1でなく0.5で割られる確率は、<em>将来ボスがジョンを邪魔する確率とまったく同じになり</em>、それを真面目にタスクとして登録した場合と同じ結果になる。 <abbr title="事例によるスケジューリング Evidence Based Scheduling"><span style="color: green;">EBS</span></abbr> はこちらでもうまく動くのだ！</p>
<p>実のところ、 <abbr title="事例によるスケジューリング Evidence Based Scheduling"><span style="color: green;">EBS</span></abbr> はタイムシートに貼り付いて真面目に記録を取る開発者よりも正確な予測をする。</p>
<p>人に話すとき、私はこれを次のように説明している。開発者が邪魔されたとき、彼らは&hellip;</p>
<ol><li> タイムシートに真顔で「邪魔された」と追加して、自分が釣り談義でいかに時間を無駄にされているか<abbr title="management">経営者</abbr>に気づいてもらえるようにするか、あるいは</li><li> 邪魔された項目を新たに作らず、その時担当するタスクに無駄にした時間を加算して、<em>俺を誘いもしなかった</em>釣りについての長話がなければ完璧に正しかったはずの自分の予想時間をそのままにしておくか</li></ol>
<p>&hellip;のどちらかで、あなたのチームの開発者がどちらのタイプであったにしても、 <abbr title="事例によるスケジューリング Evidence Based Scheduling"><span style="color: green;">EBS</span></abbr> は同じ正確な結果を出す。</p>
<h2>4) プロジェクトを積極的に管理する</h2>
<p>この手法が順調にいけば、あなたはプロジェクトを納期内に収めるために積極的に活用することができる。</p>
<p>例えば、各機能に優先度を振って整理しておけば、優先度の低い機能を抜きにした場合どれだけ<abbr title="ship date (1) ソフトウェアが実際完成する日。 (2) プロジェクトの納期。">出荷日</abbr>が早まるかをすぐに見てとれる。</p>
<div><div class="thumbinner" style="border: 1px solid gray; background-color: #eee; text-align: center; width: 299px;"><p><img style="border: 1px solid gray;" src="http://local.joelonsoftware.com/mediawiki/images/e/e5/20071026-5.png" alt="" width="297" height="180" /></p><div class="thumbcaption">タスクを優先度を下から絞込み、タスクがすべて終わる確率が50%になるのが何月になるかの表</div></div></div>
<p>また、開発者<em>各人</em>についての<abbr title="ship date (1) ソフトウェアが実際完成する日。 (2) プロジェクトの納期。">完成予想日</abbr>の分布を見てもよい。</p>
<div><div class="thumbinner" style="border: 1px solid gray; background-color: #eee; text-align: center; width: 462px;"><p><img style="border: 1px solid gray;" src="http://local.joelonsoftware.com/mediawiki/images/0/07/20071026-6.png" alt="" width="460" height="238" /></p><div class="thumbcaption">横軸が年月、各行が開発者の名前で、シミュレーションによる<abbr title="ship date (1) ソフトウェアが実際完成する日。 (2) プロジェクトの納期。">出荷日</abbr>の分布を箱ひげ図で表示したもの</div></div></div>
<ul><li> 開発者によっては（図で言う3行目の Milton）、<abbr title="ship date (1) ソフトウェアが実際完成する日。 (2) プロジェクトの納期。">完成日</abbr>の予測がほとんどつかない者もいる。そういう開発者はうまく予想するよう練習に努める必要がある。</li><li> そうでない開発者（図の4行目の Jane のような）は、<abbr title="ship date (1) ソフトウェアが実際完成する日。 (2) プロジェクトの納期。">完成日</abbr>の予想範囲が狭い範囲に収まっているものの、少し遅れ気味だ。<br /> 彼女の負っているタスクをいくらか他の開発者にまわしたほうがいいだろう。</li><li> それ以外の開発者（私だ。イェーイ）はクリティカルパスにまったく関わらないので、心配ない。</li></ul>
<h2>スコープの動き</h2>
<p>あなたが詳細の詳細まで完璧に詰めてからプロジェクトにとりかかるのなら、 <abbr title="事例によるスケジューリング Evidence Based Scheduling"><span style="color: green;">EBS</span></abbr> はうまく働く。しかし、実際は予定にない機能をやることになるだろう。</p>
<p>新しいアイデアが浮かぶこともあるし、営業員が存在しない機能を約束して帰ってくるかもしれない。お偉いさんの一人がお仲間と談笑しながらゴルフ中、あなたの開発しているGPSつきゴルフカートに心電図を追加するという素晴らしいアイデアを思いつくかもしれない。</p>
<p>いずれにしろ、あなたのスケジュールには新たな遅延が加わる。</p>
<p>単純に考えれば、これらに対応するため、バッファ期間を用意すればよい。以下のようにそれぞれのバッファを用意したとする。</p>
<ol><li> 新機能のアイデア</li><li> <abbr title="responding to the competition">競合製品への対抗</abbr></li><li> 全員のコードをマージして統合</li><li> デバッグ</li><li> ユーザビリティテスト(とそのフィードバック)</li><li> ベータテスト</li></ol>
<p>すると、新機能を思いついた時は、1番のバッファを削ってそれに充てることになる。</p>
<p>新機能を次々追加するうちにバッファがなくなってしまったらどうなるだろうか。まあ、 <abbr title="事例によるスケジューリング Evidence Based Scheduling"><span style="color: green;">EBS</span></abbr> の<abbr title="ship date (1) ソフトウェアが実際完成する日。 (2) プロジェクトの納期。">完成予想日</abbr>は遠くにずれてゆくだろう。こういう状況を把握するには、毎日<abbr title="ship date (1) ソフトウェアが実際完成する日。 (2) プロジェクトの納期。">完成予想日</abbr>の分布のスナップショットを取ることだ。</p>
<div><div class="thumbinner" style="border: 1px solid gray; background-color: #eee; text-align: center; width: 462px;"><p><img style="border: 1px solid gray;" src="http://local.joelonsoftware.com/mediawiki/images/5/5f/20071026-7.png" alt="" width="460" height="246" /></p><div class="thumbcaption"><abbr title="ship date (1) ソフトウェアが実際完成する日。 (2) プロジェクトの納期。">完成予想日</abbr>の追跡グラフ</div></div></div>
<p>横軸はシミュレーションのスナップショットをとった時刻で、縦軸は<abbr title="ship date (1) ソフトウェアが実際完成する日。 (2) プロジェクトの納期。">完成予想日</abbr>を示す。三本の折れ線はそれぞれ次を意味する。上のは完成確率が95％の日。中央は50％。下は5％。つまり、折れ線が互いに近づくほど、<abbr title="ship date (1) ソフトウェアが実際完成する日。 (2) プロジェクトの納期。">完成予想日</abbr>の範囲は狭まることになる。</p>
<p>もし<abbr title="ship date (1) ソフトウェアが実際完成する日。 (2) プロジェクトの納期。">完成予想日</abbr>がどんどん遅れていっているなら（グラフが右肩上がりなら）、プロジェクトに何か問題がある。遅れ具合が1日に1日ずつでないなら、タスクをこなす<abbr title="velocity タスクの予想所要時間を実際かかった経過時間で割ったもの"><span style="color: navy;">勢い</span></abbr>よりも追加されるほうが早いので、そのプロジェクトは決して終わらない。このグラフが徐々に収束しているなら、出荷予定も定まってきていると見ていい。</p>
<h2>使用上の注意</h2>
<p>この手法を使ううち見つけた、いくつかの注意すべき点をあげる。</p>
<p><strong>1) 担当のプログラマだけがタスクを予想すること。</strong></p>
<p>どんな方法であれ、マネージャが予定を立ててそれをプログラマに渡すようなことでは必ず失敗する。その機能を実装するプログラマ本人だけが、必要な手順を見定めることができる。</p>
<p><strong>2) バグを見つけたらその場で修正して、その時間をバグ部分を実装したタスクに加算すること。</strong></p>
<p>バグは予想のつかないものなので、バグフィックスは予定してやることはできない。実装にバグを見つけたら、修正にかけた時間はその部分を実装したタスクに時間を加算するといい。単に<em>動くコード</em>の分だけでなく、<em>デバッグ済みのコード</em>が仕上がるまでの時間を記録することになるので、その分 <abbr title="事例によるスケジューリング Evidence Based Scheduling"><span style="color: green;">EBS</span></abbr> の予測が正確になる。</p>
<div style="float: right;"><img src="http://local.joelonsoftware.com/mediawiki/images/7/79/26b.jpg" alt="26b.jpg" width="250" height="167" /></div>
<p><strong>3) 予想時間が短いの長いのでマネージャに文句を言わせないこと。</strong></p>
<p>新米のソフトウェアマネージャによくあることだが、「<abbr title="tight">適度にきつい</abbr>」（非現実的なほど短い）スケジュールを与えることで、プログラマを「<abbr title="motivate">きりきり</abbr>」働かせることができると考えることがある。私から見ると、これは無能のやることだ。この類のモチベーションは長続きしない。</p>
<p>私が遅れたスケジュールのもとにあると知っても、やる気をなくして絶望し落ち込むだけだ。逆にもし予定以上に早く進んでいると知れば、生産的で活発に働いていられるだろう。スケジュールは社会心理の実験場ではない。</p>
<p>なぜマネージャはこういったことをしようとするのだろう？</p>
<p>プロジェクトが始まって技術マネージャが去り、ビジネス関係者が来て彼らが<em>検討</em>の結果３ヶ月でできるという機能リストを持ってくる。しかし、それらは実際１２ヶ月かかるのだ。</p>
<p>コーディング作業の手順を抜きに考えたなら、機能の実装は <tt><em>n</em></tt> 時間ですむが、現実では多くは <tt><em>4n</em></tt> 以上かかる。あなたがタスクの詳細を詰め、スケジュールを立て直すと、彼らの考えるよりプロジェクトはずっと長くかかることがわかる。経営陣は不満がるだろう。</p>
<p>無能なマネージャは、これを解決するため、プログラマをより早く働かせる方法を探す。これは現実的ではない。チームの人数を増やした場合、新人がコードを把握して追いつくまでに時間がかかる。その後も数ヶ月は50％程度の能率でしか働かないだろう（しかも、彼らの世話に時間をとられて既存メンバーの能率も下がる）。</p>
<p>この方法は<em>一時的に</em>10％増しのコード量を生むかもしれないが、それは1年で100％生むコードと引き換えのものだ。割りのいい取引とは言えない。これは種もみを食べてしまうことに少し似ている。</p>
<p>また、言うまでもないが、開発者たちを酷使することで、デバッグにかかる時間は<em>倍増</em>し、ただでさえ遅れているプロジェクトはさらに遅れることになる。<abbr title="Splendid karma. (まったくいい報いだ)">なんということでしょう</abbr>。</p>
<p>いずれにせよ、4n を n に押し込む方法は存在しない。もしできると思うのなら、あなたの会社の銘柄名を教えて欲しい。売るから。</p>
<p><strong>4) スケジュールは積み木箱である。</strong></p>
<p>積み木が沢山あって、箱のなかに収まらないときは、二つの手段がある。もっと大きい箱を持ってくるか、積み木ブロックの数を減らすかだ。</p>
<p>6ヶ月で出荷したいが、12ヶ月かかるとわかっているときは、出荷を延期するか、機能を選んで削るしかない。単にブロックを小さく縮めてすますことはできない。仮にできるふりをしたとしても、あなたは先を見据える機会を捨てて、目の前に見えているものを見えないと自分に嘘をついているだけだ。</p>
<p>機能を削る羽目になるというのは、スケジューリングの<em>いいところ</em>だ。なぜかって？</p>
<p>あなたが実装したい機能がふたつあるとしよう。一つは実用的で、製品を素晴らしいものにする。もう一つはとても簡単で、プログラマは作業にかかりたくてたまらない<small>（見て見て！&lt;ウインク&gt;）</small>が、製品の目的からみて特に意味はない。</p>
<div style="float: right;"><img src="http://local.joelonsoftware.com/mediawiki/images/4/4f/26c.jpg" alt="26c.jpg" width="240" height="161" /></div>
<p>スケジュールを立てずにすますなら、プログラマは間違いなく簡単で楽しいものをやろうとする。そして時間を使ってしまい、有用で重要な機能を作るために延期せざるを得なくなる。</p>
<p>スケジュールを作りさえすれば、実際の作業にかかる前であっても、何かの機能を削る必要があることに気づくことができる。楽しく無意味な機能は削られて、あなたの製品は有用な機能と早い<abbr title="ship date (1) ソフトウェアが実際完成する日。 (2) プロジェクトの納期。">出荷日</abbr>に恵まれることになる。</p>
<p>私がExcel 5に関わっていたとき、最初に作られた機能リストは巨大で、<em>とても</em>納期には収まるものではなかった。「なんてことだ！」我々は思った。「<em>一つ残らず</em>重要な機能なのに！マクロ編集ウィザードなしでどう生きていけばいいんだ？」</p>
<p>他に選択肢もなく、我々は「ソフトの根幹をなす」と考えていた機能をいくつか除いてスケジュールを納期に収めた。誰もが削除を残念に思った。慰めのため、我々は機能を<em>カットした</em>のではなくExcel 6に<em>延期した</em>のだと思うことにした。</p>
<p>Excel 5が完成に近づいた時、私は同僚のEric MichelmanとExcel 6の仕様にとりかかった。二人でまずExcel 5でカットされた機能のリストを眺めることにした。私たちは驚いた。なんだこれは。これほどクズ機能ばかり集めたリストがあっていいものか。</p>
<p>見直してみると、リスト中で実装する価値のあるものは<em>一つも</em>なかった。スケジュールの為に機能を絞ることは我々の一番の成功といえる。でなければ、Excel 5のスケジュールは倍に伸び、50%を占めるクズ機能が積まれ、その後永遠に後方互換性のために残ることになっていただろう。</p>
<h2>まとめ</h2>
<p>事例によるスケジューリングを使うのはとても簡単だ。各イテレーションの初めに詳しく予想を立てるのに１日２日かける。その後は毎日数秒、実際の経過時間をタイムシートに記録しながら進める。比べて得られる利益は相当なものだ。現実的なスケジュールが立つのだから。</p>
<p>現実的なスケジュールはよいソフトウェアを作るカギとなる。必要な機能が先に実装できるようにし、どのような物を作る判断を下す指針になる。製品はすばらしいものになり、ボスは笑顔であり、顧客は満足し、そしてなにより、あなたは5時に家に帰ることができる。</p>
<div class="center"><div class="floatnone"><img src="http://local.joelonsoftware.com/mediawiki/images/f/f9/26d.jpg" alt="26d.jpg" width="470" height="333" /></div></div>
<h2>P.S.</h2>
<p>事例によるスケジューリングは<a class="external text" rel="nofollow" href="http://www.fogcreek.com/FogBugz/">FogBugz 6.0</a>に組み込みの機能のひとつだ。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<hr />
<p> &lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;h2&gt;訳語&lt;/h2&gt;&lt;dl&gt; &lt;dt&gt; confidence distribution curve ： (完成する確率を日付ごとに並べたグラフ) &lt;/dt&gt; &lt;dd&gt; 最初のグラフのこと。「この日に出荷できる確率は××％」を図に折れ線として表したもの。 &lt;/dd&gt; &lt;/dl&gt; &lt;dl&gt; &lt;dt&gt; estimation history ： (予想の履歴) &lt;/dt&gt; &lt;dd&gt; 二つ目のグラフのこと。記事中に名前は出ていない。<br /> 予想時間と経過時間をプロットしたもの。勢いは原点からの傾きになる。 &lt;/dd&gt; &lt;/dl&gt; &lt;dl&gt; &lt;dt&gt; estimated time ： 予想時間 &lt;/dt&gt; &lt;dd&gt; 開発者がそのタスクの作業をすますのに必要と考える時間。 &lt;/dd&gt; &lt;/dl&gt; &lt;dl&gt; &lt;dt&gt; estimator &lt;/dt&gt; &lt;dd&gt; 予想をする開発者 : 直訳すると「予想者」になるが、どちらにしても開発者本人が予想することになるので言い換えた。 &lt;/dd&gt; &lt;/dl&gt; &lt;dl&gt; &lt;dt&gt; elapsed time, actual hours ： 経過時間、実際の時間 &lt;/dt&gt; &lt;dd&gt; タスクが終了するまで実際にかかった時間。<br /> タスクが終わってクローズされた後もバグなどで加算されることがある。 &lt;/dd&gt; &lt;/dl&gt; &lt;dl&gt; &lt;dt&gt; Evidence Based Scheduling：事例によるスケジューリング &lt;/dt&gt; &lt;dd&gt; プロジェクトの完成日を予測するための手法。モンテカルロ法を使ったアルゴリズム。記事本文を参照。 &lt;/dd&gt; &lt;/dl&gt; &lt;dl&gt; &lt;dt&gt; ship date： 完成日、完成予定日、出荷日、出荷予定日 &lt;/dt&gt; &lt;dd&gt; 1) ソフトウェアが実際完成する日。<br /> 2) プロジェクトを間に合わせねばならない納期。 &lt;/dd&gt; &lt;/dl&gt; &lt;dl&gt; &lt;dt&gt; task：タスク &lt;/dt&gt; &lt;dd&gt; 1) ソフトウェアに機能を実装する手順を分割したうちの一ステップ。長さの単位は時間。関数を書くとか、ダイアログを作るとか。<br /> 2) 開発者に割り当てる仕事。<br /> 記事中では触れられていないが、FogBugzでは親タスクと子タスクの概念がある。 &lt;/dd&gt; &lt;/dl&gt; &lt;dl&gt; &lt;dt&gt; velocity ： 勢い &lt;/dt&gt; &lt;dd&gt; 勢い ＝ 予想時間 ÷ 経過時間<br /> あるタスクが予想に対してどれだけ早く終わったかを示す割合。予想の半分で終わったら勢いは0.5になる。予想の倍かかったら勢いは2になる。 &lt;/dd&gt; &lt;/dl&gt;</p>
]]></content>
  </entry>



  <entry>
  <id>http://snipsnipsnip.github.io/2011/12/17/raytraceroid</id>
  <link type="text/html" rel="alternate" href="http://snipsnipsnip.github.io/2011/12/17/raytraceroid.html" />
  <title>レイトレーサーもどき</title>
  <updated>2011-12-17T04:07:00+00:00</updated>
  <content type="html"><![CDATA[<p><a href="https://gist.github.com/raw/1369770/1c7c58ef76b57fc72059fc10e89db2020bcc1b39/_ray.zip"><img src="https://gist.github.com/snipsnipsnip/1369770/raw/2983e02b3293e5956cd9551923b1aa76acdcebe3/_ss.gif" alt="dumb raytraceroid" /></a></p>

<h2 id="section">ダウンロード</h2>

<p><a href="https://gist.github.com/raw/1369770/1c7c58ef76b57fc72059fc10e89db2020bcc1b39/_ray.zip">ray.zip</a></p>

<p><a href="https://gist.github.com/1369770">gist:1369770</a></p>

<p>去年(2010年)できそこないのレイトレーサを作った。ぐぐりながら適当に作って詰まった。オブジェクトの配置がハードコードで、反射を一度しかしていないので3Dエンジンとしては使えない。シェーダの勉強をしていたと思ったらいつのまにか出来上がっていたものだが、これ以上ほうっておくと忘れそうなのでまとめておく。</p>

<h2 id="section-1">操作</h2>

<table>
  <thead>
    <tr>
      <th>操作</th>
      <th>効果</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>左ドラッグ</td>
      <td>ライトを操作</td>
    </tr>
    <tr>
      <td>マウスホイール</td>
      <td>カメラ前進・後退</td>
    </tr>
    <tr>
      <td>右ドラッグ</td>
      <td>カメラ見回し</td>
    </tr>
    <tr>
      <td>右クリック</td>
      <td>モード切り替え (鏡面とか)</td>
    </tr>
    <tr>
      <td>左クリックしながらマウスホイール</td>
      <td>ズーム (視野角の調整)</td>
    </tr>
    <tr>
      <td>右クリックしながらマウスホイール</td>
      <td>スレッドの増減 (増やすと早くなるかも)</td>
    </tr>
    <tr>
      <td>マウスホイールをクリック</td>
      <td>リセット</td>
    </tr>
    <tr>
      <td>Hキー</td>
      <td>ヘルプを隠す</td>
    </tr>
  </tbody>
</table>
]]></content>
  </entry>






  <entry>
  <id>http://snipsnipsnip.github.io</id>
  <link type="text/html" rel="alternate" href="http://snipsnipsnip.github.io/dollar-expression.html" />
  <title>dollar-expression ($式)</title>
  <updated>2013-11-24T02:32:00+00:00</updated>
  <content type="html"><![CDATA[<pre><code>$ define $ partition pred lis
  $ let recur $ $ lis lis
    $ if $ null-list? lis
      $ values lis lis
      $ let $ $ elt  $ car lis
              $ tail $ cdr lis
        $ receive (in out) $ recur tail
          $ if $ pred elt
            $ values $ if (pair? out) (cons elt in) lis
                     out
            $ values in
                     $ if (pair? in) (cons elt out) lis

                         ↓ ↑

(define (partition pred lis)
  (let recur ((lis lis))
    (if (null-list? lis)
      (values lis lis)
      (let ((elt (car lis))
            (tail (cdr lis)))
        (receive (in out) (recur tail)
          (if (pred elt)
            (values (if (pair? out) (cons elt in) lis) out)
              (values in (if (pair? in) (cons elt out) lis)))))))))
</code></pre>

<h2 class="no_toc" id="section">もくじ</h2>

<ul id="markdown-toc">
  <li><a href="#section-1">概要</a></li>
  <li><a href="#section-2">適当な定義</a></li>
  <li><a href="#qa">Q&amp;A</a>    <ul>
      <li><a href="#paren">Q. 括弧の中で構文糖は使えますか？</a></li>
      <li><a href="#dollar-as-a-symbol">Q. シンボルの<code>$</code>を使いたいときはどうしますか？</a></li>
      <li><a href="#symbols-with-dollars">Q. <code>$hoge</code>や<code>hoge$</code>と書いたらどうなりますか？</a></li>
      <li><a href="#double-dollars">Q. <code>$$</code>と書いたらどうなりますか？</a></li>
      <li><a href="#quote-dollar">Q. <code>'$</code>や<code>`$</code>などはどうなりますか？</a></li>
      <li><a href="#vector">Q. <code>#$</code>と書いたらベクタリテラル<code>#( ... )</code>の構文糖になりますか？</a></li>
      <li><a href="#dollar-and-close-paren">Q. <code>$ )</code>と書いたらどうなりますか？</a></li>
      <li><a href="#offside">Q. 行が右に長くなってきたら折り返しはできますか？</a></li>
      <li><a href="#dot">Q. ドット対を<code>$</code>で囲むことはできますか？</a></li>
      <li><a href="#tab">Q. タブはどう扱いますか？</a></li>
      <li><a href="#why-dollar-sign">Q. マーカーは<code>$</code>以外でもいいのでは？</a></li>
      <li><a href="#separate-dollars">補足: なぜ<code>$</code>どうしを離すのか</a></li>
      <li><a href="#section-3">細かい仕様まとめ</a></li>
    </ul>
  </li>
  <li><a href="#s-">読み込み器 ($式→S式) の実装</a>    <ul>
      <li><a href="#section-4">処理系に挟む場合</a></li>
      <li><a href="#read">readを再利用して手抜きする場合</a></li>
    </ul>
  </li>
  <li><a href="#s--1">書き出し器(S式→$式) の実装</a></li>
  <li><a href="#section-5">その他</a>    <ul>
      <li><a href="#section-6">インデントに意味がある構文</a></li>
      <li><a href="#section-7">参考記事</a></li>
      <li><a href="#todo">TODO</a></li>
    </ul>
  </li>
</ul>

<h2 id="section-1">概要</h2>

<p><a href="#top">冒頭</a>のような文法を普通のS式にする変換器をGaucheで<a href="https://gist.github.com/snipsnipsnip/7620314">書いてみた</a>。</p>

<p>$式(どるしき)という、閉じ括弧を省略できるS式の構文糖を考えた。インデントの具合から閉じ括弧を補完する。</p>

<p>S式と$式はJSONと(ややこしくない範囲の)YAMLのような関係にある。$式のパーサはS式のパーサとしてそのまま使える。</p>

<p>この構文糖の目的はPython系の文法が好きな人向けにインデントで表せる分のS式の閉じ括弧を省略できる記法を提供することで、S式以外の構造を表すものではないし、括弧を完全に排除することでもないし、Lispを他のプログラム言語らしく見せかけるためでもない。</p>

<p>以下<a href="http://practical-scheme.net/gauche/index.html">Gauche</a> (Scheme)の文法を念頭において考えている。</p>

<h2 id="section-2">適当な定義</h2>

<p>$式の字句構造はほぼS式と同様。</p>

<p>ただし、<code>$</code>を「開き括弧マーカー」と呼び、特別に扱う。(最初<code>(</code>でやっていたがエディタが混乱したのでやめた)</p>

<p>イメージとしては、$式用の<code>(read)</code>関数はこういう動作をする。</p>

<ul>
  <li>アトムや括弧やクォートはそのままS式と同じように読み込む。</li>
  <li><code>$</code> があったらそれよりも字下げが下の$式を繰り返し読み込み、リストにまとめて返す。</li>
</ul>

<p>マーカは、そこよりも右下に始点があるトークンをすべて括弧に囲む。
トークンの始点とは、そのトークンを構成する最初の文字のこと。
構文糖の解釈後マーカ自身は消えてなくなり、代わりに開き括弧が置かれる。
それに対応する閉じ括弧は、<code>$</code>よりも左下か真下に始点があるトークンが現れたとき、その手前に挿入される。</p>

<p>基本的には「<code>$</code>から下方向にテキストを選択して囲む」という感じ。改行入りの文字列などがぶつかっても大丈夫にするために始点だけを見るようにしている(つまり、矩形選択ではなく普通の選択)。</p>

<p>たとえば、以下の内容は</p>

<pre><code>$ "foo
bar" $ baz
   quu
"qux"
</code></pre>
<p>次のように書いたのと同様になる。</p>

<pre><code>( "foo
bar" (baz)
  quu)
"qux"
</code></pre>

<h2 id="qa">Q&amp;A</h2>

<p>元がふわふわしたアイデアなので、細かい所にかなり抜けがある。Q&amp;A方式で文法の細かいところを考えていく。</p>

<p>組み合わせによって必要な処理が変わってくるので、ここではS式との互換性、実装がラクなこと、個人的な好みをこの順で選択の基準とする(※ラクかどうかの判断もsnipsnipsnipの偏見)。</p>

<p>Q&amp;Aが他にあればコメントや追記をお願いします。(<a href="{{site.repos_url}}/{{page.path}}">fork me!</a>)</p>

<h3 id="paren">Q. 括弧の中で構文糖は使えますか？</h3>

<dl>
  <dt>A1 (採用)</dt>
  <dd>いいえ。内部では$式の構文糖は使えません。通常のS式として解釈されます。</dd>
  <dt>A2 (没)</dt>
  <dd>はい。内部でも$式の構文糖が使えます。</dd>
  <dt>A3 (没)</dt>
  <dd>括弧は使えません。<code>$</code>だけでやってください。</dd>
</dl>

<p>これによって$式はS式のスーパーセットになるので、混ぜて書けるようになる。</p>

<p>閉じ括弧の対応を考えなくてすむ。</p>

<p>既存のread手続きが再利用できるので実装がラクになる。</p>

<h3 id="dollar-as-a-symbol">Q. シンボルの<code>$</code>を使いたいときはどうしますか？</h3>

<dl>
  <dt>A1 (採用)</dt>
  <dd><code>|$|</code>を代わりに使って下さい。または、$を使いたい時は括弧の中で使ってください。</dd>
  <dt>A2 (没)</dt>
  <dd>使えません。</dd>
  <dt>A3 (没)</dt>
  <dd><code>$$</code>を代わりに使って下さい。<code>$$</code>を<code>$</code>、<code>$$$</code>を<code>$$</code>のように<code>$</code>を一つ減らして解釈します。</dd>
</dl>

<p>理不尽さや制限が他の案に比べて少ない。</p>

<p>Gaucheでは<code>$</code>というマクロがあるが、この構文糖自体と目的がかぶっているのであまり困らないはず。</p>

<h3 id="symbols-with-dollars">Q. <code>$hoge</code>や<code>hoge$</code>と書いたらどうなりますか？</h3>

<dl>
  <dt>A1 (採用)</dt>
  <dd>シンボル<code>$hoge</code>や<code>hoge$</code>として扱われます。<code>$</code>は空白で区切られる必要があります。</dd>
  <dt>A2 (没)</dt>
  <dd><code>(hoge ...</code>や<code>hoge(...</code>として扱われます。<code>$</code>はどこでも開き括弧と同様に扱われます。</dd>
</dl>

<p><code>$</code>はシンボルに許される文字なので、シンボルに隣接した場合エスケープの必要がある。</p>

<p>Gaucheの<code>pa$</code>や<code>reduce$</code>を個人的によく使うのでエスケープしたくない。</p>

<p><code>$</code>を離して書くことで<a href="#why-separate-dollars">後述</a>する落とし穴をある程度防ぐことができる。</p>

<h3 id="double-dollars">Q. <code>$$</code>と書いたらどうなりますか？</h3>

<dl>
  <dt>A1 (採用)</dt>
  <dd>シンボル<code>$$</code>として扱われます。</dd>
  <dt>A2 (没)</dt>
  <dd><code>((</code>として扱われます。</dd>
</dl>

<p>上の動作との一貫性。また、<code>$</code>を離して書くことで<a href="#why-separate-dollars">後述</a>する落とし穴をある程度防ぐことができる。</p>

<h3 id="quote-dollar">Q. <code>'$</code>や<code>`$</code>などはどうなりますか？</h3>

<dl>
  <dt>A1 (採用)</dt>
  <dd>クォートされたシンボルです。<code>(quote |$|)</code>として読まれます。<br />構文糖で準クォートのリストを書きたい場合は<code>$ quasiquote $ ...</code>と平で書いて下さい。</dd>
  <dt>A2 (没)</dt>
  <dd>クォートされたマーカーです。<code>(quote (マーカーに囲まれる内容 ..))</code>として読まれます。</dd>
</dl>

<p>こう書いた時<code>()</code>と<code>$</code>のどちらが表示されるかという話。A1では<code>$</code>、A2では<code>()</code>がプリントされる。</p>

<pre><code>$ write '$
</code></pre>

<p>これは、quoteの処理と$式の処理の優先順位の話になる。</p>

<p>どちらもありえるが、好みで<code>$</code>がプリントされる方を選んだ。つまり、$式の解除は<code>'</code>→<code>quote</code>の変換の後に行われる。</p>

<p><code>'foo</code>が<code>(quote foo)</code>の構文糖と考えると、A1のほうが「括弧の内部には$式の構文糖は及ばない」というルールと一貫性がある。</p>

<h3 id="vector">Q. <code>#$</code>と書いたらベクタリテラル<code>#( ... )</code>の構文糖になりますか？</h3>

<dl>
  <dt>A1 (採用)</dt>
  <dd>いいえ。構文糖で準クォートのリストを書きたい場合は<code>$ vector 1 2 3</code>と平で書いて下さい。</dd>
  <dt>A2 (没)</dt>
  <dd>はい。<code>#$ 1 2 3</code>とすれば<code>#( 1 2 3 )</code>として構文糖になります。</dd>
</dl>

<p>便利そうだが、#$をどうエスケープしていいかわからないので見送り。</p>

<h3 id="dollar-and-close-paren">Q. <code>$ )</code>と書いたらどうなりますか？</h3>

<dl>
  <dt>A1 (採用)</dt>
  <dd><code>( ) )</code>と解釈され、エラーになります。</dd>
  <dt>A2 (没)</dt>
  <dd><code>( )</code>と解釈され、エラーは起こりません。</dd>
</dl>

<p><code>$</code>を<code>)</code>で閉じられたら便利かもしれない。でも目が混乱すると思うので見送り。</p>

<p>通常の<code>read</code>を使いまわすことを考えると、単独の<code>)</code>はエラーになるので使えない。とはいえ、これは先読みで対処することはできるので理由にはならない。</p>

<h3 id="offside">Q. 行が右に長くなってきたら折り返しはできますか？</h3>

<dl>
  <dt>A1 (採用)</dt>
  <dd>いいえ。折り返したい場合は括弧の中に囲んで通常のS式として書いて下さい。</dd>
  <dt>A2 (没)</dt>
  <dd>はい。<code>\</code>を行末に書くと次の改行は無視されます。</dd>
  <dt>A3 (没)</dt>
  <dd>はい。<code>\</code>を行末に書くと次の行以降はその行より字下げされたものとして扱います。<br />
<code>\</code>のある行よりも字下げが上がる行が現れた時、<code>\</code>の効果は解除されます。</dd>
</dl>

<p>オフサイドはあれば便利だが、括弧で一応解決できるし、ルールは少ないほうがよい。</p>

<h3 id="dot">Q. ドット対を<code>$</code>で囲むことはできますか？</h3>

<dl>
  <dt>A1 (採用)</dt>
  <dd>はい。</dd>
  <dt>A2 (没)</dt>
  <dd>いいえ。ドット対は括弧の中だけで使えます。</dd>
</dl>

<p>囲めない理由はない。強いて言うなら、これによって$式をS式のリーダで読み込んだ時にエラーになる可能性が生まれる。</p>

<p>でもサンプル変換器では未実装。</p>

<h3 id="tab">Q. タブはどう扱いますか？</h3>

<dl>
  <dt>A1 (採用)</dt>
  <dd>カラム数に足して次の8の倍数になる数だけスペース文字があるものとして扱います。</dd>
  <dt>A2 (没)</dt>
  <dd>スペース1文字と同じように扱います。</dd>
</dl>

<p>タブストップの処理は<a href="http://docs.python.org/3/reference/lexical_analysis.html#indentation">Python</a>を参考にする。</p>

<p>でもサンプル変換器では未実装。</p>

<h3 id="why-dollar-sign">Q. マーカーは<code>$</code>以外でもいいのでは？</h3>

<dl>
  <dt>A1 (採用)</dt>
  <dd>いいえ。$式という名前が気に入ったので。</dd>
  <dt>A2 (没)</dt>
  <dd>はい。<code>(</code>を自動で閉じてもよいですね。</dd>
  <dt>A3 (没)</dt>
  <dd>はい。<code>#$</code>など拡張用のトークンを使うほうが安全ですね。</dd>
</dl>

<p>これは完全に好み。$式でなく:式でも!式でもいいと思う。</p>

<p>どんな記号を選んでも理由はつくが、<code>$</code>や<code>:</code>や<code>!</code>は通常のシンボルとして許されるので若干弱い。行頭にほぼ使われない<code>.</code>もいいかもしれない。最初は<code>(</code>のまま単純に「自動括弧閉じ器」を作ってみたこともあったが、あまりに目が落ち着かなかったので諦めた。</p>

<div style="float: right; font-size: 1cm"><code>$</code></div>

<p>元の由来はHaskellの<code>$</code>(関数適用)演算子だが、Haskellは中置で、$式は前置というのが違い。</p>

<p>ドルマークは縦棒と開き括弧と閉じ括弧をまとめたように見えるという話をどこかで読んだ。</p>

<p><br clear="all" /></p>

<h3 id="separate-dollars">補足: なぜ<code>$</code>どうしを離すのか</h3>

<p><code>cond</code>ではまったから。</p>

<p>たまたま<code>cond</code>の処理の部分を2字ぶん下げたとする。</p>

<pre><code> (cond
   ((foo?)
     bar))
</code></pre>
<p>上の開き括弧を単純に$で置き換えるとこうなる。</p>

<pre><code> $cond
   $$foo?
     bar
</code></pre>
<p>これを$式で復元するとこうなって、元と構造が変わってしまう。</p>

<pre><code> (cond
   ((foo?
     bar)))
</code></pre>

<p><code>cond</code>の処理を条件部分よりも下げるとハマるというのは落とし穴として大きすぎる。
しかも文法的にはエラーではない。</p>

<p>これは$を離して書き、インデントを2字で統一することで問題がなくなる。</p>

<pre><code> $ cond
   $ $ foo?
     bar
</code></pre>

<p>対処療法的な感はあるが、そもそもインデント文法でインデントを間違えたらどうしようもないので文法チェッカーを別に作るしか無いと思う。</p>

<p>くっつけたままインデントを1字に統一するという後ろ向きな方法もあるので、このこと単体では$を全て離す理由にはならないかもしれない。</p>

<h3 id="section-3">細かい仕様まとめ</h3>

<ul>
  <li>括弧の内部はS式としてパースされ、内部では$式の構文糖は無効に<a href="#paren">なる</a>。</li>
  <li>文字<code>$</code>は空白に囲まれた単独の場合でのみ有効で、それ以外の場合は全て通常のシンボルになる。
    <ul>
      <li>マーカーでなくシンボルの<code>$</code>を使いたい時は<code>|$|</code>と<a href="#dollar-as-a-symbol">書く</a>。</li>
      <li><code>$hoge$</code>のように書いてもそのまま<code>$hoge$</code>というシンボルに<a href="#symbols-with-dollars">なる</a>。</li>
      <li><code>$$</code>はそのまま<code>$$</code>というシンボルに<a href="#double-dollars">なる</a>。</li>
      <li><code>'$</code>は<code>(quote $)</code>に<a href="#quote-dollar">なる</a>。</li>
    </ul>
  </li>
  <li>開き括弧マーカー<code>$</code>で開かれた括弧は、閉じ括弧で閉じることは<a href="#dollar-and-close-paren">できない</a>。</li>
  <li>ベクタリテラルの開き括弧マーカー版は<a href="#vector">無い</a>。</li>
  <li>行を途中で折り返す方法は$式には無い。そういう場合は括弧で囲んでS式に<a href="#offside">戻る</a>。</li>
  <li>ドット対はS式の括弧の中でしか使え<a href="#dot">ない</a>。</li>
</ul>

<h2 id="s-">読み込み器 ($式→S式) の実装</h2>

<p><a href="http://www.haskell.org/onlinereport/haskell2010/haskellch2.html#x7-210002.7">Haskellのレイアウト</a>に習って、字句解析と構文解析の間にやる方法を考えた。つまり</p>

<ol>
  <li>字句解析器を改造し、各トークンのカラム番号(行頭から何文字目か)がわかるようにする。<br />
あるいは、カラム番号を示す特殊なトークンを新たに用意する。</li>
  <li>構文解析の前に、カラム番号の増減をもとに閉じ括弧を補う処理を挟む。</li>
</ol>

<p><code>'</code>を<code>quote</code>に直す処理と$式の処理のどちらを先にやるかで<a href="#quote-dollar"><code>'$</code>の解釈</a>が変わってくるので注意。</p>

<h3 id="section-4">処理系に挟む場合</h3>

<p>処理系に組み入れる場合は、quoteの処理がすんだ直後のあたりに処理を挟むとしてこんな具合だろう。(まだ作ったことがないので適当)</p>

<ol>
  <li>通常のS式として字句解析する。ただし、次のような特別扱いを加える。
    <ul>
      <li>各トークンに、その始めの文字の行頭からのカラム位置をひも付けておく。</li>
      <li>開き括弧マーカーはシンボル<code>$</code>と区別する。
    つまり、縦棒で囲まれた<code>|$|</code>はシンボル<code>$</code>として扱うが、
    囲まれない<code>$</code>は開き括弧マーカーとして記憶する。</li>
    </ul>
  </li>
  <li>quoteなどを処理しておく。</li>
  <li>トークン列を走査して次のように処理する。
括弧ネストのカウンタと数値のスタックが必要。
    <ol>
      <li>通常の開き括弧の類があったら無視フラグを立てる。</li>
      <li>1に対応する閉じ括弧を見つけたら無視フラグを下ろす。</li>
      <li>スタックトップにあるより左か真下にあるトークン(マーカー含む)が現れたら、
 そのトークンがスタックトップより右になるまで、
 トークンの直前に閉じ括弧を挿入し、ポップすることを繰り返す。</li>
      <li>開き括弧マーカーを見つけたら、
無視フラグが立っている場合、<code>$</code>シンボルに置き換える。
無視フラグが立っていない場合、そのカラム位置をスタックに記憶して、
開き括弧に置き換える。</li>
    </ol>
  </li>
  <li>スタックに開き括弧が残っていれば、その分閉じ括弧を挿入する。</li>
  <li>トークン列から通常のS式と同様に木構造を組み立てる。</li>
</ol>

<h3 id="read">readを再利用して手抜きする場合</h3>

<p>本来なら上の方法だと思うが、とりあえずやってみたかったので、既存のS式の<code>read</code>を再利用して<a href="https://gist.github.com/snipsnipsnip/7620314">Gaucheで書いてみた</a>。</p>

<p><a href="#dot">ドット対</a>と<a href="#tab">タブストップ</a>が未実装。</p>

<ol>
  <li>カラムを記憶しながら<code>read</code>を繰り返し、カラム数とS式のペア(以下$トークン)を集める。
処理系でする場合と違ってリストが読み出されることもあるが、
Q&amp;Aで決めた通りなら問題ない。
<code>read</code>の前に先読みで少し前処理をする。
    <ol>
      <li>空白を読み飛ばす。</li>
      <li>開き括弧マーカー<code>$</code>とシンボル<code>|$|</code>を区別するため、一文字先読みする。</li>
      <li>
        <strike>ドット`.`をそのままreadするとエラーになるので、回避のため先読みする。
 </strike>
        <p>未実装。</p>
      </li>
    </ol>
  </li>
  <li>$トークンの列を走査して次のように処理する。
カラム数とS式のリストのペアを要素とするスタックを用意する。
最初はスタックに<code>(-1)</code>を入れておく。スタックは決して空にならない。
    <ol>
      <li>スタックトップの物よりも$トークンが右にある(カラム数が大きい)場合は、
 スタックトップのリストの末尾に付け足す。</li>
      <li>スタックにあるより左か真下にある$トークンが現れたら、
その$トークンがスタックトップより右になるまで、以下の操作を繰り返す。
        <ul>
          <li>※ ポップしたリストを新たなスタックトップにあるリストの末尾に付け足す</li>
        </ul>
      </li>
      <li>開き括弧マーカーを見つけたら、
   スタックにカラム数つきの新しいリストをプッシュする。</li>
    </ol>
  </li>
  <li>スタックが1要素になるまで※を繰り返し、残った最終的なS式のリストを得る。</li>
</ol>

<h2 id="s--1">書き出し器(S式→$式) の実装</h2>

<p>プリティプリンタをいじれば出来ると思う。</p>

<h2 id="section-5">その他</h2>

<h3 id="section-6">インデントに意味がある構文</h3>

<p><a href="http://www.haskell.org/onlinereport/haskell2010/haskellch2.html#x7-210002.7">Haskell</a>。空白に意味を持たない<code>{...}</code>と<code>;</code>による文法を基礎として、構文糖としてインデントを元に区切り記号を補うという形で定義している。この方法が好きなので$式もそれにならった。</p>

<p><a href="http://docs.python.org/3/reference/lexical_analysis.html#indentation">Python</a>。Haskellと違い完全に括弧を排除している(<code>SyntaxError: not a chance</code>)。特別なトークンとして<code>INDENT</code>と<code>DEDENT</code>を用意している。括弧内でインデントの制限がないことの便利さにPythonで気づいた。</p>

<p><a href="http://coffeescript.org/documentation/docs/grammar.html">CoffeeScript</a>。特別なトークンとして<code>INDENT</code>と<code>OUTDENT</code>を用意している。</p>

<p>PythonとCoffeeScriptは「ブロックの途中で半端にインデントを増減してはならない」というチェックがあるのが親切。これは$式と関係なく作れると思うのと、<code>let</code>などをどう扱えばよいのかわからないので割愛。</p>

<p>Lisp系では、<a href="http://srfi.schemers.org/srfi-49/srfi-49.html">SRFI 49: Indentation-sensitive syntax</a>と<a href="http://srfi.schemers.org/srfi-110/srfi-110.html">SRFI 110: Sweet-expressions</a>（<a href="http://readable.sourceforge.net/">Readable Lisp S-expressions Project</a>）がある。正確にはこれはSchemeのための構文糖であって、S式のための構文糖である$式とは少し目的が違う。この2つは行頭の開き括弧を暗黙にしようとしているのが気に入らない。</p>

<pre><code>define factorial(n)
  if {n &lt;= 1}
     1
     {n * factorial{n - 1}}
</code></pre>

<p>他にS式の構文糖(というよりプリプロセッサ？)を見つけたら教えて下さい。</p>

<h3 id="section-7">参考記事</h3>

<ul>
  <li><a href="http://practical-scheme.net/wiliki/wiliki.cgi?Lisp%3AS%E5%BC%8F%E3%81%AE%E7%90%86%E7%94%B1">Wiliki:Lisp:S式の理由</a></li>
</ul>

<p>文法としてのS式について。</p>

<ul>
  <li><a href="http://c2.com/cgi/wiki?SyntacticallySignificantWhitespaceConsideredHarmful">C2 Wiki:Syntactically Significant Whitespace Considered Harmful</a></li>
</ul>

<p>構文にホワイトスペースを使うことについて。</p>

<h3 id="todo">TODO</h3>

<ul>
  <li>$式と$式で書かれたプログラムの切り分け</li>
  <li>逆変換器</li>
  <li>実行器</li>
  <li>変換器をブラウザで動かす</li>
</ul>
]]></content>
  </entry>




</feed>