読者です 読者をやめる 読者になる 読者になる

/var/log/study

つまり雑記

OSX上のHaskell stackでMecabを扱う方法

本文章は以下に書いてあることを抽出して纏めた記事である.

qiita.com

haru2036.hatenablog.com

github.com

問題点

自分のOSX環境では、なぜかHaskellからMecabを利用することができなかった

解決できたサンプルリポジトリ

github.com

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 すると問題なく使えるようになるはず

問題を時系列に追う

  1. stack でmecabがインストールできない
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バインディングではダメらしい

qiita.com

  1. githubのforkを利用する

インストールは出来るんだけど、OSX的にダメらしい

haru2036.hatenablog.com

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
  1. ググったらcabal install のときにパラメータを指定する必要があるとのこと 

  2. cabalのパラメータをstackで実現するには?

github.com

  1. ドキュメントをみて解決

((Pythonで) 書く(Lisp) インタプリンタ) というやつをpython3でとりあえず動かす

タイトルの通り. やってみたら以外とあっさりPython3対応できた

元ネタは以下の記事

((Pythonで) 書く (Lisp) インタプリタ)

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’

がでてくる。 divtruedivfloatdiv にわかれたらしい。 どちらが正しいとか本来はあると思うが、 ひとまず truediv を選ぶ

最後が

NameError: name ‘raw_input’ is not defined

というエラーで、標準入力を待ち受ける関数名が input に変わったとのことなので、そちらに変更する。

以上の3つのエラー対応でとりあえず再び動き始める

本来は必要な残りの作業

テストコードがあれば良いのだが、今回の元ネタにはテストコードがないので、暇があれば実装してPython3対応が正しく完了しているかを確かめたい。

DigitalOceanをざっと眺めて気になった点

クラウド事業を展開しているところに従事している都合上、他社サービスがどんな風になっているかきになるお年頃なのです。

先日、DigitalOceanを触り始めたのでそのメモ

コンパネ

  • 白を基調に水色で綺麗
  • 何が動作するのかは分かりやすい
    • ただしわかりづらいところは、本当によく分からない(後述する)
  • 料金が明示的ではないので、お金のかかり方がよく分からない

インスタンス

メモ

  • 基本10個まで
    • 上限解放できそう
  • OS
  • リージョン
    • いろいろあるが日本リージョンは無い
    • 地理的な話だと一番近いのがシンガポール
  • オプション
    • プライベートネットワーキング
      • これが本当によく分からない
      • 同じリージョン, ゾーンに属すインスタンスをつなげると書いてあったがよく分からない
      • 割り振られたプライベートIPが/16なので、リージョン間でどのVMとも共有されるIPをつけることが可能な機能?
      • コンパネをざっと眺めているだけだと、プライベートネットワークを止める方法が分からない
    • バックアップ
    • IPv6
    • User data ?
    • 監視
価格 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が借りることができるのは本当にすごい.

ネットワーキング

  • ドメイン
  • PTR
  • LB
    • 月20ドルから
    • 性能は未調査
  • フローティングIP

    • AWSで言うところのElastic IP
    • VMについてるIPをフローティングIPに昇格させる
  • ファイアーウォールが無い

    • iptablesとかFirewalldとかやらなきゃいけなくてダルい

雑感

  • LBが安いと思う

触っていないもの

  • volume
  • API
  • Image

最後に

DigitalOcean: Cloud computing designed for developers

あなたが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を使う

syohex.hatenablog.com

golang

github.com

go-modeから引ける

M-x godoc の後に、適当にパッケージ名を入れる

ansible

以下を使う

yaml-modeと連携するので、yaml-modeを先にインストールしておくのがベター

github.com


以下は軽く調べて無かったもの

  • Dockerfileのためのドキュメントを見る.el
  • docker-compose.ymlのためのドキュメントを見る.el

2015年以降に増えたgTLDにご注意を

仕事でネームサーバーを扱うことになるかもしれなくて、DNSとはどのような働きをするかを調べてるうちに、 ふと思い立って、 .cloud ドメインがあるかないかを調べてみた。

結果としてはあったのだが、それはさて置き、それ以外も調べた結果、現在所属している会社的に取られたらまずそうなドメインを2こほど抑える結果となった。

調べた過程で分かったこととして、 fujitsu.cloudntt.cloud あたりは全然関係のない外国の方が抑えている

なにやら2015年あたりに増えたgTLDあたりが割とノーマークになっている様子

現在のTLDのリストは以下で観れる

厄介なのは、 .コム (xn--tckwe) などの文字列に対してaliasが貼ってあるドメイン。政府などがあるが、読みを見るに中国のドメインっぽい。「グーグル」なんてドメインもあるらしい。

真面目に調べたら、これ抑えられていなくて良いのか?というやつが山ほどある気がするので、転売目的の方などに取られて不要なお金を支払う羽目になる前に各自ご注意を.

メンテナンス用データを生成するツールについて僕の思う事

結論

bin/rake db:migrate

機械的に 実行されるような環境が最強だって事に気がついた.

不要な中間形式もなく、誤ったデータを使う可能性もかなり減らせる.

良いと思う所

手動で bin/rake db:migrte すると考慮すべきパターンが増えるため, 機械的に が超重要. 考慮すべき間違いが減る. おそらくは, 間違ったデータを挿入しないか否かだけを考慮すべき状態になる.

また上記のコマンドは暗黙的に、gitできちんとワークフローを回していれば、productionやstagingに取り入れられて問題ないとされるデータしか入ってこないはずなのも良い点である.

但し書き

bin/rake db:migrate

でokなのは、ActiveRecordを使ったプログラミングがみんな出来る前提なので、そこら辺だけ要考慮