気後れしつつ書く

瞼を開ければ

【解決済】ゼロからのOS自作入門の6章でマウスが動かない

以下はありえるケース

  • 第4章のローダを改良する(osbook_day04d)をやっていない
    • 自分はこれだった、ローダを改良しなくても読み込めてるし良くない???と思ってたがそんなことなかった
  • run_qemu.sh を使わずに自分でqemuを叩いてるケース

どうでもいいが第8章のメモリ管理(malloc/free) を学ぶには第6章の突破が必要だが、第6章の説明が省かれたUSBのコードを見るとAllocMemというメモリ管理をやってそうな関数があってデッドロックみがあってよかった

C言語で簡単なTrieを実装した

コーディングテストを受けた。要件としては文字列の探索だったので「Trieを使うんだろうな〜」という知識はあったがその場で実装できなかったのでいま筆を取っている。*1*2

[https://ja.wikipedia.org/wiki/(データ構造)]
https://ja.wikipedia.org/wiki/トライ(データ構造) から拝借

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

typedef struct s_trie_node {
    struct s_trie_node *children[255];
    bool is_end_of_word;
} t_trie_node;

t_trie_node *new_node(void) {
    t_trie_node *node = (t_trie_node *)malloc(sizeof(t_trie_node));
    for (int i = 0; i < 255; i++)
        node->children[i] = NULL;
    node->is_end_of_word = false;
    return node;
}

void insert(t_trie_node *root, char *word) {
    t_trie_node *node = root;
    int c;
    for (int i = 0; i < (int)strlen(word); i++) {
        c = (int)word[i];
        if (node->children[c] == NULL)
            node->children[c] = new_node();
        node = node->children[c];
    }
    node->is_end_of_word = true;
}

bool search(t_trie_node *root, char *word) {
    t_trie_node *node = root;
    int c;
    for (int i = 0; i < (int)strlen(word); i++) {
        c = (int)word[i];
        if (node->children[c] == NULL)
            return false;
        node = node->children[c];
    }
    return node->is_end_of_word;
}

int main() {
    t_trie_node *root = new_node();

    insert(root, "apple");
    insert(root, "apply");
    insert(root, "apple store");
    insert(root, "ape");
    insert(root, "banana");
    insert(root, "tomato");

    printf("%d\n", search(root,"apple")); // 1
    printf("%d\n", search(root,"app")); // 0
    printf("%d\n", search(root,"apex")); // 0
    printf("%d\n", search(root,"this is not inserted")); // 0

    return 0;
}

「単方向リストのchildrenが複数あって、各ノードで単語の終端フラグあるだけ」といえばそう。

*1:そのテストはかなり制約がゆるく、トライ木の代わりに全探索を書いたら通ってしまった

*2:各種エラーハンドリングは意図的に書いてない

VOICEVOX-COREで倍速を扱う

audio_query = core.audio_query(text, SPEAKER_ID)
audio_query.speed_scale = 2

という風に audio_query に後からspeed_scaleで倍速を指定してあげると良い。

voicevox_core/_models.py at 18b350783cfba88f7f5631655d1d3fa4964b23a1 · VOICEVOX/voicevox_core · GitHub

将来的にはcore.audio_queryの引数にも渡せるようになるのだろうか。コントリビュートチャンスか?

LANケーブル学んだことメモ

縁があってLANケーブルを作る機会がありそうなので自分がへぇ〜となったメモを書く、細かい用語自体はサイトを見る

メモ

  • ケーブルにはカテゴリがあるが、RJ45側にもある
  • 単線とヨリ線は、ツイストペアケーブルを実現する中身のことを指す
  • 思ったより高い
  • カテゴリ毎に太さが違う
  • LANケーブルのピン番号は1-8まであるが半分しか基本的に使われていない
  • KB-STPTS-02BL が1mで982円、2mで1000円なのに3mで782円とお買い得

ゼロから作るDeep Learning の第2章を読んだ

読んだ。NAND2Tetris を読んだことあったので悩むところはなかった。入力に対してバイアス*1と重み*2という概念はスッと理解できた。パーセプトロンを重ねると任意の関数を表現できるということをXORで示せる、という題材が良かった。明日は3章の途中まで読めたらな・・・。というかGoの本もそのうちやる。

*1:発火のしやすさ

*2:入力に使った値がどの程度出力に影響させるか

OpenCVではじめよう ディープラーニングによる画像認識 第4章を読んだ

を引き続き読んでいる。1-3章とは執筆者が変わるので少し身構えたが安心して読めた。載ってるサンプルコードは抜粋のものが増えるのでコードから理解したい人は clone したほうが良い。

github.com

4.4はあまり理解が進んでないが、画像処理の分野を進めていったらそのうちでてきそうな話題なのでより難しい説明が出てきたときに戻るくらいで良さそう。

以下は書籍中に言及はないが調べた点のメモ。

4.2.3 HSV色空間の活用

丸いチョコレートが複数ある画像から青色のものを抽出する話である。

元の画像
結果

元の画像から「Hが一定の範囲に収まり、かつSが一定の値以上」の部分を切り抜くためにマスク画像を生成するのだがサンプルコード中にも述べられているように*1愚直にやると穴が開く。

この部分はなんだろうと5分くらい考えていた。サンプルコードを実行すると丁寧に「HSVそれぞれのチャンネルを可視化」してくれていたので、見比べていたらSaturationでも同様に穴が空いていたのでテカっている部分だと仮定した。それっぽいところの1ピクセルHSVを調べてみたが、仮定は当たっていたようだ。

*1:こういう本質じゃないことが増えてくると抜粋もありだなぁと思うし、コメントで補間があるのはとてもありがたい。

OpenCVではじめよう ディープラーニングによる画像認識 1-3章を読んだ

の第1章から第3章を読んだ。本文中は Ubuntu20.04, Windows 10/11 を開発環境としていたが今の所 M1 Mac でも問題なく動いてそうだった。第2章で書いてあるpipやcondaコマンドを適当に打てばOpenCVは入る。パッケージマネージャ万歳。

今までOpenCVや画像処理のプログラミングはしたことなかったが、とても分かりやすかった。 サンプルコードが簡潔ながら豊富な上に実行結果も載せてくれているので確認も簡単にできた。

サンプルで使われるヨーキー

(b,g,r) を (g,r,b) へ変更
自分で手を動かす系の本のサンプルコードが小さいと、色々変更しやすくなるので体験としてとてもよかった。定期的に読み進めたい。