ぼく・わたしの考えた最強のPDFリーダー

執筆完了

技術書典9に無事参加します。最終的に確定した書籍のタイトルは

技術書を自作PDFリーダーで読む – Haskellでつくる不思議な読書体験 (1)

です。

こんなの2

この記事のタイトルにする案もありましたが、おふざけは止めておきました。

こちらで販売されます。

書籍紹介も再掲しておきます。

書籍案内

技術書典で購入した本自作PDFリーダーで読みませんか?
既存の電子文書リーダーには存在しない独自ギミックで、不思議な読書感をお約束します。
Haskell製の関数型トイプログラムです。
Haskellをやらない人も大丈夫です。筆者のカスタムしたPDFリーダーを使って不思議な読書体験できます。

後記

出し切った感があります。趣味での活動でしたがここ2、3年間の開発の集大成です。最初の一年半くらいはStanfordParserもMecabも使わないような、いちからの純Haskellで作ろうとしていました。途中でめんどくさくなって折れました。いつかは試みてみたいですが、高度な数学みたいな巨人の肩の上に立てればという感じでしょう。型理論と関数型プログラミングならどこかでやれる、そんな気がしています。全体としては、無から何かを作り上げるのは振り返ると良い体験でした。

技術書典10も参加したいですが、ネタのストックが心配なところです(笑)(★1)。でもこういうイベントって面白いものですね。次のイベントのために何か学ぼうという気になります。最近、肝いりの技術を後の人に伝えた、残せたのでもういいか、みたいな境地でしたが、完全にリカバーしました。

さらに思いがけない発見もありました。

今回、技術書典9に間に合わせるためにこれまで手付かずだった日本語モードをチューニングしたのですが、これが思いのほか完成度が高くて驚いています。
全然想定していませんでした。日本語はもともと視認性がよいというのが私の持論で、色付けとか蛇足とまでは言わないにせよ、効果が弱いだろうというのが、以前の私の感覚でした。

以下、日本語モードチューニングの経緯です。日本のイベントで、英語のみなのは寂しかろうと日本語モードの改善をテーマにしました。Haskellでチューニング云々言っているので、英語と同様に日本語のS式を真面目に扱うようにParserを作成することにしました。当初は本書の最終章、「発展的話題」で触れているように、エレガントに自動で名詞句をくくる、みたいのを勉強会でやる計画でしたが、間に合いそうにないので止めました。泥臭く手でしっかりとParserを書く。さらに初心者向けも想定しているのでParsecみたいのをやらずにfoldで書く(foldでやってもParser的思考は必要でしたが)。手で書くのはつまらない(正確には考えること多くて大変そう)と思っていましたが、案外それっぽいチューニングができてしまいました。あと少し手をかければ、私にとっての自然なくくりはくくれてしまいそうです。

更に、スロット登録等のいつか搭載しようと思っていた機能は全て搭載しました。スロット登録はHaskellプログラムを書かない人でも着色パターンのチューニングというかたちで遊んでもらおうというギミックですが、やっぱりスロットはあったほうが良かったです。もっと早く用意すればよかった。

イベント(技術書典9)への参加を検討しなければ、こういう偶然はなかったはずです。やはり人間は社会的な動物なのでしょう。せっかくの技術なので完成度を高めた状態を用意して、他の人のリアクションを見てみたい。人間の強さとは、そういうことなのだと感じました。

本書執筆のために、いろいろ技術書PDFを買って本ソフトで読んでみましたが、自画自賛で見苦しいですが、ああ、これはやってしまったな、というのが正直な感想です。

今後スタンダードになっていくであろう技術だと確信しました。

是非、ご自身の手で不思議な読書体験してみてください。

自分が下手こいて潰してはいけない技術だという意識でいます。普段は口が悪い人間なのですが、本書ではそういう要素は全て排除しました。こういう前向きな姿勢で書いた方が良い本ができますね。筆者としても書き終わった後の清々しさが違いました。そちらも教訓になりました。  

この記事のタイトルも、ああ、これはやってしまったな、も、調子にのっている感があり、止めとこうと思いましたが、センセーショナルな題目で人目をひくのも大事かと思いこのままにしています。あくまで「ぼく・わたしの」で「筆者の」という意味ではないです。

もし、ご興味持たれた人はPDFリーダーで色々試してみてください。多分得意な文書と、得意でない文書があるはずですし、有効な攻略法も色々あるはずです。

余談

(★1)
次のイベントに向けて、名詞句を自動でくくるみたいのをスタートし始めました。S式の一部を置換して構造を壊してMecabにかけてどうなるか、みたいな観察です。名詞句=「それ」とかやっていますが、代表元を幾つか用意、つまり本書中で触れた  

  • testSentense = "本書はPDFリーダーを自身の手で作ることを通してプログラミング言語Haskellを学ぶ本の第一弾です。"

という文章であれば、「Haskell」を代表元としてその置換可能性を検討すれば名詞句が抜けそうですし、「学ぶ」を代表元とすれば動詞句が抜けたり、そのあたりが自動でやれるんじゃないか、という予感がしています。機械学習とは違う類のA.I.っぽい感がひしひしと感じられます。そして再帰的データ構造、再帰関数を多用する、いかにも関数型プログラミングならではの手法で、そのあたり、本当は本書ラスト(本来の「関数型プログラミングの可能性」)で触れたかったのですが、タイムアップでした。風呂敷を広げすぎて畳めないのは例のアルファベット4文字系の人間の悪いところですね。今回は回避できました。次回イベントのネタが残ったのでよしとします。今回はあんましHaskellっぽさ(敢えてHaskellでやるべき)を出せなかった気がするので、次回はそのあたり強化して再戦します。

Haskellなどの関数型言語でつくられた玩具をこれからも公開していきますので、よろしくおねがいします。PDFリーダー以外にもう一つとっておきの玩具案を持っています。色を付けるのは、思いつくかもでしたが、こちらは多分思いつかなさそうなので焦らず仕上げる予定です。

それにしてもS式みたいな再帰的データ構造を扱うにはHaskell(typedな関数型プログラミング)は便利ですね。パターンマッチに従っておけば自然に関数が書けます。mecabがIOモナドにいるのが腹立たしいですが(笑)形態素解析も純Haskellで書けるようにしたいところです。

ソース(SExp.hs)にも本書中では触れていない便利関数が幾つかあり、そちらでは上記パターンマッチと再帰を多用しています。S式を表示する(print)系の関数です。参考になるかもしれません。 

シェアする

  • このエントリーをはてなブックマークに追加

フォローする