てけとーぶろぐ。

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

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

PythonによるCGIが動くHTTPサーバーを簡単に用意する

クライアントプログラムのちょっとしたテスト用に
手軽なHTTPサーバーが欲しくなること、ないですか。

簡単なJSONを受けてJSONを返すようなサーバーが欲しいだけなんで
PythonなんかのCGIが動けば十分…みたいな。

ちょっと探してみると、サーバー自体をPythonで作れるらしい。
Windowsでも大丈夫だった。以下手順。

Download Python | Python.org から「python-3.5.2.exe」をダウンロードしてインストール。

サーバー本体のプログラムを「server.py」として作成。

from http.server import HTTPServer, CGIHTTPRequestHandler

class Handler(CGIHTTPRequestHandler):
    cgi_directories = ["/cgi-bin"]

PORT = 8080
httpd = HTTPServer(("", PORT), Handler)
httpd.serve_forever()

「server.py」のあるフォルダー内に「cgi-bin」フォルダーを作成してその中に
CGIプログラムを「test.py」として作成。

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

import cgi, cgitb
form = cgi.FieldStorage() 

# Get data from fields
name = form.getvalue('name')

print ("Content-type:text/html\n\n")
print ("<html>")
print ("<head>")
print ("<title>Hello, world!</title>")
print ("</head>")
print ("<body>")
print ("Hello, %s!" % (name, ))
print ("</body>")
print ("</html>")

コマンドプロンプトを起動して以下を実行するとサーバーが起動する。
「C:\Users\user\AppData\Local\Programs\Python\Python35-32」はPythonのインストール先によって変えてください。
インストール時にPathに追加としている場合は不要です。
「C:\temp」は「server.py」を置いたフォルダーのパスです。

set path=%path%;C:\Users\user\AppData\Local\Programs\Python\Python35-32
cd C:\temp
python server.py

Webブラウザーから「http://localhost:8080/cgi-bin/test.py?name=Kurima」にアクセスしてみると…動いた。

すごい。簡単。

参考:html - How to run a python cgi web server in windows - Stack Overflow

ポケモンGO。

つい先日の友人とのやり取り。

「みんなポケモンGOやりすぎ!

「あのゲーム、歩きスマホ前提だよな。

「いや、操作するとき止まればだけど、まーなー。

「歩きスマホ法が制定されたらスゴそう。

「現行犯でどんどんつかまるな。

「むしろ反発してやるワルガキとかいそう。
 つかまったことを勲章にして
 『ヘヘッ、オレなんか3回もつかまったぜ!』

「つかまっちゃまずいだろ…
 『間抜けなヤツらだ。ポリ公につかまりやがって。俺様ほどになれば…』

「そしたら警察の間で、歩きスマホしてる奴のことを
 隠語で『ポケモン』って呼びだしそう。

「『あ、おれ、今月ポケモン10匹つかまえましたよ。』

「『署長、あそこ、結構ポケモンいますよ。』

「罰金だったらバンバンとれそうだな。

「消費税上げなくて済みそう。

「罰金で財政立て直すとかどんな国だよ。

「『この…ポケモンをお金儲けの材料としか見られないのか!』

「サトシかよ!

…。

英語 音読 筆記 単語帳(1)

というわけで久々にAndroidアプリリリースしました。

英語用の単語帳(単語カード)アプリ。

英語 音読 筆記 単語帳 - Google Play の Android アプリ

特徴としては、音声入力や文字入力で暗記を確認できます。

あとやりたいのは作成した単語帳の共有。
手軽に友達と交換とかできるようにしたい。
サーバー用意しなきゃだろうなー…。

現状はファイルへのエクスポート・ファイルからのインポートのみ対応です。

f:id:kurimayoshida:20160530224929p:plain:w300