ブログ移転のお知らせ
ブログの移転に伴って、はてなブログでの記事投稿は終了します。
新しいブログのURLは https://kymmt.com/blog です。この記事を除いて、すべての記事は新ブログに移行してあります。従来のURL https://blog.kymmt.com でも新しいブログにリダイレクトされます。さらに、完璧ではないですが、/archiveや/entry/:slugなど、はてなブログのパスでアクセスしたときも、おおむね新ブログの対応するパスにリダイレクトするよう設定してあります。
このはてなブログはアーカイブとして残しておきます。一応、新ブログに対する重複コンテンツと見なされないようnoindexを設定しておきます。
最近は更新が滞っていたので読者がどの程度いるのかわからないですが、https://kymmt.com/blog/feed でAtomフィードを配信しているので、必要に応じてそちらで購読をお願いします。
2024年のふりかえり
1月-3月
- iPad Pro 第4世代 11インチ購入
- コンビニでのApple Accountチャージキャンペーンと初売りセールを駆使して割安で購入。しかし、その後5月に新型が発表
- Magic KeyboardとPencilもあわせて購入
- Rust、何もわからない… #12登壇
- 自分が入社する前から他のチームメンバーがやっていたことを紹介
- 資料
4月-6月
- TSKaigi 2024参加
- Go Conference 2024のスポンサー業務(ブース番)
- カンファレンスにおける企業スポンサーの典型的な動き方を把握した
- Mimestreamのannual license購入
- いまのところ満足
7月-9月
- 仕事で一部携わった販促の仕組みのリリース
- 『Ruby コードレシピ集』発売
- 7月頭に印刷所入稿日(8月頭)が決まり、間に合わせるために平日夜と休日を作業に費やした
- iPhone Pro 16購入
- iPhone Pro 14の下取りを使って40%割引で購入
- 並行プログラミングの語彙に疎すぎたので『増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編』を読んでRustで再実装
- 他社との共同勉強会開催業務
10月-12月
- 仕事で力不足ながらフロントエンド中心の業務
- React + CSS-in-JSな環境ではあるがCSSの書き方のコツをいまさら把握した
- Findy Job LT登壇
- 他のチームメンバーがやっていたことを紹介 + 技術広報として現場の課題の紹介
- 資料
- CotEditor v5が出たので、新機能Folder Navigationまわりでバグ報告
- JSConf JP 2024参加
- 登壇する同僚の応援
- Rust.Tokyo 2024スポンサー業務(ブース番、セッション登壇)
- 他のチームメンバーがやっていたことを紹介 + ごく一部だけ自分も関わった話(Axum extractorでのJSON Schemaバリデーション実行)を紹介
- 資料
- 『詳解 Rustアトミック操作とロック ―並行処理実装のための低レイヤプログラミング』を読み通してRustの同期プリミティブやメモリオーダリングに親しんだ
- 千葉雅也さんの哲学三部作を読んで啓発された
感想
自分の専門性がまだまだ浅い。日々の生活上でやることに優先順位をつけて時間を作ってやっていきたい。他分野の本も引き続き読んで、活かせるところは活かしていきたい。
Rustで『デザインパターン入門 マルチスレッド編』を再実装した
少し古いが、結城浩先生の『増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編』という本がある。
RustでasyncAsync BookやTokioのドキュメントを読もうとして、Rustのstdに入っているsyncモジュールやtheradモジュールの使い方を曖昧にしか理解していないと思ったので、練習としてstdのAPIだけを使って、この本で紹介されているマルチスレッドプログラミングのデザインパターン12種類をRustで書き直してみた。
やってみて、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。
