Small String Optimization で Rust ライブラリ ratatui を最適化した話

最近 ratatui という crate に Small String Optimization を利用した最適化を入れたので,その話を書きます. 目次 Small String Optimization (SSO) とは(SSO を既に知っている人は読み飛ばして大丈夫です) Rust で SSO を適用した文字列型を提供する cr…

えっちな grep をつくった

H(uman-friendly) な grep コマンド hgrep をつくりました. github.com '\w+ で検索した時の出力 ファイルを特定のパターンで検索し,マッチした箇所を構文ハイライトしたコード片で表示します.超ざっくり言うと,ripgrep で検索して bat でマッチ箇所付近…

actionlint v1.4 → v1.6 で実装した新機能の紹介

前回の actionlint の記事 GitHub Actions のワークフローをチェックする actionlint をつくった からちょうど1ヶ月経ち,今日 v1.6.0 をリリースしました.前回時点では v1.4.0 で,そこから v1.4.1, v1.4.2, v1.4.3, v1.5.0, v1.5.1, v1.5.2, v1.5.3, v1.6…

GitHub Actions のワークフローをチェックする actionlint をつくった

GitHub Actions のワークフローを静的にチェックする actionlint というコマンドラインツールを最近つくっていて,概ね欲しい機能が揃って実装も安定してきたので紹介します. github.com なぜワークフローファイルの lint をすべきなのか GitHub Actions が…

Go で --version の出力を実装する

Go

Go でコマンドラインツールを実装した時に $ some-tool -version のようにバージョンを出力するフラグを実装することが多いと思います.本記事はこれをどう実装するかのメモです. 手動でバージョン情報を管理 素朴にはバージョン情報を定数で持って手動で管…

Go Fuzzing beta を go-yaml/yaml.v3 で試してみた

Go の fuzzing のプロポーザルについてツイートしていたら,Kaoriya さんに すでにbeta段階まで来ててちょうど昨日ブログ記事がでてました。go test -fuzzらしいです。https://t.co/HhKR1r1lUz— MURAOKA Taro (@kaoriya) 2021年6月4日 と教えてもらったので…

Rust で Profile-Guided Optimization やってみた

TLDR Rust で実装した Wasm インタープリタで PGO 試したら 0〜10% ぐらい速くなった Profile-Guided Optimization (PGO) とは PGO はコンパイラの最適化の手法のうちの1つですが,プログラムを実行した後に行うという点で少し他と異なります. まずは普段ど…

GitHub Action で Vim や Neovim を簡単にインストールできる action-setup-vim をつくった

今週ちまちまと git-messenger.vim や clever-f.vim の CI を GitHub Actions に移行していました.毎回 Vim プラグインの CI のために Vim や Neovim のセットアップを書くのが面倒なのと,Windows 上で Vim や Neovim を入れるのが(Powershell に不慣れな…

GitHub Actions の JavaScript Action を TypeScript で書いた

GitHub Action を TypeScript で作成したので,覚え書きがてらどうやって作ったかについて書きます. github-action-benchmark という Action をつくりました. 紹介記事:継続的にベンチマークを取るための GitHub Action をつくった Action とは 今年9月に…

継続的にベンチマークを取るための GitHub Action をつくった

今年9月に GitHub Action v2 がリリースされました.GitHub Action は GitHub が提供する CI/CD サービスです. 既存のサービスと大きく違う点は,処理を汎用的に Action として切り出して再利用できることです. 例えば,GitHub からのリポジトリのクローン…

ターミナル用 UTF-8 テキストエディタを Rust でスクラッチからつくった

言語処理系やテキストエディタなどのプログラミングツールが好きなので,その周辺を趣味で触ってます.Vim を Wasm にポートするために Vim の実装を読んだりはしているのですが,フルスクラッチでテキストエディタをつくったことはありませんでした. 今年…

目黒.vim #16 に参加して Vim script に const を実装するパッチを書いた

Vim

あいにくの雨でしたが,Meguro.vim #16 に参加しました. 「この雨の中 Vim のもくもく会に来た者たちだ.面構えが違う」 #megurovim— ドッグ (@Linda_pp) June 15, 2019 目黒.vim は Vim に関したり関しなかったりする作業をするもくもく会で,今回は Vim …

Vim on Wasm on Web Worker on Browser with Atomics

この記事は以前の rhysd.hatenablog.com の続編で,WebAssembly (Wasm) にポーティングした Vim の話です. github.com TLDR Wasm にコンパイルした Vim のコードを Web Worker(ワーカスレッド)の中で動かすことで,メインスレッドで行われるユーザのイン…

Neovim のフロートウィンドウ機能を使って git-messenger.vim をつくりなおした

git-messenger.vim は,カーソル下の行のコミット情報を表示する Vim プラグインです. github.com 他所のプロジェクトのコードや OSS のコードを読んでいると,なぜこうなってるんだろう?と思うことがよくあります.コミットメッセージをまともに書いてい…

Rust 公式 linter の clippy に新しいルールを実装した

Rust 公式の linter,clippy に新しいルールを足すプルリクを出してマージされた時のメモです. github.com dbg! マクロ Rust 1.32 で dbg! というマクロが追加されました. これは値を1つ引数にとってその値を返すマクロで,受け取った値とソースコード上で…

Vim の構文ハイライトでクリスマスツリー🎄を飾ってメリクリする

Vim

Vim Advent Calendar 2018 の24日目の記事です.昨日は Kaoriya さんのVim に VOICEROID で喋らせたでした. もうすぐクリスマスなので,クリスマスツリーを飾りたいと思います.ただ飾るだけだと Vim のネタにならないので,Crystal や Wast,vim-gfm-sytna…

GitHub Actions (beta) が使えるようになったので調査した

GitHub Actions Open Beta に申し込んで1ヶ月以上経ち,ようやく使えるようになったみたいなので実際にどう使うのか調査してみたメモ. Beta 版は GitHub のプライベートリポジトリにしか使えないため,公開リポジトリに使うにはもう少し待つ必要がありそう…

Rust プロジェクトで自動で Git hook をセットできる cargo-husky をつくった

npm でよく使っている husky というツールがあります.これは npm install などを hook して Git hook を自動でセットしてくれるツールで,リモートにプッシュする前のチェックを強制してくれます.もちろん CI でもテストを回しているのですが,プッシュ前…

Vim に WebAssembly のテキストフォーマットのサポートを入れた

Vim に WebAssembly のテキストフォーマット (wast) の対応を入れ,同時に filetype=wast で使われるファイルのメンテナになりました. Wasm のテキストフォーマットとは WebAssembly にはバイナリ形式とテキスト形式の2つのフォーマットがあります.Wasm は…

Vim を WebAssembly に移植した

久々のブログです. 6月ぐらいにWebAssembly の仕様をざっくり読んだので,なんか WebAssembly でやりたいなと思って,Vim を WebAssembly に移植してブラウザで動くようにしてみました,という話です. github.com 多分実物を見ていただくのが一番早いので…

React で Octicon を使うためのコンポーネントライブラリ書いた

Octicons は GitHub がオープンソースで配布しているアイコンセットです. Octicons は以前はウェブフォントを利用してつくられていたのですが,最新のnpm の octicons パッケージの中身を見る限りでは,最近では SVG での配布になったようです. 以前は cla…

GitHub のプルリクで blame する ghpr-blame.vim つくった

先日 kazuho さんが git blame でプルリクを表示するスクリプトをつくってらっしゃって,便利そうだったので Vim プラグインをつくってみました. ファイルの各行がどのプルリクで変更されたかを確認し,気になるプルリクはその場で詳細を確認することもでき…

Goのコマンドラインツールをセルフアップデートするためのライブラリつくった

突然ですが,Goでコマンドラインツールを書く時,ツールの配布はどうしているでしょうか? go get でインストールできるようにする GitHub 上にリリースして,ダウンロードして使ってもらう システムのパッケージマネージャ(Homebrew など)を使う などがメ…

Vim script で ES6 Promise 実装した

Vim Advent Calendar 2017 の19日目の記事です.Vim script で ES6 の Promise を実装した話を書きます. もし Vim script が分からなくても,最後の章「Promise の実装の詳細」は Vim script とは独立した内容になっているので,Promise の実装に興味があれ…

OCaml でも採用されているレベルベースの多相型型推論とは

言語実装 Advent Calendar 2017 の16日目の記事です. GoCaml という OCaml のサブセットな言語を実装していて,多相型の型推論を実装するために論文を読んだり OCaml の実装をちょっと追ったりしていたので,その知識を整理する意味でこのエントリを書いて…

Vim 進捗旅行

Vim

木曜日午後〜日曜日午前中の4日間,Vim コミュニティつながりの知人と旅館に泊まり込んでもくもく作業する合宿的な旅行に行ってきました. 当日の様子や旅館の便利情報についてはすでにブログ記事にまとめられているのでそちらを読んでいただいて,この記事…

LLVM IR の alloca 命令のつかいかた

LLVM IR の alloca 命令の使い方について,リファレンスマニュアルに載ってない注意点があったのでメモがてら書きます. alloca 命令とは スタック上にメモリを確保し,確保した領域の先頭へのポインタを返します.スタック上にメモリを割り付けることでアド…

Electron に Mac タッチバー API が実装された

個人的に気になっていた Electron のタッチバーサポートがついに master にマージされました. 実装は下記の PR で行われ,@MarshallOfSound さんの初期実装と @kevinsawicki さんのブラッシュアップで実装されました. https://github.com/electron/electro…

GitHub のハイライトがおかしい時のなおしかた(GitHub のハイライトの仕組み)

GitHub でコードを見ていると,ハイライトがおかしいのを見つけることがたまにあります.ここではその直し方を紹介します. 次の2パターンを想定しています. 自分のリポジトリのあるファイルのハイライト言語がおかしい 構文ハイライトが間違えている,言語…

Travis CI で Linux (x86_64, i686, aarch64) 向け(とついでに macOS 向け)に Rust で書いたツールのバイナリをリリースする

git-brws のリリース で微妙に Travis CI 上の rust 環境でハマったのでメモ. 前提として,cargo build でビルドできるものとします.Travis の環境はツールチェーンが古いと困るので Ubuntu 14.04 を使ってます.今回は下記の環境向けのバイナリをビルドし…