B-Teck!

お仕事からゲームまで幅広く

チームトポロジーの読書会をした

きっかけ

5月に転職し、配属先のチームがチームトポロジーをベースとした組織分割を進めている、ということで、長らく積読になっていたチームトポロジーを読みたいけどなかなか読み始められない…という話をTwitterに書いたところ、知らない間に読書会の企画が生えていました。

この日はちょうど入社して初めてオフィスに出社する日で、Twitterを全然見ていなくて、夕方頃に気がついてものすごく慌てたのを覚えています。
あれよあれよというまにキックオフが設定され、乗りかかった船だ!やるぞ!となったのが参加のきっかけです。 connpass.com

キックオフと以降の運営の感想

アジャイルコミュニティで読書会をされているdiscordサーバーに間借りする形で読書会がスタートしました。

初回のキックオフでは、アンケートを取る形で開催する曜日や進め方などが決まり、主体的な意見表明で決定されていく場ってすごいなぁなんて感想を持ちました。

自分きっかけで始まった読書会なのもあり、進行や以降のアナウンスに関しては私が引き取って進めさせてもらいました。
途中、参加者の方が多忙なタイミングが重なりスキップなどが多くなってしまったこともあったのですが、改めて参加しやすい曜日を聞いてみると良いのでは?という提案を頂いて会の形を整理したりして、ひとまず会として完走することができて嬉しい限りです。

参加した感想

参加する前は、社外のコミュニティに参加すること、読書会に参加すること、進行をすることと一通り全部初めてのことだったのでかなり緊張していました。
拙いやり方でご迷惑をおかけしたかなと思うのですが、参加者の皆さんに話しやすい空気を作っていただいたりして、本当に楽しかったです。
最初はどうしても発言しづらい部分があったのですが、他の方の感想への感想だったり、自分の小さな疑問を口に出してみると会話のきっかけにしやすいかも。

社内の同書の読書会にも参加していたのですが、別の組織にいる方の目線・経験から出てくるお話は自分の持っていた感想や考え方と違うものも多くて非常に勉強になりました。
会話の中でも、この記事で読んだ、この本で読んだ、と様々な出典が出てくるのもあり、知らなかった部分含めてかなり視野を広げられたかなと。

本の感想

書籍を通して、チームとしての認知負荷を下げるための取り組みであることが繰り返し語られていました。
混沌としがちな社内のチームのやりとりやコミュニケーションパスを、4つのチームタイプと3つのインタラクションモードで整理するという考え方はカタとして非常にわかりやすく、自分自身の経験からしても納得感のあるものです。
一方で、過度に認知負荷を下げた結果、局所最適な状態に陥る可能性が高まるのではないか?という会話も読書会の中で出ていました。
ギルドやコミュニティといった横串の活動の例は書籍の中にも登場するのですが、具体的なイメージはあまり持てず…。
スクラムの拡張による組織づくり──複数のスクラムチームをScrum@Scaleで運用する (WEB+DB PRESS plusシリーズ) でそういった部分に触れられていそう、というお話も聞けたので、近々読んでみようと考えています。

おわりに

初めてづくしの経験でしたが、全体を通して楽しく、知見も深められた良い読書会に参加できたな〜という感じでした。
また機会を見つけて読書会に参加したり、企画していったりできるといいな〜と思っています。
ありがとうございました!

ゼロからのOS自作入門をRustでやる 環境構築編

を読み始めた。(読了までいけるかはわからない)

せっかくなのでRustで書いてみようということでググりながらHello Worldの出力まで。
全部作ると大変そうなのでuefi-rsを利用する方針でやります。

環境等

この記事はM1 Macでローカル環境で直接実行することを前提としている。
Docker上での構築やWin・Linuxでの動作については対象としていない。

記事時点の実装は以下。
github.com

Rustのインストールとプロジェクト作成

公式のGetting started を参考にインストール。

$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh   

ベアメタルプログラミングをする場合nightlyのコンパイラが必要なケースが多いらしいので導入

$ rustup install 

ゼロからのOS自作入門をRustで でrust-srcも必要と書いてあったので用意した

$ rustup component add rust-src --toolchain nightly-aarch64-apple-darwin  

適当な命名でプロジェクト作成

$ cargo new rusty-mikan-os

実装とビルド

Rust で UEFI のハローワールド - 借り初めのひみつきち を参考に実装していく。

Cargo.tomlの修正

uefiの依存を追加

[dependencies]
uefi = "0.24"

.cargo/config.tomlの修正

ゼロからのOS自作入門 in Rust /ブートローダまで を参考にして以下を記述。

  • ビルドのターゲットを x86_64-unknown-uefi
  • UEFIアプリケーションを動作させる際はstdを利用できないため、必要なクレートを明示
  • coreクレートに必要なmemcpy などを compiler-builtins-mem から利用するように指定
[unstable]
build-std = ["core", "compiler_builtins"]
build-std-features = ["compiler-builtins-mem"]

[build]
target = "x86_64-unknown-uefi"

rust-toolchain.tomlの修正

nightlyでビルドされるように以下の記述を追加

[toolchain]
channel = "nightly"

main.rsの実装

ここの実装も Rust で UEFI のハローワールド - 借り初めのひみつきち を参考にした。
#![feature(abi_efiapi)] はこの記事を書いている時点では指定は不要になっていた。

#![no_std]
#![no_main]

use uefi::prelude::*;
use core::panic::PanicInfo;
use core::fmt::Write;

#[panic_handler]
fn panic(_info: &PanicInfo) -> ! {
    loop {}
}

#[entry]
fn efi_main(_handle: Handle, mut st: SystemTable<Boot>) -> Status {
    writeln!(st.stdout(), "Hello, world!").unwrap();

    loop {}
    // Status::SUCCESS
}

以下は記述に対する覚え書き

  • #![no_std] 
    • 通常のライブラリを利用しないベアメタル環境向けという指定
  • #![no_main]
    • 通常のmain関数から始まらないという指定
  • use uefi::prelude::*;
    • uerf-rsの読み込み
  • use core::panic::PanicInfo;
    • 通常はstdの中でpanicが定義されているが、no_std を指定しているので定義が必要
    • #[panic_handler] で定義したpanic関数が呼び出される
      • とりあえず現時点では無限にloopするだけ
  • #[entry]
    • no_main を指定してるのでエントリポイントを指定している
  • st: SystemTable<Boot>
    • UEFIが提供するサービスにアクセスするためのシステムテーブル

ビルド

ここまでの記述をしていれば、以下のコマンドでビルドできる。

$ cargo build --release  

imageを作成してQEMUで動作させる

必要なものをインストール

QEMUは手元でビルドなどはせず、brewで落ちてくるものを利用した。
fatのファイルシステム作成のために dosfstools も合わせてインストールする。

$ brew install qemu
$ brew install dosfstools

また、後続の作業のために GitHub - uchan-nos/mikanos-build: Build and run scripts for MikanOS を手元に用意しておく。
devenv配下にある、OVMF_CODE.fdOVMF_VARS.fd を後の工程で利用する。

imageの作成

新規のイメージを作成してfatでフォーマットする

$ qemu-img create -f raw disk.img 200M  
$ mkfs.fat -n 'MIKAN OS' -s 2 -f 2 -R 32 -F 32 disk.img  

作成したEFIをimage内に配置する

rootに作成された /EFI/BOOTの下に BOOTX64.EFI というファイルがあると、起動時に認識して呼び出してくれる。
image内にディレクトリを作成して、EFIファイルを配置する。

$ hdiutil attach disk.img  
$ mkdir -p /Volumes/MIKAN\ OS/EFI/BOOT  
$ cp target/x86_64-unknown-uefi/release/rusty-mikan-os.efi /Volumes/MIKAN\ OS/EFI/BOOT/BOOTX64.EFI
$ hdiutil detach /Volumes/MIKAN\ OS

作成したimageを起動する

前の工程で取得したOVMF_CODE.fdOVMF_VARS.fd を指定して、作成したimageを起動する

$ qemu-system-x86_64 \
  -drive if=pflash,format=raw,file=$HOME/ghq/github.com/uchan-nos/mikanos-build/devenv/OVMF_CODE.fd \
  -drive if=pflash,format=raw,file=$HOME/ghq/github.com/uchan-nos/mikanos-build/devenv/OVMF_VARS.fd \
  -hda disk.img

以下のような画面が出れば成功

ビルドからimageの起動までをshellにまとめる

都度実行するのも大変なので以下のファイルにまとめた
rusty-mikan-os/qemu_run.sh at d175d8d600a0255e8f6224483c5f73a6951a10ca · beatdjam/rusty-mikan-os · GitHub

参考にしたサイト

【ふりかえり】2023年5月

前回のふりかえり
【ふりかえり】2023年4月 - B-Teck!

Input・Output

勉強会

趣味とかその他

ゲーム

  • ゼルダの伝説 ブレス オブ ザ ワイルド

所感

仕事

5/11から新しい会社での業務をスタートしていました。
といっても、5月のうちはほぼオンボーディングという感じで、本格的に稼働するのは6月からになりそうです。
多機能なtoB向けサービスの開発ということで、早速覚えることの多さに翻弄されています。
久しぶりにちゃんとJavaを書くので、製品面でも技術面でもキャッチアップすることは多いですが、程よく楽しく進められています。
かなりの情報がオープンになっている組織なので、気になることを調べているとあっという間に時間が過ぎてしまうので、きちんと興味の向き先を絞る意識をしないとなあ、なんて考えています。
どういうバリューを出していけるのか手探りな状況ではありますが、楽しんで働いていけると良いな。

プライベート

4月から引き続いて教習所に通っています。
第二段階に入り、路上に出るようになっておっかなびっくり地元を走っていると、ちょっと不思議な気持ちです。
教習所の出口がちょっと坂道になってて、出発が一番の難関…。
新しい仕事が始まったのもあり、結構ツメツメのスケジュールになってしまってるのですが、6月中には一通り落ち着くはずなのでもう少しの辛抱かなという感じです。

ティアキンの発売もあり、周囲でゼルダの話を聞くことが多く、ずっとプレイしてなかったブレワイを今更プレイしています。
尖った部分はあまりないものの、2017年発売のゲームとして全体的にかなり高いレベルでまとまっているなーという印象。
ノーマルモードではガードジャストさえできれば詰んでしまうような敵もそう居ないので割と難易度は緩めにしてあるのかな。
どこまでプレイしたらティアキンに移行しようかな、と思いつつ、6月はストリートファイター6も発売してしまうのでプレイが止まってしまいそうな気も…。