LaTeX

実に数年ぶりに、そしてプロのエンジニアになってからはじめて LaTeX をまじめに使って、いろいろ思うところがあったので書き残すことにした。はじめは Google+ に書こうかと思ったが、長くなりそうなので、たまにはブログを使うことにする。

デフォルトがだめ

とりあえずデフォルトのクラスファイルを使って、数式は $...$ と書きます、$$...$$ と書けば別行立てになります((〔05/04 追記〕 id:abenori のコメントにもあるように、正しくは LaTeX では \[...\] を使う。$$...$$TeX のプリミティブであるため LaTeX の追加機能との整合性をとることができない、というのが理由である。ちなみに \[...\]$$...$$ の簡単なラッパーとして定義されている。また、amsmath を読み込むと \[...\] は equation* の短縮記法として再定義される。ここにもバッドノウハウは存在する。))、節を始めるには \section と書きます、…、といった具合に、テキストに言われるがままに文書を作ると、まあ確かにきれいな数式は出てくるけれども、こんなに苦労してこんなものか、という程度の組版結果にしかならない。

残念ながら、デフォルトに頼っているようでは、(La)TeX の真の実力を引き出せない。

デフォルトのクラスファイルたる jarticle は、もともと欧文用に作られたクラスファイルをもとに作られており、日本語向けに十分にチューニングされていない。代わりに jsarticle を使ったほうがよい。

日本語のフォントメトリックにしたって、いわゆる mingoth は捨て仮名*1が連続したとき(e.g. チェック)の扱いがまずい、句読点括弧のメトリックが少しおかしい、などの問題があるので、代わりに jis.tfm を使うのが定番である(ちなみに jsarticle ではそれがデフォルトになっている)。

数式も、標準の eqnarray 環境はいろいろとイケてないため、代わりに amsmath で定義されている環境たちを使うことが半ば常識になっている。

デフォルトのフォントである Computer Modern はそれほど悪いフォントではないが(これをフォントデザイナーでもない数学者が作ったのは驚くべきことである)、今どきは (La)TeX であっても Times/Helvetica で組むほうが主流であるし、より美しい結果が得られる。最近だと newtx パッケージを使うのがよいらしい。

と、まあ、見てのとおり、(La)TeXバッドノウハウの巣窟である。(La)TeX があちこちで嫌われるのも無理はない。

ページの分割が微妙

TeX組版結果が紙に印刷されることを前提として作られたシステムなので、適当なところで自動的にページを分割してくれるメカニズムが組み込まれている。それはそれで非常によいのだが、実際には微妙な位置でページが分割されてしまうケースも少なくなく、時には \newpage に頼らざるを得ないこともある。

まあ、これに関しては、いわゆるワードプロセッサ(e.g. MS Word)でもページの分割位置を手動で調整するような場面はよくあるので、ある程度は仕方がない側面もある。とはいえ、LaTeX は見た目と論理構造の分離を謳っている*2ことを考えると少々残念な点である。

手間暇さえかければ

とはいえ、手間暇さえ惜しまなければ、素人でも非常に美しい組版結果を得られる。僕が学生時代に (La)TeX にのめりこんでいた理由はここにある。

TeX のマクロがチューリング完全であることはソフトウェアとして必ずしもよいことではないが、柔軟性を与えていることは確かであり、適切に利用することで「本文には論理構造だけを記述する」といったことすら可能になる。そもそも LaTeX はその観点から作られた TeX の拡張である。実際のところは LaTeX だけではやや不十分で、自分でマクロを作ったり上書きしたりして調節することになるが、それでも「ハック」を本文の外側に追いやることはできるので、その点はとても気分がよい。

結論

少なくとも、万人に薦められるソフトウェアではない。

論文記述は LaTeX 以外に考えられないとして、理系の研究室に所属した学生たちは一様に LaTeX の使用を強制されるという現実があるが、これに対してはかなり前から反論している。LaTeX を使うべき根拠として、数式の存在、相互参照の機能などが根拠とされることが多いが、MS Word だって 2007 以降のバージョンでは数式の扱いが相当強化されているし、相互参照の機能はもっと昔から存在する。正直なところ、WYSIWYG でないものが苦手な学生には、MS Word あたりで卒業論文を書かせたほうが効率がよいのではないだろうか。少なくとも工学部では。

しかし、手間暇さえかければ美しい文書が作れるし、テキスト形式であるがゆえにバージョン管理との相性がよいという側面も存在する。これらの点に魅力を感じるならば、LaTeX はけして忌避されるべきソフトウェアではない。

*1:いわゆる小書き文字のこと。

*2:よく勘違いされるが、生の TeX では見た目と論理構造は分離されていない。

ボットネットの有効活用

 ボットネットといえば一時期はスパムメールの送信で勢力を振るっていたが、最近はスパムメールを取り巻く環境の変化から苦境に立たされており、そのためボットネットの新たな活用方法の道を模索する動きが広がっている。

  (中略)

 ある団体では、スパムメールの送信には見切りをつけ、ビッグデータの処理基盤としてボットネットを活用しようとしている。先にも説明したように、ボットネットには、司令塔となるコンピュータから指令を受け取ったり、乗っ取ったコンピュータから抜き取った情報を特定のホストに送信したりする機構がすでに存在する。この団体では、これらの機構を応用して、処理するデータの受け渡しができるようにした。また、高度なステルス技術を生かすとともに、なるべくユーザーがコンピュータを操作していないときにデータの処理を行うよう工夫しているため、ユーザーがプログラムの存在に気づくことはまずないという。

 ストレージに関しては、現在は個々のコンピュータのローカルディスクに頼っているとのことだが、将来的には、対象のコンピュータが初期化されても問題ないよう、DropboxGoogle ドライブMicrosoft OneDrive などといったクラウドストレージの活用も検討しているという。

最近のボットネット事情

まあ、なんというか、とんでもない時代になったものだ。

ICFPC 2013

今年度は @cocodrips と @buno_y と合計 3 人で参戦した。(記憶が正しければ)人生初の男女混成チームである。

ソースコード -- github.com (08/14) | bitbucket.org (08/13)

08/09

  • [09:00] ハングアウトで @buno_y と初対面。問題を読み始める。
  • [10:30] さすがにハングアウトではつらいということで @buno_y の家に集まることを決意する。
  • [12:00] @yuizumi_y5i が @buno_y の家に到着。電車内で Microsoft Research の論文を読んで概略は理解するが、そのアイデアを活用することはとうとうなかった。
  • [13:00] サイスが 3〜5 程度ならばパターンをハードコードできることに気がつく。tfold の意味を理解して、サイズが 8 とかならばパターンを(ry)。
  • [16:30] 各々が Expression を実装する。双方に一長一短ありそうな感じだったが @yuizumi_y5i の実装を採用することを決める。
  • [21:30] ついに 1 点を獲得する。ちなみにこの 1 点が我々の lighting division における唯一の得点である。
  • [22:00] @cocodrips と連絡がつく。翌日以降の会場確認も兼ねて @cocodrips の家に向かう。
  • [22:30] 無事に合流する。問題の内容とチームの状況を @cocodrips に説明する。
  • [23:00] ある理由により @cocodrips のボルテージが著しく上昇する。
  • [23:45] 解散。@yuizumi_y5i はまさかの終電での帰宅。ちなみにこの日は金曜日である。*1

08/10

  • [??:??] @buno_y が @cocodrips の家に到着。サイズが 4 のためのコードを記述する。後に @yuizumi_y5i によりリファクタリングまでされたが実戦投入はされなかった。
  • [11:00] @yuizumi_y5i が @cocodrips の家に到着。
  • [12:30] 昼食をとる。
  • [17:00] @yuizumi_y5i が(理論上は)サイズに依存しない全探索のコードを書き上げる。もっとも、あとから考えると意味のない構造を作っていたり、メモリをじゃぶじゃぶ消費したりと、かなりの問題作である。
  • [19:45] 夕食の弁当を食べながら全探索のコードを実戦投入する。ようやくまとまった点数が入り始める。
  • [21:00] @buno_y が戦線離脱。
  • [22:30] @cocodrips が mismatch のエラーケースを考慮に入れるためのコードを追加する。
  • [23:00] @yuizumi_y5i が戦線離脱。

08/11

  • [10:00] @yuizumi_y5i が @cocodrips の家に到着。あまりの日差しの強さに、その昔「ところで、今日は日差しがきつくてとても暑い。そのため、日なたをあまり歩きたくない。」という文言の問題を作ったことを思い出す。*2
  • [11:30] @buno_y が @cocodrips の家に到着。
  • [13:00] @buno_y が size の値が大きい問題を小さなプログラムで解けないか試し始める。ある程度は解けるが予想されるロスもそれなりに大きそうである。
  • [14:30] @cocodrips が全探索で行けるぎりぎりの条件を見極めながら少しずつ未解答問題を回収しはじめる。
  • [16:30] Unable to decide equality という謎のエラーを食らう。
  • [18:30] @yuizumi_y5i が焼きなまし法*3に基づくコードを書き上げる。ただし fold/tfold に対応していない。
  • [18:45] 焼きなまし法のコードがそれまでの手法とは比べものにならないほど強力なことがわかる。
  • [20:00] 焼きなまし法のコードが tfold に対応する。fold はまだ。
  • [21:00] 遅い夕食をとる。
  • [21:45] 「おお、涼しい。」しかし、都心は 1 分たりとも 30 ℃を下回らなかったらしい。コンテストの疲れは我々の温度感覚すらも麻痺させていた。
  • [22:00] 焼きなまし法のプログラムをついに実戦投入。300点台前半からの巻き返しが始まる。
  • [22:30] @cocodrips「みんなで監視しましょうよ。」この時点で @buno_y と @yuizumi_y5i の朝帰りが確定する。
  • [23:00] 実戦投入中も焼きなましのプログラムが少しずつ改良される。

08/12

  • [00:00] @yuizumi_y5i が参戦記を書き始める。しかし途中で力尽きる。
  • [00:45] 人力並列化が始まる。MapReduce というよりはただの多重実行といったほうが正しい。
  • [01:15] やたら長いプログラムが生成され受理される。
(lambda (x) (fold x 0 (lambda (y z) (if0 (or (xor 0 (xor z x)) (and 1 x)) (and (or (shl1 x) (and (not 1) (not y))) (or 0 x)) (if0 (and (xor (and (or y (or x (not (if0 0 0 z)))) (xor 1 z)) (shl1 y)) (xor (if0 (shl1 (xor z (and z y))) y 1) z)) (or z (not (not y))) (and z (xor 0 z)))))))
  • [02:00] だんだん徹夜特有の体力勝負的様相を呈し始める。
  • [03:30] @buno_y が焼きなまし法のコードを fold に対応させる。
  • [06:45] @cocodrips がインターンに参加すべく京都に旅立つ。タフすぎる。
  • [07:00] 残りの 2 時間を走り切るため @buno_y の家に移る。
  • [08:00] fold/bonus のない問題の処理が終わる(かなりの正答率だが全部に正答したわけではない)。
  • [09:00] 時間切れ。fold のついた問題は全部を処理しきれず。bonus のついた問題にはとうとう手が回らなかった。

*1:もっとも車内はそれほど混んではいなかった。

*2:某会主催の2007年度夏合宿の Day 3 で Problem G として出題されている。

*3:パラメータの設定が初心者すぎて、焼きなまし法というよりは再出発つきの山登り法に近くなっている。

一票の格差

【山本孝興】「一票の格差」が最大で2・43倍となった昨年12月の衆院選をめぐり、弁護士グループが「法の下の平等を定めた憲法に違反する」として選挙の無効(やり直し)を求めた訴訟で、広島高裁(筏津〈いかだつ〉順子裁判長)は25日、広島1、2区について「違憲で無効」とする判決を言い渡した。弁護士らが1962年に始めた一票の格差訴訟で、無効判決が出たのは全国で初めて。
昨年の衆院選は無効 一票の格差訴訟で初判断 広島高裁

最近,この「一票の格差」というものに首をかしげている.

一票の重みを等しくすれば形式的には平等になるのだが,代わりに代議士の選出が人がたくさんいる箇所にえらく偏るという問題が起こる.wikipedia:都道府県の人口一覧の数値をもとに計算すると,上位 9 県(東京,神奈川,大阪,愛知,埼玉,千葉,兵庫,北海道,福岡)だけで日本の人口の過半数を占める.一票の重みが等しくなれば,代議士の数はだいたい人口(正確には有権者数)に比例するはずなので,例の 9 県から選出された代議士だけで議会の過半数に届くようになる.ということは,極端にいえば,その 9 県の人たちさえ納得すれば残りの 38 県の人たちはどうでもよい,という状態になりえる.まあ,これだと議論がちょっと雑すぎるかもしれないが,何にせよ実質的にはかなり不平等にみえる.

ちなみに,私が現在住んでいるところは一票の価値が最低にほど近い.

辻褄が合わない

芸能人が、落札していない商品を落札したかのようにブログに書き込んだ件について、アメーバブログを運営するサイバーエージェントは13日、今年2月に健全化の対策をとっていたと説明した。
詐欺オク…防止策ない アメブロ運営会社

そもそも件のペニーオークションの記事は 2010 年 12 月,実に 2 年も前のものである.「今年2月から健全化の対策をとっている」とするのが妥当.

WUPC の私的解説

550 点しかとれなかった分際で解法の説明をするのはいかがなものかという気はするが,参考にしてくれる人がいるかもしれないので,簡単に解説しておこうと思う.

問題はこちら.コードについては前の記事にリンクがあるので,必要であればそちらを参照いただきたい.

続きを読む