C言語で簡単なTrieを実装した
コーディングテストを受けた。要件としては文字列の探索だったので「Trieを使うんだろうな〜」という知識はあったがその場で実装できなかったのでいま筆を取っている。*1*2
#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が複数あって、各ノードで単語の終端フラグあるだけ」といえばそう。
VOICEVOX-COREで倍速を扱う
audio_query = core.audio_query(text, SPEAKER_ID) audio_query.speed_scale = 2
という風に audio_query に後からspeed_scaleで倍速を指定してあげると良い。
将来的にはcore.audio_queryの引数にも渡せるようになるのだろうか。コントリビュートチャンスか?
LANケーブル学んだことメモ
縁があってLANケーブルを作る機会がありそうなので自分がへぇ〜となったメモを書く、細かい用語自体はサイトを見る
メモ
- ケーブルにはカテゴリがあるが、RJ45側にもある
- 単線とヨリ線は、ツイストペアケーブルを実現する中身のことを指す
- 思ったより高い
- カテゴリ毎に太さが違う
- LANケーブルのピン番号は1-8まであるが半分しか基本的に使われていない
- KB-STPTS-02BL が1mで982円、2mで1000円なのに3mで782円とお買い得
OpenCVではじめよう ディープラーニングによる画像認識 第4章を読んだ
を引き続き読んでいる。1-3章とは執筆者が変わるので少し身構えたが安心して読めた。載ってるサンプルコードは抜粋のものが増えるのでコードから理解したい人は clone したほうが良い。
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や画像処理のプログラミングはしたことなかったが、とても分かりやすかった。 サンプルコードが簡潔ながら豊富な上に実行結果も載せてくれているので確認も簡単にできた。