xshoji's blog

Exploring tech and sharing personal insights

xshojiの気になるトピックをまとめるブログ

Backend Engineer Tokyo, Japan Tech & Insights

Zed: キーボードのみで矩形選択できるようにする設定

普段、 VSCode でテキスト編集しているんですが、本当に若干ですが “もっさり” するんですよね。 私は普段 memo.txt と言うファイルにあらゆるメモを保存しているんですが、ちょっとしたメモを保存するのに VSCode を起動しようとすると、ほんの一瞬待たされるのでそこがストレスになっています。

そこで、最近 Zed エディタを試しているんですが、 Zed は非常に軽量で起動も一瞬ですしサクサク動きます。 今回は、そんな Zed エディタでキーボードのみで矩形選択(カラム選択)できるようにする設定方法を紹介します。

続きを読む

OpenCode の GitHub Copilot 連携機能が正式サポートされたので仕組みを再確認してみた

以前

OpenCode の GitHub Copilot 連携機能の仕組みを読み解く(注意点あり) | xshoji’s blog
https://blog.xshoji.com/posts/20260106_opencode-github-copilot-integration-spec/

こちらで記事にした OpenCode の GitHub Copilot 連携機能ですが、2026年1月16日に公式にサポートされたと発表がありました。

ということで、改めて OpenCode の GitHub Copilot 連携機能が以前とどう変わったのか再確認してみました。

続きを読む

BetterTouchTool: キーシーケンスによるスニペット入力機能が突然動作しなくなったが、OSアップデートで解決した話

はじめに

普段BTTを愛用していて、キーシーケンスによるスニペット入力をよく使います。 これは、たとえば

  • ;now とタイプすると 2026-01-17(土) 02:36:13 と展開される

といったものです。 こういった単純なスニペット展開から、最近だとAIへのプロンプトを呼び出したり大変便利です。

そんなキーシーケンスによるスニペット入力機能ですが、数日前まで普通に使えていたのに、ある日突然動かなくなりました。

設定は一切変えていないし、macOSも普段どおり使っているだけです。それなのに、トリガーが一切発火しない。

最初は「まあBTTだし、たまにあるよね」くらいの気持ちで調査を始めたのですが、結果的にこれはググっても、SNSを見ても、ほぼ辿り着けない系の不具合でした。

この記事では最終的にどうやって答えに辿り着いたのか、その流れをネタとして書き残しておきます。

続きを読む

Go 標準の flag パッケージのテクニック集その2: ロングオプションへ対応する

Go 標準の flag パッケージのテクニック集その1: Usageを綺麗に整形して見やすくする | xshoji’s blog

の続きです。前回は、Go 標準の flag パッケージで Usage を綺麗に整形する方法を紹介しました。 Usage は見やすくなったのですが、次の要件として、ロングオプションを扱いたい、というのがあります。

Unix系のコマンドラインツールでは、一般的にショートオプション( -f のような1文字のオプション)とロングオプション( --file のような複数文字のオプション)の両方をサポートしていることが多いです。 Go 標準の flag パッケージは、 任意の文字列をフラグ名として定義できるので、ショートオプションとロングオプションの両方を実装上定義することは可能ですが、それらが同じ意味のオプションであることが Usage からは伝わりづらいので、そのままではとても使えません。

前回紹介した有名な spf13/cobraurfave/cli といったフレームワークを使えば簡単に実現できるのですが、 今回はあえて main.go のみで実装することにこだわりたかったため、Go 標準の flag パッケージだけでロングオプションを扱えるようにする方法を試行錯誤してみました。

多少複雑ですが、実用的な実装ができたので、今回はその実装方法について紹介したいと思います。

注意: この記事で紹介するスニペットは Go 1.18以上(Genericsを使用するため) が必要です

続きを読む

VSCode: Copilot Chat のペインで上下キーでの履歴移動とEnterキーでの送信を無効化して使いやすくする

VSCodeの Copilot Chat のペインでAIへ指示する際、イラっとする動きをすることが2点ほどありました。具体的には

  • 上下でカーソル移動する際に、1行目で↑キーを押すと前に送信した文章が表示されてしまう(履歴移動になる)
  • まだ入力中なのに間違えてEnterで送信してしまう

という点です。今回はこれらの解消方法を見つけたので紹介します。

続きを読む

OpenCode の GitHub Copilot 連携機能の仕組みを読み解く(注意点あり)

[ ! ] 2026-01-16(金) 追記

OpenCode on X: “OpenCode can now officially be used with your Github Copilot subscription …”
https://x.com/opencode/status/2011790750543983072

にある通り公式に GitHub Copilot 連携がサポートされたようです。 こちらの記事は、公式連携がサポートされる前にどのように OpenCode が GitHub Copilot 連携を実現していたのかの調査の記録として残しておきます。

はじめに

Claude Code の OSS 版と言われている

OpenCode | The open source AI coding agent
https://opencode.ai/

が話題になっています。 私は普段 GitHub Copilot を利用しているのですが、この OpenCode は GitHub Copilot との連携に対応しています。 …となると、 Claude Code を使わずとも、 OpenCode を使えば、追加料金なしで Claude Code っぽい環境を手に入れられるのでは?と思い、興味が湧きました。

ただ、利用する前に一点気になることがありました。 それは、 GitHub Copilot って 3rd パーティ製アプリに対して Copilot を使った操作の API を公開してない認識だったので、どのように連携してるんだろう?という点でした。 この部分について調べてみたところ、興味深い点と少し注意が必要な状況であることがわかったので、 今回はその内容について共有したいと思います。

続きを読む

Go 標準の flag パッケージのテクニック集その1: Usageを綺麗に整形して見やすくする

業務でちょっとした検証用のツールや、調査用のコマンドラインアプリケーションを Go 言語で作成することがよくあります。 基本自分しか使わないのですが、何かきっかけでスクリプトを他の人に配ることもあり、このとき main.go のみで完結するようにしておくと、人に配るときや何らかの証跡と一緒に残しておく際もテキストファイル一つ渡せば済むので大変便利です。 また、配布先の人がビルドする時もトラブルが少ないです。 このため、外部のライブラリが必ず必要という状況でない限りは、できるだけ Go 標準ライブラリだけでツールを作成するようにしています。

ただ、Go 標準の flag パッケージはコマンドライン引数のパースを簡単に実装できる反面、 Usage の出力があまり綺麗ではなかったり、ロングオプションを扱うのが難しいなど色々使い勝手が悪い部分があります。 先ほど説明した通り、 main.go のみで実装することにこだわりたかったため、これまで、 spf13/cobraurfave/cli のような外部ライブラリを使わずに、どうにかして Usage を綺麗にしたり ロングオプションを扱えるようにしたりできないか試行錯誤したので、その実装方法について何回かに分けて紹介したいと思います。

今回は「 Usage を綺麗に整形して見やすくする 」方法について紹介します。 ここで紹介する方法(以降、呼びやすさのために「 Custom Usage 」と表現します)を使うと、標準の flag パッケージだけで以下のような綺麗な Usage を出力できるようになります。

$ go run main.go -h
Usage: main [OPTIONS]

Description:
  A sample command demonstrating simple template usage in Go CLI applications.

Options:
  -f <string>      (required) File path
  -d               Debug mode
  -l <int>         Index of line (default 10)
  -u <string>      URL (default "https://httpbin.org/get")
  -w <duration>    Duration of wait seconds (e.g., 1s, 500ms, 2m) (default 1s)

Go 標準の flag パッケージだけにしては結構見やすくなっているのではないでしょうか? 興味があれば、ぜひ詳細を読んでみてください。

続きを読む

BetterTouchTool: グローバルなキーボードショートカットで固定のテキストファイルをVSCodeで開けるようにする

Macを使い始めた頃から、 BetterTouchTool (BTT) をフル活用していて、これなしでは生きていけない体になっています。色々カスタマイズして使ってますが、今回はグローバルなキーボードショートカットで特定のテキストファイルをVisual Studio Codeで開けるようにする方法を紹介します。

これ、何に使うの?って話なんですが、私はいつもデスクトップに memo.txt というファイルを置いておいて、そこにちょっとしたメモを書いたり、文章の調整や頭の中を整理したりするために使っていて、頻繁に参照/書き込みします。いつもはこのファイルを開きっぱなしにしておいてアプリ切り替えでウィンドウをアクティブにする方法だったのですが、ふとBTT使えばグローバルショートカットでどこからでも簡単に開けるんじゃ?と思い、試したところ実現できたので紹介しようと思います。

続きを読む

Ghostty の設定を別ファイルで管理し、Gitでバックアップ・同期しやすくする方法

最近流行ってるターミナルエミュレーター Ghostty を使い始めました。設定をテキストでカスタマイズできるのがとても魅力的です。ただ、 Settings から直接設定を書き換える方法だと、アプリが管理してるデフォルトの設定ファイルへ内容が書き込まれてしまうため、バックアップや他の端末との同期が困難です。

そこで今回は、 config-file という設定項目を使った Ghostty の設定管理方法を紹介します。 具体的には、以下のような構成にすることで、カスタマイズした Ghostty の設定を別ファイル管理にし、そちらをGit管理にすることでバックアップや他端末と簡単に同期させられるようにしています。

デフォルトのGhostty設定ファイル
→ 「カスタム設定ファイル」へのファイルパスを指定

カスタム設定ファイル(Git管理下に置く)
→ 具体的なカスタマイズの設定内容を記述
続きを読む

Wayback Machine で過去のページを手軽に確認できる Bookmarklet

調査や資料集めの際、手元にあるURLにアクセスすると

  • 過去に見れていたページが消えている
  • ページの内容が変わってしまっている

といった事がよくあります。 そんな時に便利なのが Wayback Machine です。 Wayback Machineは過去に保存されたWebページのスナップショットを閲覧できるサービスです。

で、Wayback Machineにアクセスして、URLを入力して、過去のスナップショットを探せば話は終わりなんですが、若干面倒です。もっと手軽にできないかと思い、めっちゃシンプルなBookmarkletを作成しました。

このBookmarkletをブラウザのブックマークバーに登録しておくと、閲覧中のページのWayback Machineのスナップショット一覧ページをワンクリックで開けます。

特に、スマホで記事を見たときに「あれ、前と内容が違う?」と思ったときにすぐに確認できるのが便利です。

続きを読む

Macの画面録画を右クリックから簡単にエンコードできるようにするTips

自作のツールの動きを見せたい時や、動作の証跡を残したい時などにMacの画面録画機能で動画を撮ることがあります。ただ、Macの録画機能で撮影された動画はそのままだと結構重いので、SlackやGithubに載せるとなるとエンコードしないとそのままでは扱いづらいです。ターミナルからコマンドを思い出して、ffmpeg等でエンコードすれば良いのですが、できればもっと簡単にサクッとやりたいです。

そこで今回は、Macで画面を録画した後、その動画ファイルの右クリックメニューからサクッとエンコードしてお手軽にデモ動画を作る方法を紹介します。

そもそもMacならデフォルトで右クリックからエンコードできるんじゃないの?

と思った方。その通りです。なので、エンコードにこだわらない場合は、この記事の方法を使う必要はありません。ただ、この記事の最後にMac標準の方法でエンコードした場合とのサイズ比較を載せてますが、HandBrakeCLI等のツールでエンコードした方がより高圧縮で画質も良いのでこの記事で紹介する方法も覚えておくと良いと思います。

準備するもの

  • エンコーダー(ffmpeg, HandBrakeCLIなど)
  • Automatorによるクイックアクション
  • 画面録画した動画ファイル

それぞれ順番に説明していきます。

続きを読む

Webページをスマホ向けのデザインに最適化する Bookmarklet

普段 iPhone を使っていて、Safari でブログをよく読むのですが、スマホ向けに最適化されていないページがまだ多く、見にくいと感じることがよくあります。 Safari には「リーダー表示」という機能があり、記事本文だけを抽出して見やすく表示できますが

iPhoneのSafariで記事を読んでいるときに気をそらすものを非表示にする - Apple サポート (日本)
https://support.apple.com/ja-jp/guide/iphone/iphdc30e3b86/ios

リーダー表示に対応していないページもあります。また、リーダー表示にしても、コードブロックや文中の変数のスタイルがわかりにくく、痒いところに手が届かないと感じることがあります。

そうした悩みがあり、スマホ向けに最適化されていないページを見やすくする Bookmarklet(ブックマークレット)を作成しました。 今回は作成した Bookmarklet の紹介と使い方を説明します。

続きを読む

VSCode: ショートカットキーのみでAIに指示を送る方法

VSCodeで、AIに送る指示をテンプレートにしてショートカットに設定する方法を紹介します。 この方法を活用すると、文章やコードを選択してショートカットキーを押すだけで…

  • AIに英訳を生成させられる
  • メソッド単位のリファクタリングを行わる
  • 簡単なコードレビューを依頼できる

といったことが可能になります。最近は、プロンプトのmarkdownファイルを所定の場所に設置し、Chatからコマンドで呼び出す方式が一般的だと思いますが、ここで紹介するのはそれよりもさらにお手軽な使い方ができる方法となります。

この後の説明では

ショートカットキーのみでAIへ英訳の指示を出す設定

を例として設定方法を紹介していきます。また、AIは Github copilot を使います。

続きを読む

Postmanのエクスポート機能が廃止された件(とその解決策)

はじめに

APIの開発で

Postman API Platform | Sign Up for Free
https://www.postman.com/

を使っていて、最近PC入れ替えを行う際、このPostmanのバックアップ機能(エクスポート機能)が消えていて大変困ったため、 何が起こっていたのかなど、Postman側の経緯や、この対策などについてまとめます。

続きを読む

Goのバイナリにソースコードをそのまま同梱するという提案

はじめに

業務でGoのスクリプトを書いて、バイナリをチームに配ることがよくあります。 Goでコンパイル済みのバイナリを配るメリットとしては

  • 実行環境に依存せずどこでも実行できる

という点かなーと思います。 ただ、デメリットもあって、それは実行するバイナリがどのソースコードから生成されたものか分かりづらいという点です。

続きを読む

単体テスト ベストプラクティス集

Modern Best Practices for Testing in Java
https://phauer.com/2019/modern-best-practices-testing-java/

テスト時に何気なく気をつけている事が根拠とともに具体的に示されていて、 自分自身がテストする時はもちろん、コードレビュー時でも注意・指摘したい内容がまとめられています。

タイトルには「Java」と書かれていますが、プラクティスとしては言語に依存しない内容がほとんどなので、 特定の言語に限らない有益なプラクティスだと思いました。

それでは、それぞれの中身をまとめていきます。

続きを読む

Hugo + GitHub Pagesで作る無料ブログサイト構築(2020年版)

Hugo + GitHub Pagesでこのブログを運用していて、以下の要件を目指しました。

  1. お金をかけないこと
  2. Markdownで記事を書けること
  3. ブログの静的データのみ公開し、元ネタは公開しないこと
  4. 記事の更新/反映が自動化されていること

似たような要件でブログを作ってみたい人に向けて、構築の流れを紹介したいと思います。 初心者向けに細かく説明しているので若干長いと思います。

以下にリンク付き目次を載せておくので、 興味があるトピックだけつまみ食いしてもらう読み方のほうが良いかもしれません。

続きを読む

スマホにおける広告の新しいターゲティング手法について

Companies can track your phone’s movements to target ads | Ars Technica
https://arstechnica.com/information-technology/2020/09/companies-can-track-your-phones-movements-to-target-ads/

が元の記事。

広告業界では、トラッキング方法の話題が結構熱くて、最近iOS14で適用される(※2021/9に延期になった)ユーザーのトラッキング機能のデフォルトオプトアウト (ユーザーに「あなたのこと追跡するけど、いいよね?」(はい/いいえ)みたいな許可を明示的に得ないと、デフォルトでトラッキングができなくなる)や、 Google Chromeのトラッキング用のクッキーの段階的な廃止など、個人のプロファイルに基づくトラッキングができなくなってきています。

続きを読む

SQLインジェクションフィルタを回避するためのアプローチ

Astrocamel - Blog/Portfolio of George Skouroupathis
https://www.astrocamel.com/web/2020/09/04/how-i-bypassed-cloudflares-sql-injection-filter.html

が元の記事で、さらっとまとめると

Cloudflareを使ってるサイトの脆弱性試験しようとしたら、そもそもサイトまでリクエストが届いてないことが判明
CloudflareのWAFで弾かれてるっぽいから、SQLのリクエスト難読化したら無事突破できたよ

って話です。この機能を回避するアプローチが面白かった。 ここでいう「難読化(obfuscation)」っていうのは、 SQLの意味はそのままに、Cloudflareのフィルタをパスできるクエリの加工のことのようです。 (CDNのレイヤで、リクエストの中身まで見て攻撃を防ぐみたいなことしてるの知らなかった・・・。)

続きを読む