2015年2月8日日曜日

「伽藍とバザール」

オープンソース開発への賛歌

伽藍とバザール」は、ソフトウェア開発における中央集権的手法と、「民主的」なオープンソースによる自発的改良を対比させて論じた有名な論文である。前者が伽藍、後者がバザールに例えられた。要するにWindowsに対するLinuxの優位性を主張したものとみなしてよい。この論文が発表された1997年は、Windows 95が発売されて間もない頃である。Windowsにも不具合が多くあった。定期的にPCを再起動しないと次第に挙動不審に陥るというのはよく知られた事実で、その点、(何だかんだ言っても結局)コマンドラインでの操作を基本とするLinuxの安定性が勝っていたのは確かである。しかもLinuxの配布パッケージのほとんどは、それまでに蓄積された膨大なオープンソースのソフトウェアを最初から含んでいたから、ソフトウェアの品揃えの豊富さの観点でも魅力的だった。

天才の書いたソフトウェア

Latexも、ほとんどのLinuxの配布パッケージに含まれていたソフトウェアである。Latex(ラテック)は、理工系で大学院まで進んだ人なら誰でも知っている組版ソフトウェアだ。当時も今も、論文を書いて投稿するための必須ツールである。組版というのは印刷用語で、論文(または本)の見栄えを、そのまま印刷して出版できるように整えることを指す。昔は、原稿用紙に手書きで書かれた原稿を元に必要な活字を探し、活字を集めてひとそろえにして、ページごとにどの部分を字にしてどの部分を図にするかなどを人手で決めていた。それは何人もの職人が必要な作業であり、出版社と、出版技術を内製化した新聞社が情報発信の権利をいわば独占してきたこともうなづけることだ。

しかし複数の人の手を経る分、そこに間違いの混入を避けることはできない。複雑な数式の組版は特に難しい。誤植の可能性もさることながら、数式の記号の間隔などの微調整は、著者以外では理解するのが難しい。Latexは、その手間を嫌ったドナルド・クヌースというアルゴリズム研究の大家が余暇を使って(!)開発したものである。

Latexがあれば、著者の側で原稿書きから、印刷前の最終工程である組版まで一気に作業ができる。Latexの規約に従い適当なエディタで原稿を書いて、Latexを使ってポストスクリプトという形式に原稿を変換する。ポストスクリプトはpdfの前身となった電子ドキュメントの形式である。現代のpdf同様、組版まで著者側でやられていれば、後は単に印刷をして製本するという単純作業が残るだけである。

市民革命としてのLatex

「伽藍とバザール」で非難されたマイクロソフトも、ワードというソフトウェアで、そのまま印刷できる質の文書を作ることができると宣伝していた。Latexのように手打ちでコマンドを入れるより敷居が低いのは確かだが、図を入れる際の柔軟性、章・文献・図番号などの参照機能の不安定さなど非常に問題が多く、学術出版にはまったく適さなかった。数式を含む論文を組版するのはWebページを作るよりはるかに難しい。HTMLの手組みを追放するようなわけには行かなかったのである。

大げさに言えば、Latexは、情報発信を市井の人々の側に取り戻すいわば革命運動という側面を持っていた。Linuxも同様である。独裁国家マイクロソフトに対応する、市民からなる義勇軍。知的創造の成果は誰にでも無償で開放される。私企業の欲望に基づく独占も秘匿もそこにはない。1990年代の後半、ソフトウェアの質でも幅でも、LinuxはWidowsをしのいでいると思われた。Latexで組版された文書の美しさは驚異的で、最初に自分の論文をLatexで印刷してみたとき、その美しさにしばし恍惚となったものである。ワードに対するLatexの圧倒的な優位性は明らかだった。アカデミアでは人々は、義勇軍による独裁国家の打倒を心から願ったものである。

20年後の風景

前置きが長くなった。語りたかったことは、エリック・レイモンドが理想の情熱に燃えて表記の論文を書いた時から18年経った今、われわれが何を見ているかである。

一昨年、PC環境を変える必要に迫られ、Widows上でのLatex環境を新しくした。Windowsで日本語対応のLatex環境を作るにはw32texというページから必要な実行形式をダウンロードすればよい。それを自動化したインストーラーも作られている。秀丸という軽快なテキストエディタ用のマクロもある。これらが無料で使えるというのはありがたい限りだ(秀丸は有償)。しかし2013年にダウンロードしたw32texから、図を含んだ原稿がうまく組版できなくなった。私はその頃、日本語で本を書き始めていたから、これは大問題だった。

合計するとおそらく丸一週間くらいかけて、日本語と英語のあらゆるページを調べたが、結局問題は解決できなかった。同様な問題は報告されていたのだが、玄人と目される人たちのページには解決策がなかった。玄人風のコメントを書く人々も、実は隅から隅までわかっている人はほとんどおらず、dvioutの開発者である大島氏とかw32texの管理者である角藤氏、あるいは祝鳥開発者の阿部氏といった一部のスーパースターを除けば、ちょっとやってできたことを自慢げに一般化して書いているだけで、「理解する」ということについての知的な基準が相当低いのだろうと感じざるを得なかった。

革命成らず

そして思った。これは20年前とまったく同じだと。特定の環境、たとえば、英語「だけ」しか使わない前提で作られた配布パッケージの、想定の中「だけ」で原稿を書く場合ならいいが、日本語を使ったり、非標準的なことをやろうとすると途端に問題にぶつかり、ソースコードを読むような趣味人は別として、一般人には問題を解決する手段もない。ワードがLatexをいまだに超えられてないのは確かだが、Latexにしてももともとのクヌースの天才に依拠しているだけだとも言える。

エリック・レイモンドは、伽藍には独占と不自由を、バザールには多様性と自由を見た。しかし皮肉なことに、この20年間で「バザール」側が生み出したものは、ヘレンフォークの世界における利便性と、それに同化できぬ日本のような国における大いなる停滞であった。私はむしろ「伽藍」の側に、多様性を保証するための精緻な配慮を見る。外国で買ったWindows PhoneやiPhoneにおいて、日本語化などは数秒の作業でしかない。かつて『伽藍とバザール』に知的興奮を覚えた者としてあえて言おう。20年前と同じ不便を利用者に強いるのは開発側の傲慢だ。それが無料奉仕の作業である以上、それはやむを得ないかもしれない。しかし少なくとも、伽藍に対する優位性を主張した最初の理想は完全に敗北したと言ってよい。



付録: Windows 7環境でのLatexの設定

その後1年半たち、当時の問題に立ち返る機会があった。Widows 7 64bit English(で日本語を使えるように設定した)環境の前提であるが、結論から言えば次の通りになる。

  1. 日本語を使って図を入れた原稿を作る場合、w32tex環境をインストール、秀丸+祝鳥で原稿を書き、EPSで図を作成、グラフィックドライバの指定を明示的に行った上でdvi出力、dvioutでプレビュー、最後に dvipdfmx でpdfに変換、という手順がほぼ唯一の選択肢。
    1. dvioutには問題がある。うまく行くかは運次第。だましだまし使うしかない。下記参照。
    2. グラフィックドライバについては下記参照。
    3. EPSでの図の作成は、R (またはRStudio)等のEPSを標準で出力できる環境で図を描くことになる。説明図などは、EPSエクスポート可能でWindows上で動くドロー系のソフトを手に入れるしかない(InkScapeなど)。
    4. 業務上おそらく使っているであろうPowerPointの図の流用をしたい場合は頭が痛い。Windows 7までは wmf2eps で変換可能であるが、Windows 8ではwmf2epsが動かないので、EPSを出力する手段は乏しい。PowerPoint 2010を使い、1ページにひとつ図を描いてpdfで出力、という方法になろう。
  2. 英語の原稿を書く場合、MikTexをインストール、Texworksなり秀丸なり任意のエディタで原稿執筆、pdfで図を作成、pdflatexによりpdfプレビュー。
    1. ACMのスタイルファイルとw32texは相性問題がある。運がよければ動くようだが私の環境ではフォント問題が生じてまともに動かなかった。
    2. 図はepsでもかまわないが、直接pdfにするのがよい。
    3. 図の余白切り取りに関する日本語の解説は不可解なものが多いが、下記のように実行できる。
※付記。pdflatexで作ったpdfは、IEEEのPDF eXpressのフォントチェックが通らない場合に対策の余地が限られるのでやめたほうがいい。pdfの図はPDF eXpressでのpdf生成ができない。また、dviを生成しないとPDF eXpressに渡せない。結局、図はepsで用意、\usepackage[dvips]{graphicx}を指定してdviを生成するしかなさそうだ。この場合、私の環境では、dviの図がずれてまともにプレビューができないが、psファイルは正しく生成されるので、PDF eXpressに送ると正しいpdfを得られる。 

日本語を使いたい場合課題山積で、Latexは一般人が使える状態にないといわざるを得ない。こちらの方が言うとおり、インストール自体が趣味な人は別として、99%の人には、インストールされた道具を使って行う仕事が問題なのだ。インストールだけにこれだけの労力を使わないとならない道具は道具として失格だろう。にもかかわらずあたかもLatexに問題がないように言い募る輩は、他人を陥れることをなんとも思わぬ人間か、単に頭が悪いだけろう。

詳細を書いておく。

  • 図の出力に関するいくつかのパッケージには、暗にグラフィックドライバに依存性を持つものがある。長らく日本語環境でのpdf生成に推奨されてきたdvipdfmx(dviをpdfに変換するプログラム)、colorがそれである。
  • そのようなものは、冒頭部にある \usepackage{graphicx} を削除して usepackage[dvipdfmx]{graphicx} と、ドライバを明示的に指定して書く必要がある。colorも同様。
    • 複数のパッケージにドライバ依存性があるが詳細が不明なときは、冒頭の\documentclssに、\documentclass[xxx,xxx,dvipdfmx]{xxx} のような形で、入れるのが安全。その場合、ただしこれによりdvipdfmxは動くが今度はdviファイルに異常が出る、ということがある。
    • なお、 dvioutを使う場合、\usepackage[dviout]{graphicx} を指定する流派もあるらしい。
  • 最近世界標準になりつつあるTexworksというエディタ兼コンパイル環境は日本語の扱いに難がある。文字コードをひとつ固定しないとならないが、うっかり別のエンコーディングがされたファイルを開くと中身が壊れ、コンパイルが通らなくなる。たとえばbibファイルに日本語文献をうっかり混ぜてしまった場合など。エンコーディングの自動判別機能が優れた秀丸がよい。
  • 長らく標準的なプレビューアーとして君臨してきたdvioutは今や非推奨。実際、w32tex環境だとフォントに問題が生じた。回避策はこちらの通り、TEXMFMAINという環境変数を設定すること。c:\usr\local\share\texmf-dist のように。
  • 日本語を使わない場合、図をpdfで用意した上でpdflatexでtex元原稿から直接pdfを生成するのが速い。しかし残念ながら、pdflatexは標準では日本語が使えない。回避策もあるようだが一般人向けではない。
  • しかし英語だけでも、w32tex環境でのコンパイルには難がある(執筆時点・私の環境では)。計算機科学の分野の最大の学会であるACMのLatexフォーマット(sig-alternate.cls および acm_proc_article-sp.cls )では正しくフォントが表示できない。ベクターフォントにならずビットマップのぎざぎざフォントになる、\textit等のコマンドが無視されるなどの問題がある。投稿できる品質ではなく、これは深刻な問題。
  • 英語だけしか使わない場合、w32tex環境とは別に、MikTexを丸ごと導入し、Texworksでコンパイルすることで、sig-alternate.cls および acm_proc_article-sp.cls の問題が回避される。
    • TexLiveは試していないが、MikTex同様動作する可能性が高い。
  • 上記のように、ドライバを明示的に指定すれば、日本語・EPS図貼り込みの原稿であっても、dviを経由してpdfに正しく変換できるが、当然ながら遅い。
  • したがって、数10ページを超えるような原稿のプレビューには現実的ではない。pdflatexが日本語非対応である以上、現時点で最善のプレビューの方法はdviしかない。そして、日本語対応を考えると dvioutしか選択肢がない。
  • \usepackage{graphicx}により、EPS、PNGなどに加えてpdfの図を読めるようになる。ただし、余白の扱いがEPSとpdfでは違う。書式はここにあるとおり、次のようになる。trimは左から反時計回りに、左、下、右、上で指定。余白を除去したいときはclipをつけるのを忘れずに。
    • \includegraphics[trim = 10mm 80mm 20mm 5mm, clip, width=3cm]{chick}
  • なお、英語環境でpdflatexを使う場合、図がEPSであってもかまわない。初回実行時に(\usepackage{epstopdf}があれば?)pdfに変換される。