どうせ和布蕪るなら、の続き (64bitビルドの、も少し検証んな)

ここから始まる地獄、は、確かに微かなる地獄なわけだ。

ここでやった MeCab.py は、振る舞いがヘンなわけね。nodeToParse を使う場合にのみおかしい感じなんだけれど、ともあれこやつから返る最初のノードの表層形がおかしい(2つ目のノードまでかもしれない)。

で、「問題の切り分け」の術としては、「Unix ならどうなんだ」って理想的環境をベースに考えるのがおそらく最善なんだけれど、その前に起動は手軽な msys2 の方でやってみようかと思った。

msys2 は日常使いしてないもんで、持ってたのがあんまり新しくなくて、たぶん 2017年6月2日版、かな? インストーラが残ってないんだけれど、/usr/bin の中にある、パッケージマネージャ関係以外のタイムスタンプを見る限り、おそらく。で、こいつには python2.7 だけが入ってた(なぜか dll だけは 3系のがいたけど)。

なんかね。全然ダメ。MSVC でやったのと非常に似ているんだけれど、こちらはコンパイルエラーではなくてリンクエラーの方。unsigned longchar* const 関係のオーバロードに関するものみたいだから、まさしく「64bit対応」に関係する部分なのだけれども、HAVE_UNSIGNED_LONG_LONG_INT は configure スクリプトがしっかり把握して config.h にブチ込んでくれてるので「それじゃない」んだよね。うーん、64bit 版 CRT、みたいなものは msys64 であれば「問答無用で 64bit版」なのであろうから、そこでリンクエラーになるのもよーわからん。(あ、これはワタシの MeCab.py 用 setup.py だけの話じゃなくて、標準のビルド「./configure ; make」でも同じね、念のため。)


ゆえ、「msys2 が古いからかなぁ」と、2年半ぶりということになるか、msys2 のアップデートを。msys2-x86_64-20190524 ってバージョンのヤツな。

python は pacman -S python2pacman -S python3 でそれぞれインストール。python3 は 3.7 なのか。3.8 じゃないのね。(つーかワタシはまだ native Windows な CPython では 3.5 ユーザなので、3.7 でも十分に新しいわけだが。)それと、危うく忘れそうになったが、gcc もインストールね。pacman -S gcc(なぜか大前提のいくつか(mecab のためには make、diffutils、あと python バインディングのために libcrypt-devel) がデフォルトで入らないのでそれらも)。

で、「問題の切り分け」をしたいわけなので、MeCab に関しても、「公式」と「野良ビルド」両方やりたいわけよね。けれども、mecab は pacman での管理対象外、つまり pacman ではインストール出来ない。結局野良ビルドしかない。

結論。「最新の msys2 でも状況はまったくおんなじ」。あぁ、もう msys2 での検証はダメだな。


で、重くて億劫なので出来れば避けたかったが、やむを得ず VirtualBox な Fedora (26) で。ちいとばかし迷走したが、python バインディングは以下で、つまり「抱え込まない」ビルドでは動く:

ちゃんと libmecab.so にリンクするわけさね。
 1 #! /usr/bin/env python                                                                                 
 2 
 3 from distutils.core import setup, Extension, os
 4 import re
 5 
 6 def cmd1(str):
 7     return os.popen(str).readlines()[0][:-1]
 8 
 9 def cmd2(str):
10     return re.split(r"\s+", cmd1(str))
11 
12 setup(name = "mecab-python",
13         version = cmd1("mecab-config --version"),
14         py_modules=["MeCab"],
15         ext_modules = [
16                 Extension("_MeCab",
17                         ["MeCab_wrap.cxx",],
18                         include_dirs=cmd2("mecab-config --inc-dir"),
19                         library_dirs=cmd2("mecab-config --libs-only-L"),
20                         libraries=cmd2("mecab-config --libs-only-l"))
21                         ])

(蛇足: この setup.py は公式な GitHub レポジトリにおいてあるやつを一箇所だけ書き換えたもの。)

して、結論としては、「Windows での振舞いとほぼ同じ」。つまり、最初のノードの表層形はやっぱりおかしい。

昨日のだっけか、「ライブラリとしてはダメ」と言ったけれど、これねぇ、おそらくなんだけど、「parseToNode をベースに parse を作った」のではなくて、たぶん逆。parse が基礎で、「それをノードに分解する機能」として parseToNode をわざわざ作ったんだと。でないとこんなへんちくりんな振る舞い、説明出来ない。なんだかなぁ。機能分割を根本的に誤っとるつーか。


つまりは、「ワタシの野良ビルド」の問題なんかではなくって、元からおかしい、てことで良さそうだ。(あるいは linux 版のだって結局 64bit ビルドなので、RPM Fusion なパッケージでのビルドも「ワタシと同じく失敗している」可能性もないではないけれども。)

なんというか、もうあれだわ。「parse 以外の機能は諦めて、parse の結果を自力でパースする」か、「ダミー。」で誤魔化すかの二択、てことなのだわ。parseToNode は壊れてるとして諦めるのが賢明。


蛇足。

久々に Fedora ったんだけれど、やっぱワタシは linux、特に「RedHat 系」が大嫌いだ。何度も何度でも「ワタシはマインドとしては根っからの Unix ユーザ」と言っているけれど、はっきりいって「linux ラバーズ」ではないんだよ。なんつーか「研究者・開発者のための Unix」という大事な大事な精神を、台無しにしようと台無しにしようと努力を重ねてきたのが「RedHat を筆頭としたディストリビュータ」だからね。

何を言ってるのかって?

「コンパイラの付いてない Unix なんか Unix じゃねー」。の話。今回の検証で、g++ をインストールしてなかったことに気付いて愕然とし、mecab も「mecab-devel も必要だ」という無駄なノウハウを必要とし。「開発者しか開発環境はいるはずがねーだろヴァーカヴァーカ」てのはね、「Unix を使いたいユーザ」の想いとは真逆の親切なんだよ。ほんと、めっさストレスがたまる。とてもじゃないが Unix を使ってる気分になれない。



Related Posts