"Experience tranquility."

最近(7, 8月)あったこととか。

COMP

comp.jp 完全食のお試しセットを頼んだので飲んでみた。 水割りはそもそも味を舌が受け入れてくれなかったので、色々模索してみたんだけどだいたいダメだった。 素の味が無味になってくれると美味しく摂取できて最高なんで、味なくなってほしい。 以下は試したやつ。

  • コーヒー
    飽きがひどくて飲みきれない
  • スムージー
    元の味がめっちゃ残る。飲みきれないわけではないけど続けて飲もうとは思えなかった。
  • お茶
    論外

結局何パックか余ったので、どうしても食い物が無いときとか、時間の無いとき用に保管してある(果たして飲む日は来るのだろうか)。赤ちゃんの粉ミルクっぽい味がどうしても苦手なんだけど、プロテインもこんな味するんですか。ちなみに僕の口に合わないだけで美味しく飲んでる人はいるので、試しに買ってみるといいんじゃないですかね。

読んだ本

ガベージコレクション

ガベージコレクション

SOFT SKILLS ソフトウェア開発者の人生マニュアル

SOFT SKILLS ソフトウェア開発者の人生マニュアル

二冊読了したけど、分厚い奴らは読み切るのにまだまだ時間がかかりそう。 kindleすごくて、気づくとポチってるから積ん読がひどい。教授に頼りつつ論文を読み進めたりするおかげか、読むペースが早まってきて新書程度ならいくらでも読めるようになって気がする(だけ)。

振り返って

以外にブログとして残せることは少なくて短くなってしまった。 技術的なこととか、アウトプットを増やそうとはしているんだけども、探求後の着地点が既到な事実であったりするので、 「なるほどですね〜」で終わってしまうことが多かった。既に世の中に出回っている情報に色を付けて発信するのに抱く嫌悪感を払拭すればいいんだろうか。

Bridge

グラフ構造において強連結を求めて処理することは多いけど、 蟻本に載っているタイプのScc*1だと後の処理が結構使い辛い気がしてた。 単にSccするだけならば別に良いんだけど、辺に対して操作をする時、 その辺は強連結をするための辺なのか強連結成分同士を繋ぐ辺なのかの判定が面倒だったり、 橋だけほしいのに実装の重いSccを書いてから求めるとか、結構だるい(自己基準)。

グラフにおける橋

グラフ内で削除すると到達不可能な頂点が出る辺を橋といって、 求めるのに方法は色々とあるんだけど意外と書いてない。 ただ、日本語の記事だといい感じに説明されたものもあるので、 アルゴリズムの詳細は以下の記事を参考にしてほしい。

橋(bridge)検出アルゴリズム - nupiocaの日記

実装

上記記事の実装だと、from, toのペアが帰ってきていて、辺の判断が辛そうであったので 橋の情報の持ち方を変更して行列に置換した。 基本的に(個人の)Sccのライブラリと共存できそうな構造体を定義して、いい感じに。 アルゴリズムの変更点は無い。

Raw source code

/*
  0-origin
*/

template<int V>
struct Bridge {
    int low[V], pre[V], cnt;
    vector<int> edge[V];
    bool res[V][V];

    void init() {
        cnt = 0;
        memset(low, 0, sizeof(low));
        memset(pre, 0, sizeof(pre));
        memset(res, false, sizeof(res));
        for (int i=0; i<V; i++) edge[i].clear();
    }

    void add_edge(int from, int to) {
        edge[from].push_back(to);
    }

    void add_edge_multi(int from, int to) {
        add_edge(from, to);
        add_edge(to, from);
    }

    int dfs(int cur, int from) {
        low[cur] = pre[cur] = ++cnt;

        for (int i=0; i<edge[cur].size(); i++) {
            int to = edge[cur][i];

            if (!pre[to]) {
                low[cur] = min(low[cur], dfs(to, cur));

                if (pre[to] == low[to]) {
                    res[cur][to] = true;
                }
            } else if (from != to) {
                low[cur] = min(low[cur], low[to]);
            }
        }

        return low[cur];
    }

    void build(int n) {
        for (int i=0; i<n; i++) {
            if (!pre[i]) dfs(i, i);
        }
    }
};

*1:強連結成分分解, Stronglu Connected Components

未来向きの

迷っているときの文章は、あっちこっち行ったり来たりするから読みにくいと思う。

今、エンジニアとして大成できるように勉強している私がいる。技術は好きだし、そういうことだけを考えていたいこともある。「将来はああいうエンジニアになりたい」とか具体的な像もある程度あって、進んでいく決心も付いている、と思ってた時期もあった。

最近はこういうことを考える。エンジニアとして大成することと、人間として幸福な生活(個人の価値観による)を歩むのは、どちらが私にとって最終的に良かったと思えるんだろうか。つまり、エンジニア人生を全うして技術を追い求めて死んでいくのか、家庭や同僚や友人を多く作って技術よりも大切なものを見つけて死んでいくのかの比較をよく考えるようになった。もちろん前者後者で極端なわけでなく、特に注力する事柄についての話である。

正直どちらも体験してみたいし、どちらかを捨てろと言われても難しい。人生は一度きりだし、転生なんてものも無いと考えているので、パッと決めることもできないでいる。ただ、現状では技術向きに頑張ろうと思っていて、それはつまりたぶん独り身だからなんだろうけど。

同じように悩んだ人とか、悩みを持っている人とかの話を聞きたい。"実体験"としての話を聞きたいので、これを読んで感じたことなどは根拠が無く私は耳を貸さないと思う。身勝手だろうけど、それくらい真面目に考えているだけ。

今は忙しくて考える時間も少ないけど。そう後回しにしてもいい内容でもないと思うので、大きく決断する必要がある。