サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
セキュリティ
zenn.dev/mattn
はじめに Vim にポップアップウィンドウの半透明と、補完メニュー(pum) の半透明が入りました。 ※ GUI の機能ではなく CUI でも動作します。 Vim はこれまで、こういったビジュアル面での改善にはあまり積極的ではありませんでした。テキストエディタとしての堅実さ、動作の軽さ、互換性。そういったものが常に優先されてきました。ただ一方で、個人的には Neovim が winblend などのビジュアル機能を取り入れて支持を集めている状況を見ると、Vim 側にもこういった機能があっていいのではないかとずっと思っていました。 実はこの半透明ポップアップウィンドウの実装は今回が始めてではありません。記憶が確かならば3回目なのです。Vim のソースをご存じの方であれば screen.c というソースがどういうソースなのかご存じかもしれません。もしあれをご存じなのであれば「あそこにテコ入れし
はじめに Go のコンパイラにはスライスや配列へのアクセス時に、インデックスが範囲内にあるかを実行時にチェックする仕組みがあります。いわゆる境界チェック (Bounds Check) です。この境界チェックは安全性の為に必要な物ですが、ループの中で何万回も実行されると無視できないオーバーヘッドになります。 Go のコンパイラは SSA (Static Single Assignment) の最適化パスの中で、境界チェックが不要と証明できたアクセスについてはチェックを除去します。これを BCE (Bounds Check Elimination) と呼びます。つまり、コンパイラが「このアクセスは絶対に範囲内だ」と証明できる様にコードを書けば、余分な境界チェックが消えて速くなるという訳です。 encoding/hex パッケージに対して、まさにこの BCE を活かした高速化の PR が提出され
はじめに OSS を作っておられる皆さんは、バージョンを上げる時にどうされていますか。僕はよく Go を書くので motemen さんの gobump を使っています。gobump は Go のソースコードから version 変数を見つけてセマンティックバージョニングに従ってバージョンを上げてくれる便利なツールです。 これだけで Go のソースコード中の const version = "1.2.3" が "1.2.4" になります。この手軽さが素晴らしすぎるので僕の OSS の中には v0.0.223 という、化け物の様なタグが付けられた物まであります。 ただ、gobump は Go の AST を解析して変数を書き換えるという仕組み上、Go のソースコードにしか使えません。普段 Go 以外のプロジェクトでも package.json や pyproject.toml、Cargo.to
はじめに 最近 AI Agent が流行っていますが、Agent とツール、skill や identity の関係がいまいちピンと来ていませんでした。ドキュメントを読むだけでは理解が深まらないので、実際に自分で作ってみるかと手を動かしていたら、知らない間にある程度動く物が出来上がっていました。yagi という CLI チャットクライアントです。 名前の由来は Go のインタプリタ Yaegi から来ています。yagi は複数の LLM プロバイダに対応した CLI チャットクライアントで、Yaegi を使ったプラグインシステムが最大の特徴です。 yagi でできること yagi は対話モードとワンショットモードの2つのモードを持っています。 # 対話モード yagi # ワンショットモード yagi "こんにちは" # パイプで入力 echo "Write FizzBuzz in Go"
はじめに この記事は Go Advent Calendar 2025、最終日 25 日目の記事です。 今年も皆さんお疲れ様でした。Go 1.26 がまもなくリリースされます。今回のリリースは派手さは無いにしろ、Go を使っておられる皆さんにとってはとても大きなリリースになるんじゃないかと思っています。 短い文章で言えば「軽くなり」「速くなる」です。 パフォーマンスに関する大きな変更2つ Green Tea GC Go 1.25 まで実験的に導入された Green Tea GC が 1.26 でデフォルトで導入されました。 これまで Go には数多くの GC 実装が取り込まれてきました。それぞれの GC により細かなチューニングがされ、パフォーマンス改善が行われました。 これまでの GC は、ヒープ上のオブジェクトへのポインタを追跡して個別にマークしていました。その結果メモリアクセスがランダ
はじめに この記事は、Google Developer Experts Advent Calendar 2025 13日目の記事です。 先日、Go の tip に入った面白い新機能についての話をしようと思います。 このコミットで、runtime/secret という新しいパッケージが入りました。 runtime/secret このコミット、テストケースが多いだけであり実はそれほど大きな変更ではありません。実際に追加された主たる関数は secret.Do と secret.Enabled だけです。 // Do invokes f. // // Do ensures that any temporary storage used by f is erased in a // timely manner. (In this context, "f" is shorthand for the /
はじめに この記事は Nostr Advent Calendar 2025 の8日目の記事です。 こんにちは。皆さん Nostr はご存じでしょうか。分散型ソーシャルネットワーキングサービスの1つで、中央集権的なサーバを持たず、ユーザが自由にサーバを立てて参加できる仕組みになっています。 簡単に説明した物を以下のリンクに書いてありますので、興味がある方はご覧ください。 この記事の中にも書かれていますが、Nostr は中央サーバに依存しない設計のため、誰でも自由にリレーサーバを立てることができ、それがエコシステムの強みでもあります。 この記事では、初心者でも理解しやすいレベルで「最小限動く Nostr リレーサーバ」の作り方を解説します。完璧な実装を目指すのではなく、まずは「動くもの」を作って仕組みを体感することを目的としています。 リレーサーバとは 分かりやすく説明すると Nostr のリ
はじめに 個人で管理するウェブサーバでは、しばしば複数のウェブサイトを管理する際にコストも掛かり気味ですが、kubernetes でもツールを適切に選べば複数サイトをケチケチしながら、うまく管理できるという話をしたいと思います。 複数のサイトに必要な物 複数のサイトを運営するとなれば、こういったものが必要かと思います。 ロードバランサと複数のドメイン HTML で作られた複数の静的サイト 複数サイトの証明書 ロードバランサと複数のドメイン 個人で管理するレベルの規模だと、複数のロードバランサをその数分借りるほどコストを掛けたくありません。できれば1つのグローバルアドレスを使い、バーチャルホストとして稼働させたいです。 ドメイン毎に Ingress を構築しても良いのですが、できれば管理コストを減らしたいです。また Ingress をサイト毎に分けると証明書もそれごとに発行しないといけなくな
はじめに 昨日 11/2 秋葉原のアキバプラザ 5F 大ホール。VimConf 2025 small が開催されました。例年の様に僕はスタッフとして参加させて頂きました。 受付で「ノベルティを持っていって下さい」と言っていたのが僕です。 スタッフ業をしていたので全ての発表を聞けてなかったのですが。幾らかは聞きました。その中でも僕が気になったのは2つ。 And Yet, Vim Survived: Thinking and Seeing in the Age of Code You Don't Write - Λlisue ご本人は話がうまいので、見ている方々は「面白かった」という感想が残りがちなんですが、内容としては Vim の今後についての話です。 業種にもよりますが、我々 IT エンジニアの世界でも AI によるプログラミングが浸透し始めてきました。これが意味するのは、過去に IT エ
はじめに TinyGo Keeb Tour 2025 in Osaka というワークショップのイベントに参加してキーボードを作ってきました。 個人的に、Raspberry Pi Pico や Raspberry Pi Zero 2 W、Raspberry Pi 等を幾らか保持はしていますが、ぶっちゃけ自作キーボードには興味がなく、どんなもんだろうという程度の気持ちで参加しました。 午前の部 イベントは午前の部と午後の部に分かれており、午前の部でプリント基板にダイオードや抵抗、マイコンやキースイッチなどを乗せてはんだ付けをします。 この基盤、Gopher の絵が付いていてとてもかわいいです。作り上げてしまうとこの絵が見えないのが残念なくらい。 はんだは久しぶり過ぎて、そして老眼で手もとが危うく、お手伝い頂きながらなんとか。 これが完成品です。 左上がジョイコン、右上がロータリースイッチ、それ
はじめに Go Advent Calendar 2024 に参加の皆さま、お疲れさまでした。今年も良い Go ライフを送れたでしょうか。来年も良い Go 縁があると良いですね。 さて今日は strings.Replacer の話をしようと思います。 キーワード置換やってますか GitHub を見ているとよくこんなコードを目にする事があります。 s = strings.ReplaceAll(s, "hoge", "moge") s = strings.ReplaceAll(s, "foo", "bar") s = strings.ReplaceAll(s, "fizz", "buzz") 複数ある特定のキーワードを置換するコードですが、実はとても効率が悪いのです。strings.ReplaceAll は第一引数の文字列を走査し、第二引数にマッチした場合に第三引数へ置換し続ける実装です。つまり
はじめに Go 1.23 で iter パッケージが導入されました。この iter は抽象化されたイテレータを示す仕組みと実装です。未だどの様に活用して良いか分からない方もいると思いますので、使い方を簡単に解説しようと思います。 概念 iter パッケージは、現状は for-range でのみ利用可能です。スコープにコンテキストを持ったロジカルな列挙可能オブジェクトと、それを別のスコープにて for-range でイテレートする際に便利です。 これまでであれば、こういった実装は goroutine と channel を使いスコープを分割させる事で実装してきました。 package main func iter1[T any](a []T) func() (T, bool) { ch := make(chan T) go func() { defer close(ch) for _, v
はじめに 半月ほど前に、ようやく自分の VPS 環境で動いているものすべてを kubernetes クラスタに移行しました。とても満足感が高くやって良かったと思っています。 ウェブサーバ、メールサーバ、Nostr のリレーサーバや Nostr/Bluesky/Twitter で動かしている各種 bot もすべて kubernetes です。 昨日は knative を導入したので、Go や Rust や Ruby や Python や、いろんな言語のクラウドネイティブアプリを簡単に実行できる様にしました。 knative 便利 残念ながら knative は helm パッケージとして提供されていません。ArtifactHub でそれっぽい物が公開されていますが、ほぼ手作業と変わりません。 おおよそ以下の手順でインストールできます。knative ではネットワークレイヤとして以下の3つが用
はじめに C言語でコルーチンを扱う方法は色々ありますが、専用の命令を専用の記述方法で実装しなければならなかったりなど、あまりとっつきやすいものではありませんでした。 今日 X/Twitter のタイムラインで見付けた neco はまさにそんな悩みを解消できる物でした。 neco とは neco はコルーチンを使った非同期 I/O ライブラリです。 コルーチン: 開始、スリープ、一時停止、再開、移譲、および結合。 同期: チャネル、ジェネレータ、ミューテックス、条件変数、および待機グループ。 デッドラインとキャンセルのサポート。 ファイルディスクリプタを使った Posix フレンドリーなインターフェース。 ネットワーク、シグナル、ランダムデータ、ストリーム、およびバッファ付き I/O の追加 API。 公正かつ決定論的なスケジューラを備えた軽量ランタイム。 高速なユーザースペースのコンテキス
はじめに この記事は Go アドベントカレンダー 2023 の最終日 25 日目の記事です。 皆さん log/slog 使ってますか。便利なのでぜひ使ってください。 slog は構造化ログを出力する為のパッケージで Go 1.21 で導入されました。これまでも zap や zerolog といったサードパーティ製のロガーを使う事で構造化ログを出力する事ができましたが、構造化ログを出力する機能が Go の標準ライブラリになりました。 slog とは 通常の log パッケージは、時刻とメッセージの単純な出力になります。
この様に指定すると3分毎に実行されます。 とても便利ではあるのですがコマンドの実行が失敗すると、冗長なコマンド実行となり得ます。cron ではコマンドの実行が失敗し続けるとメールが運営者に繰り返し送信され続けます。 crontab にコマンドが1分毎に実行される様に投入してひとまず正常起動を確認、仕事を終えて家に返ってビールでも飲んで、さぁ寝ようかなと思った頃にコマンドが失敗し始めると、朝までメールが飛び続けます。 またウェブサービスの API を呼び出す cron ジョブを投入していたらそのウェブサービスがメンテナンスに入った、なんて事もあると思います。メンテナンス中にも関わらず無限に失敗し続ける API 呼び出しはもしかしたら BAN の対象になってしまうかもしれません。 全ては cron に exponential backoff する機能がないのが問題です。 systemd tim
はじめに 今年は、SNS でありプロトコルでもある Nostr に出会いました。2023年2月の参加でしたがもう、どういった経緯で Nostr を見付けて参加したのかすら思い出せなくなってしまいました。ここ数年、X/Twitter が API という物を開発者に触らせなくなってしまいました。僕は X/Twitter が大きくなった理由の1つが、API をオープンにした事で数多くの bot やサービスがが登場した事だと思っていて、API が自由で無くなった X/Twitter をとても残念に感じています。次第に SNS に関連する何かを作るモチベーションはさっぱり無くなってしまっていました。 そんな中で見付けた Nostr はエンジニアのオアシスとでも言える SNS だと感じました。 Nostr の思想 X/Twitter は中央集権型の SNS であり、以下の様な問題を持っています。 障害
タイトルは釣りです。 この記事は Vim Advent Calendar 2023 16 日目の記事です。 はじめに みなさんは SQL はどんな環境で編集しているでしょうか? Visual Studio Code?それとも Vim?まさか Vim/Neovim の素の状態で編集していたりしませんよね? 僕はしていました。 sqls (SQL Language Server) 以前、lighttiger2505 さんが開発した sqls に少しコントリビュートしていた頃がありました。 既に public archive になってしまっていますが、機能として実用的なままです。コントリビュートしていた頃は、あくまで OSS としての興味の方が大きく、如何に機能的にしていくかだけ着目していたため、常用はしていませんでした。 あらためて常用してみる sqls の導入 Vim から sqls を使う
はじめに 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
はじめに 以前から Twitter の vim_jp アカウントでは、issue やブログ記事を bot として投稿してきました。 先日 IFTTT が Twitter 連携を有料化した事で、RSS/Atom から Twitter に投稿する事が無償ではできなくなりました。 feed2twitter しょうがないので RSS フィードから Twitter に投稿するプログラムを書きました。 cron で動かす想定です。僕は Oracle Cloud の Kubernetes クラスタの cronjob で動かしています。configmap と cronjob の YAML を書けば動きます。コンテナイメージも 5.8MB と小さく、複数のフィードを異なる Twitter アカウントで投稿する時でも同じコンテナイメージを使い回せるので割と便利かも。PostgreSQL を使って既存のリンクを
俳句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
はじめに 検索システムを作る時に、ちょっとした揺らぎがあってもマッチさせたい要件があります。例えば「こんにちわ」と入力されても「こんにちは」を候補として出したい場合もあります。 そんなケースでは文字列距離アルゴリズムを使います。実用されている身近な例としては、git コマンドで checkout をタイプするつもりで chekcout とタイプした時に出るアレです。 $ git chekcout git: 'chekcout' is not a git command. See 'git --help'. The most similar command is checkout あれもこれからご紹介するレーベンシュタイン距離を使って実装されています。 文字列距離いろいろ 単純に文字列距離アルゴリズムといっても沢山あります。 ハミング距離 長さが同じ文字列の異なる部分をカウントする事で文字列
はじめに 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 :=
はじめに 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
はじめに TinyGo も割と名前が知られる様になってきていますが、難しいと思っておられる方もいそうなので、TinyGo を使って Raspberry Pi Pico の Lチカ をする最小手順を書いておきます。 本当に簡単です。 Raspberry Pi Pico を買う Switch Science さんで買って下さい。スタバでコーヒー1回我慢したら買えます。 接続 ブートセルボタンが付いていて、押しながら Windows PC と USB 接続するとエクスプローラが起動します。ここに uf2 という形式のファイルをブッ込みます。 通常の言語のツールキットでは、まず Linux elf 形式で実行モジュールを作成し、elf2uf2 というツールを使って elf 形式から uf2 に変換、それをエクスプローラからコピーするのですが、TinyGo は便利なので、この転送モードの最中に以下を
はじめに 先日 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; }, }); }
#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
はじめに 最近 Deno 遊びが楽しくなってしまった mattn ですこんばんわ。TypeScript は好きだけど node_modules に嫌気がさしてしまい、Deno に逃げてしまったのですが今は Deno が楽しくて仕方ないです。 Deno の良さ 僕が思う Deno の良さは以下の3つ node_modules が無い 余計なセットアップ無しに TypeScript が書け実行できる 危険なライブラリは許可しないと実行されない 最近は Cloudflare Workers や Deno Deploy でオレオレ Gyazo を作って遊んでいます。 既に deno.land にも沢山のライブラリが公開されているので、まだ Deno やった事がない人でもそんなに困らないと思います。 自作モジュールを作ってみた みんな Deno モジュールを作ってる、作ってないのはお前だけ そんな声
Internet Explorer が 27 年の歴史に幕を閉じました。 長く Internet Explorer に苦しめられてきた と沢山の思い出を作ってきたので、なんだか寂しい様な、懐かしいような、そんな気持ちです。 もしかしたら今後、またあの e のマークに会いたい、そんな風に思える日がくるかもしれませんね。今日、ちょっと寂しくなったので以下を実行してみました。
次のページ
このページを最初にブックマークしてみませんか?
『mattnさんの記事一覧』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く