てけとーぶろぐ。

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

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

Androidアプリのアイコン作成

また新しいアプリを作るにあたってアイコンを作っていたのだけど
近頃の Material design 推しのGoogleさんには
結構細かいガイドラインがあるようで、これに従えばそれっぽい感じにできそう。

Icons - Style - Google design guidelines

で、つくるも…

f:id:kurimayoshida:20160504190611p:plain

こら、「Don't.」って言われるパターンだわ…。中途半端に従ってはいけない…。

それから、リソースとして含めるアイコン画像は解像度の種類ごとに作るのが望ましいのだけど、これまた作るのが面倒。
ストア用に 512pixel x 512pixel で作成しておいて、あとはそれを元に、以下のサイトで解像度ごとのものを作成すると楽ちん。

MakeAppIcon - Generate app icons of all sizes with a click!

install.wim や install*.swm から HDD を復元する

Windows 8 のノートPCを購入時の状態に戻したくなった。

HDDの領域を目一杯使いたかったのでHDD内の回復パーティションは削除している。

でも大丈夫。購入直後に復元ディスク(DVD4枚組)をつくっているから。

…て、あれ、復元ディスクからブート出来ない…。

この状態から復元を試みる。

*.SWM ファイルの収集

復元ディスク1枚めの sources フォルダ内や 2枚目以降のドライブ直下にある
Install*.SWM(*には連番の数字) というファイルをコピーして適当なフォルダに格納する。

Install*.SWM を install.wim へとマージする

以下等から Windows ADK をダウンロード、インストールする。

Windows ADK のダウンロード - Windows ハードウェア デベロッパー センター

インストールするのは Deployment Tools のみでOK。

スタートメニューにできた「展開およびイメージング ツール環境」を管理者として実行。
表示されたコマンドプロンプトで以下を実行。

DISM /Export-Image /sourceimagefile:install.swm /SWMFile:install*.swm /Sourceindex:1 /DestinationImageFile:install.wim

※「install.swm」「install*.swm」は先程収集した*.SWM ファイル

install.wim ができるので、USBメモリーにしまう。
install.wim は場合によっては1Gを超える大きさでNTFSフォーマットでないと入らないので注意。

実は*.SWMのままでも大丈夫なのかもしれないけれど試していません…。

USB回復ドライブ の作成

以下を参考に install.wim が入ったのとはべつにUSB回復ドライブを作成する。

USB 回復ドライブを作成する - Windows ヘルプ

イメージの適用

USB回復ドライブで起動する。

ここでさらに、install.wim の入ったUSBメモリーも接続する。

トラブルシューティング」→「詳細オプション」→「コマンドプロンプト
コマンドプロンプトを起動。

install.wim の入ったUSBメモリーのドライブを確認。

HDDをクリーンしてパーティションを切り直す。

select disk 0
clean
create partition primary
format quick fs=ntfs label="Windows"
assign letter="C"
exit

参考:DISM を使ったイメージの適用

以下のコマンドで「install.wim」を適用する。

Dism /apply-image /imagefile:G:\install.wim /index:1 /ApplyDir:C:\

※「G:\install.wim」は「install.wim」のパスに合わせて変えること。

これをしただけだとHDDからの起動に失敗するので
再度USB回復ドライブで起動し
トラブルシューティング」→「詳細オプション」→「スタートアップ修復」
を行うと無事起動できるようになる。

Ruby 1.9.3 + Ruby/Tk + ocra でWindowsデスクトップアプリ作成

数年前に Ruby 1.8 で作ったアプリImageSpiderが動かなくなったとの報告を受け、直そうとするも Ruby はもう 2.3 とかなんだそうで。

とりあえず Ruby 1.9.3 にしたけど
お気に入りだったGUIライブラリwxRubyは更新が止まっているわ、非同期処理が前と同じやり方で動かないわ、他にしっくりくるGUIライブラリがないわ。

仕方なく見た目が嫌いで一度捨てた Ruby/Tk を使うことに。
いくらか工夫すると少しはましになった。

ポイントを書き残しておく。

ocra用のrequire

以下のような相対パスでのrequireはocraでexeファイルにした時に読み込みに失敗してしまう。

require './script'

以下のように書き換えた。

require File.expand_path(File.join(File.dirname(__FILE__), './script'))

いや、日本語を含むパスだと失敗するのでこうか。

require File.expand_path(File.join(File.dirname(__FILE__), './script').encode(__FILE__.encoding))

と思ったらいいものがあった。

require_relative './script'

Ruby/Tkでのウィンドウのアイコンの設定

Medfreak / Ruby/Tk タイトルバーのアイコンを変更する how to change the window icon using Ruby/Tkを参考に、更に、前述の手法で、ocraで同梱したアイコンファイルを読むように。

root = TkRoot.new
iconFilePath = File.expand_path(File.join(File.dirname(__FILE__), 
  './icon.ico').encode(__FILE__.encoding)).encode(Encoding::UTF_8)
Tk::Wm.iconbitmap(root, iconFilePath)

Ruby/Tkでのウィンドウのタイトルの設定

Tk.root.title("タイトル") 

Ruby/Tkでのパディングの設定

Ruby/Tkのサンプルを見ると、大体が隙間なくコントロールが敷き詰められているのだけど、パディングを設定するとだいぶ印象が変わる。以下の「padx」「pady」の部分。
あとはframeやgrid等を使って丁寧にレイアウト…。

@downloadButton = TkButton.new {
  text "ダウンロード"
  command dl
  grid(row: outerRow, column: 0, sticky: :e, padx: 4, pady: 5)
}

ocraでのEXEファイルの作成

最終的には以下のようなコマンドになった。

ocra script.rb --windows --no-autoload --icon icon.ico --output application.exe C:\Ruby193\lib\tcltk\ icon.ico
  • 「--windows」でコマンドプロンプトウィンドウ表示無しに。
  • 「--output」で実行ファイル名を指定。
  • 「--icon」で実行ファイルのアイコンを指定。
  • Ruby/Tkのファイル一式を同梱
  • アイコンファイルを同梱
  • 「--no-autoload」は理解できていないのだけど、指定しないと以下のエラーが出たので…。
C:/Ruby193/lib/ruby/1.9.1/tk/console.rb:13:in `_create_console': interpreter is deleted (RuntimeError)

できあがり

以下みたいな感じに。

f:id:kurimayoshida:20160320234315p:plain

AndroidアプリをつくってGoogle Playストアに公開しよう!

AndroidアプリをつくってGoogle Playストアに公開しよう!」というイベントをやりました。

開発環境構築からGoogle Playストアへのアプリリリースまで3時間でやってしまうというもの。

みなさまのおかげで無事終了。
リリースまでやるというのが珍しかったようで、参加者の感想も悪くなかったです。

当日の資料はこちらー。

qiita.com


でてくるアプリのソースコードはこちらー。

github.com

…当時JavaScriptをよく知らなかったこともありひどいコードですが…。