タグ

ブックマーク / zenn.dev/mattn (66)

  • kubernetes knative でサーバレス Vim

    はじめに 半月ほど前に、ようやく自分の VPS 環境で動いているものすべてを kubernetes クラスタに移行しました。とても満足感が高くやって良かったと思っています。 ウェブサーバ、メールサーバ、Nostr のリレーサーバや Nostr/Bluesky/Twitter で動かしている各種 bot もすべて kubernetes です。 昨日は knative を導入したので、GoRustRubyPython や、いろんな言語のクラウドネイティブアプリを簡単に実行できる様にしました。 knative 便利 残念ながら knative は helm パッケージとして提供されていません。ArtifactHub でそれっぽい物が公開されていますが、ほぼ手作業と変わりません。 おおよそ以下の手順でインストールできます。knative ではネットワークレイヤとして以下の3つが用

    kubernetes knative でサーバレス Vim
  • k8s-csi-s3 を使ってストレージを節約する

    はじめに kubernetes を個人で利用する際にコストに影響してくるのがストレージですね。特にクラウドサービス等では1度に作れるストレージの最小サイズが決められており、またそのストレージを分割して使うという使い方も出来なかったりします。 helm でインストールする様なアプリケーションでは PVC (PersistentVolumeClaim) により確保されるストレージサイズが個別に決められる事が多いのですが、そうするとそのたびにストレージが最小サイズで作られてしまいます。僕がお借りしている Oracle Cloud もブロックボリュームの最小単位が 50Gi なので、helm で oci-bv ストレージクラスを使う物があれば PVC の require を越えて 50Gi のブロックボリュームが作られてしまいます。 そこで k8s-csi-s3 そこで便利なのが minio と

    k8s-csi-s3 を使ってストレージを節約する
  • C言語向けコルーチン非同期 I/O ライブラリ neco を使ってみた。

    はじめに C言語でコルーチンを扱う方法は色々ありますが、専用の命令を専用の記述方法で実装しなければならなかったりなど、あまりとっつきやすいものではありませんでした。 今日 X/Twitter のタイムラインで見付けた neco はまさにそんな悩みを解消できる物でした。 neco とは neco はコルーチンを使った非同期 I/O ライブラリです。 コルーチン: 開始、スリープ、一時停止、再開、移譲、および結合。 同期: チャネル、ジェネレータ、ミューテックス、条件変数、および待機グループ。 デッドラインとキャンセルのサポート。 ファイルディスクリプタを使った Posix フレンドリーなインターフェース。 ネットワーク、シグナル、ランダムデータ、ストリーム、およびバッファ付き I/O の追加 API。 公正かつ決定論的なスケジューラを備えた軽量ランタイム。 高速なユーザースペースのコンテキス

    C言語向けコルーチン非同期 I/O ライブラリ neco を使ってみた。
  • Linux の Google Chrome で nostr: を Nostter で開く

    はじめに njump 等では nostr: で始まるプロトコル URL が用意されている。例えば note1 であれば nostr:note1xxxx、また nprofile1 であれば nostr:nprofile1xxxx といった具合に。 これは gossip 等のデスクトップアプリケーションで開くためのもので、nprofile1 であればユーザのプロフィールが表示される様になっている。 しかし gossip を使っていない人もいる。僕もそう。できれば nostter で開いて欲しい。 Desktop ファイルを用意する 以下の nostr.desktop というファイルを用意する。 [Desktop Entry] Exec=bash -c "xdg-open https://nostter.app/$(echo %u | sed 's!^nostr:!!' | jq -Rr @ur

    Linux の Google Chrome で nostr: を Nostter で開く
  • もっと log/slog を使おう

    はじめに この記事は Go アドベントカレンダー 2023 の最終日 25 日目の記事です。 皆さん log/slog 使ってますか。便利なのでぜひ使ってください。 slog は構造化ログを出力する為のパッケージで Go 1.21 で導入されました。これまでも zap や zerolog といったサードパーティ製のロガーを使う事で構造化ログを出力する事ができましたが、構造化ログを出力する機能が Go の標準ライブラリになりました。 slog とは 通常の log パッケージは、時刻とメッセージの単純な出力になります。

    もっと log/slog を使おう
  • cron で exponential backoff するツール作った

    この様に指定すると3分毎に実行されます。 とても便利ではあるのですがコマンドの実行が失敗すると、冗長なコマンド実行となり得ます。cron ではコマンドの実行が失敗し続けるとメールが運営者に繰り返し送信され続けます。 crontab にコマンドが1分毎に実行される様に投入してひとまず正常起動を確認、仕事を終えて家に返ってビールでも飲んで、さぁ寝ようかなと思った頃にコマンドが失敗し始めると、朝までメールが飛び続けます。 またウェブサービスの API を呼び出す cron ジョブを投入していたらそのウェブサービスがメンテナンスに入った、なんて事もあると思います。メンテナンス中にも関わらず無限に失敗し続ける API 呼び出しはもしかしたら BAN の対象になってしまうかもしれません。 全ては cron に exponential backoff する機能がないのが問題です。 systemd tim

    cron で exponential backoff するツール作った
  • k8s 環境で postgresql するなら pgproxy が便利

    はじめに kubernetes 環境で postgresql のコンテナを建てたり、kubernetes クラスタが存在する VPN に postgresql インスタンスを起動する場合、kubernetes の外から postgresql サーバにアクセスする事ができません。モチベーションとしては自分の端末から kubernetes VPN 内にいる postgresql サーバへ psql で接続したいのです。その為にインターネットに穴を開けたくない。 psql が入ったコンテナを追加する... そうじゃない! 失敗した作戦1 コンテナ環境に socat が入った ubuntu コンテナを建て、postgresql へのプロキシを作成、そのコンテナへ kubectl port-forward する作戦です。 $ socat tcp-listen:5432,reuseaddr,fork

    k8s 環境で postgresql するなら pgproxy が便利
  • Vim で SQL を素で編集してるの?

    タイトルは釣りです。 この記事は Vim Advent Calendar 2023 16 日目の記事です。 はじめに みなさんは SQL はどんな環境で編集しているでしょうか? Visual Studio Code?それとも Vim?まさか Vim/Neovim の素の状態で編集していたりしませんよね? 僕はしていました。 sqls (SQL Language Server) 以前、lighttiger2505 さんが開発した sqls に少しコントリビュートしていた頃がありました。 既に public archive になってしまっていますが、機能として実用的なままです。コントリビュートしていた頃は、あくまで OSS としての興味の方が大きく、如何に機能的にしていくかだけ着目していたため、常用はしていませんでした。 あらためて常用してみる sqls の導入 Vim から sqls を使う

    Vim で SQL を素で編集してるの?
  • Nostr の面白さをエンジニア目線で解説してみる

    はじめに 今年は、SNS でありプロトコルでもある Nostr に出会いました。2023年2月の参加でしたがもう、どういった経緯で Nostr を見付けて参加したのかすら思い出せなくなってしまいました。ここ数年、X/TwitterAPI という物を開発者に触らせなくなってしまいました。僕は X/Twitter が大きくなった理由の1つが、API をオープンにした事で数多くの bot やサービスがが登場した事だと思っていて、API が自由で無くなった X/Twitter をとても残念に感じています。次第に SNS に関連する何かを作るモチベーションはさっぱり無くなってしまっていました。 そんな中で見付けた Nostrエンジニアのオアシスとでも言える SNS だと感じました。 Nostr の思想 X/Twitter は中央集権型の SNS であり、以下の様な問題を持っています。 障害

    Nostr の面白さをエンジニア目線で解説してみる
  • RSS/Atom フィードを Twitter/Nostr にポストする小さいプログラムを書いた。

    はじめに 以前から Twittervim_jp アカウントでは、issue やブログ記事を bot として投稿してきました。 先日 IFTTT が Twitter 連携を有料化した事で、RSS/Atom から Twitter に投稿する事が無償ではできなくなりました。 feed2twitter しょうがないので RSS フィードから Twitter に投稿するプログラムを書きました。 cron で動かす想定です。僕は Oracle Cloud の Kubernetes クラスタの cronjob で動かしています。configmap と cronjob の YAML を書けば動きます。コンテナイメージも 5.8MB と小さく、複数のフィードを異なる Twitter アカウントで投稿する時でも同じコンテナイメージを使い回せるので割と便利かも。PostgreSQL を使って既存のリンクを

    RSS/Atom フィードを Twitter/Nostr にポストする小さいプログラムを書いた。
  • nostr と Bluesky に7つ bot を作り k8s で稼働させた

    俳句bot (nostr) nostr の日リレーを監視し、投稿を 575 または 57577 判定し、引用でお知らせする。狙った俳句ではなく、天然物の俳句がマッチするとウケが良い。 Go で実装。内部では go-haiku を使って俳句を判定。監視は日語の投稿が流れる日のリレーをお借りしている。普通の Go アプリなので golan:1.20-alpine でビルドして scratch でイメージ作成。 # syntax=docker/dockerfile:1.4 FROM golang:1.20-alpine AS build-dev WORKDIR /go/src/app COPY --link go.mod go.sum ./ RUN apk add --no-cache upx || \ go version && \ go mod download COPY --link

    nostr と Bluesky に7つ bot を作り k8s で稼働させた
    lugecy
    lugecy 2023/05/07
    > SNS が盛り上がるかどうかは、開発者が遊べる余地をどれくらい用意しているかが重要 > 技術遊びは勉強の一貫
  • ゼロサプレスは難しい

    はじめに ゼロサプレスまたはゼロ抑制 (英: zero suppress, zero suppression) は、数の表記から冗長なゼロを除去することである。逆の処理を行う対義語はゼロパディングである。 先日たまたま見た Qiita の記事にゼロサプレスに関する物があった。 strings.TrimLeft()を使ってゼロサプレスする package main import ( "fmt" "strings" ) func main() { str1 := "000012" str2 := "001020" fmt.Println(strings.TrimLeft(str1, "0")) fmt.Println(strings.TrimLeft(str2, "0")) } // > 12 // > 1020 ゼロサプレスの罠 ゼロサプレスは数が前提。つまり 000 は 0 でなければなら

    ゼロサプレスは難しい
  • Go の文字列距離実装シリーズ

    はじめに 検索システムを作る時に、ちょっとした揺らぎがあってもマッチさせたい要件があります。例えば「こんにちわ」と入力されても「こんにちは」を候補として出したい場合もあります。 そんなケースでは文字列距離アルゴリズムを使います。実用されている身近な例としては、git コマンドで checkout をタイプするつもりで chekcout とタイプした時に出るアレです。 $ git chekcout git: 'chekcout' is not a git command. See 'git --help'. The most similar command is checkout あれもこれからご紹介するレーベンシュタイン距離を使って実装されています。 文字列距離いろいろ 単純に文字列距離アルゴリズムといっても沢山あります。 ハミング距離 長さが同じ文字列の異なる部分をカウントする事で文字列

    Go の文字列距離実装シリーズ
  • char* を Go の string に変換するテクニック

    はじめに Go には cgo と呼ばれる、Go からC言語を扱う為の機能があります。go build を実行すると、内部でC言語のコンパイラが実行され、ソースの一部が Go に取り込まれます。 cgo とは まずは以下を見て下さい。 //go:build ignore // +build ignore package main /* int add(int a, int b) { return a + b; } */ import "C" func main() { println(C.add(1, 2)) } func terminateProc(pid uint64) error { dll, err := syscall.LoadDLL("kernel32.dll") if err != nil { return err } defer dll.Release() f, err :=

    char* を Go の string に変換するテクニック
  • Oracle Cloud Infrastructure の Logs にログ出力できる Fluent Bit プラグインを作った。

    はじめに Fluent Bit を使うと入力されたメッセージをファイルやクラウドサービス等、いろいろな所に出力できる様になります。デフォルトで Amazon CloudWatch Logs にも出力できますが、Oracle Cloud Infrastructure の Logs に出力する事ができなかったのでプラグインを作りました。 作り方 Fluent BitGo でプラグインを書く為のパッケージを用意しています。 この仕組みに乗ってプラグインを構築すれば好きなクラウドサービスにもログ出力できるという事です。以前、Oracle Cloud Infrastructure の Logs にログ出力できる CLI を作った事があったので、それを Fluent Bit プラグインとして移植しました。 設定方法 README に設定内容が書いてありますが、SERVICE セクションで plu

    Oracle Cloud Infrastructure の Logs にログ出力できる Fluent Bit プラグインを作った。
  • Zig の TensorFlow Lite ライブラリを書いた。

    はじめに Go 向けの TensorFlow Lite ライブラリの go-tflite mruby 向けの TensorFlow Lite ライブラリの mruby-tflite と作ってきて Zig 向けのライブラリを作らない訳には行きませんね。行けませんね! という訳で作りました。 ※ インタフェースの大文字小文字は変更するかもしれません。 使い方 使い方は go-tflite とほぼ同じです。 const std = @import("std"); const tflite = @import("zig-tflite"); pub fn main() anyerror!void { var m = try tflite.modelFromFile("testdata/xor_model.tflite"); defer m.deinit(); var o = try tflite.i

    Zig の TensorFlow Lite ライブラリを書いた。
  • TinyGo で Raspberry Pi Pico の Lチカ

    はじめに TinyGo も割と名前が知られる様になってきていますが、難しいと思っておられる方もいそうなので、TinyGo を使って Raspberry Pi Pico の Lチカ をする最小手順を書いておきます。 当に簡単です。 Raspberry Pi Pico を買う Switch Science さんで買って下さい。スタバでコーヒー1回我慢したら買えます。 接続 ブートセルボタンが付いていて、押しながら Windows PC と USB 接続するとエクスプローラが起動します。ここに uf2 という形式のファイルをブッ込みます。 通常の言語のツールキットでは、まず Linux elf 形式で実行モジュールを作成し、elf2uf2 というツールを使って elf 形式から uf2 に変換、それをエクスプローラからコピーするのですが、TinyGo は便利なので、この転送モードの最中に以下を

    TinyGo で Raspberry Pi Pico の Lチカ
  • Zig で簡単な Lisp インタプリタを書いてみた。

    はじめに 先日 Zig で JSON パーサを書いて Zig がどういう言語なのか、だいたい理解できたので Lisp インタプリタを実装してみた。 簡単な実装なので四則演算と変数定義、関数呼び出しくらいしか実装してない。 ちゃんと文法チェックなどをやってないので、変な Lisp コードを渡すと落ちる。これはいずれ直す予定。 実装中に知った Zig の記法 blk 名前付きブロックで値が返せる。 const std = @import("std"); pub fn main() anyerror!void { std.log.warn("{}", .{ blk: { const d: u32 = 5; const e: u32 = 100; break :blk d + e; }, }); }

    Zig で簡単な Lisp インタプリタを書いてみた。
  • Zig で簡単な JSON パーサを書いてみた。

    #include <stdio.h> int main(int argc, char* argv[]) { int i; for (i = 1; i <= 100; i++) { if (i % 15 == 0) puts("FizzBuzz"); else if (i % 15 == 0) puts("FizzBuzz"); else if (i % 3 == 0) puts("Fizz"); else if (i % 5 == 0) puts("Buzz"); else printf("%d\n", i); } return 0; } fn main() { let mut x = 1; while x <= 100 { if x % 15 == 0 { println!("FizzBuzz"); } else if x % 3 == 0 { println!("Fizz"); } e

    Zig で簡単な JSON パーサを書いてみた。
  • Deno の拡張を作ってリリースしてみた。

    はじめに 最近 Deno 遊びが楽しくなってしまった mattn ですこんばんわ。TypeScript は好きだけど node_modules に嫌気がさしてしまい、Deno に逃げてしまったのですが今は Deno が楽しくて仕方ないです。 Deno の良さ 僕が思う Deno の良さは以下の3つ node_modules が無い 余計なセットアップ無しに TypeScript が書け実行できる 危険なライブラリは許可しないと実行されない 最近は Cloudflare Workers や Deno Deploy でオレオレ Gyazo を作って遊んでいます。 既に deno.land にも沢山のライブラリが公開されているので、まだ Deno やった事がない人でもそんなに困らないと思います。 自作モジュールを作ってみた みんな Deno モジュールを作ってる、作ってないのはお前だけ そんな声

    Deno の拡張を作ってリリースしてみた。