Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

python

0.0.0.0は来るもの拒まずの特殊なIPv4アドレスである

0.0.0.0は来るもの拒まずの特殊なIPv4アドレスです。IPv6だと::128*1になります。というわけで、bottleで以下のようにやると簡易的に自分のPCを外からアクセスできるWEB鯖にすることができます。 run(host='0.0.0.0', port=8080) たとえば、自前のアドレスが…

Bottleで直接送りつけられる画像データを受け取る

以前の例ではformリクエストに載った画像ファイルを扱いました。 ただ、送信デバイスの都合によっては直接データを叩きつけるような奴もあります。 この場合は、どうしたらいいのでしょうか? 実際のところ esp8266で以下のように指定URLに対し直接画像を叩…

標準ライブラリのargparseでCLIパーサ

$ python -m serial.tools.list_ports --help usage: list_ports.py [-h] [-v] [-q] [-n N] [regexp] Serial port enumeration positional arguments: regexp only show ports that match this regex optional arguments: -h, --help show this help message…

Pythonでディレクトリ中のファイルをソートし最新版をとってくる

Pythonでディレクトリ中のファイルをソートし最新版をとってくる方法です。 実際のところ Bottleで"/tmp/img"にある時間の画像の最新版を取るスクリプトは以下の通り。 タイムスタンプをファイル名として居る時、logfiles[-1]が最新です。 import os @get('/…

Bottleで画像を受け取る

Bottleで画像を受け取る方法です 形式としては、formで添付ファイルとして来ているようなケースを想定します。 このスクリプトでは組込み機器との連携を前提にしているので投稿フォームは無し。 実際のところ Jpeg画像を受け取るケースを考えます。 @post('/…

Python組み込み関数filterは条件にあったものを抽出する

Python組み込み関数filterはiterableなオブジェクトから条件にあったものを抽出します。 Rubyで言うところのselectみたいなモンですかね 実際のところ def flt(x): return x > 4 list(filter(flt, [9,1,5,4,2,2,0])) #>> [9, 5] 参考もと 2. 組み込み関数 — …

findall関数やfinditer関数でゴチャゴチャした文字列から必要なものだけ引っ張り出す

finallやfinditerは標準付属の正規表現ライブラリにくっついている関数です。 何やらゴチャゴチャした文字列がある その中でほしいのは一部 結果は文字列型にしたい というような要件で役に立ちます。 実際のところ findall 最も雑な方法はfindallで指定して…

Bottleで簡易なデータ受信用鯖をつくる

とりあえずデータを受信したか確認したい時のための簡易API鯖です。 form形式とjson形式を受け取る方式を考えてみます。 実際のところ bottleなら最小構成で楽々。 from bottle import post, request, run @post('/') def receivedata(): body = request.par…

Pythonの"-m"オプションが探しに行っている場所

Pythonの"-m"オプションが検索しているパスは sys.pathで確認できます。 実際のところ ためしに、REPLでみてみましょう。 import sys sys.path #>> ['', '/Users/shuzo_kino/.anyenv/envs/pyenv/versions/3.4.3/lib/python34.zip', '/Users/shuzo_kino/.anye…

format関数の文字詰めについて

format関数には文字詰め用オプションがあります。 実際のところ 中央は「^」、左詰めは「」 '{:=^30}'.format('Sample string') #>> '========Sample string=========' '{:=<30}'.format('Sample string') #>> 'Sample string=================' '{:=>30}'.f…

ビルトイン関数zipの使いみち

Pythonのビルトイン関数zipはiterate可能なモノをくっつける 実際のところ 試しに、rangeと文字列をくっつけてみます。 形態としてはzipオブジェクトとして格納されるみたいです。 zp = zip(range(0,100,20), 'abcde') #>> <zip object at 0x1014386c8> ビルトインのlist関数を使ってあ</zip>…

16進数文字列をbytesarray型に

前回は文字列をそのままBytes型に変換する方法でした。 今回は16進数文字列をbytesarray型にする方法です。 実際のところ bytearrayのfromhex関数に渡すだけです。 "0x"とか入っていると使えないので注意してください。 bytearray.fromhex('00DE00AD00BE00EF…

encode関数を使って、String型をBytes型に変更する

Pythonで文字列整形といえば……formatですね。 こいつをつかえば、ビット芸もこの通り。 "{:04X}{:04X}{:04X}{:04X}".format(0xde,0xad,0xbe,0xef) #>>'00DE00AD00BE00EF' とはいえ、諸般の都合でbyte型じゃないと困るケースもあるでしょう。 シリアル通信に…

subとグループの参照を使って、順番を並び替えた新データをつくる

Pythonの正規表現ライブラリ"re"は機能が充実しています。 文字列の置き換えに使うsub関数とグループ参照を併用すると必要部分を抽出して並び替え……みたいな事は割りとスマートにいけます。 実際のところ こんな例があったとします。*1 データは次の形式でく…

pySerial付属のシリアルポートリストコマンド

python用のシリアル通信用ライブラリpySerialには現状接続している周辺機器のリストを出すコマンドが付属しています。 実際のところ $ python -m serial.tools.list_ports -v /dev/cu.Bluetooth-Incoming-Port desc: n/a hwid: n/a /dev/cu.GMSPP01-101E-Ser…

PythonでURLエンコード/デコード

PythonでURLエンコード/デコードする方法です。 実際のところ マルチバイト文字列をURLエンコードするにはquote_plus print(urllib.parse.quote('日本語')) #>> %E6%97%A5%E6%9C%AC%E8%AA%9E URLエンコードされた文字列をマルチバイト文字列にするにはunquot…

関数デコレータなる機能

関数の前にある「@」で記述されたアレ、関数デコレータというそうです。 本体に変更を与えることなく、追加の機能を提供します。 実際のところ 関数に入った時メッセージを追加するデコレータ"start_msg"を考えます。 実装すると、こんな感じ def start_msg(…

atexitモジュールはスクリプト終了処理を記述可能

標準添付のatexitモジュールはプロセス終了時の動作を記述かのうです。 もう末尾にやっつけ終了処理を書かなくても良いのです(涙 実際のところ import atexit @atexit.register def end(): print("Done:The Process") print("first") $ python test_exit.py…

Pythonではライブラリと同名ファイルを同一ディレクトリに置くと……クラッシュする

今回は実にショーもない話です。 Pythonではライブラリと同名ファイルを同一ディレクトリに置くと……クラッシュします。 実際のところ REPLでゴリゴリ作っていた内容をファイルとして作り変えた所、以下のようなエラーが。 $ python contextlib.py Traceback …

組み込み関数maxを文字列に適用すると……ascii順で最大の文字を返す

組み込み関数maxは順番処理が可能なデータ型に対して最大の値を返してくれる関数です。 ところで文字列は順番処理が可能です。 ……文字列にmaxを適用すると、どうなるか? その文字列中で、ascii順で最大の値を返してきます。 どっかの馬鹿のように、エラーを…

PythonでUUIDをつかう

uuidはそれぞれ衝突しないIDを実装者が自由なタイミングで生成できる仕組みです。 iOSアプリを開発してる人なんかだと、ベータ版ユーザさんからかき集める例の16進数文字列というと分かり易いかも? 一応、理論上は衝突し得ますが 仮に毎秒数億個以上のスピ…

PythonでもLambda式

みんな大好き無名関数! Lambda式はPythonにもあります。 実際のところ 特に何も読み込まずに定義可能です。 a = lambda x: map(int, x.split(',')) コールする時は引数として。 a('12,24') #>> [12, 24] a('2, hoge') #>> ValueError: invalid literal for …

bottleのURLキャプチャで正規表現をつかう

bottleのURLキャプチャで正規表現をつかう方法です。 エントリ番号を入力する所で文字列や日本語を投入されないようにできます。 実際のところ 一致させる場合 @get('/blog/:num#[0-9]+#') 特定の文字列だけキャプチャという事も可能 @get('/hello/:name#(sh…

bottleにファイルの変更を検知してリロードする機能を加える

bottleにも、ファイルの変更を検知してリロードする機能が備わっています。 ある程度性能とトレードオフな所があるので、開発段階でTrue、実用段階でFalseにしてしまえばいいでしょう。 実際のところ 普通のrunにreloader=Trueを付け加える。 それだけです。…

bottleでJSONを返す

bottleでJSONをゲットしたい場合……何も考えずに辞書型を放り込むと"Content-Type: application/json"で返してくれます。 実際のところ 文字と現在時刻を返したい場合、以下のようにします。 @get('/api/status') def api_status(): return {'status':'online…

pythonで使えるORMapper「peewee」

今回はpythonで使えるORMapperの「peewee」を試してみます。 実際のところ 今回は既存のDBを流用するパターン。 from peewee import * from playhouse.sqlite_ext import SqliteExtData db = SqliteExtDatabase('blogtest.sqlite') db.connect() で、このpee…

bottleとsqlite3を連携させて簡単なメモ表示ツール その4:フロントエンド・フレームワークを使う

前回はJadeを導入しました。今回はCSSやJS、画像やフォントがテンコ盛りのフロントエンド・フレームワークをbottleで使う方法を考えます。 実際のところ 導入 designmodo.github.io 上記サイトから、twitter-bootstrapの拡張版「Flat UI」を頂いてきます。 …

bottleとsqlite3を連携させて簡単なメモ表示ツール その3:テンプレートエンジンJadeを使う

bottleにはデフォでerbっぽいテンプレートエンジンが搭載されています。 ……とはいえ、今更タグ閉じなんてカッたるい事をやる気にもなりません。 ここは一つ先人の叡智をお借りして、jadeをbottleで使ってしまいましょう 実際のところ 導入 まずは導入。 jade…

bottleとsqlite3を連携させて簡単なメモ表示ツール その2:POSTする

前回の続きで、今回はPOST動作です。 実際のところ まず、子パッケージのpostとrequestを突っ込みます。 from bottle import get, post, request, run, template, static_file, error getの後にpostを追記。 @post('/blog') def postBlog(): body = request.…

bottleとsqlite3を連携させて簡単なメモ表示ツール その1:存在するデータの表示

bottleとsqlite3を連携させて簡単なメモ表示ツールをつくる方法です。 第一回目は存在するDBからデータの表示する方法です。 実際のところ あらかじめ、blogpost.sqliteというDBを作った上でtableも用意しておきます。 /blogにアクセスしたら、最新の記事 /b…