github.com/hiboma/hiboma を更新: ブログや会社のテックブログのリンクをまとめた 〜 Infra Study 2nd #6 の宣伝

技術の話です。 https://github.com/hiboma/hiboma を久しぶりに更新したのと、そこに絡めて Infra Study の宣伝です

hiboma/hiboma リポジトリ。これは何ですか?

github.com

ソースコードリーディングした際のメモ書きや、仕事の中で遭遇した問題を調べたり、再現を試みたり、ツールの使い方を書いたり、あれやこれやと雑記していたリポジトリです。数年続けていたらそこそこの量になったものを公開していました。


自分が公開しているリポジトリで一番人気という謎の地位を獲得している

f:id:hiboma:20210928230702p:plain

おそらく、何か調べ物をしていてリポジトリの文章を読んでくれた人がスターをつけてくれているぽい ⭐️ ありがとうございます

中途半端に書き下ろしたものもあり、中には検索のノイズになってるテキストもある。せっかく調べ物をしてたどり着いた人には ちょいと申し訳ない気分ではある。

例えば、カーネルの関数名なんかで Goolge 検索すると このリポジトリが引っかかってしまうことがある。「これ書いたの誰だ?」「俺やー!!!」 )


改めて書いた内容を見直してみると、ほとんど忘れてしまっている。「こんなん便利じゃん?」「こんな仕組みだったのか! 」「よく調べたな。覚えてない」... と自分でも再発見があったりする。

古くなってしまった内容も多々あるが、strace や gdb あたりを使ったデバッグ/調査 のアプローチは 今でも全然通用するとこかなと思う

久々に更新

ここ数年は Hatena Blog あるいは会社のテックブログに技術ネタを書くようになったので、hiboma/hiboma リポジトリは全然更新しておらず、錆び付いたリポジトリになってしまっていた。

放置しておくのも勿体ないなと思って、久々に更新した。

f:id:hiboma:20210928231320p:plain

会社のテックブログに書いたエントリや Hatena Blog のエントリ一覧を REAMD.md に載せる更新を入れてます。(ただし、技術エントリだけに限定している)


README.md にまとめたエントリ一覧を改めて見ていると、やっぱり 何か調べ物をしたり、問題の再現を試みたり、小さな Proof of Cocenpt なコードを書いてみたり ... というエントリばかりがならんでいる。

自分の技術者としてのコアというか立ち位置というか大事にしているものというか、そんな <内的キャリア> が如実に浮かび上がるリストだなぁと思った

突然の宣伝

10/29(金) 開催 Infra Study 2nd #6「(仮)インフラ技術とキャリア」 では、先に書いた 自分の技術者としてのコア をキャリアの話と絡めて話そうかと思っている

forkwell.connpass.com

kazuho さんと yoku0825 さんは、キャリアの話よりは技術の話よりなので、私だけ ちょいと毛色が違うかな? イベントの方針次第で、もしかしたらガラッと内容を変えるかもしれないです : )

『メンタリング 』- 会社の中の発達支援関係 - キャシークラム著 📚

概要

キャシー・クラムの出現によって、メンタリング研究・キャリア発達研究は大きな前進をみた。クラムは本書の中で、メンタリングの2つの機能「キャリア機能」と「心理・社会的機能」を同定し、それぞれの下位機能の存在を提言、また、メンタリングに基づく発達支援関係の有益性、代替的関係としてのピア関係の重要性を指摘、面接によるデータ収集、それに基づく仮説の構築・検討・修正・洗練という幾重にも及ぶ手続きを経、精査された上での理論を開陳する。「クラム以降」メンタリングの研究領域では膨大な数の実証研究が蓄積されることになった。本書はその嚆矢となった名著である。

どんな本か

メンタリングの研究としては古典/元祖にあたるような位置付けであるぽくて、メンタリングをテーマにしている Web サイトのあちこちで引用もされている。2021 の現在での研究書としての評価は、専門ではないので 確かなことは分からないが、学びになるポイントは現在でも多々あると思う

いつ/なぜ 読んだか

現在の会社では技術職として働いているが、キャリアを積むにしたがって後輩の研修や同僚の評価など "マネジメント" に関わるに機会が増えた。マネジメントに携わると、それまで技術職としてのインプットだけでは立ち向かえないなと危機感を覚えて、あれやこれやと書籍を読み漁ったのだが、その中の一冊だった。

自分の中では漠然と「メンタリング」についての概念はあった。大学での寮生活 (先輩後輩の関係がかっちり決まっている集団だった) を経た経験や、会社に入ってすぐに面倒をみ食べてくれた上司の存在などから 学び得たものにベースがあった。

言語化を試みると曖昧模糊と捉え所がなかったのを、専門の用語と概念もって抽象化して捉えるきっかけを与えてくれた一冊になるだろう。

何を得たか

メンタリングをキャリア的機能と心理・社会的に機能に分類する考えは、自分の経験にのみ頼っていたメンタリングの概念を抽象化・一般化・ブレイクダウンして理解する道具になった。また、自分のキャリアの発達と周囲の人々の関係性をメンタリングの視点から論じる武器にもななった。

キャリア的機能 心理社会的機能
スポンサーシップ 役割モデリング
推薦と可視性 需要と確認
コーチン カウンセリング
保護 交友
やりがいのある仕事の割り当て

自分、あるいは、同僚が「メンターになった」時に、自らのふるまいがどのような <機能> を果たしたか? を問いかけてみることで、自らのメンタリングを精緻化して考えることができるだろう。

また、自分の内的キャリアを見据える際に、自分の成長に寄与してくれた周囲の人々がどんな <機能> でもって支えてくれたかを考えてみると 一歩踏み込んだ省察・リフレクションになるかとも思う。

何は得られないか

研究書であるので、メンターとしての実践知を望みたい人には向かないかな

どのようにメンタリングを行うのが好ましいか 、どのようにふるまえばメンタリングが成功するか ... という指南はしてくれない。例えば、メンター/メンティーとで面談する際に 好ましいコミュニケーション方法 (傾聴、オウム返し ... ) はどんなものかといった目的であれば別の本を当たるのがよいかと思う

組織にメンタリングを導入する、文化として定着させていくには というテーマであったりも別の本がよいかなと思う

その他の感想

現在は古本でしか手に入らないようで、Amazon だと 1万円を超えるプレミアム価格になってしまっている。もう少し安価だと、同僚にも薦めたいな〜となるのだが、厳しい値段である。

私が買った時も 5000円くらいで少し高かった。

企業の本棚に一冊あると良いかなという本

那須 〜国道294号〜大田原 🚴‍♂️

自転車の話です


久々の好天 + 体調も整ったので自転車 (Domane SLR) でお出かけ

f:id:hiboma:20210919120611j:plain

f:id:hiboma:20210919162359j:plain

台風が過ぎて湿気が吹き飛んだのか、遠方の山まではっきりみえる澄んだ秋晴れになった。那須高原国道294号線〜大田原を巡った。

f:id:hiboma:20210921220613p:plain

走行距離 90km と獲得標高 687m

続きを読む

THE DESIGN OF THE UNIX OPERATING SYSTEM - Maurice J. Bach 📘

本棚を整頓していたら 『THE DESIGN OF THE UNIX OPERATING SYSTEM - Maurice J. Bach』 が出てきた

f:id:hiboma:20210916223931j:plain

1986年出版である。古典。

Classic description of the internal algorithms and the structures that form the basis of the UNIX operating system and their relationship to programmer interface. The leading selling UNIX internals book on the market.

UNIX オペレーティングシステムの基盤となる内部アルゴリズムや構造体、およびそれらとプログラマのインターフェースとの関係についての古典的な記述。市場で最も売れているUNIXインターナルの本です。 ( DeepL翻訳 )


表紙のデザインが気に入っている

2013年にペーパーバック版を買っていて、その後、どうしてもハードカバー版が欲しくなって買い足したものだ。表紙がかっこいいから飾りたかった! ただそれだけのために!

hiboma.hatenadiary.jp

ペーパーバック版はこんなん。(2013年に撮影)

ペーパーバック版は書き込みをしつつ読み込んだ。本棚には見当たらない。行方不明になってしまった。


肝心の中身の話。

UNIX System V Release 2 をベースにしているらしいが、図解や擬似コードを添えて説明が続く。

f:id:hiboma:20210916222351j:plain システムコールを呼び出す C のサンプルコードも出てくる。


擬似コード =骨格だけに削ぎ落として Design =「設計」にフォーカスした教科書と言えるんだろうか。擬似コードアルゴリズムは素朴に書かれている。

実際の 「実装」= ソースコードには些末な処理が含まれたり、変数、型や関数名などにも気を取られたりして、本質的な理解の妨げることもあるからなぁ


古い本だから 令和のこの時代に読む必要ないか ... というとそんなこともない

プロセスのモデルやシステムコールのインタフェースは 現代の *nix と同じだ

f:id:hiboma:20210917002335j:plain


そういえば、最近、デバンドページングとコピーオンライトを調べ直す機会があった

hiboma.hatenadiary.jp

この本にも載っている

System V Release 2は1984年4月にリリースされた[1]。シェル機能とSVIDが導入されている。新たなカーネル機能として、ファイルロック、デマンドページング、コピーオンライトが導入された[3]。

引用: https://ja.wikipedia.org/wiki/UNIX_System_V

f:id:hiboma:20210916222335j:plain


2013年当時、この本を読んだことで Linux カーネルを(ちょっとだけ)理解する基礎体力づくりにはなったよなぁと思い返していた

CAT EYE バーエンドミラーを付ける 🚴‍♂️

自転車のネタです

イントロダクション

自転車が増えたので周辺パーツをぽちぽち集めてる

hiboma.hatenadiary.jp

CAT EYE のバーエンドミラーを購入した 。以前から使っていたミラーが Amazon で見つからないので、代わりにほぼ同じ形状のを選んだ。

f:id:hiboma:20210908192350j:plain

取り付けのイメージ

f:id:hiboma:20210908204153j:plain

補助ミラーがあることで安全確認はぐっと楽になる。真後ろが楽に見れて走行中の安心感が全然違う。ロードバイク走行中に首をぐいっと曲げて後ろを見るのはちょいと面倒だし 安定感を損ねやすくバランスを崩して危険なこともある。

100km を超えるようなロングライドにもなると、補助ミラーがあると無いとでは疲労感にはっきり差がでてる

Garmin Varia と併用

Garmin Varia も付けているので、Varia センサーが反応したら「ミラーで後ろをみて車種や距離感を掴む」という併用をしている。バイクだったらあんまり気にしない、大型車だったら脇に避けたるのも検討する、道が狭くて追い抜けずにいるような車がいる場合は譲るとしてマナー向上 🍵

信号待ちで後続車がウィンカー出しているか、チラっと見るのも役立つ

見た目は ..

ただ、まぁ、正直なところ、ロードバイクの外観を損なうのは否めない。そういう商品レビューも見かけるし、同意はする。 スマートさは損なってもよくて、安心・安全に走れる方がいいなぁという人にはオススメ

注意書き

あくまで補助のミラーです。右斜め後ろが死角になり、追い抜きざまの車が見えないことがあります。ピっと後ろを向いての後方確認もしましょう。

風が強い日や交通量の多い道路なんかだと、死角に入った車の音が聞こえなくて 気がつかないことあるんだよなぁ。不意を突かれて怖いことがよくある

Trek Emonda SL のシートマストキャップのクランプを交換する 🚴‍♂️

自転車のネタです

イントロダクション

先日、Emonda SL で使っていたシートマストキャップ(カーボン) のクランプのネジが切れた + ネジ穴をナメてしまったので、34.9mm のクランプと交換した。

f:id:hiboma:20210906192350j:plain

白いのが古いクランプ。銀色のが新しくつけたクランプ。古いのは えいやーっと引っ張ったら外れた。接着剤で固定されてたぽい。

色は変えたくなかったが、オンラインでは見つからなかった。

なんでネジ切れたの?

オーバートルクだったのかな。Bontrager のトルクレンチ ( 最大 5Nm ) で扱っていたのだけどネジが切れてしまった。

www.trekbikes.com

トルクレンチは5年前から使っているものなので、不調になってしまったか、あるいは、ネジが寿命だったのかなぁ

f:id:hiboma:20210906200531j:plain

ちなみに Emonda を買った時にサービスで付属してきたものである

シートマストキャップ?

Trek 専用パーツで、いわゆるサドルポストにあたる

www.trekbikes.com

新品だと 18,000 円 する! 高い !さらにホワイトカラーは古いモデルで 現在、新品では手に入らない。メルカリやヤフオクでも稀にしか見かけない。

クランプは数百円で手に入った。これで何とかなるなら お財布にとっても優しい 💴

ロードバイクのハイグレードモデルに憧れはあるが 細かいパーツが専用品になってロックインされるし、メンテナンスも高価になりがちで、厳しいなぁと思う

謝辞

クランプは下記のブログで交換できることを知ってチャレンジしてみました。 大変ありがたい!

note.com

Linux: mmap(2) したメモリに書き込みした際の Copy On Wirte を観察する

イントロ

ペパボ社内 Slack で Linux の CoW = Copy On Write について、 id:ryuichi1208 id:udzura とディスカッションして盛り上がっていた。カーネル内で CoW を処理する関数を追えないか? という話があがったので、調べてみた次第。

( なぜ CoW の話が出てきたのか / どんなことをディスカッションしてたのかは id:ryuichi1208 がまとめくれるかも? )

結論

CoW を観察するには do_wp_pageを観察するといいみたい

wiki.bit-hive.com

( いつもお世話になっております )

do_wp_page のソース

https://elixir.bootlin.com/linux/v5.11.22/source/mm/memory.c#L3085

検証環境

Vagrant で用意した

$script = <<-SCRIPT
sudo apt-get update && apt-get install -y build-essential bpftrace bpfcc-tools linux-headers-$(uname -r)
SCRIPT

Vagrant.configure("2") do |config|
  config.vm.box = "bento/ubuntu-21.04"
  config.vm.provision "shell", inline: $script
end

検証コード

以下の検証コードを用意した

  1. 親プロセスで mmap(2) して minor page fault を起こしておく
  2. 親プロセスが fork(2) する
  3. 子プロセスが 1 のメモリに書き込みして minor page fault を起こす
  4. カーネル内で do_wp_page で CoW が実行される

を期待する動作とする。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/wait.h>

int main(int argc, char *argv[])
{
    /* CoW を起こしたいページ数 */
    int pages = 100;

    /* getconf PAGESIZE */
    size_t page_size = 4096;

    /* 観察しやすいようにアドレスを固定する */
    char *p1 = (char*)mmap((void *)0x100000000000, page_size * pages,
                   PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, 0, 0);

    if (p1 == MAP_FAILED) {
        perror("failed to mmap");
        exit(1);
    }

    printf("mmap: %p\n", p1);

    /* 親プロセス: minor page fault */
    for (int i = 0; i < pages; i++) {
        p1[i * page_size] = 'p';
    }

    pid_t pid = fork();
    if (pid == -1) {
        perror("failed to fork");
        exit(1);
    } else if (pid == 0) {
        printf("child pid:%d\n", getpid());

        /* 子プロセス: minor page fault -> cow -> do_wp_page */
        for (int i = 0; i < pages; i++) {
            printf("cow address: %p\n", &p1[i * page_size]);
            p1[i * page_size] = 'c';
            sleep(1);
        }
    } else {
        printf("parent pid:%d\n", getpid());
        waitpid(pid, NULL, 0);
    }
}

観察

bpftrace で do_wp_page をトレースする

kprobe:do_wp_page /comm == "cow"/ {
  printf("do_wp_page > pid:%d comm:%s address:%p\n", pid, comm, ((struct vm_fault *)arg0)->address)
}
  • その他プロセスの CoW が邪魔しないよう comm でフィルタする
  • struct vm_fault の address で fault を起こした仮想アドレスが取り出せる
    • printf して検証コードと付き合わせて確認する

単に do_wp_page が呼び出されているかどうかだけ確かめるなら perf-tools なんかでも OK

github.com

実験

f:id:hiboma:20210901122423p:plain

こんな感じで観察できました。とりあえず このエントリはここまで

perf-tools の場合

perf-tools の functrace だと ↓ みたいにトレースできる

$ sudo ./bin/functrace do_wp_page


             cow-25935   [000] .... 24930.105521: do_wp_page <-handle_pte_fault
             cow-25935   [000] .... 24930.105522: do_wp_page <-handle_pte_fault
             cow-25935   [000] .... 24930.105534: do_wp_page <-handle_pte_fault
             cow-25935   [000] .... 24931.122937: do_wp_page <-handle_pte_fault
             cow-25935   [000] .... 24932.158144: do_wp_page <-handle_pte_fault
             cow-25935   [000] .... 24933.165625: do_wp_page <-handle_pte_fault
             cow-25935   [000] .... 24934.167118: do_wp_page <-handle_pte_fault
             cow-25935   [000] .... 24935.168714: do_wp_page <-handle_pte_fault
             cow-25935   [000] .... 24936.177183: do_wp_page <-handle_pte_fault

その他

最初は do_cow_fault() を調べていたのだが、こちらは anonymous ページでなく file backed な ページの CoW を処理する関数ぽい? (まだ調べてないので宿題)

memory.c - mm/memory.c - Linux source code (v5.11.22) - Bootlin

名前にまんま cow が含まれているので、「Copy on Write 処理するのは これなのだろう」と思い込んでしまった。検証コードが期待したように動作せずハマってしまった。

参考

cstmize.hatenablog.jp

linuxjm.osdn.jp

qiita.com

qiita.com

lore.kernel.org