おがさわらなるひこのオープンソースとかプログラミングとか印刷技術とか

おがさわらなるひこ @naru0ga が技術系で興味を持ったりなんだりしたことをたまーに書くブログです。最近はてなダイアリー放置しすぎて記事書くたびにはてな記法忘れるのではてなブログに移行しました。

クリエイティブ・コモンズ・ライセンス
特に断りがない場合は、本ブログの筆者によるコンテンツは クリエイティブ・コモンズ 表示 - 継承 4.0 国際 ライセンスの下に提供されています。

OpenDocument Format(ODF)の標準化について雑な補足説明

https://blog.documentfoundation.org/wp-content/uploads/2018/09/odf-community.jpg

この記事は、先日TDF Blogで公開された記事「ODF 1.3 approved as OASIS Committee Specification」(日本語訳「ODF 1.3、OASIS委員会の標準として承認」)の補足説明的ななにかです。

ほんとうは、標準化とかそういう「きちんとした」世界についてなにかものを申すには、きちんと下調べをして裏付け取ってなるべく正確なものいいをすべきだと思うのですが、正直、「ちゃんとする」には現状気力体力が足りないため、他人様の受け売りその他で雑に述べます。なので眉につばをたっぷりつけてお読みくださいませ……。

じゃあなんでそういう雑な記事を書くかというと、ちょっとウェットな物言いをすると、標準化で提供しようとしている価値に対して色んな人が色んなことをしてくれているんだなあという私個人の感謝の気持ちをみなさんと共有できたらなあという動機です。

OpenDocument Formatとは

LibreOffice*1 のネイティブドキュメントフォーマットで、いわゆるオフィスアプリケーション向け文書のフォーマットです。通称ODF。ファイル名として「*.odt」とか「*.ods」とかなってるやつです。

jp.opendocumentformat.org

中身は概ねZIP圧縮されたXML(と、添付されたコンテンツ、たとえばビットマップなど)の塊です。

ODFの特徴は前掲サイトなどを見ていただくとして、一言で言ってしまえば、

真に相互運用することを考えたフォーマットであること

で、もう少し細かくいえば:

  • 人類でも読める程度の仕様
  • 人類にわかりやすく機械加工も容易な構造
  • 豊富な操作ライブラリ(参考サイト

あたりでしょうか。

ここで本来はODFについての説明をひとくさり書くべきで、というか実際ちょっと書きかけたのですが、わたしの理解が覚束なくて書き上げるのにそうとう時間がかかりそうなのと、あと長くなるので今回は割愛して裏付けのない雑な説明。

ODFを構成するXMLですが、見た目はこんな感じのやつですね。

<?xml version="1.0" encoding="UTF-8"?>
  〜略〜
  xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
  〜略〜
  office:version="1.2">
<office:scripts/>
〜略〜
<office:body>
    〜略〜
    <office:text>
        </text:sequence-decls>
        <text:p text:style-name="P1">
            <text:span text:style-name="T4">井神陽吉は風呂が好きだった。</text:span>
        </text:p>
        <text:p text:style-name="P1">
            <text:span text:style-name="T4">殊に、余り客の立て混こんでいない昼湯の、あの長閑な雰囲気は、彼の様に所在のない人間が、贅沢な眠から醒めたのちの体の惰気を、そのまま運んでゆくのに最も適した場所であった。</text:span>
    </office:text>
</office:body>
</office:document-content>

(テキストは海野十三「電気風呂の怪死事件」より。青空文庫リンク

XMLはHTMLとかと同じでタグで文書の構造を定義します。例えば <text:p> は、テキストであってさらに段落(ParagraphのP)であるということを意味するタグです。このような「どんなタグがあって、それがどんな意味を持つのか」が、ODFのようなXML文書の仕様を定義するってことです。

「どんなタグがあって」ってのがいわゆるスキーマ定義。XMLスキーマ定義をする方法にはいくつかあって、ODFの場合はRELAX NGというスキーマ定義言語を用いてます。

で、スキーマ定義はタグの定義だけじゃなくて、例えば同じ <text:p> を違う意味で使うXML文書と混在したりしたら困る。で、「ODFでは*2<text:p> タグはこういうふうに意味を決めるからね、というのを定義するのが名前空間というやつで、 xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" とか書いてるのがそれですよと。

もちろんスキーマ定義、名前空間だけじゃダメで、それぞれのタグの持つ意味も定義しないといけない。例えばODF 1.3の <text:p> タグの定義は:

The <text:p> element represents a paragraph, which is the basic unit of text in an OpenDocument file.

つまり段落を表す要素ですよと書いてあると。

ともかく、文書フォーマットとしてはスキーマと意味がそろってればよく、それにしたがってアプリケーションを実装すれば、異なるアプリケーションでも文書交換が可能で、相互運用可能になる……と、いうわけです*3

相互運用うんぬんについて補足すると、例えばODFにはODF Validator ってサービスがあって、これは適当なファイルを放り込むと、ODFのスキーマ定義ファイルに照らし合わせてODFの定義に従ってるかを判定してくれるサービスです。このバックにいるのはODF Toolkitってライブラリで、こいつは単なるODFの操作ライブラリではないさらに先を目指して開発されてる……とか。こういう取り組みがあることが、ODFが単なる「LibreOfficeのファイル形式をなりゆきで文書化しただけ」というもの以上を目指していることを示してると思います。

ODFが「国際標準」であるということ

大事なことはODFはLibreOffice専用のフォーマットでなければLibreOfficeコミュニティあるいはその支援を行う非営利組織The Document Foundation(TDF)のものではなくて、その他のアプリケーションも自由に使えるってことです。現にMicrosoft OfficeGoogleドキュメントもODFは扱えますし。

それを保証してるのが、ODFが「国際標準」であるということ。つまり、LibreOffice/TDFが手前勝手に仕様をどんどん変えていくのではなくて、オープンな場所で「標準」として仕様を管理して、それを公開して、色んな人が使えるようにするということです。

例えばHTMLがどんなブラウザでも正しく表示できるように、PNGがどんなビューアでも表示できるように。

でもそれって、LibreOfficeの進化を妨げるようなことはない?

でも、あれですよね、新しい機能を追加すると、当然その機能によって追加されたなにがしかをファイルに保存したくなるわけですよね。それがこれまでにあったXMLタグで表現できない場合は、タグをあらたに追加しないといけない。しかし、いちいち標準化団体にお伺いを立てないと新規にタグを追加できない……そんなことしてたらソフトウェアは進化できない。ですよね。

なので、ODFにはOpenDocument Extended Documentというやつがあって、要はODFの仕様に準じて、さらに独自のタグを追加できるよということ……だと私は理解してます。LibreOfficeの場合は loext というprefixがついたタグは独自拡張です。どんな独自拡張があるかはWikiに記録されてます。

で、当然ですが、「私たちはこういうふうに思ってこういう独自タグを定義したけど、それをODFの標準に入れてよ」という働きかけをするわけですね。ODF 1.3は、そういう取組みであらたにタグが定義されましたと。

なので、ODF1.2には存在しなくて、でもLibreOfficeには存在して、ODF 1.3で追加されたものは、ODF 1.3に対応したLibreOffice、つまりLibreOffice 6.4のさらに次のリリースでは、独自タグからODF 1.3で定義されたものに移行されるはずです。

こうやって、アプリケーションと標準が共に進化をしていくよというのが、ODFが「正しく」標準であるということ、だと思います。

具体的にODF 1.3って何が変わったの? という人は、「Open Document Format for Office Applications (OpenDocument) Version 1.3. Part 3: OpenDocument Schema」の「Appendix G Changes From ODF 1.2 (Non Normative) 」を参照してくだされ。

ODFとOASIS、ISO、JIS

ODFの仕様は、OASISという標準化団体で策定されています。

www.oasis-open.org

前述のように標準化とかについては私ぜんぜん詳しくないのでアレなんですが、もともとOASISSGML関係の標準化とかをやってたSGML-Openという団体が元で、SGMLからXMLを含んだ形で活動を広げるためにOASISって名前になったんだそうな。Wikipediaより。たぶん富士通さんのワープロとは関係がないです。ODF以外だとCMISとかDocBookの標準化が有名かしら。

で、OASISに限らないですが、標準化団体というのはそれぞれの標準に対して技術委員会(Technical Committee)というのがあって、個別の標準はそこで議論され策定されていくということになってるらしい。で、ODFについてのTCが Open Document Format for Office Applications (OpenDocument) TCです。で、そこで「こいつは標準文書とするよ」というプロセスに従って定められた標準が「委員会標準」という……らしい。前述の記事の

OASISは、OpenDocument TC(技術委員会)からのOpen Document Format for Applications (OpenDocument) v1.3がOASIS委員会標準(OASIS Committee Specification)として承認された

っていうのはそういうことです。

前述のようにLibreOfficeがODFに対して独自に拡張した部分に対し、必要と思われるものはOASISに提案して仕様に取り込んでもらう努力をしております。その取り組みは前述のODF拡張のWikiページでも見られますし、また去年のLibreOffice Conferenceの資料なんかも参考になるかもしれないです。

また国際標準というとぱっと頭に浮かぶのはISOかと思いますが、

www.iso.org

ISOも必ずしも直接規格を議論するわけじゃなくて、ODFの場合だとOASISの委員会標準をISOの議論に乗せて、それを標準として策定する……ってプロセスを踏むっぽいです*4。ISOの場合は、TCの下にSub Committee(副委員会?)、さらにその下にワーキンググループがあって、ODFの場合はISO/IEC JTC 1/SC 34/WG 6ってワーキンググループで作業されてるらしい。ISO/IEC JTC 1が情報技術のTC、SC 34がドキュメント記述および処理言語(Document description and processing language)ですね。

でまあ、ODFはISO標準でもありますよ……と言われます。ISO/IEC 26300というのが規格番号で、現在の最新は ISO/IEC 26300-1:2015、ISO/IEC 26300-2:2015、ISO/IEC 26300-3:2015の三つで、これがODF v1.2という規格に対応してます。

いまのところ私が聞いてるところでは、今回ODF v1.3は今回の委員会標準化を経てISOのWGに議論が移され、2020年中の改定(ISO/IEC 26300-n:2020?)となる……んだと、思います。

なお、国内で規格といえばJISでございますが、残念ながらJISのODFについての規格JISX4401ってODFのバージョンでいえばv1.1の翻訳なんですよねえ……。なのでこれが早晩改定されるのは期待薄かも。

まとめ

ということでODFは真に相互運用可能であることを目指したオフィスアプリケーション向け文書フォーマットの国際標準なのです。ODFを選ぶことはLibreOfficeも含むあらゆるアプリケーションにロックインされないという意思決定なのです。大げさにいえば。

そんなわけでODF 1.3、OASIS委員会標準化おめでとうございます!

ISOの更新に向けてもがんばってください! Love! ODF!

おまけ:そうはいうけどOOXMLだって国際標準じゃんという人へ

ところで、OOXMLだって、標準化団体ECMA Internationalで定義され、ISO/IEC JTC 1/SC 34/WG 4*5 でISO/IEC 29500として標準化された国際標準です。じゃあODFなんてものよりOOXMLのほうがいいじゃん、って人もいるでしょう。この手の意見はTwitterなんかでしばしば見かけます。それに対して。

以下は、あくまでも私がLibOの人なので、他のLibOな人から聞いたことの受け売りのでバイアスありまくりです。本来はちゃんと自分で検証すべきですがしてません。そのつもりで、私が聞いたことを書いておくので信じる信じないはご自由にされてくださいませ。

  • OOXMLはMS Officeの文書フォーマットをあるがままに文書化したもので、構造化文書として再定義したものではない
  • 例えばWord、ExcelPowerPointでそれぞれ文書の構造が(ZIP展開したフォルダ構造からして)全然ちがう
  • これがOOXMLの仕様書のサイズが6000ページ超えと異常なボリュームになっていることの理由の一つ
  • OOXMLの各タグの意味はしばしば不明確でアプリケーション(つまりMS Office)の実動作を把握しないと実装できない
  • OOXMLには、ピュアXMLで記載できるStrictと、テキストエンコードしたバイナリを含むことができるTransitionalがあるが、MS OfficeですらStrictなOOXMLを正しく扱えない
  • OOXMLはMS Officeのバージョンアップで頻繁に仕様が更新されるが、ECMA/ISO標準になっているOOXMLはMS Office 2008相当なものだけ

最後のとか、ちょっと酷いと思うので、ECMAのサイトでEdition間の差分見たりしたのだけど、ちょっと判断がつかなかったので、もし勘違いなら訂正します。いちおう、私はそう聞きましたということで書いておきます。

あとだいぶ古い文書ですがOOXML批判の有名な文書にこちらがありますのでご一読をオススメ。

www.ibm.com

いずれにせよOOXMLは「ニセ標準」だ、という言い方をLibreOffice/ODF陣営はしばしば口にします。こういう物言いは日本だとあんまり好かれないし、自分も確証ないかぎり、言うとしても引用符に入れて、ですけどね……。

ホントはこういうのちゃんと裏とって、実際にニセ標準なのだとしたら、それを持って政府や自治体に「そんなニセ標準を使うのはやめろ」というのが、正しい市民としてのありかたなのだろうと思うのですが……無精ゆえに、こうして自分のブログに裏付けが甘い記事を書くだけにしておきます。すみません。

*1:もちろん、前身プロジェクトであるOpenOffice.org、およびその商標を受け継いだApache OpenOfficeも。

*2:厳密には「ODFのこの部分では」ですかね。

*3:もちろん、スキーマ定義と各タグの意味だけでは表現しきれない、アプリケーション仕様というのも、もちろんあります。

*4:すべてのWGで同様かどうかは、まったく存じません。

*5:お気づきと思いますが、ODFと同じSCでWGだけ異なります。