2023年を振り返って

サイボウズに入社して二年が経ちました。 プロダクトのインフラ基盤の移行に携わりながら、チームの生産性を向上させる様々な取り組みを行っていました。 特にCircleCIからGitHub Actionsへの移行はかなりコミットしました。 色々な知見が溜まったのですがア…

Mackerel REST APIの公式Goクライアントをジェネリクスを使ってリファクタリングしました

この記事はMackerel Advent Calendar 2023の20日目です。 昨日はsfujiwaraさんでした。 先日15日目の記事で、私が作ったRustクライアントmackerel-client-rsの設計についてご紹介しました。 itchyny.hatenablog.com クライアントの設計について色々とご紹介…

Mackerel REST APIのRustクライアントで取り入れた設計

この記事はMackerel Advent Calendar 2023の15日目です。 昨日はkmutoさんでした。 MackerelのREST APIクライアントをRustで書き始めたのは2017年の春のことでした。もう六年半も前のことになります。 2017年ごろの日記を見返してみるとRustにかなりハマって…

actions/setup-javaにcache-dependency-pathオプションを実装しました

GitHub Actionsで公式のアクションを利用するとき、依存パッケージを適切にキャッシュすることが大切です。 setup-node・setup-python・setup-javaにはcacheオプションがあり、指定したパッケージマネージャーに応じてキャッシュしてくれます。 setup-goの場…

RenovateでGitHub成果物のチェックサムを更新する

開発やビルドに必要なツールをインストールするとき、特にビルド済みの実行ファイルをインターネットからダウンロードするとき、セキュリティインシデントを防ぐためにはアーティファクトを信頼しても良いか確認しなくてはいけません。 もしGnuPGで署名され…

jq 1.7をリリースしました

jq

jqがjqlang organizationに移譲され、数名の新たなメンテナーを入れた開発体制に移行してから三か月が経ちました。 私にとってこの三か月はとても濃厚で、これまでのOSS活動の中でも特に大変な期間でした。 itchyny.hatenablog.com github.com リポジトリの…

jq が jqlang organization に移譲されました

jq

JSONを操作するコマンドラインツールであるjqは、これまでオリジナル作者であるStephen Dolan氏 (@stedolan)のリポジトリ(github.com/stedolan/jq)で管理されていました。 メンテナンスはNico Williams氏 (@nicowilliams)とWilliam Langford氏 (@wtlangford)…

YAPC::Kyoto 2023 に参加した #yapcjapan

yapcjapan.org 知り合いも多いし会場が家から徒歩圏内ということもあって参加せざるを得ませんでした。 前職はてなのプチ同窓会があちこちで発生して、色々な方と話ができて良かったです。 しかし、前職にいた時は当たり前のようにできていたようなエンジニ…

Hammerspoonを使ってエスケープキーで英数モードへ・コロンとセミコロンを入れ替える

Hammerspoonは、macOSでキー入力やウィンドウ操作をLuaスクリプティングでカスタマイズできる便利なアプリです。 特にキーマッピングを変更するhs.hotkey.bindは便利なAPIですが、デフォルトの処理も行われなくなるのでたまに困る場面があります。 例えば、e…

2022年を振り返って

今年はサイボウズに転職して一年が経ち、インフラ基盤の移行プロジェクトに参加したり、改善プロジェクトを立ち上げてリードしたりと開発チームに貢献できるようになりました。 エンジニア主導でチームを組んで改善を行う制度が導入されてから様々な改善活動…

Go言語に出したプロポーザルが通った:{bytes,strings}.ContainsFuncの追加

Go

今年の夏にGo言語に以下のようなプロポーザルを出していたのですが、それが先ほど承認されました。標準パッケージの関数追加になります。 proposal: bytes, strings: add ContainsFunc · Issue #54386 · golang/go · GitHub Go言語のstringsパッケージとbyte…

JJUG CCC 2022 Fallで『組織と技術の両輪で開発を加速させるkintoneチームの取り組み』という発表をしました

本日開催されたJJUG CCC 2022 Fallのスポンサーセッションに登壇いたしました。 speakerdeck.com 久しぶり(五年ぶり)の登壇というのと録画発表ということもあって色々と大変でしたが、無事終わってほっとしています。 他の方の発表もとても勉強になりました…

Go言語でJSONをYAMLに変換するコマンド json2yaml を作りました!

Go

JSONをYAMLに変換するコマンド json2yaml を、Go言語で作ってみました。 他の言語も含めると同じようなコマンドラインツールは無数に作られていますが、 Goのライブラリとして組み込みたかったというのが最初のモチベーションです。 また、JSONをストリーミ…

Go 1.18 で go run -mod=mod の非互換変更に気がついて報告した

Go

Go 1.18 がリリースされて一か月程経ちました。 先日 go run を (go generate経由で) 使っているコードの挙動を見ていたら、モジュール周りの挙動が Go 1.17 と異なることに気が付きました。 Go 1.16 以降、go get や go mod tidy のような一部のコマンドを…

2021年を振り返って

今年は大きな転機が訪れた年でした。六年半勤めたはてなを退職し、11月からサイボウズで働いています。開発体制の規模やプロセス、文化の違いに戸惑いながらも、楽しく働いています。モブプロを中心とする開発は新しく入社した身としてありがたいです。技術…

株式会社はてなを退職しました

本日2021年9月30日が最終出社日でした。1か月間のお休みをいただき、11月から新しい職場で働きます。2015年4月に新卒入社して、Mackerelチームとブックマークチームに所属しました。約六年半、お世話になりました。どちらのプロダクトも携わることができて楽…

Go言語の strconv.ParseFloat のとある挙動変更を見つけた話

Go

弊社のとあるGoプロダクトでGo 1.14から1.16へアップデートしたところ、プログラムの挙動が変わる問題が発生しました *1。 ドキュメントに書かれていない strconv.ParseFloat の挙動の変更を踏んでしまったのです。 package main import ( "fmt" "strconv" )…

Vim の doautoall コマンドの問題と 8.2.2596 の挙動変更について

Vim

Vimのdoautoallコマンドはいろいろな問題のあるコマンドで、私にとって悩みの多い機能でした。 しかし 8.2.2596 の変更によって問題のすべてが解決しました。 本記事ではこのコマンドの問題点とこのパッチの意味について解説します。 なおコミットメッセージ…

Pythonのstrptime %zに関するバグ報告をした

timefmt-goというGoライブラリを公開してメンテしているのですが、最近タイムゾーン周りの対応が弱いことに気がついて実装していました。タイムゾーンオフセットの表記は +0900 のようにコロンを入れないほうが一般的だと思いますが、RFC3339では +09:00 の…

Go言語のorderedmapパッケージを改善した

Go

Go言語で書かれたorderedmapというサードパーティパッケージがあります。 github.com Goのmapには順序がなく、JSONをデコードすると順序が失われ、それをエンコードするとオブジェクトのキーの順序にソートされます。 これに困る人はそこそこいるようで、順…

gojq が homebrew/core に入りました、他近況

Go

gojqはGoで実装されたjqコマンドおよびライブラリです。2019年の4月から開発を始めて、現在も様々な改善を行っています。 これまでgojqのHomebrew formulaはitchyny/tapより配信していましたが、このたび公式のhomebrew/coreに入りました。 これにより、次の…

一括リネームツール mmv でディレクトリツリーを扱えるようにした

Go

一年前、ファイルをエディターで一括リネームするmmvコマンドを作りました。 itchyny.hatenablog.com github.com mmvはリネームの依存関係を解析して順番を決定します。例えば a => b b => c というリネームを愚直に上から実行すると、ファイルbが消えてしま…

2020年を振り返って

今年はコロナ禍でリモートワークになり、生活リズムが大きく変わりました。年末も帰省を控えているため、人生で初めて実家で過ごさない正月となります。年末年始を京都で過ごすのは初めてで少しわくわくしています。仕事は担当サービスのコンテナ化やAWS化な…

Vimの古いバージョンをコンパイルし高速にbisectする (macOS編)

Vim

Vimプラグインを作っていると、特定の機能がどのバージョンで実装されたか調べるのが難しいことがあります。 ヘルプ (:h vim7, :h vim8) や git log のコミットメッセージから探せば多くのケースでは見つかるのですが、うまく検索できなくて見つからないこと…

Vimのパッチ存在確認処理を速くした

Vim

昨日Apple Eventを待機しながらVimのコードを眺めていたら、なんだか香ばしい匂いのするコードを見つけてしまいました。 /* * Return TRUE if patch "n" has been included. */ int has_patch(int n) { int i; for (i = 0; included_patches[i] != 0; ++i) i…

自分の生産性について考えてみる

組織の生産性を上げるために何かアクションを取りたいのだけど、今は何も計測できていないし、改善案も出せていない。 組織はいろいろな人が同時に動いていて難しいので、まずは自分自身の生産性について考えてみる。 自分はWFHで生産性が下がっているような…

Regexp::AssembleのGo実装 rassemble-go を作りました

Go

PerlにはRegexp::Assembleという便利なライブラリがあります。 複数の正規表現を受け取り、それらのいずれかにマッチする正規表現を構築するためのライブラリです。 my $ra = Regexp::Assemble->new; $ra->add( 'ab+c' ); $ra->add( 'ab+\\d*\\s+c' ); $ra->…

lightline.vimがGitHub 5000スター達成

Vim

先日、Vimプラグインのlightline.vimがGitHubで5000スターを達成しました。 このプラグインを世に送り出してから丸七年になりました。本当に多くの方に使っていただいており、とてもとてもありがたいことです。 設定はユーザーに書いてもらうという形のプラ…

Go言語で日時と文字列を相互変換するライブラリtimefmtを作りました

Go

Go言語でstrftime・strptime相当の関数を提供するライブラリを実装しました。 t, _ := timefmt.Parse("2020/07/24 09:07:29", "%Y/%m/%d %H:%M:%S") fmt.Println(t) // 2020-07-24 09:07:29 +0000 UTC str := timefmt.Format(t, "%Y/%m/%d %H:%M:%S") fmt.Pr…

gojqのパーサーを書き直しました

Go jq

jqはJSONを絞り込むツールですが、実はれっきとしたプログラミング言語です。 算術演算子、論理演算子、分岐構文、try・catch、そして関数定義があり、ループは再帰関数で実装します。 単に .foo とか .[0] とかでJSONを辿るだけのツールだと思われている方…