某大学で変な院進する話

リアルで面識がある感じのわかる人にはわかるタイトル。

まず原則としてオススメしない

先生にも言われると思うけど(少なくとも数年先ぐらいまでは)オススメしない。 死に急いでる人以外は、思ったほどメリットがない。

実力*1が無いなら(主に事務手続き的に)出る杭になってそのまま地面に埋まる。

実力があるならやりたいことをやった方が良い。

実力があってやりたいことが無い人はやりたいことを探した方が良い。

僕はアホだったので、やりたいことがよくわからないままここまで来てしまった気がする。 1年あってもよくわからないままだったかもしれないけど、 とりあえず来年からは働くこと以上に休日の過ごし方が全く想像できないあたりが怖い。 運良く就職先はチャレンジングな会社になったと思うが、 そうでなければ雰囲気に流されて無気力に生きる道を選んでいただろうと思う。

あと、曲がりなりにも論文を書いて外に出した経験は大きかったように思う。 少なくとも自分の考えを論理的に組み立てて、実装して、検証して、説明できない人は教授も院生として面倒を見たくないだろう。 ただ、僕もできるとおもっていたけど、最近は現実が見えてきて未熟な人間の一人だったことに気付いた。 高校の恩師の言葉を借りると、わかるとできるは違う。

それでもやっちゃった人へ

自動で通知してくれない学内の手続き

  • 自転車の保険
  • 生協の組合証
  • OB会的なやつ

*1:究極的には読み・書き・そろばんのことだと思う

日本語環境でRustをビルド

Rustをビルドしてみた。

compiler-rt の Makefile が間違っていて、英語環境以外では修正してから make する必要がある。

rust/src/compiler-rt/make/platform/clang_linux.mk を以下のように修正

-       LANG=C $(CC) -v 2>&1 | grep 'Target:' | cut -d' ' -f2)
+       LC_MESSAGES=C $(CC) -v 2>&1 | grep 'Target:' | cut -d' ' -f2)

最近のエラーメッセージ等の出力言語は、LANGではなくLC_MESSAGESだったりすることがある。

あとは、

cp -r rust/src/etcvim/* /usr/share/vim/vimfiles

としておくと便利。

「: そのようなファイルやディレクトリはありません」

こんなエラーで手元のスクリプトが動かない。 うーん、確かに存在するし、権限もあるんだが…。

shebang#!/usr/bin/env python3 になってるしなぁ。

: そのようなファイルやディレクトリはありません

1行目にprint文仕込んでも変わらんか。 shebangが間違ってるのかなぁ。 #!/usr/bin/python3 に変えてみるか。

bad interpreter: /usr/bin/python3^M: そのようなファイルやディレクトリはありません

ん?なんか後ろについてるぞ!改行コード? あ、CRLFになっとる。

nkf --unix --overwrite

あー。

string.xmlにJSONを埋め込む

Androidアプリケーションのプロトタイプなんかを作っていたりすると、JSONをハードコーディングしたくなるときがある。

プロトタイプでいちいちサーバ立てて通信させてとかやりたくない。 かといって .java に + でつないで何行も書くのは精神衛生上よろしくない。 そこで、 string.xml に書いてみる。

失敗例

<string name="json_test_data">{
    "spam": "ham < egg"
}</string>

しかしこれは失敗する。 XML なので < はエスケープされてしまう。

CDATA で囲ってみるのはどうだろう。

<string name="json_test_data"><![CDATA[{
    "spam": "ham < egg"
}]]></string>

これもまずい。 http://developer.android.com/guide/topics/resources/string-resource.html#FormattingAndStyling にあるように、"'はエスケープされてしまう。

成功例

<![CDATA[""]]></string> で囲んでJSONのStringは ' で囲む。

<string name="json_test_data"><![CDATA["{
    'spam': 'ham < egg'
}"]]></string>

RFCの定義上、Stringは " で囲まなくてはいけないが、 org.json がうまく動いてくれるのでこれでOKにしとく

単体テストで使う

プロトタイプの検証用データとして使えるが、単体テストのテストデータにも使える。

テストケースを AndroidTestCase で作れば、

getContext().getResources().getStringArray(R.string.json_test_data);

のようにしてアクセスできる。

istringstreamを使い回す

string line
istringstream ist;
while (getline(cin, line)) {
    ist.str(line);
    /* なんかの処理 */
}

上記のように使いまわそうとすると失敗する。 フラグがbadの状態になっていたり読み込んだ位置とかを戻さないといけなかったりでバグになってしまう。

string line
istringstream ist;
while (getline(cin, line)) {
    ist.clear();
    ist.str(line);
    /* なんかの処理 */
}

clearしてから使おう。

参考: string - C++ - repeatedly using istringstream - Stack Overflow

ファイル中のコメントを無視する

入力ファイルとかにコメントを書けるといろいろとはかどる。

def comment_ignore(file_obj, comment="#"):
    for line in file_obj:
        line = line.split(comment, maxsplit=1)[0].strip()
        if line:
            yield line

with open("file.txt") as f:
    for line in comment_ignore(f):
        print(line)

一手間入れるだけ。

std::arrayの初期化

g++(4.7.2) だとコンパイルできないけど clang++(3.3) だとできる.

g++ の場合は,

array<int, 3> a((array<int, 3>){1, 2, 3});

みたいにキャストで明示しないといけないっぽい(C++スタイルでする場合には何使えばいいんだろ?). たぶん g++ の方は explicit ついたコンストラクタが生成されてるのかな.

cppreference.com 二重で囲むべきだったらしい.