Shogo's Blog

Dec 29, 2023 - 1 minute read - go golang

go-retry v1.2.0 リリースのお知らせ、ジェネリクスがやってきた

shogo82148/go-retry は指数的バックオフを行ってくれるライブラリです。 Goで指数的バックオフをやってくれるgo-retryを書いた v1.2.0 でジェネリクスを導入した新しいインターフェイスを追加しました。 新インターフェイス Goで指数的バックオフをやってくれるgo-retryを書いたの最後のまとめで、僕らのやりたいことを全部詰め込んだこんなコードを書きました。 func DoSomethingWithRetry(ctx context.Context) (Result, error) { var res Result var err error policy.Do(ctx, func() error { ctx, cancel := context.WithTimeout(ctx, time.Second) defer cancel() res, err = DoSomething(ctx) return err }) return res, err } これが以下のようにちょっとシンプルになります。 func DoSomethingWithRetry(ctx context.Context) (Result, error) { return retry.DoValue(ctx, policy, func() (Result, error) { ctx, cancel := context.WithTimeout(ctx, time.Second) defer cancel() return DoSomething(ctx) }) } math/randの実装変更に合わせた最適化 math/randパッケージ には Int, Intn などトップレベルに関数があります。 Go 1.

Dec 29, 2023 - 1 minute read - perl

AWS::LambdaがCanada West (Calgary) Regionで利用可能になりました

この記事は、Perl Advent Calendar 2023 25日目の記事(代打)です。 24日目は@shogo842148で「PerlにClass構文がやってきた」でした。 AWSでカナダ(カルガリー)リージョンが利用可能になりました! The AWS Canada West (Calgary) Region is now available それに合わせて p5-aws-lambda のビルド済みレイヤーも公開しました! Perl本体: arn:aws:lambda:ca-central-1:445285296882:layer:perl-5-38-runtime-al2023-x86_64:3 Paws: arn:aws:lambda:ca-central-1:445285296882:layer:perl-5-38-paws-al2023-x86_64:4 参考 The AWS Canada West (Calgary) Region is now available shogo82148/p5-aws-lambda AWS::Lambda

Dec 29, 2023 - 1 minute read - perl

PerlにClass構文がやってきた

この記事は、Perl Advent Calendar 2023 24日目の記事(代打)です。 23日目は@doikojiで「【さらばpptxよ】perlとJavaScriptとHTMLで超手軽にスライドを作る」でした。 今年のPerlの重大ニュースといえば 「PerlにClass構文がやってきた」 ことですよね[要出典]。 (※ただしExperimental) Advent Calendar でClassをメインに取り上げることなかったなと思ったので、ちょっと触ってみました。 とりあえず動かしてみる perlclassの例です。 警告が出ないように no warnings 'experimental::class' で抑制だけしました。 use v5.38; use feature 'class'; no warnings 'experimental::class'; class My::Example 1.234 { field $x; ADJUST { $x = "Hello, world"; } method print_message { say $x; } } My::Example->new->print_message; 実行すると Hello, world と出力されます。 Hello, world newの引数を受け取る My::Example->new には引数を渡すことができます。 Perl 5.38時点では :param field属性を使って、フィールドを初期化できるようです。 use v5.38; use feature 'class'; no warnings 'experimental::class'; class My::Example 1.

Dec 27, 2023 - 1 minute read - perl

PerlのHTTP::Tinyがv0.083からデフォルトでTLSの証明書を検証するようになった件

この記事は、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.

Dec 24, 2023 - 1 minute read - perl

5.36以降でのサブルーチンプロトタイプを復習する

この記事は、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.

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アンチパターンの本を読んだので、アウトプットする」です。お楽しみに! 参考 ツクロウ 木製ブック型アドベントカレンダー クリスマス カウントダウン アドベントカレンダー プレゼント