新・オノマトペ的備忘録

技術ブログだと思った? 残念、日記でした!

式が True / False そのものであるかどうかの Assert には assertIs(expr, boolean) を使う

おねがい

『何年 Python 使ってんだよ』『そんなんで仕事してたんかい』などといいながら棒状のもので叩くのはやめてください……言い訳をさせてもらうといままでだいたい文字列やバイト列の比較とかだったので assertEqual で事足りてたんです…….

本題

Django どんなもんだったかなって思い出したくてチュートリアル見直してた. Writing your first Django app, part 5 | Django documentation | Django で『False であるはず』の Assert に assertIs(expr, False) を使ってたんだけど,「あれ? assertFalse(expr) ってのもあった気がするけどこれじゃダメなの?」と思って調べてみた.

26.4. unittest — Unit testing framework — Python 3.5.2 documentation によると,assertTrue について

Note that this is equivalent to bool(expr) is True and not to expr is True (use assertIs(expr, True) for the latter).

とあったんだけど,bool(expr) is Trueexpr is True の違いについて数分本気で悩んでしまった.気づいてしまえばすごい単純なことだった(はずかし).次の実行例を見るとわかるんだけど,式が真(偽)と判定されるということと,式(の評価結果)が True (False) である,ということは等価ではない.

>>> if 1:
...  print('1 is treated as True')
...
1 is treated as True
>>> if 1 is True:
...  print('1 is True')
...
>>> if bool(1) is True:
...  print('bool(1) is True')
...
bool(1) is True

だから,exprFalse であるはず,というつもりで assertFalse(expr) という assert を置いても,実際は exprNone だったり 0 だったりしてもこの assert をパスしてしまう. assertIs(expr, False) なら exprFalse そのものであることが保証される.

まとめ

真であるか / 偽であるか,と True そのものであるか / False そのものであるか,は違うことなので,後者をチェックしたいなら assertIs(expr, boolean) を使うべき.

MATLAB MEX 指定したコンパイラーコマンドでコンパイルしてほしい

前提

Ubuntu 16.04(以下 Xenial)な共用マシンに MATLAB R2016a(以下 R2016a) が入ってる. C++ で書かれたライブラリを MEX する必要があった. ふつうに MEX コマンド実行すると g++ が呼ばれるんだけど,Xenial での g++ という名前のバイナリの実態は GCC 5.4.0 に含まれる C++ コンパイラになる. 一方で,R2016a が公式で対応してるのは GCC 4.7.x で,実際 g++ 5.4.0 を使って mex すると MATLAB が持ってる libstdc++.so が古いために MATLAB 上では動かないバイナリが生成される. Xenial では g++-4.7 というパッケージ名で g++-4.7 というファイル名の g++ 4.7.0 をインストールはできるけど,MATLABg++-4.7 をどう使わせるか,というのがこのエントリでする話.

解決法 1 - mex コマンドの引数に 'CC=gcc-4.7' を追加

既定のコンパイラの変更 - MATLAB & Simulink - MathWorks 日本 mexで使うコンパイラを指定する - Qiita ここらで言ってるように, $CC とか $GCC を変更すれば MEX はそのコンパイラを利用してコンパイルしてくれる.

問題点

  • 弊ラボの人間はこういうテクに明るくないので,いつでもこれを思い出して適切に MEX 呼び出しを書き変えられるかと言わるるとまあ無理だろって思う
  • わかっててもいちいち書き直すのは面倒

解決法 2 - 設定ファイルを書き変える

どこかのページではっきり解説されたりしてる方法ではないんだけど,$matlabroot/bin/glnxa64/mexopts/g++_glnxa64.xml

    <locationFinder>
        <GCC>
                        <cmdReturns name="which g++" />
        </GCC>
        <CPPLIB_DIR>
                                <cmdReturns name="g++ -print-file-name=libstdc++.so"

てなあたりを

    <locationFinder>
        <GCC>
                        <cmdReturns name="which g++-4.7" />
        </GCC>
        <CPPLIB_DIR>
                                <cmdReturns name="g++-4.7 -print-file-name=libstdc++.so"

と書き変えると mex コマンドが g++-4.7 を使ってくれるようになった. たぶん,C とか Fortrangcc_glnxa64.xml なり gfortran.xml なりを同じように編集すればいいんだと思う.

問題点とか

  • ~/.matlab/R2016a/mex_C++_glnxa64.xml が存在する(mex -setup すると生成される?)とここの設定がオーバーライドされるっぽいので,消しておく
  • 公式に案内されてる方法ではない気がするので,バージョン変わっても同じ方法でできる保証はない

PyCon JP 2016 に行った #PyConJP

IMG_3088
行ってきました.メインの Conference のみ参加です.

最近の僕と Python

一時期は Web 開発メインで使ってたんだけど,最近は研究のための道具という感じになってきてる.そんな感じの立ち位置.

見たもので気になったものとか,思ったことについて忘れないうちに書いておく.

水曜

Keynote

youtu.be
Opening に間に合わなくて,行きの電車のなかで Keynote のライブ配信を見てた.
英語力低くて恥ずかしいんだけど,コミュニティの多様性とか,プログラミングなりそれ以外の方法なりでコミュニティや世界は変えられるんだぜ,という話をしていたと思ってる.

たった一ファイルの python スクリプトから始める OSS 開発入門

youtu.be

その場その場でのスクリプト書くだけじゃなくて,外に出すこと考えてスクリプト書いてみるとやりたいこととかが整理されるしいいよ,とかそういう話.
僕も書き捨てのコードとかでもとりあえず公開してみたり,より一般化したものに書き直したり,とかしたほうがいいなと感じた.
個人的になるほどなあと思ったのは『おまけ』のところで,自分の学習ログとして GitHub の Issue 使ったりするというのにはなるほどね!!という気持ちだった.アリかも.

基礎から学ぶWebアプリケーションフレームワークの作り方

youtu.be
c-bata.link
実際にコード動かして,エラー吐いても慌てずに対処しながら解説してるのはすごかった.
内容的にも最初のほうは自分で下まわりのコード書いてたのがテンプレートとかデコレーター使ってだんだんよくみる WAF 使った感じのコードになっていくのが面白かったし,Python の WAF は内側でだいたいこんな感じのことしてるんだ,というのがわかるいい発表だった.
ちょっとまじめに kobin とかのソース読んでみようかなって気持ちが出てきた.

Party

なんとなく集まって先輩 / 学部時代の友人の @ism67ch とひげで飲み食いしてたら @jbking さんが寄ってきてくださって,そこから @hirokiky さんや @t2y さんとお話させて頂いた.
現職のスゴイ=エンジニアサンたちとお仕事のこととか過去話とかをできた貴重な時間だった.ありがとうございました.
『(某社に)入りたいかそうでないかでいえばどっちなのよ』「そりゃあ入りたいですよ〜」などとしらふじゃ絶対言えないような大それたことを言った.
そこらへんについて ky さんからまじめなアドバイスをいただいたので参考にします.

木曜

You Might Not Want Async (in Python)

youtu.be

Python で非同期,まだまだつらいところ多いように見えるし,『銀の弾丸じゃない』し,よく考えて使う必要がありそうだな,と思った.
喋りと飽きさせないスライドの構成がうまかった.
あと Go は goroutine のおかげで非同期プログラミングがだいぶ楽そうだなーと改めて思った(最近 Go を少し勉強してた).

Python を支える技術: モジュール・インポートシステム編

youtu.be

しばらく前にインポートまわりですごいハマったことがあったので興味を持って見に行った.
内容はしっかりしてたんだけど,発表者さんの声が小さくて聞けないって人がかなり多かった印象.
前の方にいたのでまあなんとか聞けたけど……という感じだった.
ちょっとその場で理解しきるには難しかったので,あとで周辺の情報調べながら復習したい.

はじめて作るDjangoプラグイン

youtu.be

Django ってあるけど Django に限らない話も多かった.
Python (や,プラグインならベースになるアプリケーション)の多バージョン対応の方法とか,よくみる tox というやつの使いかたとか,CI まわりのツールについて知れてよかった.
自分で公開するものを作るときにめっちゃ見返して参考にしたい発表だった.

型ヒントについて考えよう!

youtu.be

この日の Keynote speaker が推薦してたとかで,立ち見で壁も埋まるレベルだった.
あんまり Python における型ヒントを意識したことはなかったんだけど,Type Comments みたいにコメントとして書く系のものだけじゃなくて Variable Annotations みたいに文中でもオッケーみたいなスタイルの書き方を導入しているところ見ると動的型付けの Python でも型チェックとかが欲しいっていう層はある程度いるのかな,と思った.
ただまだそこまで普及してるもんでもないようで,サードパーティライブラリに対する型の導入についてはまだまだこれから,という感じだった.
TypeScript は型の定義が必須だからサードパーティライブラリの型定義が集まったけど,Python だと誰かが本気で必要になるまで準備されなそうなので,そこらが課題なのかなーと思った.

見れなかったけど興味があるセッションはいくつかあるので,時間のあるときに録画を見ようと思ってる.
あ,あとアンケートもちゃんと答えておきました.
# スタッフとかやってみるのもいいかなーと思ってアドレスつけてみたけど

個人的な感想みたいなもの

まとまりのないポエムじみた文章に興味がないひと向け

  • 自分の足跡みたいを残すため
  • スキルなどに対する客観的な評価をもらうため

もっと積極的にコードなりブログなりでアウトプットを増やしていきます.

本文

PyCon JP には 2014 から参加してて,今回が 3 回目になる.
相変わらず発表・イベントの質は高いし,ふだん群馬に幽閉されてる僕としてはあんまり会えない知り合いと顔を合わせて話せるいい機会だった.
と同時に,僕個人に対する課題を認識できる機会でもあった.

擬音の英語力低すぎでは問題

参加者見てると英語セッションでちゃんと英語で質問できてるひと多いなと思った.
僕はまあ読んだりしゃべってるのを何言ってるのか理解しながら聞くとかは一応できてると思うんだけど,自分の考えてることをリアルタイムに英文構築してしゃべるっていう力は全然ないなと思ってる.
ただまあ冷静になって考えてみるとある程度喋れる自信があるひとだから英語で喋ってるわけで,一種のバイアスみたいなやつでうわーできるひとだらけじゃーん,って思うのはあるかもしれない.
極端な話,留学かなんかで海の外に出てしまえばまあ英語を絞り出すしかない状況になるので成長が期待できるけど,時間もカネもない状況なので今すぐどうこうってのは少し難しいかな…….

俺はいったい何をやってるんだ問題 / 自分のウデマエわからん問題

PyCon に限らないんだけど,年の近いようなひとがいろんなことやってブログエントリなりこういう場での発表なりで外に向けて発表してる一方で,さて僕はなにをやってるんだろうね? みたいな気持ち.
まあ研究やったりいろんなことに興味もって勉強したりは人並みにやってきたつもりなんで,知識スタックは浅くはないと思ってるけど,具体的にログとか何かの形に残してることが少なくて振り返ったときになんもねーなって感じで,なんていうか引け目を感じるというか恥ずかしい気持ちになってくる.
そんな調子なんで,傍目から見た客観的な自分のスキルというか,もっといえば市場価値(これを僕が言うのすごくエラそうな感じなんだけど)みたいなのがどんなもんなんだかわからん,みたいなことを思っている.
元々の性格もどっちかってーと縮こまるほうだし,自分ができることってそう多くはないので基本的に自分の力みたいなのにはあんまり自信がない.

で,どうするのさ

俺はこんなことしてるぜーとか胸張って言えるようになったり,自分の力に自信をつけるのはどうしたらいいか,って考えると,やっぱり入ってきた分だけアウトプットをするのが大事なんだろうな,という結論に至った.
何かしら形になってて外から容易に見れるものがあれば,こんなことしてました・作ってました,とか示せるし,それを他人が見て,ようやるわとか大したことないなとか,まあプラスにしろマイナスにしろ外から客観的な評価を得られるんじゃないかという気がしている.
これを修士課程になってからようやく気づいて動きだすのなんて遅すぎんじゃねーかってのは確かにあるんだけど,やらんよりはよっぽどマシじゃんって言いながらやるしかないっしょ,と思ってる.
恥ずかしくて見せられない>< とか言っててもしょうがない,時間が経ってから見たときにこっからよう成長したわ,と思えればいいじゃん.と自分を励ましながらがんばることにします.
擬音をよろしくお願いします.

まとめ

上にあるとおりです.
当面は 2, 3 日に 1 回何か書くなり出すなりできればいいかな,と漠然と考えてます.
今後の活躍にご期待ください.

放置していたはてなブログで再始動

擬音は三日坊主

基本的に日々の発見とかを意識的に記録する習慣がないので、ブログとかやろうとしても気がついたら放置してしまう。意識高い技術系学生になろうとしてはじめた前ブログも結局1年以上放置してる。

思えば小学生や中学生の頃のそういう課題も(以下、どうでもいい回想のため略)

大学も4回生になってしまったことだし、いいかげん研究やお仕事進める過程で得た知見をちゃんとアウトプットする癖をつけたほうがいいかなと思って、心機一転してはてなブログでやり直してみることにした*1

このブログのデザイン

# Hatena Term - テーマ ストア - はてなブログ を適用してみた。 なんか見る人によって『クール』か『3周まわってダサい』っていわれそうな感じ。人様が作ったものダサいっていっちゃうのもどうかとは思うけれど。飽きたら変えるかも。

まとめ

ブログ更新がんばる

*1:とかいいつつ気がついたらPelicanとかに移行してるかもしれない