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

  • kubernetes knative でサーバレス Vim

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

    kubernetes knative でサーバレス Vim
  • C言語向けコルーチン非同期 I/O ライブラリ neco を使ってみた。

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

    C言語向けコルーチン非同期 I/O ライブラリ neco を使ってみた。
  • cron で exponential backoff するツール作った

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

    cron で exponential backoff するツール作った
  • 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 の面白さをエンジニア目線で解説してみる
  • もっと log/slog を使おう

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

    もっと log/slog を使おう
  • 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 で稼働させた
  • 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 に変換するテクニック
  • 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 パーサを書いてみた。
  • Internet Explorer に会いたくなったら...

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

    Internet Explorer に会いたくなったら...
  • 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 で折り返し行を簡単に移動できるサブモード・テクニック
  • LiteStream をサイドカー構成にしたデータベース永続化

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

    LiteStream をサイドカー構成にしたデータベース永続化
  • Re: Goでcsvを操作するための基本的な知識

    はじめに Println で標準出力してみると以下のように表示されるかと思います。(SHIFT-JIS形式なのでmacでみると文字化けしていますがひとまず置いておきます) 日では一般的に CSV ファイルは Shift_JIS でエンコードされている事が多いです。Go 言語は内部のエンコーディングが UTF-8 なので、Shift_JIS な CSV ファイルを読み込むと文字化けします。 そこで便利なのが エンコーディングの変換は golang.org/x/text/transform が便利です。このパッケージと、golang.org/x/text/encoding/japanese を使う事で、os.Open で開いたファイルがさも初めから UTF-8 であるかの様に扱う事ができます。 どんな風に扱うか japanese パッケージには japanese.ShiftJIS や jap

    Re: Goでcsvを操作するための基本的な知識
  • numpy より速い?Go の行列演算ライブラリ nune

    ※ Div だけ妙に遅いのが気になる NumPy は Python とは言え中身はC言語で書かれている事を考えると、結構いいパフォーマンスが出ていると言えるでしょう。 サンプルコード iris のロジスティック回帰を nune で書いてみました。 package main import ( "bufio" "fmt" "log" "math" "math/rand" "os" "github.com/vorduin/nune" ) func logisticRegression[T nune.Number](X nune.Tensor[T], y nune.Tensor[T], rate float64, ntrains int) nune.Tensor[T] { ws := make([]float64, X.Size(1)) for i := range ws { ws[i] = (r

    numpy より速い?Go の行列演算ライブラリ nune
  • SQLite3 を PostgreSQL にできるコマンド postlite

    はじめに SQLite3 くらい楽に扱えて、PostgreSQL みたいにネットワーク経由で使える物ないかなーなんて思ったりする事ないですか?ありますよね、あるんです。 postlite このニーズに答えてくれるのが postlite です。postlite を使うと SQLite3 で作られたデータベースファイルを、PostgreSQL の様に扱えます。 仕組みは至って簡単で、僕が開発している go-sqlite3 に PostgreSQL の通信プロトコルのガワと、仮想テーブルを使って PostgreSQL のスキーマを疑似しています。 インストール postlite は go-sqlite3 の vtable を使います。ですので、go install ではなく postlite の README.md に書かれた手順を使わなければなりません。

    SQLite3 を PostgreSQL にできるコマンド postlite
  • vim-lsp-settings に物色インストール画面を作った。

    はじめに この記事は Vim Advent Calendar 2021、25 日目の記事です。みなさん Vim 使ってますか?そうですか、使ってますか。 今年はどうも仕事が忙しく、Vim に殆どコントリビュート出来なかったので反省している mattn です。何も Vim 活動をしていなかったのか、というとそうでもなく、主に vim-lsp-settings で色々な Language Server を使える様にしたり、改善したりしていました。 vim-lsp-settings て何よ 知らない方もおられると思うので、改めて vim-lsp-settings を説明したいと思います。 古くからあるジョークの影響か、一般的な Vim のイメージは 真っ黒な画面 /etc のファイル編集用エディタ 同期処理しかできない 終了できない といった悪いイメージがあるのですが、多くの方が想像している V

    vim-lsp-settings に物色インストール画面を作った。
  • Go の入力バリデーションパッケージ ozzo-validation を試した。

    はじめに Go のウェブアプリで使う入力バリデーションに関して、ozzo-validation を検討した。 これまでのバリデーション 普段、仕事では labstack/echo という Go のウェブフレームワークを使う事が多いのだけど、バリデーションに関しては labstack/echo のサンプルに合わせて go-playground/validator を使ってきた。 go-playground/validator は機能も豊富で(一応)痒い所に手は届くのだけど、struct にタグを付けて判定させないといけない。これが実に煩わしい。以前 labstack/echo を使ったサンプルを書いたので、それを見て欲しい。 // Comment is a struct to hold unit of request and response. type Comment struct { I

    Go の入力バリデーションパッケージ ozzo-validation を試した。
  • Go で SSH 超しに PostgreSQL に接続できる database/sql ドライバを作った。

    はじめに データベースを扱う際に、データベースサーバがローカルネットワーク内に存在すれば直接接続できるのですが、時にはデータベースサーバが遠隔にあり ssh を介してしか接続できないケースもあります。そういった場合、ポートフォワーディング等を使って接続するなどしないといけません。 しかしながら、その為には事前に ssh コマンドでトンネルを掘る必要があり、バッチ的に遠隔のデータベースを操作するのは幾分手間が掛かります。 SSH を超えてデータベースに接続する database/sql にはドライバを自分で作る機能があります。そしてデータベースに接続する際のコネクタを自作する事ができる様になっています。crypto/ssh でサーバにログインし、その先で Dial を実行する事で、あたかもローカルのデータベースに接続しているかの様なコネクションを PostgreSQL のコネクションとして渡

    Go で SSH 超しに PostgreSQL に接続できる database/sql ドライバを作った。
  • Rust の機械学習ライブラリ smartcore に入門してみた。

    はじめに たまには Rust も書きます。機械学習に興味があり、興味があれば何でも触ります。 smartcore とは とある Rust機械学習に詳しい人に、最近の Rust機械学習ライブラリのデファクトぽいのを聞いたところ、丁寧に linfa か smartcore を教えて貰いました。はじめに linfa を試したのですが、うまく行きませんでした。僕は Rust の toolchain で gnu(mingw) を使う派なのですが、linfa は Intel MKL をリンクする必要があり、Intel MKL は MSVC 形式のライブラリしか提供していません。DLL から .a を生成してリンクしてみたりもしましたが、結局うまくリンクできず諦めてしまいました。MSVC の toolchain や他の OS(Linux) だと問題なく動くんだと思います。 しかたなく、残りの s

    Rust の機械学習ライブラリ smartcore に入門してみた。
  • Go 言語でスライスから要素を消すには

    の様に直感的な操作ができるはずです。しかし Go 言語の場合、スライスの伸長にて発生するメモリアロケーションを append 関数と代入を使う事で透過的に行える仕組みを採用しています。例えばスライスの伸長は この様に行います。C言語をかじった事のある方や、プログラミング言語の内部データ構造をご存じの方であれば、リストといった物が伸長の度にメモリを再確保する様な事をやっていない事はご存じだと思います。Go 言語のスライスも同様で、スライスには長さとキャパシティを持っており、キャパシティを超えない範囲で長さだけが増えていき、キャパシティを超えるとメモリが再確保されるという作りになっています。ですので、上記のコードであれば、スライス(実際は SliceHeader)が内部で持っているポインタ、長さ、キャパシティを、代入してやる事で上書きしています。 スライスから要素を消す スライスの伸長と同様に

    Go 言語でスライスから要素を消すには