レポートを楽に済ませたい

イントロ

レポートの原理部分を書くのがクソだるい!!!!!

学生みんなの悩み「レポート」。

休日だろうがお構いなく脳の片隅に常駐し、遊んでいるときもリソースを割きやがる。

どこの学校のレポートも形式はだいたいお決まりで、だいたい初めの方に「原理」がある。(自分は工学系なので、文系のレポートは知ったこっちゃないのだが)

普段自分は実験日に配布される指導書の大半を丸コピするのだが、この作業が結構つらい。ただ指導書をみて、ほぼ脳死状態でひたすらにキーボードを打つ。

ということで

OCRという技術を用いて、写真からテキストを引っ張ってくるアプリケーションの作成を行ったのでざっくり説明する。

OCRとは

ここで説明するよりWiki見た方が解りやすいです。

光学文字認識 - Wikipedia

開発環境のセットアップ

環境セットアップは他のサイトをみて行ってください。

 

OCRについてのAIをGoogleは開発していて、併せてそれを使えるAPIも公開しています。今回はこのAPIを使う。

cloud.google.com

書いてますが、無料枠でのリクエスト数は1,000件/月です。

ここでCloud Vision APIを使う申請をして、APIKey等を取得しておきます。取得方法がだいぶ複雑に自分は感じたので、注意。

 

今回、使用する言語は2つ。PHPVC++です。

PHPを使うにはXAMPPをインストールしておきます。

 

処理手順

  1. PHPでユーザから渡された画像を引数に、APIを叩く
  2. 処理結果のパース
  3. VC++で受け取って出力

完成したソフト

ソースは以下からみれる。

github.com

ocr.php

 これで、画像をAIに見てもらう。

これをVC++側でコンソールコマンド実行する。

MyForm.h[デザイン]

f:id:hxbdy541:20171023163923p:plain

 画像を指定して、「解析開始」ボタンで、PHPのプログラムが走る。結果を出力テキストボックスに格納、同時にクリップボードにも反映させる。

MyForm.h 

メイン処理が多い。

 何がつらかったって、文字列周りの処理。char*とSystem::String^と色々の変換が大変だった。

MyForm.cpp

ただWindowsフォームを起動してるだけ。

 MySystemStringToChar.h

String^等の変換

サンプル入力

この画像を入力して実行してみる。

f:id:hxbdy541:20171023164035p:plain

実行結果

f:id:hxbdy541:20171023164542p:plain

なんか変な文字が頭についてるけど問題なく解析できている。

コピペが捗る!!!

いつか、ソフトウェアとして配布したい。

読んだサイト

t.co

t.co

t.co

https://t.co/Xc4q2hZ7BG

t.co

文字化けテスター - instant tools

文字セットUnicodeでShift-JISファイル読込み時の文字化け回避について

t.co

t.co

t.co

C++/CLI Tips : 文字列操作

割り当てと制限  |  Google Cloud Vision API ドキュメント  |  Google Cloud Platform

方法 : メッセージ ボックスを表示する

最適化問題

使ってみたいシステム、APIがあった時は、ふんふんとやる気もモチベーションも上がって、バリバリプログラム書けるんだけど、それを使ったソフトの開発をすませたら、今後なんのコードを書けばいいんだ・・・とある種、燃え尽き症候群のような症状になる。

 

そういう時は、普通の本(夏の青春系)を読んだり、図書館で気になる技術書を借りて読んだり、カルピス作ったり、手帳を眺めてみたり、一旦アナログな世界に逃げてみる。

そして、何気ない生活を送っているとふと「・・・プログラム書きたいなぁ」と、また何か新しいシステムを思いついて、書いてみようかなという気に自然になる。

(青春したいなぁと思うこともないわけではない。)

 

まだ存在しないシステムへのアプローチはやはりアナログ側に存在すると思うし、部屋に閉じこもるのも良くないと思う。プログラムを書く間は、部屋に閉じこもるのは別に構わないと思うけど。

 

...->デジタル->アナログ->...に限らず、ルーチンを自分の中で確立した方が、無駄な時間というのは少なくなるような気がする。

 

今日は、特に何をするでもなく、ただTwitterとネットサーフィンの繰り返しだったので、ある意味上記の「無駄な時間」を過ごした。

RaspiZeroWが重くなった話

(前回の更新から1ヶ月経ちましたよってハテブロからメールがきたから書いてるっていう理由もある)

 

外付けHDDをNASとして使いたい欲がきたのでやってみたらクソ重くなった。

 

調べてみたらexFATでフォーマットすればいい感じになるってあったので、試しって事でHDDではなく余ってたMicroSDでやってみることにした。

 

RaspiZeroWでexFATを扱うためのものをインストする。

$ sudo apt-get install exfat-fuse exfat-utils

ここまではふつーにうまくいってた。

 

 

MicroSDをRaspiZeroWに挿して「よしマウントしよう」って思ったら!ターミナルがくっっっっっそ重くなって、文字さえもまともに入力できなくなった。でもMicroSDを抜くとふっと軽くなる。「?」と思いつつ、不安だったのでリブートした。

 

すると

 

SSH接続さえできなくなった。(!?)

電源は確かに入ってるし、ルータのDHCP割り当てを見ても確かにいる。わけわからん。

(原因究明中)

 

追記

とりあえずディスプレイとつなげてみたら、「エマージェンシーモード」なるもので起動してた。ラズパイのあの起動時の文字がぶわーってでてくるあそこで止まってた。

どうやらSambaのストレージに外付けのSDを割り当てたときの設定の仕方がまずかったみたい。SDが読み込めなかったときに発生するエラーで、処理が止まってたみたいなので、SDを検出できなくても、スルーするっていうワードを付け加えたところうまくいきました。

LINE_Bot

LINEのBotを作りたい!!!

TwitterBotを開発したわけで、LINEのBotにも手を出そうかなと思ったわけです。

 こんなツイートをするこいつをLINEにも進出させたいと思って色々しました。

実は今年の初めの時点でLINE developersアカウントは取得していて、なかなか忙しくて触れてなかっただけです!

しかし、ReplyAPI(返信するためのシステム)を使うためにはSSL証明書が要るとわかったので(具体的にはWebHookのURLがセキュアじゃないといけないため)コスト0円では一方的な発言しかできないBotしか作れないことが分かった。まぁその辺はまた今度調べるとして、今回は、Botに"sample"と発言させるまでをやりました。

できるだけ、初心者にもこのサイトだけで解決できるように書いたつもり。

 

必要なもの(ハード)

  • サーバ(ここではRaspberryPi2 ModelBを使用)

必要なもの(ソフト)

  • Python2.x(注意:3系ではうまくいかなった)
  • line-bot-sdk-python

 

github.com

作業開始

LINE developersのアカウントを作成して、Channel Access Token と UserIDを取得し、メモっとく。

 

(Python2.xは使用できることを前提としてます。)

まずGitからSDKをクローンします。

$git clone https://github.com/line/line-bot-sdk-python.git

クローンしたフォルダの中に移動して、以下の3つを実行

$ mkdir lib
$ pip install -t lib flask
$ pip install -t lib line-bot-sdk

libフォルダができるので、ここの中にまた移動。

(つまりカレントディレクトリは\line-bot-sdk-python\lib\)

ここに、以下のコードを保存します。名前はtest.pyとしました。

 

 

import re
import requests

from linebot import LineBotApi
from linebot.models import TextSendMessage
from linebot.exceptions import LineBotApiError

Channel_Access_Token="XXXXX"
User_Id="XXXXX"
Line_Bot_Api=LineBotApi(Channel_Access_Token)

Line_Bot_Api.push_message(User_Id,TextSendMessage(text="sample"))

 

"XXXXX"にはメモっておいた2つを入力。

で、実行すると、

f:id:hxbdy541:20170904122215j:plain

できました。

記事にすると、こんなあっさりしてますが、これをできるようになるまで2日かかってるの...

 

 

参考文献

qiita.com

 

@himazindana_botの仕様

時間がないので、ささっと書いちゃいます。

みんな返信してくれてるのをみると非常にうれしいのですが、「あぁ・・・今の仕様だとそれには返信しないなあ・・・」と感じる返信をいくつか見かけました。より自然な返信をできるようには心がけておりますが、現状のアルゴリズムには限界があるのが現実。

 

時間

このBot、:00と:30に自ら発言し、:15、:45にその時点での新規返信の確認を行い、それぞれに返信します。

 

返信内容

受け取ったメッセージの中から「名詞」を探します。(名詞が見当たらない場合、返信しません!)その名詞に基づいた文章を作ります。

 

あと、今後の課題なんですが、返信するときに宛先を文章の先頭に付加して送信するとそれが最初の発言になってしまって、つながらないんですよね・・・普通なら「このメッセージに返信する」的なボタンを押して返信するとその下に自分の発言がくっついて表示されるけど、このBotの仕様だとそうはならないのが問題。どの発言に対してなのかわかりづらすぎる。いつか直したいなぁ

発想

Javaアプレットで年間カレンダーを作ってたのだが、ある時「その月の最後の日は何日か」が必要になった。カレンダーオブジェクトのセットメソッドには、年月日をパラメータとして、正しい値がプライベートパラメータにセットされるのだが、「知りたい月の次の月の0日を取得すると知りたい月の最終日が取得できる」ということに友人が気づいた。俺は感動したし天才かと思った。俺は日をインクリメントして月が変わった時点で、次の月に以降というスタイルを取ろうと思ってたが友人のアイデアが超画期的に思えたので即友人の考えを採用したのだった。教授は「仮に8/32でセットした場合、9/1になる」と言ったので、それを聞いた俺は日の増加のみによって月末の判断が可能だと思ったが、なかなかスマートじゃないしってことで実装段階で悩んでた時にこれ。9/0をセットすることで8/31つまり知りたい月の最終日が取得できるのである。完全に教授の言い方から、値を増加させるという考えしか働かなかったし、そこでこのデクリメントさせるアイデアを出せるのは本当にスゴいと思った。

言い訳

(某アライグマ)やってしまったのだ・・・

またBot(@himazindana_bot)の活動が停止しました。

度重なってるので理由を書こうかと思います。個人的な理由があるのが申し訳ない。

  • 非テクニカルな人向け

Botのサーバは自宅にあり、自分は別なところに住んでいるため、理由は帰ってみないとよくわかりませんが動かなくなりました。自宅に帰省後、直接設定し直す必要があるので、はやくて今週の金曜日の夜までつぶやけません。

  • テクニカルなことがわかる人向け

どういうことかというと、Botのサーバは自宅にあり、自分は別なところに住んでいるため自宅とVPN接続してBotプログラムの改造を行ってました。で、あるタイミングで、IPアドレスが動的になってしまったので、固定しなおそうとしたところ、仮想NICとeth0の設定のどっかをコメントアウトしちゃったらしくて(覚えてない。もう接続できなくなったので確認のしようもなくなった。)サーバの再起動後、サーバにつながらなくなる事態が発生。緊急用のVPNサーバを用いて、LAN内を探し回ったのですが、見つからず...自宅に帰省後、直接設定し直す必要があるので、はやくて今週の金曜日の夜までつぶやけません。