この記事は、Perl Advent Calendar 2021 の穴埋め用の予備記事です。 当日まで担当者が決まらない日が何日もあってドキドキしましたが、いやー、なんとか埋まりましたね。 記事を投稿してくださった皆様ありがとうございました。
さて、今年は万が一枠が埋まらなかった場合に備えて下準備をしておきました。
Perl 5.34.0 の try-catch を触ってみる Perl 5.35.4 の defer を先取り Perl 5.35.5 の iterating over multiple values at a time を先取り Perl の文字列用ビット操作演算子を使ってみる この辺の記事たちですね。 カレンダーが埋まる見込みが立ったので放置していたのですが、実は調査だけしていたネタがひとつ残っています。 2022年のネタにしても良いんですが、どうせその頃には忘れているので今ここで供養してしまいましょう。
というわけで、今回触ってみたのは fc 関数 です。
特に断りのない限り 2021-12-24 現在の最新安定版 Perl 5.34.0 で動作確認をしています。
Case-Folding fc 関数 は Case-Folding を行う関数です。 そもそも Case-Folding って何?って話なんですが、日本語に対応する概念が存在しないので和訳が難しい・・・。 大雑把にいうと 「大文字・小文字の正規化」 をおこなう関数です。
例えばこのブログから “Case-Folding” という文字列を検索したくなったとしましょう。 表記ゆれがあるかもしれないので、大文字と小文字の違いは無視したい、 つまり “case-folding” や “CASE-FOLDING” も対象にしたいということはよくあると思います。
こんなときこそ fc 関数の出番です。 fc 関数を使うには feature プラグマで明示的に有効化が必要です。
以前 Bash と PowerShell の Polyglot を書いたことがあったんですが、 「そういえば、どこにもメモってないな〜」と思い出したので、記録として残しておきます。
背景・目的 GitHub Actions には run というステップがあります。 任意のシェルスクリプトをかける便利なステップなんですが、 マトリックスビルドでマルチプラットフォームなワークフローを書いていると罠があります。
例えば以下のワークフローは 「Hello GitHub Actions!」とログに表示するだけの簡単なものです。
on: push: pull_request: jobs: job: strategy: fail-fast: false matrix: os: [ubuntu-latest, windows-latest, macos-latest] runs-on: ${{ matrix.os }} steps: - name: Ubuntu, macOS, Windows で実行する # shell: bash # Ubuntu, macOS でのデフォルト # shell: pwsh # Windows でのデフォルト run: | echo "Hello GitHub Actions!" コメントに書いたとおり Ubuntu, macOS では bash、Windows では PowerShell Core と デフォルトのシェルが環境によって異なります。 bash にも PowerShell にも echo コマンドが存在するので、この例はなぜか動いてしまうのですが、 もっと複雑な処理ではこうも行きません。
この記事は、Perl Advent Calendar 2021 の24日目の記事です。 23日目は @hitode909 で「リポジトリ内のソースコードを機械的にリファクタリングし続けるスクリプトを作る」でした。
今日はちょっと前から使えるようになってたけど滅多にお世話になることのない、「文字列用ビット操作演算子」を触ってみたというお話です。
特に断りのない限り 2021-12-24 現在の最新安定版 Perl 5.34.0 で動作確認をしています。
旧来のビット演算子 Perl の多くの演算子には「数値用」と「文字列用」があります。 例えば比較演算子であれば ==, != は数値用、 eq, ne は文字列用といった具合です。
しかし、ビット操作用の演算子だけには、なぜかその区別がなかったのです。 以下は perlop Bitwise String Operators から引っ張ってきた例です。 | は論理和を求める演算子ですが、両辺の型に応じて結果が変わります。
use warnings; use strict; use feature qw/say/; say 150 | 105; # = 255 (0x96 | 0x69 = 0xFF) say '150' | 105; # = 255 say 150 | '105'; # = 255 say '150' | '105'; # = 文字列の '155' (ASCII) 結果:
Perl Advent Calendar 2021 の途中ですが、ここで臨時ニュースです。
AWSジャカルタリージョン(ap-southeast-3) が利用可能になったので、 それに併せて AWS::Lambda Perl support for AWS Lambda Custom Runtime も公開しました。
SHOGO/AWS-Lambda-0.0.34/Changes 以下のランタイムが利用可能です。
arn:aws:lambda:ap-southeast-3:445285296882:layer:perl-5-34-runtime-al2-x86_64:1 arn:aws:lambda:ap-southeast-3:445285296882:layer:perl-5-32-runtime-al2-x86_64:1 Paws はこちら。
arn:aws:lambda:ap-southeast-3:445285296882:layer:perl-5-34-paws-al2-x86_64:1 arn:aws:lambda:ap-southeast-3:445285296882:layer:perl-5-32-paws-al2-x86_64:1 Arm64 アーキテクチャについては未対応のようなので、AWS側の対応が終わり次第追って追加します。
以上、臨時ニュースでした。
引き続き Perl Advent Calendar 2021 をお楽しみください。 まだカレンダーに若干の空きがあります。ブログ記事の投稿も大歓迎です!
参考 Now Open – AWS Asia Pacific (Jakarta) Region AWS::Lambda
この記事は、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 install 5.35.6 -Dusedevel plenv local 5.35.6 ハッシュのキーとバリューのペアの一覧を出力する Perl7関連で色々とゴタゴタがあった 影響で、 Perlの今後の機能拡張は RFC(Requests For Comments) PPC(Proposed Perl Changes) の形式を取っていく事になりました(2024-06-18修正、RFCからPPCへ名前が変更されました) この機能はそのRFCの記念すべき(?)第一号です!
Multiple-alias syntax for foreach さて、プログラムを書いているとハッシュ(連想配列)の全要素に対して何か操作をしたいということは頻繁にあると思います。 これまで Perl には専用の構文はなく、以下のように while 文と each を組み合わせて書く必要がありました。
この記事は、フラー株式会社 Advent Calendar 2021 の11日目の記事です。 10日目は @nobux42 で「再読:リファクタリング・ウェットウェア」でした。
もう一ヶ月前になりますが、AWS から ClockBound という時間を扱うとても 地味な 有益なソフトウェアがリリースされました。
Amazon Time Sync Service now makes it easier to generate and compare timestamps 地味過ぎてネタかぶりしなさそうなので 時間は現代の情報通信の基盤なので、しっかりと検証していきましょう! 日本ではNICTの 時空標準研究室 が標準時を定めています。 名前からしてかっこいい。
ClockBound とは 一言でいうとGoogleの TrueTime のAWS版です。 TrueTime は Google が自社のサーバーセンターに設置している非常に正確な時計です。 Google が提供しているリレーショナルデータベースである Cloud Spanner は、 リージョンをまたいだ一貫性を保証するために TrueTime から生成されたタイムスタンプを利用しています。
ようするに ClockBound を使えば、 AWSのインフラ上に Google Cloud Spanner Clone を構築できる!(?)、というわけですね。 すごい!
ClockBoundD のインストール なんかすごそうなことがわかったので、とりあえず動かしてみましょう。
ClockBound はタイムスタンプを提供するデーモン「ClockBoundD」と、ClockBoundD からタイムスタンプを取得するためのライブラリ「ClockBoundC」に分かれています。 タイムスタンプの提供元がないと始まらないので、まずは ClockBoundD をインストールしていきましょう。
現時点(2021-12-11現在)ではビルド済みのバイナリは提供されていないようなので、ソースコードからビルドします。 READMEの手順にしたがってやっていきます。
この記事は、Perl Advent Calendar 2021 の10日目の記事です。 9日目は @shogo82148 で「Perl 5.34.0 の try-catch を触ってみる」でした。
アドベントカレンダー25日もあると疲れてくるので、今日もかる~く行きましょう。 Perl 5.35.4 から利用可能になった defer 構文を触ってみたというお話です。
defer 構文は安定版にはまだ取り込まれていません。 特に断りのない限り 2021-12-10 現在の最新開発版 Perl 5.35.6 で動作確認をしています。
まずは Perl 5.35.6 をビルドする Perl 5.35.6 は開発版なのでビルド済みのバイナリは配布されていません。 しかし plenv を使っていれば特に難しいことはありません。 注意点は開発版の警告を抑制するために -Dusedevel オプションをしていることくらいです。
plenv install 5.35.6 -Dusedevel plenv local 5.35.6 defer を使ってみる 使い方はいつものように use feature プラグマで有効化し、 defer BLOCK とするだけ。
use strict; use warnings; use feature 'say'; use feature 'defer'; { say "This happens first"; defer { say "This happens last"; } say "And this happens inbetween"; } 1; 出力:
この記事は、Perl Advent Calendar 2021 の9日目の記事です。 8日目は @doikoji で「Getopt::Longのスペルが覚えられない俺はとうとう覚える努力を放棄してラッパーを作った」でした。
アドベントカレンダー25日もあると疲れてくるので、今日はかる~く行きましょう。 Perl 5.34.0 から利用可能になった try-catch 構文を触ってみたというお話です。
特に断りのない限り 2021-12-09 現在の最新安定版 Perl 5.34.0 で動作確認をしています。
とりあえず使ってみる 使い方は簡単です。 use feature プラグマで有効化し、 try BLOCK catch (VAR) BLOCK とするだけ。 最初の try ブロックの中で die すると catch ブロックが実行されます。
use strict; use warnings; use feature qw(try); try { die "dead"; } catch($e) { print "catch: $e"; } # no more ";" here !!! 1; 出力:
try/catch is experimental at try-catch.pl line 5.
弊社では 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 "MDQ6VXNlcjExNTczNDQ=" このノードIDを使って GraphQL のクエリを書くことが出来ます。
$ gh api graphql -f query='query { node(id: "MDQ6VXNlcjExNTczNDQ=") { ... on User { name login } } }' { "data": { "node": { "name": "Ichinose Shogo", "login": "shogo82148" } } } ノードIDにはオブジェクトの種類の情報 (MDQ6VXNlcjExNTczNDQ= の例では「ユーザー」) も含まれているので、 GitHub が管理している全オブジェクトの中から一意に目的のノードを特定することが出来ます。
Setup Perl environment の開発中は、 いろんなバージョンのPerlをビルドして、いろんなバージョンのPerlでコードを実行します。 そんな中でPerlのコアモジュールのひとつである JSON::PP の挙動が変わっていることに気が付きました。 なんでだろう?とずっと気になったまま放置してたんですが、ちょっと調べてみました。
JSON::PP の挙動の変化 Perl 5.26 と Perl 5.28 で以下のコードを実行してみます。
use feature say; use JSON::PP qw/encode_json/; my $answer = 42; say encode_json({ answer => $answer }); say "Answer to the Ultimate Question of Life, the Universe, and Everything: $answer"; say encode_json({ answer => $answer }); Perl 5.26 で実行した場合: [Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ https://wandbox.org/permlink/tEJxPrlX8oaMbj6o
{"answer":42} Answer to the Ultimate Question of Life, the Universe, and Everything: 42 {"answer":"42"} Perl 5.