SSブログ

Firebird の Rust ドライバー [Firebird]

これは、Firebird Advent Calendar 2021 https://qiita.com/advent-calendar/2021/firebird の 23日目の記事です

Firebird の Rust ドライバーといえば、 rsfbclient があります

- https://crates.io/crates/rsfbclient
- https://github.com/fernandobatels/rsfbclient

・・・が、私も、習作として Rust のドライバーを書きました

- https://crates.io/crates/firebirust
- https://github.com/nakagami/firebirust

昨年のうちにワイヤープロトコルの部分はできていたのですが、
rsfbclient がリリースされて、挫折しそうになっていました。

自分の Rust の習作としても、ワイヤープロトコルのサンプル実装としても、完成させた方がよかろうということで、
その後、開発を再開させ、なんとか今年になって完成させることができました。
一言で感想をいえば「Rust 難しい」です。
まだ、自分の中で消化しきれてない状態で Rust を書いて、ここ数ヶ月は書いてないので、もう Rust 忘れそうです。

Python の PEP-249 や、go の database/sql や、Julia の DBInterface.jl のような決まったインターフェースは
ないっぽいので、これでいいのかどうか確信が持ててません。
「〇〇のデーターベースドライバーでは、こういうことができるので firebirust でもできるようにしたほうがいいのではないか」
というリクエストがあったら Issue に書いて欲しいと思いっています。
コメント(0) 
共通テーマ:日記・雑感

Azure SQL Database と Python ドライバー [Python]

これは、
Data Platform for Microsoft Azure Advent Calendar 2021 https://qiita.com/advent-calendar/2021/azure-data-platform の 18日目です

Azure SQL Database は、SQL Server なので、SQL Server のデーターベースドライバーをインストールします。

SQL Server で公式に Python のドライバーとして pyodbc と pymssql が紹介されています。
https://docs.microsoft.com/en-us/sql/connect/python/python-driver-for-sql-server?view=sql-server-ver15
pyodbc は、Windows 以外だと、ODBC ドライバーのインストールが必要です。
Windows 以外で使う場合で、 ODBC ドライバーのインストール関連で、うまく動かないなーと言う場合は、Free TDS を使っている pymssql なら、普通は pip install pymssql だけでうまくいくと思います。

それ以外に、 pure python で書かれた pytds と minitds (拙作) があります。

pytds は pip install python-pytds でインストールします。
TDS で接続する場合(Azure SQL と接続する場合)は pip install pyOpenSSL で pyOpenSSL をインストールする必要があります。 pyOpenSSL の部分は pure python ではないです。

minitds は、周辺ライブラリも含めて pure python ですが、テストが十分でないかもしれません。
何か不具合があったら Issue に登録してください。

最近は、パッケージが wheel になっている場合が多いので、真に pure python が必要な場合はあまりないと思いますが、以前 Pythonista http://omz-software.com/pythonista/ で minitds を使っているという方からメールで質問をいただきました。確かに Pythonista のような環境では pure python である必要があると思います。
(他に、こんな状況ってあるかな?M1 Mac とか?)
コメント(0) 
共通テーマ:日記・雑感

Firebird の Julia データーベースドライバー [Firebird]


これは、
Firebird Advent Calendar 2021 https://qiita.com/advent-calendar/2021/firebird

Julia Advent Calendar 2021 https://qiita.com/advent-calendar/2021/julia
の16日目の記事です

今まで、色々なプログラミング言語で Firebird のドライバーを書いてきました。

調べてみると、ここら辺に Julia の各種ドライバーがあって(Firebird のはなくて)
https://github.com/JuliaDatabases
DBInterface.jl のインターフェースを定義すればよいということがわかってきました。
https://github.com/JuliaDatabases/DBInterface.jl

さらに
https://nakagami.blog.ss-blog.jp/2021-12-03
Julia を書いてみた感じ、今まで書いてきたドライバーのソースコードを参考にすれば Julia でも書けそうということになりました。

・・・というわけで Firebird のドライバー書きました。
https://juliahub.com/ui/Packages/Firebird/pPw8v/0.2.2

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

paramiko を使い git リポジトリに ssh 接続をする [Python]

これは、 Python Advent Calendar 2021 https://qiita.com/advent-calendar/2021/python の14日目の記事です

そもそもの始まりは、この時 https://nakagami.blog.ss-blog.jp/2021-12-04
SageMaker Studio Lab から git リポジトリに ssh 接続できるとうれしいなぁ、と思ったこと。
git コマンドがあって ssh コマンドがない環境ってあんまりないと思うけど、これはそういう状況。

ssh 接続できると
- プライベートリポジトリにアクセスできる
- push できる
という利点がある。

GIT_SSHという環境に ssh 接続するコマンドを指定できることは知っていた。
なんとか、 SageMaker Studio Lab の環境で ssh 接続できないか・・・

試行錯誤の末、こんなスクリプトができあがった
https://gist.github.com/nakagami/bdae2e98bab06461041b169936c6bb70

Linux の場合(おそらく macOS/BSD でも)こんな感じ

1. ssh-keygen -t ed25519 -C "your_email@example.com" でキーペアを作る → .ssh/id_ed25519 と .ssh/id_ed25519.pub が生成される
2. https://github.com/settings/keys の SSH keys に ~/.ssh/id_ed25519.pub を登録
3. pip install paramiko
4. gitssh.py をどこかに置いて実行権限をつける (chmod +x gitssh.py)
5. .bashrc に環境変数 GIT_SSH として、gitssh.py のフルパスを設定(export GIT_SSH=/path/to/gitssh.py)

のような手順のあと、
git clone git@github.com:github/docs.git
で、ssh 接続 でリポジトリを clone できる。

秘密鍵は ${HOME}/.ssh/id_ed25519 を使うようになっているが、他のパスの秘密鍵を指定したい場合は gitssh.py の該当部分を書き換えて使う

・・・さて、そもそものきっかけであった SageMaker Studio Lab では、
上記で作成した公開鍵を .ssh/id_ed25519 に置いて、環境変数を設定してもうまく動かない。
outbound の port 22 が塞がれているようだ。残念。

幸いにも、 GitHub では、 443 ポートを使って ssh 接続できる。
Using SSH over the HTTPS port
https://docs.github.com/en/authentication/troubleshooting-ssh/using-ssh-over-the-https-port

スクリプトの
PORT = 22
となっているところを
PORT = 443
と変更し、
git clone git@github.com:github/docs.git
でなく
git clone git@ssh.github.com:github/docs.git
と、ホストに ssh.github.com を指定すると clone できた。

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

Db2 (と Apache Derby) の pure python ドライバー [Python]

これは、 Python Advent Calendar 2021 https://qiita.com/advent-calendar/2021/python の11日目の記事です

今週 pure python の Db2 データーベースドライバ pydrda の最新バージョン (0.4.5)をリリースしました
https://pypi.org/project/pydrda/

最初に Db2 で動くようにできたのがこの頃
https://nakagami.blog.ss-blog.jp/2019-05-06

実のところ自分が、このドライバーのテストのために動かしている以外に Db2 で動いているのを見たことがなかったので、
(設定やインストールの問題で、自分以外には動かせていないんじゃないかという)
一抹の不安があったんですが・・・
この↓「不正なパスワードだと無限ループする」という不具合の修正の pull request で
https://github.com/nakagami/pydrda/pull/9
自分以外に動かせている人がいるということがわかりました。
・・・というわけで、今週、この pull request をマージしてリリースしました。

ちなみに IBM 製の python ドライバーは、これ↓
- https://pypi.org/project/ibm-db/
- https://github.com/ibmdb/python-ibmdb
API が PEP 249 に従ってなくて、python でデータベースにアクセスするプログラムを書いたことある人には難しく感じるのではないでしょうか。
また、C拡張の部分があるので、インストールにハマることもありそうです。
https://github.com/ibmdb/python-ibmdb/issues
(Mac から使えないという Issue 多いけど、海外では Mac から Db2 に接続するとかあるのか。日本では、その組み合わせはあまりなさそう)

Db2 に python で接続したい人(いれば) pydrda 使ってみてください

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

LibreOffice Base 7.2 の Firebird サポート [Firebird]

これは Firebird Advent Calendar 2021 https://qiita.com/advent-calendar/2021/firebird の9日目の記事です

LibreOffice Base の Firebird サポートについて書いたのは2年前の Firebird Advent Calendar 2019 で、その時は LibreOffice 6.3 でした
https://nakagami.blog.ss-blog.jp/2019-12-14

今回、 最新の LibreOffice 7.2 をインストールして Base のファイルを作成しようとした時に

- Create a new database の Embedded database で Firebird が選べなくなっていた(HSQLDB Embedded だけになっていた)
- Firebird のデーターベースファイルを読み書きしたい場合は、Connect to an existing database でデータベースファイルを選択する
- Connnect to an existing database で、Firebird File を指定。ホストとパスを指定(リモートのデータベースサーバーを指定)することも可能

というように変わっていました。
スクリーンショット 2021-12-09 8.03.40.png
スクリーンショット 2021-12-09 8.04.10.png








Base のファイルの中に Firebird のデーターベースファイルが埋め込まれているのは、いささか無理矢理感あるなと思っていました。
ですので、個人的には、これでいいと思うのですが、LibreOffice 6.x の時と動作が変わってしまっていて、なかなか思い切った変更がなされるな、と驚いているところです。
ちなみに、Firebird4.0 のファイルを指定したら、 ODS のバージョンが違うと怒られました。

Firebird4.0 が読めるクライアントライブラリをリンクするようにしたら Firebird3.0 のファイルが読めなくなるかな?
Ubuntu の Firebird が、いまだに 3.0 なんだけど、これが LibreOffice との兼ね合いでバージョンが上げられない、という事情だったら、いつ 4.0になるかわからないな。
コメント(0) 
共通テーマ:日記・雑感

TLS1.3 のラッパー書いた [Python]

これは、 Python Advent Calendar 2021 https://qiita.com/advent-calendar/2021/python の7日目の記事です

今年、 Python で、 TLS 1.3 のラッパー書きました
https://github.com/nakagami/tinytls
https://pypi.org/project/tinytls/

簡単に言えば、ssl モジュール https://docs.python.org/ja/3/library/ssl.html みたいなやつ
ssl モジュールと比較すると

- TLS1.3 の TLS_CHACHA20_POLY1305_SHA256 暗号スィートしか使えない
- X25519 による鍵交換しかできない
- サーバー証明書を検証していない
- Python で実装しているので遅い

と、できないことだらけです。
普通は ssl モジュールを使えばいいので、役に立つものではないんですが、SSL/TLS のラッパーを書いてみるのは、昔からの憧れでしたので(なぜなら、実装するのが難しそうだから。そして、確かに難しかったのですが)曲がりなりにも形になって、とても嬉しいです。

Firebird のドライバーで ChaCha20 がどんなものかわかってきて
https://nakagami.blog.ss-blog.jp/2021-12-02
そういえば、 TLS1.3 で ChaCha20 が使われるようになったぞ。
プロトコルが、TLS1.2から比べて簡素化されたらしいし、サーバー証明書の検証を省略すれば TLS1.3 のラッパーが書けるかもしれないぞ
・・・と思ったのですが、楕円暗号による共通鍵交換とか、HMAC による署名とか、
色々組み合わされていて、ChaCha20 はその中の一部でしかなく、自分には予想以上に難しかったです。

このリポジトリー https://github.com/tex2e/mako-tls13 がとても参考になりました
そして、このブログ https://tex2e.github.io/blog/ 中でも https://tex2e.github.io/blog/crypto/chacha20poly1305 この記事が参考になりました。
どちらも @tex2e さん、すごい。

Python は、遅いんですが、sha256 などのハッシュ関数が組み込みライブラリにあって、数値が多倍長整数型に自然に拡張されるので暗号関連の
実証コードを書くには便利だなと思っています。
コメント(0) 
共通テーマ:日記・雑感

SageMaker Studio Lab 使ってみた [Python]

これは、 Python Advent Calendar 2021 https://qiita.com/advent-calendar/2021/python の4日目の記事です

AWS、JupyterLab IDEベースの新サービス「SageMaker Studio Lab」無料提供を発表
https://www.publickey1.jp/blog/21/awsjupyterlab_idesagemaker_studio_labaws_reinvent_2021.html
・・・ということで、
AWSアカウントとの紐付けもなく、クレジットカードの登録もないそうなので、気軽に登録してみた。

https://studiolab.sagemaker.aws/ ←ここの Request free account から登録
すぐに届く「Verify your email」という e-mail のボタンを押すと、「ウェイトリストに追加したよー」という画面に遷移する。
しばらくして「アカウント作る準備ができたよ」 というメールが来たら、リンク踏んでアカウントを作る。
ちなみに、送られてくるメールの Subject が微妙で、迷惑メールに入ってしまう可能性高いので注意。
アカウント作る準備ができたよメールに気づかないところだった。

ここまでやると、 https://studiolab.sagemaker.aws/ ここの Sign in からログインできる

試しに、mecab mecab-ipadic をインストールして pure-pyawabi https://pypi.org/project/pure-pyawabi/ で形態素解析してみた。https://gist.github.com/nakagami/a7023998ffaa50bd2a64626e0777b7ee

自己満足のために頑張ったけど、 janome をインストールするのが簡単。

本当は NEologd をインストールしたかったんだけど↓ ./configure でエラーになって挫折
https://qiita.com/yaiwase/items/8e1063d86b4a5861a743
他のマシンで辞書データを作って、どこかにアップロードして、そのどこかからダウンロードしたらいけるかなって思う。

aws コマンド、 curl は入っている。ssh や scp は入ってない。
git は入っているが ssh が使えないので、public なリポジトリに https でアクセスして clone はできるが push はできない。
記事では「PythonやR言語などに対応しており」と書いてるけど、デフォルトでは R のカーネルは使えるようにはなってないっぽい。conda は入っている。
R は、 https://nxdataka.netlify.app/rjup/ こんな感じで自分でインストールしろってことかな。

vi/vim は入ってない。 pip で pyvim https://pypi.org/project/pyvim/ を入れたら Terminal で使えている。
Terminal のフォントが、ちょっと見づらいなぁと思うけど、フォントを変更する簡単なメニューはなさそう。
Settings → Advanced Settings Editor → Terminal で style を設定できるみたいだけど、思ったように設定する自信がないのでそのまま。

16Gbytes のメモリと 15Gbytes のストレージなので、機械学習の学習用には十分なのでは。
なんか、面白いことできないかなぁ。
環境は /etc/os-release を見ると Ubuntu20.04 ベースのようなので、 apt install できると色々便利そうなんだけど、今のところ root の権限を得る方法がわからず。
・・・と思ったら、 stackoverflow で質問してる人がいて(速い!)やはりできないようだ
https://stackoverflow.com/questions/70202848/is-it-possible-to-apt-install-in-sagemaker-studio-lab/70204408
ssh クライアントだけ、入れてくれないかなぁ

セッション間でストレージが維持されるの素晴らしいんだけど、こうなってくると pip でいろんなものをインストールした後に、
「あー、もう一回最初っからやりたい」
って時に、全部リセットして、もう一回最初っからってどうすればいいのかなと思ったら・・・
https://docs.aws.amazon.com/sagemaker/latest/dg/studio-lab-use-manage.html
ここに書いてあった。
インストールされているパッケージとか、 conda で環境作る話とかも。まずはここを読めば良さそう。
(!pip install じゃなくて %pip install 使えとか書いてあるな・・・)

あと機械学習なんかの example が、ここにある https://github.com/aws/studio-lab-examples

(2021-12-11 追記)
アカウント登録から使い方の説明、これがわかりやすい
https://tech.nri-net.com/entry/sagemaker_studio_lab
コメント(0) 
共通テーマ:日記・雑感

形態素解析器 Awabi.jl と、初めて Julia を書いた感想 [julia]

これは Julia Advent Calendar 2021 https://qiita.com/advent-calendar/2021/julia の3日目の記事です

昨年は、 mecab の辞書を使った形態素解析器 awabi を色々なプログラミング言語で書いてみました。
https://nakagami.blog.ss-blog.jp/2020-12-02

今年は、「プライベートな時間でJulia を書く」を年始の目標を掲げました。
https://nakagami.blog.ss-blog.jp/archive/20210101

・・・ということで、Awabi.jl を書いて https://github.com/nakagami/Awabi.jl
JuliaHub に公開しました https://juliahub.com/ui/Packages/Awabi/BwiBs/0.1.0

Julia は、クラスとかメソッドとかはないものの、引数の型によるディスパッチとコンストラクタはあるので、python で書いたもの https://github.com/nakagami/pure-pyawabi を真似ればできるだろうと思い、実際そうだったんですが、やはり移植に際しては、配列が 1始まりなのが難しかったですね。
わかっていても、(あ、ここもひとつずれてる)ということが何度もありました。

Python の 数値計算、統計処理のライブラリに追いつき追い越したいと考えている他言語のライブラリはたくさんあるようですが、書くことの簡単さと実行速度とのバランスとか、他言語のライブラリを使えるようにしているところとか、バランスが絶妙で、この分野を Julia が、置き換えていく可能性はあるなと感じました。
何しろ、 Julia で書いた部分が速いので。

ただ、データサイエンティストでない僕のような Webプログラマーは、仕事で使うことはあまりないだろうとも思いました。
コメント(0) 
共通テーマ:日記・雑感

Firebird4.0 の ChaCha20 [Firebird]

これは、Firebird Advent Calendar 2021 https://qiita.com/advent-calendar/2021/firebird
の2日目の記事です

Firebird3.0 で、サーバーとクライアントのやりとりを RC4 で暗号化する仕組みができました。
Firebird4.0 で RC4 に加えて、ChaCha20 による暗号化が可能になりました。

ドライバーが対応していれば、ネゴシエーションでChaCha20 で通信することが決められますが、
対応していないドライバーであれば、 RC4 (もしくは、暗号化なし)でデータのやりとりがなされます。

今年は、自分が書いてメンテナンスしているドライバーで、この ChaCha20 のサポートをしました。

ChaCha20 が、 TLS1.3 で使われるようになった比較的新しい暗号アルゴリズムだということは知っていて、
なんとなく難しそう・・・と思っていたのですが
ブロック暗号ではなく(ブロック暗号だとブロックのあまり部分の扱いとか難しそう)ストリーム暗号ならなんとかなるかなってことで調べ始めました。

https://en.wikipedia.org/wiki/Salsa20#ChaCha_variant
https://ja.wikipedia.org/wiki/Salsa20

64バイトの内部状態(16バイトの固定値、32バイトの秘密鍵、12バイトの nonce、4バイトのカウンター)をグルグルかき混ぜて、
その内部状態と xor をとって暗号化/復号するもので、わかってみると、自分でも実装できるようなものでした。

pure python の python ドライバー pyfirebirdsql では、 ChaCha20 部分を自分で書きました
https://github.com/nakagami/pyfirebirdsql/blob/master/firebirdsql/chacha20.py

Go言語、 erlang のドライバーは、標準ライブラリに ChaCha20 のエンコード、デコードをする機能があったのでそれを使いました

- https://github.com/nakagami/firebirdsql
- https://github.com/nakagami/efirebirdsql

専門家でないので、 ChaCha20 でどれくらい暗号強度が増したのかわからないのですが、
(十分な長さのパスワードであれば、インターネット上を通信パケットを流しても十分安全なのか?)
Firebird の新しいWireProtocol に追随できて嬉しいです。

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