Vol.316 結城浩/春に言語を学ぶ/再発見の発想法/本の大手術/数学の応用問題への適切なアプローチ/

結城浩の「コミュニケーションの心がけ」2018年4月17日 Vol.316


はじめに

結城浩です。

いつも結城メルマガをご愛読ありがとうございます。

ついに『数学ガール/ポアンカレ予想』が刊行されました!

先週末からTwitterを見ていて、たくさんの(ほんとうにたくさんの)読者さんが「買いました」「ゲット!」「入手できました」「買いに行こう」と書いてくださっていて、ずっと感激していました。ありがとうございます。

アマゾンのランキングでも書籍全体で第92位まで上ったようで、読者さんの応援に心から感謝です。

その一方で、《サイン本》もほぼ同時に販売されたのですが、すぐに完売になった書店さんも多く、入手できずに悲しい思いをなさった方もいらっしゃるようです。数が少なくてたいへん申し訳ありません……

今回の『数学ガール/ポアンカレ予想』は6年ぶりの「数学ガール」シリーズの新刊。執筆にずいぶん長い時間がかかったので、刊行の喜びはひとしおです。どうか、この本を必要とする読者さんのところに無事に届きますように!

◆『数学ガール/ポアンカレ予想』
http://www.hyuki.com/girl/poincare.html


目次

  • はじめに
  • 目次
  • 「古今和歌集を読む」と古典の意味
  • Go言語で「結城メルマガ」の処理ツールを作る
  • 再発見の発想法 - ファイアーウォール
  • 大手術がうまくいったときに感じたこと - 本を書く心がけ
  • 数学の応用問題には、どうアプローチすればいいのか - 学ぶときの心がけ
  • おわりに

「古今和歌集を読む」と古典の意味

結城はnote(ノート)で「古今和歌集を読む」というマガジンを更新しています。

◆古今和歌集を読む
https://note.mu/hyuki/m/mfa4fe40c022b

このマガジンは、ぽつぽつと古今和歌集の現代語訳と文法解説をここ数年の趣味として書いているものです。いままでで50首くらい書いています。記憶力が弱って暗記はできないけど、とても楽しいですね。

こういう書き物をしていると、中学高校時代に学校で古文を学んでいてよかったなあとつくづく思います。基本的な活用や係り結びなどを知っているだけでもかなり読めますし、古語辞典を引くときの「あたり」もつけやすい。まったく学んでいなかったら、こんなことを始めようとすら思わなかったでしょうし。

母は短歌が好きでよく作っていました。祖母は古典の世界が好きで、百人一首なら家族の誰にも負けませんでした。その影響で孫の私も何首か暗記しています。その記憶のストックも役立っています。

結城の場合、個別の歌を暗記して古典に親しむのには家庭の影響が大きかったといえます。でも、古典の文法を暗記したのは学校で授業があったからですね。中学高校の暗記が、数十年後のいま、個人的な楽しみとして役立っています。こ・き・く・くる・くれ・こよ(こ)なんて、いまから暗記できません。あの頃それなりにちゃんと学んでいた自分に感謝したいです。

ところで、古今和歌集の歌をあれこれ散策していると、現代に通じる感覚がなんと多いのだろうと驚きます(だからこその古典なのですけれど)。最近は春の歌をいくつかピックアップしていました。

例えば、読人しらずのこんな歌があります。

◆春ごとに花の盛りはありなめど逢ひ見む事はいのちなりけり
https://mm.hyuki.net/n/n9d4f805fc3e4

「花ははかないと言われるけど、春が来るごとにしっかりと咲きます。でも人の方は?毎年咲く花を見ることができるのは人が生きているからこそ。命が尽きれば見ることはできません。花に出会うのは命しだいなのですね」という気持ち。そんな気持ちは、昔も今も変わりません。

あるいはこんな恋の歌があります。

◆逢ひ見ずは恋しきこともなからまし音にぞ人を聞くべかりける
https://mm.hyuki.net/n/n98ab2161ca55

「もしもあなたに逢わなかったならば、これほど恋しく思うこともなかったでしょうに。あなたのことはただの噂としてだけ聞くべきだったのでしょうねえ」という気持ち。「噂として聞くべきだった」というけれど、もちろん「もう逢いたくない」という気持ちではありません。相手が恋しくて、恋しくて「もっと逢いたい」と歌っているのです。

◆わが恋を人知るらめやしきたへの枕のみこそ知らば知るらめ
https://mm.hyuki.net/n/n41290a6fc016

「私の恋する気持ちをあの方は知っているでしょうか。いえいえ、知らないでしょう。私の枕だけが、知っているとしたら知っているでしょうね」という気持ち。私の枕だけが知っている、私の恋心。

人が心に抱く気持ちというものは、何百年前から変わりません。きっと何百年後も変わらないでしょう。それを描いてこその古典なのですね。

ところで、実は趣味として楽しんでいたこの世界を、今回の『数学ガール/ポアンカレ予想』ではちょっぴり生かすことができたんですよ。新刊のあちこちに顔を出しています。


Go言語で「結城メルマガ」の処理ツールを作る

春になると、新しいことを学びたくなります。そこで、Goというプログラミング言語を学んでみることにしました。春にNHK英語会話のテキストを買いにいく気分です。

◆The Go Programming Language
https://golang.org

最初はチュートリアル(A Tour of Go)を順番に読んでいたのですが、ある程度進んだところで「自分が実際に作るプログラムを作っちゃおう!」と考えました。

◆A Tour of Go
https://tour.golang.org/

◆A Tour of Go(日本語版)
https://go-tour-jp.appspot.com/

題材に選んだのはこの「結城メルマガ」を処理している自作ツール(mm-convert)です。これまでPerl言語で書いていたものをGo言語に「移植」しようと考えました。その理由は以下の通り。

  • 「結城メルマガ」で実際に使っているツールなので、実用的である。
  • すでにPerlで動くバージョンがあるので、もしもGoへの移植が失敗しても困ったことにはならない。
  • Perlで書いたプログラムも結城が自分で作ったので、どういう動きをしているかよくわかっている。
  • 分量もそれほど多くない(Perlで書かれたプログラムは447行)。

このような理由から、題材にぴったりだと思ったのです。

* * *

プログラムのあまり細かい話には踏み込みませんが、簡単に「結城メルマガ」のために作ったツール(mm-convert)の機能を書いておきます。

  • テキストファイルから、まぐまぐ!用のepubファイル、ニコニコチャンネル用のHTMLファイル、それにnote(ノート)用のHTMLファイルを生成する。
  • テキストファイルの中に画像のURLが書かれていたら、自動的に画像をダウンロードしてepub中に含める。
  • テキストファイルの中に矛盾した情報(Vol番号やファイル名など)が書かれていないかどうか、書式的におかしなことが書かれていないかをチェックする。

「結城メルマガ」はまぐまぐ!とニコニコチャンネルとnote(ノート)という三つの異なるプラットホームで配信しています。一つ一つのプラットホーム向けにファイルを整形していたら手間が掛かってしまいますので、そこを自動化するのがmm-convertの役目なのです。

実は今回の「結城メルマガ」から、Goで移植したバージョンを使って配信しています(なので、何か大きな不具合があったら教えてくださいね)。

◆「結城メルマガ」用のツール(mm-convert)

2018-04-16_tool.png

プログラムで自分用のツールを作るというとものすごく高度なことのようですが、mm-convertでやっていることは実は大したことはありません。というのは、

  • epubへの変換はpandocという別のプログラムを呼び出して行う。
  • HTMLへの変換もpandocという別のプログラムを呼び出して行う。
  • 画像のダウンロードはwgetという別のプログラムを呼び出して行う。

というように、難しくてややこしい部分はすべて「別のプログラム」におまかせしているからです。結城が自分で作ったものは、結城がふだん手書きするテキストファイルを入力として「別のプログラム」たちに必要な情報を与えるためのものなのです。

mm-convertが行っていることは、結城が手作業で行っていたことを「機械化」し「自動化」したものにすぎません。言い換えるなら、機械的な作業はツールにまかせて自動的に行うようにし、人間である結城は自分にしかできない作業(原稿を書く作業)に時間を使うようにしたのです。

* * *

自分が実際に使うツールをプログラミングするのは楽しいものです。まずはプログラムの「きれいさ」ということは無視して、「とにかく動かす」ことに専念して進みます。そして実際に何とか動き始めるととても大きな達成感があります。新しい言語を学ぶときにこの達成感はとても大きく感じます。

この達成感の背後には大きく二つの要因があります。一つは私の側。これまでにPerlやRubyで似たコードをたくさん書いた経験がありますから、移植作業はそれほど大変ではなかったということ。もう一つはGoの側。Goではサンプルコードやドキュメントが充実していますので、少し検索するだけで必要な情報がすぐに得られるのです。

特に感動したのは、golang.org にある多数の技術ドキュメントとPlaygroundと呼ばれるサイトの存在です。プログラムの例が表示されているのですが、その場ですぐに実行して結果を見ることができるのです!これはすばらしい。

たとえば以下のリンク先はstringsパッケージのJoinという関数の説明です。

◆strings - The Go Programming Language
https://golang.org/pkg/strings/#Join

◆Join関数の説明の下には実際に動かせる例が書かれている(スクリーンショット)

2018-04-16_join.png

このスクリーンショットを見てもわかる通り、すぐに実行(Run)できるようになっており、しかも自分で書き換えて再実行したり、書式を整えたり(Format)そのプログラムを他人と共有したり(Share)できるのです。これはいいですね。

「新しいプログラミング言語で自分が作るツールをさくさく書ける自分ってすごい!」と自画自賛してしまいたくなりますが、このように、プログラミング環境を整えてくださる多くの方々がいるからさくさく書けるということを忘れてはいけませんね。感謝です。

* * *

mm-convertをPerlからGoに移植するついでに、以前から気になっていた部分を手直しすることにしました。以下のような点です。

  • 手で書くファイルのエンコーディングをShift_JIS(cp932)からutf-8に変える。
  • 無料パートと有料パートの区切りを分量から自動的に判定する。
  • 書式としておかしなところをより詳細に自動判定する。
  • まぐまぐ!用のepubに表紙画像を自動的に入れる。

技術的な詳細や、結城が作業しているリアルな場面についてはTwitterで「#今日のGolang」というハッシュタグを検索してみてください。いろいろ泥縄で学んでいるようすが観察(?)できます。

◆「#今日のGolang」を検索する
http://bit.ly/2IW5tCW

表紙画像を自動的に入れる部分はGoじゃなくてRubyで書きました。以下にソースコードを公開しています。Vol番号を元画像の中に埋め込む処理を行っています。

◆メールマガジン用に毎回表紙画像にVol番号をプログラムで埋め込みたい
https://gist.github.com/hyuki/9da18a1a8d04fcb67fd1af5ecd13266b

* * *

慣れない言語でプログラミングをしているとストレスが掛かるものです。というのは「自分が慣れている言語だったらこう書けば動くのに!」とついつい思ってしまうからですね。また、新しい言語で動いたとしても「これでいいのかなあ」という疑問も生じます。

結城は学びながら、自分の疑問や成果物をどんどんツイートしていきます。そうするとありがたいことに詳しい方からツッコミがやってきたり、疑問への回答がやってきたりするからです。

成果物の公開はGithub.comのGistを使ったり、先ほども書いたPlaygroundを使ったりします。ほんのちょっとした成果物でも公開すると勉強になります。ひとさまの目に触れると思ったら、何度も読み返したくなるからです。

◆結城浩のGist
https://gist.github.com/hyuki/

◆疑問を投げかけたら教えてもらったようす(スクリーンショット)

2018-04-12_learn.png
https://twitter.com/tetsu_koba/status/984330868054355968

* * *

以上のように結城は最近Goという言語で遊んでいます。

春。新しい季節に新しいことを学ぶのは楽しいものですね!