くりーむわーかー

プログラムとか。作ってて ・試しててハマった事など。誰かのお役に立てば幸いかと。 その他、いろいろエトセトラ。。。

2019年02月

Python3.6+CentOSでMeCabを使う

CentOS上でPythonからMeCabを使いたくなった。Pythonは3.6

で、一筋縄ではいかなかったので記録。

mecab本体のインストール

まず、git と Cのコンパイラ入ってない場合は入れる。

yum -y install git gcc-c++

そしたら、githubからソースを取得。作業用のディレクトリを決めてから。

cd sandbox
git clone https://github.com/taku910/mecab.git

ビルドする。

#本体のビルド
cd mecab/mecab
./configure  --enable-utf8-only
make
make check
sudo make install

#辞書のビルド
cd ../mecab-ipadic
./configure --with-charset=utf8
make
sudo make install

↑の内容はcloneした下記のhtmlファイルに記載されてるインストール手順。

firefox ~/sandbox/mecab/index.html &

そしたら動作確認。mecabでインタラクティブな実行になるので解析したい文字列を適当に入れてみる。

mecab
すもももももももものうち

ただ、この状態だと、「libmecab.so.2」っていうのがリンクしてもらえてなくて、リンクしてもらえるように下記の設定を行う。

#ファイル名は適当だけど拡張子だけは.conf
sudo vi /etc/ld.so.conf.d/mecab.conf
###############↓の一行だけ
/usr/local/lib
###############

sudo ldconfig

本体のインストールは以上。

Pythonから呼べるようにする

※ここから先は仮想環境に切り替えてからやる。

source ~/pyenv/bin/activate

swigのインストール

sudo yum install -y swig

Python用のビルドなんだけど、そのままやると動かないので、setup.pyの一部を書き換える。

cd ~/sandbox/mecab/mecab/python
vi setup.py
######################
#return string.split (cmd1(str))ってなっているところを
#return cmd1(str).split()にする。
######################

python setup.py build
python setup.py install

pip install mecab-python3

mecab-python3のPyPiのページ的にはUbuntuだとapt-getだけでイケルっぽいけど、CentOS用のは用意されてないんですかね。。。

しゃーなし。

ここまででPythonからimportして動くはず。

python
import MeCab
m = MeCab.Tagger ("-Ochasen")
print(m.parse("すもももももももものうち"))

長かった。。。

もうちょっと楽に行けるかと思ってたんだけども。。。

出来るまでに見たエラーは↓

pip install mecab-python3 で。

「unable to execute 'swig': No such file or directory」

import MeCab で。

「ImportError: libmecab.so.2: cannot open shared object file: No such file or directory」

axiosで取得した画像データを保存とか表示とかする

VueでUIを作ってて、axios使用でajaxで画像ファイルを取得した後に、

そのデータを表示したり、ローカルに保存したりしたい。

その場合のやり方。

//リクエストヘッダでコレつけた方がいいっぽ
const config = {
  responseType: 'arraybuffer'
}

//サーバに送信
this.$axios
.post('http://hogehoeg/sample.png', { data: 'somedata'}, config)
.then(response => {
  //base64でエンコードしたい場合
  let bstr = new Buffer(response.data, 'binary').toString('base64')
  
  //blobオブジェクトにしたい場合
  let blob = new Blob([response.data], { type: 'image/png' })

  //imgタグをidでとって、srcにblobのObjectURLを突っ込んで画像表示する
  let img = document.getElementById('img_tag_id')
  let url = window.URL || window.webkitURL
  img.src = url.createObjectURL(blob)
  
  //保存させたい場合(ダウンロードっぽくさせたい場合)
  let link = document.createElement('a')
  link.href = window.URL.createObjectURL(blob)
  link.download = 'download-filename.png'
  link.click()

  //Vueで別のコンポーネントにデータ渡したい場合はこんな感じ?
  this.imgdata = response.data
})

base64でやる場合は、画像サイズは32kb未満くらいで考えた方が良いのかしら。まーあんま大きい画像はやめた方がよさそうですね。

ajaxで取ってきた画像ファイルとかをダウンロードっぽく保存させたい場合は前述の感じでやるっぽ。リンク作って、ローカルのオブジェクトのURLを突っ込んで中で、Clickを発火させてる感じ?

ちょっとイレギュラーなやらせ方のような気もするんだけど、StackOverFlowとかいろいろ見てるとこのやり方しかないっぽいですかね?

で、いい感じにまとめてくれるのが↓のGitHubのリポジトリ

https://github.com/kennethjiang/js-file-download/blob/master/file-download.js

IE11だと上述のやり方じゃ上手くいかないらしく、それにも↑のリポジトリは対応してる。

これ使った方がいいと思う。車輪の再発明は控えたい。

あと、vueでaxios使う場合、下の感じで書くと、中でthisが使えない。

this.$axios
.post('http://hogehoeg/sample.png', { data: 'somedata'}, config)
.then(function(response){
  this.dataval = ''//これ無理
})

で、これをやるには呼ぶ前に「let self = this」みたいにしておくのが昔見たやり方なんだけど、

最近の書き方的にはアロー関数でやるとthisもいける。

this.$axios
.post('http://hogehoeg/sample.png', { data: 'somedata'}, config)
.then(response => {
  this.dataval = ''//これいける
})
問合せ