kubo39's blog

ただの雑記です。

Rustのmysql_asyncをさわってみる

Rustの非同期I/O隆盛の流れでtokioベースのmysql driverができたっぽい。(ほんとにできたばっかり)

GitHub - blackbeam/mysql_async: Asyncronous Rust Mysql driver based on Tokio.

雑な説明だけれど一応書いておくと、非同期I/Oは一スレッドが捌くクライアントの数が多くなるので、ひとつのクライアントで重い処理が走ると全体のスループットが下がってしまう問題がある。Cで書かれたlibmysqlclientは同期I/Oの操作しか提供しておらず、ブロックするようなI/Oがはしるときに上述の問題があるのでイベントドリブンなサーバと相性が悪い。イベントドリブン前提なGoやnode.js、D言語(vibe.dベースのやつ)のmysqlクライアントなんかはこれを使わないで自前で書いてブロックしそうなI/Oイベントをいい感じにスイッチするようにしてる。Pythonなんかだとpure Pythonがどうしても遅いのでgreenifyみたいに頑張る人たちもいるけど。

書いててスイッチの話が出るなら軽量スレッドの話も必要になるか…と思ったけどめんどいしGoとかgeventとかそのへん調べてもらったほうがいいな。。

まあそういう流れでRustもtokio/futuresベースのやつができたので、さっそく試してみよう。試すっていうか、サンプルを触っただけ。

とりあえずUbuntuなのでこのへんを入れた。まあ各位よしなに。。というかんじ。

$ sudo apt install mysql-server mysql-client -y

cargo newでプロジェクトを作成。

( ՞ਊ ՞) :~/dev/rust $ cargo new --bin sample_mysql_async
     Created binary (application) `sample_mysql_async` project

Cargo.tomlに追記。

[dependencies]
mysql_async = "0.1.0"
futures = "0.1.*"
tokio-core = "0.1.*"

サンプル全体は ここ にある。

軽量スレッドとの組み合わせはどうなるのかな。Rustだとcoroutine-rsとかlibfringeとかと組み合わせるのか、なんかいい感じにmiocoやcoio-rsが使えるのかそういうかんじになりそう。

一般人未満の存在ってこと…?

相変わらずAWS LambdaとCloudWatchLogsで消耗していた。AWSのドキュメントはほんとうにだめ。

同期に setenforce 0 を伝授した。

D言語

GCC hardennd対応は dmd.confに -g -fPIC -defaultlib=libphobos2.so を足せばよかった。

perlD言語

Perlは拡張をCPPの独自拡張?であるXSで書くのでC言語以外で拡張モジュールを書くのがむずかしい。

それでも他言語でやれないことはなくて、共有リンクライブラリを FFI::Raw のように実行時にdlopen(3)する形でやればよい。

先に環境

( ՞ਊ ՞) :~ $ perl -V:version
version='5.14.4';
( ՞ਊ ՞) :~ $ ldc2 -version | head -1
LDC - the LLVM D compiler (1.0.0):
( ՞ਊ ՞) :~ $ lsb_release -c
Codename:       yakkety
( ՞ਊ ՞) :~ $ cat /proc/version
Linux version 4.8.0-26-generic (buildd@lgw01-58) (gcc version 6.2.0 20161005 (Ubuntu 6.2.0-5ubuntu12) ) #28-Ubuntu SMP Tue Oct 18 14:39:52 UTC 2016
use strict;
use warnings;

use FFI::Raw;

my $adder = FFI::Raw->new(
  'libadder.so', 'adder',
  FFI::Raw::int, # 戻り値
  FFI::Raw::int,  # 引数1
  FFI::Raw::int  # 引数2
);

print $adder->call(1, 1) . "\n";  #=> 2
extern(C) int adder(int a, int b)
{
    return a + b;
}

しかしひとつ問題があって、 -sharedつきでビルドをするとD言語自体のライブラリとのリンクを共有リンクライブラリと行ってしまう。

$ ldd libadder.so  # LDCを使っているのはDMDはGCC hardened対応のため-defaultlib=libphobos2.soを与えているから
        linux-vdso.so.1 =>  (0x00007ffd78f6e000)
        libdruntime-ldc.so.71 => /usr/lib/x86_64-linux-gnu/libdruntime-ldc.so.71 (0x00007ff37aed5000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ff37ab0e000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007ff37a805000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007ff37a5e7000)
        librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007ff37a3df000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007ff37a1d9000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007ff379fc2000)
        /lib64/ld-linux-x86-64.so.2 (0x000056322ba25000)

静的リンクライブラリは-fPIC前提でないためなのかわからないが、とにかくデフォルトの挙動はこうなってしまう。

アニメ

アイカツスターズ!をみました。まひるちゃん回、かな?よさです。

フリップフラッパーズをみました。演出がこわかったですがハッピーに終わるかんじでよかった。

レガリアをみました。ハッピーエンドになってくれたのむ〜〜〜

競女をみました。極めて頭のおかしいアニメだ(褒めてる)

ガーリッシュナンバーをみました。水着回でした、勝ったなガハハw・・・

バカテレビ

バカテレビなのでリモコンが効かず主電源を落としに行かなければならない。また東芝製か、っていう。東芝不買運動をするぞ。

差し引きゼロってとこか

VimConf2016でスタッフ業の功績が認められた結果、前日の休みが代休になった。めでたい。

MtGが多くだいぶしんどかった。

開発環境インスタンスを破壊してしまった気がする。なんとかならないかな。(だめそう)

きびしい。

D言語

がんばって古いノートにUbuntu 16.04LTS i686をぶっこんだのでついでにsyscall-dのLinux x86対応をやった。

readelf-dもやろうと思ったがelf-dが32bit対応してなかった。おしまい。

アニメ

まといちゃんをみた。よさがある。

「気持ち悪い」という理由で垢消しを肯定するな

有給Pを使いました(死)

インターネット

コンテンツがあったが、消されていた。

法的にどうこうという見地はともかくとして、勝手にまとめられたほうとしてはいい気持ちはしないだろうしレポジトリを消すのは妥当な判断と思うが、垢消しはやりすぎではないか。

そして「気持ち悪い」という理由で垢消しを肯定するな。

日曜日一瞬だったんだが〜〜〜?

日曜日をやった。ほとんど睡眠で終わったのでなにもできなかった。終わり。

*追記

tags

タグジャンプというやつ。いろいろある。

手元のctagsコマンドとetagsコマンドはどちらもetagsのようだ。

( ՞ਊ ՞) :~ $ ctags --version
ctags (GNU Emacs 25.1.50)
Copyright (C) 2016 Free Software Foundation, Inc.
This program is distributed under the terms in ETAGS.README
( ՞ਊ ՞) :~ $ etags --version
etags (GNU Emacs 25.1.50)
Copyright (C) 2016 Free Software Foundation, Inc.
This program is distributed under the terms in ETAGS.README

これを試してみたい。

https://github.com/dan-t/rusty-tags

etagsではだめか。

( ՞ਊ ՞) :~/dev/rust/mioco (master) $ rusty-tags emacs
Fetching source of dependencies ...
ctags: invalid option -- 'e'
        Try 'ctags --help' for a complete list of options.

これを試してみよう。

https://github.com/universal-ctags/ctags

特にオプションをつけずにビルド。

( ՞ਊ ՞) :~ $ ctags --version
Universal Ctags 0.0.0(34ff9d4), Copyright (C) 2015 Universal Ctags Team
Universal Ctags is derived from Exuberant Ctags.
Exuberant Ctags 5.8, Copyright (C) 1996-2009 Darren Hiebert
  Compiled: Nov  7 2016, 02:53:21
  URL: https://ctags.io/
  Optional compiled features: +wildcards, +regex, +option-directory, +coproc, +xpath, +yaml

普通にこれをビルドしたら rusty-tags が動いた。

おいおい土曜日なのになんでこんなに疲れてるんだ

VimConf2016

スタッフ補佐をやった。大変疲れた。

これほどVimコミュニティに貢献しているemacsユーザはそうそういないのではないか。もっと感謝してくれてもいいよ。

カラオケ

VimConfのあと大学の同期とカラオケに誘われたので新宿に行った。

アニメ

終末のイゼッタをみました。眼鏡無能and無能、と思ったらあっさり殺されましたね。