てけとーぶろぐ。

ソフトウェアの開発と、お絵かきと、雑記と。

Raspberry PiにLakkaをインストールしてゲーム機にする

ファミコン自作にて「recalbox」や「RetroPie」といったRaspberry Piをゲーム機のようにするエミュレーター専用OSの名をあげた。

実際試してもみたのだけど、操作方法が洗練されておらずゲームパッドで完結しないところがあったり、画面遷移や画面デザインも若干つぎはぎな印象を受けた。

そんなところ、もっと良さそうなものを見つけた。それが「Lakka」だ。

日本語でインストール方法を説明しているサイトが少なそうだったので書いておく。

Lakkaのイメージファイルのダウンロード

Lakka documentation - Disclaimerにアクセスし「Get Lakka」をクリック。
操作中のOS(例えばWindows)を選択。
LakkaをインストールしたいRaspberry Piの種類(例えばRaspberry Pi 2)を選択。
「Download Lakka」をクリック。圧縮されたイメージファイルがダウンロードされる。

Raspberry Pi用のSDカードの準備

LakkaをインストールするRaspberry Pi用のMicroSDカードを用意する。
容量はLakka自体には1GBも必要ないので8GBもあれば十分だがエミュレーター用のロムファイルをどのぐらい入れたいのかによってお好みで。

圧縮されたLakkaのイメージファイルを7-zipなどで解凍する。

Win32DiskImagerを使って解凍したLakkaのイメージファイルをSDカードに書き込む。
Win32DiskImagerを起動して、Image FileとしてLakkaのイメージファイルを、DeviceとしてSDカードのドライブを選んでWriteをクリックすればOK。

Raspberry Piの起動

Raspberry Piに出来上がったSDカードを挿入し、ディスプレイ、USBゲームパッド、USB無線LANアダプターを接続して電源を入れる。
Lakkaが起動し、USBゲームパッドで操作できるはず。

iBUFFALO USBゲームパッド 8ボタン スーパーファミコン風 グレー BSGP801GY

iBUFFALO USBゲームパッド 8ボタン スーパーファミコン風 グレー BSGP801GY

BUFFALO 11n対応 11g/b 無線LAN子機 親機-子機デュアルモード対応モデル WLI-UC-GNM2

BUFFALO 11n対応 11g/b 無線LAN子機 親機-子機デュアルモード対応モデル WLI-UC-GNM2

ネットワーク設定

Lakkaのメイン画面から歯車のアイコン→Wi-Fiと進み
接続するWi-Fiスポットを選択する。
Passphraseを入力するとネットワークに接続される。

Lakkaのメイン画面からLakkaのアイコン→Informationと進み
Network Informationを選択する。
「Interface(wlan0):」に続くIPアドレスをメモする。

ゲームのROMファイルの転送

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ファイルに応じて、エミュレーターのアイコンが増えているので、そこからゲームを選択してプレイする。

ゲームの中断

ゲームを中断する時はコントローラーの設定で設定したボタンの組み合わせを押す。

Raspberry Piのシャットダウン

Lakkaのメイン画面からLakkaのアイコン→Shutdownを選択する。
少し待つとシャットダウンされる。

ScreenOCR

個人的に欲しかったので、画面の任意の領域からOCRで文字を読み取るツールをつくった。

何のことなのか伝わりづらいので絵付きで説明すると

ツールを起動して…
f:id:kurimayoshida:20161112003314p:plain

Ctrl+F1で画面がグレースケールになるので
OCRで読みたい領域をドラッグして選択する(赤くなる)。
f:id:kurimayoshida:20161112003323p:plain

領域内の文字を読み取った結果がウィンドウ右のテキストボックスに表示される。
f:id:kurimayoshida:20161112003333p:plain

ダウンロードはこちら

使用にあたってはFree OCR APIの「Register for free API key」から登録し、
取得したAPI keyをsettings.jsonに追記する必要があるのでご注意ください。

<2016/12/11追記>
ソースコード公開しました。
GitHub - kurima-yoshida/ScreenOCR

ChromebookにインストールしたUbuntuで日本語入力できるようにする

日本語入力したいだけならわりと短い手順でできることがわかった。
先回のシステムイメージバックアップで気軽にリトライできるようになり何度か試したおかげでもある。
以下手順。なおこの手順だと日本語入力できるだけでUIは英語のままです。

言語パック、日本語フォント、日本語IMEのインストール

以下のコマンドで「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」

日本語IMEの設定

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」

IBus Daemon自動起動するようにする。

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をインストールする(2)

ChromebookでSDカードにUbuntuをインストールする - てけとーぶろぐ。
でSDカードにUbuntuをインストールしたものの
SDカードが出っ張って刺したまま持ち歩きづらい
という理由で生かせずじまい…。
そんなところ、ぴったりなアイテムを見つけ、これはと再挑戦。

SDカードの準備

そのアイテムがこれ。短いmicroSD→SD変換アダプタ。MacBookに感謝か。

microSDカードは今回も先回と同じ速度のものをmicroで。

システムイメージバックアップ

インストールにあたって必須ではないのだけど
SDカードにインストールした場合Win32 Disk Imagerなどを使うと
簡単にシステムをまるごとバックアップできる。

8GBとか小さめのSDカードにUbuntuをインストールして
初期状態や最低限のソフト入れた状態でバックアップしておくと
バックアップイメージファイルのサイズは8GBで済み、復旧に便利。
気軽にシステムをいじれる。

32GBなどのSDカードに対してもWin32 Disk Imagerで上記8GBのイメージファイルを書き込める。
書き込んだ後に、例えばLinuxマシンで読み込んでgpartedでパーティションサイズを拡張してやればディスク容量をフルに使えるようになる。

Ubuntuのインストール

インストール自体は先回と同じ手順で。
なぜかSDカードのフォーマットで躓いたので記事に追記しておきました。

PythonによるJSONを返すHTTPサーバーを簡単に用意する(2)

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()

PythonによるJSONを返すHTTPサーバーを簡単に用意する

似たようなタイトルが続いていますが
今回は、サーバー自体の挙動を変えれば
前回、前々回のようにCGIにせずともJSONを返せるという話。

セットアップ、動かし方については前々回
PythonによるCGIが動くHTTPサーバーを簡単に用意する - てけとーぶろぐ。
をどうぞ。

サーバー本体のプログラムを「server.py」として作成。
同じディレクトリー内にあるJSONファイルの名前でアクセスすると
そのファイルの内容を返すようになっているので
合わせて「test.json」も作成。

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):
        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()
{ 
    "key":"value"
}

クライアント側のプログラムを「client.py」として作成。「test」にアクセスする。

import requests
service_name = 'test'
r = requests.post('http://localhost:8080/' + service_name, 
                  json={"key": "value"})
print(r.status_code)
print(r.json())

PythonのクライアントとPythonのCGIでJSONのやりとり

PythonによるCGIが動くようになったので
クライアントとサーバー(CGI)でJSONでやり取りしてみる。

クライアント側のプログラム
import requests

r = requests.post('http://localhost:8080/cgi-bin/json_service.py', 
                  json={"key": "value"})

print(r.status_code)
print(r.json())

なおWindowsで「python-3.5.2.exe」をインストールしただけだと
「requests」が使えないので以下のコマンドでインストールしておく。

python.exe -m pip install requests
サーバー側のプログラム(CGI)

クライアント側から受けたJSONをそのまま返すコード

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import sys, json

data = sys.stdin.read()
result_json = json.loads(data)

print('Content-Type:application/json\n\n')
print(json.dumps(result_json))

適当なJSONを返すコード

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import sys, json

result_json = {'key': 'value'}

print('Content-Type:application/json\n\n')
print(json.dumps(result_json))