PyConJP2017に参加しました

PyConJP2017に参加してきました。1日目が終了したのでとりあえずメモ。

見てきた物リスト&メモ

その他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

  • @puhitaku さんとお知り合いに。スク水はいいぞ
  • 今まで書いてたコンピュータの理論と実装の本は完全に3日坊主状態になりました()

コンピュータシステムの理論と実装 3章

昨日3章の全ての回路を実装したので経過報告、兼モチベーションの維持。(兼ねてるのは逆かも)

3章は順序回路を作りました。2章までは状態を持たない論理回路を組み合わせる「組み合わせ回路」でしたが、この章ではクロックが導入され、DFFを使ってレジスタやRAM、プログラム・カウンタを実装します。

レジスタの実装まで来ると、アセンブリのLD命令の動き方がなんとなく想像が湧いてきます。プログラム・カウンタはマルチプレクサとレジスタだけで作れたんですが、初め何を思ったかALUの機能を使って作ろうとしてました。深夜テンション怖い。

次の4章ではCPUを飛ばして機械語をやるようです。3章までと比べて内容が厚くなってるのが気になります…

ログ: uryoya.hatenablog.com

Python3でQRコードを読み込みたかった

Python3でQRコードを読み取るためにPyPIからパッケージを探したのでメモ。

結論から言うとfastzbarlightが簡単かつ早く読み取りができます。

まえおき

C/C++QRコードやバーコードを読み取らせるライブラリとして有名そうなのはZbarで、公式でPythonのライブラリもありました。 ところがPython2.x用のパッケージしか用意されていなかったので、別のパッケージを探しました。

  1. zbarlight 1.2 : Python Package Index
  2. fastzbarlight 0.0.14 : Python Package Index
  3. libzbar-ctypes 0.1.2 : Python Package Index
  4. pyzbar 0.1.4 : Python Package Index
  5. libzbar-cffi 0.2.1 : Python Package Index

fastzbarlightとzbarlightのパッケージはどうやら元のソースコードは同じようです。fastzbarlightはコンパイルオプションを変えて読み取り速度を向上させたらしい(よくわからん)。 で、(fast)zbarlight、libzbar-ctypes、pyzbar、libzbar-cffiのGithubのスターを比べると、1のzbarlightが41でほかよりも多いです。(他のパッケージは0〜10ちょっとくらい)

選ぶ

読み取りに使った画像はこれ。

f:id:uryoya:20170617152721j:plain

ソースコードはこっち。

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の基本ゲートと、マルチプレクサ、多入力の基本ゲートなどを実装します。ここまでは簡単な回路なので、効率はさておき特に問題なく実装できました。

問題無くと言っても、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);

エラーが解消されました。

HDLのそれぞれの名前はあくまでピンなので、ピン同士の接続を表現する必要がありました。 いつもの癖で高級言語の変数のような書き方をしたのがまずかったようです。

論理回路あたりの低レイヤーな部分を触ったのは高校ぶりなんですが、なかなか楽しいです。

次は第3章の順序回路です。

コンピュータシステムの理論と実装を読み始めた

図書館からオライリーの「コンピュータシステムの理論と実装―モダンなコンピュータの作り方」を借りて、現在読み進めています。

コンピュータシステムの理論と実装 ―モダンなコンピュータの作り方

コンピュータシステムの理論と実装 ―モダンなコンピュータの作り方

本の内容については割愛します。 この本はずっと前から気になっていたものの、忙しい忙しいと言い訳を言って放置していたので一念発起して読み始め、現在1章の終わりまで読み終わりました。 この本は章末に「プロジェクト」と題して、それまでの説明を元に実際にコンピュータを作り上げます。

先ほどサポートページのhttp://www.nand2tetris.orgから必要なソフトウェアをダウンロードしてきたので早速取り掛かりたいと思います。 三日坊主で終わらせずに完遂させたいですね…(遠い目 続きました。以下続編

uryoya.hatenablog.com

長文を書くのがだるいという話

 結論は↑の通りで、あまり根を詰めて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円でした。

所感

 素晴らしいの一言に尽きます。14型の液晶は少し大きいような気もしましたが、むしろ作業領域が広がって楽になりました。本体はMac Book Air 13インチと大体同じ大きさです。重さもだいたい同じのようです。近くに偶然(?)MBAがあったので比べてみました。

全体 f:id:uryoya:20170306005800j:plain

上から f:id:uryoya:20170306005952j:plain

側面 f:id:uryoya:20170306010105j:plain  ベゼルは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が固くてずっと使っていると指が痛くなってきます。

 何よりも良かったのはUbuntuとの相性です。レッツノートとは何だったのか。

 レッツノートUbuntuの記憶を思い返せば、そのままでは輝度調整ができず、設定してもやっとWindowsの1/2くらいの間隔でしか調整できないモニター、何をやっても音が出ないスピーカー、etc…性能的には申し分なかったのですが、色々と手間のかかるマシンでした。しかしこのT460sはUSBブートの段階で輝度調整・スピーカー・トラックポイント等々およそ全ての機能が問題なく使える優秀な娘です。もちろんUbuntu16.04のインストール後も特別な設定をすることなく全ての機能を使うことができています。うっとりです。

 Ubuntuはビビって回復パーティションを残し、セキュアブートを切ってEFI起動するようにインストールしました。Ubuntuセキュアブートに対応しているのですが、どうやらこれを有効にするとサードパーティ製のソフトウェアをインストールするときに躓くようです。めんどくさいことは避けたいのでやむなくセキュアブートは切ることにしました。

 インストールのことはもう少し詳しく書こうと思ったのですが、存外分量が多くなってしまったので別に書こうと思います。気が向いたら。