Shogo's Blog

Dec 4, 2022 - 2 minute read - perl

Perlで暗号論的乱数を生成する

この記事は、Perl Advent Calendar 2022 の4日目の記事です。 3日目は@hitode909で「encode_jsonとdecode_json、どっちがどっちか覚えられないので、VSCodeのsnippetにjson_stringifyとjson_parseとして登録してしまう」でした。 とつぜんPerlで暗号論的乱数を作りたくなったことはありませんか? 僕はあります。 というわけで実現方法を調べてみました。 背景 ことの発端はGitHub Actionsのsave-stateとset-outputが非推奨になったことです。 GitHub Actions: Deprecating save-state and set-output commands actions-setup-perlでこのコマンドを使っているので、この変更に対応する必要があります。 代わりの方法として$GITHUB_STATE, $GITHUB_OUTPUT環境変数が用意されました。 ここにファイルパスが指定されるので、指定されたファイルへ所定のフォーマットで書き出せ、とのことです。 この「所定のフォーマット」の要件のひとつに暗号論的乱数があり、Perlで暗号的乱数を生成することになったのです。 単なる乱数で良ければ組み込み関数にrand関数があります。 しかしこれはperldocにも書いてあるとおり、セキュリティが重要な場面では使うべきではありません。 rand - perldoc.jp rand は暗号学的に安全ではありません。 セキュリティ的に重要な状況でこれに頼るべきではありません。 残念なことに今回はセキュリティ的に重要な状況なのです。 暗号論的乱数を作る あまり依存モジュールを増やしたくなかったので、OSの機能を直接呼び出す方針で考えました。 /dev/urandom を使う Windows APIを呼び出す syscall を使う OpenSSLを使う /dev/urandom を使う Linuxをちょっとかじった最初に思い浮かぶ方法でしょう。 Linuxには/dev/urandomという特殊ファイルが用意されており、このファイルを読むことで暗号論的乱数が手に入ります。 use v5.36; my $n = 32; my $buf; open my $fh, '<', '/dev/urandom' or die "failed to open /dev/urandom: $!"; read $fh, $buf, $n or die "failed to read /dev/urandom: $!

Dec 1, 2022 - 1 minute read -

ラバーダックデバッグのすゝめ

この記事は、フラー株式会社 Advent Calendar 2022 の1日目の記事です。 さてさて、今年も始まりましたアドベントカレンダー。 ところでそもそもアドベントカレンダーって何だか知ってますか? エンジニアが日替わりでブログを書くイベント・・・ではありません。 クリスマスまでの日数をカウントダウンする「アドベントカレンダー(物理)」が元ネタです。 カレンダーの日付部分が蓋になっていて、開けるとお菓子やおもちゃなどが出てくる仕掛けになっています。 クリスマスを待ちきれない子供がクリスマスまでの期間を楽しむためのアイテムなのです。 インターネットではお菓子やおもちゃは配れないので、代わりにブログ記事を投稿するようになったのが、 今のアドベントカレンダーの始まりです。 でもやっぱり(物理)欲しくないですか???? というわけで買っちゃいました! 中国からの輸入品です!梱包雑!!箱がボロボロ!!! ラバーダックデバッグのすゝめ Amazonで開いてトップにあったものをテキトーに ラバーダックとプログラミングには深い関係があるので、ラバーダックのアドベントカレンダーを選びました。 ラバーダックデバッグと言って、 コードを一行ずつアヒルちゃんに説明するというデバッグ手法があります。 相手が無生物であっても、こうやって説明することで頭の中が整理され、バグの発見につながる・・・と言われています。 アドベントカレンダー開封 ラバーダックデバッグの素晴らしさを伝えるため、フラーアドベントカレンダーに参加してくれた人にラバーダックをプレゼントします! 以下の写真のようにカレンダーの日付部分にアヒルちゃんが入っています。 アドベントカレンダーを担当した日のアヒルちゃんはあなたものです! さっそく12月1日分のアヒルちゃんはいただきましました。 微妙に剥げた塗装がイカしてます。 僕も今日からプログラミングに詰まったらこの子と相談してみます。 まとめ プログラミングに詰まったらラバーダックへ相談してみよう 中国の安物には気をつけろ TODO: 来年はもうちょっと良いやつを買う 明日2日は @chooblarinで「CSS Masks活用術」です。お楽しみに! 参考 ラバーダックデバッグ アドベント カレンダー 2022、クリスマス カウントダウン カレンダー アドベント カレンダー 2022 キッズ リトル イエロー ダック、アドベント カレンダー用おもちゃ、クリスマス アドベント カレンダー

Nov 20, 2022 - 1 minute read - go golang

50音順(JIS X 4061)をGoで実装してみた

今後Go言語でも50音順ソートしたくなるのでは、と虫の知らせがあったので作ってみました。 shogo82148/jisx4061 50音順とは何者か 50音順は「あいうえおかきくけこ・・・」あたりまでなら簡単なので、すごく簡単に思えるじゃないですか。 しかしここに濁音・半濁音・拗音・片仮名・長音記号etc. が入ってくるとだいぶややこしくなります。 濁音を含んだソート たとえば濁点の扱いを見てみましょう。 「さどう」「さとうや」「サトー」「さと」「さど」「さとう」「さとおや」という7つの単語を並べ替えます。 普通にGo標準のソートを使うと以下のようになります。 package main import ( "fmt" "sort" ) func main() { list := []string{ "さどう", "さとうや", "サトー", "さと", "さど", "さとう", "さとおや", } sort.Strings(list) fmt.Println(list) // Output: // [さと さとう さとうや さとおや さど さどう サトー] } 一見良さそうですが・・・「さと」と「さど」が遠く離れてしまいました。 このふたつは音が似ているので近くに配置したいです。 jisx4061を使ったソート shogo82148/jisx4061を使うと解決します。 package main import ( "fmt" "github.com/shogo82148/jisx4061" ) func main() { list := []string{ "さどう", "さとうや", "サトー", "さと", "さど", "さとう", "さとおや", } jisx4061.Sort(list) fmt.

Nov 16, 2022 - 1 minute read - github

GitHub GraphQL のノードIDフォーマットが変わるらしい (続報)

以前 GitHub GraphQL のノードIDフォーマットが変わるらしい に書いたように、 将来ノードIDフォーマットが変わるらしいらしいです。 これについて、旧式のノードIDを使用した場合に警告がでるようになった、とアナウンスがありました。 GraphQL Legacy Global ID Deprecation Message というわけで、どんな警告文がでるのか試してみました。 実際の挙動 試しに僕の名前を取得するクエリを実行してみると、以下のような警告文がでました。 $ gh api graphql -f query='query { node(id: "MDQ6VXNlcjExNTczNDQ=") { ... on User { id name login } } }' { "data": { "node": { "id": "MDQ6VXNlcjExNTczNDQ=", "name": "ICHINOSE Shogo", "login": "shogo82148" } }, "extensions": { "warnings": [ { "type": "DEPRECATION", "message": "The id MDQ6VXNlcjExNTczNDQ= is deprecated. Update your cache to use the next_global_id from the data payload.

Oct 19, 2022 - 1 minute read - aws perl aws-lambda

WEB+DB PRESS Vol.131にPerlとAWS Lambdaの記事を寄稿しました

WEB+DB PRESS Vol.131内の連載「第75回Perl Hackers Hub」に 「AWS Lambda入門……サーバレスでもPerlを活用しよう!」というタイトルで寄稿しました。 発売日は10月22日です。 WEB+DB PRESS Vol.131、どこよりも早い表紙画像です! Rust入門、はじめてのElixir、実装して学ぶHTTP/3を大特集!10月22日発売です!#wdpress pic.twitter.com/uEIjuPYXu6 — WEB+DB PRESS編集部 (@wdpress) October 4, 2022 前回寄稿したときがVol.97第43回Perl Hackers Hubなので、約5年ぶり2回目の寄稿です。 WEB+DB PRESS Vol.97にPerlとRedisの記事を寄稿しました 内容 AWS Lambdaの上でPerlを動かしてみよう!という内容です。 AWS::Lambdaモジュールの簡単なチュートリアルになっています。 今年の4月に提供が開始されたAWS Lambda Function URLsにも対応した内容です。 作るのはもちろん!アクセスカウンター! AWS Lambdaでできるのは計算だけで、単体では大したことはできません。 AWS Lambdaの便利なところは、他のAWSのサービスと連携できることです。 今回寄稿した記事でもその便利さが伝わるといいなと思い、Paws (Perl SDK for AWS)を使って DynamoDBと連携するところまでを書きました。 やったねたえちゃん!カウンターの値が永続化されるよ!!! まとめ というわけで、続きは紙面でお楽しみください。 WEB+DB PRESS Vol.131の「第75回Perl Hackers Hub」です。 発売日は10月22日。 参考 WEB+DB PRESS Vol.131 AWS Lambda AWS::Lambdaモジュール AWS Lambda Function URLs の提供開始: 単一機能のマイクロサービス向けの組み込み HTTPS エンドポイント AWS LambdaでCGIを蘇らせる

Oct 8, 2022 - 1 minute read - aws perl aws-lambda

AWS::Lambda v0.0.37リリースのお知らせ

AWS::Lambda v0.0.37 をリリースしました。 12のリージョンでARM64互換レイヤーを公開 新たに12のリージョンでAWS LambdaのARM64(AWS Graviton2)対応が発表されました。 AWS Lambda Functions powered by AWS Graviton2 now available in 12 additional regions 今回公開されたのは、以下の12のリージョンです。 アフリカ (ケープタウン) af-south-1 アジアパシフィック (ソウル) ap-northeast-2 アジアパシフィック (ジャカルタ) ap-southeast-3 アジアパシフィック (香港) ap-east-1 アジアパシフィック (大阪) ap-northeast-3 カナダ(中部) ca-central-1 ヨーロッパ (パリ) eu-west-3 ヨーロッパ (ストックホルム) eu-north-1 ヨーロッパ (ミラノ) eu-south-1 中東 (バーレーン) me-south-1 南米 (サンパウロ) sa-east-1 米国西部(北カリフォルニア) us-west-1 以下の10のリージョンは2021年9月から利用可能だったので、約1年遅れの登場です。 (AWS Graviton2 プロセッサを利用する AWS Lambda 関数を使用して最大 34% 優れた料金/パフォーマンスを実現) 米国東部 (オハイオ) us-east-2 米国東部(バージニア北部) us-east-1 米国西部 (オレゴン) us-west-2 アジアパシフィック (ムンバイ) ap-south-1 アジアパシフィック (シンガポール) ap-southeast-1 アジアパシフィック (シドニー) ap-southeast-2 アジアパシフィック (東京) ap-northeast-1 欧州(フランクフルト) eu-central-1 ヨーロッパ (アイルランド) eu-west-1 ヨーロッパ (ロンドン) eu-west-2 これを受け、「AWS Lambda Perl Runtime の Arm64 互換レイヤーを公開しました 」 で公開したARM64互換レイヤーも、ARM64対応のリージョンで公開しました。 利用可能なARNは以下の通りです。

Sep 20, 2022 - 2 minute read - aws go golang gcp

AWS SDK v2 for Goが壊れた、Googleお前もか

何もしていないのに壊れました。(ライブラリのアップデートはした) AWS SDK v2 for Goが壊れた 該当のプルリクエストはこちら: Bump github.com/aws/aws-sdk-go-v2/service/ssm from 1.27.13 to 1.28.0 in /lambda/metadata-updater shogo82148/private-rpm-repo#87 true を *bool 型に変換できないと怒られてしまいました。 ./main.go:305:19: cannot use true (untyped bool constant) as *bool value in struct literal どうやらAWS SDK v2のこのコミットの影響でビルドが通らなくなったようです: aws/aws-sdk-go-v2@a13b7a4 diff --git a/service/ssm/api_op_GetParameter.go b/service/ssm/api_op_GetParameter.go index c7617dcfd0e..f58354b6528 100644 --- a/service/ssm/api_op_GetParameter.go +++ b/service/ssm/api_op_GetParameter.go @@ -39,7 +39,7 @@ type GetParameterInput struct { // Return decrypted values for secure string parameters. This flag is ignored for // String and StringList parameter types.

Aug 11, 2022 - 2 minute read - git

git push のときに自動的にリモートブランチを作成する設定

Git 2.37.0 から git push に --set-upstream origin が要らなくなったという話。 出典はこちらのツイート: With the newest version of Git 2.37.0, you can run just "git push" to push new branches. No more "--set-upstream origin". Enable with: git config --global --add --bool push.autoSetupRemote true pic.twitter.com/1SzIqzvEFR — James Ide (@JI) July 12, 2022 ツイッターだけだと忘れてしまうので、検索用のメモ。 Git のデフォルトの設定では、 git push のときに upstream が設定されていないと「--set-upstream origin をつけて再実行してくれ」と 怒られます。 v2.37.0 から、これを自動的に行うオプションが追加されたらしいです。 $ git config --global --add --bool push.autoSetupRemote true 有効化すると自動的にリモートブランチを設定してくれます。

Jun 11, 2022 - 1 minute read - 人生の備忘録

落とし物の iPhone を交番に届けた話

タイトルのとおり。 先日落とし物の iPhone を交番に届けました。 「落とし物を拾ったら交番に届けましょうね」と小さい頃からよく言い聞かされるけど、 意外とそういう機会ないよね???ということでメモ。 TL;DR 落とし物を拾ったら交番に届けよう (大事) 「拾った場所と時間」を聞かれるので、しっかり覚えておこう 拾った人がもらえる「ここまで来るのにかかった費用」「拾得物の5%から20%のお礼」「落とし主が見つからなかった場合は所有権」を受け取る権利をどうする(放棄するかしないか)を聞かれるので、決めておこう 野生の iPhone が現れた! 駅の前を通りかかったときに、たまたまスマートフォンらしき物体がが落ちているのを発見。 とりあえず、現場の状況を記録しておこうと、一緒に歩いていた @nnsnodnb 先生に現場写真をとってもらいます。 この手順は意外と重要だったりする(かもしれない)。 拾い上げて確認してみるとどうやら iPhone のようです。 飲み会の帰りで深夜午前2時とかだったので、正直見なかったことにして帰りたいところでしたが、 モノが高価なので一応交番に届けるか・・・ということになりました。 交番での手続き 外から見たら誰もいないように見えましたが、ドアを開けると中から警察官のひとが出てきてくれました。 iPhone を見せ、落とし物を拾ったことを伝えると、「どこで拾いましたか?」 「拾ったのは何時頃ですか?」 と質問を受けました。 このときに、最初に撮った現場写真が役に立ちます。今どきのスマートフォンは写真を撮った位置や時刻を記録してますからね。 (ちゃんと覚えていたので使わなかったけど、ありがとう @nnsnodnb) その後「手続きに10分ほど時間がかかりますが、よろしいですか?」と聞かれました。 特に断る理由もないので、そのまま手続きを進めます。 手続きに必要なのは、自分(落とし物を拾った人)の 住所 ・ 名前 ・ 電話番号 です。 さらに、落とし物を拾った人の権利についての説明を受けたあと、以下のような質問を受けます。 「ここまで来るのにかかった費用」「拾得物の5%から20%のお礼」「落とし主が見つからなかった場合は所有権」を受け取る権利はどうするか 所有権を保持した場合でも、 iPhone のような個人情報が入ったものは渡せないが、それでも良いか 落とし主に連絡先を伝えることに同意するか ひとつめの質問、本当に「どうするか」としか聞かれなかったので「え、どういう選択肢があるんだ???」と一瞬その場で考えたんですが、 よく考えるとお礼等を受け取るのはあくまでも「権利」なので、行使 するか 放棄 するか選べるんですね。 純粋に善意で届け出た(エライ)ので「権利は放棄する」「連絡先を伝えることに同意する」ことを伝えました。 以上のやり取りの内容を書面にまとめてくれるので、それに署名すれば手続きは完了です。 iPhone はもらえないという話 手続きの途中で「所有権を保持した場合でも、 iPhone のような個人情報が入ったものは渡せない」と説明を受けました。 書類の控えをあとから見返すと「遺失物法第35条の規定により、法定の期間が経過しても、あなたが受け取ることができない場合があります」とあります。 「遺失物法第35条」の規定は以下の通りです。 (所有権を取得することができない物件) 第三十五条 次の各号に掲げる物のいずれかに該当する物件については、民法第二百四十条若しくは第二百四十一条の規定又は第三十二条第一項の規定にかかわらず、所有権を取得することができない。 法令の規定によりその所持が禁止されている物(法令の規定による許可その他の処分により所持することができる物であって政令で定めるものを除く。) 個人の身分若しくは地位又は個人の一身に専属する権利を証する文書、図画又は電磁的記録(電子的方式、磁気的方式その他人の知覚によっては認識することができない方式で作られた記録をいう。以下同じ。) 個人の秘密に属する事項が記録された文書、図画又は電磁的記録 遺失者又はその関係者と認められる個人の住所又は連絡先が記録された文書、図画又は電磁的記録 個人情報データベース等(個人情報の保護に関する法律(平成十五年法律第五十七号)第十六条第一項に規定する個人情報データベース等をいう。)が記録された文書、図画又は電磁的記録(広く一般に流通している文書、図画及び電磁的記録を除く。) なるほど、iPhone は第4項の「個人の住所又は連絡先が記録された文書、図画又は電磁的記録」に該当しそうです。 「いやでもロックかかっていて見れないし・・・」とも思ったけど、この規定だとロックの有無は関係なさそうですね。

May 27, 2022 - 2 minute read -

動的ライブラリの検索パスに、実行バイナリからの相対パスを入れたい

C や C++ で普通にコンパイルしたバイナリを実行すると、 /lib や /usr/lib といったディレクトリから動的ライブラリを検索して来ます。 この検索パスは LD_LIBRARY_PATH 環境変数や /etc/ld.so.conf 設定ファイルで設定可能です。 しかし、これらの方法ではすべての実行コマンドの設定が上書きされてしまいます。 「自分がコンパイルしたバイナリ」のみ、検索パスをいじりたい。 できれば実行バイナリの相対パスを指定したい。 そんな場面に遭遇したので、備忘録として残しておきます。 背景 以前 Redis をインストールしてセットアップする GitHub Action actions-setup-redis を公開しました。 「Redis くらい Docker でシュッとたちあがるやろ」という話もありますが、 Workflow の中で redis-cli を使いたい場合や、 macOS で実行したい場合 Docker は使えません。 これを解決するために、actions-setup-redis では プラットフォームに合わせてビルド済みのバイナリをダウンロードする、という手法をとっています。 Redis は v6.2.0 から OpenSSL を使った SSL/TLS 通信をサポートしています。 せっかくなので SSL/TLS 通信したいですよね (というかそういう要望がきた)。 そうすると当然 Redis と OpenSSL のリンクが必要です。 別のプロジェクトですが、過去に リンクしていた OpenSSL が OS イメージから削除される という経験をしていたので、 Redis に OpenSSL をバンドルして配布することにしました。 バンドルした OpenSSL と プリインストールされている OpenSSL のバージョンがあっている保証はありません (そもそもそういう場合に備えてバンドルしてる)。 グローバルな設定を書き換えてしまっては、既存の OpenSSL に依存しているコマンドが壊れてしまいます。 でも redis-cli を使うときだけはバンドルした OpenSSL を動的ロードしたい。