Bye Bye Moore

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

python

pythonのglobal変数を関数内で利用するときはちゃんと宣言する

ちょっと横着して、グローバル変数を使おうとしたところ UnboundLocalError: local variable 'count' referenced before assignmentなるエラーが。調べてみると、Python公式に以下のような記述が Python では、関数内で参照されるだけの変数は暗黙的にグロー…

Pythonでも正オブジェクトの否定の否定はTrueだった

shuzo-kino.hateblo.jp 以前の記事で、RubyとJavascriptの正オブジェクトの否定の否定をやるとTrueが返ってくるという記事を書きました。 今回はその、Python版 実際のところ RubyやJavascriptと違い、"!"の構文がありません。 !a # 2> SyntaxError: invalid…

モジュールのインポート時にfromを使う理由

特に意味も理解せずサンプルコードに従っていましたが…… fromを経由すると個別のメンバを読み出して短く書いたりできるのですね 実際のところ mathモジュールのsinを使う場合、importだけなら以下のようにします import math math.sin(1) # 0.84147098480789…

Pythonモジュールで定義されているモノを調べる

Pythonモジュールの中身を調べるには、 importした上で組込み関数dirかhelpを使います。 実際のところ では、実際にsqlalchemyの中身を見てみましょうメソッドや特殊変数を見たい場合はdir import sqlalchemy dir(sqlalchemy) #>> ['BIGINT', 'BINARY', 'BLA…

sqlalchemyでデータを順番に並べる

sqlalchemyでデータを順番に並べる方法です 実際のところ idが5未満のデータをid順でソートするには以下のようにします。 for row in session.query(User).\ filter(text("id<3")).\ order_by(text("id")).all(): print(row) 参考もと Object Relational Tut…

sqlalchemyのfilter関数でANDやORな条件を指定する

sqlalchemyにおける検索条件について 実際のところ for user in session.query(User).\ filter(User.name=='ed').\ filter(User.fullname=='Ed Jones'): print(user) 上の例は、以下のように書くこともできます。 session.filter(User.name == 'ed', User.fu…

PythonのORマッパーSQLAlchemyを使ってみる

実際のところ $ pip install sqlalchemyimport sqlalchemy sqlalchemy.__version__ #>> '1.0.15' SQLiteのオンメモリDBをつかって、簡単な読み書きをするには以下のようにします。 from sqlalchemy import create_engine, Table, Column, Integer, String, M…

Pythonで可変長の引数をとる

Pythonで可変長の引数をとる方法です。 ……考えてみれば、あたりまえなのですがリストのスライスを使ってあげればいいです 実際のところ 四個以上あるような引数で、1〜3番目までとそれ以降をそれぞれ別に表示したい場合以下のようにします import sys prin…

pythonのクラスはただのオブジェクト

Rubyだと、クラスはClass型として扱われますね。 class Hoge def fuga() print(21) end end Hoge.class #=> Class ところが……pythonだと素のclassはobjectと同じく'type'を返します class Sample: def func(str): print(str) Class = Sample instance = Clas…

標準ライブラリtimeitで動作時間のサンプルを取る

リファクタリングの結果を取る場合には標準ライブラリtimeitが有効です。 実際のところ $ python -m "timeit" -s "1 + 1" 10000000 loops, best of 3: 0.0202 usec per loopそんな回数は要らないよ、というときは-nオプションを噛ませます $ python -m timei…

"if __name__ == '__main__':"という構文

"if __name__ == '__main__':"という構文をよく見かけますね。 これは、公式だと以下のように説明されています。 A module’s __name__ is set equal to '__main__' when read from standard input, a script, or from an interactive prompt. まぁ、要するに…

psycopg2で画像データを読み書きする

psycopg2で画像データを読み書きする方法です。 実際のところ 画像データの格納にはbytea型を使います。 PostgreSQLのbytea型はmemorybuffer型を返すので、ちゃんとbytes関数なりで整形しないといけません。 import psycopg2 DSN = "dbname=postgres user=sh…

psycopg2でデータをINSERTする

前回に引き続き、psycopg2でデータをINSERTする方法です。 実際のところ imageというbytea型のbyte_dataカラムを持っているテーブルに対し、バイナリデータを叩き込む方法は以下の通り。 import psycopg2 DSN = "dbname=postgres user=shuzo_kino" SQL3 = "I…

psycopg2を使ってPostgreSQLにあるデータを読み出す

psycopg2を使ってPostgreSQLにあるデータを読み出す 実際のところ 以下のSQL文を叩くケースを考えます。 固定の時間値を返す。 imageテーブルからとりあえず一個引っ張り出す せっかくwith節を使う事ができるので使ってみます。 import psycopg2 DSN = "dbna…

Python系の導入時に"BUILD FAILED (OS X x.x.x using python-build y.y.y)"などと出る場合、xcode-selectがうまく導入できていないのかも

今回はmacOSのお話。 多分、他のOS Xでも同じです。Python系の導入時に"BUILD FAILED (OS X x.x.x using python-build y.y.y)"などと出る場合、xcode-selectがうまく導入できていないのかも知れません。 実際のところ 背景 postgresqlをpythonで使うpsycopg2…

pillowで画像を回転させる

# 時計回りに45度 out = im.rotate(45) #左右反転 out = im.transpose(Image.FLIP_LEFT_RIGHT) #上下反転 out = im.transpose(Image.FLIP_TOP_BOTTOM) #90度、180度、270度回転 out = im.transpose(Image.ROTATE_90) out = im.transpose(Image.ROTAT…

python3のprintf関数のオプション

python3のprintf関数のオプションでは改行文字や、イテレータ形式のくっつける文字を指定できたりします。 これはPEP3105文章で設定された話です。 実際のところ くっつける文字はsepで指定。 str = "hoge" print(*str, sep="+") #>> h+o+g+e 終端文字をつけ…

python3でも使える画像操作ライブラリPillow

Pillowはpython3でも使える画像操作ライブラリです。 参考もと サムネイル from __future__ import print_function import os, sys from PIL import Image size = (128, 128) for infile in sys.argv[1:]: outfile = os.path.splitext(infile)[0] + ".thumbn…

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…

bottleのredirectとabort

処理エラーやURLミスなどのときに活用したい一連の処理。 最小構成のbottleはこういうモノも外付けパッケージです。 種類としては、特定のURLに飛ばすredirectと自動生成タイプのabortがあります。 実際のところ abort 特定のエラーコード付きでエラーページ…

pythonでsqlite3を扱う

sqliteはSQL使いたいけど、DB鯖立てるほどで無いようなケースで重宝するRDBMSです。 RasPiで動かすような軽々システムでは大変重宝します。 pythonにはデフォでsqlite3用のライブラリが入っています。 実際のところ 利用開始 import sqlite3 DBの作成/読み込…