サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
掃除・片付け
shogo82148.github.io
これまで何度か 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
SSHの鍵生成には暗号論的に安全な疑似乱数を使おうという話。 暗号論的に安全ではない疑似乱数がどれだけ危険かというのを、簡単なCTFを解くことで検証してみました。 背景 SSH公開鍵に自分の好きな文字列を入れる、という記事を読みました。 かっこいいSSH鍵が欲しい 例えばこのSSH公開鍵、末尾に私の名前(akiym)が入っています。 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFC90x6FIu8iKzJzvGOYOn2WIrCPTbUYOE+eGi/akiym そんなかっこいいssh鍵が欲しいと思いませんか? かっこいい!真似してみたい! そこまではいいんですが、問題は実装です。 秘密鍵を生成する際の乱数生成には高速化のために Goのmath/randを使っていますが、乱数が用いられるのは公開しない秘密鍵自体であり、このアルゴリズム自体はLagged Fib
GoでMySQLを使ったテストを書く場合、MySQLのデータベースを初期化する処理や、使い終わったデータベースを削除する処理が必要になります。 毎回似たような処理を書いているので、そろそろライブラリとして切り出せそうだなと思って書いてみました。 shogo82148/go-mysql-pool 背景 弊社ではデータベースに関連したテストを書く場合、ローカルでMySQLを起動し、実際にMySQLへ接続する手法を取っています。 SQLの文法エラーを検知するには、実際にMySQLで処理するのが手っ取り早いからです。 この方法を採用する場合、次の問題は「いつMySQLのデータベースを初期化するか」です。 Goでは TestMain 関数を用意することで、テストの開始前の処理、テストの終了後の処理を書けます。 初期化しているコードは CREATE DATABASE するだけの単純なものです。 そんな
今回の例では + と . が特殊文字なので、それぞれ .E と .G に置換します。 .E57TE27ZJ.G2 バージョン番号をつける あとで仕様を変更したくなったときのためにバージョン番号を振っておきます。 バージョン 0 が現在のバージョンです。 0.E57TE27ZJ.G2 URLの形式に整形する 圧縮URLを知らない読み取り機のために、URLの形に整形します。 HTTPS://C.SHOGO82148.COM/0.E57TE27ZJ.G2 FAQ 誰から聞かれたわけでもないけど、たぶん聞かれそうな質問に答えておきます。 「圧縮」と言っておきながら、URL長くなってるよね? はい。 ASCII文字列で表現したときの文字数は長くなります。 しかしQRコードには「英数字モード」が存在し、一文字をより短いビット数で表現できます。 ASCII文字列をQRコードに変換するには8ビット必要です
Go 1.21 Release Candidateで、 forループ変数のセマンティクス変更の予定をしりました。 導入の背景や影響について、WikiのLoopvarExperimentで説明されています。 地味にインパクトが大きそうだったので、内容を理解するために和訳しました。 といっても訳の大半はChatGPT ChatGPT May 24 Versionのものです。便利。 多少僕の修正も入ってます。 以下LoopvarExperimentのリビジョンdce06fbの和訳です。 Go 1.22では、Goチームはforループ変数のセマンティクスを変更し、繰り返し毎のクロージャやゴルーチンにおける意図しない共有を防止することを検討しています。 Go 1.21には、この変更の予備的な実装が含まれており、プログラムをビルドする際にGOEXPERIMENT=loopvarを設定することで有効になり
CDNサービスで有名なAkamaiがユニクロとコラボしてTシャツを作りました。 本日、Akamaiは @UNIQLO_JP のチャリティTシャツプロジェクト「PEACE FOR ALL」に参画したことを発表4月21日(金)より グローバルで発売されます。このデザインには人々の安全、安心を守りたいというAkamaiの願いが込められています。https://t.co/HVxINmoEzd#AkamaiPeaceForAll #Uniqlo #アカマイ pic.twitter.com/dIS9YOQVZM — アカマイ・テクノロジーズ (@akamai_jp) April 14, 2023 完全に二番煎じですが、Tシャツに描かれたコードを解読してみます。 Akamai x UNIQLOコラボTシャツに書かれたプログラムを解読してみる 解読してみる Tシャツに描かれたこのコード、PEACE FOR
GolangでQRコード、マイクロQRコード、rMQRコードのジェネレーターを作りました。 shogo82148/qrcode 作った理由は、「QRコードの復元能力はどういうマジックなんだろう?」と昔から気になっていたからです。 エンコードの方法は分かったものの、なぜ復元できるのかはわからぬままですが・・・。 また、2022年5月に発表されたrMQRコードにも対応しています。 デンソーウェーブ、細長く狭いスペースにも印字できる 長方形型の新しいQRコード「rMQRコード」を開発 使い方 qrcode.Encodeにバイト列を渡すと、 QRコードの画像をimage.Imageとして返します。 あと通常の画像と同じように扱えるので、image/pngなどで書き出してください。 package main import ( "bytes" "image/png" "log" "os" "githu
Perl Advent Calendar 2022に穴が空いてしまったときの 穴埋め用に温めていた記事です。 無事完走したので公開してしまいます。 v5.38からmodule_true feature pragmaというのが入る予定らしいので試してみました。 v5.38は未リリースなので、開発版のv5.37.5で検証しています。 今まで挙動 Perlモジュールの末尾に1;という謎の記述を見たことはありませんか?
この記事は、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でこのコマンドを使っているので、この変更に対応する必要があります。 代わりの方法とし
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を動かしてみよう!
接尾辞配列(Suffix Array)は,全文検索などに用いられるデータ構造です. それ以外にも,単語の出現回数を高速に求められたり, データ圧縮に使えたりなど,様々な応用例が提案されています. 2012年現在,SA-ISと呼ばれる手法がもっとも効率的に Suffix Array を求められるようです. その基礎となる考え方を1つずつ見ていくことにしましょう. Suffix Arrayとは Suffix Array とはどんなものなのでしょう? 定義にそった,もっとも簡単なアルゴリズムを紹介します. バケットソート 基数ソートとバケットソートは,ソートする対象の種類が有限で範囲がはっきりしている場合に 非常に有効なソート手法です. これを使って Suffix Array を求めてみます. 2段階ソート 隣り合った接尾辞の比較は非常に簡単にできます. ことのことを利用してソートを高速化します
不等号の向きが一緒なので覚えやすいですね! 追記ここまで 確認コード 日時の比較をわかりやすくする Bad Know-How として Time.UnixNano を使うという手があります。 Unix Timestamp は整数なのでおなじみの比較演算子を使えます。 ただし厳密には Monotonic Clocks があるので、結果がことなる場合があることに注意が必要です (SEE ALSO: Go1.9 から使える Monotonic Clocks を試してみた)。 あとは Time.UnixNano の戻り値は 1678 年から 2262 年の間でしか保証されないというのもありますね。 2262 年問題が発生するけど、みんな気にしないんだろうか・・・まあ気にしたところで、そのとき作者は死んでるわけですが。 とはいえ 2038 年問題を埋め込んでしまった人たちも同じことを考えていたはず。
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 が設定されてい
dependabot を使って 依存ライブラリの更新に追従しているのですが、 API のようなデプロイが必要なものは当然ながらデプロイしないと意味がありません。 今までは手元でデプロイしてきましたが、いい加減面倒になったので GitHub Actions を使った自動化をしてみました。 とりあえずお試しで shogo82148/holidays-jp にワークフローを設定してみました。 AWS SAM を使った API で、 データーベースや外部サービスとの連携のないシンプルなものです。 API 自体の使い方はこちらをどうぞ。 祝日 API を公開しました 単純にデプロイした場合の問題点 GitHub Actions の環境にはすでに AWS CLI, AWS SAM CLI, Go 等々ビルドに必要なものはすでにインストールされています。 あとは 「適切な権限を設定」 すればデプロイ自体
そういえば Perl 5.36 もうすぐリリースだなー、なんか面白い変更あるかなー、 と perldelta を眺めていたら、あった!!!! というわけで Perl 5.36 から導入されるらしい extra_paired_delimiters を試してみました。 Paired Delimiters 他の多くの動的言語では、シングルクォーテーション(') やダブルクォーテーション(")で囲うことで文字列を表します。 これは Perl でも同じです。
しかしこれらの情報は、レポジトリへの書き込み権限を持っているユーザーであれば容易に偽装可能です。 そのため100%正しい情報が入っているとは言えない状態でした。 OIDC が利用可能になるとこれが変わります。 以下はOIDCのIDトークンの Claim 部分をデコードしたものです。 ここにもレポジトリ、ブランチ、実行したユーザー等が入っていますね。 { "jti": "73e91482-a3d5-408a-98ea-b91de4733605", "sub": "repo:shogo82148/github-action-test:ref:refs/heads/main", "aud": "https://github.com/shogo82148/github-action-test", "ref": "refs/heads/main", "sha": "6dfcf89b39ebf8046
この運動は等速直線運動なので、すべての点を通る直線が一本引けるはずです。 このような直線を引ければ、速度や初期位置がわかるので、いろいろと便利です。 しかし現実にはどうしても測定誤差が発生してしまうため、 どんなに頑張って直線を引いても、図のようにデータポイントと直線は少しずれてしまいます。 仕方がないので、できるだけデータポイントから外れないような直線を引くことにしましょう。 最小二乗法はこのような直線を引く代表的な手法の一つです。 線形回帰 「できるだけデータポイントから外れない」とはどういうことでしょう? もう少し数学的に表してみることにします。 i番目のデータポイントを、求めたい直線をと 定義します。データポイントの数はnとします。 すると、実際の測定値と予想される理論値との誤差をと表すことができます。 この誤差を小さくすればデータポイントと直線が近くなりそうです。 一つのデータポ
この記事は、Perl Advent Calendar 2021 の24日目の記事です。 23日目は @hitode909 で「リポジトリ内のソースコードを機械的にリファクタリングし続けるスクリプトを作る」でした。 今日はちょっと前から使えるようになってたけど滅多にお世話になることのない、「文字列用ビット操作演算子」を触ってみたというお話です。 特に断りのない限り 2021-12-24 現在の最新安定版 Perl 5.34.0 で動作確認をしています。 旧来のビット演算子 Perl の多くの演算子には「数値用」と「文字列用」があります。 例えば比較演算子であれば ==, != は数値用、 eq, ne は文字列用といった具合です。 しかし、ビット操作用の演算子だけには、なぜかその区別がなかったのです。 以下は perlop Bitwise String Operators から引っ張ってきた
この記事は、Perl Advent Calendar 2021 の11日目の記事です。 10日目は @shogo82148 で「Perl 5.35.4 の defer を先取り」でした。 Perl 5.35.5 から利用可能になった iterating over multiple values at a time を試してみたお話です。 この構文は安定版にはまだ取り込まれていません。 特に断りのない限り 2021-12-11 現在の最新開発版 Perl 5.35.6 で動作確認をしています。 まずは Perl 5.35.6 をビルドする Perl 5.35.6 は開発版なのでビルド済みのバイナリは配布されていません。 しかし plenv を使っていれば特に難しいことはありません。 注意点は開発版の警告を抑制するために -Dusedevel オプションをしていることくらいです。 plenv
弊社では Terraform GitHub Provider を使って GitHub のレポジトリ管理・権限管理などを行っているのですが、 プロバイダーが repository_id を認識してくれない問題に遭遇しました。 原因を探ってみると GitHub GraphQL API に かなり大きな変更が入ること を知ったので、メモとして残しておきます。 グローバルノードID GraphQL API から扱えるすべてのオブジェクト (レポジトリ、ユーザー、etc) にはIDが振ってあります。 Using global node IDs 例えば僕 (@shogo82148) のノードIDは MDQ6VXNlcjExNTczNDQ= です。 $ curl https://api.github.com/users/shogo82148 | jq .node_id "MDQ6VXNlcjExNTcz
いつかやろうと思っていた AWS::Lambdaの Docker コンテナ対応、 年を越してしまったけど、ようやく手を付けました。 AWS Lambda の新機能 – コンテナイメージのサポート 使い方 以下の handler.pl を Docker コンテナとして AWS Lambda デプロイする例です。 use utf8; use warnings; use strict; sub handle { my $payload = shift; return +{"hello" => "lambda"}; } 1;
最近 Mackerel の AWS インテグレーション機能にいくつかセキュリティ強化のアップデートが入りました。 (「最近」と言っても最も古いアップデートは 2 年前ですが・・・) AWS インテグレーションで IAM ロールによる認証利用時の権限チェック頻度を変更しました ほか AWS インテグレーション CloudFront 連携で取得できるメトリックを追加しました ほか 【リリース予告】AWS インテグレーションの権限チェックを強化していきます AWS Step Functions インテグレーションをリリースしました ほか これらのアップデートは「混乱した代理問題(Confused deputy problem)」に対応するものです。 僕が AWS インテグレーションの設定をしている際にふと 「この機能、攻撃に利用できるのでは?」 と思いついてしまったので、 Mackerel サポ
Perl 5.34 がリリースされましたね。 と、言うわけで、 AWS::Lambda と actions-setup-perl に Perl 5.34 を追加しました。 AWS::Lambda AWS Lambda Layers の ARN 一覧はこちら。 具体的な使い方は過去の記事を参考にどうぞ。 もちろん大阪リージョンも入ってますよ! Amazon Linux 2 ベース Perl ランタイム arn:aws:lambda:af-south-1:445285296882:layer:perl-5-34-runtime-al2:1 arn:aws:lambda:ap-east-1:445285296882:layer:perl-5-34-runtime-al2:1 arn:aws:lambda:ap-northeast-1:445285296882:layer:perl-5-34-ru
もっと数学的な説明が欲しい方のために、少しまとめてみました。 問題の定式化 ハードマージンSVMではマージンの中にデータが入ることを許さず、次の条件を満たす必要がありました。 この条件では、データが線形分離不可能な場合に解が求まらない場合があります。 そこで、この条件を次のように緩和します。 はスラック変数と呼ばれるもので、先ほどの条件をどの程度違反しているかを表します。 データがマージンの中に入ってしまったときは、 誤って分類してしまったときはとなります。 ハードマージンSVMの目的関数にスラック変数をペナルティとして加えます。 はどの程度誤りを許すかを表します。 が大きいほど誤りに対して厳しく、ハードマージンSVMに近づきます。 双対問題への置き換え ハードマージンSVMと同様に双対問題へ置き換えます。 ラグランジュの未定乗数を導入し、 の最小化と置き換えます。 KKT条件から次の条件
Dependabot から送られてくるプルリクエストのテストが最近良くコケるようになったなあと思ったら、 3 月 1 日から GitHub Actions Workflow 内の GITHUB_TOKEN のパーミッションが変更になったそうです。 GitHub Actions: Workflows triggered by Dependabot PRs will run with read-only permissions 更新されたパッケージに secrets を盗み見るような危険なコードが含まれているかもしれません。 そのようなコードでも安全に実行できるよう read-only のパーミッションで実行されるようになりました。 その結果以下のようなワークフローが失敗するようになってしまいました。 プルリクエストにラベルをつけるような、レポジトリに対して write パーミッションが必要な
「GitHub Actions から継続的デプロイをしたい!」と思ったときに、 僕の扱うデプロイ先は AWS なことが多いので AWS のキー (AWS_ACCESS_KEY, AWS_SECRET_ACCESS_KEY ) を GitHub Actions secrets へ突っ込む必要があります。 まあ一回や二回ならやるんですが、デベロップメント、ステージング、プロダクション、と複数環境あったり、 プロジェクトも複数あったりして、中々の回数設定を行わなければなりません。 設定するだけでつらいのに、AWS はキーのローテーションを勧めてきます。つらい。 と言うわけで、シークレットの管理を極力しなくて済む方法を考えて、設定用の Action を作成しました。 fuller-inc/actions-aws-assume-role Configure AWS Credentials by As
ホモグラフィとは、平面を射影変換を用いて別の平面に射影することを言います。 二次元画像の変形などに使われます。 二次元画像の変形方法としてはアフィン変換がありますが、ホモグラフィはその拡張です。 アフィン変換は長方形を平行四辺形に変形させることしか出来ませんが、 ホモグラフィを使えば台形へ変形させることができます。 射影変換 ホモグラフィについて考える前に、 ホモグラフィの基本的な考え方である射影変換について考えましょう。 コンピュータで3Dを扱う場合、コンピュータ内部では3Dをごちゃごちゃいじったとしても、ほとんどの場合最終的な出力は画面(2D)です。 そのため、3Dを2Dに変換する作業が必要となります。 それを実現するのが射影変換です。 平面上の点をに変換することを考えます。 このときホモグラフィ変換は次式で表されます。 ここで、行列Hはホモグラフィ行列といい、この変換を決めるパラメー
2010年度NHK大学ロボコン「ロボ・ファラオ ピラミッドを築け」の自動ロボット「天地人」の経路制御に関する資料です。 オドメトリとは? ロボットの走行経路を制御するには、ロボットが今どこにいるのかを知ること、自己位置推定が必要となります。 GPSを使ったり、カメラで撮影た床や天井の映像から推定したりといった様々な手法が提案されています。 しかし、これらの手法は非常に複雑な処理が必要となります。 そこで、比較的簡単な、タイヤの回転角から現在位置を推定する手法を考えてみましょう。 この様な手法は、オドメトリやデッドレコニングといいます。 直線近似 制御モデルの作成で扱ったように ロボットの速度・角速度と、タイヤの速度関係は次のように表すことができます。 この関係から逆に、タイヤの速度から、ロボットの速さと角速度を求めることができます。 これから以下の微分方程式を解けば良いことがわかります。
なんだか今日はもうコードを書く気がしないので、最近思っていることをつらつらと・・・ タイトルの通り、最近 AWS SDK for Go v2 の行く末がちょっと気になっています。 あんまり話題になっているのを観測できていないので、少し現状を書いてみます。 背景 最近あったビッグイベントが v0.25.0 のリリースです。 Client Updates in the Preview Version of the AWS SDK for Go V2 パッケージの構成が見直され、APIの呼び出し方法も変わりました。 まあ、プレビュー版なのでよくあること・・・なんですが、ちょっと変更点が多すぎて追いきれない。 v0.25.0 移行で入った変更の数々 ちょっと一例を見てみましょう。 設定の読み込み Before: v0.25.0 より前は external パッケージを使って設定を読み込んでいました
次のページ
このページを最初にブックマークしてみませんか?
『Shogo's Blog』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く