PyConJP2017に参加しました
PyConJP2017に参加してきました。1日目が終了したのでとりあえずメモ。
見てきた物リスト&メモ
- ベンリに使おう変数アノテーション - typing.pyとの楽しいお付き合い
- 最近Scalaを始めて型の良さを再認識したところだったので、ある程度Pythonでも享受できそうなのがGoodだなっと思った
- Generic!
- typemarshal是非とも使いたい!
- Pythonとパッケージングと私
- setup.py書いたことはあったんですが、どこかのblogから引っ張ってきただけです🙏
- と思ってソースコード見なおしたらdistutilsが使われててあれ()今度から真面目に書きます…
- Djangoフレームワークのユーザーモデルと認証
- HTTP通信のお話からスタート
普段flask使ってるからdjangoの多機能さが際立って見える #pyconjp #pyconjp_202
— virtual-kabe (@kabe_arm) 2017年9月8日
- len()関数がオブジェクトの長さを手にいれる仕組み
- 何故
obj.length()
ではなくlen(obj)
なのか list
とiter()
とfor
と- Pythonの思想が透けて見える…!
- 何故
- PythonでOAuth『サーバ』を構築した話
- OAuthの規格通り実装するの大変そうだ…
- プロダクト開発して分かったDjangoの深~いパーミッション管理の話
- 2ヶ月前に似たようなところで詰んでいた
- スライドによると自分はLv.2です(?) 自分が実装したのはFlaskだったけど
- 色々ライブラリが出ているあたり悩む人は多いんだなぁ
- Secrets of a WSGI master.
- WSGI気になったので調子に乗って英語講演を聞いたんですがやっぱりアメリカ語わかりませんでした…
その他1
色々ひどいまとめだけど、ひどいついでに試しに実行したやつをそのまま貼り付ける
In [1]: import typing In [8]: def f(arg: List[str]) -> List[str]: ...: return arg ...: In [9]: f(['hoge', 'piy']) Out[9]: ['hoge', 'piy'] In [10]: f([1, 2, 3]) Out[10]: [1, 2, 3] # 実行時型チェックするわけではないのだな(?) IPythonだったからか? In [12]: List[str].mro() # mro()、初知り Out[12]: [typing.List[str], typing.List, list, typing.MutableSequence, collections.abc.MutableSequence, typing.Sequence, collections.abc.Sequence, typing.Reversible, collections.abc.Reversible, typing.Collection, collections.abc.Collection, collections.abc.Sized, typing.Iterable, collections.abc.Iterable, typing.Container, collections.abc.Container, typing.Generic, object] In [13]: List[str].__args__ Out[13]: (str,) In [14]: List[List[str]].__args__ Out[14]: (typing.List[str],) In [15]: Optional[str].__args__ Out[15]: (str, NoneType) In [16]: int in vars(__builtins__).values() Out[16]: True In [17]: class WaruiObj: ...: def __len__(self): ...: return '0' ...: In [18]: len(WaruiObj()) --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-18-49ec83f96080> in <module>() ----> 1 len(WaruiObj()) TypeError: 'str' object cannot be interpreted as an integer In [19]: # len() Adapter In [20]: len(1) --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-20-8b3587a43b59> in <module>() ----> 1 len(1) TypeError: object of type 'int' has no len() In [21]: # デザインと歴史FAQ In [22]: iter([1,2,3,4]) Out[22]: <list_iterator at 0x7f84595512e8>
その他2
コンピュータシステムの理論と実装 3章
昨日3章の全ての回路を実装したので経過報告、兼モチベーションの維持。(兼ねてるのは逆かも)
3章は順序回路を作りました。2章までは状態を持たない論理回路を組み合わせる「組み合わせ回路」でしたが、この章ではクロックが導入され、DFFを使ってレジスタやRAM、プログラム・カウンタを実装します。
レジスタの実装まで来ると、アセンブリのLD命令の動き方がなんとなく想像が湧いてきます。プログラム・カウンタはマルチプレクサとレジスタだけで作れたんですが、初め何を思ったかALUの機能を使って作ろうとしてました。深夜テンション怖い。
次の4章ではCPUを飛ばして機械語をやるようです。3章までと比べて内容が厚くなってるのが気になります…
Python3でQRコードを読み込みたかった
Python3でQRコードを読み取るためにPyPIからパッケージを探したのでメモ。
結論から言うとfastzbarlightが簡単かつ早く読み取りができます。
まえおき
C/C++でQRコードやバーコードを読み取らせるライブラリとして有名そうなのはZbarで、公式でPythonのライブラリもありました。 ところがPython2.x用のパッケージしか用意されていなかったので、別のパッケージを探しました。
- zbarlight 1.2 : Python Package Index
- fastzbarlight 0.0.14 : Python Package Index
- libzbar-ctypes 0.1.2 : Python Package Index
- pyzbar 0.1.4 : Python Package Index
- libzbar-cffi 0.2.1 : Python Package Index
fastzbarlightとzbarlightのパッケージはどうやら元のソースコードは同じようです。fastzbarlightはコンパイルオプションを変えて読み取り速度を向上させたらしい(よくわからん)。 で、(fast)zbarlight、libzbar-ctypes、pyzbar、libzbar-cffiのGithubのスターを比べると、1のzbarlightが41でほかよりも多いです。(他のパッケージは0〜10ちょっとくらい)
選ぶ
読み取りに使った画像はこれ。
ソースコードはこっち。
zbarlight (fastzbarlightはzbarlightのモジュール名を変えただけです。)
from PIL import Image import zbarlight import argparse parser = argparse.ArgumentParser() parser.add_argument('FILE', help='QR code image file') args = parser.parse_args() with open(args.FILE, 'rb') as img_file: image = Image.open(img_file) image.load() codes = zbarlight.scan_codes('qrcode', image) print(f'QR codes: {codes}')
libzbar-ctypes
from PIL import Image from libzbar import zbar import argparse parser = argparse.ArgumentParser() parser.add_argument('FILE', help='QR code image file') args = parser.parse_args() with open(args.FILE, 'rb') as img_file: image = Image.open(img_file).convert('L') width, height = image.size raw = image.tobytes() image = zbar.Image(width, height, 'Y800', raw) scanner = zbar.ImageScanner() scanner.scan(image) for symbol in image: print('decode', symbol.type, 'symbol', symbol.data) del(image)
pyzbar
from pyzbar.pyzbar import decode from PIL import Image import argparse parser = argparse.ArgumentParser() parser.add_argument('FILE', help='QR code image file') args = parser.parse_args() with open(args.FILE, 'rb') as img: codes = decode(Image.open(img)) print(f'QR codes: {codes}')
libzbar-cffiはめんどくさくなってやってないです()
time -p
で実行時間を図った結果は次の通り。なお平均とかは取ってないです。
package | real | user | sys |
---|---|---|---|
zbarlight | 1.59 | 1.56 | 0.03 |
fastzbarlight | 1.42 | 1.37 | 0.04 |
libzbar-ctypes | 2.25 | 2.23 | 0.02 |
pyzbar | 2.29 | 2.24 | 0.05 |
fastzbarlightが一番早く実行が終わり、次いでzbarlight、遅れてlibzbar-ctypes、pyzbarという結果になりました。
libzbar-ctypesはスキャンデータがlibzbar.zbar.Imageオブジェクトになるのでforで取り出す処理が入っています。ただその処理をなくしても速度にあまり変化はありませんでした。
結論としては(fast)zbarlightを使っておけば良さそうです。
コンピュータシステムの理論と実装 1..2章
前回記事から「コンピュータシステムの理論と実装」を読み始めて、現在2章のブール算術まで読み終わった&専用HDLで実装が終わりました。
第1章はNAND回路からAND、OR、NOT、XORの基本ゲートと、マルチプレクサ、多入力の基本ゲートなどを実装します。ここまでは簡単な回路なので、効率はさておき特に問題なく実装できました。
頭の悪そうな実装の図 pic.twitter.com/wQ4ajRpVPv
— かべ (@kabe_arm) 2017年5月30日
問題無くと言っても、nand2tetrisのプロジェクトについてきたテストが通っただけなので実用上は問題ありそうですが…今回は動けばいいという方針で()
第2章では加算器やALU(算術論理演算子)(Arithmetic Logic Unit)の解説と実装です。ALUを略さない呼び方はさっき調べました。
でそのALUを実装するときハマったので書き記しておきます。
この本のALUのoutバス(16bit)は、最後にoutをゼロチェックと負チェック(?)する仕様になっています。そこではじめに
... OUT out[16],... Mux16(a=fOut, b=notFOut, sel=no, out=out); Or8Way(in=out[0..7], out=...);
というようにチェック用にoutを使ったのですが、出力ピンであるoutを使うなと怒られてしまいました。
安直にoutピン以外に繋げば…と思いましたが
Mux16(a=fOut, b=notFOut, sel=no, out=out); Mux16(a=fOut, b=notFOut, sel=no, out=cc); Or8Way(in=cc[0..7], out=...);
内部のサブバスをそうやって使うな💢と言われました…。
そこで次のようにすると
Mux16(a=fOut, b=notFOut, sel=no, out[0..7]=czr1, out[8..15]=czr2, out[15]=cng, out=out);
エラーが解消されました。
さっき理解が追いつきました!!ALU実装できた嬉しい!!! pic.twitter.com/WQdBlKUPWX
— かべ (@kabe_arm) 2017年6月4日
HDLのそれぞれの名前はあくまでピンなので、ピン同士の接続を表現する必要がありました。 いつもの癖で高級言語の変数のような書き方をしたのがまずかったようです。
論理回路あたりの低レイヤーな部分を触ったのは高校ぶりなんですが、なかなか楽しいです。
次は第3章の順序回路です。
コンピュータシステムの理論と実装を読み始めた
図書館からオライリーの「コンピュータシステムの理論と実装―モダンなコンピュータの作り方」を借りて、現在読み進めています。
コンピュータシステムの理論と実装 ―モダンなコンピュータの作り方
- 作者: Noam Nisan,Shimon Schocken,斎藤康毅
- 出版社/メーカー: オライリージャパン
- 発売日: 2015/03/25
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (3件) を見る
本の内容については割愛します。
この本はずっと前から気になっていたものの、忙しい忙しいと言い訳を言って放置していたので一念発起して読み始め、現在1章の終わりまで読み終わりました。
この本は章末に「プロジェクト」と題して、それまでの説明を元に実際にコンピュータを作り上げます。
先ほどサポートページのhttp://www.nand2tetris.orgから必要なソフトウェアをダウンロードしてきたので早速取り掛かりたいと思います。
三日坊主で終わらせずに完遂させたいですね…(遠い目 続きました。以下続編
長文を書くのがだるいという話
根詰めてブログ書くの、さっぱり長続きしないしもう少し完結にしていくか
— かべ (@kabe_arm) 2017年4月30日
結論は↑の通りで、あまり根を詰めて1記事に1時間強かけて書くとだんだん億劫になってしまい、さっぱり更新しなくなってしまいまして。定期的にそこそこの長文を書くことと、ただの備忘録的なことがやりたかったので今回からはあっさり書くことにします。という自己暗示でした。-完-
ところで、最近周りの人の影響でgolangとかscalaとかrustを触り始めたんですが、型のついてる言語はなかなか気分が楽でいいですね。コンパイラがエラーを出してくれる環境からしばらく離れていましたが、間違っているところがあれば先に教えてくれる方が怠け者としても嬉しいです。作りががお粗末なまま実行して問題が出ると「あ゛あ゛あ゛あ゛あ゛あ゛」と悶絶する羽目になるので…
さくっと作れるスクリプト言語と上手く使いわけていきたいです。
Thinkpad T460s を購入した
衝動的に始めたブログが気づいたら1ヶ月以上更新されないまま、路傍に打ち捨てられそうになっていたので慌てて更新しました。すでにT460sの記事は大量にあり、Thinkpadシリーズの次のモデルも出揃っているので今更感はすごいですが、せっかくのネタなので書いておきます。
経緯とか
今まで使っていた大学推奨PCであるところのLet’s note CF-SX4と、Linuxとの相性の悪さにいい加減うんざりしたとか、英字キーボードでないとプログラミングできない体に改造されてしまったとかで買い換えることにしました。レッツノートちゃんにはWindows専用機としてこれからもレポート作成で頑張ってもらうことにします。
構成
- プロセッサー : インテル Core i5-6200U プロセッサー (2.30GHz, 3MB)
- 初期導入OS : Windows 10 Home 64bit -> 購入後Ubuntu16.04に
- ディスプレイ : 14.0型FHD液晶 (1920x1080 IPS) タッチ非対応
- メモリー : 8GB PC4-17000 DDR4 (4GBオンボード+4GB (1スロット使用))
- グラフィックス : インテル HD グラフィックス 520
- カメラ : カメラ(HD 720p対応)あり、マイクロフォンあり
- キーボード : 英語キーボード (バックライト付)
- 指紋センサー : 指紋センサーあり
- TPMセッティング : TPMあり(TCG V2.0準拠)
- ハード・ディスク・ドライブ : 256GB ソリッドステートドライブ SATA (OPAL対応)
- フロント・バッテリー : 3セル リチウムイオンバッテリー (23.5Wh) 前面
- リア・バッテリー : 3セル リチウムイオンバッテリー (26Wh) 背面
- 電源アダプター : 45W ACアダプター
- ワイヤレス : インテル Dual Band Wireless-AC 8260(2x2) + Bluetooth 4.1 vPro対応
- 標準保証 : 1年間 引き取り修理
学割を使って、締めて97,394円でした。
所感
起動(数時間後にはubuntuに変えるけど pic.twitter.com/P5aewLLjhv
— かべ (@kabe_arm) 2017年2月28日
素晴らしいの一言に尽きます。14型の液晶は少し大きいような気もしましたが、むしろ作業領域が広がって楽になりました。本体はMac Book Air 13インチと大体同じ大きさです。重さもだいたい同じのようです。近くに偶然(?)MBAがあったので比べてみました。
全体
上から
側面 ベゼルはThinkpadの方が小さいです。薄さは流石Mac Book Airと言ったところでしょうか。新型のMac Book Proはこれよりさらに薄いので驚きです。
本体寸法(単位:mm) | Thinkpad T460s | Mac Book Air |
---|---|---|
幅 | 331 | 325 |
奥行き | 226.8 | 227 |
高さ(最大) | 18.8 | 17 |
実寸もだいたい同じ大きさみたいです。重さはT460sが1.36kg、MBAが1.35kgで後者のほうが若干軽いようですが、持った感じでは大差無いです。
キータッチはレッツーノートよりも少し硬い気もしますが打ちづらくはないので問題なし。ただ特徴の赤いTrackPointが固くてずっと使っていると指が痛くなってきます。
待ち切れませんでした pic.twitter.com/JwlbpcoZt7
— かべ (@kabe_arm) 2017年2月28日
何よりも良かったのはUbuntuとの相性です。レッツノートとは何だったのか。
レッツノートとUbuntuの記憶を思い返せば、そのままでは輝度調整ができず、設定してもやっとWindowsの1/2くらいの間隔でしか調整できないモニター、何をやっても音が出ないスピーカー、etc…性能的には申し分なかったのですが、色々と手間のかかるマシンでした。しかしこのT460sはUSBブートの段階で輝度調整・スピーカー・トラックポイント等々およそ全ての機能が問題なく使える優秀な娘です。もちろんUbuntu16.04のインストール後も特別な設定をすることなく全ての機能を使うことができています。うっとりです。
Ubuntuはビビって回復パーティションを残し、セキュアブートを切ってEFI起動するようにインストールしました。Ubuntuはセキュアブートに対応しているのですが、どうやらこれを有効にするとサードパーティ製のソフトウェアをインストールするときに躓くようです。めんどくさいことは避けたいのでやむなくセキュアブートは切ることにしました。
セキュアブート有効にするとサードパーティのソフトが使えないなんてのがあるのか。初耳 pic.twitter.com/q1aGTG79Ko
— かべ (@kabe_arm) 2017年2月28日
インストールのことはもう少し詳しく書こうと思ったのですが、存外分量が多くなってしまったので別に書こうと思います。気が向いたら。