この記事は、Perl Advent Calendar 2023 22日目の記事(代打)です。 21日目は@shogo82148で「5.36以降でのサブルーチンプロトタイプを復習する」でした。
万策尽きたいっちーです。 そういえば今年こんなこともあったなーと思い出したので、メモとして残しておきます。
HTTP::Tiny 0.083からデフォルトでTLSの証明書を検証するようになりました 今年の6月11日リリースの HTTP::Tiny 0.083 からデフォルトで TLSの証明書を検証するようになりました!
検証してみた HTTP::TinyはPerlのコアモジュールに含まれている、超有名HTTPクライアントです。 「えっ、むしろ今まで検証してなかったの?」って思いますよね。
僕もそう思いました。というわけで証明書の検証していないことの検証してみましょう。
まずはお手元に古いHTTP::Tinyを用意します。
cpanm HTTP::Tiny@0.082 検証には不正な証明書を返すサーバーが必要です。 今回は badssl.com を利用しました。 有効期限の切れたサイトへのアクセスを試してみます。
# get.pl use v5.38; use HTTP::Tiny; my $response = HTTP::Tiny->new->get('https://expired.badssl.com/'); die "Failed!\n" unless $response->{success}; say $response->{content}; 実行してみると・・・
% perl get.pl <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="shortcut icon" href="/icons/favicon-red.ico"/> <link rel="apple-touch-icon" href="/icons/icon-red.png"/> <title>expired.badssl.com</title> <link rel="stylesheet" href="/style.css"> <style>body { background: red; }</style> </head> <body> <div id="content"> <h1 style="font-size: 12vw;"> expired.
この記事は、Perl Advent Calendar 2023 21日目の記事(代打)です。 20日目は@doikojiで「低レベルperlスクリプトのススメ(その2)」でした。
いよいよネタが尽きて途方にくれているいっちーです。 ネタも尽きてn番煎じな気はしますが、サブルーチンプロトタイプの書き方について復習です。
プロトタイプ サブルーチンプロトタイプとは一言でいうと、引数パーサーの挙動をカスタマイズする仕組みです。 たとえば、Perlの組み込み関数 push は第一引数の配列に要素を追加する関数ですが、 これと同じものを普通は定義できません。
sub my_push { # TODO: 中身を実装する } my @hoge = (1, 2); my_push @hoge, 3, 4, 5; # my_push 1, 2, 3, 4, 5; と配列が展開されてしまって、 `@hoge` にはアクセスできない 「Perlのサブルーチンプロトタイプについて」から自作pushの例を引用します。
sub my_push(\@@){ my ($arr_ref, @arr) = @_; for(@arr){ $$arr_ref[$#$arr_ref+1] = $_; } } my @hoge = (1, 2); my_push @hoge, 3, 4, 5; # my_push \@hoge, 3, 4, 5; と解釈される Perl 5.
この記事は、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.
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.
この記事は、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の評価を行いません。
この記事は、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.
この記事は、フラー株式会社 Advent Calendar 2023 の6日目の記事です。
さて、昨年は「ラバーダックデバッグのすゝめ」と題して、 アヒルちゃんアドベントカレンダー(物理)を買いました。
ところでそもそもアドベントカレンダーって何だか知ってますか? エンジニアが日替わりでブログを書くイベント・・・ではありません。 クリスマスまでの日数をカウントダウンする「アドベントカレンダー(物理)」が元ネタです。 カレンダーの日付部分が蓋になっていて、開けるとお菓子やおもちゃなどが出てくる仕掛けになっています。 クリスマスを待ちきれない子供がクリスマスまでの期間を楽しむためのアイテムなのです。
インターネットではお菓子やおもちゃは配れないので、代わりにブログ記事を投稿するようになったのが、 今のアドベントカレンダーの始まりです。
でもやっぱり(物理)欲しくないですか???? というわけで買っちゃいました!
しかし、中途半端に安物を買ったせいで、届いたカレンダーは梱包が雑!配送中にどこかにぶつかったのかボロボロになった状態で届きました。ネット通販で買い物すると「これって過剰包装では?」というような梱包で届きますが、あれにはちゃんと意味があったんですね。
去年の記事のまとめでは、「TODO: 来年はもうちょっと良いやつを買う」と誓ったのでした。
そしてやってきました 2023年。 紙製のアドベントカレンダーはボロボロになると学んだので、MDF(木材を合成樹脂で固めたもの)製のアドベントカレンダーにしました。
本の形になっていて、開けるとカレンダーが現れます。
何が出てくるかは開けてからのお楽しみ! 引き出しを開けた後は裏返しにして戻してください。 おしゃれなイラストがクリスマスの雰囲気を盛り上げてくれます。
明日7日は @kod-sourceで「SQLアンチパターンの本を読んだので、アウトプットする」です。お楽しみに!
参考 ツクロウ 木製ブック型アドベントカレンダー クリスマス カウントダウン アドベントカレンダー プレゼント
この記事は、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ランタイムを使うに当たっていくつか注意点があります。
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 .
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.