Shogo's Blog

Nov 18, 2023 - 5 minute read - qrcode go golang

URL圧縮サイトを作ってみた

QRコードへの埋め込みを前提としたURLの圧縮サービスを作ってみました。 https://c.shogo82148.com/ ソースコードはこちら。 https://github.com/shogo82148/url-compressor 背景 短縮URLを利用している企業から「短縮URLから不正サイトへ誘導される」として注意喚起のお知らせがありました。 「いなげや」QRコードから不正サイトに誘導、カード情報抜き取られる被害 原因は「短縮URL」か? QRコードから不正サイトへ誘導される事例が相次ぐ オートバックスセブン、学習院大学も 短縮URLサービス利用時に表示された悪質な広告についてまとめてみた QRコードに短縮URLが使われるのは、以下のような理由からバージョン(QRコードの大きさの)の小さいQRコードの需要があるためです。 QRコードの印刷品質や読み取り性能が低くても、確実に読み取れるようにしたい 流入元計測のための情報をURLに載せるため、URLは長くなりがち 一方で短縮URLには以下のような問題が指摘されています。 短縮URLだけではどこに飛ぶかわからない 短縮URLのサービス終了してしまうと、リンク切れになる 目的 「元のURLの情報を圧縮してURLに詰め込めばすべて解決するのでは?」と考えて作ってみました。 名付けて 「圧縮URL」 。 以下の特徴を持ったURLの作成を目的とします。 QRコードでの共有に特化する 短縮URL自体から情報を取り出せる 短縮URLのサービスが終了しても、元のURLがわかるので安心 デモ 僕のブログ記事の中でももっとも長い、以下のURLを圧縮してみます。 https://shogo82148.github.io/blog/2023/07/02/2023-07-02-update-aws-sdk-v2-with-grouped-version-updates-for-dependabot/ 圧縮すると以下のようになります。 HTTPS://C.SHOGO82148.COM/0-SLNDB9IQ9IIU.HOR1NB0QGEF7$F2QD2$9V8ONQ9V:U.D-NQ.EVYALL.H74.HID9DLHT2QV5RHV-5P-CFW7.H.DF5NU1U5M30C.AF.CP7.C.A1QXA4-DU5 Google Chart APIを使って、それぞれURLをQRコードに変換してみます。 圧縮前: 圧縮後: 小さなバージョン(QRコードの大きさ)のQRコードが生成されたのがわかると思います。 変換方法 変換方法を見ていきましょう。この手順にしたがって変換すれば、オフラインでも圧縮URLを作成できます。 例として https://example.com を圧縮します。 プロトコル部分を取り除く URLにはかならず https:// か http:// が付きます。 7〜8バイトを使うのは大きなオーバーヘッドです。 今どきHTTPS通信は当たり前なので https:// 以外は対応しないこととし、 先頭の https:// は削除します。 https://example.com → example.com ハフマン符号化を行う ハフマン符号化を使って、ビット列に符号化します。 ハフマン符号化のテーブルはちょっと長いので、付録Aとして記事の末尾に記載しました。 e: 0011 x: 100001101 a: 0000 m: 00100 p: 100110 l: 01011 e: 0011 .

Nov 9, 2023 - 2 minute read - mysql aws

Amazon Linux 2023でMySQLをパッケージングする

Amazon Linux 2023でMySQLをビルドして、RPMとしてパッケージングしたというお話です。 shogo82148/mysql-rpm-for-amazonlinux2023 背景 普段僕はAWS上での開発をメインにしているため、いろいろな場面でAmazon Linux 2023のお世話になります。 「サーバーレス」「NoSQL」なんて言葉を聞くようになって久しいですが、なんだかんだ言って踏み台サーバーのLinux環境からMySQLに接続することが多いです。 さて、そうなると問題になってくるのが「どうやってAmazon Linux 2023にMySQLをインストールするか」です。 MySQLのビルド済みのバイナリはMySQL Community DownloadsでYUMレポジトリが提供されています。 しかし、2023-11-09現在提供されているのはOracle Linux 9, 8, 7, 6、Fedora 39, 38, 37 です。 Amazon Linux向けには提供されていません。 Amazon Linux 2 ではEPEL(Extra Packages for Enterprise Linux)パッケージが提供されており、 MySQLはEPELがインストールできました。 しかしAmazon Linux 2023ではEPELのサポートはありません。 Amazon Linux 2023はFedoraベースであることが明言されていますが、 その一方で「特定のFedoraのリリースと互換性がある、というわけではない」とも説明されています。 Relationship to Fedora The Generally Available (GA) version of AL2023 isn’t directly comparable to any specific Fedora release. The AL2023 GA version includes components from Fedora 34, 35, and 36.

Oct 21, 2023 - 2 minute read - golang 1password github

1Passwordで管理しているシークレットを各種サービスに同期するプログラムを書いた

弊社では各種シークレットは1Passwordで管理しています。 シークレットの棚卸し作業をしていて不便を感じたので、 1Passwordで管理しているシークレットを各種サービスに同期するプログラムを書いてみました。 shogo82148/op-sync 背景 何が困るって、シークレットの出処がわからないこと。 たとえばCI/CDサービスのシークレット管理機能にシークレットが登録されている場合、 ヒントが FIREBASE_SECRET という名前だけ、ということがよくあります。 このヒントだけだと、Firebaseで使われていそうなのはわかる・・・でもFirebaseのプロジェクトたくさんあるんだよな、どれだろう・・・ってなります。 プロジェクト名やサービスアカウント名までわからないと、シークレットの出処を特定できません。 1Passwordにはシークレットの出処をメモとして残しておけるので、 せめて「このシークレットは、1Passwordのこの項目と対応しています」という情報が分かれば特定が簡単になります。 「シークレットと1Passwordの項目の対応付け」、ちょっとしたテキストを書くだけで十分なんですが、それができないのが人間というもの・・・。 そこでさらに推し進めて「シークレットと1Passwordの項目の対応付け」を機械可読な形式にして、「1Passwordの項目からシークレットの自動反映」を行います。 普段から自動反映する習慣をつけておけば、対応付けが漏れる心配はありません。 使い方 1Passwordとの連携には1Password CLIを使用しています。 あらかじめインストールしておいてください。 シークレットをファイルに書き出す Private Vaultに入っている、Testという名前のアイテムを読み出す設定例です。 # .op-sync.yml secrets: MyPassword: type: template output: .envrc template: | MY_PASSWORD={{ op://Private/Test/password }} 1Password CLIでサインインして、 op-sync コマンドを叩けば 1Password からパスワードを引っ張ってきてファイルに書き出してくれます。 $ eval $(op signin) Enter the password for shogo82148@gmail.com at my.1password.com: $ op-sync 2023/10/21 16:58:32 INFO 1password user information url=https://my.1password.com email=shogo82148@gmail.com The following changes will be applied: file ".

Oct 15, 2023 - 1 minute read - golang

半精度浮動小数点数をあつかうGoのライブラリを書いた

半精度浮動小数点数をあつかうGoのライブラリを書いてみました。 shogo82148/float16 背景 なぜ書いたかというと、半精度浮動小数点数について勉強するためです。 最近のAIブームでビット数の少ない浮動小数点数が注目されていて興味を持ったため 最近の研究で、有効桁数はそこまで重要でないことがわかってきた パラメーターの数が膨大なので、少しでもモデルを圧縮したい CBORの実装読んでいたら、仕様の一部に半精度浮動小数点数が出てきたため 使い方 FromFloat64で倍精度浮動小数点型から半精度浮動小数点数へ変換できます。 import "github.com/shogo82148/float16" func main() { a := float16.FromFloat64(1.0) fmt.Printf("%04x", a.Bits()) } Float16.Bitsで内部表現を取得できるので、 この結果をシリアライズに使うのが主な使い方になると思います。 一応四則演算も実装してあります。 import "github.com/shogo82148/float16" func main() { a := float16.FromFloat64(1.0) b := float16.FromFloat64(2.0) fmt.Printf("%f + %f = %f", a.Add(b)) fmt.Printf("%f - %f = %f", a.Sub(b)) fmt.Printf("%f * %f = %f", a.Mul(b)) fmt.Printf("%f / %f = %f", a.Div(b)) } ただし(自分で書いておいてなんですが)あまり実用性はないです。 というのも半精度浮動小数点数同士の演算結果は float64 型で正確に表現できます。 そのため float64 型で計算したあと半精度浮動小数点数に戻せば、まったく同じ計算ができます。 import "github.com/shogo82148/float16" func main() { a := float16.

Oct 1, 2023 - 1 minute read - github github-actions slack

Slack Incoming Webhook を GitHub Actions Secrets へ突っ込むのに疲れた俺達は

GitHub ActionsからSlackへ通知したいとき、一番お手軽なのはSlack Incoming Webhookです。 直接curlで叩いてもいいですし、マーケットプレイスにも通知用のアクションがたくさんあります。 しかし、Incoming Webhookは一般公開してはいけないシークレットです。 迂闊にレポジトリにコミットしてはいけません。 GitHub Actions Secrets へ突っ込む等して、適切に管理する必要があります。 一個や二個ならまだしも、いくつもレポジトリがあると管理が大変です。 そういうわけで、OIDCを使ってSlackへの通知を行うアクションを書きました。 actions-notify-slack 使い方 gha-notify.shogo82148.com へアクセスします。 「Add to Slack」をクリックして、アプリをSlackにインストールします。 @actions-notify-slack というボットが追加されるので、こいつを通知を流したいチャンネルに招待します。 投稿先のチャンネルで /gha-notify allow ORG/REPO スラッシュコマンドを実行します。これにより ORG/REPO からの投稿が許可されます。 ワークフローにアクションを追加して完成! - uses: shogo82148/actions-notify-slack@v0 with: team-id: T3G1HAY66 # 自分のチームIDに置き換え channel-id: C3GMGG162 # 自分のチャンネルIDに置き換え payload: '{"text": "hello world"}' 仕組み 早い話が、過去 GitHub や AWS 向けに作ったアクションを Slack 向けに焼き直したものです。 actions-github-app-tokenの紹介 AWS_SECRET_ACCESS_KEY を GitHub Actions secrets へ突っ込むのに疲れた俺達は GitHub Actions は直接 Slack とやり取りするかわりに、中継サーバーにリクエストを投げます。 中継サーバーは、OIDC ID Tokenを検証し、Slackへの投稿権限をチェックします。 権限を確認できたら、ボットユーザーとして投稿する、という流れです。

Sep 26, 2023 - 1 minute read - github github-actions

actions-github-app-tokenの紹介

GitHub App Tokenを発行するための actions-github-app-token という GitHub アクションを書きました。 実験的なアクションだったので、マーケットには公開していませんでした。 最近になって「安定して動作しているし、マーケットに公開するか!」という気持ちになったので、 改めてご紹介です。 背景 GitHub Actionsのワークフローから、GitHub APIを叩きたいこと、よくありますよね? GITHUB_TOKEN そんなとき第一候補に挙がるのは secrets.GITHUB_TOKEN です。 Automatic token authentication 特段複雑な設定をせずとも使えるのでお手軽です。 しかし、 secrets.GITHUB_TOKEN には大きな制限があります。 それは「他のGitHub Actions Workflowを起動できない」ということ。 これは無限ループで大量のジョブが投入されるのを防ぐための制限です。 理由もはっきりしていて妥当な制限だとは思うのですが、 必要なワークフローが起動しなくて困ることがときどきあります。 PAT (Personal Access Token) (Classic) 「他のGitHub Actions Workflowを起動できない」制限を回避する簡単な方法は、 Personal Access Token を使うことです。 このトークンにはこの制限はありません。 ただし、トークンを発行したユーザーの権限でAPIを叩くので、権限の範囲が広すぎる、という問題があります。 実行できるアクションは制限できるのですが、レポジトリの範囲までは調整できません。 また、トークンは「ユーザー」に紐づきます。 個人のレポジトリならまだいいんですが、Organization管理のレポジトリ困ることがあります。 一番のあるあるは「トークンを発行したユーザーがOrganizationを抜けるとワークフローが止まる」ですかね。 属人化が進み、健全とは言い難い状態です。 fine-grained personal access tokens 「権限の範囲が広すぎる」問題を解決するのが fine-grained personal access tokens です。 レポジトリ単位でアクセス権を設定できます。 しかし、権限の広さは解決しますが、「トークンがユーザーに紐づいていることの弊害」は解消しません。 また、fine-grained personal access tokensは有効期限の設定が必須です。 管理するレポジトリの数が多いと、トークン更新行脚をする必要があります。 GitHub Apps ここで本命、 GitHub Apps の出番です。

Sep 21, 2023 - 1 minute read - go golang

ぼくのかんがえたさいきょうのGo HTTPサーバー起動方法

これまで何度か HTTP Server の Graceful Shutdown について記事を書きました。 Go 言語で Graceful Restart をする Go 言語で Graceful Restart をするときに取りこぼしを少なくする Go1.8 の Graceful Shutdown と go-gracedown の対応 最終的に Go 1.8 で Server.Shutdown が導入され、この件は解決を見ました。 しかし、最近「あれ?本当に正しく Server.Shutdown 使えている?」と疑問に思い、少し考えてみました。 というか ↑ の記事もまだ考慮が足りない気がする。 ぼくのかんがえたさいきょうの Go HTTP サーバー起動方法 とりあえず完成形のコード。 package main import ( "context" "log" "net/http" "os" "os/signal" "syscall" "time" ) func main() { // シグナルを待ち受ける chSignal := make(chan os.Signal, 1) signal.Notify(chSignal, syscall.SIGINT, syscall.SIGTERM) defer signal.Stop(chSignal) // 起動したいサーバーを準備 mux := http.

Sep 18, 2023 - 1 minute read - go golang

Goのコメント全部消す

深遠な理由で、ソースコードからコメントをすべて抹消したくなったことはありませんか? そんなときに使えるツールを作りました。 shogo82148/go-comment-eraser Go製コマンドなので、 go install でインストール。 go install github.com/shogo82148/go-comment-eraser@latest ソースコードのおいてあるディレクトリを指定すると、 そのディレクトリ以下の *.go からすべてコメントを削除します。 go-comment-eraser ソースコードのあるディレクトリ 実際に shogo82148/go-comment-eraser 自身のソースコードで試した結果がこちら。 diff --git a/main.go b/main.go index 5087d08..913debc 100644 --- a/main.go +++ b/main.go @@ -65,22 +65,18 @@ func eraseComment(src string) error { return nil } -// parseFile parses the Go source code file and returns the Go source -// that is modified to erase all comments. func parseFile(src string) ([]byte, error) { - // Parse the Go source code file + fset := token.

Sep 16, 2023 - 1 minute read - github

ChooseALicense.com の日本語訳を公開しました

ChooseALicense.com の日本語訳を公開しました。 choosealicense.shogo82148.com 背景 いつの間にか「オープンソースライセンスを適切に管理する係」になってしまい、 最近はライセンス文章とにらめっこする毎日のいっちーです。 そんな中お世話になったのがChooseALicense.comの付録です。 ライセンスの概要が大まかにわかります。 まあ、最終的には原文を読まないといけないわけですが、読む手がかりにはなります。 母国語が日本語の僕にとって、毎回英語読むのはきつい・・・日本語版欲しいな・・・ってことで作りました。 ツール 今回お世話になったツールたちです。 GitHub Pages BudouX GitHub Pages ChooseALicense.com は GitHub Pages でホストされています。 自然とchoosealicense.shogo82148.comのホスト先もGitHub Pagesになりました。 GitHub Pages自体はこのブログでもお世話になっている機能です。 今回個人的に初挑戦だったのは、独自ドメインの割り当てでした。 ChooseALicense.comのコードがカスタムドメインでの提供前提で組まれており、サブディレクトリでの提供では表示が崩れてしまうからです。 とは言ってもドキュメントにしたがい、GitHub側の設定を済ませたあと、自分のドメインにCNAMEレコードを挿入するだけでした。 Managing a custom domain for your GitHub Pages site お手軽なので、今後なにかに使えるかもしれないですね。 BudouX タイトルの「Choose an open source license」は「オープンソースライセンスを選ぼう」と翻訳しました。 が、これをそのまま表示すると、こうなります。 オープンソースライセンスを選ぼ う 「う」の位置がなんか気に食わない・・・。 この問題の解決のため、BudouXを利用しました。 自動でいい感じの改行位置を決めてくれます。 オープンソースライセンスを 選ぼう まとめ ChooseALicense.com の日本語訳を公開しました。 choosealicense.shogo82148.com 参考 ChooseALicense.com choosealicense.shogo82148.com オープンソースライセンスの日本語参考訳 Managing a custom domain for your GitHub Pages site GitHub Pages BudouX

Sep 14, 2023 - 1 minute read - aws cloudformation

CloudFormationでECDSA形式のTLS証明書が取れた

2022 年 11 月から ECDSA(楕円曲線デジタル署名アルゴリズム)に対応しています。 AWS Certificate Manager が楕円曲線デジタル署名アルゴリズム TLS 証明書のサポートを開始 しかし、 CloudFormation のサポートは近日中に提供が開始されます。 と書いてあるように、CloudFormation からの利用はできませんでした。 今日試してみたら、行けたっぽい(?)ので、設定方法のメモです。 設定方法 KeyAlgorithm に EC_prime256v1 もしくは EC_secp384r1 を指定します。 AWSTemplateFormatVersion: "2010-09-09" Resources: Certificate: Type: AWS::CertificateManager::Certificate Properties: DomainName: shogo82148.com ValidationMethod: DNS DomainValidationOptions: - DomainName: shogo82148.com HostedZoneId: Z1TR8BQNS8S1I7 KeyAlgorithm: EC_prime256v1 注意 ふと、AWS::CertificateManager::Certificate リソースのドキュメントを読んでいたら KeyAlgorithm という属性を見つけたので試してみました。 しかし、2023-09-14 現在説明文は Property description not available. の一文のみ。 リリースの案内も見つけられなかったので、心配な人は正式リリースの案内を待ちましょう。 基本的に CloudFormation のプロパティーはサービスの API と同じ名前です。 今回試してみた EC_prime256v1 という値も、ACM の API リファレンスの KeyAlgorithm を参照しました。 ACM API Reference: RequestCertificate KeyAlgorithm 参考 AWS Certificate Manager が楕円曲線デジタル署名アルゴリズム TLS 証明書のサポートを開始 ACM API Reference: RequestCertificate KeyAlgorithm AWS::CertificateManager::Certificate: KeyAlgorithm