10月 11

EPUB3の仕様がついに確定!!!

 EPUB3の勧告(Recommended Specification)が公開され、ついにEPUB3の仕様が確定しました。

EPUB 3 Becomes Final IDPF Specification
[速報]「EPUB 3」がついに完成! IDPFが発表 - Publickey

EPUB3の仕様は以下で公開されています。
EPUB 3 | International Digital Publishing Forum
http://idpf.org/epub/30
 

 EPUB2→EPUB3の変更点は思いつく限り挙げると主に以下の通りでしょうか。

  • HTML5対応になった
  • 縦書きとか縦横中とか日本語出版物の要件がとり入れられた。
  • 限定的だがJavaScirptが使えるようになり、インタラクティブなコンテンツを作れるようになった。
  • テキストとオーディオファイルを同期させて再生できるようになった
  • 上と実は密接な関係がありますが、これからのEPUBとDAISYは統合したようなものよ(他のブログで書いた以下のエントリを参照)。EPUB3 ≒ DAISY4 ― EPUB 3とDAISY 4との関係 |e-chuban blog

 

EPUB3のドキュメント、解説書類

 EPUB3の概要はEPUB3の仕様を策定・管理しているIDPFが概要とEPUB2からの変更点を説明したドキュメントを仕様とセットで公開しています。

 

日本語

 日本語のドキュメントとしては総務省の新ICT利活用サービス創出支援事業の一環としてイースト株式会社(と一般社団法人 日本電子出版協会(JEPA)?) が作成したガイドラインがepubcaféというサイトで公開されています。 

 

epubcafé
http://www.epubcafe.jp/ 

 また、EPUB日本語基準研究グループが「EPUB3における日本語電子書籍ベーシック基準」というガイドラインを作成しているようです。

EPUB日本語基準研究グループ
https://sites.google.com/site/epubjssg/home

追記(2011/10/16): JBasicマークアップ指針、EPUB日本語基準研究グループの情報を追加
 

英語

 IDPFが以下のようなはEPUB3を紹介した電子書籍をO’Reillyのサイトで 無料 で提供しています。なかなか容易周到です。表紙含めてPDF版で全25ページ(本文は全16ページ)なので、英語でもまあなんとか読めなくはないです。


What Is EPUB 3?
An Introduction to the EPUB Specification for Multimedia Publishing

By Matt Garrish
Publisher: O’Reilly Media
Released: September 2011
 
 また、以下のO’Reillyの書籍もお勧めです。タイトルにあるとおり、出版物にHTML5関連の技術をどう生かしていくかということに主眼が置かれておりますが、HTML5を採用したEPUB3ですので、この本でもいろいろなところでEPUB3に言及しております。上がEPUB3に軸足を置いているなら、以下の本はHTML5に軸足を置いて結果としてEPUB3にも結構触れているという感じです。EPUB3のHTML5的側面に興味がある方にはぴったりかと思います。ちなみにこの本も 無料 です。
 
null
HTML5 for Publishers

By Sanders Kleinfeld
Publisher: O’Reilly Media
Released: October 2011
 

 あとは、ビューワーやオーサリングツールが揃うのを待つばかりです。現時点でEPUB3対応しているのは・・て、挙げてみると結構ありますね。一言にビューワー、オーサリングツールといってもいろいろなものがあるようですが、とりあえず一緒に並べてみました。
 

EPUB3対応のビューワー

 

EPUB3対応のオーサリングツール

 

 そういえば、 明日 は確か iOS5 がリリースされる日ですね。噂では iBooksEPUB3対応 になるという話。すばらしいタイミングです。 
 
2011/10/15 追記
 期待されたiBooksのEPUB3対応ですが、残念ながら今回のアップデートでは対応されなかったようです。縦書き表示できるようになったらしいですが。

10月 04

RubyConf 2011の発表資料

9/29から10/1に米国で行われたRubyConfの発表資料がいくつかslideshareで公開されているようです。今なら「Rubyconf」で検索してさらに結果を「this month」で期間を絞れば結構出てきます。どこかでまとめられているともっとよいのですが、今のところないみたいです。

RubyConf 2011
http://rubyconf.org/

 会議の様子はRubyコミッタのauthorNariさん(Nariさん?)がブログで紹介してくださったりしています。

Rubyconf参戦記 -0日目- – I am Cruby!
Rubyconf参戦記 -1日目- – I am Cruby!
Rubyconf参戦記 -2日目- – I am Cruby!
Rubyconf参戦記 -3日目- – I am Cruby!
Rubyconf参戦記 -4日目- – I am Cruby! 
Rubyconf参戦記 -最終日- – I am Cruby! 

 以下に上げている発表資料は会議で発表されているもののほんの一部です。

 

 
 

10月 03

JavaScriptはじまりました(私の中で)

 飽きっぽさを見事に発揮してRubyもまだまともに使いこなせない私がJavaScriptにも手を出し始めました。


 
 といっても、今は『JavaScript本格入門 ~モダンスタイルによる基礎からAjax・jQueryまで』を読んでいるだけです。JavaSriptを真正面から体系的に紹介する本はオライリーの本を除けば、あまり多くはないようで、しかも、この本のように初級者向けに丁寧に書かれた本となると非常に希有のようです。お勧めです。

 始めた動機はRubyの特徴を理解するには他の言語のことも理解しなくてはということと、HTML5関係でいろいろとあそぼうと思ったらJavaSriptは必須ということでわりと真面目にやっています。Rubyを頑張って勉強してきたおかけで、プログラム言語を初めて学ぶような障害は余り感じることがなく、ふむふむと読んで分かった気になっております。

とはいえ・・・

プロトタイプ型のオブジェクト指向・・・よくわからんぞ・・・

 

クラスの役割をオブジェクトを代替させている?

でも、Rubyのクラスだってオブジェクトじゃん??

細かな挙動の違いは方言の違いというレベルでは???

いやいや、待て待て。 

プロトタイプ型とクラス型の違いはそんなちっちゃな違いじゃないはず!
  

 そもそも上のような疑問自体、根本的になにか間違っているのではないのか?そもそも日本語として正確なのか??
 

(っ`Д´)っ・:∴ゴルァ!!!!!!
 

と悶々としております。

 それにしてもJavaScriptは中括弧({})の使用が多いような・・。

 分かった気になっている部分も実際に書いてみないと分かりませんしね。

 最近、HTML5関連の動向を取り入れたJavaSript本が沢山出ていますね。以下のタイトルは結構気になります。 
 

パーフェクトJavaScript (PERFECT SERIES 4)
パーフェクトJavaScript (PERFECT SERIES 4)
クチコミを見る
 
改訂第5版 JavaScript ポケットリファレンス
改訂第5版 JavaScript ポケットリファレンス
クチコミを見る
 
JavaScriptクックブック
JavaScriptクックブック
クチコミを見る

 

9月 29

Rubyのinstance_evalメソッドについて分かってきたような気もするが疑問も増えた

 Rubyのinstance_evalがブロック内のテキストを評価してレシーバーであるインスタンスの元で実行するメソッドであるということは、irbを叩いてなんとく理解できつつあるような気がします。しかし、逆に「何故そうなるのか?Why?」という疑問も増えてきました。

 

メソッド

 以下のように定義したメソッド”aaa”はStringクラスのインスタンス”str”の特異メソッドになるようです。

str = "hoge"

str.instance_eval{def aaa; puts "a";end}
str.aaa
⇒"a"

 しかし、このインスタンスメソッド”aaa”で返された”a”は文字列であるはずなので、Stringクラスかと思いきや、NilClassらしくて、この理由がよくわからないんですよね。 

str.class
⇒String

str.aaa.class
⇒NilClass</del>

 
  ちなみにFixnumクラスを返すはずのインスタンスメソッド”bbb”でも同じ結果です。 

str.instance_eval{def bbb;puts 1;end}
str.bbb
⇒1

str.bbb.class
⇒NilClass</del>

追記
「putsの戻り値がnilだからでは」というコメントをいただきました。試してみると確かにその通りでした。失礼しました。

str = "hoge"

str.instance_eval{def aaa;"a";end}
str.instance_eval{def bbb;1;end}
str.aaa.class
⇒String
str.bbb.class
⇒Fixnum

 

定数

  インスタンスの中で定数を定義してみます。正直、インスタンスの中で定数を定義することの意味がまだよくわかりませんが、一応可能なようです。これは特異定数というか、インスタンス定数という感じになるのでしょうか・・・?
 

str.instance_eval{AAA = "ccc"}

 

この定数”AAA”はどこで定義されてだろうか?
どうやって参照するのだろうか?
 疑問が次から次へと出てきて止まりません。 

クラス – class_evalとの違い –

 さらにこのインスタンス”str”の中でクラスを作ってみたいと思います。
 

str.instance_eval{class BBB;end}

BBBクラスのインスタンスはつくることができます。

b = BBB.new
b.class
⇒BBB

Objectクラスのすぐ下にクラスが作られるんですね。Stringクラスのインスタンス”str”の中で作られるので、Stringクラスのサブクラスとして生成されるかと思っていました。

BBB.ancestors
⇒[BBB,Object,Kernel]

 

 もう少し深く考えるとこの辺の挙動が理解できそうなのですが、今のところ???状態です。

 ちなみにクラスはClassクラスのインスタンスでもあるので、instance_evalを用いるとこんな感じになります。

CCC = Class.new
#これでCCCクラスの生成。
CCC.class ⇒Class
#CCCはClassクラスのインスタンス

 Classクラスのインスタンス、”CCC”にメソッドと定数を定義しています。

CCC.instance_eval{def ccc;puts "123456";end}
CCC.ccc
⇒"123456"

CCC.instance_eval{EEE = "789101112"}
CCC::EEE
⇒"789101112"

 

 それぞれクラスメソッドとクラス定数として定義されているようです。クラスメソッドに定義されるのはClassクラスのインスタンス”CCC”の特異メソッド(=クラスCCCのクラスメソッド)として定義されているからです。Classクラスのインスタンスをレシーバーにする限り、instance_evalとclass_evalと違いは無いような気がする。どうなのだろう?  
 
 

9月 25

Rubyがインストールされていない環境下でRubyのirbをなんとか使う方法

 Rubyのマニュアルを読んでいると、サンプルとして掲載されているプログラムを実行して挙動を確認したいということがままあり、そういう時にirbは非常に重宝しています。しかし、移動している時などいつも手元にRubyがインストールされている環境があるわけではありません。そんなときでもirbを使う方法をまとめてみました。
 

Web

 Webベースのirbです。ネットに接続された環境下ならブラウザ上でirbを使用することができます。

try ruby! (in your browser)
http://tryruby.org/

 

For iOS

 私はiPhoneユーザーですので、一番よく利用しているのが以下のアプリです。移動中にRubyのマニュアルを読みながらメソッドの挙動などを確かめるのに非常に重宝しています。これもネット経由でリモートにirbを利用するサービスです。

irb for iPhone
http://itunes.apple.com/jp/app/irb/id409540962?mt=8
irb for iPhone
 

 Googleで「irb for iPhone」で検索するとiOSでirbを使えるようにしようという試みはいくつもされているみたいです。ここういうのがどんどん生まれてくるといいですね。できれば、ローカルで実行できるものが欲しい。 

 

For Android

 これはもしかするとAndroidにJRubyをインストールするものなのでしょうか。ならば正確には「Rubyがインストールされていない環境下」とはいえませんが、趣旨としては同じなので紹介してみます。とはいえ、私はAndroidユーザーではないので使用したことがありませんが、対話的に実行するirbが使えるだけではなく、Editorも用意されているようですので、コピペなどを駆使すればローカルで書いたスクリプトを実行もできるんではないでしょうか。正直、これは非常にうらやましい。

Ruboto IRB : 過去最大の衝撃。これは凄い!!AndroidでRubyが動く!!Androidアプリ427

Ruboto (JRuby on Android)
http://ruboto.org/

 

9月 25

Ruby(1.8.7〜1.9.0)の配列の末尾には見えない要素があるらしい。

 少し細かい話を・・・・。

 『プログラミング言語Ruby』の「9.5.2.3 配列要素の書き換え」(p353)にsliceメソッドの解説に以下のようなサンプルコードが掲載されています。

# slice!で要素、部分配列を削除
a = [1,2,3,4,5,6,7,8]
a.slice!(0)
# => 1: 添字 0 の要素を削除: a は[2,3,4,5,6,7,8]
a.slice!(-1,1)
# => [8]: 末尾の部分配列を削除: aは[2,3,4,5,6,7]
a.slice!(2..3)
# => [4,5]: 範囲を受け付ける: aは[2,3,6,7]
a.slice!(4,2)
# => []: 末尾の位置にある空配列: a は変更されず
a.slice!(5,2)
# => nil: a は [2,3,6,7,nil]に

1行目から8行目まではよくわかるのですが、9行目と11行目がよく理解できませんでした。同じ配列の範囲外を指定しているのに、なぜ9行目が空の配列を返し、11行目がnilを返してくるのかと。

 当然ですが、クラスも異なります。

a.slice!(4,2).class
#⇒ Array
a.slice!(5,2).class
#⇒ Nilclass

 

 う~ん、よくわからん。配列の末尾には

[2,3,5,6,(nil)]

 

という感じで見えないnilの値でも入っているのだろうかと、眠れない夜が続いていた(嘘)のですが、Rubyに詳しい方にこの件についてお尋ねする機会があったので伺ってみると、配列には見えない形で末尾に配列の末端であることを示すデータが入っているらしいのだそうです。C言語で書かれているのでその実装上の問題とか・・。C言語はよくわかりませんが、そうなんですか・・・。

つまり、

a ⇒[2,3,5,6,(配列の末尾であることを示す見えない要素)]

であるので、

a.slice!(4,2)
# => []

 

 と、空の配列を返すのだそうです。なるほど!そして、以下の場合

slice!(5,2)

 

 以下の■の部分のような配列の外を第一引数が指してしまうので、nilが返ってくるということになるらしい。なるほどぉぉお。

a ⇒[2,3,5,6,(配列の末尾であることを示す見えないデータ)] ■←ココ!

 

ちなみに

 『プログラミング言語Ruby』では以下のようにa配列の5番目の要素に”nil”が追加されますが、

a.slice!(5,2)
# => nil: a は [2,3,6,7,nil]に

 

 私のMacでは以下のようになります。a配列に5番目の要素に”nil”が追加されたりはしません。ちなみに私はRuby 1.8.7を使用しています。『プログラミング言語Ruby』は1.9.0までフォローしています。

a.slice!(5,2)
# => nil: a は [2,3,6,7]に

 

 この辺はRubyの実装環境の違いなんでしょうか・・・。

 ちなみにWebベースのirbであるtry ruby!で試したRuby 1.9.2だとArgumentErrorを返すようです。バグとして修正されたのでしょうか。

a = [2,3,6,7]
=> [2,3,6,7]
>> a.slice[4,2]
ArgumentError: wrong number of arguments (0 for 1..2)
>> a.slice[5,2]
ArgumentError: wrong number of arguments (0 for 1..2)

 

9月 24

W3CのTracking Protection Working GroupとWeb Payments Group

W3Cでは最近、おもしろそうなWorking Groupいろいろと立ち上がっているようだが、先日、立ち上がった「Tracking Protection Working Group」と「Web Payments Community Group」は特に興味深い。とくに後者のCGで検討されるらしいWeb上での少額課金は、標準化が進めば特定のプラットフォームに課金を依存する必要がなくなる。どちらもおもしろそうなのでMLには加入して議論を追ってみることにした。

ところですいません、Working GroupとCommunity Groupの違いはよくわかっておりません・・・。

■W3C Tracking Protection Working Group

W3C Tracking Protection Working Group
http://www.w3.org/2011/tracking-protection/

W3C Tracking Protection Working Group public-tracking@w3.org Mail Archives
http://lists.w3.org/Archives/Public/public-tracking/

W3C Launches Work on “Do Not Track” Standards for the Web–W3C

■Web Payments Community Group

Web Payments Community Group
http://www.w3.org/community/webpayments/

Web Payments Group Launched at W3C! | Web Payments Community Group

 twiter上だと”#payswarm“というハッシュタグで関係者がやり取りをしているらしい。

以下のPaySwarmというものをベースに議論を進めていくらしい。私は「PaySwarm?、なにそれ?初めて知った」という段階で何も分かっていないのだがこういうものもあるんですね。Web上の課金について関心をもっていながら全く知らなかった。勉強不足だ。

PaySwarm @ Digital Bazaar
http://payswarm.com/

9月 24

RubyのClassクラスのインスタンスの定数はどこで定義されているのか

  RubyのクラスはClassクラスのインスタンスらしい。なるほど。

つまり、以下のようにABCクラスを作るとClassクラスのインスタンスが生成されるらしい。

Class ABC

end

ABC.class
=> Class

 そして、クラス名は定数なのだそうだ。上の場合だと”ABC”は定数でもあるらしい(だから、クラス名の最初は大文字)。Classクラスのインスタンスを定数ABCに代入しているということらしい。

上でクラスの作成は以下のように書くこともできる。

ABC = Class.new{ }

 より定数に代入しているっぽいですね。

 ならば、このクラス名の定数”ABC”はどこのクラスで定義されているのだろうかと。

 ちょっと調べたら簡単にわかりました。以下のようにObjectクラスの定数としてクラス名は定義されているようです。

p Object.constants.grep /ABC/
⇒ ["ABC"]

Rubyのその他の組み込みクラスのクラス名もObjectクラスに定数として定義されています。さきほど私が定義したクラス名ABCも含めて。

p Object.constants
=> ["ThreadError", "RUBY_PLATFORM", "Regexp", "Deprecate", "Numeric", "String",
"SLex", "Bignum", "IndexError", "SecurityError", "UnboundMethod", "Exception",
"Readline", "RubyLex", "NoMethodError", "FALSE", "Object", "RELEASE_DATE", "IRB",
"Range", "IO", "Integer", "Config", "TypeError", "RubyToken", "Dir", "RUBY_VERSION",
 "ZeroDivisionError", "Gem", "SystemExit", "NotImplementedError", "Hash", "RegexpError",
"Kernel", "TOPLEVEL_BINDING", "RUBY_COPYRIGHT", "GC", "TRUE", "STDOUT", "LocalJumpError",
"Binding", "Interrupt", "RUBY_FRAMEWORK", "ObjectSpace", "SyntaxError", "Marshal",
"Enumerable", "Struct", "Class", "Continuation", "IOError", "MAXHISTSIZE", "RangeError",
"Kconv", "Data", "Thread", "RUBY_PATCHLEVEL", "SystemStackError", "Array", "NoMemoryError",
 "FileTest", "MatchData", "ARGF", "ETC_IRBRC_LOADED", "NIL", "Comparable", "PLATFORM",
 "ArgumentError", "Float", "FloatDomainError", "RUBY_RELEASE_DATE", "RuntimeError",
"Precision", "ThreadGroup", "Signal", "Fixnum", "STDERR", "FalseClass", "VERSION",
 "Exception2MessageMapper", "RbConfig", "Errno", "StandardError", "Math", "EOFError",
 "LoadError", "NKF", "RUBY_FRAMEWORK_VERSION", "APPLE_GEM_HOME", "STDIN", "TrueClass",
 "NameError", "NilClass", "Process", "Proc", "RUBY_DESCRIPTION", "ARGV", "ABC",
"SystemCallError", "SignalException", "MatchingData", "File", "Time", "ENV",
 "ScriptError", "Symbol", "Module", "Method", "StopIteration",
"DTracer", "CROSS_COMPILING", "HISTFILE"]

 なるほど。なるほど。なるほど。