タグ

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

  • kubernetes knative でサーバレス Vim

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

    kubernetes knative でサーバレス Vim
    mattn
    mattn 2024/05/21
    書いた。
  • k8s-csi-s3 を使ってストレージを節約する

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

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

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

    C言語向けコルーチン非同期 I/O ライブラリ neco を使ってみた。
    mattn
    mattn 2024/04/11
  • もっと log/slog を使おう

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

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

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

    cron で exponential backoff するツール作った
    mattn
    mattn 2023/12/23
    書いた。
  • 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 を素で編集してるの?
    mattn
    mattn 2023/12/15
    書いた。
  • 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 が便利
    mattn
    mattn 2023/12/11
    書いた。
  • 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 で稼働させた
    mattn
    mattn 2023/05/04
    書いた。
  • 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 に変換するテクニック
    mattn
    mattn 2022/12/25
    書いた。
  • 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 プラグインを作った。
    mattn
    mattn 2022/10/10
    書いた。
  • 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 ライブラリを書いた。
    mattn
    mattn 2022/08/17
    書いた。
  • 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チカ
    mattn
    mattn 2022/08/15
    書いた。
  • 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 インタプリタを書いてみた。
    mattn
    mattn 2022/07/14
    書いた。
  • 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 パーサを書いてみた。
    mattn
    mattn 2022/07/11
    書いた。
  • Deno の拡張を作ってリリースしてみた。

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

    Deno の拡張を作ってリリースしてみた。
    mattn
    mattn 2022/06/28
    書いた。
  • Internet Explorer に会いたくなったら...

    Internet Explorer が 27 年の歴史に幕を閉じました。 長く Internet Explorer に苦しめられてきた と沢山の思い出を作ってきたので、なんだか寂しい様な、懐かしいような、そんな気持ちです。 もしかしたら今後、またあの e のマークに会いたい、そんな風に思える日がくるかもしれませんね。今日、ちょっと寂しくなったので以下を実行してみました。

    Internet Explorer に会いたくなったら...
    mattn
    mattn 2022/06/16
  • previm で式やグラフが表示できる様になりました。

    はじめに previmVimMarkdown 編集する際にブラウザでプレビューできるプラグインです。 これまで plantuml と textile くらいしかサポートしていませんでしたが、katex や plolyjs 等をユーザ自身で追加できる様にしました。 https://github.com/previm/previm 経緯 以前から previm のメンテナをさせて頂いていたのですが、やはり Markdown で式やグラフを扱いたいというニーズは皆さんお持ちです。そしてその都度 pull-request が寄せられ、式やグラフ等を使いたくない人でも大きな previm に大きな変更が入り、ロード時間も長くなる事が懸念され、いずれの pull-request もマージできない状態になってしまいました。 また既存の markdown-it ライブラリのバージョン追従にも手

    previm で式やグラフが表示できる様になりました。
    mattn
    mattn 2022/06/15
    書いた。
  • typo ckeck しようぜ

    はじめに 興味深かったので深追いしてみた。問題点をまとめると check と ckeck は見間違えやすい Ruby HCL はコンパイルしない言語 文字列内(string interpolation)なので linter が通らない こうなると typo を検知できる linter を使うしかない。しかし healthckeck の様に1ワードになっていると、それがどんな単語から構成されているか分からない。 he alt h ckeck なのか health ckeck なのか heal th ck eck なのか これをチェックできるコマンドを作った。 辞書が足らない、遅い、など問題点はあるけど、ひとまず動きそうなところまで作ったので、自分の整理の為に文章を残しておく。 healthckeck をエラーにするには healthckeck をエラーにするにはまずこの単語を health

    typo ckeck しようぜ
    mattn
    mattn 2022/05/17
    書いた。
  • LiteStream をサイドカー構成にしたデータベース永続化

    はじめに LiteStream がアツいですね。LiteStream は SQLite データベースのレプリカを作るシステムです。これを使う事で、アプリケーションが更新した SQLite データベースを S3 ストレージに瞬時にバックアップする事ができます。 はい... LiteStream を使ったサイドカー構成 LiteStream を使い、コンテナの起動前にデータベースをリストアし、アプリケーションが起動した後にレプリカを行えば、コンテナは何時でもホストから消し去る事ができる様になります。 以下に、/data ボリュームにリストアを行い、アプリケーションの起動後にレプリカを開始する docker-compose.yaml を示します。 version: '2' services: restore-container: image: litestream/litestream cont

    LiteStream をサイドカー構成にしたデータベース永続化
    mattn
    mattn 2022/05/16
    書いた。
  • Vim で折り返し行を簡単に移動できるサブモード・テクニック

    はじめに 先日 Twittervim-jp コミュニティで、Vim で折り返し行を移動する方法についての質問がありました。 Vim に詳しくない方の為に説明すると、Vim は行指向のテキストエディタです。j/k で移動するのは行単位の為、折り返されている行であっても次の行へと移動します。 視覚的に移動したい しかし折り返されている行を視覚的な単位で移動したい事もあります。w や 80l の様に移動する方法もありますが、目的の場所に確実に移動できる訳ではありません。 その様な移動の方法として Vim には gj と gk があります。 gj or *gj* *g<Down>* g<Down> [count] 表示行下に移動。|exclusive|。行が折り返されて いる場合とオペレータコマンドとともに使われた場合は 'j' と違う動作になります(行単位ではありませんから)。 gk or

    Vim で折り返し行を簡単に移動できるサブモード・テクニック
    mattn
    mattn 2022/05/05
    書いた。