[試して理解]Linuxのしくみ ―実験と図解で学ぶOS、仮想マシン、コンテナの基礎知識【増補改訂版】

ネットで評判が良さそうだったので買って読んでみました。

ポップなタイトルや表紙から一見すると初心者向けのLinux入門書に見えますが、実はしっかりとしたLinuxカーネルの入門書です。

300ページほどとさほど多くないページ数でプロセス管理、メモリ管理、ファイルシステム、さらには仮想化・コンテナと幅広いトピックがカバーされているのですが、限られた分量でなるべくわかりやすく説明するようかなり配慮されて書かれていることが読んでいるだけで伝わってきますし、何より読んでいて面白い。この「読んでいて面白い」という感覚がどこから来ているかというと、アプリケーション開発者の視点に立って書かれているからなのかなと思いました。企業での新人教育などにもよさそうと感じましたが、この本は改訂版で初版も評判が良く、多くの企業や大学などですでに教本として使われていたようです。初版はサンプルプログラムがCで書かれていたようですが、今回はPythonやGoで書かれているのもよいですね。

若干説明不足を感じる部分もあるものの、これだけの分量(しかもコードやチャート、図表なども豊富)に、これだけのトピックがわかりやすくまとまっているという点に著者の方の凄まじい手腕を感じる一冊でした。

自宅PCをM2 MacBook Airに買い換えた

自宅ではMacBook Pro 13-inch Late 2013をかれこれ8年半ほど使用していたのですが、数年前からバッテリーが膨張してきてしまっていたこと、最近はスペック的にもかなりしんどくなってきたこと、USB-Cでの周辺機器の接続性などで不満を感じており、ずっと移行先を検討していたのですが、Apple SiliconのMac環境もそろそろこなれてきた様子だったのでM2 MacBook Airに買い換えてみました。

構成は以下のような感じ。

  • 8コアCPU、8コアGPU、16コアNeural Engine搭載Apple M2チップ
  • 16GBユニファイドメモリ
  • 512GB SSDストレージ
  • True Tone搭載13.6インチLiquid Retinaディスプレイ
  • 1080p FaceTime HDカメラ
  • MagSafe 3充電ポート
  • Thunderbolt / USB 4ポート x 2
  • 30W USB-C電源アダプタ
  • Touch ID搭載バックライトMagic Keyboard - 英語(US)

開発環境周りは普段使っているものはすでに全てApple Siliconに対応しており特に困ることはありませんでした。dockerでArmイメージがないものがあるくらいでしょうか。以前のバタフライキーボード + タッチバーは最悪だったのでタッチバーが廃止されてキーボードがまともになったのは有難いです。MagSafeも復活してますが、これは別にもうUSB-Cでいいんじゃない?という感じがします。特に自分は業務用MacBookへの周辺機器の接続をUSB-Cドック経由に一本化しているので、このドックのケーブルを差し替えるだけで業務用MacBookと私用MacBookで給電や外部ディスプレイ含めてすべての機器を切り替えることができるようになりました。

14インチMacBook Proも検討したのですが、値段的に手が出ないのと、Airにするならスペック盛り盛りにして高くなってしまうのも本末転倒かなということで。とはいえ今まで使っていたのが9年前のモデルなのでこのスペックのAirでもめちゃくちゃ快適です。TrinoやGitBucketなどのビルドもかなり高速(GitBucketは以前の4倍以上)になりました。ファンがないので煩くないのはいいんですが、大きなソフトウェアのビルドなどCPUを使う処理を走らせていると結構発熱しますし、バッテリーも言われているほど全然減らないという感じでもないですね。まあサイズ的に取り回しもしやすいし、一般的なソフトウェア開発用途には十分ではないでしょうか。

これは8年半頑張ってくれたMacBook Pro。今までで一番長く使ったPCかもしれない。初めてのMacだったし、国内外のカンファレンスなどでも常に持ち歩いていたのでとても思い入れ深いマシンだった。長い間ありがとう。移行が終わったらAppleに引き取りを申し込まなくては…。

ロジクール MX Keys Mini for MacとM650で入力デバイスを無線USB接続に揃えてみた

MX Keys Miniは以前から気になっていたのですが、日本だと日本語配列のものしか入手できないので様子見していたところ、最近発売されたfor Mac英語配列とのことだったのと、LogiBoltというロジクール独自の無線USBアダプタ経由での接続が可能とのことで、これとLogiBolt対応マウスをドックに接続したLogiBoltアダプタ経由で接続するようにしておけば、キーボードとマウスを無線USBで接続しつつ*1、業務用MacBookと個人用MacBookでUSB-Cケーブル一本で周辺機器一式の切り替えが可能になるのでは…と思い購入に踏み切りました。*2

for Mac以外のモデルはカラバリがあるのですが、for Macはホワイト一色です。

バックライトが付いているのですが、白いキートップ + バックライトは明るい場所で文字が見えにくくなるのでキートップは黒の方がよかったかも…。まあ暗い場所で使うこともないのでバックライトは常時オフにして使っています。打鍵感はさすがに良いです。ThinkPadキーボードと比べても深いストロークキートップの質感も高いです。パンタグラフキーボードとしては最高峰だと思います。配列もMacBookのキーボードとほぼ同じなので違和感ありません。接続はBluetoothまたはLogiBoltで三台までペアリング可能、充電用のUSB-C端子がありますが有線接続はできません。注意事項としてファンクションキーはMac側の設定を変えても通常の動作にはなりません。後述のLogi Options+で設定するか、Fn + ESCキーで本体だけで通常に動作に切り替えることができます。

マウスはM650というLogiBoltアダプタ付属のもので、こちらはカラバリがあるのですがはキーボードにあわせてホワイトにしました。

サイズが通常サイズとラージの二種類がありますが自分は通常サイズのものを購入しました。ボタンが2つ余分についててマウスホイールとの組み合わせで横スクロールに使えたりしてなかなか便利です。電源は単三乾電池なので少し重さがあります。MX Anywhereというさらに上位のモデルもあるようですが、さすがにマウスに1万円越えは厳しい。

しかし迂闊だったのがマウスは最初から付属のLogiBoltアダプタとペアリングされているので何もしなくても無線接続可能だったのですが、キーボードの方は一度Logi Options+という専用ソフトで当該のLogiBoltアダプタ経由で接続設定をする必要があるという点です。一度設定してしまえばLogi Options+がインストールされていないマシンでもLogiBolt経由での接続が可能になります。

www.logicool.co.jp

なお、ロジクールの機器に付属しているLogiBoltアダプタはUSB-Aなのですが、USB-Cのアダプタも販売されているようです。ただしちょっとサイズが大きいです。

ドック経由ではありますが、これでようやくUSB-Cケーブル一本に周辺機器をまとめることができました。ディスプレイをUSB-C対応のものにすればドックも不要になりそう。以前はUSB-Cだといちいち変換アダプタを咬まさないといけなくて不便と思っていたのですが、ここまで来るとようやくUSB-C便利だなという気持ちになってきました。

*1:マルチペアリング可能なBluetoothキーボードとマウスの組み合わせでもいいのですが、業務用MacBookBluetoothがどうにも不安定なのと、機器ごとに接続先を切り替えないといけなかったり、OSが起動するまでは使えなかったりと、USB経由での無線接続と比べると色々不便

*2:2年以上使っていたThinkPadキーボードIIがだいぶヘタってきたのでそろそろ買い替えようと思っていたのもある

APIデザイン・パターン (Compass Booksシリーズ)

ManningのAPI Design Patternsの日本語翻訳版で、GoogleのソフトウェアエンジニアでGCPAPIデザイン等にも従事された方が書かれた書籍とのことです。原著はこちら。

なかなか分量があるのと、誤植と思われる箇所や洋書の翻訳本にありがちな日本語として意味が取りづらい部分が多く、一通り読むのに結構時間がかかってしまいました。

基本的にHTTPベースのJSON APIを想定した内容になっています。さすがにGoogleの方が書かれたというだけあり、通常のユースケースでは思い至らないであろう懸念点なども指摘されており「なるほど」と思う反面、もっと一般的なケースで問題になるであろう点がカバーされていなかったり、逆に大抵のケースでは問題にならないであろう点を掘り下げているケースもあったりと偏りがある感じがしました。前述の通り日本語としての読みづらさも相まって読み手のリテラシが結構要求される感じがあります。

万人におすすめできるかというと個人的には若干微妙な気がするのですが、実際にAPIを設計する際の指針や考慮すべき点など、この本に書かれている内容もヒントの1つとして活用できるとよいのではないかと思いました。

GitBucket 4.38.0をリリースしました

Scalaで実装されたオープンソースのGitサーバ、GitBucket 4.38.0をリリースしました。

https://github.com/takezoe/gitbucket/releases/tag/4.38.0

イシュー、プルリクエストでカスタムフィールドを定義可能に

イシュー、プルリクエストに追加情報を入力するためのカスタムフィールドを追加できるようになりました。

カスタムフィールドはリポジトリの設定ページから追加・削除が可能です。

イシュー、プルリクエストで複数ユーザのアサインに対応

イシュー、プルリクエストで複数のユーザをアサインできるようになりました。

ユーザ自身でのパスワードリセットをサポート

ユーザがパスワードを忘れてしまった場合など、ユーザ自身でパスワードのリセットを行えるようになりました。

なお、この機能はデフォルトでは無効になっており、有効にするにはGitBucketの管理者が管理画面で設定を行う必要があります。リセット時にはメールを送信するため、SMTPの設定も必要になります。

Markdownでのテーブルのレンダリングを改善

Markdownで横幅が広すぎるテーブルの場合、これまではブラウザの表示領域を貫通して表示されてしまっていましたが、横スクロールバーを表示して表示領域内に収まるようになりました。

Jettyのアイドルタイムアウト時間を設定可能に

スタンドアロンモード起動時に指定可能なオプションとして --jetty_idle_timeout という新しいオプションが追加され、Jettyのアイドルタイムアウト時間を設定できるようになりました。デフォルトは300000(= 5分)です。

今回のバージョンではこの他にも様々な改善やバグフィックスを行っています。詳細についてはIssueの一覧をご覧ください。

Git Forkでpushダイアログが勝手に表示されてしまう問題の解決策

Git ForkというGUIクライアントをベータ版の頃から愛用しています。商用化の際にベータ時から利用していたユーザ向けに提供されたクーポンでライセンスを購入し、いまだに使い続けています。余計な機能がなく軽量かつ安定していますし、マージや対話型のリベースもやりやすいので手放せません。

takezoe.hatenablog.com

ただ、1つだけ問題があり、とある時点からMac上でCLI(Forkはコマンドラインから起動するためのコマンドをインストールする機能を提供しています)から起動するとpushダイアログが勝手に表示されてしまうという問題に悩まされていました。

ForkのIssuesにもこの現象は随分前からレポートされているのですが、長らく解決の糸口が見えない状態でした。

github.com

が、最近になって進展があり、一度プロセスを落としてしまえばCLIから起動してもpushダイアログは表示されない、open -a Fork で起動した場合はpushダイアログが表示されない、ということが判明したようです。まだ完全な解決には至っていないようですが、現状のワークアラウンドとしてはCLIをアンインストールして以下のようなエイリアスを定義しておけばよさそうです。

alias fork="open -a Fork"

ずっとなんとかならんかなーと思っていたのですが、これで長年の問題が1つ解決しました。

xsbt-web-pluginでServlet 5対応アプリを実行する

ScalatraのサンプルアプリケーションやGitBucketでは開発にxsb-web-pluginというJava Servletアプリケーション開発を支援するsbtプラグインを使っています。

github.com

ですが、標準でサポートされているのはJetty 9.4(Servlet 3.1)およびTomcat 9.0(Servlet 4.0)となっています。パッケージ名が javax.servlet から jakartaee.servlet に変更されたServlet 5.0に対応したプラグインは今のところ提供されていません。

ただし、xsb-web-pluginはカスタムコンテナもサポートしているのでbuild.sbtに以下の設定を追加することでJetty 11(Servlet 5.0)を使用することができます。

// カスタムコンテナとしてJetty 11を使用
enablePlugins(ContainerPlugin)
Container / containerLibs := Seq(("org.eclipse.jetty" %  "jetty-runner" % "11.0.11").intransitive())
Container / containerMain := "org.eclipse.jetty.runner.Runner"

以下のようにして起動します。

sbt ~Container/start

ちなみにxsbt-web-pluginはTomcatのサポートに関してはHerokuのwebapp-runnerを使用しており、このwebapp-runnerのサポートが現状ではTomcat 9までとなっているようです。Tomcatでも埋め込みサーバ用のライブラリが提供されているのでランチャーを自作すればTomcat 10を使用してServlet 5の開発ができそうです。

github.com

今となってはScalaServletアプリケーションを開発するのは少数派と思いますが、GitBucketではJGitのGitServletを使っている関係で今後もServletを使わざるを得ないのでxsbt-we-pluginでもServlet 5対応コンテナを正式にサポートしてほしいところです。