フリーランチ食べたい

No Free Lunch in ML and Life. Pythonや機械学習のことを書きます。

pipが v10->v18になってビビってメーリングリスト見たみたらリリースサイクルも変わってた

TLDR

急にv18が来たので(QVK)

pipが急にv18になってビビった。 https://github.com/pypa/pip/releases/tag/18.0

$ pip install -U pip
Collecting pip
  Downloading https://files.pythonhosted.org/packages/5f/25/e52d3f31441505a5f3af41213346e5b6c221c9e086a166f3703d2ddaf940/pip-18.0-py2.py3-none-any.whl (1.3MB)
    100% |████████████████████████████████| 1.3MB 4.8MB/s
Installing collected packages: pip
  Found existing installation: pip 10.0.1
    Uninstalling pip-10.0.1:
      Successfully uninstalled pip-10.0.1
Successfully installed pip-18.0

「アップデートね、おけおけ…...18!!?」みたいな感じになった。

CalVer

Twitterを眺めてみると「calver」というワードがチラホラ出ていて、これはCalendar Versioningのことらしい。 calver.org

つまり pip v18.0 の18は2018の18だったということ。 ubuntu18.04 のようにMinor Versionは月になっているが pipは 18.0 のようになっているので 18.0~3 のようになるのかな。

リリースサイクルも変わってた

詳細な情報を確認するためにメーリングリストを見たらちゃんとCalVerになることが書いてあった

Google グループ

This is the first pip release since adopting 3 month release cadence and 
a Calendar based versioning scheme (also known as CalVer). In simpler 
words, there will be a new pip release every 3 months unless there are 
no changes since the previous release. More details such as release 
months can be found in pip's development documentation. 

それとは別にリリースサイクルも変わっていることにも気付いた。今後はCommitが1つでもあれば3ヶ月おきにリリースしていくとのこと。 今までは結構リリースにムラがあったので(Releases · pypa/pip · GitHub) 安定した開発を続けていこうという意思なのかな。 (Releases見て気付いたけど、2017は全くリリースがなかったのにビックリ)

他にもちょいちょい変更あった

Google グループ 上記のメーリスより

- Python 3.3 is no longer supported - if you need pip on Python 3.3, 
  you should stay on pip 10, which is the last version to support Python 
  3.3. 
- Complete PEP 518 support - includes support for installation of build 
  dependencies from source and Unicode support on Python 2 and Windows 
- New --prefer-binary flag, to prefer older wheels over newer sdists 
- Many bug fixes and minor improvements 

大きなものだと↓がありそう。

  • Python3.3のサポート終了
  • PEP518(https://www.python.org/dev/peps/pep-0518/)のサポート完了
    • なんのPEPかと思ったらpackageをbuildするformatの仕様だったよう
    • もしかしてこれでinstallできなくなるpackageがあるのかも?

まとめ

  • 能動的にメーリングリストを見ることは少ないけど、受動的に情報を受け取っているだけでは知れないことがたくさんあるので、できるだけチェックした方がよい。
  • Software全体としてCalVerに移行していく流れがあるような気がする。

docker-compose run は portをmappingしない

dokcer-composeでちょっとハマったのでメモ

TLDR

  • 単純に docker-compose run service_name すると設定したportがmappingされない
  • docker-compose run --service-ports service_name すれば良い

詳細

↓のようなdocker-compose.ymlがあったときに

version: '3.5'
services:
    a:
        image: hoge
        ports:
            1234:1234

service_aだけ実行したかったので、 $ docker-compose run a /bin/bash とaだけrunした。

プロセスをチェックしてみると、portsをmapping されていない。

$ docker-compose ps 
          Name                         Command               State            Ports
--------------------------------------------------------------------------------------------
reponame_a_1     /bin/bash    Up

この問題に関してはGithubで質問されていたりして、詰まっている人は多いようだ。 Docker-compose run command doesnt map ports · Issue #1259 · docker/compose · GitHub

原因と解決策は、公式ドキュメントにしっかり書かれている。 run — Docker-docs-ja 17.06.Beta ドキュメント

使い方: run [オプション] [-e キー=バリュー...] サービス [コマンド] [引数...]

オプション:
-d                    デタッチド・モード: コンテナをバックグラウンドで実行し、新しいコンテナ名を表示
--name NAME           コンテナに名前を割り当て
--entrypoint CMD      イメージのエントリーポイントを上書き
-e KEY=VAL            環境変数を指定 (複数回指定できる)
-u, --user=""         実行時のユーザ名または uid を指定
--no-deps             リンクしたサービスを起動しない
--rm                  コンテナ実行後に削除。デタッチド・モードの場合は無視
-p, --publish=[]      コンテナのポートをホスト側に公開
--service-ports       サービス用のポートを有効化し、ホスト側に割り当て可能にする
-T                    疑似ターミナル (pseudo-tty) 割り当てを無効化。デフォルトの `docker-compose run` は TTY を割り当て
-w, --workdir=""      コンテナ内のワーキング・ディレクトリを指定

のうち、↓を使えばよい。

--service-ports       サービス用のポートを有効化し、ホスト側に割り当て可能にする

なので結論としては、

$ docker-compose run --service-ports service_name

とすればよい。

$ docker-compose ps 
          Name                         Command               State            Ports
--------------------------------------------------------------------------------------------
reponame_a_1     /bin/bash    Up    0.0.0.0:1234->1234/tcp

正しくmappingされた🎉

「なんでそういう仕様なの?」という声も聞こえてきそうだが(Githubで「直したほうが良くね?」って言ってる人もいた)

理由もしっかり公式ドキュメントに書いてある。 run — Docker-docs-ja 17.06.Beta ドキュメント

2つめの違いとして、 docker-compose run コマンドはサービス設定ファイルで指定したポートを作成しません。これは、既に開いているポートとの衝突を避けるためです。

確かに?ただ docker-compose up を2回すると衝突しそうだよな。と思って試したら新しくコンテナは作成されなかった。 公式ドキュメントにはその辺り明言されていないようにも見えるが雰囲気から、そういう仕様ということはわかる。

up — Docker-docs-ja 17.06.Beta ドキュメント もしサービス用のコンテナが存在している場合、かつ、コンテナを作成後にサービスの設定やイメージを変更している場合は、 docker-compose up -d を実行すると、 設定を反映するためにコンテナを停止・再作成します(マウントしているボリュームは、そのまま保持します)。Compose が設定を反映させないようにするには、 --no-recreate フラグを使います。

まとめ

公式ドキュメントをしっかり読むと色々わかるからしっかり読もう

会社で上半期MVPもらいました!!

横浜で最高の夏を味わいながら全社イベしてきた。弊社最高 👏

さらに最高に嬉しいことに上半期の個人部門MVPをもらえました。

わーい。嬉しい。という報告でした。(笑)

PyCampのTAをしてきて、印象に残った質問のメモと、何かを教えるときの難易度と頻度の関係性について考えてみた

大学院生以来のTAを筑波大学でやってきた!

運営スタッフをやっているPyCon JP( https://pycon.jp/2018/ )がPythonを教えるBootCamp「PyCamp」を筑波大学で開催するということでTAとして参加してきた。

TAをやるのはM2夏以来なので、4年前ぶり…(時の流れが早すぎて涙が止まらない)

手前にちょっとだけ写ってる。船坂くんは大学のときにちょっとだけ関わりがあって、今回、感染に偶然に数年ぶりの再開を果たした。人生ってなんて面白い…!

教材はこちら→ Python Boot Camp(初心者向けPythonチュートリアル) — PyCon JP 。 無料でPythonの勉強ができるので勉強したい人は触ってみても良いかも。

印象に残った質問

何年かプログラミングをやっているとプログラマーとしてはあまりに当たり前になってしまって説明できない」ことが増えるのはあるあるだけど、それは思考が凝り固まってしまっているということだしエンジニア以外の人への説明力が落ちていることに他ならないと思うので、こういう場で予想していなかったような質問をされるのは思考が刺激されてとてもいい経験になった。せっかくなのでここにもメモしておく。

質問1. 「配列ってなんですか?for...in...で何が起こっているんですか?」

聞かれたコードは↓のようなものだった。

ret = []
for animal in animals:
    ret.appned(animal)

print(ret)
# => [cat, dog, ...]

一応チュートリアル内でも記載があって、講師の方も説明していたのだけど、その説明がたしか「配列は数字や文字列などの要素が集まったものです。forは要素ごとに処理を行うものです」というもので、それがあまりピンと来なかったよう。普段だったら自分も正直それ以上の説明は浮かばないのだけど、なんと幸運に先週fukabori.fmに出ていたkakakakakkuさんの話を聞いていたのでその通りに「レジに人が並んでます」「catさんから順番に処理していきます」(appendだったので)「今度は隣のレジに並んでもらいます」的な質問してくれたら理解してくれたよう。メタファー大事。kakakakakkuさん半端ないっす。

fukabori.fm

この回、超オススメです。

質問2. 「配列使うと何が便利なんですか?」

上の流れで聞かれた。ウワー本質的な質問だ、となって正直難しかったけど、Twitterを例に上げて『お腹空いた』とか『眠い』などのTweetが100個くらい配列に入っていて、それを一気にforとかで回して表示してるから、タイムラインで見れるんだよ、的な話をして一応わかってくれたみたいだった。これに関してはいい例があったら教えてください!

質問3. 「 res = requests.get(url) が何をやっているか全然わからないです。resには何が入っているんですか」

これはスクレイピングの課題で質問された。これは、質問されたあとに色々考えて、そういえば自分もエンジニア始めたばかりのころ、「URL」と「アクセスしたサイトの中身」の違いがピンと来なかったのを思い出してハッとした。最終的には↓のような図を書いてわかってくれた(気がする)。

f:id:mergyi:20180722003008p:plain

「なんでDNSだけフィーチャーしたの???」というツッコミはしないでください。。(笑) 色々しているというのを伝えたかったのです。

難易度と頻度の関係性について

人に教えるのは内容の選抜がとにかく難しい

ずっと講師の方の説明を聞いていて「これは発展的すぎるかも?」とか「これはそんなに使わないかも?」と思ったり、逆に途中から「生徒が中級者多め」という実感が湧いてきて、「これは簡単すぎるのかも?」とか勝手なことを思っていたのだが、最終的にこれ主観で「この内容は合ってない」とか議論してもなんの生産性もないやつだと気付き、習熟度に応じた優先度マップが必要なのでは?という結論に達した。

Pythonで教える内容の難易度と頻度の関係性

というわけでまとめてみた。教える内容としてこういう項目があるよね、というやつ。 網羅性は全然なくて、今日授業を聞いていて思いついたやつをメモっただけ。

f:id:mergyi:20180722003952p:plain

習熟度ごとの優先度マップ

そして初心者、中級者、上級者という対象者ごとの優先度マップ。

対象者: 初心者

f:id:mergyi:20180722004244p:plain もちろん難易度は低く、頻度が高いものが最優先。 次が悩みどころだけど、個人的には頻度が低いものより、頻度が高く、もうちょっと難しいものを優先した方が良いイメージ。

対象者: 中級者

f:id:mergyi:20180722004336p:plain 中級者は中くらいの難易度で頻度が高いものが最優先、その次が頻度が低い中くらいの難易度、低い難易度のもの。そろそろ頻度が低いものも抑えておこう的なイメージ。

対象者: 上級者

f:id:mergyi:20180722004358p:plain 上級者は高難易度で頻度が高いもの=>低いものの順でその後は、より頻度が低く、難易度が高いものをやっていけばいいと思う。

優先度マップについて

議論もしてないし、熟考もしてないので、最初のたたき台というくらいの温度感。 使い方としては、教えるコンテンツを考えるときに優先度が高いものを残し、低いものはできるだけバッサリ切っていくのがいいと思う。できるだけ頭に入れる内容は少ないほうがインプットしやすい気がするので。

まとめ

不特定の誰かに教えるというのもあまりない経験だったし、最近、自分が忘れていた発想にも気付かせてくれたし、参加してよかったと思った。 PyCampでの懇親会でも面白い話がたくさん聞けたし、貴重な繋がりもたくさんできた。また機会があればぜひ!参加したい。

読んだ本 (CAREER SKILLS/Deep Work/Keras/ユダヤ人大富豪の教え/バンディット問題)

積読をまとめて読んだので読書メモ書きました。

  • CAREER SKILLS ソフトウェア開発者の完全キャリアガイド | ジョン・ソンメズ

    • けっこう流行ってたSOFT SKILLSの続編
    • 第1部~第3部まではプログラマーの仕事の紹介や基本的なお作法などよくあるHOW TOっぽい内容で、「これはそっ閉じ案件か?」と途中まで思ったけど、
    • 第4部から、キャリアや習慣についての、SOFT SKILLSに書いてあったような、エッジが効いててそれなりに現実性もある内容が書いてあって最終的にはかなり満足度高かった
    • SOFT SKILLに引き続いて相当マッッッチョな視点なのでSOFT SKILLが苦手だった人は読まないほうがいい。好きだった人には強くオススメ(ただし4部以降)。
    • 「ジェネラリストかスペシャリストかはどっちを選ぶべきか」、と「普通にスキルアップしていくと"ガラスの天井"にぶち当たる」という話は今後のキャリアを考える上で参考になった
  • Deep Work 大事なことに集中する | カル・ニューポート, 門田 美鈴

    • 最近SlackとTwitterばかり見ていて集中できていないので読んでみた
    • ディープワークはめっちゃ大事だよという当然の話と、それをどう達成するかが書かれている。
    • 一言で言うと「Twitterみないで集中しようね」なのだけど、人類の意思ではそれが不可能なことも多いから環境や習慣で抗っていこう、と認識した
    • ドナルド・クヌースユングなど著名人の実話がたくさん出てくる。こういうとき億万長者やビジネスの成功者の例ばかり出てきて「それ上手くいったの生存バイアスやん???」なことが多いのでアカデミックにちゃんと功績を残していて自分も尊敬している人がたくさん出てくるのは馴染みやすかった
  • PythonとKerasによるディープラーニング | Francois Chollet

    • Kerasの作者によるディープラーニング理論とKerasの使い方入門本
    • 個人的には本編は「DeepLearningの限界/未来」についてエッセイ風に語られた第9章。
    • 機械学習エンジニアが2大モヤモヤする「AIって魔法だよね何でもできるよね」と「AIって言っても結局人間には勝てないんでしょ?」が上手く説明されていて「今後はこれ説明に使お〜」と思った。
    • Francoisのエッセイ、適度に難いことを頭が良い気分にさせるのにおいては自分の人生でトップを争う
    • DeepLearningの理論や実装についての深く混み入った話ではないので、もう普段からKeras使っている人にとってはそんなに新しい内容はないかも
    • Kerasの公式はチュートリアルが簡素で、逆にそれぞれのAPIは急に羅列で、痒いところがほぼ痒い状態なので、これから使い始めるにはオススメできそう
    • 書籍中で進められてたarxiveのportalサイトみたいなやつ http://www.arxiv-sanity.com/
  • ユダヤ人大富豪の教え 幸せな金持ちになる17の秘訣 (だいわ文庫) | 本田健n

    • 正しいことが書いてあると思うし内容も分かりやすくて読みやすかったけど、よくある「THE 自己啓発本」のレイヤーの話でどこかで読んだことあるな〜と思う人も多そう(自分はそっちだった)
  • バンディット問題の理論とアルゴリズム | 本多淳也, 中村篤祥

    • バンディット問題と最適腕識別問題に対してどのような方策があるかとその精度の証明
    • 基本的には「リグレット上限」と「報酬の信頼上限」を指標としてどう方策を改善していくか
    • 精度の厳密性を求めると様々な工夫が必要になるが、実際はシステムの複雑度とのトレードオフが発生するので、例えば確率的バンディット問題では最も簡単なε-greedyで十分そうだなと思った