Python3を書いている

ここ最近趣味で作っているツールの開発にPythonを使っている。Pythonの知識は4年以上前に仕事で2.7のスクリプトを書いていた頃で止まっていたんだけど、今回は個人開発だし一気に3.6へジャンプして色々新機能を試しながらコードを書くことにした。

今回はこの開発中に行った環境構築とか、使ってみて良いと感じたPython3の機能についてまとめる。

開発ツール

PyCharmを使うようにした。今では無償で利用できるCommunity Editionが出てるので、自分のようにちょっとした趣味でPythonを書くライトユーザでもPyCharm一択じゃないかと。

最初Emacsで書き始めるためにあれこれ設定を書いていたんだけど、やっぱりIDEインストールしてサッと書き始められる方がいい。PyCharmはキーバインド以外一切カスタマイズ無しで満足に開発できている。

Interpreter

HomebrewでPython3をインストールする。そういえば、まさにこれを書いている最中に色々とゴタゴタが話題になっていたようですね。 (参考:Homebrewでインストールされる/usr/local/bin/pythonが再びPython2に変更)

てっきり brew install python すると2.7が入るものだと思っていたので、インストールは普通にpython3 formulaを指定した。

$ brew install python3
$ python3 -V
Python 3.6.4

次に開発ディレクトリ用にパッケージのインストール空間を独立させる。Python3.3からはvirtualenv相当のvenvというのが標準で組み込まれているので、 python3 -m venv ./venv とするだけで仮想空間を作ることができる。pythonpip 等の実行ファイルも venv/bin 下に入り、PyCharmだと自動でこれを使用するinterpreterとして認識してくれる。

f:id:horimislime:20180312193829p:plain

自分の場合ソースディレクトリはGitでバージョン管理しつつ、iCloudで同期しているDesktop下に置いて複数端末で共有してる。venvも丸ごと同期してあると、開発端末が変わっても全く同じインタプリタとパッケージをすぐに使い始められて便利だった。

Python3以降で良いと感じた仕様

次に、実際にコードを書いていて重宝した新機能を抜粋。

文字化けしなくなった

Python初心者が真っ先にハマると思われるアレが無くなってた。Python3からはUTF-8がデフォルトのencodingになっており、ファイル行頭の coding: utf-8 記述も不要に。

文字列フォーマット

昔は文字列formattingに print 'hello %s' % nameみたいなことをしていたが、3.6からより直感的に書けるようになった。IDEを使っていればブラケット内で変数のメソッドを呼ぶ際補完も効く。

name = 'horimislime'
print('Hello {name.upper()}') # 'Hello HORIMISLIME'

Enum

3.4.1からEnumが標準で使える。classなので勿論メソッドも生やせて便利。

from enum import Enum

class HTTPMethod(Enum):
    Get = 'GET'
    Post = 'POST'
      ...

    def description(self):
        if self == HTTPMethod.Get:
            return '...'
        elif self == HTTPMethod.Post:
            ...

Pythonにはswitchが無いけれど、enumがあるとつい欲しくなってしまう。

async/await

非同期処理をasync/awaitで書けるようになった。promiseライクなことをやりたい時も簡潔に記述できる。

async def update():
    await execute_first()
    await execute_second()


async def execute_first():
    time.sleep(3)
    print('first operation')


async def execute_second():
    time.sleep(1)
    print('second operation')


asyncio.get_event_loop().run_until_complete(update())

Type Hinting

変数に型アノテーションを付けられるようになった。例えば以下のように関数を書いているとき引数に対して補完が効くようになり開発効率が上がった。

def greeting_message(name: str) -> str:
    return f'hello {name.upper()}' # nameに対して補完が効く

型を指定できるようになったので、型がマッチしない代入にも気づける事を期待してたんだけど、これに関しては少しPyCharmのサポートが弱かった。関数に渡す引数の型が合っていないと警告を出してくれるんだけど、以下のような変数への代入では警告が出ない。

def greeting_message(name: str) -> str:
    return f'hello {name.upper()}'

message = greeting_message(name=1234) # 引数にwarning
x: int = greeting_message(name='horimislime') # warningなし

これに関しては python/mypyでチェックをかけると検出できるらしい。ただPyCharmで使うには今のところ手動でmypyを実行するしかなさそうなので、今後のインテグレーション強化に期待。

以上

What’s New in Python — Python 3.6.4 ドキュメントなどを眺めながらここ半月くらいPythonを書いてきた。

元々ヘビーに書いていた訳ではないので、だいぶ初心者に近い視点でPython3を見ていると思う。けれどencoding周りの変更だったり、はじめの環境セットアップのややこしさ(pyenv・virtualenv・virtualenvwrapper…等のツールの乱立)が公式moduleの登場でシンプルになったりと、これからPythonを書き始める人にとっても嬉しい改善が多い気がする。

最近ずっとSwiftを書いていたのでだいぶモダン寄りな言語から入ってきた形になったけど、こうした環境面の改善だったり言語仕様のパワーアップでそんなに戸惑うこともなかった。むしろasync/awaitはSwiftでも使えると便利だなと思ったりもした。

HHKB Type-SをBluetooth接続できるようにした

f:id:horimislime:20180308154731j:plain

有線タイプのHHKB Pro2を無線化できる改造方法が公開されていたので、前からBluetooth版が出たら買い換えたいと思っていた手持ちのType-Sで試してみることにした。

この改造の良いところは手軽・安価・筐体を傷つけたりすることなくBT対応できるところ。上の写真の下側にある、USBポート等が乗っている基板を交換するだけでBluetooth対応ができる。基板は純正品とほぼ同じサイズで、バッテリー込みで筐体に収まるので見た目を損なうこともない。

上記リンク先で丁寧に解説がされているので特に書くことは無いけど、手順は以下の通り。

分解も楽なのですぐに組み上げられるはず。基板を交換するとこんな感じで、USB-Aポートの穴からBluetoothのON/OFFトグルを操作したり接続インジケータを確認できる。

リチウムイオンポリマー電池を積んでいてちょっと怖いので、外出中は充電を避けてBTも切ってる。今のところ全く問題なく使えていて、電池も2日くらい持ってるので満足してる。

見た目もHHKB BTモデルのような電池ボックスのでっぱりも無くスッキリしてるし、何より念願だったType-Sの無線化ができたので買ってよかった。

f:id:horimislime:20180308155543j:plain

MacBook Pro 2017 + LG Ultra Fine 5Kディスプレイを購入

f:id:horimislime:20180204115455j:plain

長いこと会社支給のMBP Late 2013を使ってたので、私物のMacを買うのは2012年にMBP Late 2011を購入して以来の6年ぶり。

買ったモデルはMacBook Pro 2017 15インチの最上位モデル(SSDだけ上限一個下の1TB)。整備済製品を買ったのでだいたい5万円くらい安く手に入った。ここ最近整備済MBPの在庫が潤沢なようで、今確認してもかなりのバリエーションが購入可能な様子。今回は同時にLG Ultra Fine 5Kディスプレイも買った。

2週間ほど使ったので感想を。

  • タッチバー
    • クリエイティブ系ツールをよく使う人は重宝するかも。写真.appのレタッチのスライダーを使う時に便利だった
    • ただし対応してないアプリが多い。メインで写真加工に使ってるLightroom CCも未だ非対応…
    • Touch IDは明らかに便利で、もう非搭載モデルには戻りたくない
  • USB-C
    • リビングにNintendo Switchがあるので、電源が足りなくなった時にMacのアダプタを持ってこなくても充電できて便利
    • 端末の左右どちらのUSBポートからも給電できるのは地味に嬉しい。ケーブルの取り回しが楽
  • Ultra Fine 5Kディスプレイ
    • USB-C一本で映像出力・充電できる。たかが一本繋ぐケーブルが減っただけでも快適
    • MBPのタッチバーで輝度調整ができたり、ちゃんと専用アクセサリーとして作られてるなぁという感じ
    • 画質は何も文句なし。写真を撮ったらこれに映すのが楽しみになる

マシンスペックは変化を感じられなかったけど、全体的に良い印象。新型MBPは割高・タッチバー無駄・不具合多すぎ などなど良い評判を聞かないので避けてたけど、個人的には満足してるしもっと早く買えば良かったなとも。5KディスプレイもMac用アクセサリとして本当に良くできてるので、両方長く使っていきたい。


追記:この記事を書き終わった後に突然内蔵キーボードの一部キーが全く反応しなくなり修理行き確定した。やっぱりキーボード周りは未だに不具合多くてダメっぽい・・・

ergodoxのkeycap入手はamazon.comがお手軽だった

ergodoxを買った。HHKBの打鍵感が好きだったのでergodoxブームは静観してたけど、ずっと悩まされている肩こりがセパレート式で改善されるか試したくて購入する事にした。

FalbaTechで半田付けまで頼んだので本体の入手は簡単だったけど、ergodoxはキー配列が特殊なせいでkeycap入手が面倒だった。全てのキーがPackになったものがなく、基本的にバラ売りのものを自分で組み合わせて買う感じ。そしてなかなかの値段がする(だいたい$100くらいが相場かな?)

自分も色んなサイトを物色して買ったんだけど、注文ミスでEnterやメタキーのkeycapだけCherry MX軸非互換のものが届いてしまった。お金を損した事より本体が届いているのにkeycapが足りずに完成しないというツラい状況に。

困って調べてたら、amazon.com でergodox用keycap一式のセットが販売されていた。もともとイメージしていた白HHKB風の色で、しかも圧倒的に安い!

Amazon.com: YMDK Cherry Profile Thick PBT Blank Ergodox Keycap Set For Ergo Ergodox Keyboard: Computers & Accessories

早速買って装着した様子。誤って注文してしまったkeycapの内、英数字キーはCherry軸対応だったので流用した。色も合ってたので良い感じ。

とにかく早く手に入れたかったのでexpedited shippingを選んだけど、それでもたった4000円ほど。Keycap販売サイトで選ぶのが面倒だなぁとか、値段高いなぁと思ってる人にはオススメ。

肝心の肩こりへの効果は・・・よく分からない。まだ慣れてなくて余計に肩肘を張っている気がするのでもう少し使ってみる。