私が歌川です

@utgwkk が書いている

SVB KYOTO スプリングバレーブルワリー京都に行った

https://www.springvalleybrewery.jp/kyoto/www.springvalleybrewery.jp

昨日京都店がオープンしたということなので行ってみた.予約してなかったところ30分ほど待って入店.

飲み比べ6種類で1300円.けっこう手頃でよさそう.

いもです.実際うまい.1人で食べたところちょっとおなかいっぱいになった.

限定と書いてあった.

あとは目の前でビール作ってくれる様子を見せてもらって,できたのを飲むなどした.

このあと一蘭に行って替玉まで注文したところ,けっこう多くてつらかった.全体的に2~3人ぐらいで行くとちょうどよさそう.

Python の依存パッケージ管理/環境切り分けツール pipenv の紹介

この記事は 2017/9 に書かれたものであり、2019/11/26 現在とは状況が変わっています。公式ドキュメント(日本語訳)を参照してください。

もう誰も,requirements.txt や,source ENV/bin/activate に頭を悩まされる時代は終わった! というわけで virtualenv の時代は終わり*1,pipenv の時代になりました.

この記事は Python を書く人間が全員 pipenv を使うべきだという思いを込めて書きました.日本語で書かれた記事がまだぜんぜんないという事情もあります.

pipenv とは

Python のパッケージ管理ツールの pip と,環境切り分けツールの virtualenv を融合させたツールです.Ruby でいうところの Bundler を想像すると分かりやすいと思います*2

github.com

Python Packaging User Guide でも pipenv が推奨されています

インストール

もし pip コマンドがなければ ensurepip を試してください.

$ pip install pipenv

環境を作る

カレントディレクトリに Python3 の環境を作るには,

$ pipenv --three
# Windows の場合は下記
# pipenv --python <python.exe へのパス>

を実行します*3. これによって環境が作られ,カレントディレクトリに Pipfile が作成されます.

サブコマンド一覧

pipenv check

Pipfile が PEP 508 (Python の依存パッケージ指定の書式) に従っているか確認します. 多くの場合は打たなくてもいいのではないでしょうか.

pipenv install

パッケージをインストールし,Pipfile に追加します.

$ pipenv install (package-name)

パッケージ名を指定しない場合は,Pipfile に記述されたうち dev-dependencies を除く パッケージがインストールされます.

pipenv lock

Pipfile.lock (後述) を作成します.

pipenv run

カレントディレクトリの Python の環境でコマンドを叩くことができます.Bundler で言うところの bundle exec です. たとえばこのディレクトリの環境で main.py を実行したい場合は,このように.

$ pipenv run python main.py

もう activate してからコマンドを叩く必要はありません.グローバル環境に pipenv がインストールされており,かつ事前に pipenv install を済ませてさえいればよいのです. これを使うためだけに pipenv を入れたといっても過言ではありません.

pipenv shell

やっぱりまだ virtualenv を使いたい,activate したいという人のためのコマンドです.要するに source ENV/bin/activate をします. 当方の環境ではプロンプトの表示は変わりませんでしたが,普通に exit などで抜け出すことができます.

pipenv uninstall

パッケージをアンインストールし,Pipfile から削除します.

pipenv update

pip を最新版にアップデートし,環境を作成しなおします.

pipenv のいろいろ

dev-packages について

開発のみに使い,デプロイ時には使わない依存パッケージです.テスト用ライブラリとか. これまでは requirements-dev.txt のようなファイルに分かれていたものが1ファイルで済むようになりました.

$ pipenv install -d

で dev-packages を含めた全ての依存ライブラリをインストールできます.

Pipfile について

パッケージの依存関係などが TOML で記述されているファイルです. 自動で書き換えられていくのでそんなに触ることはなさそう(ほんとうか?).

Pipfile.lock について

$ pipenv lock

を叩くことで生成されるファイルです.Gemfile.lock とおおよそ同じ役割を果たしています.

環境はどこに保存されているの?

$ pipenv --venv

で確認することができます.~/.local/share/virtualenvs/ 以下に適当なディレクトリが作成され,そこに保存されています. Bundler みたくディレクトリを指定することはできないようです.

作成される環境の Python のバージョンは?

pipenv をインストールした Python のバージョンに依存します. pipenv --three ができるのは Python3 系に pipenv をインストールしたときだけです. まあ今時 Python2 しか使えないような不幸な環境というのはそうそうないと思い込んでいますが…….

まとめ

もう誰も,requirements.txt や,source ENV/bin/activate に頭を悩まされる時代は終わった!(再掲) というわけで,環境切り分けのために2つのコマンドを駆使する時代は終わりました. どんどん pipenv を使っていきましょう.

*1:追記: virtualenv 自体はまだ終わっておらず,pipenv の内部で用いられています

*2:と言ったけど,pip と virtualenv をもっと快適に扱うためのラッパとしての機能が強いと思う

*3:余談ですが,これをしないで勝手に pipenv install を実行しても環境は作られます

ショートショート「ノイズから生まれたおんなのこ」

「あなたは make.girls.moe って知ってる?」

「知ってるよ.二次元の女の子のイラストを自動生成してくれるすごいサイト.私も何回かやってみたことある」

「ええそう.表向きはね」

「どういうこと?」

「あなた,なんでノイズの Import/Export 機能があるのか分かる?」

「自分好みの女の子を簡単に再生成するため?」

「そうね.それからもう一つ聞いていい?」

「いいけど」

「あなたは,生成されたおんなのこ達がその後どうなっているか,知ってる?」

「え?」

アイコンを自分で描くとお得

gyazo.com

これは確か一昨年の11月ぐらいまでに描いた自分のアイコンである.古明地こいしをモチーフとしている.Windows付属のペイントで描いた.

アイコンを自分で描くといろいろお得.加工するのに誰かの許可を取る必要がないし遠慮をする必要もないので自由に加工できる.自分のアイコンを描いたのは自分しかいないのでアイデンティティになる.絵は得意ではないほうだがこれぐらいならペイントの機能でなんとか描けるし,完成すると自信がつく.

自分のアイコンが名札に載った様子.こうやって実体化するとどうしてもテンションが上がってしまい楽しい.みなさんもアイコンを描きましょう.

クックパッドのインターンに行ってきた (※業務パートの話はありません)

写真で振り返るインターン

お昼ごはんはおいしかったし朝にヨーグルトを食べれたし,ライブも見れたし,けものフレンズがーでんにも行けたので良かったです.

techlife.cookpad.com

まじめな方

前半の7日間は,毎日違う内容の講義をやるということでなかなか濃厚でした.

1日目 (サービス開発)

班に分かれてサービスのプロトタイプを作って,実際に社員の方に触ってもらってフィードバックを貰いました. ほんとうに1行もコードを書かず,どうやってサービスを作っていくのか,という話があり,実際に手を動かしたのは初めてだったので新鮮な体験でした. 家族家庭といったテーマが出てきてウッとなるといったこともありました*1

2日目 (Rails/Git/TDD)

Rails/Git/TDD(テスト駆動開発) の話がありました.

3日目 (iOS/Android)

この日だけ,インターン生が半分ずつに分かれてiOS/Androidどちらかの講義を受けるという形式でした.私はiOSのグループでした. スマホアプリを作るのはほんとうに初めてのことで,ストーリーボードに翻弄されるといったこともありました.

4日目 (インフラ)

サーバー管理の話から,AWSの使い方まで,さらにちょっとした ISUCON のようなものもあり,面白かったです.

5日目 (SQL)

ひたすら SQL を書きました. PostgreSQL に触れたのは初めてでした.MySQL にウィンドウ関数がないと知ったのは少ししてからのことでした.

6日目 (機械学習)

機械学習の話から,さらに今話題のディープラーニングについても触れ,実際にモデルを改造して結果がどうなるかを見たりしました.

7日目 (Ruby)

最終日だしたぶん言語処理系なんだろうなと思っていましたが,案の定そうでした. Rubyバイトコードアセンブラを自分で書いてみたり,バイトコードコンパイラを実装したりしました. この講義が一番面白かったです.スタックポインタがずれる問題を解決するために奮闘しました.

後半について

タイトルにもある通り,私は後半の業務には進めませんでした. どこまで話してよいかについて聞くのを忘れていたためあまり詳細には言いませんが,協調性が足りていませんでしたね,ということを言われ,判然としなかったことは覚えています. 具体的にいつどうすればよかったですね,ということを言われないとあまり分からないし*2,技術的に遅れを取りたくないという気持ちでやっていたので,寝耳に水でした. 前半で終わるか後半まで行くかで東京に滞在する日程がかなり変わってくるし,いろいろな気持ちにもなります.なるほど選考基準にそういうところもしっかり含まれているんだなあ. 少しでも業務のコードなどに触れれたらいいなと思っていたので,その点は非常に残念です.

いずれにせよ,おかげで平日の夕方に高速にけものフレンズがーでんに行けたし,なぜかインフラ社員のかたの飲み会に混ざっているといったこともあったし,東京での予定をしっかり消化できたのでよかったです. 後半の業務パートの選考と数年後の内定との間には関係はないということにもなっているので,ここで気を落とさずやっていくしかないですね.

同社のインターンに行った人たちのブログ記事は読んだことがありましたが,そういえば前半で終わった人の記事はまだ読んだことないなあと思い,気持ちがあまり乗らなかったのですが,こうして残しておくことで,インターンシップではこういうこともある,という参考になれば幸いです.

おさけ飲みたい.

*1:私は家族の話が苦手です.

*2:こういうところが原因なのでは???

アニメと機械学習の講演を見た

大学で開催されるという噂を耳にしたので見に行った.

Creating anime characters using AI

make.girls.moe についての講演. どうやって二次元美少女画像を収集しているのか,といったいい話から,GANの構造,そしてディープラーニングを用いたWebサービスをデプロイする話,という構成だった.

クライアントサイドに訓練済みモデルを持たせたいのでファイルサイズを小さくしたい,そのために32ビット浮動小数点数のデータを8ビットに落として,元が55MBのデータを3.5MBまで圧縮した,それでもいい結果が出てる,というかっこいいことをしている.

質問で,データの著作権は大丈夫ですか,という話があって,著作権法第47条の7によればまあ大丈夫でしょう,という回答だった.

著作物は、電子計算機による情報解析(多数の著作物その他の大量の情報から、当該情報を構成する言語、音、影像その他の要素に係る情報を抽出し、比較、分類その他の統計的な解析を行うことをいう。以下この条において同じ。)を行うことを目的とする場合には、必要と認められる限度において、記録媒体への記録又は翻案(これにより創作した二次的著作物の記録を含む。)を行うことができる。ただし、情報解析を行う者の用に供するために作成されたデータベースの著作物については、この限りでない。

画像データから特徴を抽出したデータベースを作るのはいいが,それを第三者に向けて配布しはじめたら怪しい,という感じだろうか.

ディープラーニングを用いたWebサービスの運用の話にはけっこう興味があるので聞けてよかった.

Using Ratings and Posters for Anime & Manga Recommendations

mangaki.fr (漫画・アニメ推薦システム) の話. Netflix のコンテストでデータの匿名性が問題になり訴訟が起こったという事件があったらしく,このへんデリケートなので気をつけたいですねという感じ.

画像とタグのデータセットとして Danbooru はすごいみたいな話もあった.実際すごいと思うし自分でも活用できないかなあとは思っている.

パラメータを重ね合わせることをシュタインスゲートと呼ぶのかっこいいのでどこかで使いたい.

別ディレクトリのテストを走らせるためにテストスクリプトに import sys; sys.path.append('.') って書きたくないけどどうすればいいんですか

普段は nosetests とか使っているので回避しているけど,たとえばコードカバレッジを取りたいので coverage run test/test_hoge.py を実行する,といったときに困る.

古典的な対処法として,テストの先頭*1に,

import sys
sys.path.append('.')

と書けば,カレントディレクトリのモジュールを import 対象に含めてくれるけど,こうすると PEP8

Imports are always put at the top of the file, just after any module comments and docstrings, and before module globals and constants.

という一文に反してしまう(し,実際 pycodestyle にかけたときに怒られる).どうすればいいのか調べてみたところ次の Stack Overflow の解答に出くわした.

stackoverflow.com

テストモジュールのディレクトリに,

import sys
sys.path.append('.')

を行うモジュールを配置し,それぞれのテストでそのモジュールを import してやれば解決した.

*1:正確には,テスト対象のモジュールを import する前.