『RustではじめるOpenGL』を読んだ

概要

RustとOpenGLを使ってリアルタイム3Dのデスクトップアプリケーションを作る方法を紹介する本。ある程度RustとOpenGLについて理解していることを前提に書かれている。OpenGL*1SDL*2、Dear ImGui*3(ImGuiと略される)といったC言語ライブラリと、それに対応するRustのcrateが紹介されている。

その他感想とか

  • OpenGLが難しい
    • APIWebGLとほぼほぼ同じように見える
    • レンダリングのための手数が多くて、それを一つ一つ丁寧にメソッドコール書かないといけないのが大変
    • 空で書ける気がしないので実際のアプリケーション作成にあたってはサンプルコードをゴリゴリに参考にすることになりそう
  • Vertex構造体やFrameBuffer構造体の中でnewするときにOpenGLにバインドする処理などを押し込むのは、関心が外にもれなくて可読性が高そう
  • OpenGL crateはAPIコールにunsafeを要求するので悲しみがある
    • Cライブラリに対する薄いWrapperを目指してるっぽいので仕方ない
  • ImGuiが楽しい
    • 短いコードでリッチなGUIをゴリゴリ作れる
    • こんな感じにWindow.build() の引数のクロージャにメソッドを書き連ねることで、呼んだ順にパーツが子ウィンドウに配置される
Window::new("Hello world")
    .size([300.0, 100.0], Condition::FirstUseEver)
    .build(&ui, || {
        ui.text("Hello world!");
        ui.text("こんにちは世界!");
        ui.text("This...is...imgui-rs!");
        ui.separator();
        let mouse_pos = ui.io().mouse_pos;
        ui.text(format!(
            "Mouse Position: ({:.1},{:.1})",
            mouse_pos[0], mouse_pos[1]
        ));
    });
  • UnityのIMGUIに似てる
    • 名前は似てるが別物である
  • 変数のバインドが統合されており、楽
  • パーツの種類が豊富
    • ui.show_demo_window() を実行すると使用できるUIが一通り確認できる
  • Rust実装がunsafeブロックを要求しないので嬉しい
  • リアルタイムレンダリングの基礎が学べて良かった
    • 基礎的なレンダリングパイプラインを組み、フォンライティングを実装した
    • 理論は理解してるつもりだけど、実装するとなると別次元の難しさがある
      • 行列演算をプログラムですることにあまり慣れていない
        • ひたすらコードを書いて手計算とコードのマッピングに慣れるとよさそう

*1:ローレベルなグラフィックスAPI/ライブラリ。

*2:グラフィックスやサウンド、入力インターフェースを扱うマルチメディアライブラリ。すごいプリミティブなゲームエンジンみたいなものと認識してる。

*3:OpenGLで動くGUIライブラリ。簡単なコードでちっちゃいウィンドウを出して様々なUIパーツを配置できる。めっちゃくそ便利。活用していきたい。

『Rustプログラミング入門』を読んだ

Rust言語の評判はちょくちょく耳にしていて関心があって、業務でもRustを扱う機会が増えてきたので入門書を手に取った。 結果として、Rustの基礎的な概念や文法と実践的なアプリケーション開発の知識をざっくりとインストールできてよかった。

本書の感想

「Part 2 実践」の章では、アプリケーション開発の実例が細かいステップで解説されていて良かった。コマンドライン、Webアプリ、WebAssembly、GUI、組み込みシステムの実例が紹介されていて、それぞれのアプリケーションを実現するcrate(Rustのパッケージ)の使い方が紹介されているので、今すぐにアプリケーションを作りたい人にはよいscaffoldになりそう。一方で、Rustを取り巻くはまだまだ黎明期と言うことができ、デファクトとなるcrateも目まぐるしく変化しているようである。本書ではDBへの接続に使うcrateとしてdieselが紹介されていたが、これを書いてる時点ではsqlxが主流らしくて、RecentのDL数はsqlxが上回ってる。何らかの手段でRust開発コミュニティーの最新情報をキャッチアップしておくとよさそう。たまにZennのRustトピックでも眺めておくとか。

Rustについての感想

月並みな感想ではあるが、GC気にしなくていいのが嬉しい、matchの網羅性が保証されてるのが嬉しい、if/matchが式なのでコンパクトにかけて嬉しい、所有権のお陰でメモリ周りの事故が防げて良い、文字列型多すぎてわけわからん、Option型やResult型がコアライブラリに用意されてるのありがたいしHaskellっぽい、エラー処理複雑、anyhowとthiserrorは標準ライブラリになってほしい、cargo異常に気が利くじゃん、プロジェクト作ったらgitリポジトリを初期化してくれるし、テストフレームワークとかフォーマッターが実装されてるの何?𝓛𝓸𝓿𝓮...、という感じ。

これからのこと

グラフィックスプログラミングの勉強を兼ねてRustでレイトレーサーを実装してみたいと思っていて、とりあえずは積み本の『RustではじめるOpenGL』を読んで、RustでグラフィックスAPIを扱う方法を習得しようと思う。

『実践ドメイン駆動設計』を読んだ

日々の業務におけるコードレビューやMTGにて、ドメイン駆動設計の用語を使ったコミュニケーションがなされることがよくあるのだが、インターネットで検索して得た知識しか持ち合わせておらず理解に支障があったことや、設計に関する知識の行き詰まり感があり、ここらでドメイン駆動設計を体系的に学んでみようと相成った。「Eric Evansのドメイン駆動設計」を長いこと積んでいたのでこちらを読むか迷ったのだが、難解であるとの評判をよく目にしたので、より平易とされる「実践ドメイン駆動設計」を手に取った次第である。

一通り読んで、ふんわりとしていたドメイン駆動設計の用語、EntityやらValueObjectやらへの理解が深まった。 局所的な理解はそれなりにできた気がするんだけど、全体通しての理解度はそれほど高くないと感じている。 ネットワークにつながったコンピューターたちから送られてくる大量のデータの処理と保存というミッションにどう立ち向かうかについて書かれている気がする。それは自分の職務領域と微妙にズレているのでマッピングできたりできなかったりする。

「境界付けられたコンテキスト」というのもふんわり理解にとどまる。というのも、複数のサーバーサイドアプリケーションで構成される巨大なシステムを設計したことがないのでふわっと眺めていた。そのようなシステムを作る機会があったときにでも再読するとよさそう。 「モジュール」とか「ファクトリ」の項は馴染みがあるので理解しやすかった。開発機能単位でコードライブラリを分離したり、なんならGitリポジトリごと分けてしまったりして、インターフェースを介した疎な結合でもって利用されるようにする、といったことは自然とやっていて、合理性を確認できた。 ヘキサゴナルアーキテクチャーも自然と使っていたので馴染み深く感じた。依存関係の一方向性はわりと意識している。仕事で扱うコードベースがクリーンアーキテクチャでやっていくぞ、ということになっていたので、思想が染み付いている。ヘキサゴナルアーキテクチャーとクリーンアーキテクチャー、特徴が似通っているところがある。

自分は主にUnityとかのゲームエンジンを利用したシステムのクライアントアプリを開発してるのだが、その領域はユーザーインターフェースレイヤが肥大化したシステムと言えるのかもしれない。クライアントアプリ単体で巨大な一つの境界付けられたコンテキストと見ることができそう。ゲームエンジンユースケースでは問題空間をどう捉えたらいいのだろう、とか考えた。「CG空間におけるキャラクターの行為」くらいの粒度でビジネス上の課題、というかユーザーに体験させたい体験を定義して、ドメインを定義するのかな、とか考えた。

WebGLを学んでる

「グラフィックスプログラミングを学びたいな~」と会社のSlackでつぶやいたところ、会社のオタクから「wgld.org を一通り読むといいよ」とのアドバイスを頂き、ちょこちょこと読んだりサンプルコードを写経したりしている。新規になにかインストールすることもなく、いつも使ってるブラウザで自由にレンダリングパイプラインを組み立てられる体験は新鮮に感じる。かなり分量があるがコツコツやっていくことにする。

サイトを見ながら書いたコードをGitHubにアップロードした。GitHub Pagesを有効にして、HTMLがレンダリングされるようにした。成果物を眺めるのに便利。 github.com