AsciiDocを使ってLibreOffice文書やPDFを作るには

AsciiDocからLibreOffice文書を生成するには、いったんasciidocコマンドによってhtmlファイルを生成してから、LibreOfficeのoowriterコマンドを使ってodtファイルに変換します。

以下の例では、html生成時に、アイコンの利用、見出しの番号づけ、javascriptの無効を指定しています*1

$ asciidoc -a icons -a numbered -a disable-javascript mydoc.asciidoc
$ oowriter --invisible --convert-to odt mydoc.html 

odtファイルではなくpdfを生成するには2番めの行を次のようにします。

$ oowriter --invisible --convert-to pdf mydoc.html 

こうしてAsciiDoc文書から生成されたLibreOffice Writer文章は次のようになります。

*1:asciidocが生成するhtmlにjavascriptが含まれていると、それをベースとしてodtファイルを生成したときの文書にjavascriptコードが取り込まれてしまいますので無効にしています

AsciiDocを使ってKindle形式の文書を作るには

AsciiDocを使ってKindleで読める技術メモや文書を書きたいと考えています。AsciiDocは軽量なマークアップ言語です。テキストをAsciiDocの記法で原稿を書けば、asciidocコマンドやa2xコマンドを使って、html, docbook, epub, pdfなどのフォーマットに変換することができます(AsciiDocのインストール方法はこちら)。

AsciiDocのシンタクスは簡単です。以下の例は、タイトル、章、節などの文書構造を指定した簡単なメモの例です。AsciiDocのマークアップ記法の詳細はAsciiDoc User Guideを見てください。

= 文書タイトル

== 章

=== 節

これはサンプルです。

* 項目1
* 項目2
* 項目3

AsciiDocでもかなりボリュームのある本格的な文書を書くことができます。実際、CDI 1.1 仕様書(src)やJBossAS Ticket Monster Tutorial(src)は、100~200ページのPDF文書の原稿がAsciiDocで書かれています。この例を見ればわかるように、表紙や目次も生成されますし、ヘッダーやフッター、脚注にも対応しています。シンタクスカラーリングに対応したJavaソースコードの引用もできます。ちょっとした技術メモを書くには十分な機能です。

AsciiDocでKindle形式の文書を作る動機は、Kindleで読める文書をテキスト形式で簡単に書きたいということです。Kindleの文書であれば、スマホタブレットでいつでも読むことができますので、技術メモをKindle文書にしておけば必要なときにいつでも読み直すことができます。それに、Kindleを使えば文書にハイライトやノートをつけることもできます。原稿の校正にKindleはうってつけです。表現を変えた方がよいところや誤記を見つけたらすかさずハイライトをしておけば、後で修正箇所をすぐに見直すことができます。

残念ながらAsciiDocのコマンドはKindle形式(mobi)の出力に対応していません。そこで、AsciiDocの文書からKindle形式の文書を作るのに、まずa2xコマンドによってAsciiDocからepubファイルを生成して、次にkindlegenコマンドでepubからmobiファイルを生成するという2段階で行ないます(ここではepubは中間のファイルとして使っています)。たとえば、mydoc.asciidocからmydoc.mobiを生成するには次のようにします。

$ a2x -f epub --verbose mydoc.asciidoc
$ kindlegen mydoc.epub

mydoc.mobiファイルができたら、このファイルをUSBまたはメールKindleに送り込みます。こうやってKindleに入れた文書を表示したのが下のイメージです。

今日はここまで。

EBookDroidからブックマークを取り出す方法

自宅の技術書を自炊してNexus 10で読んでいます。お気に入りのPDF ReaderはEBookDroidです。これは表示が軽快ですし、PDFファイルの余白を自動的に取り除いて表示してくれ機能(Crop pages)があるので、自炊したPDFを読むのに重宝しています。

私は紙の本を読むときには赤ペンでアンダーラインや余白にメモを書く派なので、電子の本でも読みながらノートをとりたくて仕方ないのですが、EBookDroidにはブックマークはできてもノートを記録する機能がありません。そこで、ノートの代わりにEBookDroidブックマークのタイトルをメモ代わりに使っています。以下は「ドメイン駆動設計」のブックマークを表示させたところです。

たくさんブックマークを記録するとそれをファイルに落としたくなります。EBookDroidのアプリ設定ファイルは、私のタブレットの/storage/emulated/0/.org.ebookdorid/backupsの下にAUTO.20130420.163904.jsoのようなAUTO.*.jsoという形式のファイルとしてバックアップが格納されていましたので、そこからブックマークを抜きだすことにします。このファイルの内容のブックマーク部分を抜粋すると以下のようになります。

     "books": [
        {
          "exposure": 100,
          "splitPages": false,
          "offsetY": 0,
          "animationType": "SLIDER2",
          "offsetX": 0,
          "zoom": 100,
          "lastUpdated": 1366443265155,
          "autoLevels": false,
          "nightMode": false,
          "pageAlign": "AUTO",
          "contrast": 100,
          "bookmarks": [
            {
              "offsetY": 0,
              "page": {
                "docIndex": 48,
                "viewIndex": 48
              },
              "offsetX": 0,
              "name": "モデルは情報を体系化するためのツール"
            },
            {
              "offsetY": 0,
              "page": {
                "docIndex": 49,
                "viewIndex": 49
              },
              "offsetX": 0,
              "name": "コードは納品されても知識はついてこない"
            },

眺めてみると各ブックマークの名前は"name":の行に書かれているようなのでその行だけを抜き出してみます。

cat AUTO.20130420.163904.jso | grep "\"name\":" | awk -F":" '{print $2}'
 "Waterfallの問題"
 "モデルは情報を体系化するためのツール"
 "コードは納品されても知識はついてこない"
 "UMLは概念の意味を伝えられない"
 "オブジェクト指向のブレークスルーはソフトウエアがモデルを表現するとき"
 "モデル駆動はただ一つのモデルを使う"
 "ソフトウエア開発はすべてが設計"
 "コードを変更するとモデルも変わる"

こうやってブックマークの名前を集めてみると、それは単なるブックマークというだけでなく自分が本を読んで得ることができた「エッセンス」になります。なんでこんな面倒なことをするの?っていう声が聞こえそうですが、それができるのは本自身に魅力があるからです。

『なるほど!ザ・Weld』引越ししました

ご連絡が遅くなりましたが、Tanoseamブログ『なるほど!ザ・Weld』をhttp://tanoseam.wordpress.com に引っ越しました。お手数ですが、ブックマークの変更をお願いいたします。

尚、先ほど、このブログにSeamプロジェクトからの発表の全文訳を公開しましたので、是非ご覧ください。

Tanoseamブログ開始しました

Seam/Weldに関するトピックについてはTanoseamとして別のブログに書くことにしました。Tanoseamは「Seamを楽しーむ」から来ています(ほとんど、発想は「楽しんご
」と同じですね)。よろしくお願いします。

Porting the ViewScoped JSF annotation to CDI;

この 記事は、CDI (Contexts and Dependency Injection)のportable extension SPIを使ってViewScopedというスコープを追加する方法を説明しています。

CDI仕様では次の4種類のスコープを提供しています。

  • @RequestScoped
  • @SessionScoped
  • @ApplicationScoped
  • @ConversationScoped

Seamでは、これらに加えてPageスコープとBusiness Processスコープを提供していましたが、CDIではこれらは標準のスコープとしては定義されていません。なぜなら、PageスコープはJSFに依存しますし、Business ProcessスコープはjBPMに依存するからです。このような個別のテクノロジーに依存するスコープはSPIによってコンテキストを追加することができます。実際、Seam3ではこれらはCDI上の拡張モジュールとして提供される予定です。

さて、ViewScopedの記事に戻って拡張モジュールの実装を確認してみると、独自のスコープを追加するためのportable extentionモジュールは次のようになっています:

public class ViewContextExtension implements Extension{

    public void afterBeanDiscovery(@Observes AfterBeanDiscovery event, BeanManager manager) {
        event.addContext(new ViewContext());
    }
}

このViewContextExtentionはCDIコンテナからのAfterBeanDiscoveryイベントを受けて、ViewContextコンテキストを登録します(AfterBeanDiscoveryはCDIコンテナの起動時に発行されるイベントの一つです)もちろん、ViewScopedというアノテーションやViewContextというコンテキストは定義する必要がありますが、CDIコンテナに登録するためのコードは上の部分だけになります。そう、この記事からわかることは、CDIのコンテキストは簡単に拡張できるということです。後は、アイディア次第。

Porting the ViewScoped JSF annotation to CDI

この 記事は、CDI (Contexts and Dependency Injection)のportable extension SPIを使ってViewScopedというスコープを追加する方法を説明しています。

CDI仕様では次の4種類のスコープを提供しています。

  • @RequestScoped
  • @SessionScoped
  • @ApplicationScoped
  • @ConversationScoped

Seamでは、これらに加えてPageスコープとBusiness Processスコープを提供していましたが、CDIではこれらは標準のスコープとしては定義されていません。なぜなら、PageスコープはJSFに依存しますし、Business ProcessスコープはjBPMに依存するからです。このような個別のテクノロジーに依存するスコープはSPIによってコンテキストを追加することができます。実際、Seam3ではこれらはCDI上の拡張モジュールとして提供される予定です。

さて、ViewScopedの記事に戻って拡張モジュールの実装を確認してみると、独自のスコープを追加するためのportable extentionモジュールは次のようになっています:

public class ViewContextExtension implements Extension{

    public void afterBeanDiscovery(@Observes AfterBeanDiscovery event, BeanManager manager) {
        event.addContext(new ViewContext());
    }
}

このViewContextExtentionはCDIコンテナからのAfterBeanDiscoveryイベントを受けて、ViewContextコンテキストを登録します(AfterBeanDiscoveryはCDIコンテナの起動時に発行されるイベントの一つです)もちろん、ViewScopedというアノテーションやViewContextというコンテキストは定義する必要がありますが、CDIコンテナに登録するためのコードは上の部分だけになります。そう、この記事からわかることは、CDIのコンテキストは簡単に拡張できるということです。後は、アイディア次第。