Shogo's Blog

Dec 21, 2023 - 2 minute read - perl

Perlで超簡易アセンブラーを書いた話

この記事は、Perl Advent Calendar 2023 18日目の記事(代打)です。 17日目は@tecklで「Perlのレガシーシステムを少し更新した話」でした。 背景 最小のELFを作る記事を見かけて、「自分もやってみよう!」と思ってやってみました。 最小限のELF ただ、僕はバイナリーエディターとはあまりお友達になれていないので、 ELFを出力するPerlスクリプトを書くことにしました。 そうしたらPerl製のアセンブラーっぽいものができた、というお話です。 shogo82148/minimum-elf Minimum ELF ELFとして実行できるだけの必要最低限の機能しか実装していないので、 プログラムの終了処理を書く以外、大したことはできません。 それでも実行可能なバイナリーを吐くので、 「これはアセンブラーだ!」 と言い張ることにします。 完成したELFファイルはDockerイメージに焼き込み、 GitHub Container Registry にあげてあるので、 docker pull で完成品をダウンロードできます。 $ docker pull ghcr.io/shogo82148/minimum-elf:latest $ docker images ghcr.io/shogo82148/minimum-elf:latest REPOSITORY TAG IMAGE ID CREATED SIZE ghcr.io/shogo82148/minimum-elf latest cd926faef0a2 13 days ago 188B わずか188バイト! もちろん docker run で実行できます。 x86_64, arm64 どちらでも動くはずです。 実装 NASM っぽい構文を PerlのDSLとして実装し、ELFファイルを書き出しています。 たとえばELFのヘッダーを書き出す部分は以下のようになっています。 label($elf_start); my $elf_size = $elf_end - $elf_start; db 0x7F, "ELF"; # e_ident db 2; # 64-bit architecture.

Dec 19, 2023 - 3 minute read - go golang

PythonのitertoolsをGoに移植してみた

Go 1.22 に試験的に導入される予定の range over func で遊んでみました。 お題はPythonのitertoolsの移植です。 shogo82148/hi 背景 Go 1.22 では range over func と呼ばれる機能が試験的に導入されます。 spec: add range over int, range over func #61405 range over func が導入される背景については以下の記事がわかりやすかったです。 Go 1.22で追加予定のrange over intと、GOEXPERIMENT入り予定のrange over funcを触ってみる 大雑把にまとめると「Goにもイテレーターの標準を導入しよう」という話です。 Pythonを触っていた時期もあったので、自分はイテレーターと聞いて itertools がパッと思い浮かびました。 ということでこれを題材に遊んでみることにしました。 動かし方 2023-12-19現在、Go 1.22は未リリースなので、試すにはいくつか手順が必要です。 まずはGo本体。masterブランチの最新版をダウンロードしましょう。 go install golang.org/dl/gotip@latest gotip download shogo82148/hi はみんなに使ってほしいので、 Go 1.21で動くようになっています。 そのため、そのままでは Go 1.22 の最新機能が使えません。go.mod ファイルの go ディレクティブを書き換える必要があります。 さらに実験的機能を使っているので、実行には GOEXPERIMENT=rangefunc 環境変数が必要です。 git clone git@github.com:shogo82148/hi.git cd hi gotip mod edit -go=1.

Dec 12, 2023 - 2 minute read - perl

Perl 5.38 の「シグネチャのデフォルト式の定義性論理和と論理和」を試してみた

この記事は、Perl Advent Calendar 2023 12日目の記事です。 11日目は@shogo82148で「ExifToolがすごいという話」でした。 アドベントカレンダーのネタを探してperldeltaをさまよい歩くいっちーです。 Perl 5.38.0 から、「シグネチャーのデフォルト式に定義性論理和と論理和が使えるようになった」という記載を見つけたので試してみます。 定義性論理和と論理和 「定義性論理和と論理和」と聞いてもピンとこなかったので、一応おさらい。 いわゆる // 演算子と || 演算子のことです(発音できない)。 英語で defined-or, logical-or と言ったほうが馴染み深い人も多いかもしれません。 「定義性論理和」の和訳は <perldoc.jp> を参考にしました。 perlop の担当をしたひとも 日本訳に相当苦労したことでしょう・・・。 論理和 論理和はどちらか一方が真ならば真を、それ以外の場合は偽を返す演算子です。 これは他のプログラミング言語と同じなので、みなさんおなじみだと思います。 Perlがおもしろいのは true, false というキーワードが(まだ)ないということですね。 0, "0", undef は真、それ以外はすべて偽として認識されます。 true, false の代わりに 1, 0 を使って、 || の挙動を確かめてみましょう。 use 5.38.0; say 0 || 0; # 0 say 0 || 1; # 1 say 1 || 0; # 1 say 1 || 1; # 1 論理和の短絡評価 || 演算子は短絡評価を行います。 たとえば 1 || $a という式があったら、$a にどんな値が入っていても真なので、$aの評価を行いません。

Dec 11, 2023 - 4 minute read - perl

ExifToolがすごいという話

この記事は、Perl Advent Calendar 2023 11日目の記事です。 10日目はid:papixで「Perlの「後置if」について」でした。 ふと「Exifの中身を確認したいな」と思ったときに ExifToolというツールの存在を知りました。 これがなかなか便利だったので紹介します。 Exif Exifは画像のメタデータのデファクトスタンダードです。 みなさんがスマホで撮った写真にはたいていExifが埋め込まれています。 「何時何分に撮ったか」という情報はもちろん、F値やシャッタースピードなどの細かい撮影条件などが含まれています。 一番注意が必要なのは「位置情報」ですね。今どきのスマホにはGPSが積まれているので、かなり正確な位置情報がExifに記録されます。 SNSなどに公開するときは要注意です。 事前にどんな情報が書き込まれているかチェックするべきでしょう。 そんなとき活躍するのがExifTool。 Exifを確認したり編集したりするためのツールです。 ExifToolはPerl製!! なぜPerlアドベントカレンダーでExifToolを取り上げるかというと、ExifToolはPerl製 なんですね。 CPANにも上がっているので、cpanm でインストール可能です。 cpanm Image::ExifTool exiftool というコマンドがインストールされるので、適当な画像ファイルを渡すとメタデータを解析してくれます。 試しに 今年もアドベントカレンダー(物理)買いました で撮影した画像を読み込ませてみます。 $ exiftool 2023-12-06-advent-calendar1.jpeg ExifTool Version Number : 12.70 File Name : 2023-12-06-advent-calendar1.jpeg Directory : . File Size : 191 kB File Modification Date/Time : 2023:12:06 21:56:11+09:00 File Access Date/Time : 2023:12:06 21:56:18+09:00 File Inode Change Date/Time : 2023:12:06 21:56:17+09:00 File Permissions : -rw------- File Type : JPEG File Type Extension : jpg MIME Type : image/jpeg JFIF Version : 1.

Dec 6, 2023 - 1 minute read -

今年もアドベントカレンダー(物理)買いました

この記事は、フラー株式会社 Advent Calendar 2023 の6日目の記事です。 さて、昨年は「ラバーダックデバッグのすゝめ」と題して、 アヒルちゃんアドベントカレンダー(物理)を買いました。 ところでそもそもアドベントカレンダーって何だか知ってますか? エンジニアが日替わりでブログを書くイベント・・・ではありません。 クリスマスまでの日数をカウントダウンする「アドベントカレンダー(物理)」が元ネタです。 カレンダーの日付部分が蓋になっていて、開けるとお菓子やおもちゃなどが出てくる仕掛けになっています。 クリスマスを待ちきれない子供がクリスマスまでの期間を楽しむためのアイテムなのです。 インターネットではお菓子やおもちゃは配れないので、代わりにブログ記事を投稿するようになったのが、 今のアドベントカレンダーの始まりです。 でもやっぱり(物理)欲しくないですか???? というわけで買っちゃいました! しかし、中途半端に安物を買ったせいで、届いたカレンダーは梱包が雑!配送中にどこかにぶつかったのかボロボロになった状態で届きました。ネット通販で買い物すると「これって過剰包装では?」というような梱包で届きますが、あれにはちゃんと意味があったんですね。 去年の記事のまとめでは、「TODO: 来年はもうちょっと良いやつを買う」と誓ったのでした。 そしてやってきました 2023年。 紙製のアドベントカレンダーはボロボロになると学んだので、MDF(木材を合成樹脂で固めたもの)製のアドベントカレンダーにしました。 本の形になっていて、開けるとカレンダーが現れます。 何が出てくるかは開けてからのお楽しみ! 引き出しを開けた後は裏返しにして戻してください。 おしゃれなイラストがクリスマスの雰囲気を盛り上げてくれます。 明日7日は @kod-sourceで「SQLアンチパターンの本を読んだので、アウトプットする」です。お楽しみに! 参考 ツクロウ 木製ブック型アドベントカレンダー クリスマス カウントダウン アドベントカレンダー プレゼント

Dec 5, 2023 - 2 minute read - perl aws aws-lambda

Amazon Linux 2023ベースのAWS Lambda Perl Runtimeを公開しました

この記事は、Perl Advent Calendar 2023 5日目の記事です。 4日目は@doikojiで「ChatGPTとperl:古のCGIスクリプトを現代的な環境に合わせて再生させようとした話」でした。 AWS LambdaにAmazon Linux 2023ベースのカスタムランタイムが追加されました。 これはつまり・・・ Perlを…ビルドせねば…https://t.co/akYtrs3qXM — f96fd3a0-bdb9-4f10-b69f-8f765c1d341c ICHINOSEShogo (@shogo82148) November 10, 2023 ということでPerlをビルドしました。 AWS::Lambda v0.4.1 使い方はPerl Hackers Hubをどうぞ。 Perl Hackers Hub 第75回 AWS Lambda入門 サーバレスでもPerlを活用しよう!(1) Perl Hackers Hub 第75回 AWS Lambda入門 サーバレスでもPerlを活用しよう!(2) ビルド済み公開 Perl Runtime Layer いつも通りビルド済みのレイヤーを公開しています。 x86_64 architecture arn:aws:lambda:af-south-1:445285296882:layer:perl-5-38-runtime-al2023-x86_64:2 arn:aws:lambda:ap-east-1:445285296882:layer:perl-5-38-runtime-al2023-x86_64:2 arn:aws:lambda:ap-northeast-1:445285296882:layer:perl-5-38-runtime-al2023-x86_64:2 arn:aws:lambda:ap-northeast-2:445285296882:layer:perl-5-38-runtime-al2023-x86_64:2 arn:aws:lambda:ap-northeast-3:445285296882:layer:perl-5-38-runtime-al2023-x86_64:2 arn:aws:lambda:ap-south-1:445285296882:layer:perl-5-38-runtime-al2023-x86_64:2 arn:aws:lambda:ap-south-2:445285296882:layer:perl-5-38-runtime-al2023-x86_64:2 arn:aws:lambda:ap-southeast-1:445285296882:layer:perl-5-38-runtime-al2023-x86_64:2 arn:aws:lambda:ap-southeast-2:445285296882:layer:perl-5-38-runtime-al2023-x86_64:2 arn:aws:lambda:ap-southeast-3:445285296882:layer:perl-5-38-runtime-al2023-x86_64:2 arn:aws:lambda:ap-southeast-4:445285296882:layer:perl-5-38-runtime-al2023-x86_64:2 arn:aws:lambda:ca-central-1:445285296882:layer:perl-5-38-runtime-al2023-x86_64:2 arn:aws:lambda:eu-central-1:445285296882:layer:perl-5-38-runtime-al2023-x86_64:2 arn:aws:lambda:eu-central-2:445285296882:layer:perl-5-38-runtime-al2023-x86_64:2 arn:aws:lambda:eu-north-1:445285296882:layer:perl-5-38-runtime-al2023-x86_64:2 arn:aws:lambda:eu-south-1:445285296882:layer:perl-5-38-runtime-al2023-x86_64:2 arn:aws:lambda:eu-south-2:445285296882:layer:perl-5-38-runtime-al2023-x86_64:2 arn:aws:lambda:eu-west-1:445285296882:layer:perl-5-38-runtime-al2023-x86_64:2 arn:aws:lambda:eu-west-2:445285296882:layer:perl-5-38-runtime-al2023-x86_64:2 arn:aws:lambda:eu-west-3:445285296882:layer:perl-5-38-runtime-al2023-x86_64:2 arn:aws:lambda:il-central-1:445285296882:layer:perl-5-38-runtime-al2023-x86_64:2 arn:aws:lambda:me-central-1:445285296882:layer:perl-5-38-runtime-al2023-x86_64:2 arn:aws:lambda:me-south-1:445285296882:layer:perl-5-38-runtime-al2023-x86_64:2 arn:aws:lambda:sa-east-1:445285296882:layer:perl-5-38-runtime-al2023-x86_64:2 arn:aws:lambda:us-east-1:445285296882:layer:perl-5-38-runtime-al2023-x86_64:2 arn:aws:lambda:us-east-2:445285296882:layer:perl-5-38-runtime-al2023-x86_64:2 arn:aws:lambda:us-west-1:445285296882:layer:perl-5-38-runtime-al2023-x86_64:2 arn:aws:lambda:us-west-2:445285296882:layer:perl-5-38-runtime-al2023-x86_64:2 arm64 architecture arn:aws:lambda:af-south-1:445285296882:layer:perl-5-38-runtime-al2023-arm64:2 arn:aws:lambda:ap-east-1:445285296882:layer:perl-5-38-runtime-al2023-arm64:2 arn:aws:lambda:ap-northeast-1:445285296882:layer:perl-5-38-runtime-al2023-arm64:2 arn:aws:lambda:ap-northeast-2:445285296882:layer:perl-5-38-runtime-al2023-arm64:2 arn:aws:lambda:ap-northeast-3:445285296882:layer:perl-5-38-runtime-al2023-arm64:2 arn:aws:lambda:ap-south-1:445285296882:layer:perl-5-38-runtime-al2023-arm64:2 arn:aws:lambda:ap-south-2:445285296882:layer:perl-5-38-runtime-al2023-arm64:2 arn:aws:lambda:ap-southeast-1:445285296882:layer:perl-5-38-runtime-al2023-arm64:2 arn:aws:lambda:ap-southeast-2:445285296882:layer:perl-5-38-runtime-al2023-arm64:2 arn:aws:lambda:ap-southeast-3:445285296882:layer:perl-5-38-runtime-al2023-arm64:2 arn:aws:lambda:ap-southeast-4:445285296882:layer:perl-5-38-runtime-al2023-arm64:2 arn:aws:lambda:ca-central-1:445285296882:layer:perl-5-38-runtime-al2023-arm64:2 arn:aws:lambda:eu-central-1:445285296882:layer:perl-5-38-runtime-al2023-arm64:2 arn:aws:lambda:eu-central-2:445285296882:layer:perl-5-38-runtime-al2023-arm64:2 arn:aws:lambda:eu-north-1:445285296882:layer:perl-5-38-runtime-al2023-arm64:2 arn:aws:lambda:eu-south-1:445285296882:layer:perl-5-38-runtime-al2023-arm64:2 arn:aws:lambda:eu-south-2:445285296882:layer:perl-5-38-runtime-al2023-arm64:2 arn:aws:lambda:eu-west-1:445285296882:layer:perl-5-38-runtime-al2023-arm64:2 arn:aws:lambda:eu-west-2:445285296882:layer:perl-5-38-runtime-al2023-arm64:2 arn:aws:lambda:eu-west-3:445285296882:layer:perl-5-38-runtime-al2023-arm64:2 arn:aws:lambda:il-central-1:445285296882:layer:perl-5-38-runtime-al2023-arm64:2 arn:aws:lambda:me-central-1:445285296882:layer:perl-5-38-runtime-al2023-arm64:2 arn:aws:lambda:me-south-1:445285296882:layer:perl-5-38-runtime-al2023-arm64:2 arn:aws:lambda:sa-east-1:445285296882:layer:perl-5-38-runtime-al2023-arm64:2 arn:aws:lambda:us-east-1:445285296882:layer:perl-5-38-runtime-al2023-arm64:2 arn:aws:lambda:us-east-2:445285296882:layer:perl-5-38-runtime-al2023-arm64:2 arn:aws:lambda:us-west-1:445285296882:layer:perl-5-38-runtime-al2023-arm64:2 arn:aws:lambda:us-west-2:445285296882:layer:perl-5-38-runtime-al2023-arm64:2 ビルド済み公開 Paws Layer x86_64 architecture arn:aws:lambda:af-south-1:445285296882:layer:perl-5-38-runtime-paws-x86_64:3 arn:aws:lambda:ap-east-1:445285296882:layer:perl-5-38-runtime-paws-x86_64:3 arn:aws:lambda:ap-northeast-1:445285296882:layer:perl-5-38-runtime-paws-x86_64:3 arn:aws:lambda:ap-northeast-2:445285296882:layer:perl-5-38-runtime-paws-x86_64:3 arn:aws:lambda:ap-northeast-3:445285296882:layer:perl-5-38-runtime-paws-x86_64:3 arn:aws:lambda:ap-south-1:445285296882:layer:perl-5-38-runtime-paws-x86_64:3 arn:aws:lambda:ap-south-2:445285296882:layer:perl-5-38-runtime-paws-x86_64:3 arn:aws:lambda:ap-southeast-1:445285296882:layer:perl-5-38-runtime-paws-x86_64:3 arn:aws:lambda:ap-southeast-2:445285296882:layer:perl-5-38-runtime-paws-x86_64:3 arn:aws:lambda:ap-southeast-3:445285296882:layer:perl-5-38-runtime-paws-x86_64:3 arn:aws:lambda:ap-southeast-4:445285296882:layer:perl-5-38-runtime-paws-x86_64:3 arn:aws:lambda:ca-central-1:445285296882:layer:perl-5-38-runtime-paws-x86_64:3 arn:aws:lambda:eu-central-1:445285296882:layer:perl-5-38-runtime-paws-x86_64:3 arn:aws:lambda:eu-central-2:445285296882:layer:perl-5-38-runtime-paws-x86_64:3 arn:aws:lambda:eu-north-1:445285296882:layer:perl-5-38-runtime-paws-x86_64:3 arn:aws:lambda:eu-south-1:445285296882:layer:perl-5-38-runtime-paws-x86_64:3 arn:aws:lambda:eu-south-2:445285296882:layer:perl-5-38-runtime-paws-x86_64:3 arn:aws:lambda:eu-west-1:445285296882:layer:perl-5-38-runtime-paws-x86_64:3 arn:aws:lambda:eu-west-2:445285296882:layer:perl-5-38-runtime-paws-x86_64:3 arn:aws:lambda:eu-west-3:445285296882:layer:perl-5-38-runtime-paws-x86_64:3 arn:aws:lambda:il-central-1:445285296882:layer:perl-5-38-runtime-paws-x86_64:3 arn:aws:lambda:me-central-1:445285296882:layer:perl-5-38-runtime-paws-x86_64:3 arn:aws:lambda:me-south-1:445285296882:layer:perl-5-38-runtime-paws-x86_64:3 arn:aws:lambda:sa-east-1:445285296882:layer:perl-5-38-runtime-paws-x86_64:3 arn:aws:lambda:us-east-1:445285296882:layer:perl-5-38-runtime-paws-x86_64:3 arn:aws:lambda:us-east-2:445285296882:layer:perl-5-38-runtime-paws-x86_64:3 arn:aws:lambda:us-west-1:445285296882:layer:perl-5-38-runtime-paws-x86_64:3 arn:aws:lambda:us-west-2:445285296882:layer:perl-5-38-runtime-paws-x86_64:3 arm64 architecture arn:aws:lambda:af-south-1:445285296882:layer:perl-5-38-runtime-paws-arm64:1 arn:aws:lambda:ap-east-1:445285296882:layer:perl-5-38-runtime-paws-arm64:1 arn:aws:lambda:ap-northeast-1:445285296882:layer:perl-5-38-runtime-paws-arm64:1 arn:aws:lambda:ap-northeast-2:445285296882:layer:perl-5-38-runtime-paws-arm64:1 arn:aws:lambda:ap-northeast-3:445285296882:layer:perl-5-38-runtime-paws-arm64:1 arn:aws:lambda:ap-south-1:445285296882:layer:perl-5-38-runtime-paws-arm64:1 arn:aws:lambda:ap-south-2:445285296882:layer:perl-5-38-runtime-paws-arm64:1 arn:aws:lambda:ap-southeast-1:445285296882:layer:perl-5-38-runtime-paws-arm64:1 arn:aws:lambda:ap-southeast-2:445285296882:layer:perl-5-38-runtime-paws-arm64:1 arn:aws:lambda:ap-southeast-3:445285296882:layer:perl-5-38-runtime-paws-arm64:1 arn:aws:lambda:ap-southeast-4:445285296882:layer:perl-5-38-runtime-paws-arm64:1 arn:aws:lambda:ca-central-1:445285296882:layer:perl-5-38-runtime-paws-arm64:1 arn:aws:lambda:eu-central-1:445285296882:layer:perl-5-38-runtime-paws-arm64:1 arn:aws:lambda:eu-central-2:445285296882:layer:perl-5-38-runtime-paws-arm64:1 arn:aws:lambda:eu-north-1:445285296882:layer:perl-5-38-runtime-paws-arm64:1 arn:aws:lambda:eu-south-1:445285296882:layer:perl-5-38-runtime-paws-arm64:1 arn:aws:lambda:eu-south-2:445285296882:layer:perl-5-38-runtime-paws-arm64:1 arn:aws:lambda:eu-west-1:445285296882:layer:perl-5-38-runtime-paws-arm64:1 arn:aws:lambda:eu-west-2:445285296882:layer:perl-5-38-runtime-paws-arm64:1 arn:aws:lambda:eu-west-3:445285296882:layer:perl-5-38-runtime-paws-arm64:1 arn:aws:lambda:il-central-1:445285296882:layer:perl-5-38-runtime-paws-arm64:1 arn:aws:lambda:me-central-1:445285296882:layer:perl-5-38-runtime-paws-arm64:1 arn:aws:lambda:me-south-1:445285296882:layer:perl-5-38-runtime-paws-arm64:1 arn:aws:lambda:sa-east-1:445285296882:layer:perl-5-38-runtime-paws-arm64:1 arn:aws:lambda:us-east-1:445285296882:layer:perl-5-38-runtime-paws-arm64:1 arn:aws:lambda:us-east-2:445285296882:layer:perl-5-38-runtime-paws-arm64:1 arn:aws:lambda:us-west-1:445285296882:layer:perl-5-38-runtime-paws-arm64:1 arn:aws:lambda:us-west-2:445285296882:layer:perl-5-38-runtime-paws-arm64:1 al2023の注意点 詳細は公式のアナウンスを確認してほしいのですが、al2023ランタイムを使うに当たっていくつか注意点があります。

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.