読者です 読者をやめる 読者になる 読者になる

オルトプラスエンジニアの日常をお伝えします!

最速分報を目指して

こんにちは id:kotamat です。

最近自分の所属しているチームにもSlackを導入し、分報を書き始めているのですが、 私はエンジニア三大美徳の怠惰を兼ね備えた人間ですので、わざわざSlackなんて開きたくないわけです。

そんな中ふと解決策を思いつき、実行してみたところ、意外とうまく行った方法があったので、共有したいと思います。

tl; dr

  1. Alfred
  2. Slackプラグインをいれて
  3. Workflowを自分好みに修正

分報って?

c16e.com

こちらのブログにまとまっておりますが、要はつぶやきの感覚で報告をするというもの。 自分用のチャンネルを用意し、そこに自分の思っていることや困っていることなどを自由に書き込み、 他の人がそれをみて助けられれば助けるみたいな形で運用していきます。 私は #times_kotamat というチャンネルで分報を導入しております。

Alfred

AlfredはMacOS用のランチャーアプリです。 自分好みのキーバインディングを指定しておくと、どのアプリケーションを開いている状態でも、Alfredランチャーが開き、ローカルファイルの検索からブラウザでの検索・電卓計算まで様々なコマンドを実行できます。

また有料バージョンにすることによってAlfredWorkflowというユーザ任意でのコマンドを作成することができます。

f:id:kota-matsumoto:20170117101033p:plain

ワークフローはこのようになっており、ユーザ任意でコードを差し込みつつ、パイプラインで処理を連結させられます。

ランタイムはphp, ruby, python, AS, JS, bash, zshに対応しており、バイナリを生成しておけば事実上他の言語も対応していることになります。

Slackプラグイン

こちらのドキュメントが見やすいので、みてもらうのが一番かとおもいますが、

f:id:kota-matsumoto:20170116200701p:plain

こんな感じで書き込むと #times_kotamat チャンネルに"てすと"という投稿をすることができます。

設定は簡単で slack --token <slackから取得したtoken> で登録ができます。

また、自動補完の機能も搭載しているので

f:id:kota-matsumoto:20170116201021p:plain

の状態でTabを押すと

f:id:kota-matsumoto:20170116201040p:plain

となり、入力が簡単です。

Workflowを自分好みに修正

ただこれでも怠惰な自分としてはslack kota + Tabと入力するのは面倒です。 そこでWorkflowを修正しました。

変更したいのはインプットのところですので、一番左の項目を選択し、コピペ

f:id:kota-matsumoto:20170117101336p:plain

"Keyword"を"f"に変更

"Script"の$query = "{query}"に #times_kotamatを追加

f:id:kota-matsumoto:20170117101520p:plain

最後にワークフローをスクリプトの方につなげてあげれば完了です。

f:id:kota-matsumoto:20170116195643p:plain

これで"f" と入力した後、テキストを入力すれば分報を送信できるようになりました。

まとめ

Alfredを使い、分報を早く書き込む方法を紹介しました。 今のところ満足しているので、このまま使っていこうかと思います。

文字認識改善用の前処理について

こんにちは、オルトプラスベトナムのフーンです。

最近社内で OCR(Optical Character Recognition)に関連したプロジェクトで、実装を担当しました。本記事では OCR 用の入力改善方法を紹介します。

背景

OCR処理を実行したとき、時々認識精度が低いことがあります。色々な原因が考えられますが、主な理由は入力の品質が悪いことです。以下、私が使った入力の品質改善方法を紹介したいと思います。

文字認識の精度改善方法

1.      オリジナル画像の直立化

スキャンされた画像、または中央揃えでない撮影画像は、文字認識の精度に影響を与えます。そのため、ホモグラフィという変換方法を使用して画像を直立位置に回転します。

ホモグラフィとは、3x3の行列を変換し、変換後の画像に反映したい点に従ってオリジナル画像に写っている各ポイントを変換後の画像に射影するマトリックスです。

変換マトリックスは、以下の公式で計算されます。

f:id:hungh:20170112103044p:plain

したがって、f:id:hungh:20170112104802p:plain となります。

オリジナル画像の座標値を取得する方法

オリジナル画像から top-right、 bottom-right、 top-left、 bottom-leftの4つの座標値を取得します。

top-left: X値とY値を足した数が最小値である 座標値

bottom-right: X値とY値を足した数が最大値である 座標値

top-right: Y値からX値を引いた数が最小値である 座標値

bottom-left: Y値からX値を引いた数が最大値である 座標値

変換後の画像の座標値を取得する方法

変換後の画像は2Dの正方形または長方形である各ポイントの集合から構成されます。オリジナル画像の情報がなくならないように変換後の画像の座標値を最も適当となるように計算する必要があります。また変換後の画像の面積はオリジナル画像(srcArea)と同じ面積の方がよいと思います。

変換後の画像の縦幅の計算方法:

オリジナル画像の縦横比は仮のratio であり、画像の縦横の計算式は下記のとおりです。

dst_width =f:id:hungh:20170112103334p:plain ;

dst_height = ratio * dst_width;

つまり変換マトリックスに入れるための変換後の画像の4つの座標値を以下のように取得できます。

Point1(0,0), Point2(dst_width-1,0) , Point3(dst_width-1, dst_height-1) , Point4(0, dst_height-1) 

結果は、以下になります。

図1-1. オリジナル画像

f:id:hungh:20170112102622p:plain

図1-2. 変換後の画像

f:id:hungh:20170112102642p:plain

2.      文字ではなさそうところを排除し、ノイズを除きます。

John F. Cannyのアルゴリズムにより、エッジを検出します。

図2-1.

f:id:hungh:20170112102701p:plain

検出したエッジによりカバーの長方形の面積を計算して、不要なところを削除します。

図2-2. 削除後の画像

f:id:hungh:20170112102721p:plain

3.      バイナリ化

3.

f:id:hungh:20170112102738p:plain

おわりに

OCRソフトウェアを開発する場合、文字認識の改善には色々な方法があります。上記は、OCR入門者にも簡単な方法ですので、ぜひ試してみてください。

IntelliJ IDEAでsnippetを活用する

AdventCalendar

※この記事はAltPlus Advent Calendar 2016の25日目の記事です。 こんにちは、開発部のコイです。オルトプラスに働いています。 IntelliJ IDEAでのsnippetを活用する方法を紹介します。

背景

繰り返し同じコードパターンを書いたら、時間がかかっているので、どのように解決できるかを探してみて、snippet活用の方法を見つけました。 最近チームでIntelliJ IDEAで使っているので、IntelliJ IDEAでの方法を紹介します。

snippetとは

snippet(英語: snippet)とは、「断片」という意味である。情報処理の分野ではよく使う短いプログラムコードを統合開発環境から呼び出す機能の事である。 また、呼び出される短いコードの事をsnippetと呼ぶ場合もある。ja.wikipedia.org

言い換えれば、snippetはテンプレートコードに似ている。コードテンプレート化して、そのあと再利用できるものです。 mainとif/elseなどのsnippetを用意してくれるEditorが多いと思います。

またEditorでは任意でsnippetを登録することができます。 開発中にsnippetを登録して、どんどん増えていくと開発速度が上がるのではないでしょうか?

ItenlliJ IDEAでsnippetを活用する

登録してみる

例:仮に下記のパターンを繰り返し書かないとき、snippetを登録してみます。

for (var i = 0, l = users.length; i < l; i++) {
    var v = users[i];
    // some code here
}

for (var i = 0, l = books.length; i < l; i++) {
    var v = books[i];
    // some code here
}

https://www.jetbrains.com/help/idea/2016.3/creating-and-editing-live-templates.html

登録できたら下記のように使えるようになります。 js-forのsnippetです。 for.gif

snippetを共有する方法

snippetを共有する方法は2つあります。

  • SnippetをExportする
  • Snippetを手動でコピーする

参考:https://www.jetbrains.com/help/idea/2016.3/sharing-live-templates.html

Vim-snippetsをIntelliJ IDEAのフォマットに変換する

Vim-snippetsのCommuinityが強いので、たくさん良いSnippetが用意されています。 なので、Vim-snippetsをIntelliJ IDEAsnippet化してみました。 下記の例を御覧ください。

  • jq-ajaxのsnippet

ajax.gif

  • bootstrapのsnippet

bootstrap.gif

詳しい使い方はこれを見intellij-snippetsてください。

まとめ

自分で開発するときに、自分のsnippetをもっと活用してみてください!