2010年7月 7日

gepub 0.1.1 をリリースしました。

[ gepub 電子書籍 ]

必要十分を目指すrubyで書いたepubライブラリ・gepubのversion 0.1.1をリリースしました。はじめてminor versionが1になったよ。gem install gepub で降ってくるはず。

ソースはこちら。http://github.com/skoji/gepub

主な変更点。

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

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


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

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

この後は、

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

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

電子書籍部でつかっているテキストto EPUBのコードも遠からず公開する予定です。

2010年5月 4日

EPUB生成ライブラリを作ってみた

[ gepub 電子書籍 ]

(2010/5/5 : githubにあげました)

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

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

などなどいろいろ決め打ちにしています。

利用例はこんなです。

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 << <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
  <head>
    <title>sample #{name} </title>
  </head>
  <body>
  <h1>#{name}</h1>
<p>here comes the contents for #{name}</p>
  </body>
</html>
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, ".")

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

2010年4月 8日

EPUB入門メモ

[ 電子書籍 ]

EPUBに関するメモ。

リンク

元締め
International Digital Publishing Forum

EPUB仕様日本語訳をしている、ろすさんのサイト
厨二病棟

わかりやすげなまとめ
Epub Format Construction Guide

ePubのメタデータはダブリンコア
dublin core metadata element

仕様でかいし、自前でつくるときはvalidatorがないと不安です
epub validator

Hello world的な、達人出版会の記事
はじめてのEPUB

その他

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

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

zip -0X testbook.epub mimetype
zip -9rXD testbook.epub -x mimetype

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

2010年1月28日

The Art of Unit Testing

[ ソフトウェア開発 ]

最近読んだ"The Art of Unit Testing: With Examples in .net"という本がとっても良かった。Unit Testをはじめようとしているひと、運用で悩んでいる人は今すぐ読め! ってくらい良かった。

この本は、ユニットテストの基本的な考え方と基本的な書き方から始まります(Part 1)。

そして、ユニットテストで必須のテクニックである依存性の取り除きかたについて語られます(Part 2)。

その上で、ユニットテストをどう配置し走らせるか、どうやってリファクタするか、どんなふうに自動ビルドで運用するか、など実際に運用するときの考え方や方法論を解説します。そしてユニットテストのコードで陥りがちな罠(ひとつのテストにAssertion多すぎ、テストの名前が分からん、Setupに詰め込みすぎ、実行順序に依存、などなど)とその回避基準も明示します(Part 3)。

さらに、組織へのユニットテストを導入するにはどうするか(新しいことには抵抗がつきものです)を説明し、「タフ」な質問( 「これはどのくらい時間をとるの?」「これでほんとに効果がでるの?」など)にどう応えるか、回答例のカタログとともに説明します。最後の章では所謂"レガシーコード"に、どのようにユニットテストを適用していくのか、という話題に切り込みます(Part 4)。

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

テスト駆動開発ベースの本や、JUnitの使い方の本はいままでもいろいろありましたが、ユニットテストの話題を網羅した、適切なサイズの本はこれまでなかったのではないかと思います。

"xUnit Test Patterns: Refactoring Test Code (Addison-Wesley Signature Series)"や、"レガシーコード改善ガイド (Object Oriented SELECTION)"を読む前に読むのもよいのではないかと推測します(推測なのは、どっちも未だ読んでいないので...)

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

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

2010年1月24日

アレグザンダー祭りで印象に残った一言など

[ イベント ソフトウェア開発 休むに似たり ]

先日、オブジェクト俱楽部のイベントアレグザンダー祭りに行ってきました。もりだくさんすぎて、未だに消化しきれていないのですが、一点強烈に印象に残ったのは、メインスピーカのJim Coplien氏による、おおむねつぎのような発言です。

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

今週になってからtwitterでの議論の中で、こんな発言がありました:

if your only learning comes from asking other people what *they* think - how can you claim to personally know anything?
(このひとは、The Art of Unit Testing: With Examples in .net の著者です。良書なので近々紹介します)

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

肝に銘じます。