kkty’s blog

情報科学科

Cの良さげなハッシュテーブルのライブラリ

C++のunordered_mapやPythonのdictなど、ほとんどの言語でハッシュテーブルが使えます。しかし、Cにはハッシュテーブルがありません。

言語仕様が小さいということなのでそれはそれで良いのですが、やはりハッシュテーブルが必要になることが多々あります。

そんな時にこのライブラリがシンプルで(手軽に使いたいときには)良さげです。keyはすべて文字列。 github.com

試してみる(文字列->intのハッシュテーブル)

map_int_t m;
map_init(&m);

map_set(&m, "key", 10);

int *val = map_get(&m, "key");
assert(*val == 10);

map_remove(&m, "key");
assert(val == NULL);

map_deinit(&m);

C++のunordered_set、Pythonのsetみたいなものも簡単に作っておきます

// map.hに追加

#define set_init(m) memset(m, 0, sizeof(*(m)))
#define set_deinit(m) map_deinit_(&(m)->base)
#define set_add(m, key) ( (m)->tmp = (0), map_set_(&(m)->base, key, &(m)->tmp, sizeof((m)->tmp)) )
#define set_contains(m, key) ( ((m)->ref = map_get_(&(m)->base, key)) != NULL )
#define set_remove(m, key) map_remove_(&(m)->base, key)
#define set_iter(m) map_iter_()
#define set_next(m, iter) map_next_(&(m)->base, iter)

keyが文字列だけというのもあれなのでintにもできるようにしておきます(無限に雑です)

// map.hに追加

#define map_i_get(m, key) ( (m)->ref = map_i_get_(&(m)->base, key) )
#define map_i_contains(m, key) ( ((m)->ref = map_i_get_(&(m)->base, key)) != NULL )
#define map_i_set(m, key, value) ( (m)->tmp = (value), map_i_set_(&(m)->base, key, &(m)->tmp, sizeof((m)->tmp)) )
#define map_i_remove(m, key) map_i_remove_(&(m)->base, key)
#define map_i_next(m, iter) map_i_next_(&(m)->base, iter)

void *map_i_get_(map_base_t *m, const int key);
int map_i_set_(map_base_t *m, const int key, void *value, int vsize);
void map_i_remove_(map_base_t *m, const int key);
int map_i_next_(map_base_t *m, map_iter_t *iter);
// map.cに追加

void *map_i_get_(map_base_t *m, const int key) {
  char key_str[20];
  sprintf(key_str, "%d", key);
  return map_get_(m, key_str);
}

int map_i_set_(map_base_t *m, const int key, void *value, int vsize) {
  char key_str[20];
  sprintf(key_str, "%d", key);
  return map_set_(m, key_str, value, vsize);
}

void map_i_remove_(map_base_t *m, const int key) {
  char key_str[20];
  sprintf(key_str, "%d", key);
  return map_remove_(m, key_str);
}

int map_i_next_(map_base_t *m, map_iter_t *iter) {
    if (iter->node) {
        iter->node = iter->node->next;
        if (iter->node == NULL) goto nextBucket;
    } else {
        nextBucket:
        do {
            if (++iter->bucketidx >= m->nbuckets) {
                return NULL;
            }
            iter->node = m->buckets[iter->bucketidx];
        } while (iter->node == NULL);
    }
    return atoi((char*)(iter->node + 1));
}

アメリカでエンジニアインターンしてきた話

はじめまして。

学科のAdvent Calendarで書いてます。

今更ですが夏休みのインターンについてのポエムを書きます。

 

この夏休み、IndeedAustinオフィスで6週間くらい働いていました。

AustinTexasの州都で、最近はIT企業が集積して景気が良さそうな場所です。

 

なんか日記的なものが残っていたのでそれをほぼそのまま箇条書きで適当に書いちゃいます。

技術的な話はちょこっと最後に書いてます。また詳しく書くかもです。

 

Indeedとは

  • 求人の検索エンジン。クロールして求人情報を集めたりしてる。
  • ユニークユーザーが月間2億人。
  • アメリカが一番の市場。でも日本でも最近CMめっちゃ打ったりしてる(日本では一部の機能しか使えてないけど

 

行くまでの経緯

  • 去年出たプログラミングの大会でindeedを知る。
  • 案内が来る。エンジニアとしてレベルあげたいしアメリカ行きたかったので、ダメ元で申し込む。
  • 競プロみたいなweb試験を受ける。
  • 恵比寿の東京オフィスで面接。英語のコーディング面接に圧倒される。
  • もう一度面接。今度は3時間ほぼぶっ通し。人生で一番頭使った。
  • 格通知が来る。飛び跳ねた。
  • キックオフ会。自分含めて3人しかいないということに気づく。
  • J1ビザを取得のために書類の準備をする。想像以上に大変だった。
  • アメリカ大使館でビザ取得のための面接を受ける。
  • スケジュール押していて、ビザを受け取ることができたのが出発の二日前。
  • 一人ビザが降りなくて来れず、とても悲しかった。 

 

前半

  • オースティン遠い。乗り換え含めて18時間。
  • 初出社する。公共交通機関がほぼ無いのでタクシー。
  • 一週目から本番環境にデプロイできるものを何かしら書くのがしきたりらしい。普通に焦ったけどできた。
  • メインプロジェクトを始めた。終わる気がしなかった。
  • 無限にwikiとチームのコードを読んだ。量多すぎて死ぬかと思った。

 

中盤

  • 国際免許取ってこなかったことを後悔しはじめる(レンタカーでどっか旅行したかった)
  • だんだん開発のスピードが上がって来て、楽しくなってきた。
  • 終わる気がしなかったメインプロジェクトが終わり、チームの実際の開発フロー(アジャイルです)にのって、いろいろ開発していた。
  • 職場が食べ放題飲み放題で、普通に太りそうだったのでホテルのジムに通い始める(どうでもよい)。

 

後半

  • 新入社員が入ってきたので、狭義の先輩になった。
  • コードレビューを少しだけ書いたりした(してもらった分の100分の1くらいです笑)
  • 開発はもう死ぬほど楽しんでた。週末もアルティメットしたりダウンタウン行ったりいろいろ遊んだ。最高だった。日本に帰りたくなくなった。
  • チームメンバーの前で、6週間でやったことをプレゼンをした。
  • 帰国。次の日に大学に行った。

 

やったこと

  • メインプロジェクトがまず1つ与えられた。簡単に言うと、仕事の名前を一般的なものに変換したりして(Senior Java Developer -> Software Developerみたいな)そしてそれをユーザーの行動予測のための機械学習モデルの精度向上に役立てようみたいな感じ。それにまつわるいろいろな部分をJavaで実装した。
  • メインプロジェクトがひとまず終わった後は、チームメンバーと同様に新機能の開発や機能の改善などをした。
  • その中の1つでは、アクセス元の位置情報によって処理を変える部分があって、そこのコードを書き直して処理を高速化した。一日に数百万回実行される部分で普通に怖かったけど、不具合もなくその処理の実行時間の中央値がnミリ秒から0ミリ秒になってとても嬉しかった。
  • また、せっかくだからフロントエンドもやってみたいとうことで手を出した。Reactとかあまり使ったことなかったので週末とかで本気で勉強した。

 

 まとめ

  • レベル高い。
  • 開発楽しい。
  • ビザと英語は大変。