地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

【PostgreSQL】ユーザー定義関数を登録する

概要

ユーザー定義関数を実装してPostgreSQLで呼び出せるようにします。

準備

$ sudo apt install postgresql-server-dev-all

ソース

#include "postgres.h"
#include "fmgr.h"

PG_MODULE_MAGIC;

// INT4 (整数) 用関数
PG_FUNCTION_INFO_V1(multiply_by_ten_int);

Datum multiply_by_ten_int(PG_FUNCTION_ARGS) {
    int32 input = PG_GETARG_INT32(0);
    PG_RETURN_INT32(input * 10);
}

// FLOAT4 (単精度浮動小数点) 用関数
PG_FUNCTION_INFO_V1(multiply_by_ten_float4);

Datum multiply_by_ten_float4(PG_FUNCTION_ARGS) {
    float4 input = PG_GETARG_FLOAT4(0);
    PG_RETURN_FLOAT4(input * 10.0);
}

// FLOAT8 (倍精度浮動小数点) 用関数
PG_FUNCTION_INFO_V1(multiply_by_ten_float8);

Datum multiply_by_ten_float8(PG_FUNCTION_ARGS) {
    float8 input = PG_GETARG_FLOAT8(0);
    PG_RETURN_FLOAT8(input * 10.0);
}

読み込み

CREATE OR REPLACE FUNCTION multiply_by_ten(input int)
RETURNS int
AS '/usr/lib/postgresql/echo', 'multiply_by_ten_int'
LANGUAGE C STRICT;

CREATE OR REPLACE FUNCTION multiply_by_ten(input real)
RETURNS real
AS '/usr/lib/postgresql/echo', 'multiply_by_ten_float4'
LANGUAGE C STRICT;

CREATE OR REPLACE FUNCTION multiply_by_ten(input double precision)
RETURNS double precision
AS '/usr/lib/postgresql/echo', 'multiply_by_ten_float8'
LANGUAGE C STRICT;

これで受け取った数値を10倍して返すだけのユーザー定義関数の実装ができた。

【Linux】fioメモ

dd command

SeqR: time dd if=/nvme/testfile of=/dev/null bs=1024k iflag=direct
SeqW: time dd if=/dev/zero of=/nvme/testfile bs=1024k count=8192 oflag=direct

https://developers.cyberagent.co.jp/blog/archives/6623/

https://www.na3.jp/entry/20150831/p1

https://software.intel.com/content/www/us/en/develop/articles/evaluate-performance-for-storage-performance-development-kit-spdk-based-nvme-ssd.html

[Global]
ioengine=libaio
direct=1
rw=randrw
rwmixread=100 (100% reads), 70 (70% reads 30% writes), 0 (100 writes)
thread=1
norandommap=1
time_base=1
runtime=300s
ramp_time=10s
bs=4k
iodepth=32
Numjobs=1
[test]
filename=/dev/nvme0n1

https://qiita.com/toshihirock/items/fa4d310115e6921ab0ac

Block size: 4k

SeqR: fio -filename=/tmp/test2g -direct=1 -rw=read -bs=4k -size=2G -numjobs=64 -runtime=10 -group_reporting -name=file1
SeqW: fio -filename=/tmp/test2g -direct=1 -rw=write -bs=4k -size=2G -numjobs=64 -runtime=10 -group_reporting -name=file1
RndR: fio -filename=/tmp/test2g -direct=1 -rw=randread -bs=4k -size=2G -numjobs=64 -runtime=10 -group_reporting -name=file1
RndW: fio -filename=/tmp/test2g -direct=1 -rw=randwrite -bs=4k -size=2G -numjobs=64 -runtime=10 -group_reporting -name=file1

Block size: 32m

SeqR: fio -filename=/tmp/test2g -direct=1 -rw=read -bs=32m -size=2G -numjobs=16 -runtime=10 -group_reporting -name=file1
SeqW: fio -filename=/tmp/test2g -direct=1 -rw=write -bs=32m -size=2G -numjobs=16 -runtime=10 -group_reporting -name=file1
RndR: fio -filename=/tmp/test2g -direct=1 -rw=randread -bs=32m -size=2G -numjobs=16 -runtime=10 -group_reporting -name=file1
RndW: fio -filename=/tmp/test2g -direct=1 -rw=randwrite -bs=32m -size=2G -numjobs=16 -runtime=10 -group_reporting -name=file1

Links

https://github.com/axboe/fio

https://linux.die.net/man/1/fio

https://docs.oracle.com/en-us/iaas/Content/Block/References/samplefiocommandslinux.htm

https://developers.cyberagent.co.jp/blog/archives/6623/

linux storage stack diagram

https://nvmexpress.org/education/drivers/linux-driver-information/ https://www.thomas-krenn.com/en/wiki/Linux_Storage_Stack_Diagram Linux-storage-stack-diagram_v4.10-e1575939041721.png

aio (linux)

fs/notify/fsnotify.c

__fsnotify_parent()
  fsnotify()
    send_to_group()
      fsnotify_handle_event()
        fsnotify_handle_inode_event()
          return ops->handle_inode_event(inode_mark, mask, inode, dir, name, cookie);

include/linux/fsnotify.h

fsnotify_perm()
  fsnotify_file()
    fsnotify_parent()
      __fsnotify_parent()

fs/read_write.c

rw_verify_area()
  security_file_permission()
    fsnotify_perm()

fs/aio.c

SYSCALL_DEFINE3(io_submit, aio_context_t, ctx_id, long, nr,
        struct iocb __user * __user *, iocbpp)
  io_submit_one()
    __io_submit_one()
      aio_read()
        rw_verify_area()
        aio_rw_done()
      aio_write()
        rw_verify_area()
        aio_rw_done()

include/linux/syscalls.h

#define SYSCALL_METADATA(sname, nb, ...)            \
    static const char *types_##sname[] = {          \
        __MAP(nb,__SC_STR_TDECL,__VA_ARGS__)        \
    };                          \
    static const char *args_##sname[] = {           \
        __MAP(nb,__SC_STR_ADECL,__VA_ARGS__)        \
    };                          \
    SYSCALL_TRACE_ENTER_EVENT(sname);           \
    SYSCALL_TRACE_EXIT_EVENT(sname);            \
    static struct syscall_metadata __used           \
      __syscall_meta_##sname = {                \
        .name       = "sys"#sname,          \
        .syscall_nr = -1,   /* Filled in at boot */ \
        .nb_args    = nb,               \
        .types      = nb ? types_##sname : NULL,    \
        .args       = nb ? args_##sname : NULL, \
        .enter_event    = &event_enter_##sname,     \
        .exit_event = &event_exit_##sname,      \
        .enter_fields   = LIST_HEAD_INIT(__syscall_meta_##sname.enter_fields), \
    };                          \
    static struct syscall_metadata __used           \
      __section("__syscalls_metadata")          \
     *__p_syscall_meta_##sname = &__syscall_meta_##sname;

#define SYSCALL_DEFINE3(name, ...) SYSCALL_DEFINEx(3, _##name, __VA_ARGS__)

#define SYSCALL_DEFINEx(x, sname, ...)              \
    SYSCALL_METADATA(sname, x, __VA_ARGS__)         \
    __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)

#define __SYSCALL_DEFINEx(x, name, ...)                 \
    __diag_push();                          \
    __diag_ignore(GCC, 8, "-Wattribute-alias",          \
              "Type aliasing is used to sanitize syscall arguments");\
    asmlinkage long sys##name(__MAP(x,__SC_DECL,__VA_ARGS__))   \
        __attribute__((alias(__stringify(__se_sys##name))));    \
    ALLOW_ERROR_INJECTION(sys##name, ERRNO);            \
    static inline long __do_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__));\
    asmlinkage long __se_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__)); \
    asmlinkage long __se_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__))  \
    {                               \
        long ret = __do_sys##name(__MAP(x,__SC_CAST,__VA_ARGS__));\
        __MAP(x,__SC_TEST,__VA_ARGS__);             \
        __PROTECT(x, ret,__MAP(x,__SC_ARGS,__VA_ARGS__));   \
        return ret;                     \
    }                               \
    __diag_pop();                           \
    static inline long __do_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__))

GMOペパボを退職します

2024年10月30日をもって、約3年間勤めたGMOペパボを退職します。

入社したのは2021年7月なのでした。

ryuichi1208.hateblo.jp

ペパボでは主にSREとして、サービスの信頼性に関する施策の考案と実践を担当してきました。入社時にはSREの概念は認知されていましたが、当時はまだ改善の余地が多く、日々多くの課題に取り組んでいました。

特にアラート対応は大変で、一晩に3〜4回もアラートが鳴ることがありました。携帯を投げ捨てたくなるほど頻繁に通知が鳴っていたのを今でも覚えています。「このままでは日中の業務に支障が出るやん...」と思い、オンコール当番に入るタイミングで、アラート整備を進めました。

実際、記事にも取り上げていただき、PagerDutyの整備やアラート内容の見直し根本対応の実施などで、最近では月単位で深夜の呼び出しがゼロの日も増えました。(逆に少し物足りないくらいですw)

その後、組織改編に伴いチームリーダーの機会をいただきました。初めてだったのでリーダーシップ論の本を読み漁りながら、どのようにチームの生産性と働きやすさを両立させるかを模索しました。これまでは個人で頑張れば成果が出せると考えてきましたが、労働時間を増やしてもバリューが高まらないと感じ、より効率的な組織作りに目を向けました。定量的な効果測定はしていませんが、チームの労働時間が減り、生産性が向上したと実感しています。

また、この経験を通してリーダーシップ論以外にも様々な分野の本に触れ、「自分は学ぶことが好きだ」という新たな発見も得られました。(正直技術書と漫画くらいしか読んでこなかったので読書の習慣ついたのも嬉しい)

思い出の数々

バッターボックスに立つ重要性

tech.pepabo.com

「自分にはまだ実力がないから…」とためらいがちだった私にとって、人生が変わる内容でした。

  • 自分が興味を持つ分野に対して日々の研鑽を欠かさない
  • チャンスが目の前に現れたときには間髪入れずに手を挙げる

これを意識することで、カンファレンスへの登壇、技術書典での寄稿、SRE NEXTスタッフをやったりしました。また、ペパボにはホームランを狙う社員が多く、刺激を受けながら成長できたことは、大きな財産です。バッターボックスに立つそのために研鑽をし続けるというのは仕事に限った話ではなく生き方にも適用できるものだなと思います。

pyamaさんと働けたこと

pyamaさんと働けたことも非常に大きな経験でした。技術面での指導はもちろん、登壇やキャリアのアドバイス、さらには旅行先のホテル選び、新婚旅行で行くと良いところなどなど助言をいただき、本当に感謝しています(pyamaさんに出会わなければヒルトンなんて一生無縁の存在だった気がする)。

pyamaさんは「お前のことなんかすぐ忘れる」と言っていましたが、きっと「忘れさせないような技術力と影響力を持て!!!!!1」というエールと捉え次会った時にお前誰と言われないよう頑張っていきます。

その他

ryuichi1208.hateblo.jp

2022年の下期でシニアエンジニアになっていた。Mackerelアンバサダーにもなっていたりします。自宅サーバの監視で使わせてもらっています。ありがとうございます。

tech.pepabo.com

開発合宿とかにも行った。人生初静岡で楽しかった。この時に書いたコードはプロダクションには出せなかったけど引き継いでもらったのできっと出るはず

tech.pepabo.com

技術書典で本を出した。いつかはやってみたかったことなので出せて本当に嬉しいです。物理本はタイミングが合わず貰えなかったのでいつか欲しい

tech.pepabo.com

勉強会の企画とか登壇をやった。いつかはやってみたいと思っていた勉強会の主催で渋谷駅前のめっちゃいい場所でやれたのはいい思い出。

tech.pepabo.com

みんなでカンファレンスに行った。いつも一人で行って誰とも喋らずに帰るみたいな感じで会社の人たちと来てるの羨ましいなと思っていたのでやれて嬉しいです。

こう振り返ってみるとやりたいと行ったこと大体受け入れてやらせてもらえて本当にいい環境にいたんだなと改めて思いました。やり残したことはどでかい自社カンファレンスをやるというのがあるのでこれは今後やれれば良いかなと思います。

今後

11月からはIVRyでSREをやっていきます。スタートアップ企業で働くのは初めてなので正直わからんことだらけではあると思いますが学ぶ、働くことが好きなのでガンガンバリューを出せるようにやっていこうと思います💪

入社エントリとかは別途書きます。

例のやつです

あと送別会のときの写真も貼っておきます

【登壇】YAPC::Hakodate 2024の前夜祭で登壇してきた

登壇内容

speakerdeck.com

本編はrejectでしたが前夜祭で登壇する機会をいただけたのでバックアップの話をしてきました。ちょうど仕事でもバックアップについて考える必要があったりしたいので良い振り返りとなったりしました。

↑は同僚に撮ってもらった写真

本編

テストコードの品質を客観的な数値で担保しよう 〜Mutation Testingのすすめ〜 by Kanon

Mutation Testという考え自体初めて知りました。品質への意識変化なども導入を通して変わったとのこと

ADRを運用して3年経った僕らの現在地 by Takafumi ONAKA (onk)

ADRの運用はうまくいったという感触がこれまでなくて参考になる内容が多かったです。RFCというステータスは確かに面白いなと思い毎ました。

CloudNative Meets WebAssembly: Wasm's Potential to Replace Containers

WASMの入門から将来展望までをまとめたセッション。WASMとJVMが似てるというの言われてみると確かにとなりました。

perlbrew 3000! by gugod

perlbrew 1.0めでたい🎉未来のPerlの話などなど

LT

どれも面白かったです。セッション直後の実装に関する議論なんかも仕込みみたいな感じでやっていてYAPCっぽいなぁと思って好きですw

キーノート

という感想を持ちました。チームをチームたらしめてるのは個人。個人技が今後は大事になってくる。

「必要になりそうなものは可能な限り全部作ってみる」はすぐ実践できるのは間違いないのでやっていきましょう。

懇親会

初めましての方から前回のYAPCぶりの人だったりという色々な方と会って話せたりしました。開発の話とか最近やってる事業の話とか他社の人と話す機会ってあまりないので面白かったです。「バックアップは自分ではやりたくなくてクラウドでいい感じにしてほしいですよねw」というコメントをもらったりした。わかる...となったりしたw

二次会ではkoba789さんに人工衛星の開発について色々話をしてもらってましたw。Webの開発だと全く意識しないような内容ばかりでとても面白かったです。

観光

赤煉瓦の方行ったり公会堂行ったりラッキーピエロ食べたり塩ラーメンを食べた。

まとめ

YAPCに参加すると、毎回自分の技術力の不足を痛感します。セッションとかLTで登壇している方の発表を聞いていると、課題に直面した際に技術でしっかりと解決していく姿勢が徹底されていて、そういった能力を持っているのは本当にすごいと思う反面、自分にはその力がないと感じて、無力感を覚えることがあったりします。と同時にそのような技術力を自分も身に付け、課題解決に積極的に取り組めるエンジニアになりたいという強いモチベーションが湧いてきます。これは多分YAPCに限った話ではないとは思いますがより強くそう思うのがYAPCだなと思います。

今年はReject Conでの発表でしたが、来年こそはプロポーザルを通して本編で発表できるような実績を積み上げ挑みたいなと思います💪 来年は福岡2daysで企画中らしいのでとても楽しみです!

ひとまず運営の皆さんお疲れ様でした!素敵な会をありがとうございます!