OSX上のHaskell stackでMecabを扱う方法
本文章は以下に書いてあることを抽出して纏めた記事である.
問題点
自分のOSX環境では、なぜかHaskellからMecabを利用することができなかった
解決できたサンプルリポジトリ
git clone https://github.com/shouhei/mecab-sample-hs.git cd mecab-sample-hs stack build stack exec mecab-sample-hs-exe
以上を叩くと
隣 名詞,一般,*,*,*,*,隣,トナリ,トナリ の 助詞,連体化,*,*,*,*,の,ノ,ノ 客 名詞,一般,*,*,*,*,客,キャク,キャク は 助詞,係助詞,*,*,*,*,は,ハ,ワ よく 副詞,一般,*,*,*,*,よく,ヨク,ヨク 柿 名詞,一般,*,*,*,*,柿,カキ,カキ 食う 動詞,自立,*,*,五段・ワ行促音便,基本形,食う,クウ,クウ 客 名詞,一般,*,*,*,*,客,キャク,キャク だ 助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダ EOS
上記の様な出力になるはず
解決方法
stack.ymlを以下を追記する
packages: - '.' - location: git: git@github.com:morishin/hsmecab.git commit: 2da6677fbd42bb77d3b6e61c02edfeebe248e184
extra-include-dirs: - /usr/local/Cellar/mecab/0.996/include/
extra-lib-dirs: - /usr/local/Cellar/mecab/0.996/lib/
次にproject.cabalに以下を追記
library hs-source-dirs: src exposed-modules: Lib build-depends: base >= 4.7 && < 5 , mecab default-language: Haskell2010
でもって、 stack build
すると問題なく使えるようになるはず
問題を時系列に追う
Could not parse '/path/to/mecab-sample/stack.yaml': AesonException "failed to parse field 'packages': failed to parse field 'location': when expecting a PackageLocation, encountered Null instead" See https://github.com/commercialhaskell/stack/wiki/stack.yaml.
tanakhさんの作ったmecabバインディングではダメらしい
- githubのforkを利用する
Enter passphrase for key '/Users/shouhei/.ssh/id_rsa': Warning: File listed in mecab-sample.cabal file does not exist: README.md mecab-0.4.0: configure mecab-0.4.0: build mecab-0.4.0: install mecab-sample-0.1.0.0: configure mecab-sample-0.1.0.0: build Completed all -- While building package mecab-sample-0.1.0.0 using: /path/to/.stack/programs/x86_64-osx/ghc-7.10.2/bin/runhaskell -package=Cabal-1.22.4.0 -clear-package-db -global-package-db -package-db=/path/to/.stack/snapshots/x86_64-osx/lts-3.13/7.10.2/pkgdb/ /var/folders/lk/jk8fbl3s4 qgc7fzz7r3wxn300000gn/T/stack28485/Setup.hs --builddir=.stack-work/dist/x86_64-osx/Cabal-1.22.4.0/ build exe:mecab-sample-exe --ghc-options -hpcdir .stack-work/dist/x86_64-osx/Cabal-1.22.4.0/hpc/.hpc/ -ddump-hi -ddump-to-file Process exited with code: ExitFailure 1 Logs have been written to: /path/to/mecab-sample/.stack-work/logs/mecab-sample-0.1.0.0.log Configuring mecab-sample-0.1.0.0... Preprocessing library mecab-sample-0.1.0.0... [1 of 1] Compiling Lib ( src/Lib.hs, .stack-work/dist/x86_64-osx/Cabal-1.22.4.0/build/Lib.o ) In-place registering mecab-sample-0.1.0.0... Preprocessing executable 'mecab-sample-exe' for mecab-sample-0.1.0.0... [1 of 1] Compiling Main ( app/Main.hs, .stack-work/dist/x86_64-osx/Cabal-1.22.4.0/build/mecab-sample-exe/mecab-sample-exe-tmp/Main.o ) Linking .stack-work/dist/x86_64-osx/Cabal-1.22.4.0/build/mecab-sample-exe/mecab-sample-exe ... Undefined symbols for architecture x86_64: "_mecab_get_all_morphs", referenced from: _cdn2_info in libHSmecab-0.4.0-0HRiBJmaGDO9FQQzxhViZD.a(MeCab.o) "_mecab_get_partial", referenced from: _cdly_info in libHSmecab-0.4.0-0HRiBJmaGDO9FQQzxhViZD.a(MeCab.o) "_mecab_get_theta", referenced from: _cdpg_info in libHSmecab-0.4.0-0HRiBJmaGDO9FQQzxhViZD.a(MeCab.o) "_mecab_set_all_morphs", referenced from: _cdSu_info in libHSmecab-0.4.0-0HRiBJmaGDO9FQQzxhViZD.a(MeCab.o) "_mecab_set_partial", referenced from: _cdWY_info in libHSmecab-0.4.0-0HRiBJmaGDO9FQQzxhViZD.a(MeCab.o) "_mecab_set_theta", referenced from: _cdVy_info in libHSmecab-0.4.0-0HRiBJmaGDO9FQQzxhViZD.a(MeCab.o) ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation) 2 action
ググったら
cabal install
のときにパラメータを指定する必要があるとのことcabalのパラメータをstackで実現するには?
- ドキュメントをみて解決
((Pythonで) 書く(Lisp) インタプリンタ) というやつをpython3でとりあえず動かす
タイトルの通り. やってみたら以外とあっさりPython3対応できた
元ネタは以下の記事
Python3対応自体も既出のネタかもしれないが、書いてしまったので公開する
環境準備
適当にPyhton3のインタプリンタを持ってくる.
自分はDockerを使って、python3.6.0
の環境を入手した
下準備
lis.py
がpython2のインタプリンタでは走るようになっていると思う.
まず、おもむろに
以下を先頭に
#! /usr/bin/env python
以下を最後尾に
if __name__ == "__main__": repl()
そして、lis.py に実行権限をつける
# chmod +x lis.py
手順
基本的にはpython2からpython3で変更されているものを対応をしたら良い
./lis.py
で、最初にエラーが出るのは、
if val is not None: print to_string(val)
python3では、printがステートメントから関数に変わっているエラーなので、 print()
に直す
それを直すと,
AttributeError: module ‘operator’ has no attribute ‘div’
がでてくる。 div
が truediv
と floatdiv
にわかれたらしい。 どちらが正しいとか本来はあると思うが、 ひとまず truediv
を選ぶ
最後が
NameError: name ‘raw_input’ is not defined
というエラーで、標準入力を待ち受ける関数名が input
に変わったとのことなので、そちらに変更する。
以上の3つのエラー対応でとりあえず再び動き始める
本来は必要な残りの作業
テストコードがあれば良いのだが、今回の元ネタにはテストコードがないので、暇があれば実装してPython3対応が正しく完了しているかを確かめたい。
DigitalOceanをざっと眺めて気になった点
クラウド事業を展開しているところに従事している都合上、他社サービスがどんな風になっているかきになるお年頃なのです。
先日、DigitalOceanを触り始めたのでそのメモ
コンパネ
- 白を基調に水色で綺麗
- 何が動作するのかは分かりやすい
- ただしわかりづらいところは、本当によく分からない(後述する)
- 料金が明示的ではないので、お金のかかり方がよく分からない
インスタンス
メモ
- 基本10個まで
- 上限解放できそう
- OS
- リージョン
- いろいろあるが日本リージョンは無い
- 地理的な話だと一番近いのがシンガポール?
- オプション
価格 | cpu(vCPU) | メモリ(GB) | ディスク(GB) | ネットワーク流量(TB) |
---|---|---|---|---|
5 | 1 | 512MB | 20 | 1000GB |
10 | 1 | 1 | 30 | 2 |
20 | 2 | 2 | 40 | 3 |
40 | 2 | 4 | 60 | 4 |
80 | 4 | 8 | 80 | 5 |
160 | 8 | 16 | 160 | 6 |
320 | 12 | 32 | 320 | 7 |
480 | 16 | 48 | 480 | 8 |
640 | 20 | 64 | 640 | 9 |
雑感
インスタンスの設定とローカルディスクのサイズが関連してしまっているので, 中サイズのインスタンスを後に, 小さいインスタンスにすることができなさそう.
なので「インスタンスのサイズを下げてコストを抑える」とかのクラウド的な基本テクが使いづらい.
日本リージョンが無いのは割と残念.
$10でまともなVMが借りることができるのは本当にすごい.
ネットワーキング
雑感
- LBが安いと思う
触っていないもの
- volume
- API
- Image
最後に
あなたがdocker-ceをcentos7にansibleでインストールしたい時に読むべき記事
タイトルの通り。
あと2017/03/03に書かれている記事なので注意
dockerがリリースサイクルを変えて、多分リポジトリの情報の配布方法も変更した模様。
具体的に言うと、 yum-config-manager
ってやつを使うようになった。
ansibleでyum-config-managerコマンドを扱ってくれるモジュールは現状なさそう。
yum_repositoryモジュールはrpmで配布するやつを扱うので今回のケースではうまくいかない?っぽいのでワークアラウンドを書く。
ワークアラウンドだと思うし、本当にyum-config-managerを扱うモジュールがいないのか?は疑問なところだが、それは後日もう少し調べる。
以下はplaybook
- name: install yum-utils yum: name=yum-utils state=present - name: add docker repo shell: "yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo" args: chdir: "/etc/yum.repos.d" creates: docker-ce.repo - name: install docker-ce yum: name=docker-ce state=present - name: restart docker systemd: name: docker.service state: restarted daemon_reload: yes enabled: yes
shell moduleでなんとかする方向でやってあげると良さそう?
ちなみに、この記事を書いてる時点でインストールされるdockerのバージョンは以下
# docker --version Docker version 17.03.0-ce, build 3a232c8
Emacsでドキュメントを読む
2017年、何としてもemacsを捨てたい気持ちと、emacsの使い方を学んでしまいより快適な環境が手に入ることによる喜びで葛藤が生まれています。
そんなことはさて置き、emacsで諸々のドキュメントを読む方法を軽く纏めます。
man
標準パッケージの woman
を使えば良い
M-x woman
の後に適当に知りたいコマンドを叩く
python
helmを使う前提になってしまうが、以下を参考に、helm-pydoc.elを使う
golang
go-modeから引ける
M-x godoc
の後に、適当にパッケージ名を入れる
ansible
以下を使う
yaml-modeと連携するので、yaml-modeを先にインストールしておくのがベター
以下は軽く調べて無かったもの
- Dockerfileのためのドキュメントを見る.el
- docker-compose.ymlのためのドキュメントを見る.el
2015年以降に増えたgTLDにご注意を
仕事でネームサーバーを扱うことになるかもしれなくて、DNSとはどのような働きをするかを調べてるうちに、
ふと思い立って、 .cloud
ドメインがあるかないかを調べてみた。
結果としてはあったのだが、それはさて置き、それ以外も調べた結果、現在所属している会社的に取られたらまずそうなドメインを2こほど抑える結果となった。
調べた過程で分かったこととして、 fujitsu.cloud
や ntt.cloud
あたりは全然関係のない外国の方が抑えている
なにやら2015年あたりに増えたgTLDあたりが割とノーマークになっている様子
現在のTLDのリストは以下で観れる
厄介なのは、 .コム (xn--tckwe)
などの文字列に対してaliasが貼ってあるドメイン。政府などがあるが、読みを見るに中国のドメインっぽい。「グーグル」なんてドメインもあるらしい。
真面目に調べたら、これ抑えられていなくて良いのか?というやつが山ほどある気がするので、転売目的の方などに取られて不要なお金を支払う羽目になる前に各自ご注意を.
メンテナンス用データを生成するツールについて僕の思う事
結論
bin/rake db:migrate
が 機械的に 実行されるような環境が最強だって事に気がついた.
不要な中間形式もなく、誤ったデータを使う可能性もかなり減らせる.
良いと思う所
手動で bin/rake db:migrte
すると考慮すべきパターンが増えるため, 機械的に が超重要. 考慮すべき間違いが減る. おそらくは, 間違ったデータを挿入しないか否かだけを考慮すべき状態になる.
また上記のコマンドは暗黙的に、gitできちんとワークフローを回していれば、productionやstagingに取り入れられて問題ないとされるデータしか入ってこないはずなのも良い点である.
但し書き
bin/rake db:migrate
でokなのは、ActiveRecordを使ったプログラミングがみんな出来る前提なので、そこら辺だけ要考慮