落ち葉アート

どーも。
panjaです。

先週末に息子と一緒に近所の公園を散歩(息子はストライダーで爆走)していた時に、きれいな落ち葉アートを見つけました。

数日前にツイッターで話題になってたやつを誰か真似したんだろーなー、なんてことを考えていました。

今度は息子と一緒になんか作ってみようかな。

tesseract-ocrを使って紙の書籍のソースコードを読んでみた

どーも。panjaです。

通勤中にちまちまと「レガシーコード改善ガイド」を読んでいます。

レガシーコード改善ガイド

レガシーコード改善ガイド

文章中にはちょいちょいC++Javaコードスニペットが現れるのですが、普段IDEの力を借りて開発してることもあり、構文強調表示が無いとまぁ頭に入ってきません。
そんなことを思いながらなので当然モチベーションーも下がってきます。

どうにかしたいなーとぼんやり考えていたのですが、とりあえずデータ化しないと何も出来ないだろうということでOCRにチャレンジしてみました。

使用したOCRライブラリはtesseract-ocrです。元々はHPが開発していたらしいですが、今はGoogleが管理しているようです。オープンソースということで気軽に使用出来ます。
github.com

今回は自作のプログラムで使いたかったので、Githubからクローンしてきてビルドしたものを使いました。その辺の手順なんかはググってもらえればたくさん出てくると思いますので割愛します。


VisualStudio2013でtesseract-ocrをビルドして新規にソリューションを作成しました。
適当にパスなどを通してあげると使えるようになります。
dogear11.hatenablog.com
基本的に上記のページを参考にさせてもらいました。コードもほとんど同じです。

早速結果を見てみましょう。
以下は「レガシーコード改善ガイド」の一部をスキャンしたものです。
f:id:panda531531:20161124233105j:plain

この画像から文字を読み取ってみると......
f:id:panda531531:20161124233125p:plain

。。。。。。
前半はかなりいい感じですが、後半グダグダですね。
※「recognized text:」はOCRの結果ではありません

ソースコード自体弧を描いてるのはかなりまずい気がします。
が、とりあえず入力画像を2値化してみることにしました。


2値化した入力画像がこちらです。
f:id:panda531531:20161124233028j:plain
ゴミも残っていますが、文字自体は結構いい感じに2値化されています。

結果がこちらです。
f:id:panda531531:20161124233117p:plain
おぉ!?
少し良くなりましたね。
変な改行なんかが入っていますが改行文字を改行文字でも読み取ったんでしょうか。
ゴミの部分も無理やり文字化しているようですが、それを除くと数文字誤りがありますがそこそこの精度で読み取れているようです。

【今後の課題】

  • 日本語のコメントはどう見えるの?
  • ソースコードを線形に補正するような画像処理をかます(そんなものはあるんでしょうか?)
  • (きれいに読み込めた暁には)構文解析して強調表示なんか出来たらいいなぁ

読書記録(レガシーコード改善ガイド7章)

どーもpanjaです。
少し前からレガシーコード改善ガイドを読んでます。

レガシーコード改善ガイド

レガシーコード改善ガイド

文章の流れが少しわかりづらい箇所もありますが、普段C++で開発している私にとっては例は理解しやすく内容も文句なしです。

さて、今回は本書の「第7章 いつまで経っても変更作業が終わりません」を読んで思ったことを書いてみたいと思います。

この章では以下が述べられています。

  • どんなに綺麗にメンテナンスされているシステムでもコード量が増えてくると変更すべき場所を見つけるのは大変。
  • レガシーシステムの場合は変更自体も大変。(コーディングはすぐ終わるかもしれないけど、テストがないので既存の振る舞い含め確認に時間がかかる)
  • テストが揃っている環境だとしても、変更に対するフィードバックを素早く(5秒以内!)得る必要がある。
    • そのために必要なことは、システムの全てのクラスやモジュールを独立してテストハーネス(GoogleTestなどのテストフレームワーク)上でインスタンス化出来るようにすること
      • 例えばインターフェースの抽出とかで実現できるけど、具体的な手法は「アジャイルソフトウェア開発の奥義」に書いてあるよ!

アジャイルソフトウェア開発の奥義 第2版 オブジェクト指向開発の神髄と匠の技

アジャイルソフトウェア開発の奥義 第2版 オブジェクト指向開発の神髄と匠の技

こんなとこでしょうか。
ちげーよそんなこと書いてねーよ。お前間違ってるよ。
などなどご意見ありましたら是非コメントお願いします。


私は普段boostなどを使って開発しているので、そりゃあもうビルドは時間がかかります。が、そんなこと言ってても始まらないので依存箇所を出来るだけ小さく出来ないかなど考えることは色々ありそうです。
また、クラスの依存関係を調べるツールを使って既存のクラスがいかに単独でインスタンス化出来ないかも調べてみようと思います。C++で使える便利なツールをご存知の方はぜひぜひ教えてください!