さくらインターネットで開発中WEB経由でCGIが正常に動かない場合の検証

やっとMecab.pmが動いたと思ったのも束の間・・・

ターミナル上での実行は正常でも
CGIとしてブラウザからアクセスすると文字化けしまくる、という状況でした。

こういうときはひとつづつ潰していくのが良いと思います。

mecabの実行結果はどうなってる?

コマンドラインとブラウザ経由と吐き出す出力を比べるにはテキストファイルに出してみると良いです。

 

#!/usr/bin/perl
use strict;
use warnings;
use MeCab;
my $m = new MeCab::Tagger ("");
my $n = $m->parseToNode ("将来の話をしようじゃないか.");
my $debug;
while ($n = $n->{next}) {
    $debug .= "$n->{surface} $n->{feature} $n->{cost}\n";
}

# debug用の出力
open OUT,">/home/****/www/kyokigo/debug.txt";
print OUT $debug;
close OUT;

# HTMLの表示
print "Content-type: text/html\n\n";
print "<html lang=\"ja\">\n";
print "<head>\n";
print " <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n";
print " <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, minimum-scale=1.
0, maximum-scale=1.0, user-scalable=0\">\n";
print " <meta http-equiv=\"Pragma\" content=\"no-cache\" />\n";
print " <meta http-equiv=\"cache-control\" content=\"no-cache\" />\n";
print " <meta http-equiv=\"expires\" content=\"0\" />\n";
print " <link rel=\"apple-touch-icon-precomposed\" href=\"\" />\n";
print " <title>TEST</title>\n";
print "</head>\n";
print "<body>\n";
print "Ready.\n";
print "</body>\n";
print "</html>\n";

 

CGIとしても動かすために、後半にはシンプルなHTMLを書いています
(Ready.と表示するだけ)
出力結果を$debugに代入して、
ファイルをフルパスで指定して書き込んでいます。

 

ターミナルで実行した場合はこのような結果になりました。

将来 名詞,副詞可能,*,*,*,*,将来,ショウライ,ショーライ,, 3644
の 助詞,連体化,*,*,*,*,の,ノ,ノ,, 4286
話 名詞,サ変接続,*,*,*,*,話,ハナシ,ハナシ,, 7266
を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ,, 6790
しよ 動詞,自立,*,*,サ変・スル,未然ウ接続,する,シヨ,シヨ,, 9169
う 助動詞,*,*,*,不変化型,基本形,う,ウ,ウ,, 7777
じゃ 助詞,副助詞,*,*,*,*,じゃ,ジャ,ジャ,, 10731
ない 助動詞,*,*,*,特殊・ナイ,基本形,ない,ナイ,ナイ,, 11857
か 助詞,副助詞/並立助詞/終助詞,*,*,*,*,か,カ,カ,, 11413
. 記号,句点,*,*,*,*,.,.,.,, 8953
 BOS/EOS,*,*,*,*,*,*,*,* 8351

 

しかし、CGIとして実行した場合はこのような出力となりました。

絨 ?詞,一般,*,*,*,*,* 11143
来 禝?罨一般,*,*,*,*,* 14562
・ ?詞,一般,*,*,*,*,* 25298
・ ?詞,サ変接続,*,*,*,*,* 42326
をしようじゃ 禝?罨一般,*,*,*,*,* 45723
・ ?詞,固有名詞,組織,*,*,*,* 57685
か. 記号,一般,*,*,*,*,* 61031
 BOS/EOS,*,*,*,*,*,*,*,* 59294

 

結果が全然違います!
これは実行方法によって結果が変化してしまうことを示しています。

次回はもう少し確認してみましょう。

さくらインターネット用にex_mecab.plを短く修正

Text::MeCab が使えないので
Mecab.pmに変更しました。

#! /usr/bin/perl -w

use strict;
use warnings;
use lib '/home/****/perl5/lib/perl5'; # ローカルにインストールしたlibを使う
#use Text::MeCab;
use MeCab;
use TermExtract::MeCab;
use Jcode;
use Encode;
my $data = new TermExtract::MeCab;

#my $m = Text::MeCab->new();
my $m = new MeCab::Tagger ("");
my $s = "全域が太平洋側気候であるが、標高差が大きいため地域による寒暖の差が激しい。冬の平野部や沿岸 部は黒潮の影響で本州の中でも非常に温暖であり、寒気の影響を受けにくいために放射冷却によって朝晩は氷点下まで下がることがあっても、日中は10°Cを超えることがほとんどである.";
#my $n = $m->parse($s);
my $n = $m->parseToNode($s);
#my $t="";
my $str="";
my $txtfile="in.txt";
#while ($t = $n->next) {
while ($n = $n->{next}) {
    $str.=sprintf("%s\t%s\n",
    $n->{surface}, # 表層
    $n->{feature} # 現在の品詞
    );
    # $n = $t;
}

# 何故かEUCじゃないとTermExtractの結果が返らないのでEUCに変換.
$str = &Jcode::convert($str,"euc");

# 出力モードを指定
# 1 → 専門用語+重要度、2 → 専門用語のみ
# 3 → カンマ区切り
my $output_mode = 3;

#
# 「形態素解析」済みのテキストファイルから、データを読み込み
# 専門用語リストを配列に返す
# (累積統計DB使用、ドキュメント中の頻度使用にセット)
#
my @noun_list = $data->get_imp_word($str,'var'); # 入力が変数
#my @noun_list = $data->get_imp_word("in.txte"); # 入力がファイル

#
# 専門用語リストと計算した重要度を標準出力に出す
#
foreach (@noun_list) {
    # 日付・時刻は表示しない
    next if $_->[0] =~ /^(昭和)*(平成)*(\d+年)*(\d+月)*(\d+日)*(午前)*(午後)*(\d+時)*(\d+分)*(\d+秒)*$/;
    # 数値のみは表示しない
    next if $_->[0] =~ /^\d+$/;

    &Jcode::convert($_->[0],"utf8");

    # 結果表示
    printf "%-60s %16.2f\n", $_->[0], $_->[1] if $output_mode == 1;
    printf "%s\n", $_->[0] if $output_mode == 2;
    printf "%s,", $_->[0] if $output_mode == 3;
}

修正点の解説します。

メソッド名が違うので修正

#my $m = Text::MeCab->new();
my $m = new MeCab::Tagger ("");
#my $n = $m->parse($s);
my $n = $m->parseToNode($s);

地味に違う部分はここ。

#while ($t = $n->next) {
while ($n = $n->{next}) {
    $str.=sprintf("%s\t%s\n",
    $n->{surface}, # 表層
    $n->{feature} # 現在の品詞
    );
    # $n = $t;
}

Text::MeCabの場合は
while ($n = $n->{next}) {
のように書いてしまうと、1フレーズ目が飛ばされる、という現象が起きてしまいます。
その為、一旦$tに代入するという苦肉の策を取っています。

しかし、mecab.pmの場合はこのままで大丈夫でした。

どうしてこうなってしまうのか・・・うーむ。

あと、やはりTermExtract::MeCabはEUCで渡さないとダメでした。辞書はUTF8で入ったと思うのですが・・・。

 

さくらインターネットにText::MeCabがインストールできないのでmecab.pmを使ってみる

Text::MeCabを使った場合は以下のようになります。

use strict;
use Text::MeCab;
my $m = Text::MeCab->new();
my $s = "将来の話をしようじゃないか.";
my $n = $m->parse($s);
my $t="";
while ($t = $n->next) {
    printf("%s\t%s\n",
           $n->surface,          # 表層
           $n->feature          # 現在の品詞
           );
    $n = $t;
}

mecab.pmの場合は以下のようになります。

#!/usr/bin/perl
use strict;
use warnings;
use MeCab;
my $m = new MeCab::Tagger ("");
my $n = $m->parseToNode ("将来の話をしようじゃないか.");
while ($n = $n->{next}) {
    print "$n->{surface} $n->{feature} $n->{cost}\n";
}

若干print文の書き方が違うのですが、
ほとんど変えるところはないようですね。

newの仕方が違うかな・・・?

mecab.pmの方ではTaggerというのを使っていますが、引数には辞書を明示的に指定できるみたいです。

m = MeCab::Tagger.new("-u #{辞書ファイルのパス}")

あとは
parse

parseToNode
と変わっていますね。

ちなみに結果はこのようにとれます。

将来 名詞,副詞可能,*,*,*,*,将来,ショウライ,ショーライ,, 3644
の 助詞,連体化,*,*,*,*,の,ノ,ノ,, 4286
話 名詞,サ変接続,*,*,*,*,話,ハナシ,ハナシ,, 7266
を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ,, 6790
しよ 動詞,自立,*,*,サ変・スル,未然ウ接続,する,シヨ,シヨ,, 9169
う 助動詞,*,*,*,不変化型,基本形,う,ウ,ウ,, 7777
じゃ 助詞,副助詞,*,*,*,*,じゃ,ジャ,ジャ,, 10731
ない 助動詞,*,*,*,特殊・ナイ,基本形,ない,ナイ,ナイ,, 11857
か 助詞,副助詞/並立助詞/終助詞,*,*,*,*,か,カ,カ,, 11413
. 記号,句点,*,*,*,*,.,.,.,, 8953
 BOS/EOS,*,*,*,*,*,*,*,* 8351

さくらインターネットに自前の辞書を設定する方法

今後辞書にキーワードを追加とかやってみたいので、自前の辞書を見るようにします。

こちらを参考にしました。
さくらインターネットにPerl版のMeCab(形態素解析)を導入する

ちょっと読んでみたら、仕組みは単純みたいです。

デフォルトだと、

/usr/local/etc/mecabrc

を見に行くんですね。

でも、ホームディレクトリに

/home/****/.mecabrc

があると、こちらを優先的に見てくれます。

というわけで、コピーして書き込み権をつけます。

$ cd
$ cp -i /usr/local/etc/mecabrc .mecabrc
$ chmod u+w .mecabrc

viで編集します。
試しに、適当な存在しないディレクトリをdicdirに指定してみます。

;
; Configuration file of MeCab
;
; $Id: mecabrc.in,v 1.3 2006/05/29 15:36:08 taku-ku Exp $;
;
;dicdir =  /usr/local/lib/mecab/dic/ipadic
dicdir =  /usr/local/lib/mecab/dic/hoge

; userdic = /home/foo/bar/user.dic

; output-format-type = wakati
; input-buffer-size = 8192

; node-format = %m\n
; bos-format = %S\n
; eos-format = EOS\n

これで実行してみると・・・

~]$ mecab
param.cpp(69) [ifs] no such file or directory: /usr/local/lib/mecab/dic/hoge/dicrc

ちゃんと見に行く先が変わりました!

というわけで、インストールされた場所を指定してみます。

dicdir =  /home/****/local/home/****/local/lib/mecab/dic/naist-jdic

 

見比べてみます。

デフォルト辞書

めかぶの辞書のインストールが何故かうまくいかない。
め      名詞,一般,*,*,*,*,め,メ,メ
かぶ    動詞,自立,*,*,五段・ラ行,体言接続特殊2,かぶる,カブ,カブ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
辞書    名詞,一般,*,*,*,*,辞書,ジショ,ジショ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
インストール    名詞,一般,*,*,*,*,インストール,インストール,インストール
が      助詞,格助詞,一般,*,*,*,が,ガ,ガ
何故か  副詞,一般,*,*,*,*,何故か,ナゼカ,ナゼカ
うまく  形容詞,自立,*,*,形容詞・アウオ段,連用テ接続,うまい,ウマク,ウマク
いか    動詞,自立,*,*,五段・カ行促音便,未然形,いく,イカ,イカ
ない    助動詞,*,*,*,特殊・ナイ,基本形,ない,ナイ,ナイ
。      記号,句点,*,*,*,*,。,。,。

新辞書

めかぶの辞書のインストールが何故かうまくいかない。
め      名詞,一般,*,*,*,*,め,メ,メ,,
かぶ    動詞,自立,*,*,五段・ラ行,体言接続特殊2,かぶる,カブ,カブ,かぶ/被,
の      助詞,連体化,*,*,*,*,の,ノ,ノ,,
辞書    名詞,一般,*,*,*,*,辞書,ジショ,ジショ,,
の      助詞,連体化,*,*,*,*,の,ノ,ノ,,
インストール    名詞,一般,*,*,*,*,インストール,インストール,インストール,,
が      助詞,格助詞,一般,*,*,*,が,ガ,ガ,,
何故    副詞,助詞類接続,*,*,*,*,何故,ナゼ,ナゼ,,
か      助詞,副助詞/並立助詞/終助詞,*,*,*,*,か,カ,カ,,
うまく  形容詞,自立,*,*,形容詞・アウオ段,連用テ接続,うまい,ウマク,ウマク,うまく/上手く,
いか    動詞,自立,*,*,五段・カ行促音便,未然形,いく,イカ,イカ,いか/逝か,
ない    助動詞,*,*,*,特殊・ナイ,基本形,ない,ナイ,ナイ,,
。      記号,句点,*,*,*,*,。,。,。,,

区切りは変わってないですけど、feature文字列?がちょっと変わっています。

続)さくらインターネットにText::MeCabがインストールできない件

VineLinuxでなんとかインストールに成功したので、もういちどさくらインターネットで試してみました。

やり方は同じ

ヘッダファイルのパスも通しました。

export C_INCLUDE_PATH=/home/****/local/include
export CPLUS_INCLUDE_PATH=$C_INCLUDE_PATH

今度はコンパイルも通りました。

$ cc mecab.c

さてやってみます。
ところで、WEBで検索してみると、どのブログにも「選択肢が出るから-vせよ」とあります。
でも、多分誤りです。
「-v」ではなく「–interactive」です。
この指定で選択肢で止まるようになります。

$ cpanm --interactive Text::MeCab

Configuring Text-MeCab-0.20016 ... Subroutine checklibs redefined at inc/Module/Install/CheckLib.pm line 11.
Subroutine assertlibs redefined at inc/Module/Install/CheckLib.pm line 25.
Subroutine _author_side redefined at inc/Module/Install/CheckLib.pm line 39.
Path to mecab config? [/usr/local/bin/mecab-config] /home/****/local/bin/mecab-config
detected mecab version 0.996
Using compiler flags '-I/home/mlin/local/include -DMECAB_MAJOR_VERSION=0 -DMECAB_MINOR_VERSION=996'...
Using linker flags '-L/home/mlin/local/lib -lmecab -lstdc++'...

Text::MeCab needs to know what encoding you built your dictionary with
to properly execute tests.

Encoding of your mecab dictionary? (shift_jis, euc-jp, utf-8) [euc-jp] utf-8
Using utf-8 as your dictionary encoding
Detected the following mecab information:
   version: 0.996
   cflags: -I/home/mlin/local/include -DMECAB_MAJOR_VERSION=0 -DMECAB_MINOR_VERSION=996 -I src
   libs: -L/home/mlin/local/lib -lmecab -lstdc++
   include: /home/mlin/local/include
Can't link/include C library 'mecab', 'mecab', aborting.
N/A
! Configure failed for Text-MeCab-0.20016. See /home/****/.cpanm/work/1498387711.85430/build.log for details.

黄色のところで止まるので、入力します。

ところが残念ながら出ました。

Can't link/include C library 'mecab', 'mecab', aborting.

だめだこりゃ。

というわけで、とりあえず断念。
また何か思いついたらやってみます。

ローカルディレクトリにmecabをインストールする方法(2017)

なんだかmecabのインストールが上手くできなかったのが気持ち悪かったので
vineLinuxでソースコンパイルを試してみました。
インストール先はホームディレクトリにしてみました。さくらインターネットで応用が効くように、です。

 

mecab(0.996)のソースからのインストール

ここのSourceの
mecab-0.996.tar.gz:ダウンロード
からダウンロードします。
SorceForgeもあるのですが、このソースが見つからないです。どうしてなんでしょうか・・・?

$ tar -zxvf mecab-0.996.tar.gz
$ cd mecab-0.996

UTF8の指定はeucになってしまう不具合があるようでこうなっています。

$ ./configure --prefix=$HOME/local --with-charset=utf8

$ make

$ make install

インストールはあっさり成功しましたが、パスが通ってないので実行できません。

とりあえず以下にて設定します。

export PATH=/home/XXXX/local/bin:$PATH
export LD_LIBRARY_PATH=/home/XXXX/local/lib

これで一応実行できますが、ルートディレクトリのmecabrcを探しに行ってしまいます

param.cpp(69) [ifs] no such file or directory: /usr/local/etc/mecabrc

どうも仕様的にそうなっているようです。

環境変数を設定すると任意の場所を探しに行ってくれるようになります。

export MECABRC=/home/XXXX/local/etc/mecabrc

実行してみます。

$ mecab
param.cpp(69) [ifs] no such file or directory: /home/XXXX/local/lib/mecab/dic/ipadic/dicrc

やっと辞書がないよ、って言うエラーになりました。

 

辞書をインストール

2011年であんまり新しくないですが、最新です。

https://ja.osdn.net/projects/naist-jdic/releases/53500
naist-jdic (for MeCab) mecab-naist-jdic-0.6.3b-20111013

$ tar -zxvf mecab-naist-jdic-0.6.3b-20111013.tar.gz
$ cd mecab-naist-jdic-0.6.3b-20111013

インストールしましょう。

$ ./configure --prefix=$HOME/local --with-charset=utf8 --enable-utf8-only

$ make
/home/XXXX/local/libexec/mecab/mecab-dict-index -d . -o . -f EUC-JP -t utf8
...
done!
To enable dictionary, rewrite /home/XXXX/local/etc/mecabrc as "dicdir = /home/XXXX/local/lib/mecab/dic/naist-jdic"

makeでEUCがなんちゃらと出ているのが少し気になりますね。EUCになってしまっているかも。

→ EUCになっちゃってます。

$ nkf -w --overwrite *.csv
$ nkf -w --overwrite *.def

してからインストールします。

dicdirも指定することができます。

./configure --with-charset=utf8 --with-dicdir=$HOME/local/lib/mecab/dic/ipadic-utf8

ここからがうまく行きません。

$ make install
make[1]: ディレクトリ `/home/XXXX/mecab-naist-jdic-0.6.3b-20111013' に入ります
make  install-exec-hook
make[2]: ディレクトリ `/home/XXXX/mecab-naist-jdic-0.6.3b-20111013' に入ります
if ! [ -d /etc/mecab/dic/naist-jdic ]; \
        then mkdir -p /etc/mecab/dic/naist-jdic; \
fi
mkdir: ディレクトリ `/etc/mecab' を作成できません: 許可がありません
make[2]: *** [install-exec-hook] エラー 1
make[2]: ディレクトリ `/home/XXXX/mecab-naist-jdic-0.6.3b-20111013' から出ます
make[1]: *** [install-exec-am] エラー 2
make[1]: ディレクトリ `/home/XXXX/mecab-naist-jdic-0.6.3b-20111013' から出ます
make: *** [install-am] エラー 2

 

”`/etc/mecab’ を作成できません: 許可がありません”
とありますように、またルートディレクトリにアクセスしようとしています。
あまりできが良くないですね・・・。

その為オプションDESTDIRを追加してディレクトリを指定します。

$ make DESTDIR=$HOME/local install
make[1]: ディレクトリ `/home/XXXX/mecab-naist-jdic-0.6.3b-20111013' に入ります
make  install-exec-hook
make[2]: ディレクトリ `/home/XXXX/mecab-naist-jdic-0.6.3b-20111013' に入ります
if ! [ -d /home/XXXX/local/etc/mecab/dic/naist-jdic ]; \
        then mkdir -p /home/XXXX/local/etc/mecab/dic/naist-jdic; \
fi
if ! [ -f /home/XXXX/local/etc/mecab/dic/naist-jdic/dicrc ]; \
        then ln -s /home/XXXX/local/lib/mecab/dic/naist-jdic/dicrc /home/XXXX/local/etc/mecab/dic/naist-jdic/dicrc; \
fi
make[2]: ディレクトリ `/home/XXXX/mecab-naist-jdic-0.6.3b-20111013' から出ます
test -z "/home/XXXX/local/lib/mecab/dic/naist-jdic" || /bin/mkdir -p "/home/XXXX/local/home/XXXX/local/lib/mecab/dic/naist-jdic"
 /usr/bin/install -c -m 644 matrix.bin char.bin sys.dic unk.dic naist-jdic.csv char.def feature.def left-id.def matrix.def pos-id.def rewrite.def right-id.def unk.def dicrc '/home/XXXX/local/home/XXXX/local/lib/mecab/dic/naist-jdic'
make[1]: ディレクトリ `/home/XXXX/mecab-naist-jdic-0.6.3b-20111013' から出ます

なんとかインストールは成功した”みたい”です。

何故か”/home/XXXX/local/home/XXXX/local/lib/mecab/dic/naist-jdic”という深い場所にインストールされます。
シンボリックリンクもおかしいので、つながっていません。

$ cd /home/XXXX/local/home/XXXX/local/lib/mecab/dic/naist-jdic
$ ls
char.bin  dicrc        left-id.def  matrix.def      pos-id.def   right-id.def  unk.def
char.def  feature.def  matrix.bin   naist-jdic.csv  rewrite.def  sys.dic       unk.dic

必要かどうかわからないのですが、dicrcを編集しておきます。

;config-charset = EUC-JP
config-charset = UTF-8

そして、

param.cpp(69) [ifs] no such file or directory: /home/XXXX/local/lib/mecab/dic/ipadic/dicrc

ということですから

/home/XXXX/local/lib/mecab/dic/ipadic

/home/XXXX/local/home/XXXX/local/lib/mecab/dic/naist-jdic
にアクセスするようにリンクを張ります。

ln -s /home/XXXX/local/home/XXXX/local/lib/mecab/dic/naist-jdic /home/XXXX/local/lib/mecab/dic/ipadic

ようやく実行できるようになりました!

$ mecab
嫌よ嫌よも好きのうち。んなわけあるか。
嫌      名詞,形容動詞語幹,*,*,*,*,嫌,イヤ,イヤ,,
よ      助詞,終助詞,*,*,*,*,よ,ヨ,ヨ,,
嫌      名詞,形容動詞語幹,*,*,*,*,嫌,イヤ,イヤ,,
よも    副詞,一般,*,*,*,*,よも,ヨモ,ヨモ,,
好き    名詞,形容動詞語幹,*,*,*,*,好き,スキ,スキ,,
の      助詞,連体化,*,*,*,*,の,ノ,ノ,,
うち    名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ,,
。      記号,句点,*,*,*,*,。,。,。,,
ん      名詞,非自立,一般,*,*,*,ん,ン,ン,,
な      助動詞,*,*,*,特殊・ダ,体言接続,だ,ナ,ナ,,
わけ    名詞,非自立,一般,*,*,*,わけ,ワケ,ワケ,,
ある    動詞,自立,*,*,五段・ラ行,基本形,ある,アル,アル,ある/在る/有る,
か      助詞,副助詞/並立助詞/終助詞,*,*,*,*,か,カ,カ,,
。      記号,句点,*,*,*,*,。,。,。,,
EOS

やっとインストールできました!

 

ライブラリは?

mecab.hを使ってCプログラムをコンパイルしようとするとエラーになってしまうことから、
やはりうまく参照はできていないようです。

$ cc mecab.c 
mecab.c:1:19: 致命的エラー: mecab.h: そのようなファイルやディレクトリはありません
 #include 
                   ^
コンパイルを停止しました。

 

このように明示的にすれば通ります。

$ cc -I local/include mecab.c

 

環境変数で指定しても良いようです。

export C_INCLUDE_PATH=/home/XXXX/local/include
export CPLUS_INCLUDE_PATH=$C_INCLUDE_PATH

 

なんかとっても苦労しました。
最新版の不具合かもしれませんね・・・。

さくらインターネットにText::MeCabがインストールできない件

開発をraspberrypiでしてきたので、さくらインターネットの方で継続しようと思ったところハマっています。

何故か、Text::MeCabがインストールできません。
それほど大したモジュールではないと思うのですが、エラーを吐いてとまってしまいます。

$ cpanm Text::MeCab
--> Working on Text::MeCab
Fetching http://www.cpan.org/authors/id/D/DM/DMAKI/Text-MeCab-0.20016.tar.gz ... OK
Configuring Text-MeCab-0.20016 ... N/A
! Configure failed for Text-MeCab-0.20016. See /home/****/.cpanm/work/1498314513.60429/build.log for details.

詳細を見ます。

cpanm (App::cpanminus) 1.7043 on perl 5.008009 built for amd64-freebsd
Work directory is /home/****/.cpanm/work/1498314513.60429
You have make /usr/bin/make
You have LWP 6.24
You have /usr/bin/tar: bsdtar 2.8.5 - libarchive 2.8.5
You have /usr/bin/unzip
Searching Text::MeCab () on cpanmetadb ...
--> Working on Text::MeCab
Fetching http://www.cpan.org/authors/id/D/DM/DMAKI/Text-MeCab-0.20016.tar.gz
-> OK
Unpacking Text-MeCab-0.20016.tar.gz
Entering Text-MeCab-0.20016
Checking configure dependencies from META.yml
Checking if you have ExtUtils::ParseXS 2.21 ... Yes (3.18)
Checking if you have ExtUtils::MakeMaker 6.59 ... Yes (7.10)
Checking if you have Devel::PPPort 3.19 ... Yes (3.35)
Configuring Text-MeCab-0.20016
Running Makefile.PL
Subroutine checklibs redefined at inc/Module/Install/CheckLib.pm line 11.
Subroutine assertlibs redefined at inc/Module/Install/CheckLib.pm line 25.
Subroutine _author_side redefined at inc/Module/Install/CheckLib.pm line 39.
Path to mecab config? [/usr/local/bin/mecab-config] /usr/local/bin/mecab-config
detected mecab version 0.995
Using compiler flags '-I/usr/local/include -DMECAB_MAJOR_VERSION=0 -DMECAB_MINOR_VERSION=995'...
Using linker flags '-L/usr/local/lib -lmecab -lstdc++'...

Text::MeCab needs to know what encoding you built your dictionary with
to properly execute tests.

Encoding of your mecab dictionary? (shift_jis, euc-jp, utf-8) [euc-jp] euc-jp
Using euc-jp as your dictionary encoding
Detected the following mecab information:
   version: 0.995
   cflags: -I/usr/local/include -DMECAB_MAJOR_VERSION=0 -DMECAB_MINOR_VERSION=995 -I src
   libs: -L/usr/local/lib -lmecab -lstdc++
   include: /usr/local/include
Can't link/include C library 'mecab', 'mecab', aborting.
-> N/A
-> FAIL Configure failed for Text-MeCab-0.20016. See /home/****/.cpanm/work/1498314513.60429/build.log for details.

主にはここです

Can't link/include C library 'mecab', 'mecab', aborting.

 

こちらが一番近い・・・

Text::MeCabのインストールでCan’t build and link to ‘mecab’, ‘mecab’

でもちょっとエラーメッセージは違うし(リンク先様はbuildエラー?)あまり参考にならなかったです。
しかしながら、いくら検索してもこれ以上の情報はなし・・・。なぜでしょう。。。?

試しにモジュールをダウンロードしてきて
Makefile.plを自前で実行してみましたが、同じエラーです。

リンク先の方がおっしゃるように、
ラズパイではあっさり成功しますので、何かインストールに失敗(足りない?)しているような気もします。

Text-MeCab-0.20016]$ perl Makefile.PL
Subroutine checklibs redefined at inc/Module/Install/CheckLib.pm line 11.
Subroutine assertlibs redefined at inc/Module/Install/CheckLib.pm line 25.
Subroutine _author_side redefined at inc/Module/Install/CheckLib.pm line 39.
Path to mecab config? [/usr/local/bin/mecab-config]
detected mecab version 0.995
Using compiler flags '-I/usr/local/include -DMECAB_MAJOR_VERSION=0 -DMECAB_MINOR_VERSION=995'...
Using linker flags '-L/usr/local/lib -lmecab -lstdc++'...

Text::MeCab needs to know what encoding you built your dictionary with
to properly execute tests.

Encoding of your mecab dictionary? (shift_jis, euc-jp, utf-8) [euc-jp] utf-8
Using utf-8 as your dictionary encoding
Detected the following mecab information:
version: 0.995
cflags: -I/usr/local/include -DMECAB_MAJOR_VERSION=0 -DMECAB_MINOR_VERSION=995 -I src
libs: -L/usr/local/lib -lmecab -lstdc++
include: /usr/local/include
Can't link/include C library 'mecab', 'mecab', aborting.

自前でインストールした環境では大丈夫だった、という書き込みがあったので、
最新版をインストールしてみましたが、結果同じでした。

ふと、こんなページを発見しました
mecabライブラリ
https://taku910.github.io/mecab/libmecab.html

#include  てありますね。ここでぴーんと来ました。

試しに・・・

#include

int main(){
}

こんな何もしないCプログラムを作りコンパイルしてみました。ラズパイはあっさり通りましたが・・・

$ cc mecab.c
mecab.c:1:19: error: mecab.h: No such file or directory

ライブラリがない。ということですね。

さくらの500円レンタルサーバで MeCab を使う

こちらはあっさり諦めてましたね・・・・^^;

ちょっと悔しいですがMecab.pmでも動くように修正しますかね・・・。

あと、今後の辞書の更新のことも考えなきゃいけないので、

さくらインターネットにPerl版のMeCab(形態素解析)を導入する

こちらを参考にして辞書の設定もしたいと思います。

CGIで文字列を処理できるようにする

CGIで処理ができるように修正していきます。

送信した文字列を受け取る

CGIとして画面を表示することはできましたが、
このままではデータを受けとることができません。

use strict;
use CGI;

my $debug;

my $q=new CGI;
my @param=$q->param;
my %HASH;
for (@param){
    $HASH{$_}=$q->param($_);
    $debug.=qq($_ , $HASH{$_} | );
}

このように最初のところに追加します。

そして、$debug、が確認できるようにhtml上にも追加しておきます。

ここではbodyの直後に以下のようにしました。

print "<body>\n";

print "<body>$debug\n";

 

さらにtextareaのnameを設定しておきます。

print " <textarea name=\"\" rows=\"10\" cols=\"60\"></textarea>\n";

print " <textarea name=\"text\" rows=\"10\" cols=\"60\"></textarea>\n";

 

ここまで修正したら、CGIに戻って適当なメッセージを送信してみます。

OKをおすと・・・

フォームの上部に表示されました。
サーバーの中で文字列が処理されたからです。

何が起きているか

本当は環境変数からこのようなPOSTやGETのデータを拾うのですが、
この”CGI”というモジュールを使うと簡単です。

環境変数から読み取るよりも処理が重くなってしまいますが、
使い分けてみたところソースプログラムも短くなるし、
文字化けなどのトラブルも少ないので使ったほうが良いと思います。

上部の
text , 送信テストをしてみます。

HASHというハッシュ変数の
キー’text’

”送信テストをしてみます。”
という文字列が入っているという意味になります。

$HASH{'text'}

この変数をコマンドラインで作ったソースで処理をするようにするだけです。

コマンドラインで作ったPerlツールをCGI化する[UIだけCGI化]

UIができたので、手っ取り早くCGIにしてしまいます。
もっとスマートなやり方はあるのでしょうが、
機能が実装できればいいと考えていますので、深く考えません。

オススメツール”htos”

htosというフリーのツールがあります。
htmlコードをかけば、perlやphpのソースに変換してくれるのです。
かなり便利で、なぜこういうツールの派生版が出てこないのか不思議です。
なので、はじめのうちはこれを使ってhtmlをcgiにするのがおすすめです。
ああ、こういうことか、ってすっとわかります。

こんなふうに貼り付けて、変換、を押します。

 

#!/usr/bin/perl

print "Content-type: text/html\n\n";

print "<html lang=\"ja\">\n";
print "<head>\n";
print " <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n";
print " <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0\">\n";
print " <meta http-equiv=\"Pragma\" content=\"no-cache\" />\n";
print " <meta http-equiv=\"cache-control\" content=\"no-cache\" />\n";
print " <meta http-equiv=\"expires\" content=\"0\" />\n";
print " <link rel=\"apple-touch-icon-precomposed\" href=\"\" />\n";
print " <title>Water</title>\n";
print "</head>\n";
print "<body>\n";
print " <form action=\"index.cgi\" method=\"post\">\n";
print " <input type=\"submit\" value=\"OK\">\n";
print " <a href=\"./index.cgi\">リロード</a><br>\n";
print " <textarea name=\"\" rows=\"10\" cols=\"60\"></textarea>\n";
print " </form>\n";
print "</body>\n";
print "</html>\n";

これでOKです。

これを、CGIの使えるサーバーにアップして、
実行権をつければ、CGIのになります。

はじめのうちは、ここにコマンドラインで作ったツールを組み合わせていけばいいです。

ちょっとprint文の連続はアレなのですが、何も作れないより全然いいです!

肝は

print “Content-type: text/html\n\n”;

だけなんですよね。

次回は文字列を処理させるために修正を加えていきます。

コマンドラインで作ったPerlツールをCGI化する[UIを作る]

コマンドラインでのツールができたのでCGI化してみます。
あくまでも自分で使う用です。あまり難しいアクセス制御など考えません。
と言うか、そんなにアクセスが簡単に稼げるなら、お金も簡単に稼げますね^^;
というわけで、サンデープログラマー的にはあまり不安を感じる必要はないと思っています。

UIを作る

使いやすいツールを使えばいいと思いますが、とりあえずHTMLでUIを作ります。
私はez-htmlというツールを使っています。

こんなふうにざっくり作ります。

<html lang="ja">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
  <meta http-equiv="Pragma" content="no-cache" />
  <meta http-equiv="cache-control" content="no-cache" />
  <meta http-equiv="expires" content="0" />
  <link rel="apple-touch-icon-precomposed" href="" />
  <title>Water</title>
</head>
<body>
  <form action="index.cgi" method="post">
    <input type="submit" value="OK">
    <a href="./index.cgi">リロード</a><br>
    <textarea name="" rows="10" cols="60"></textarea>
  </form>
</body>
</html>

ちょっと解説します。
viewportと言うのはスマホで見た場合に画面が拡大される仕組みを搭載できます。
PerlでCGIを作る場合キャッシュがいたずらすることが多いのでno-cacheとしています。
http-equiv=”expires” content=”0″もキャッシュを無効にする設定です。
apple-touch-icon-precomposedと言うのはiphoneでホームにアイコンを追加した際に使われるアイコンを設定することができます。
アプリみたいにすることができるので、設定しておくと良いです。

これらの設定はフォーマットとして作っておくとCGIを作るときに簡単にできます。いつも同じですからね。

 

↓ じっさいの画面はこんな感じにシンプルです。

 


リロード