Rustの std::sync::RwLock はLinuxでwriter starvation問題を起こす (macOSなら平気)

お腹が減ったワンちゃん

まとめ:

  • std::sync::RwLock::{write(), try_read()} を併用した場合には「書き込みロックを最優先」という挙動は必ずしも期待できない (LinuxではNG)
  • Pthread の規約が挙動に自由度をもたせており、Linuxにおけるデフォルト実装では writer starvation が発生する
  • Rustにおいて writer starvation を回避しつつ readers-writer lock を使うには parking_lot::RwLock を使うと良い

続きを読む


トヨタの3.5ヶ月のソフトウェアエンジニア(研究開発)生活を振り返る

https://www.toyota-tokyo.tech/ より。大手町オフィスの様子。

前回の転職エントリから3.5ヶ月、すなわちトヨタに入社してから3.5ヶ月が経ちました。
3.5ヶ月間とても気持ちよく働けたので、振り返り記事を書いていきます。座右の銘は「後ろを振り返らない」だったのに、歳を取ると振り返りがちになるんでしょうか。

インターネットの向こうの皆様にもぜひ弊社に興味を持っていただきたいので、弊社の良いなと思うところを書きます。嘘で興味持ってもらっても誰も得しないので、嫌だなと思うところもちゃんと書きます。

続きを読む


トヨタ自動車に入社し、自動車データの収集〜分析基盤の研究開発やっていきます

https://www.toyota-tokyo.tech/ より。大手町オフィスの様子。

人生初の転職エントリです。お手柔らかにお願いします。

2021/09/01付でトヨタ自動車株式会社に入社しました。
大手町オフィス というソフトウェアエンジニアが多く集まる場所で、自動車のデータ収集から分析まで、エッジ(自動車)からクラウドまでの研究開発をやっていきます。

続きを読む


Rustでmockするならmockallで決まり!・・・でよろしいでしょうか?

Rustで DI (Dependency Injection)、してますか?
今日話題にするのはドメイン層でインターフェイスを定義してインフラ層でその実装を書くやつです。
例えばドメイン層で trait UserRepository を書いて、インフラ層で struct UserRepositoryImpl するやつです。

テストを書くとき、 struct UserRepositoryImpl はDBアクセスなどしてしまうので取り回しが悪いから、mock を作って fixture を入出力したいことありますよね。
Rustでそういうことやるなら mockall がオススメだよという記事です。

そんなに不満はないのですが、もしベターなやり方があったら記事末尾のコメントやTwitterやらもらえたら嬉しいです。

前職のFOLIO時代の同僚で現CADDiの むらみんさんの記事

外部通信のような比較的大きい副作用が絡むテストに於いて テストダブルを差し込むことは可能なのですが、かなりの労力が必要になる印象を持っています。

と書いていたのを今更ながら発見して、自分はこうしてるけど皆はどうしてるんだろ?と思って筆(キーボード)を取りました。

続きを読む


Rustの2種類の 'static

2種類の 'static

Rustの 'static 、難しいですよね。

「プログラム中ずっと生き残るライフタイムでしょ?簡単簡単」

なるほど。では次の2つの 'static の違いがわかるでしょうか?

1つめ
1
let x: &'static str = "Hello, world.";
2つめ
1
2
3
/// Returns some reference to the boxed value if it is of type `T`, or
/// `None` if it isn't.
pub fn downcast_ref<T: Error + 'static>(&self) -> Option<&T> { ... }

「・・・2つめのなんだっけ?」
という人はぜひ読んでみてください🦀

この記事では、Rustの2種類の 'static

  • 'static ライフタイム
  • 'static ライフタイム 境界

を解説します。

続きを読む


ぼくのかんがえたさいきょうの CircleCI 設定 for Rust

あまり見ない気がするので書きました。特徴は、

  • lint, testなどの各ジョブが並列に動く(ジョブ実行数を多くしてないとdocker containerの立ち上げ分むしろ全体時間はロスになることもあるが…)。
  • Travis CI のマトリクスビルド に近いことを、 parameters: を使ってやっている。
    • rust-toolchain ファイル に書かれたバージョンと、 .circleci/config.yml に書かれた MSRV (Minimum Supported Rust Version) の2つでビルドしている。
  • cargo-readme を使ってrustdocとREADMEを比較し、どちらかがメンテされていない場合にエラーにする(お好みで)。
  • キャッシュ使う。

あたりです。見慣れなさそうなところはインラインコメント付けましたので参考にしてください 💁‍♀️

続きを読む


自作CPU & 自作OSをやっていく (4) - macOSでPapilio Pro LX9のFPGAにBitstreamファイルを書き込む

Papilio Pro LX9

2020年1月から、趣味エンジニアリング活動として自作CPUと自作OSをやっていく。

最終的にはFPGAに自作のCPUを書き込んでいくのだが、筆者はFPGAを使った経験がほとんどない。
CPUの回路設計はまだ手もつけていないが、不確実性を下げるために、先にFPGAを購入して普段遣いのmacOSからFPGA開発ができるように整えておく。

最終的には、macOSから papilio-prog コマンドでBitstreamファイル (.bit) を Papilio Pro LX9 評価ボードに書き込むことに成功したので、その記録を備忘として残しておく。

自作CPU & 自作OS タグで、この前後の進捗とか目指しているもの(初回記事)とかを追えるようにしている。

続きを読む


自作CPU & 自作OSをやっていく (3) - riscv/riscv-tests の挙動を追う

2020年1月から、趣味エンジニアリング活動として自作CPUと自作OSをやっていく。

今回は、自作CPUのパフォーマンスベンチマークとして利用するつもりの riscv-tests の挙動を追ってみる。
関心があるのは、命令セットやOSの機能をどこまで用意してあげればベンチマークが実行できるのかという点。とりわけ、以下の観点をチェックしていく。

  • ISA (命令セット)
    • RV64F (単精度浮動小数点演算), RV64D (倍精度浮動小数点演算) を利用しているベンチマークはあるか。あるとしたらどれか。
    • RV64V (ベクトル演算) を利用しているベンチマークはあるか。あるとしたらどれか。
    • RV64A (アトミック命令) を利用しているベンチマークはあるか。あるとしたらどれか。
  • OS機能
    • ヒープ領域は必要か(スタック領域のみで十分か)。
    • スレッドをCPUコアに割り当てるスケジューラは必要か。

自作CPU & 自作OS タグで、この前後の進捗とか目指しているもの(初回記事)とかを追えるようにしている。

続きを読む


自作CPU & 自作OSをやっていく (2) - 64ビットRISC-Vの "Hello World" をRustで作った

2020年1月から、趣味エンジニアリング活動として自作CPUと自作OSをやっていく。

今回は、64ビットRISC-V (RV64I) の “Hello World” をRustで作ったので、そのリポジトリの紹介。

自作CPU & 自作OS タグで、この前後の進捗とか目指しているもの(初回記事)とかを追えるようにしている。

続きを読む


自作CPU & 自作OSをやっていく (1) - 全体像(随時更新)

2020年1月から、趣味エンジニアリング活動として自作CPUと自作OSをやっていく。

第一回のこの記事では、目指してることとか、作りたい成果物とか、ロードマップとか、進捗とかを記録していく。インプットが増えたり手を動かしていくと色々と軌道修正があるだろうから、この記事は随時更新されていく。ChangeLogをご参考。
進捗報告は 自作CPU & 自作OS タグで追えるようにしておく。

続きを読む