<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>買い物ログ別館</title>
    <link rel="alternate" type="text/html" href="http://www.skoji.jp/blog/" />
    <link rel="self" type="application/atom+xml" href="http://www.skoji.jp/blog/atom.xml" />
   <id>tag:www.skoji.jp,2012:/blog//2</id>
    <link rel="service.post" type="application/atom+xml" href="http://www.skoji.jp/mtbin/mt-atom.cgi/weblog/blog_id=2" title="買い物ログ別館" />
    <updated>2012-01-22T09:18:22Z</updated>
    <subtitle>ソフトウェア技術っぽい話題を扱います。本館は[こちら]。
</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type  4.23-ja</generator>
 

<entry>
    <title>iBooks AuthorはEPUBオーサリングツールではない</title>
    <link rel="alternate" type="text/html" href="http://www.skoji.jp/blog/2012/01/ibooks_authorepub.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.skoji.jp/mtbin/mt-atom.cgi/weblog/blog_id=2/entry_id=1350" title="iBooks AuthorはEPUBオーサリングツールではない" />
    <id>tag:www.skoji.jp,2012:/blog//2.1350</id>
    
    <published>2012-01-20T09:25:00Z</published>
    <updated>2012-01-22T09:18:22Z</updated>
    
    <summary>Appleから電子書籍を作れるアプリ iBooks Author がでました。 ...</summary>
    <author>
        <name>こじま</name>
        <uri>http://www.skoji.jp/movabletype/</uri>
    </author>
    
        <category term="電子書籍" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.skoji.jp/blog/">
        <![CDATA[Appleから電子書籍を作れるアプリ iBooks Author がでました。

作った電書をibooks フォーマットという初耳のファイルに出力して中を眺めると、だいぶEPUBぽい。ということは、これはEPUBのオーサリングツールなんでしょうか? ibooksファイルとEPUBをざっくり比べてみました。

<h4>EPUBと同じところ</h4>

<ul><li>zipアーカイブである</li><li>mimetypeという名前のファイルがある</li><li>OEBPSで定義されたMETA-INF/container.xmlがある</li><li>opf2.0のファイルがある</li><li>ナビゲーション用にncxファイルがある</li><li>コンテンツは基本的にxhtmlである</li></ul>

<h4>EPUBと違うところ</h4>

<ul><li>拡張子がちがう</li><li>mimetypeの中身が違う。EPUBでは"application/epub+zip"、ibooksフォーマットでは"application/x-ibooks+zip"</li><li>opfのmanifestにapplication/x-ibooks+linehintsとかimage/x-thumb-jpegなんてmediatypeをもつitemがある(EPUBではmediatypeを限定していないので「違う」というのは正確ではないですが)</li><li>cssに-ibooks-というプレフィクスがついたものがある</li></ul>

<h4>違うフォーマットだよね</h4>

拡張子が.epubじゃない上に、中のmimetypeがapplication/epub+zipじゃない。これは"ibooksフォーマットはEPUBじゃないよ"という意志の現れだとかんじました。これは拡張されたEPUBではなく、よく似ているけど全く別のフォーマットだと私は捉えました。

<h4>EPUBオーサリングツールじゃない</h4>

つまり「iBooks AuthorはiPad iBooks専用電子書籍のオーサリングツール」なのであって、「変な拡張をしたEPUBを吐き出す困ったツール」ではないのだと思います。

もうちょっと乱暴に「電子書籍アプリの簡単作成ツール」といってしまってもよいのじゃないかなあ。
]]>
        
    </content>
</entry>

<entry>
    <title>GDD2011JP DevQuiz 私の書いた回答コードその2</title>
    <link rel="alternate" type="text/html" href="http://www.skoji.jp/blog/2011/09/gdd2011jp_devquiz_2.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.skoji.jp/mtbin/mt-atom.cgi/weblog/blog_id=2/entry_id=1344" title="GDD2011JP DevQuiz 私の書いた回答コードその2" />
    <id>tag:www.skoji.jp,2011:/blog//2.1344</id>
    
    <published>2011-09-13T12:13:12Z</published>
    <updated>2011-09-13T21:57:57Z</updated>
    
    <summary>GDD DevQuiz、今年の本命はスライドパズル。拡張された15パズルです。ま...</summary>
    <author>
        <name>こじま</name>
        <uri>http://www.skoji.jp/movabletype/</uri>
    </author>
    
        <category term="ソフトウェア開発" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.skoji.jp/blog/">
        <![CDATA[GDD DevQuiz、今年の本命はスライドパズル。拡張された15パズルです。まずはJavaで解いて、最後にgo言語で上積みしました。

<a href="https://github.com/skoji/Gdd11jpSlidePuzzle_java">Java実装</a>
<a href="https://github.com/skoji/Gdd11jpSlidePuzzle_go">Go実装</a>

問題文は以下のとおり。

<blockquote>幅が 3 マスから 6 マスで、高さが 3 マスから 6 マスのボードが与えられます。 各マスは、パネルが置かれているか、壁があるか、空白であるかのいずれかです。 パネルには 1 から 9 あるいは A から Z のいずれかの文字が書かれており、同じ文字の書かれたパネルは存在しません。 壁は 0 個以上存在し、空白のマスはただ 1 つだけ存在します。 例えば、次のようなボードが与えられます。ここで、壁は = で、空白は 0 で表されています。<br />
<br />
40=<br />
215<br />
=86<br />
<br />
空白は、上下左右のマスのパネルと入れ替えることができます。上のマスのパネルと入れ替えることを U とよび、同様に、下左右のマスのパネルと入れ替えることをそれぞれ D, L, R とよぶものとします。壁を空白やパネルと入れ替えることはできません。<br />
パズルを解くというのは、与えられたボードの各マスを操作して、ゴール状態に持っていくことです。<br />
ゴール状態とは、上の行から各行順番に、左から右に 1, 2, 3, 4, ..., 9, A, ..., Z という順にパネルが並び、最も右下のマスに空白が配置された状態のことです。壁のあるマスに対応するパネルは存在しません。例えば、左上のマスが壁であれば、ボード上に 1 のパネルは存在しません。<br />
 (中略)<br />
いま、使うことができる L, R, U, D それぞれの総数があたえられます。 この総数は全パズルで共有されています。 例えばあるパズルを解くために L を使い切ってしまった場合、 他のパズルでは L を使うことはできません。 この総数を超えないようにしながら、なるべくたくさんのパズルを解いてください。</blockquote>

このパズル、5000問あるのです。そして一問が0.01点。100問といてやっと1点。手で解くことをある程度防ぐ設問ですね。

15パズルでの評価関数は各駒のゴールに対するマンハッタン距離合計を使うのがポピュラーな模様。その方向で、A*探索をRubyで試しに実装してみてあまりの遅さに音をあげてすぐにJavaにうつりました。

まずはメモリをじゃぶじゃぶつかって試みてみました。この時点で一晩で1000問程度回答。かなり厳しいです。

次はゴール状態から初期状態に向かってのA*探索を同時に走らせる双方向A*探索してみました。これでもくろみ通り、探索空間が小さくなってかなり成績があがり、3300問程度。その後はパラメータを少し調整し、メモリを増やすなどして、4300問まで頑張りました。

メモリ使いすぎで探索中にMacBook使えないのが辛くて、こんどはメモリをあんまり使わない反復深化深さ優先探索(IDDFS)を実装してみました。が、新たな解はほとんどみつけてくれません。

このあたりで飽きたのでgoでIDDFSを実装しなおして遊んでいたら「探索したノード数が一定数を超えたらその時点で評価値最良のノードひとつだけ残してそこから再度探索する」という乱暴な枝狩りをおもいつきました。これがそれなりに効果的で、最終的には4818問で終了しました。

この問題、30人近くが5000問すべてを解いています。そのひとたちは、そもそもメモリの使い方を最初からすごくしぼっていて、私の無駄遣い富豪プログラミングとは一線を画している様です。評価関数もいろいろ工夫されています。コード公開しているひと多数なので、後でじっくりみてみようと思ってます。
]]>
        
    </content>
</entry>

<entry>
    <title>GDD2011JP DevQuiz 私の書いた回答コードその1</title>
    <link rel="alternate" type="text/html" href="http://www.skoji.jp/blog/2011/09/gdd2011jp_devquiz_1_gdd11jp.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.skoji.jp/mtbin/mt-atom.cgi/weblog/blog_id=2/entry_id=1343" title="GDD2011JP DevQuiz 私の書いた回答コードその1" />
    <id>tag:www.skoji.jp,2011:/blog//2.1343</id>
    
    <published>2011-09-13T03:38:57Z</published>
    <updated>2011-09-13T06:34:28Z</updated>
    
    <summary>今年の11月に、Google Developer&apos;s Dayというイベントがあり...</summary>
    <author>
        <name>こじま</name>
        <uri>http://www.skoji.jp/movabletype/</uri>
    </author>
    
        <category term="ソフトウェア開発" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.skoji.jp/blog/">
        <![CDATA[今年の11月に、Google Developer's Dayというイベントがあります。
一昨年までは先着順で瞬間的にチケットがなくなっていたらしいです(参加してないので知りませんが)

昨年から参加者には基本的に「開発者向けクイズを解く」ことが課せられるようになりました。その得点上位のひとから順に、入場の権利が与えられるのです。開発者向けイベントなのだから、合理的ですね。

昨年にひきつづき、今年も挑戦しました。各問題のために書いたコードをここにだしておきます。まずは、簡単なほうの問題5つのうち、私がといた3つから。

(この5つの問題は、2つだけ点数にカウントされるのです)

<h4>Web Game</h4>
<blockquote>シンプルな神経衰弱ゲームです。カードはクリックすることでめくることができます。全 64 セットを解くことで問題クリアとなります。</blockquote>

色が違うだけのカードが、最大1024枚出てくる神経衰弱。これを手でやろうなんていうプログラマはほとんどいないでしょう。

親切なことに、「ヒント」としてGoogle Chromeの機能拡張の例が出ています。これをベースに使えばとても簡単。JavaScriptでDOMさわってクリックして色チェックして覚えて、というだけOKです。

manifestを含むコードはここに置いています。
<a href="https://gist.github.com/1213056">https://gist.github.com/1213056</a>

<h4>Go!</h4>

<blockquote>Go 言語で、PNG 画像を入力として受け取り、その画像が何色使っているかを返す関数func CountColor(png io.Reader) intを実装してください。PNG 画像は io.Reader 型で与えられます。なお、入力の画像は R G B の各色の値が 0 から 255 までの 256 段階のいずれかであり、不透明（アルファチャンネルの値が常に 255）であることが保証されています。</blockquote>

これも、goのimage/pngライブラリを使えば実に簡単です。

<script src="https://gist.github.com/1213072.js?file=gopng.go"></script>

<h4>一人ゲーム</h4>

<blockquote>数がいくつか与えられます。なるべく少ない手数で数を全て取り除いてください。あなたは 1 手で、<br />
- 全ての数を半分にする（端数は切り捨て）<br />
- 5 の倍数 (0 を含む) を全て取り除く<br />
のどちらかの操作をすることができます。</blockquote>

簡単簡単、とおもったらちょっとだけひっかかりました。

「5で割りきれてかつ2で割りきれない数が残っている」ときに、その数を含めて5の倍数を取り除くのが良い場合と、良くない場合があるのです。

結局、こんなコード書きました。幅優先探索。

<ol><li>キューから取り出した数セットの要素すべて5でわりきれれば終了</li><li>要素のなかに5で割り切れるが2で割りきれないものがあったら、5の倍数を取り除いたものをキューに入れる</li><li>全要素を2で割ったものをキューに入れる</li></ol>

<script src="https://gist.github.com/1213057.js?file=solve.rb"></script>
]]>
        
    </content>
</entry>

<entry>
    <title>ウクレレ コードおぼえるアプリを作ってみた</title>
    <link rel="alternate" type="text/html" href="http://www.skoji.jp/blog/2011/06/post_11.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.skoji.jp/mtbin/mt-atom.cgi/weblog/blog_id=2/entry_id=1342" title="ウクレレ コードおぼえるアプリを作ってみた" />
    <id>tag:www.skoji.jp,2011:/blog//2.1342</id>
    
    <published>2011-06-17T23:27:37Z</published>
    <updated>2011-06-17T23:42:42Z</updated>
    
    <summary>半年ほど前からウクレレ習っています。 我が師匠は突然「じゃあC9は?」と質問し、...</summary>
    <author>
        <name>こじま</name>
        <uri>http://www.skoji.jp/movabletype/</uri>
    </author>
    
        <category term="webapp" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.skoji.jp/blog/">
        <![CDATA[半年ほど前からウクレレ習っています。

我が師匠は突然「じゃあC9は?」と質問し、右往左往する我々をみてほくそ笑んでいるのです。ほくそ笑まれるだけでも悔しいので、コードをおぼえるためのWebアプリを作ってみました。

<a href="http://www.skoji.jp/ukuchord">UkuChord</a>

タップ(またはクリック)すると答えがでて、さらにタップすると次の問題が出ます。表示の向きを変えることもできます。まだコードのデータが不十分ですし、間違いもあるかもしれません。

iPhone向けです。PC/MacのSafariやChromeでも動作します。おそらくFirefoxでもじょうぶ。IE8では動かないはずです。Androidでも動くそうです。

iPhoneでは、「ホーム画面に登録」すると、本物のアプリみたいにふるまいます。タップすると単独のアプリであるかのように、Safariとは別に起動します。

コードは上のサイトから見放題ですが、一応githubにも入れました。つっこみご指導いただけると、とっても嬉しいです。

<a href="https://github.com/skoji/ukuchord.js">https://github.com/skoji/ukuchord.js</a>

実はHTML5なアプリをはじめて作ったのですが、あんまりにも簡単にできて驚きましたよ。]]>
        
    </content>
</entry>

<entry>
    <title>環境設定メモ: RVM + Ruby 1.9.2 + Rails3</title>
    <link rel="alternate" type="text/html" href="http://www.skoji.jp/blog/2011/01/_rvm_ruby_192_rails3.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.skoji.jp/mtbin/mt-atom.cgi/weblog/blog_id=2/entry_id=1333" title="環境設定メモ: RVM + Ruby 1.9.2 + Rails3" />
    <id>tag:www.skoji.jp,2011:/blog//2.1333</id>
    
    <published>2011-01-05T07:20:26Z</published>
    <updated>2011-01-05T07:31:28Z</updated>
    
    <summary>MacBook (SnowLeopard)でRails3の環境をつくりはじめまし...</summary>
    <author>
        <name>こじま</name>
        <uri>http://www.skoji.jp/movabletype/</uri>
    </author>
    
        <category term="開発環境" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.skoji.jp/blog/">
        <![CDATA[MacBook (SnowLeopard)でRails3の環境をつくりはじめました。

<h4>readlineのインストール</h4>
readline入れとかないとirbで日本語使えないということなので、readline-6.1をインストール。単純にconfigure/make/sudo make install。

<h4>RVMのインストール</h4>
  <a href="http://rvm.beginrescueend.com/">http://rvm.beginrescueend.com/</a>の指示に基本的には従う、が、scripts/installが実行されなかったので手動で実行する。

 .bash_profileに、次の追記をする。

<pre> [[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" </pre>

<h4>Ruby 1.9.2をインストールする</h4>

<pre>rvm install ruby-1.9.2 --with-readline-dir=/usr/local </pre>

<h4>Railsをインストール</h4>

<pre>
rvm use 1.9.2
gem install rails
</pre>]]>
        
    </content>
</entry>

<entry>
    <title>電書部マークアップvalidatorを作ってみた</title>
    <link rel="alternate" type="text/html" href="http://www.skoji.jp/blog/2010/11/ydml_validator.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.skoji.jp/mtbin/mt-atom.cgi/weblog/blog_id=2/entry_id=1330" title="電書部マークアップvalidatorを作ってみた" />
    <id>tag:www.skoji.jp,2010:/blog//2.1330</id>
    
    <published>2010-11-12T09:07:10Z</published>
    <updated>2010-11-12T10:46:19Z</updated>
    
    <summary>電書部の技術班。今年はこればっかりやっていた気がする。 gihyo.jpで、電書...</summary>
    <author>
        <name>こじま</name>
        <uri>http://www.skoji.jp/movabletype/</uri>
    </author>
    
        <category term="Ruby" />
    
        <category term="電子書籍" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.skoji.jp/blog/">
        <![CDATA[電書部の技術班。今年はこればっかりやっていた気がする。

gihyo.jpで、電書部の技術解説の記事「<a href="http://gihyo.jp/dev/serial/01/ebook-distribution-server">電書部技術班，電子書籍配信サーバーに挑む</a>」がはじまっています。その中でEPUB変換まわりの原稿書きました。

<a href="http://gihyo.jp/dev/serial/01/ebook-distribution-server/0004">第4回　電書用マークアップYDMLを使った原稿作成と，YDMLパーサ</a>
<a href="http://gihyo.jp/dev/serial/01/ebook-distribution-server/0005">第5回　電書原稿からEPUBをつくりだす</a>

何気ないふうを装いつつも、少しどきどきしながらYDMLという言葉を出しました。でもどこからも何の突っ込みもなくてそれはそれでちょっとさみしいものです。

YDMLパーサ記事について「なんでXMLパーサでやらないの?」という趣旨のつっこみがtwitterで入りました。思い起こすとそもそもパーサジェネレータ作った理由は
<ul><li>YDMLとは違うマークアップを目論んでいた</li><li>DSLぽいものをRubyで作ってみたかった</li><li>とにかく作ってみたかった</li></ul>そんなことでした。が、何をぼけていたのか、テキスト混合ノードはXML的にはwell-formedじゃないからという恥ずかしい説明をしてしまいました。恥ずかしいのでその経緯はリンクしません。(tweet消してはいないので探せばみつかります)

XMLでのvalidateくらいやってみるかと思い立ってやってみましたら、RelaxNGの勉強からはじめたのに1時間くらいで出来てしまい愕然としました。

YDMLを少しだけ改変(ルートのエレメント定義して、書式が変なタグを修正)してwell-formed XMLにしたものにたいして、RelaxNG compact syntaxでスキーマを定義し、それをcompactじゃないsyntaxに変換したうえでNokogiri::XML::RelaxNGに喰わせています。

ちゃんとvalidateはできるのですが、validじゃなかったときのエラーメッセージが分かりづらい。場合によっては分かりづらいを通り越して意味不明なので実用性低めです。でもせっかく作ったのでgithubにあげました。

<a href="https://github.com/skoji/ydml_simple_validator">https://github.com/skoji/ydml_simple_validator</a>]]>
        
    </content>
</entry>

<entry>
    <title>gepub 0.1.1 をリリースしました。</title>
    <link rel="alternate" type="text/html" href="http://www.skoji.jp/blog/2010/07/gepub_v01.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.skoji.jp/mtbin/mt-atom.cgi/weblog/blog_id=2/entry_id=1325" title="gepub 0.1.1 をリリースしました。" />
    <id>tag:www.skoji.jp,2010:/blog//2.1325</id>
    
    <published>2010-07-07T03:30:00Z</published>
    <updated>2010-07-07T15:30:21Z</updated>
    
    <summary>必要十分を目指すrubyで書いたepubライブラリ・gepubのversion ...</summary>
    <author>
        <name>こじま</name>
        <uri>http://www.skoji.jp/movabletype/</uri>
    </author>
    
        <category term="gepub" />
    
        <category term="電子書籍" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.skoji.jp/blog/">
        <![CDATA[必要十分を目指すrubyで書いたepubライブラリ・gepubのversion 0.1.1をリリースしました。はじめてminor versionが1になったよ。gem install gepub で降ってくるはず。

ソースはこちら。<a href="http://github.com/skoji/gepub">http://github.com/skoji/gepub</a>

主な変更点。

<ol><li>インタフェースをいちから書き直して、itemを生成してbookに追加するというモデルにしました。だいぶシンプルになってる、といいなあ。</li><li>圧縮前epubのディレクトリを作成せずに、直接epubを生成するようにしました</li><li>ソースとなるデータをファイルではなくIOオブジェクトで渡すようにしました</li></ol>

IOオブジェクトで渡すようになったのは地味な変更だけど、地味に使いやすいんじゃないかと思っております。


これまでのGEPUB::GeneratorではなくGEPUB::Bookをつかってください。

GEPUB::Generatorは0.2.0のタイミングで削除する予定です。使い方はgithubに置いてあるexample.rbをご参照ください。例は少しずつ充実させます。

この後は、

<ul><li>メタデータをもうちょっとちゃんと書き込めるようにする</li><li>インタフェースがまだおかしい気がするのでみなおす</li><li>XMLライブラリをNokogiriにする</li></ul>

などなどを考えていますが、予定は気まぐれに変わります。こうなるといいなー、なんていうのがあればお知らせください。ないだろうけど。

<a href="http://densho.in/">電子書籍部</a>でつかっているテキストto EPUBのコードも遠からず公開する予定です。]]>
        
    </content>
</entry>

<entry>
    <title>EPUB生成ライブラリを作ってみた</title>
    <link rel="alternate" type="text/html" href="http://www.skoji.jp/blog/2010/05/epub_creator.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.skoji.jp/mtbin/mt-atom.cgi/weblog/blog_id=2/entry_id=1324" title="EPUB生成ライブラリを作ってみた" />
    <id>tag:www.skoji.jp,2010:/blog//2.1324</id>
    
    <published>2010-05-04T02:46:40Z</published>
    <updated>2010-05-05T08:22:53Z</updated>
    
    <summary>(2010/5/5 : githubにあげました)  EPUB生成のライブラリを...</summary>
    <author>
        <name>こじま</name>
        <uri>http://www.skoji.jp/movabletype/</uri>
    </author>
    
        <category term="gepub" />
    
        <category term="電子書籍" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.skoji.jp/blog/">
        <![CDATA[<p>(2010/5/5 : githubにあげました)</p>

<p> EPUB生成のライブラリをrubyで作ってみました。ブツはこちら。<a href="http://github.com/skoji/gepub">http://github.com/skoji/gepub</a></p>

<ul>
<li>コンテンツ指定のファイルは/content.opfに固定 </li>
<li>identifierのschemeはURLに固定</li>
<li>identifierの名前はBookIDに固定</li>
</ul>

<p>などなどいろいろ決め打ちにしています。</p>

<p>利用例はこんなです。</p>

<pre>
require 'rubygems'
require 'gepub'
require 'fileutils'


epubdir = "testepub" # epubのコンテンツを置くディレクトリ
title = "samplepub"  # epubのファイル名


FileUtils.rm_rf(epubdir)
FileUtils.mkdir(epubdir)

# epub メタデータ作成
epub = GEPUB::Generator.new(title)
epub.author="the author"
epub.publisher="the publisher"
epub.date = "2010-05-03"
epub.identifier = "http://www.skoji.jp/testepub/2010-05-03" # identifierはURLのみ

# サンプルのコンテンツ生成。通常は、別途作成しているはず。
[ 'coverpage', 'chapter1', 'chapter2' ].each {
  |name|
  File.open(epubdir + "/#{name}.html", 'w') {
    |file|
    file &lt;&lt; &lt;&lt;EOF
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja"&gt;
  &lt;head&gt;
    &lt;title&gt;sample #{name} &lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt;
  &lt;h1&gt;#{name}&lt;/h1&gt;
&lt;p&gt;here comes the contents for #{name}&lt;/p&gt;
  &lt;/body&gt;
&lt;/html&gt;
EOF
  }
}

# "coverpage"は表紙を想定。従って目次のデータには入れない。
# spineに入れた順にリーダでは表示される。
epub.addManifest('cover', "coverpage.html", 'application/xhtml+xml')
epub.spine.push('cover')


epub.addManifest('chap1', "chapter1.html", 'application/xhtml+xml')
epub.spine.push('chap1')
epub.addNav('chap1', 'Chapter 1', "chapter1.html")

epub.addManifest('chap2', "chapter2.html", 'application/xhtml+xml')
epub.spine.push('chap2')
epub.addNav('chap1', 'Chapter 2', "chapter2.html")

# この他にcssとかイメージがあれば、それもManifestへ追加する。
# cssやイメージはspineやaddNavへの追加は不要。

# container.xml/contents.opf/toc.ncxなどのファイルを生成
epub.create(epubdir)

# 生成したディレクトリから、epubファイル作成
epub.create_epub(epubdir, ".")
</pre>


<p>サンプル書いて気付きましたが、EPUB::Creatorというクラスの役割がぶれてるなあ。</p>]]>
        
    </content>
</entry>

<entry>
    <title>EPUB入門メモ</title>
    <link rel="alternate" type="text/html" href="http://www.skoji.jp/blog/2010/04/epub.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.skoji.jp/mtbin/mt-atom.cgi/weblog/blog_id=2/entry_id=1323" title="EPUB入門メモ" />
    <id>tag:www.skoji.jp,2010:/blog//2.1323</id>
    
    <published>2010-04-07T21:11:51Z</published>
    <updated>2010-04-08T03:57:23Z</updated>
    
    <summary>EPUBに関するメモ。 リンク 元締め International Digita...</summary>
    <author>
        <name>こじま</name>
        <uri>http://www.skoji.jp/movabletype/</uri>
    </author>
    
        <category term="電子書籍" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.skoji.jp/blog/">
        <![CDATA[EPUBに関するメモ。

<h4>リンク</h4>

元締め
<a href="http://www.idpf.org/">International Digital Publishing Forum</a>

EPUB仕様日本語訳をしている、ろすさんのサイト
<a href="http://lost_and_found.lv9.org/"> 厨二病棟</a>

わかりやすげなまとめ
<a href="http://www.hxa.name/articles/content/epub-guide_hxa7241_2007.html">Epub Format Construction Guide</a>

ePubのメタデータはダブリンコア
<a href="http://dublincore.org/documents/2004/12/20/dces/">dublin core metadata element </a>

仕様でかいし、自前でつくるときはvalidatorがないと不安です
<a href="http://www.threepress.org/document/epub-validate/">epub validator</a>

Hello world的な、達人出版会の記事
<a href="http://d.hatena.ne.jp/tatsu-zine/20100324/1269451084">はじめてのEPUB</a>

<h4>その他</h4>

コンテンツのXHTMLには、langやxml:langを指定しておく。そうしないとAdobe Digital Editionでは日本語文字化けする(validatorに怒られるのだけど...)

zipでつくるときは、こんなんがよい。

<pre>
zip -0X testbook.epub mimetype
zip -9rXD testbook.epub -x mimetype
</pre>

mimetypeは非圧縮(-0)で先頭に。他のコンテンツは圧縮してよし(-9)。属性は不要なので-X。ディレクトリは保存しなくてよいので-D。など。

]]>
        
    </content>
</entry>

<entry>
    <title>The Art of Unit Testing</title>
    <link rel="alternate" type="text/html" href="http://www.skoji.jp/blog/2010/01/the_art_of_unit_testing.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.skoji.jp/mtbin/mt-atom.cgi/weblog/blog_id=2/entry_id=1319" title="The Art of Unit Testing" />
    <id>tag:www.skoji.jp,2010:/blog//2.1319</id>
    
    <published>2010-01-28T03:50:49Z</published>
    <updated>2010-03-09T07:58:43Z</updated>
    
    <summary>最近読んだ&quot;The Art of Unit Testing: With Exam...</summary>
    <author>
        <name>こじま</name>
        <uri>http://www.skoji.jp/movabletype/</uri>
    </author>
    
        <category term="ソフトウェア開発" />
    
        <category term="本" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.skoji.jp/blog/">
        <![CDATA[<p>最近読んだ"<a href="http://www.amazon.co.jp/exec/obidos/ASIN/1933988274/kaimonolog-22/ref=nosim/" name="amazletlink" target="_blank">The Art of Unit Testing: With Examples in .net</a>"という本がとっても良かった。Unit Testをはじめようとしているひと、運用で悩んでいる人は今すぐ読め! ってくらい良かった。</p>

<p>この本は、ユニットテストの基本的な考え方と基本的な書き方から始まります(Part 1)。</p><p>そして、ユニットテストで必須のテクニックである依存性の取り除きかたについて語られます(Part 2)。</p><p>その上で、ユニットテストをどう配置し走らせるか、どうやってリファクタするか、どんなふうに自動ビルドで運用するか、など実際に運用するときの考え方や方法論を解説します。そしてユニットテストのコードで陥りがちな罠(ひとつのテストにAssertion多すぎ、テストの名前が分からん、Setupに詰め込みすぎ、実行順序に依存、などなど)とその回避基準も明示します(Part 3)。</p><p>さらに、組織へのユニットテストを導入するにはどうするか(新しいことには抵抗がつきものです)を説明し、「タフ」な質問( 「これはどのくらい時間をとるの?」「これでほんとに効果がでるの?」など)にどう応えるか、回答例のカタログとともに説明します。最後の章では所謂"レガシーコード"に、どのようにユニットテストを適用していくのか、という話題に切り込みます(Part 4)。</p>

<p>上記で要約したとおり、「ユニットテスト」の話題に関する1から10までをカバーしてる本です。これだけ盛りだくさんで、厚さは300ページ程度と薄いのもよいです。でも内容は決して薄くないですよ。これからユニットテストを学ぶひとが最初から通読するのにはとても向いていますし、ある程度実践してるけど、いろいろうまくいっていない人(それは私)にも読み応えあります。</p>
<p>テスト駆動開発ベースの本や、JUnitの使い方の本はいままでもいろいろありましたが、ユニットテストの話題を網羅した、適切なサイズの本はこれまでなかったのではないかと思います。</p>

<p>"<a href="http://www.amazon.co.jp/exec/obidos/ASIN/0131495054/kaimonolog-22/ref=nosim/" name="amazletlink" target="_blank">xUnit Test Patterns: Refactoring Test Code (Addison-Wesley Signature Series)</a>"や、"<a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798116831/kaimonolog-22/ref=nosim/" name="amazletlink" target="_blank">レガシーコード改善ガイド (Object Oriented SELECTION)</a>"を読む前に読むのもよいのではないかと推測します(推測なのは、どっちも未だ読んでいないので...)</p>

<p>翻訳されていないのが惜しいです。もし誰も版権とっていないのならば、翻訳したいなー、と本気で思っています。アンオフィシャルに蠢き中ですが、既に翻訳はじまってるよ、などの情報ご存じの方いらっしゃったら教えてください。</p>

<p>そして、ひろってくださる出版社募集中。</p>

<p> 
<iframe src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&bc1=000000&IS2=1&npa=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=kaimonolog-22&o=9&p=8&l=as1&m=amazon&f=ifr&md=1X69VDGQCMF7Z30FM082&asins=1933988274" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>]]>
        
    </content>
</entry>

<entry>
    <title>アレグザンダー祭りで印象に残った一言など</title>
    <link rel="alternate" type="text/html" href="http://www.skoji.jp/blog/2010/01/alexander.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.skoji.jp/mtbin/mt-atom.cgi/weblog/blog_id=2/entry_id=1316" title="アレグザンダー祭りで印象に残った一言など" />
    <id>tag:www.skoji.jp,2010:/blog//2.1316</id>
    
    <published>2010-01-24T10:40:58Z</published>
    <updated>2010-01-24T10:34:00Z</updated>
    
    <summary>先日、オブジェクト俱楽部のイベントアレグザンダー祭りに行ってきました。もりだくさ...</summary>
    <author>
        <name>こじま</name>
        <uri>http://www.skoji.jp/movabletype/</uri>
    </author>
    
        <category term="イベント" />
    
        <category term="ソフトウェア開発" />
    
        <category term="休むに似たり" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.skoji.jp/blog/">
        <![CDATA[<p>先日、オブジェクト俱楽部のイベント<a href="http://www.objectclub.jp/event/2010alexander/">アレグザンダー祭り</a>に行ってきました。もりだくさんすぎて、未だに消化しきれていないのですが、一点強烈に印象に残ったのは、メインスピーカのJim Coplien氏による、おおむねつぎのような発言です。</p>

<blockquote>
俺たちは有用性が証明されたかどうかでなく、流行や気持ちよさ、直観、「のみ」で技術や方法論を追いかけている(ことが多い)
</blockquote>

<p>今週になってからtwitterでの議論の中で、<a href="http://twitter.com/RoyOsherove/status/8023363413">こんな発言</a>がありました:</p>

<blockquote>
if your only learning comes from asking other people what *they* think - how can you claim to personally know anything?
</blockquote>

<span class="note">(このひとは、<a href="http://www.amazon.co.jp/gp/product/1933988274?ie=UTF8&tag=kaimonolog-22&linkCode=as2&camp=247&creative=7399&creativeASIN=1933988274">The Art of Unit Testing: With Examples in .net</a><img src="http://www.assoc-amazon.jp/e/ir?t=kaimonolog-22&l=as2&o=9&a=1933988274" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
の著者です。良書なので近々紹介します</span>)

<p>これは開発関連のツールに関連した議論の中で出てきた発言です。意図は、先のJim Coplienの発言と同じだと、私は理解しました。</p>

<p>
肝に銘じます。
</p>]]>
        
    </content>
</entry>

<entry>
    <title>三鷹 プログラマーズカフェにいってきた</title>
    <link rel="alternate" type="text/html" href="http://www.skoji.jp/blog/2009/08/pgcafe.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.skoji.jp/mtbin/mt-atom.cgi/weblog/blog_id=2/entry_id=1297" title="三鷹 プログラマーズカフェにいってきた" />
    <id>tag:www.skoji.jp,2009:/blog//2.1297</id>
    
    <published>2009-08-31T03:42:47Z</published>
    <updated>2009-08-31T03:39:30Z</updated>
    
    <summary>前々から気になっていた「三鷹プログラマーズカフェ」に、2009/8/27 参加し...</summary>
    <author>
        <name>こじま</name>
        <uri>http://www.skoji.jp/movabletype/</uri>
    </author>
    
        <category term="イベント" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.skoji.jp/blog/">
        <![CDATA[前々から気になっていた<a href="http://groups.google.co.jp/group/m-pgcafe/">「三鷹プログラマーズカフェ」</a>に、2009/8/27 参加してきました。

普段は、もくもく作業をしているひともいれば同じテーマで作業をしているひともいたり、LTをやっていたり、という雰囲気だそうですが、この回は特別版で基本はLT、その後懇親会でした。

わたしは普段はサラリーマンなプログラマなので、なかなか刺激的でした。いろんなひとがいて、いろんなことをやっているんだなあ。LTどれも面白かった。

驚きだったのが、親子プログラマの方。親子でってのも驚きなのですが、基本的な契約が「時間給」だそうな。アメリカのコンサルタントみたいに。懇親会で話を伺ってみたら「だってソフトウェアの見積もりはできないじゃないですか(意訳)」とのことで、でもそういう契約ができるのはお客さんとの信頼関係がそうとう強いのだよなあ、簡単にまねできることではないのだろうな。

三鷹プログラマーズカフェは特にテーマを決めているわけではないそうで、私にはそれが心地よく感じられました。平日じゃなければ毎週いきたいくらいです。

以下とりとめもなく感想を。

<ul><li>こういう場で、集まってただ黙々やる、ってのはわたしにはたぶん性に合う。家でやるよりも効率がよさそう。</li><li>しかもゆるい情報交換ができる。新しいモノ好きも多いはずだし。</li><li>会社に籠もってるとどうしても固まってしまうけど、こういうところに時々顔だすと表面がリフレッシュされそう。</li><li>会社放り出されても生きていけるようにしなきゃ、と最近よく思うのだけれども、そのヒントもいろいろありそう</li><li>ここで発表するのを目標に勉強するというのは効果的かもしれない、わたしのような怠け者には。</li></ul>]]>
        
    </content>
</entry>

<entry>
    <title>Factorに入門する(20) inlineそのいち</title>
    <link rel="alternate" type="text/html" href="http://www.skoji.jp/blog/2009/06/factor20_inlineiti.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.skoji.jp/mtbin/mt-atom.cgi/weblog/blog_id=2/entry_id=1274" title="Factorに入門する(20) inlineそのいち" />
    <id>tag:www.skoji.jp,2009:/blog//2.1274</id>
    
    <published>2009-06-21T11:56:58Z</published>
    <updated>2009-06-21T12:24:48Z</updated>
    
    <summary>「特定のディレクトリにあるjpgファイルのリスト」を得る用事(用事?)があって、...</summary>
    <author>
        <name>こじま</name>
        <uri>http://www.skoji.jp/movabletype/</uri>
    </author>
    
        <category term="Factor" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.skoji.jp/blog/">
        <![CDATA[<p>「特定のディレクトリにあるjpgファイルのリスト」を得る用事(用事?)があって、factorで書いてみたらけっこう苦労しました。</p>

<pre>
USING: io.directories io.pathnames kernel sequences io ;
IN: filelist

&lt;PRIVATE
: filter-quot ( str -- quot ) [ file-extension ] swap [ equal? ] curry compose ; inline
PRIVATE&gt;

: filelist ( path ext -- seq ) 
    dupd [ directory-files ] dip filter-quot filter 
   [ dupd "/" swap 3append ] map nip ;
</pre>

<p>最初は、filer-quotのinline指定なしで書いてみました。そうすると、filelistのコンパイルに失敗します。曰く、</p>

<pre>
Got a computed value where a literal quotation was expected
</pre>

<p>filter-quotで生成したquotationを、filterに渡しているところでこのエラーが発生しているようです。filterはliteralのquotationじゃないと受け付けないと。それじゃ全然quotation使えないじゃん!</p>

<p>と悩むこと30分。inline指定しておけばよいことがわかりましたが...これは「optimizing compiler」でのみ効くとのこと。つまり、optimizing compilerを使わなければinline指定しなくても動くはずとのこと。</p>
<p>まだよくわからないので、続きます。</p>]]>
        
    </content>
</entry>

<entry>
    <title>Factorに入門する(19) wordの定義: パース時、ランタイム</title>
    <link rel="alternate" type="text/html" href="http://www.skoji.jp/blog/2009/06/factor19_word.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.skoji.jp/mtbin/mt-atom.cgi/weblog/blog_id=2/entry_id=1252" title="Factorに入門する(19) wordの定義: パース時、ランタイム" />
    <id>tag:www.skoji.jp,2009:/blog//2.1252</id>
    
    <published>2009-06-01T03:14:11Z</published>
    <updated>2009-06-01T03:26:01Z</updated>
    
    <summary> Factor入門1ヶ月以上あきました。第19回。まだ景色が見えてないところがた...</summary>
    <author>
        <name>こじま</name>
        <uri>http://www.skoji.jp/movabletype/</uri>
    </author>
    
        <category term="Factor" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.skoji.jp/blog/">
        <![CDATA[<p>
Factor入門1ヶ月以上あきました。第19回。まだ景色が見えてないところがたくさんあるのに、息切れしてきました。
</p>
<p>今日はwordを定義する方法について調べます。普通のword定義はこういうふうにします。</p>
<pre>
: myword ( x y -- z ) dup * + ;
</pre>
<p>ほぼ意味のないwordですが、x + y * 2を計算します。mywordは名称。( x y -- z )はstack effectの宣言。: からはじまって、;で終わるまでがwordの定義です。これは、ソースコードのパース時に読み込まれ、定義が実行されます。</p>

<p>ランタイムでwordを定義することもできるそうで、それがdefine。</p>

<pre>
( scratchpad ) DEFER: foo
( scratchpad ) \ foo [ dup * + ] define
Attempting to define foo outside of a compilation unit

Type :help for debugging help.
( scratchpad ) [ \ foo [ dup * + ] define ] with-compilation-unit
:errors - show 1 compiler errors
( scratchpad ) :errors

==== &lt;Listener input&gt;

&lt;Listener input&gt;

Asset: foo

Missing stack effect declaration
word foo
:errors - show 1 compiler errors
( scratchpad ) [ \ foo [ dup * + ] (( x y -- z )) define-declared ] with-compilation-unit
( scratchpad ) 3 4 foo .
19
</pre>

<p>defineだとstack effect declarationがない、って怒られてしまいました。用途としては、既に定義されているwordの中身を置き換えるもの、のように見えます。いきなり定義するにはdefine-declaredを使う必要があるようです。いずれにせよ、wordとして用意しておかなくてはならないので、DEFER:を使わなくてはなりません。DEFER:はランタイムじゃなくてパースタイムだよな。ランタイムにwordを作る方法はやっぱりよく分かりません。</p>

<p>あと、with-compilation-unitが必要とのことですが、compilation-unitの詳細もよく分かっていません。要調査。</p>]]>
        
    </content>
</entry>

<entry>
    <title>gitの第一歩： working tree, index(staging area), repository(commited)</title>
    <link rel="alternate" type="text/html" href="http://www.skoji.jp/blog/2009/05/git_working_tree_indexstaging.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.skoji.jp/mtbin/mt-atom.cgi/weblog/blog_id=2/entry_id=1259" title="gitの第一歩： working tree, index(staging area), repository(commited)" />
    <id>tag:www.skoji.jp,2009:/blog//2.1259</id>
    
    <published>2009-05-12T13:35:32Z</published>
    <updated>2009-05-12T14:05:30Z</updated>
    
    <summary>gitをつかいはじめてみたけど、どうもわたしは基本的な概念が分かっていないぽいの...</summary>
    <author>
        <name>こじま</name>
        <uri>http://www.skoji.jp/movabletype/</uri>
    </author>
    
        <category term="開発環境" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.skoji.jp/blog/">
        <![CDATA[<p>gitをつかいはじめてみたけど、どうもわたしは基本的な概念が分かっていないぽいので、本を探してみました。見つけたのは2冊。</p>

<h4>Git Internals</h4>

<p><a href="http://peepcode.com/products/git-internals-pdf">Git Internals</a>は$9のPDF本。大変安い。Internalsというだけあって、仕組みを解き明かす本のようです。<p>

<h4>Pragmatic Version Control using Git</h4>

<p><a href="http://www.pragprog.com/titles/tsgit/pragmatic-version-control-using-git">Pragmatic Version Control using Git</a>は、名前から推測つくように、The Pragmatic Bookshelfから出ている本。電子版$22, 書籍版$34.95 + 送料, 電子+書籍$43.75。</p>

<p>まずはPragmatic Version Control using Gitの電子版を買って、読み始めています。iPhoneでも読めるので通勤の友です。<a href="http://www.skoji.jp/blog/2009/05/git.html">前回疑問に思った</a>レポジトリをworkingの関係はすぐにすっきりしました。</p>

<p>Gitには3種類のエリアがあります: working tree (ここで実ファイルを編集), repository(コミットされたファイルの各バージョンが入っているデータベース), index(or staging area)(これからコミットされるファイルが一時的に入っている場所)。このindexの存在意義がいまのところ私には分かっていませんが、indexとかstating areaとかcachedとかいわれるものが、レポジトリとworkの間にはさまっていることを理解しておくのがGitをちゃんと理解してつかう第一歩なように思います。</p>

<p>その他にもGitはいろいろ特徴的なようです。本質的に「内容の」変更がtrackされること(ファイルではなく!)、branchが本質的でその処理も非常に軽いこと(だからbranchを使いまくる、従来のVCSからみると「過激な」使い方も気楽にできる)、VCSというよりは履歴つきファイルシステムのようなものであること、等々。</p>]]>
        
    </content>
</entry>

</feed> 


