KH Coder を Intel Mac にインストールする(2022 + 2024.3 追補)

# これはなに

この記事を読むと KH Coder を Intel Mac に入れるのがいかに大変かがわかります。時系列で書いていない上に、すべてを記録しているわけではないので再現性があるわけではないでしょう。

本家が [Macで手軽にKH Coderを［有償サポート］](https://khcoder.net/mac_com.html)という形でMacに対して有償サポートをしている。これを使うのが一番無難（だと思う）。

Perl と R のインストール地獄を味わいたい人だけやってみるといいでしょう。

[冴えない彼氏のKH-coderの使い方（Mac導入編）](https://qiita.com/Yomiyama1998/items/172ad392e1971e20e9ac)という先人の情報があったのでうまくいけた。ありがとう。

## 環境
Intel Air Mac に macOS Monterey をインストールしたもの。

最終的インストールされるもの

- Java
- mecab と辞書
- R 4.1.2 といろんなパッケージ
- Perl のモジュール
- mysql 8

mysql は 8 にしたためちょっとした変更が必要だった。一番の難所は Perl で Tk のインストールと R のパッケージのインストール。とくに Macintosh の Perl 環境は特殊だった、、、、

### よくみると
Ubuntu の情報ではあるが必要なパッケージは羅列されている。

https://github.com/ko-ichi-h/khcoder/blob/master/doc_contrib/Vagrantfile

## Homebrew
Java などのインストールに [Homebrew](https://brew.sh/index_ja)が必要。本家から素直にインストール。

## Java
確か、単純に入れた。記録にない。多分 openjdk。

```
$ brew install openjdk
```

今後、英語の解析したときに必要になると思う。

## Mecab

```
$ brew install mecab 
$ brew install mecab-ipadic
```

/usr/local/etc/mecabrc に追加。

```
; ChaSen
node-format-chasen = %m\t%f[7]\t%f[6]\t%F-[0,1,2,3]\t%f[4]\t%f[5]\n
unk-format-chasen  = %m\t%m\t%m\tUNKNOWN\t\t\n
eos-format-chasen  = EOS\n
```

## R が必要とするパッケージ。
これが大変。gtable, maptools, rgl をインストールする前に brew でパッケージをインストールする必要がある。

```
brew install openssl
brew install gdal
brew install wget
brew install gcc
brew install textshaping
brew install halfbuzz
brew install imagemagick
brew install fribidi
```

どれが本当に必要なパッケージか？は不明。openssl は 3 が入った。二つ入っていていいのかも不明。

```
$ brew search openssl
==> Formulae
glib-openssl                             opensc
openssl@1.1 ✔                            open-sp
openssl@3 ✔                              openfst
openslp                                  openmsx
openssh                                  opencsg
```

## R
あれ？どうやって入れたんだっけ？brew?多分次の通り。

```
$ brew imstall R
```

## R のパッケージ
sudo -s でルートになって、必要なパッケージをまめに入れた。以前は手入力をしていたが、スクリプトでやれる。

```
# R -f /tmp/R.txt
```

スクリプトはこんな感じ。

```
install.packages("ade4", dependencies=TRUE)
install.packages("amap", dependencies=TRUE)
install.packages("Cairo", dependencies=TRUE)
install.packages("cluster", dependencies=TRUE)
install.packages("codetools", dependencies=TRUE)
install.packages("colorspace", dependencies=TRUE)
install.packages("dichromat", dependencies=TRUE)
install.packages("foreign", dependencies=TRUE)
install.packages("ggdendro", dependencies=TRUE)
install.packages("ggplot2", dependencies=TRUE)
install.packages("ggnetwork", dependencies=TRUE)
install.packages("ggsci", dependencies=TRUE)
install.packages("gtable", dependencies=TRUE)
install.packages("igraph", dependencies=TRUE)
install.packages("KernSmooth", dependencies=TRUE)
install.packages("lattice", dependencies=TRUE)
install.packages("maptools", dependencies=TRUE)
install.packages("MASS", dependencies=TRUE)
install.packages("Matrix", dependencies=TRUE)
install.packages("mgcv", dependencies=TRUE)
install.packages("munsell", dependencies=TRUE)
install.packages("nlme", dependencies=TRUE)
install.packages("nnet", dependencies=TRUE)
install.packages("permute", dependencies=TRUE)
install.packages("pheatmap", dependencies=TRUE)
install.packages("plyr", dependencies=TRUE)
install.packages("proto", dependencies=TRUE)
install.packages("RColorBrewer", dependencies=TRUE)
install.packages("Rcpp", dependencies=TRUE)
install.packages("reshape2", dependencies=TRUE)
install.packages("rgl", dependencies=TRUE)
install.packages("rpart", dependencies=TRUE)
install.packages("scales", dependencies=TRUE)
install.packages("scatterplot3d", dependencies=TRUE)
install.packages("slam", dependencies=TRUE)
install.packages("som", dependencies=TRUE)
install.packages("sp", dependencies=TRUE)
install.packages("spatial", dependencies=TRUE)
install.packages("stringr", dependencies=TRUE)
install.packages("survival", dependencies=TRUE)
install.packages("vegan", dependencies=TRUE) 
install.packages("wordcloud", dependencies=TRUE)
```

## terra_1.4-22.tar.gz
インストールに proj_api.h がないと言ってエラー。configure でこけている。仕方がないので terra_1.4-22.tar.gz をダウンロード。

```
$ wget https://cloud.r-project.org/src/contrib/terra_1.4-22.tar.gz
$ tar zxvf terra_1.4-22.tar.gz 
```

brew でインストールした proj@7 の pkg-config が反映されていない模様。

```
$ export PKG_CONFIG_PATH=/usr/local//Cellar/proj/7.2.1/lib/pkgconfig/
$ pkg-config proj --libs
```

多分これで OK。あとは make & make install。

## Perl
もともとはいっている Perl は Tk をインストールできないので brew でいれる。ついでに cpanm も brew で入れる。

## Perl の Tk
cpanm で Tk のモジュールのコンパイルに失敗する。perl.h がないと言われて。どうも、Macintosh は出荷時に perl と一緒にあるべき perl.h を削ってしまった模様。そこで、perl を brew でインストールして make した。

brew でいれても、もともとの perl はそのままある（たぶん、その方がよい）。どういう経緯か忘れたが cpanm も /usr/local/bin/cpanm にインストールされるのだがこれはもともとの perl 用みたい。brew で入れると別の場所にあるので恐らくそっちの cpanm を使えば一発でインストールできる。おそらくというのは結局 make install で入れてしまったから。

ということで wget して make。

```
# wget http://www.cpan.org/authors/id/S/SR/SREZIC/Tk-804.036.tar.gz
# PATH=/usr/local/Cellar/perl/5.34.0/bin:$PATH
# which perl
# cd Tk-804.036
# perl Makefile.PL
# make
# make install
```

ダウンロードして展開した。そして perl Makefile.PL を実行する。すると、もともとの perl では perl.h がないと言ってエラーになる。これはどうも Apple が提供するのを削ってしまったみたいね。

brew でインストールした perl で Makefile.PL を実行するとうまくいく。そいて make & make install でインストールされる。brew の perl からはこちらが参照される。

## DBD::mysql
これもたしか cpanm でエラーになった。 そこで、個別に make。SSLの設定 と　DYLD_LIBRARY_PATH　が必要になる。

```
$ export DYLD_LIBRARY_PATH=/usr/local/opt/openssl/lib:$DYLD_LIBRARY_PATH
$ /usr/local//Cellar/perl/5.34.0/bin/perl Makefile.PL --cflags="-I/usr/local/Cellar/mysql/8.0.27_1/include/mysql -I/usr/local/Cellar/openssl\@3/3.0.1/include/" --libs="-L/usr/local/Cellar/mysql/8.0.27_1/lib -L/usr/local/Cellar/openssl@3/3.0.1/lib/ -lmysqlclient -lz -lzstd -lssl -lcrypto -lresolv"  
$ make
$ sudo make install
```

## Perl その他モジュール
Tk で要領がわかったのであとはこつこつと cpanm でインストールすればよい

## mysql 8
インストールは簡単。問題は 8 と 5.6 ではセキュリティ等々すごく変わった。

### サーバ

```sql
mysql> SELECT @@local_infile;
+----------------+
| @@local_infile |
+----------------+
|              1 |
+----------------+
1 row in set (0.00 sec)
```

で修正。my.cnf でもいい。

### クライアント
/usr/local/etc/my.cnf を修正。

```
cat /usr/local/etc/my.cnf 
[client]
# for khcoder
loose-local-infile=1

# Default Homebrew MySQL server config
[mysqld]
# Only allow connections from localhost
bind-address = 127.0.0.1
mysqlx-bind-address = 127.0.0.1
# for khcoder
default_authentication_plugin=mysql_native_password
```

### ユーザとデータベースを作る
これは前からそうだったのかもしれないが、、、
user をパスワード付きで作って権限を与える必要がある。

```sql
mysql> create user 'khcoder'@'%' identified by 'khcoder';
Query OK, 0 rows affected (0.02 sec)
```

実際の作業時には khcoder という DB を作っってしまった。これ多分必要ない。

### KH Coder のダウンロードと設定、実行

KH Coder は github から clone できる。

```
$ git clone https://github.com/ko-ichi-h/khcoder
```

実行は khcoder の下で brew の perl で kh_coder.pl を一度実行して config/coder.ini を自動生成させて一度終了。さらにそれを編集する。Linux のそれをコピーするとフォント関連でうまくいかない。

```
mecab_unicode   UTF-8
mecabrc_path    /usr/local/etc/mecabrc
デフォルト mecab
sql_username    ユーザ
sql_password    ユーザのパスワード
```

実行するとウィンドウが小さめに出るので豆に大きくしましょう。

### 実行時のエラー
引っかかった個所

- データベースにログインできない (localhost or user or passwd の問題)
- DB はあるが insert できない（パーミッションの問題)
- ファイル読み込みでエラー (サーバとクライアントの設定）

いずれも上の作業の何かを飛ばしている。そして、これを回避しようとするとセキュリティが甘くなることに注意。

### 漢字が入力できない
理由は不明。チュートリアルにあるこころを実行しようとして、一人、二人と入力したかったが、できなかった。しかたないので前処理の時にファイル入力にする。すると、、、--- とか cell をいれなかったのでそれも評価されるようになった。そういう意味だったのか、、、

後でコピペすればいいことがわかった。直接の漢字入力はうまくいっていない。

# 2024.3.5 追補
Macintosh の OS をアップデートしたりなんだりしていたら、動かなくなってしまった。
まずは brew が正しく動くことを確認しましょう。以下、うろおぼえのメモ。

## brew doctor で健康診断


```
$ brew doctor
```

ここでエラーが出ているとあとあとめんどくさいので(たぶん)。うろおぼえだけど libssl と prog を一旦 uninstall して install した。
そして、OS のアップデートまでしてしまった。

```
$ brew update
$ brew upgrade
```

こうするとインストールされていたものがだいたい upgrade されてしまう。後で気がついたのだが、brew には link というコマンドがあって、これを実行しないと /usr/local/bin にインストールされない。perl と mysql の link を実行した(うろ覚え）

```
$ brew link perl
```
### Xcode を再インストールした
なんか brew doctor で言われた（んだと思う。うろ覚え）、Xcode をインストールした(気がする)。

```
xcode-select --install
```

## MySQL 8.3 の問題と MySQL 8.0 のインストール
現時点で MySQL 8.3 では perl の DBD::mysql が使えない。bug の issue として上がっている。

https://github.com/perl5-dbi/DBD-mysql/issues/411

理由は mysql_list_fields という deprecated だった関数が 8.3 でなくなったため。cpan で force とか使っても、そもそも bundle.mysql がエラーなので、動かない。ということで、MySQL 8.0 を使わないといけない。

```
$ brew uninstall mysql
$ brew uninstall mysql-client
$ brew install mysql@8.0
$ brew install mysql-client@8.0
$ brew link mysql
```

## CPAN でインストール

とちゅうがちゃがちゃ CPAN でインストール。そのために sudo で root になる。

```
$ sudo -s
#
```

その時 /usr/local/bin/perl に perl があることを確認する。あと mysql_config も brew の link でリンクが作られるのであること(実行できること)を確認する。PATH が変だと /usr/bin/perl とか見ていることになるので確認重要。

### その前にアンインストールの方法もちょっと
CPAN には明示的なアンインストール方法がない。インストール時は .cpan/build の下のモジュールで make, make test, make install が実行されるみたいだ。make install がされた後に make uninstall と実行すると unlink コマンドが表示されるのでそれをコピペして、実行して uninstall するという。なんだかわからないシステムになっている。unlink なんでディレクトリは残ってしまう。気になる人はがんばって rmdir してください。

### 気を取り直して CPAN でインストール

[ここ](https://qiita.com/jim__okada/items/c134529e981585be39e5) の情報を元にインストールする。

CPAN のシェルの起動

```
# perl -MCPAN -e shell
```

以下のパッケージをインストール

```
install Jcode
install Tk
install DBD::CSV
install Net::Telnet
install YAML
install Spreadsheet::ParseExcel
install Spreadsheet::ParseXLSX
install Clipboard
install Statistics::Lite
install Algorithm::NaiveBayes
install Text::Iconv
install File::Copy::Recursive
install DBD::mysql
```

あといくつも足りないものがあった。perl kh_coder.pl してエラーが出たら、install するという方法を取った。何が足りなかったかは記録してないので不明。

肝心の DBD::mysql は 5.003 。5.004 になったら 8.3 対応するみたいね。

最終的に立ち上がったので、「こころ」を読み込んでチェックとかする。