ブログ移転のお知らせ

ブログの移転に伴って、はてなブログでの記事投稿は終了します。

新しいブログのURLは https://kymmt.com/blog です。この記事を除いて、すべての記事は新ブログに移行してあります。従来のURL https://blog.kymmt.com でも新しいブログにリダイレクトされます。さらに、完璧ではないですが、/archiveや/entry/:slugなど、はてなブログのパスでアクセスしたときも、おおむね新ブログの対応するパスにリダイレクトするよう設定してあります。

このはてなブログはアーカイブとして残しておきます。一応、新ブログに対する重複コンテンツと見なされないようnoindexを設定しておきます。

最近は更新が滞っていたので読者がどの程度いるのかわからないですが、https://kymmt.com/blog/feed でAtomフィードを配信しているので、必要に応じてそちらで購読をお願いします。

2024年のふりかえり

1月-3月

4月-6月

  • TSKaigi 2024参加
  • Go Conference 2024のスポンサー業務(ブース番)
    • カンファレンスにおける企業スポンサーの典型的な動き方を把握した
  • Mimestreamのannual license購入
    • いまのところ満足

7月-9月

10月-12月

感想

自分の専門性がまだまだ浅い。日々の生活上でやることに優先順位をつけて時間を作ってやっていきたい。他分野の本も引き続き読んで、活かせるところは活かしていきたい。

Rustで『デザインパターン入門 マルチスレッド編』を再実装した

少し古いが、結城浩先生の『増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編』という本がある。

www.hyuki.com

RustでasyncAsync BookやTokioのドキュメントを読もうとして、Rustのstdに入っているsyncモジュールやtheradモジュールの使い方を曖昧にしか理解していないと思ったので、練習としてstdのAPIだけを使って、この本で紹介されているマルチスレッドプログラミングのデザインパターン12種類をRustで書き直してみた。

github.com

やってみて、syncのMutex, Arc, Condvarやthreadのspawn, scopeなどの使い方のパターンを把握できた。また、"Fealess Concurrency in Rust"などでも触れられているように、Rustのロックはデータ自体を包む。本のサンプルコードはJavaなのでsynchronizedを使っているのもあって、コードブロック単位で排他制御するJavaと、そうではなく排他制御するデータ自体が明示されるRustとの違いがよくわかった(Rustのほうが好み)。

Read-Write Lockはstd::sync::RwLockを使って済ませている一方で、Futureは本で紹介されている方式で自前実装したりとやや取り組みにムラがあるが、総じて勉強になった。

他のRust並行プログラミング関連のリソースも読んでいこうと思う。

『Rubyコードレシピ集』はどういう本か

共著で書いた『Rubyコードレシピ集』が2024-08-26に出るので、どういう本か説明します。

レシピ集とは

この本は技術評論社さんが出しているレシピ集シリーズの一つです。レシピ集シリーズは、いわゆるクックブックの形式でプログラミング言語やその他ソフトウェアの活用方法を実例を示しながら解説していく体裁のものです。今回は、そのレシピ集シリーズの新作として、Rubyにフォーカスした本を出版することになりました。

対象読者

この本は次のような読者に読まれることを想定して書きました(もちろん、この条件に当てはまらない方にも読んでいただきたいです)。

  • Rubyの入門は簡単に済ませている初心者
  • 他言語の経験者で新しくRubyに来た人

この本はクックブック形式ですが、章立ては基礎から応用の順にしてあります。入門者の人は、やりたいことを表すレシピ名と、やりたいことを実現するサンプルコードに基づいて、Rubyの言語機能や標準添付ライブラリ(組み込み、default/bundled gemsの一部)の適切な使い方を学ぶことができます。最終章では、実例をベースにRackを用いた簡単なWebアプリの作成方法までを把握できるようになっています。

また、他言語から来た人にとっては、慣れている言語でのあの書き方はRubyでどうやるのかという観点で読み進めたり、必要な箇所を参照することで、Rubyの使い方を手っ取り早く学べます。

書いていること、書いていないこと

書籍の公式ページの目次からわかるように、レシピ集シリーズの書籍の構成に沿ってRubyの言語機能や標準的なライブラリに関する話題をひととおりカバーしています。

Rubyは近年も継続的にコーディングを便利にする機能が入っています。Ruby 3以降の例の一部を順不同で紹介すると、HashのShorthand Syntax、thenによるパイプライン、Data、正式な機能になったパターンマッチなどです。本書ではこれらの実例も紹介しているので、ひさびさにRubyについて調べるという人にも新鮮な情報を提供できると思います。

他にも、著者陣はRubyがスクリプティングに便利な言語だと常々感じているので、その観点で使えるユースケースもレシピとして掲載しました。システムのコマンドとstdin/stdout/stderrを扱えるopen3、スクリプト単体で外部ライブラリをインストールし実行できるbundler/inline、DATA/__END__でテキストデータをスクリプト内に埋め込んで扱う方法など、スクリプティングや作業自動化を便利にする機能を複数取り上げています。

一方で、あえて書いてない話題もあります。わかりやすいのはRailsで、「Railsで〜したい」というレシピは掲載していません。この理由としては、「対象読者」で書いたとおり本書は「Rubyの言語機能や標準ライブラリをまず適切に使えるようになるのを助ける」本としたためです。また、Rails自体が扱う対象として大きいことや、Rails自体の学習リソースは(技評さんから刊行されているものも含め)すでに充実しているので、そちらを読んでいただいたほうがいいだろうという理由もあります。

とはいえ、Webアプリの開発にも通じる、より基礎的な話題は掲載しています。たとえば、オブジェクト経由でのDB操作の一例としてActive Record単体で使うレシピを紹介したり、基礎的なWebアプリケーションの機能を実現するために素のRackで作るWebアプリのレシピを紹介したりと、Railsなどのフレームワークの基礎的な部分がどうなっているかというとっかかりをつかめるようにしています。

おわりに

『Rubyコードレシピ集』がどういった本なのかについて著者の一人として説明してみました。紙版の書籍は2024-08-26発売です。ぜひご一読いただければ幸いです。

GitHub ActionsでSQL Serverサービスコンテナの起動を待つ

GitHub ActionsでSQL Serverサービスコンテナ1の起動を待つには、次のようにワークフローの設定を書く。

jobs:
  test:
    runs-on: ubuntu-latest
    services:
      mssql:
        image: mcr.microsoft.com/mssql/server:2022-latest
        env:
          # 以下はmcr.microsoft.com/mssql/server自体の設定
          ACCEPT_EULA: Y
          MSSQL_SA_PASSWORD: ${{ secrets.MSSQL_SA_PASSWORD }}
          # 以下はsqlcmdの設定
          SQLCMDUSER: sa
          SQLCMDPASSWORD: ${{ secrets.MSSQL_SA_PASSWORD }}
          SQLCMDDBNAME: mydatabase
        ports:
          - 1433:1433
        options: >-
          --health-cmd="/opt/mssql-tools/bin/sqlcmd -Q 'SELECT 1'"
          --health-interval=10s

結論としては、イメージに入っているsqlcmdを使い、DBに向けてSELECTできるかどうかでhealthyかどうかを判断する。

envの意味は次のとおり。

名前 意味
ACCEPT_EULA この値があるとライセンス条項に同意したことになる
MSSQL_SA_PASSWORD 管理者(sa)のパスワード。強めのパスワードポリシーがある。必要に応じてsecretsに格納したものを使う
SQLCMDUSER sqlcmdが使うユーザー名。管理者で接続する
SQLCMDPASSWORD sqlcmdが使うパスワード
SQLCMDDBNAME sqlcmdが接続するデータベース

optionsは"Creating PostgreSQL service containers - GitHub Docs"に書いてあるような方法そのまま。

  • sqlcmdは /opt/mssql-tools/bin/sqlcmd に置いてあるものを使い、DBMSが実行してくれる最小限のクエリとしてSELECT 1を発行
  • リトライやインターバルは適宜設定

とする2。