苦労の感覚的規模感で情報の供給動機が決まる話、または basemap を Microsoft Visual C++ Compiler for Python で自力ビルドする話

かつて、10年以上歳の離れた若者とのやりとりで懲りたことを踏まえて…。

何年か前のことになるけれども、「ぱいそんのかんきょうこうちくってたいへんなんですね、~さんてすごいくろうしてたんですね」という、ワタシにはとんと意味のわからない感想を喰らったことがあって。そこでやってたのは、機械学習系の検証をしたくて scikit-learn を評価してたときで、その若者はワタシのこの作業に追従してたわけなんだけれども。

むろんワタシにとって未知で、面白く、大変でもあったのは「scikit-learn の評価」もしくは機械学習の評価、という本題にしかなかったんであって、環境構築が大変だった記憶なんか、ほとんどなかったのである。

じゃぁ環境構築に「なんの苦労もなかった」のかといえば、これはそうでもない。チマチマと細かいトラブルシューティングはやってる。けどどれも問題解決の糸口はほとんどのものは数分以内に見つけてて、大物だけは記録し、周知する、としてた。

そこなんだよね。

ネットで転がってる情報を大きく分類すると、だいたいこんな感じだと思うんだ:

  • 「普及・啓蒙」という明確な意思をもって、網羅的かつ完全性に腐心した大作
  • 「個人的にとっても大変でしたぁ」を情報発信したい人
  • クリック報酬で小銭稼ぎしたい人

要するに、最初の「ちゃんとした」情報から漏れるか、もしくは「大作過ぎてそこから情報抽出するの大変」になった場合の受け皿となる2つ目「大変でしたぁ」の閾値が、技術者によってかなりの格差があるわけなのよね。つまり「スキルが高い技術者がほんの少々のトラブルをいちいち苦にしてない」ならば、「苦労しましたぁ」として情報発信する動機になんか、なりゃしないわけなのよね。

「ぱいそんのかんきょうこうちくって~」みたいな感想が迷惑に感じるのはさ、「どこ見てんのよ」てことさ。本題に集中してくれよ、と言いたいわけ。こういう「技術者」(もどき)とは議論にならんので疲れるのだ。


立体地形図を手作りしてみようかな、っと(11.5)でね、突如 Basemap を使い出してるじゃない? これ、当然「インストールした」という作業について一切触れてないわけだけど、当たり前だけど「インストール作業」はしてるわけ。

で、本当は「なくてもいいはずの苦労」をしてる。そして例によって、本人には「全く苦労のうちに入らない」レベルの。

どういうことか?

これは、Basemap が「とても大きな」ライブラリであることに関係している。大きな、というのは、「サイズが」。130MB くらいある。なんでこんなにデカいかというと、地図情報のデータを含んでるからね。

本来 basemap は、「オレはこの OSS を Windows で使いたいだけなんじゃ@python」で説明している Unofficial Windows Binaries for Python Extension Packages に含まれている。だから、苦労するはずなどない。問題は、この「Unofficial Windows Binaries for Python Extension Packages」からのダウンロードが、「ブラウザからしか出来ない」ことにある。

ブラウザのダウンロード機能の問題というのは、ネットワーク不調で転送が中途で打ち切られてしまった場合のレジューム手段がないことである。一度失敗したら、再度「最初から」やり直すしかない。この 130MB、結局ここからダウンロードすることを断念せざるを得なかった、今月のワタシは。(ワイモバイルだからさ。)仕方がないので、wget -c で取得可能な オリジナル PyPI 配布物を選んだ、ということ。ここまではさすがにワタシにとっても「苦労」だ。けれど、別にこんなもの、「情報」でもなんでもなかろう。誰の役にも立たない。

問題はここから。このビルド、素直にすんなり行ったのか? 答えは「全然 NO」。そして大変だったのか? 「少なくともワタシには、全く印象に残らないほどに、NO」。

普段ならこれで終わり。「しょーもない「いつもの」苦労」として、個人的なメモも残さず、ましてや、ひとさまに情報公開しようなんてモチベーション、発生なんかしない。

あぁそうか、こうやって「スキル格差」が広がっていくのだな。


私的私だけのための、という意味では、手順はトライアンドエラーで、エラーメッセージに任せて一個一個解決していっただけのこと。どれも何も難しいことはなかった。以下で説明する手順は、こうやって「公開」するに相応しい情報に仕立て上げなおすために(もう一回作業することで)整理したもの。

Microsoft Visual C++ Compiler for Python 2.7での場合、(win64の場合)これだけである:

  1. 「Visual C++ 2008 64-bit Command Prompt」
  2. 環境変数 INCLUDE に、basemap ソースツリー中に含まれる geos-3.3.3/include と geos-3.3.3/capi を追加
  3. geos-3.3.3/ 内の autogen.bat を起動(あるいはこの中の COPY を真似する)
  4. geos-3.3.3/ 内で nmake -f makefile.vc で geos をビルド
  5. geos-3.3.3/ ビルドで出来た geos-3.3.3/src/*.dll*、geos-3.3.3/src/*.lib* を c:/Python27/PCBuild/amd64 にコピー
  6. 環境変数 GEOS_DIR に c:/Python27/PCBuild/amd64 をセット
  7. python setup.py build ; python setup.py install

例によって MSYS でやるとこういう具合:

 1 me@host: ~$ tar zxvf basemap-1.0.7.tar.gz
 2 me@host: ~$ cd basemap-1.0.7
 3 me@host: basemap-1.0.7$ export INCLUDE="${INCLUDE};`pwd -W`/geos-3.3.3/include;`pwd -W`/geos-3.3.3/capi"
 4 me@host: basemap-1.0.7$ cd geos-3.3.3
 5 me@host: geos-3.3.3$ cmd /c autogen.bat
 6 me@host: geos-3.3.3$ nmake -f makefile.vc
 7 me@host: geos-3.3.3$ mkdir -p /c/Python27/PCBuild/amd64
 8 me@host: geos-3.3.3$ cp -p src/*.dll* src/*.lib* /c/Python27/PCBuild/amd64
 9 me@host: geos-3.3.3$ cd ..
10 me@host: basemap-1.0.7$ export GEOS_DIR=c:/Python27/PCBuild/amd64
11 me@host: basemap-1.0.7$ python setup.py build
12 me@host: basemap-1.0.7$ python setup.py install

README とか INSTALL というファイルを読んだり、公式サイトから情報収集したり一切せずに、「あ、.bat がある」「ん、geos_c.h が見えない、と怒られた」と都度解決してっただけ。

要するにいまの場合はわたしの言う「スキル」とは、「Unix的ビルドプロセスの標準的なマナー」への慣れ、「VisualStudio-nize」があるのかないのかを探すことの慣れ(なければ自力でやれるかどうかのスキル)、など。

上で整理した手順も、その前にやった「トライアンドエラー」もどちらも、結局悩んでるのはトータルでは30秒にも満たないわけで、つまり「大変スムーズでした」と言うだけの、極めて難易度の低いもの、だったのね。(あぁ、なんて楽になったんだ、いい時代になったもんだ、とさえ思う。)


「スキル格差」ということでいうと、あるいはひょっとすると「Unix的操作への慣れ」を学ぶ機会というのも昔より減ってる可能性が高いので、ときどきでもいいから、こうやって「私的動機は薄くても」ちょっと努力して情報発信してあげたほうがいいのかなぁ、と思った、って話でした。技術者はなんでかんでどんどん甘やかされて育って来てるからさ、大昔の基礎を学ぶ機会をなくしてるのはこれは、若者の責任ではないもんなぁ。













余談ですが。これが話が NumPy や SciPy になってくると話は全然別。こやつらの大変さ(特に行列ライブラリを自分で選びたい、たとえば OpenBLAS を使いたい場合)は、basemap との比較にはならない。はず。(やってないのでわからないが、簡単じゃないだろう、たぶん。自力構築は linux 系でしかやったことはない。)


2021-05-07追記:
紹介した basemap だが、作者である Jeff Whitaker が「basemap プロジェクト」としての保守を完全にやめ、pip でのインストールも不可能になった。自身による説明:

Deprecation Notice
Basemap is deprecated in favor of the Cartopy project. See notes in Cartopy, New Management, and EoL Announcement for more details.

リンク先をちょっと読むに、「より大きなプロジェクトに取り込まれた」ということに見える。cartopy はワタシ自身にとって完全に未知なのでまだ何も言わないけれど、余力があったらそのうち何か書くかも。

2021-05-14追記:cartopy について書いた