2018/02/12-02/18

旅行から帰ってきて体調悪いなぁって思いながら過ごしてた。
研究が行き詰って趣味のプログラム書くことで現実逃避してた。

完全に行き詰ると別の事しだすの良くないけど、今回は本当に手が止まってしまってどうしようもなかった。
出来るだけタスクを整理して順番に片づけてるつもりだったんだけど、タスクをすべて消化したのに次が見つからないっていう状況は考えてなかった。

さっさと相談したら、割といい感じにスランプを抜けられたので教訓にしたい。


寿司を食べに行った。スシロー。
安くてもいいので、定期的に寿司を食べることは脳に良いこともよくわかった。
寿司を食べると進捗が出る。


研究会で英語難しいよねって話になった。
そういえば高校時代は英語にめちゃくちゃハマって、英語の先生を目指すようになってた。
その残骸として教員免許が手元(実家)にあるけど、もう多分一生使わないんだろうな。

僕は一般的な普通科の高校に通ってたので、高3で文系コースに進んだ時点で数3Cとはおさらばだった。
今思えばもっとちゃんと数学やればよかったなあ。
やったからと言って、いま数学できるようになってるかと言われると微妙だけど。
気持ちで微分したり、気持ちでベクトルこねこねするの良くないよね。


睡眠サイクルが乱れて来ている。
旅行前はせっかく12時就寝が出来てたのに、だんだんずれてきた。
来週は直したい。


お昼ご飯に炊き込みご飯をまとめて作ってる。
家にいるときは電子レンジが無いので湯煎して温めて食べてる。
この前湯煎してるのすっかり忘れてぼーっとしてたら、空だきしてしまってご飯を入れてるタッパーを溶かしてしまった。
完全に失敗。ご飯も容器も失ってしまった。
最近ぼーっとしてることが多いのはなんだろう、疲れてんのかな。


めちゃくちゃゲームしたくなってゲームしてた。
めちゃくちゃ曲聞きたくなってyoutubeあさってた。

ストレスたまってるときに根を詰めたらいけないんだろうなあ。
この一か月はストレス管理をミスった感じ。がんばりましょう。

2018/02/05-02/11

緩やかに体調不良、という感じの週。
インフルが流行ってるので用心したい。

夜早く寝て、朝早く起きる生活を心がけていた。
やっぱり八時くらいから色々作業ができると捗るので、続けていきたい。

久しぶりにマクドナルドを食べた。
たまに食べるとめっちゃおいしいよね。
もらったクーポンによると来週からチキンタルタってやつが始まるらしくて、それがとても美味しそうなのでまた二月中に行くことになりそう。

寮の回線でもpso2ができることが発覚した。
さすが通信料が少ないオンラインゲームって感じで、ちょくちょく止まる回線なのにかなり快適に遊べる。
まあ、あんまりやらないけど。


基本的に心が終わってしまってた一週間で、金曜日にはちょっとストレスが爆発したりしてた。
ちゃんと一週間に一日くらいガス抜きしないと、いきなり爆発してしまうんだなと学んだ。

学部時代のゼミ合宿に参加することになって、金曜日の夜の夜行バスで河口湖に向かった。
土山サービスエリアで休憩があったんだけど、いつまでたってもバスが出発しなくて不思議な感じだった。
しばらくするとアナウンスがあって、車内で盗難があったので警察呼んでますとのこと。
こんな至近距離で事件に巻き込まれたのは初めてなので、新鮮だった。
初めて仕事中の警察官に身分証明書見せたりしてた。

で、翌朝八時半くらいに到着予定だったんだけど、なんだかんだ二時間半ほど現場検証に時間をとられてしまったので到着は十時すぎだろうなと思って眠りにつく。

朝起きたら八時半、ちゃんと時間通りに目的地についていた。
バスの運転手が違法な速度で走ったか、法を犯して休憩時間を少なめにとったか、バスがテレポートしたかって感じで謎だった。


河口湖で学部時代からの友人にピックアップしてもらって、伊豆までたらたらと観光してた。
富士山を山梨側から見るのは初めてだったので、物珍し気に色々見て回ってた。
凍った湖も初めて見たし、とても楽しかった。


宿は沼津。近くの旅館の温泉に入りに行った。
全然知らなかったんだけど、沼津はラブライブで客引きを頑張ってるみたいで、聖地巡礼の皆様が押しかけてた。かなりびびった。


先生のオープンカーに乗せてもらったり、新しい後輩とだらだら喋ったりして英気を養った。
また来週も頑張りましょう。

帰りは三島から新幹線ひかり。
死ぬほど頭が痛くて辛かった。
辛すぎて近鉄特急に初めて乗った。快適なので今後も使うと思う。

あまりにも体調が悪いのでインフルが懸念されるけど、市販の鎮痛剤が効いたのでただの風邪かなあ。

2018/01/29-02/04

世の中はモンハンワールドで賑わってるけど、寮の回線が微妙なので買えない。
というかPS4持ってないし買う余裕もない。

ゲームは相変わらずたくさんやってるけど、あんまり時間取られるゲームはできてない。
いつでも中断できるゲームじゃないとちょっとしんどいかなって感じ。
もし東京で進学して、実家に居続けてたらモンハンの流れに押されて買ってたかもなあって感じ。


最近寝つきが悪くてしんどい。
めっちゃ疲れて眠いのに、ベッドに入ると二時間くらい浅い眠りと覚醒を繰り返すかんじ。
てことで、市販の睡眠改善薬を買ってみた。
定量が2錠のうち、1錠だけ飲んでみたんだけどそこそこいいかも。
プラセボかもしれないけど、すっと寝れるならなんでもいいや。

睡眠関係で、今週から寝る時間と起きる時間を早くしてみてる。
日付が変わる前には必ず寝て、七時台には起きるようにしてる。
やっぱりちゃんと朝起きると効率良く一日が使えるような気がする。


作業用BGM、ずっとradikoFM802を聞いてるんだけど、最近ちょっとした思い付きでBBCラジオを聴くようにしてみた。
英語だからちゃんと聞かないと内容入ってこないし、なんとなく英語に耳が慣れるし、作業にも集中できるのでいいかもしれない。
カフェのがやがや感になんとなく似てる。
いつも聞いてるのはBBC Radio4。なんかずっとお話してくれってるので良い。


宴会があった。
禁酒中なのでこの宴会をお酒飲まずに乗り切れるかが勝負だったんだけど、無事ソフトドリンクで乗り切ることができた。これはでかい。


夕飯、だいたい適当に肉焼いて千切りキャベツもそもそ食べるってのがパターン。
でもたまに豚丼とかを作る。今週作った豚丼が割とおいしくて嬉しい。
結局味の素を入れれば何でもおいしいのだ、という気分になる。


osushiっていう投げ銭サービスがちゃんと稼働したら、チュートリアル記事にリンク貼りつけて投稿しようと思ってたんだけど、ご覧のとおり燃えてしまったのでどうすっかなーってかんじ。
まあ、適当にモチベーション高まったら投稿する。

2018/01/22-01/28

新曲を投稿した。
ちょっと前にサウンドクラウドに載せてたやつなんだけど、やっぱり多少コメントもらえないとモチベーションに繋がらないのでニコニコに投稿することにした。
個人的にはかなり気に入ってる部類の曲で、一部の人にもウケてたのでうれしい。

研究進捗がしんどかったので、勉強会で辛い気持ちを表明することで多少のガス抜きを行った。
自分が微妙だなと思ってた手法に思いのほか食いついてもらって、やっぱり人に見せてみるもんだなって思った。
あと、スライドにして自分の手法をまとめていくプロセスで頭が整理されるので定期的に発表しないとだめだなって気持ち。
来週はしっかり進捗出しましょう。

髪をもうずっと切れてなくて、前髪がものすごく長くなってる。
前髪を耳にかけて分けられる程度には長くて、ちょっと邪魔すぎ。
どっかのタイミングで切らないとなあ。


自室にあるwindowsのキーボードを英字仕様のものに買い替えた。
普段研究用に使ってるパソコンが英字キーボードで、どちらかに統一したいってのが気持ち。
お試しで二千円くらいのを買ったんだけど、そこそこいい感じ。
ただ安物なのでキーの誤入力がたまにあるのが嫌。
近いうちにちゃんとしたのに買い替えないと。


インフルエンザがじわじわと迫ってきてて、ちょっとこわい。
今週後半もちょっとだるさがあったんだけど、こういう弱ってるときに感染しがちなのでさっさと寝て養生したい。

そういえばちょっと思うところがあって禁酒してる。
実家から奈良に戻ってきて、それ以来三週間くらい禁酒を続けられてる。
来週宴会があるんだけど、そこでも禁酒を貫けるかがポイントになりそう。
多少ストイック気味に攻める一年にしたい。

2018/01/15-01/21

暖かくて嬉しい感じだった。

進学先決めないとなあーっておもいつつ欝々としてた。
とりあえずメールして話聞いてみようと思いつつ、筆が進まず。
心に余裕と自信が無いとこんなにも何もできない。

研究ノートというか、落書き帳に毎日インクを載せてるんだけど、日付を書くたびに心がえぐられる思いをする。
なるほどー、なるほどー、じかんはたしかにすすんでいるぞーーー。
と、頭の中で何かが騒いでる。

まあ、耐えるしかないというか、これも大事なステップなはずなので頑張ろうなって感じ。
スランプを抜ければステップアップするのは知ってるし、いつまでもギターがうまくならなくて辛かったあの時と一緒だと思う。

自分で研究をしていくと、先人の偉大さをかみしめることになる。
あれを超えていかないといけないのか、という重圧は確かに気持ちがいいものかもしれない。


学校でちょっとした発表をした。
専門外の人に分かりやすく発表するってのは難しいなと感じた。
ただでさえニッチな内容なので、もっとわかりやすく伝える技術が求められている。

一か月ぶりに野球をした。
おかげで日曜日がまるまる筋肉痛で無くなった。
けど、たった一か月運動しないだけで体が驚くほど淀んでるのを体感した。
やっぱりマラソンなりして体は定期的に動かさないといけない。

ガラケーを脱した。
完全に思い付きなんだけど、スマホを初めて買ってみた。
今まではipod touchwifiに繋いでたんだけど、最近バッテリーの持ちが悪いし、どうせ新しい端末買うならスマホデビューしてみよう、という感じ。
で、iphone買うつもりだったんだけど結局アンドロイドにした。
というのも、いままでiphoneライクなtouchを使っててアンドロイド経験が無いし、せっかく情報系にいるのでいろんな端末を触るのもいいよなって言う思い付き。
非常に久しぶりに新しい携帯を手に入れてうきうきしてる。
指紋認証が楽しすぎて、ずっとぽちぽち触ってる。

寮で風呂入ってたら火災報知器が鳴った。
ああ、死ぬのかって思った。
とりあえず体を拭いて、しっとりした体に服を着て、外に出たら同じように風呂に入ってた隣人さんと目があった。
普通に誤作動だったんだけど、常にベストな状態で災害に直面するわけじゃないんだなって思った。
火災報知器に留学生が右往左往してた。日本人ばかりではないのでアナウンスが日本語だけなのが問題なのかもしれない。

マシュマロにハマってる。
手が汚れないし、甘くて脳みその餌になる感じするし、満足感もかなり高い。

【chainer】F.padとF.pad_sequenceの使い方

chainerでpaddingするときの方法、備忘録。

パディングするベクトルを用意。

>>> from chainer import functions as F
>>> import numpy as np
>>> a = np.array([[1,2,3]], 'f')
>>> b = np.array([[1,2,3,4]], 'f')
>>> a
array([[ 1.,  2.,  3.]], dtype=float32)
>>> b
array([[ 1.,  2.,  3.,  4.]], dtype=float32)
F.pad

使い方は分かるけど使い道がよくわからない。
画像系とかだと多用するのかな?

'''
F.pad(
    パディングしたいベクトル,
    パディングサイズ,
    ’constant’, 
    constant_values=パディングに使う数字
)
'''
>>> F.pad(a,5,'constant').data
array([[ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  1.,  2.,  3.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]], dtype=float32)
>>> F.pad(a,5,'constant',constant_values=-1).data
array([[-1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1.,  1.,  2.,  3., -1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.]], dtype=float32)
F.pad_sequence

僕がよく使ってよく忘れるのはF.pad_sequenceのほう。

'''
F.pad_sequence(
    パディングしたいベクトルのリスト,
    パディングサイズ,
    パディングに使う数字
)
'''
>>> F.pad_sequence(a,5).data
array([[ 1.,  2.,  3.,  0.,  0.]], dtype=float32)
>>> F.pad_sequence(b,5).data
array([[ 1.,  2.,  3.,  4.,  0.]], dtype=float32)

a,bをまとめてパディングしたかったら、次元を一つ落としたリストを食わせる。

>>> F.pad_sequence([a[0],b[0]],5).data
array([[ 1.,  2.,  3.,  0.,  0.],
       [ 1.,  2.,  3.,  4.,  0.]], dtype=float32)
>>> F.pad_sequence([a[0],b[0]],5, -1).data
array([[ 1.,  2.,  3., -1., -1.],
       [ 1.,  2.,  3.,  4., -1.]], dtype=float32)

pythonで重複の無いリスト

例えばテキストデータを舐めて単語の種類数を求めたいときとか、重複の無いリストが必要になる。
今まで、何も考えずに以下のように書いてた。

良くない例

>>> a = [1,2,2,1,3,4,1,2,3]
>>> b = []
>>> for c in a: # aの中身をcで回す
...   if c not in b: # cがbに入ってなければ追加
...     b.append(c)
...
>>> b # 重複の無いリスト
[1, 2, 3, 4]

setを使う

ぶっちゃけsetを使った方がコードが短かくて済む。そして速い。
ただし、リストと違って順序は保存されないので注意。

>>> a # aの中身を確認
[1, 2, 2, 1, 3, 4, 1, 2, 3]
>>> b = set(a)
>>> b # 上と同じ
{1, 2, 3, 4}

しかし、この書き方をするなら一度aにすべての要素を突っ込まないと行けない。
最初にあげた単語を舐める例だと、テキストデータに出現しうるすべての単語を、一度aに突っ込まないといけない。
メモリ的にしんどい時は以下のように書くのが良い。
遅くなるけどリストに比べたらまだ速い。

>>> a
[1, 2, 2, 1, 3, 4, 1, 2, 3]
>>> b = set() # 空のsetを用意
>>> for c in a:
...   b.add(c) # 重複しないように追加してくれる
...
>>> b
{1, 2, 3, 4}

速度比較

比較用コード

>>> # listで回す
>>> def testList(arr):
...   st = time.time()
...   neoarr = []
...   for a in arr:
...     if a not in neoarr:
...       neoarr.append(a)
...   print(time.time()-st)
...   return neoarr
...
>>> # listのset
>>> def testSet1(arr):
...   st = time.time()
...   neoarr = set(arr)
...   print(time.time()-st)
...   return neoarr
...
>>> # listを回してsetにadd
>>> def testSet2(arr):
...   st = time.time()
...   neoarr = set()
...   for a in arr:
...     neoarr.add(a)
...   print(time.time()-st)
...   return neoarr

0から9までの整数をランダムに100万生成して、重複の無いリストを求める。

# listで回す
>>> testList([random.randint(0,9) for _ in range(1000000)])
0.14845705032348633
[3, 5, 8, 1, 4, 6, 9, 7, 0, 2]
>>> testList([random.randint(0,9) for _ in range(1000000)])
0.13007402420043945
[8, 1, 3, 0, 4, 5, 9, 2, 6, 7]
>>> testList([random.randint(0,9) for _ in range(1000000)])
0.1324453353881836
[0, 4, 5, 9, 7, 3, 6, 2, 8, 1]

# listのset
>>> testSet1([random.randint(0,9) for _ in range(1000000)])
0.015883684158325195
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
>>> testSet1([random.randint(0,9) for _ in range(1000000)])
0.015897035598754883
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
>>> testSet1([random.randint(0,9) for _ in range(1000000)])
0.015883684158325195
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

# listを回してsetにadd
>>> testSet2([random.randint(0,9) for _ in range(1000000)])
0.09662246704101562
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
>>> testSet2([random.randint(0,9) for _ in range(1000000)])
0.09584259986877441
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
>>> testSet2([random.randint(0,9) for _ in range(1000000)])
0.09663128852844238
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

ただ要素の種類を取り出したいだけならset使おう。