Maya2018に最近傍点探索モジュールを入れる

Python単体で近傍頂点探索(数万頂点規模)は、ちょっとキツかった。

めも。(入れたモジュールは、nmslib。最初CPythonでAnnoyを使ってみて、これでいいやと思った。しかしMaya2018へのpipインストールができそうになかったのでpipインストールが容易なこちらを選択。)

事前に、numpyとVisualC++ Build Tools(V14.0)のインストールが必要。(既にVisualStudio2015を入れているなら、VisualC++ Build Toolsは不要)

・get-pip.pyをダウンロードして、mayapy.exeと同じ場所に配置。
・コマンドプロンプトを管理者権限で起動。mayapy.exeの場所をカレントディレクトリにして、以下を実行。

・pipの配置場所をカレントディレクトリにして、以下を実行。

・VisualC++ Build Toolsをダウンロードしてインストールする。(CMake for Windowsを入れてなければ、そっちも。)
・VisualC++ Build Tools > Visual C++ 2015 x64 Native Build Tools Command Prompt を管理者権限で起動して、以下を実行。

という感じだった。

参考

近似最近傍探索ライブラリ比較
AutodeskMAYAにpip, numpy をインストールする方法
[GUIDE] How to install numpy+scipy in Maya Windows 64 bit?
【python】ライブラリインストール時に「error: Microsoft Visual C++ 14.0 is required.」エラーが発生

その後

 仕事では、結局Pythonのみでなんとかすべし。という指令が下り、頑張ってなんとか初期段階から50倍以上の高速化ができて、C++記述のプラグインと通常利用で遜色ないところまで早くなったとさ…(いろいろ問題は抱えてるんだけども、通常利用で噴出しないところに収められた感じなので、良しとした。)
 でもモジュール利用ができるなら、間違いなく実現までの工数をすっ飛ばせていたので、使えるものなら使えばいいんじゃないかと。(今回の仕事では使えなかっただけ)

プログラム言語習得に関して

 プログラム言語の習得に関しては、理数系・文系を問わず可能です。
 しかし、アプローチのスタンスが異なるので、特に文系思考(正しくは、論理的思考よりも感覚的な経験が基準になっている思考方法)の場合には習得に困難さを感じがちです。

 そもそもプログラム言語の取得に関しては、理数系の思考をする人の方が圧倒的に有利です。これは、プログラム言語が理数系の人の考え方を元に設計されたものである以上、仕方がないと言えます。逆に自然言語(日本語や英語など、会話に用いられる一般な言語)に関しては、論理的思考よりも感覚的な面が反映されやすいので、感覚的な経験を元にする文系思考の人のほうが馴染みが早いのです。
 従って、学習に有効なアプローチも異なります。

 もし理数系が得意という人は、一般に流通しているプログラム言語の入門書を読めば大体の理屈が飲み込めるので、そのままプログラム言語を書けるようになるでしょう。
 問題は、文系思考の場合です。基本文系でもある程度すんなり理数系を理解する論理的思考を持つ人であれば、純粋な理数系の人に準じて、それなりにプログラム言語を書けるようになります。しかし、純粋に文系思考で、経験的に物事を把握していくタイプの場合、捉え方が異なるので思うようにプログラム言語の習得が出来ない…という状況に陥ることは多く見受けられます。

 必要なのは、ひとえに経験になります。
 経験から状況に応じた方法を理解するタイプだと、どうしても解るまで続けるしか手段を持っていないので、理論が先行するような情報の解釈に時間が掛かるのです。なかなか腑に落ちない、と言い換えても良いかもしれません。
 ですので、習得の為には腑に落ちるまでプログラムを動かして、ひたすら挙動を知る。ということが、必要になります。

 理数系の人でも頭の中でやっている事はそんなに変わらないのですが、今までに習得した理屈と同じものを頭の引き出しから取り出して理解することを行うので、腑に落ちるのにそんなに時間が掛からないことが多いだけです。知らない分野ならむしろ理数系の人の方が時間が掛かったりします。ただし、一度学習が終わるとその後に必要な時間は圧倒的に短縮されますが。

 
 ただ「動かして覚える」場合、入門書に記述されているサンプルのパターンが少ないという問題に直面します。というのも、基本的な入門書の内容として「PCの動作を理解する」ということが語りたいことなので、動作の基本になるパターンを前提に書いています。実行時に問題が起こるパターンを網羅するようなものではなく、あくまでも一例として基本動作を挙げているだけです。
 文系思考の強い人の場合は、この点も敷居の高さを感じる部分かもしれません。応用しようにも、動作の切り分けが意識できていない場合には、ある機能がどういった機能で成り立っているのかまで詳細に理解出来ていない場合が多く、機能を1つのブラックボックスとして捉えたまま利用してしまうことからなかなか抜け出せない場合があります。
 理数系タイプの人だと、必要に応じて機能を細分化して捉え直すことを行いますが、これが出来るのは「PCの動作を理解する」のと同様に、それがどういった形で成り立っていうのか、構成もある程度理解して捉えようとする面があるからです。

 では、文系思考の強い人がプログラム言語習得を行うにはどうしたら良いのでしょうか?
 先にも書きましたが、経験を積む必要があります。
 理数系の人が行っているような「機能の構成を捉える」という部分についてです。

 つまり文系思考の人の勉強のステップとしては、とても大きくは2つのステップを意識的に行う必要があります。

 ・動くプログラムを用意して、「プログラムの動作を理解する」ステップ
 ・更にプログラムの利用する機能について、「PCの動作を理解する」ステップ

 実のところ、これは理数系の人も同じことをしています。理数系の人は、説明をするまでもなく自然にそれを行ってしまうだけです。そもそも、PCやソフトウェアの動作を知ることが好きだったり、作ることや動くのを楽しんでやっているだけなので、勉強しているという意識もなく自然に実践している…というのが実態だと思います。

 文系思考の場合は、なかなかそういうわけにもいかない部分があります。スタート時点での不利は否めませんが、判り始めるとその状況も変わってくるので、「何故プログラム言語を習得しようとしているのか」という初志を忘れないで取り組む事が必要になると思います。
 「自分だけのソフトを作りたい。」「もっと自分好みの機能が欲しい。」などの目的意識があるなら、学ぶのに必要な苦労とのトレードオフだと思います。

 ただ最初は勉強になるので、経験として身に付くまでなるべく間を開けずに継続的に取り組む必要があります。
 この手の技術というのは使わなくなると意外と簡単に忘れてしまうのですが、一度身に付けば再学習は前のように時間を取られることはなくなるので、まず一度身に付くまで継続するくらいの頑張りが大事です。

関連記事

 プログラミングは難しいか?
 プログラムを作れるようになるには
 プログラムは誰にでも書ける

Qt.py 便利だ…

 前の記事(PySideのノード描画ライブラリ)で Python3&PySide2対応させたけれども、やっぱりPython&PySide環境でも利用するには…と思い始めてしまったので、とりあえず気になっていたQt.pyを試してみた。

 感想としては、「やっぱり便利だ…。」という感じ。
 実質PySide2に書き換えたコードのimport文の指し先を、PySide2からQtに変えただけで特に問題なく動いてしまった。
 PySideで作られたコードの場合は、PySide2相当の記述に変えないといけないのかもしれないけど、一旦PySide2で作ったらimport文以外変更なしでいけそうな気配。

 PySide2になってちょこちょこ引数のとり方も変わってるので、まったくPySide2対応していない場合にそれを今更直すのは面倒だけど、新しく書いたコードを古い環境に適用させないといけない可能性が有るなら便利かと思う。(古い環境にもQt.pyがあれば、コード変更要らずなわけで。)

参考

Qt.pyでPySideとPySide2を共通コードで使う