ScreenOCR で紹介した「ScreenOCR」のソースコード、公開しておきます。
GitHub - kurima-yoshida/ScreenOCR
本記事はMorning Project Samurai Advent Calendar 2016の12/5の記事として作成しました。
Raspberry Piで何か、例えば監視カメラなんかをつくったとき、何もしないと基盤むき出しの配線ぐちゃぐちゃになってしまいます。
そんな状態を避けるために最低限のケース(ガワ)を作ってみましょう。
ケースとして今回ははがきケースを選択しました。LANケーブル、USBケーブル、HDMIケーブル等をつなぐ場合は大きめのものを使い、ケースに穴を空けてケーブルだけ出すと見た目がすっきりします。また、開閉しやすいものを選ぶとメンテナンスが楽です。
ネジ類はRaspberry Piの基盤にある穴にあわせてネジ径 M2.6 のものを使います。
あまりお店に置いていないサイズらしいのですが渋谷の東急ハンズなどにありました。
通販だとヒロスギネットが少量から購入できておすすめです。
ケースとRaspberry Piにネジを通してナットでとめるだけなのですがRaspberry Piの裏側はデコボコなのでケースとRaspberry Piの間にスペーサーが必要になります。
ネジは、ネジにワッシャー、ケース、スペーサー、Raspberry Piと通してナットで止められる長さのものを選んでください。
タミヤ クラフトツールシリーズ No.49 ベーシックドリル刃セット 74049
Raspberry Piのケース内での位置を決め、ケースにドリルでネジ穴を空けます。
ドリル刃は2.5mm径のものを使います。
ケース内にRaspberry Pi を置いて、その状態でRaspberry Piのネジ穴に上からドリル刃を通してケースに穴を空けます。
1つ穴が空いたらスペーサーを入れてネジを通し、ナットで固定してしまいます。
ケース内にRaspberry Pi を置いているのに対して裏からネジを通す形になります。
裏から、ネジ頭→ワッシャー→ケース→スペーサー→Raspberry Pi→ナット の並びです。
この状態で残りのRaspberry Piのネジ穴からドリル刃を通してケースに穴を空けていけば穴の位置を間違うこともありません。(ドリル刃を垂直に通すようには注意)
穴を空け終わってネジで止めたのを裏から見るとこんな感じです。(写真では上の説明と逆でナットが表になってしまっていますがミスです…)
Raspberry Piに繋いだケーブル類を通すための穴を空けます。
ケーブルを通すためにはコネクターを通さなければなりませんからそれなりの大きさの穴を開けることになります。
まずケースに、両方の脚の先が針になっているコンパスで、開ける穴の形に円を描きます。(針で円の形に傷をつける)
この円の少し内側に、円に沿う感じでピンバイスで穴をいくつも空けていき、円を一周したら隣り合う穴同士をニッパーで繋いで切り取り、あとはヤスリで仕上げます。
棒ヤスリで円の痕に近づくように削っていき、あと0.2ミリくらいになったら紙ヤスリを棒ヤスリに巻きつけて微調整をかける感じです。
塗装後ですけど、穴はこんな感じ。
Raspberry Piをネジでケースに固定し、配線し、完成。
ファミコン自作にて「recalbox」や「RetroPie」といったRaspberry Piをゲーム機のようにするエミュレーター専用OSの名をあげた。
実際試してもみたのだけど、操作方法が洗練されておらずゲームパッドで完結しないところがあったり、画面遷移や画面デザインも若干つぎはぎな印象を受けた。
そんなところ、もっと良さそうなものを見つけた。それが「Lakka」だ。
日本語でインストール方法を説明しているサイトが少なそうだったので書いておく。
Lakka documentation - Disclaimerにアクセスし「Get Lakka」をクリック。
操作中のOS(例えばWindows)を選択。
LakkaをインストールしたいRaspberry Piの種類(例えばRaspberry Pi 2)を選択。
「Download Lakka」をクリック。圧縮されたイメージファイルがダウンロードされる。
LakkaをインストールするRaspberry Pi用のMicroSDカードを用意する。
容量はLakka自体には1GBも必要ないので8GBもあれば十分だがエミュレーター用のロムファイルをどのぐらい入れたいのかによってお好みで。
圧縮されたLakkaのイメージファイルを7-zipなどで解凍する。
Win32DiskImagerを使って解凍したLakkaのイメージファイルをSDカードに書き込む。
Win32DiskImagerを起動して、Image FileとしてLakkaのイメージファイルを、DeviceとしてSDカードのドライブを選んでWriteをクリックすればOK。
Raspberry Piに出来上がったSDカードを挿入し、ディスプレイ、USBゲームパッド、USB無線LANアダプターを接続して電源を入れる。
Lakkaが起動し、USBゲームパッドで操作できるはず。
iBUFFALO USBゲームパッド 8ボタン スーパーファミコン風 グレー BSGP801GY
BUFFALO 11n対応 11g/b 無線LAN子機 親機-子機デュアルモード対応モデル WLI-UC-GNM2
Lakkaのメイン画面から歯車のアイコン→Wi-Fiと進み
接続するWi-Fiスポットを選択する。
Passphraseを入力するとネットワークに接続される。
Lakkaのメイン画面からLakkaのアイコン→Informationと進み
Network Informationを選択する。
「Interface(wlan0):」に続くIPアドレスをメモする。
PCから先程メモしたLakkaのIPアドレスに接続する。
例えばPCのOSがWindowsで、LakkaのIPアドレスが「192.168.12.5」だったら
エクスプローラーのパス欄に「\\192.168.12.5」と入力する。
するとLakka内のフォルダーが表示されるのでその中の1つ「ROMs」フォルダー内にゲームのROMファイルを置く。
Lakkaに戻り、Lakkaのメイン画面から+のアイコン→Scan Directoryと進み
romsを選択、<Scan This Directory>を選択すると、ROMsフォルダー内に置いたROMファイルが認識される。
ゲームからLakkaのメイン画面に戻るためのボタンを設定する。
ボタンの少ないゲームパッドで初期設定だと存在しないボタンが設定されている事になりゲームから戻れずハマるので注意。
Lakkaのメイン画面から歯車のアイコン→Input→Menu Toggle Gamepad Comboと進み
ボタンの組み合わせ(例えばL1+R1+Start+Select)を選択する。
認識したROMファイルに応じて、エミュレーターのアイコンが増えているので、そこからゲームを選択してプレイする。
ゲームを中断する時はコントローラーの設定で設定したボタンの組み合わせを押す。
Lakkaのメイン画面からLakkaのアイコン→Shutdownを選択する。
少し待つとシャットダウンされる。
個人的に欲しかったので、画面の任意の領域からOCRで文字を読み取るツールをつくった。
何のことなのか伝わりづらいので絵付きで説明すると
ツールを起動して…
Ctrl+F1で画面がグレースケールになるので
OCRで読みたい領域をドラッグして選択する(赤くなる)。
領域内の文字を読み取った結果がウィンドウ右のテキストボックスに表示される。
ダウンロードはこちら
使用にあたってはFree OCR APIの「Register for free API key」から登録し、
取得したAPI keyをsettings.jsonに追記する必要があるのでご注意ください。
<2016/12/11追記>
ソースコード公開しました。
GitHub - kurima-yoshida/ScreenOCR
日本語入力したいだけならわりと短い手順でできることがわかった。
先回のシステムイメージバックアップで気軽にリトライできるようになり何度か試したおかげでもある。
以下手順。なおこの手順だと日本語入力できるだけでUIは英語のままです。
以下のコマンドで「language-pack-ja-base」「language-pack-ja」をインストールして、
適当な日本語フォント(ここではモトヤマルベリとモトヤシーダ)をインストールして、
日本語IMEのMozcをインストール。
$ sudo apt-get update $ sudo apt-get install language-pack-ja-base language-pack-ja $ sudo apt-get install fonts-motoya-l-maruberi fonts-motoya-l-cedar $ sudo apt-get install ibus-mozc
あとはGUIからの設定。
日本語キーボードなのに英語キーボードと認識されていたので以下で修正。
Applications Menu → Settings → Keyboard
→「Keyboard」のダイアログが表示されるので「Layout」タブを選択
→・「Use system defaults」のチェックを外す
・「Keyboard model」「Change layout option」「Compose key」を「-」に
・「Keyboard layout」を「jajpanese」のみにする
(Addからjapaneseを選ぶと「Layout」が「japanese」で「Variant」が空で追加でき
これで問題なさそう。)
→「Close」
Mozcを使えるようにする。
Applications Menu → Settings → Input Method
→「Input Method Configration」のダイアログが表示されるので「OK」
→Do you explicitly select the user configration?「Yes」
→「default」を選択して「OK」
Applications Menu → Settings → Keyboard Input Methods
→「IBus Preference」のダイアログが表示されるので「Input Method」タブを選択
→・「Customize active input methods」にチェックを入れる
・「Select an input method」から「Japanese - Mozc」を選択し「Add」をしたりして
「Input Method」を「Japanese - Mozc」のみにする
→「Close」
Applications Menu → Settings → Session and Startup
→「Session and Startup」のダイアログが表示されるので
「Application Autostart」タブを選択
→「Add」
→「Add application」のダイアログが表示されるので
「Name」「Command」に「ibus-daemon -rdx」と入力して「OK」
→「Close」
ログインし直すと「半角/全角」キーでIMEのON/OFFができるようになっている。
ChromebookでSDカードにUbuntuをインストールする - てけとーぶろぐ。
でSDカードにUbuntuをインストールしたものの
SDカードが出っ張って刺したまま持ち歩きづらい
という理由で生かせずじまい…。
そんなところ、ぴったりなアイテムを見つけ、これはと再挑戦。
そのアイテムがこれ。短いmicroSD→SD変換アダプタ。MacBookに感謝か。
サンワサプライ Mac用microSDカードアダプタ ADR-MMICRO
microSDカードは今回も先回と同じ速度のものをmicroで。
インストールにあたって必須ではないのだけど
SDカードにインストールした場合Win32 Disk Imagerなどを使うと
簡単にシステムをまるごとバックアップできる。
8GBとか小さめのSDカードにUbuntuをインストールして
初期状態や最低限のソフト入れた状態でバックアップしておくと
バックアップイメージファイルのサイズは8GBで済み、復旧に便利。
気軽にシステムをいじれる。
32GBなどのSDカードに対してもWin32 Disk Imagerで上記8GBのイメージファイルを書き込める。
書き込んだ後に、例えばLinuxマシンで読み込んでgpartedでパーティションサイズを拡張してやればディスク容量をフルに使えるようになる。
インストール自体は先回と同じ手順で。
なぜかSDカードのフォーマットで躓いたので記事に追記しておきました。
PythonによるJSONを返すHTTPサーバーを簡単に用意する - てけとーぶろぐ。の続き。
サーバーにクライアントから受け取ったJSONを表示する機能を追加する。
do_json_service() に3行追加。
from http.server import HTTPServer, BaseHTTPRequestHandler import sys, json import os.path import glob class Handler(BaseHTTPRequestHandler): def do_POST(self): service_names = [] files = glob.glob('./*.json') for file in files: basename = os.path.basename(file) service_names.append(os.path.splitext(basename)[0]) for name in service_names: if self.path == ('/' + name): self.do_json_service(name) def do_json_service(self, name): b = self.rfile.read(int(self.headers['Content-Length'])) s = json.loads(b.decode("utf-8")) print(json.dumps(s, indent=4, sort_keys=True)) f = open(name + ".json") result_json = json.load(f) f.close() self.send_response(200) self.send_header('Content-type','application/json') self.end_headers() self.wfile.write(json.dumps(result_json).encode('UTF-8')) PORT = 8080 httpd = HTTPServer(("", PORT), Handler) httpd.serve_forever()