SSブログ

Azure CosmosDB で自家製の MongoDB データーベースドライバーを使ってみる [Python]

以前、MongoDB の簡単なデーターベースドライバーを Python で書いたが、長いこと放置してた。
先日、Azure CosmosDB に、無料でずっと使える枠があって、しかも MongoDBのドライバーが使えるということを聞いて、使えるか試してみることにした。

以下やったこと

https://docs.microsoft.com/ja-jp/azure/cosmos-db/create-mongodb-dotnet ここにあるように
Azure Cosmos DB のアカウントを作る

- アカウント名 → グローバルにユニークな名前
- API → 「MongoDB 用Azure Cosmos DB API」
- バージョン → 3.6

アカウント名が、(AWS S3 のバケット名みたいに)グローバルにユニークになるする必要があって(仕方ないんだけど)ちょっと難しかった。
アカウントを作成すると、自動でパスワードが作られる

作成したアカウント→クイックスタート→Othersにあるホスト、ポート、ユーザー名、プライマリーパスワードを使って接続しようとしたらエラーになった。
些末な問題だったので、ドライバーを直してリリースした https://pypi.org/project/nmongo/0.4.2

動かしてみると、 MapReduce や、db.collection.group() が使えないみたいだけど、基本的な動作はしていて、データエクスプローラーから値も見れる。エンジンは別物だと思うのに、変な感じ。

MongoDB の最新は 4.4 だが、 nmongo を書いた時に確認したのは 3.6 までで、 4.0 以降試してない。動くとは思うんだけど、試せてない。
本当は、新しい機能を使えるようにしたい。どんな新しい機能があるのかは知らんけど。

ここらへん↓を見るんだろうけど、実務で使う機会がないので、 MongoDB をインストールするのがおっくうだ。
https://docs.mongodb.com/manual/tutorial/install-mongodb-on-ubuntu/

コメント(0) 
共通テーマ:日記・雑感

AWS 上で Open Data として公開された UniDic を使う [awabi]

https://aws.amazon.com/jp/blogs/news/published-unidic-mecab-on-aws-open-data/

これを使って、MeCab と awabi で形態素解析してみる。

ダウンロードするのに aws コマンド(awc_cli)が必要で、色々インストールの方法はあるけど、
例えば、Ubuntu2004 だったら apt で入れられる
$ sudo apt install awscli
$ aws --version
aws-cli/1.18.69 Python/3.8.5 Linux/5.4.0-48-generic botocore/1.16.19

$ aws s3  --no-sign-request cp s3://cotonoha-dic/unidic.zip ./
$ unzip unidic.zip

/etc/mecabrc の dicdir の行を以下のように修正(上で展開したdirectory を指定)
dicdir = /home/nakagami/unidic


$ echo 'すもももももももものうち' |mecab
すもも  名詞,普通名詞,一般,,,,スモモ,李,すもも,スモモ,すもも,スモモ,和,,,,,,,体,スモモ,スモモ,スモモ,スモモ,0,C2,,15660352771596800,56972
も  助詞,係助詞,,,,,モ,も,も,モ,も,モ,和,,,,,,,係助,モ,モ,モ,モ,,動詞%F2@-1,形容詞%F4@-2,名詞%F1,,10324972564259328,37562
もも    名詞,普通名詞,一般,,,,モモ,桃,もも,モモ,もも,モモ,和,,,,,,,体,モモ,モモ,モモ,モモ,0,C3,,10425303000293888,37927
も  助詞,係助詞,,,,,モ,も,も,モ,も,モ,和,,,,,,,係助,モ,モ,モ,モ,,動詞%F2@-1,形容詞%F4@-2,名詞%F1,,10324972564259328,37562
もも    名詞,普通名詞,一般,,,,モモ,桃,もも,モモ,もも,モモ,和,,,,,,,体,モモ,モモ,モモ,モモ,0,C3,,10425303000293888,37927
の  助詞,格助詞,,,,,ノ,の,の,ノ,の,ノ,和,,,,,,,格助,ノ,ノ,ノ,ノ,,名詞%F1,,7968444268028416,28989
うち    名詞,普通名詞,副詞可能,,,,ウチ,内,うち,ウチ,うち,ウチ,和,,,,,,,体,ウチ,ウチ,ウチ,ウチ,0,C3,,881267193291264,3206
EOS


$ echo 'すもももももももものうち' |awabi
すもも  名詞,普通名詞,一般,*,*,*,スモモ,李,すもも,スモモ,すもも,スモモ,和,*,*,*,*,*,*,体,スモモ,スモモ,スモモ,スモモ,0,C2,*,15660352771596800,56972
も  助詞,係助詞,*,*,*,*,モ,も,も,モ,も,モ,和,*,*,*,*,*,*,係助,モ,モ,モ,モ,*,"動詞%F2@-1,形容詞%F4@-2,名詞%F1",*,10324972564259328,37562
もも    名詞,普通名詞,一般,*,*,*,モモ,桃,もも,モモ,もも,モモ,和,*,*,*,*,*,*,体,モモ,モモ,モモ,モモ,0,C3,*,10425303000293888,37927
も  助詞,係助詞,*,*,*,*,モ,も,も,モ,も,モ,和,*,*,*,*,*,*,係助,モ,モ,モ,モ,*,"動詞%F2@-1,形容詞%F4@-2,名詞%F1",*,10324972564259328,37562
もも    名詞,普通名詞,一般,*,*,*,モモ,桃,もも,モモ,もも,モモ,和,*,*,*,*,*,*,体,モモ,モモ,モモ,モモ,0,C3,*,10425303000293888,37927
の  助詞,格助詞,*,*,*,*,ノ,の,の,ノ,の,ノ,和,*,*,*,*,*,*,格助,ノ,ノ,ノ,ノ,*,名詞%F1,*,7968444268028416,28989
うち    名詞,普通名詞,副詞可能,*,*,*,ウチ,内,うち,ウチ,うち,ウチ,和,*,*,*,*,*,*,体,ウチ,ウチ,ウチ,ウチ,0,C3,*,881267193291264,3206
EOS


表示形式が違うのは、 mecab は dicrc の node-format-unidic22 の値を見てフォーマットしているのに対して、(こういう時 MeCab って色々機能あるなぁ、と気づかされる) awabi は、辞書の feature にあるものをそのまま出しているからと思われる。

この、表示形式の違いは、今のままでいいかなと思っている。
コメント(0) 
共通テーマ:日記・雑感

Elixir から、形態素解析器 awabi を呼ぶ [awabi]

PyO3 で Rust のコードを Python から簡単に呼び出せたけど

https://nakagami.blog.ss-blog.jp/2020-03-21
https://nakagami.blog.ss-blog.jp/2020-07-08-1
https://nakagami.blog.ss-blog.jp/2020-07-11

・・・そう言えば、同じように Rust のコードを簡単に Elixir の NIF にして
呼べるようなのがあったんじゃなかったっけ?と思って、探した.

Rustler っていうのがそれらしい
https://github.com/rusterlium/rustler

これを参考にして・・・
Writing Rust NIFs for Elixir With Rustler
https://simplabs.com/blog/2020/06/25/writing-rust-nifs-for-elixir-with-rustler/

- mix new exawabi
- {:rustler, "~> 0.22-rc"} を mix.exs の deps に加える
- mix deps.get
- mix rustler.new

・・・を実行して, mix rustler.new の中で聞かれる問いに

Module name に「ExAwabi」
Library name に「awabi_nif」

を指定して、できたファイルに、色々修正してできたのがこれ
- https://github.com/nakagami/exawabi
- https://hex.pm/packages/exawabi

・・・と、簡単には書いているが、途中、色々試行錯誤してしまった。
上の記事では、 mix.exs の修正についての説明がないが、 Rustler 向けの記述をいくつか追加した。
https://github.com/nakagami/exawabi/blob/master/mix.exs
の compilers とか、 rustler_crates のあたり。

Elixir の該当コードを見ると https://github.com/nakagami/exawabi/blob/master/lib/exawabi.ex
エラー関数を呼んでいるよには見えるけど、 Rust の関数を呼んでいるように見えなくて、
なんか、よくわかんないけど、マクロすごい・・・と思っているところ。

Elixir だと、関数として実装しないといけないので(クラスとかメソッドの形で Elixir にExportできないので)制限はあるけど、簡単に NIF が作れるというのは本当だなと思った。
C で NIF 作る気はしないけど、Rust でならできそう。
コメント(0) 
共通テーマ:日記・雑感