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

  • もっと log/slog を使おう

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

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

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

    cron で exponential backoff するツール作った
    yug1224
    yug1224 2023/12/24
  • 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 を素で編集してるの?
    yug1224
    yug1224 2023/12/21
  • Nostr の面白さをエンジニア目線で解説してみる

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

    Nostr の面白さをエンジニア目線で解説してみる
    yug1224
    yug1224 2023/12/16
  • 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 で稼働させた
    yug1224
    yug1224 2023/05/05
  • 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 に変換するテクニック
    yug1224
    yug1224 2022/12/25
  • 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 ライブラリを書いた。
    yug1224
    yug1224 2022/08/18
  • 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チカ
    yug1224
    yug1224 2022/08/16
  • 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 パーサを書いてみた。
    yug1224
    yug1224 2022/07/12
  • Internet Explorer に会いたくなったら...

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

    Internet Explorer に会いたくなったら...
    yug1224
    yug1224 2022/06/16
  • Sleep FizzBuzz

    Twitter で散歩していたら、昨日こんなツイートを見付けました。 コードはこんな感じ。(ツイート主がメンションで修正している内容を反映済み) use std::{ thread::{self, sleep}, time::Duration, }; fn main() { thread::spawn(|| { sleep(Duration::from_millis(2100)); loop { print!("Fizz\x1b[K"); sleep(Duration::from_secs(3)); } }); thread::spawn(|| { sleep(Duration::from_millis(4200)); loop { print!("Buzz\x1b[K"); sleep(Duration::from_secs(5)); } }); for i in 1.. { print

    Sleep FizzBuzz
    yug1224
    yug1224 2022/02/10
  • bash スクリプトの実行中上書き動作について

    を設定してから再度試した所 bar が表示された。backupcopy は編集中のファイルによって自動で判別する auto がデフォルトになっている為、試す際には明示的に yes に設定しないといけない。 bash の実装確認 evalstring.c の parse_and_execute でコマンドが処理されており、input.c の with_input_from_buffered_stream で読み込みの準備が行われている。バッファの読み込みの体は y.tab.c つまりパーサから直接呼ばれており、このパーサは fgets(3) で読み込まれつつ実行される為、一括でファイルが読み込まれている訳ではない。 while/do でループ実行した際に、ファイルを書き換えられたら戻り先はどうなるか、についてはスクリプトはバッファ付きで読み込まれており、そのバッファがファイルシステムから読

    bash スクリプトの実行中上書き動作について
    yug1224
    yug1224 2021/12/29
  • StreamDeck をカメラモニタにしてみた。

    この記事は Go Advent Calendar 2021、24日目の記事です。 はじめに みなさんは StreamDeck をご存じでしょうか。 StreamDeck は数々のアクションを起動することができるLCDキーを搭載したデバイスで、シーンを切り替える、アプリケーションやメディアを起動する、オーディオを調整する、などの操作をキーボードショートカットをマッピングしたり記憶する必要が無くなる便利な物です。主に YouTuber の皆さんが使っている事が多い様ですが、エンジニアの皆さんがエディタやブラウザを起動したり、特定の業務をボタン1つで実行するなど、便利に使っておられる様です。 さて 2021 年、僕は GitHub Stars に選ばれました。色々なプレゼントGitHub 社から頂いたのですが、その中に StreamDeck がありました。 一応 StreamDeck の存

    StreamDeck をカメラモニタにしてみた。
    yug1224
    yug1224 2021/12/24
  • GNU CoreUtils の sleep は infinity が指定できる

    どうやら inf と infinity の両方が指定可能らしい。CoreUtils のソースを適当に検索してみようと GitHub から検索してみたけど、それっぽいものが引っかからない。 こりゃ調べないと分からないなと思って git clone した。こういうの気になりだすと、ちゃんと分かるまで気になって眠れなくなる病気です。 スタート地点は coreutils/src/sleep.c for (int i = optind; i < argc; i++) { double s; char const *p; if (! (xstrtod (argv[i], &p, &s, cl_strtod) || errno == ERANGE) /* Nonnegative interval. */ || ! (0 <= s) /* No extra chars after the number a

    GNU CoreUtils の sleep は infinity が指定できる
    yug1224
    yug1224 2021/11/12
  • ls -l はなぜ事故を起こすのか

    はじめに この記事は以下の記事で事故がなぜ起きたかを技術的に理解し筆者のtipsを共有しようと思い書きました。あくまで筆者のtipsですので、これが正しいとは限りません。 やはり、下記のコマンドが原因でした。 [root@foo script]# ls -l | sh 事故そのものは ls コマンドに -l を付けて実行してしまった事で、ls コマンドが出力したシンボリックリンクが以下の様になってしまったという話です。

    ls -l はなぜ事故を起こすのか
    yug1224
    yug1224 2021/04/07
  • vimrc の分割管理を上手くやる 2020年版

    筆者の環境について Vim にはプラグインマネージャも沢山あります。その中で僕は vim-plug を使っています。Software Design という雑誌で「Vim の細道」という連載をやっている事もあり、皆さんに一番リーチしやすいプラグインマネージャを選んでいるという事もありますが、基は「トラブルが発生しづらい」という理由で使っているのもあります。 vimrc の分割管理 ところで最近は Vim プラグインが沢山あり、個々に設定が必要な場合もあります。全て vimrc の中に書いてしまうのも良いのですが、そうするとどこからどこまでが、どのプラグインの設定か分からないといった問題が起きてしまいます。僕は vimrc をプラグイン毎に分割して管理しています。 Big Sky :: ぼくがかんがえたさいきょうの Vim のこうせい 2019年 年末版 " Vim 体の機能のデフォルト値

    vimrc の分割管理を上手くやる 2020年版
    yug1224
    yug1224 2020/11/07
  • CtrlP に出戻りした

    はじめに Vim でファジーファインダといっても沢山ある訳ですが、皆さんはどれを使ってるでしょうか。 CtrlP fzf.vim denite vim-fz そもそもファジーファインダ使わず netrw そもそもファジーファインダ使わず NERDTree そもそもファジーファインダ使わず dirvish そもそもファジーファインダ使わず fern その他 いろいろあります。それぞれに特徴があり、自分の好きな物を使っておられると思います。個々の特徴を知りたい方は @yutakatay さんが良い記事を書いてくれているのでそちらをご覧ください。 まず昔話を聞いて欲しい 僕はもともと CtrlP を使っていました。CtrlP は kien 氏が開発した Vim プラグインで、Vim script のみで実装された高速なファジーファインダです。 意外と知られていない便利なvimプラグイン「ctrl

    CtrlP に出戻りした
    yug1224
    yug1224 2020/09/25
  • 1