私が実践した、エンジニアが超優良企業に転職するための最も簡単な方法

転職先を自分で作る。
(起業する。)

↓今すぐフォローすべきキラキラ アカウント

↑今すぐフォローすべきキラキラ アカウント

PyCon mini OsakaでCharacter-Level CNNについて話してきた。


東京在住ですが、なぜかグランフロント大阪で開催されたPyCon mini Osakaで登壇して来ました。
osaka.pycon.jp

前日から大阪に乗り込んでました。(久しぶりに弊社の大阪オフィスに行った。)

スライド

発表内容は以下のスライドになります。

www.slideshare.net
(画像がぼやけていてすまない・・・)
最初はCNNやTensorFlowの基礎的な説明をして後半からCharacter-Level CNNについて話しました。

Character-Level CNN

Character-Level CNNのところを説明します。

Character-Level CNNとは

文書を文字(Character)単位で区切ってそれをCNNに通してテキスト分類します。 ※単語単位でないのに注意

今回やること

今回は、テキストからネガティブかポジティブかを判断するタスク(いわゆる感情分析のネガポジ)をこなす分類器を作ることを考えます。
結果から言うと、オリジナル論文*1では上手く行かずに、違うアーキテクチャで上手く行きました。

なぜ文字レベルなのか?

文字レベルで自然言語処理をするというのは珍しいと思いますが(大体は単語レベルで区切る)、そのメリットは

  • 前処理がいらない(日本語なら分かち書きが必要ない)
  • タイポやスペルミスが多い文書でも有効(レビュー,チャットなど)
  • 文書じゃない物にも適応できる(URL, Tex, プログラミングコードなど)

などが挙げられます。

論文

上手くいったアーキテクチャですが、
Joshua Saxe, Konstantin Berlin: eXpose:A Character-Level Convolutional Neural Network with Embeddings For Detecting Malicious URLs, File Paths and Registry Keys(https://arxiv.org/abs/1702.08568)
を参考にしました。
内容はCharacter-Level CNNを使って悪意あるURLやファイルパスを検出するという内容です。
かなり丁寧に書かれていてわかりやすい論文でした。

構成・アーキテクチャ

処理の流れとしては

  1. 文字を低次元に埋め込む
  2. カーネルサイズが違う複数のCNNに入れて特徴を出力
  3. 特徴を一つに結合
  4. 全結合層に通して分類

です。


1の埋め込みは、(文字 × 埋め込み次元)行列を埋め込み層として用意して、対応する文字の行ベクトルだけを更新します。

f:id:tdualdir:20180520142008p:plain:w300
図1.埋め込み層


2については論文に書いてる図を借りると次のようになります。

f:id:tdualdir:20180519210753p:plain
図2.CNNの処理
1×2,1×3,1×4,1×5というサイズのフィルターにそれぞれ通します。
様々なWindowで文字のCooccurrence(共起性)を学習してると考えられます。
f:id:tdualdir:20180519211149p:plain
図3.CNN部分の解釈


3.特徴を一つに結合、4.全結合層に通して分類はそのままの意味です。

TensorFlowで実装してTensorboardのグラフに書くと以下のようになります。

f:id:tdualdir:20180519205644p:plain
図4.アーキテクチャ

日本語のデータセット

日本語のデータセットとして最近公表されたばかりのchABSA-dataset*2を使いました。
上場企業の有価証券報告書をベースに作成されたデータセットで、特徴としては「何が」ポジティブ/ネガティブだったのかと言う情報を含んでいます。
これで、「何が」のネガティブとポジティブの数を比べて多い方を文書全体の感情としました。
その結果、訓練データとテストデータを合わせて2830文書が対象となりました。

結果

結果は以下のようになりました。

f:id:tdualdir:20180519212347p:plain
図6.loss
f:id:tdualdir:20180519212339p:plain
図7.accuracy

データセットが少ないので不安でしたがaccuracyも0.9程度にはなりました。

誤字・脱字に対する強さ

面白いのがここからで、わざと誤字・脱字をしてちゃんとネガポジを判定できるか試してみました。
f:id:tdualdir:20180519212917p:plain
「増加傾向」を「加向」とか、「減少傾向」を「減向」にしても問題なく判定できています。

なので、ここでテストデータの文書の文字を適当な文字に変換した際にどのくらい精度が下がるのかグラフを書いてみました。

f:id:tdualdir:20180519213508p:plain
図8.変えた文字数と精度(character-level)

50文字をランダムな文字に置き換えても精度が8割以上あるのは驚きです。(1つの文書は大体300文字程度なので役1/6が適当な文字と言うこと)

これをMecabを使って単語レベルで区切ってCNNで学習させたword-level CNNでも試しました。

f:id:tdualdir:20180519213821p:plain
図9.変えた文字数と精度(word-level)

50文字も変えると精度は0.5なので全く判別出来てないことになります。

結論

Character level CNNは誤字・脱字に強すぎなんじゃwwww
SNSメッセージ、チャット、レビューなど最適と言える。
さらに日本語だと分かち書きが不要と言うのも魅力的。また、単語で区切ったりしないので辞書が要らず、この実装だけであらゆる言語に対応可能。


終わりに

カンファレンスで発表するのは初めてでしたが、発表練習をするのを忘れていたので時間配分がちょっと不安でしたが、まあまあ時間ぴったりに終わったのでよかったです。
カンファレンスは楽しかった。

コードはここに置いてます。
GitHub - Tdual/char_level_cnn: Character level CNN


ツイッターやっているのでフォローお願いします。
↓今すぐフォローすべきキラキラ アカウント

じゃあの。

*1: Xiang Zhang, Junbo Zhao, Yann LeCun: Character-level Convolutional Networks for Text Classification (https://arxiv.org/abs/1509.01626)

*2: https://github.com/chakki-works/chABSA-dataset

「虚数はあるのか?」という話の物理学的な回答

はじめに

GW中にツイッターで「虚数はあるのか?」という話をタイムラインでよく見かけたので自分なりの回答をしようと思います。
私は大学/大学院で素粒子論・超弦理論をやってきた理論物理徒なので物理的な観点から回答します。

虚数はiで表現します。( i^2=-1)


電磁気学/波動・振動論

物理で初めて虚数を使うのはおそらく電磁気学か波動・振動論でしょう。
オイラーの公式という形で出て来ると思います。
オイラーの公式
 e^{i\theta} = \cos\theta +i\sin\theta \tag{1}
虚数によって指数関数と三角関数が関係付くという美しい公式です。

オイラーの公式と振動

ご存知の通り三角関数は振動を表しているのでe^{i\theta}も振動を表現しています。
では振動とはどう言う運動かというと、遠くに行こうとするものを中心に引き戻す力が働くので物体は振動してるわけです。
遠くに行けば行くほど強い力で引き戻す必要があるので、引き戻す力は距離に比例してるとすると振動は次の運動方程式でかけます。
m:振動してる物体の質量
x:位置
t:時間
k:定数(バネ定数)
 m\frac{d^2x}{dt^2}=-kx \tag{2}
左辺は質量かける加速度、右辺は中心に引き戻す力です。(ma=Fですね。)
三角関数  x = C\sin\left(\sqrt{\frac{k}{m}}t\right) x = C\cos\left(\sqrt{\frac{k}{m}}t\right)はもちろんこの式を満たしています。(Cは定数)

さて、 x=Ce^{i \sqrt{\frac{k}{m}}t}を(2)式に代入してみてください。(Cは定数)
ちゃんと等式が成立していることがわかると思います。つまり、 e^{i\theta}が振動を表しているということです。(今の場合は \theta=\sqrt{\frac{k}{m}}t
また、 x=Ce^{i \sqrt{\frac{k}{m}}t}の代わりに時間に依存しない項をeの肩に追加しても式を満たします。( C=C'e^{i\delta}と置き直す。)
 x=C'e^{i (\sqrt{\frac{k}{m}}t+\delta)}
この \deltaは位相(phase)と呼ばれいてtが0の時の値なのでどのような状態で振動が始まったのかを表現しています。

 e^{i\theta}は物理では様々な分野で出てきます。
ですので、物理学徒は e^{i\theta}をみたら「振動だ!」と思うように訓練されています。


インピーダンスの例

抵抗とコイルが直列につながっている回路に交流電流を流すことを考えます。
V:電圧
I:電流
R:抵抗
L:インダクタンス
t:時間
とすると、電位差の和は0になるというキルヒホッフの第二法則より
 V-RI-L\frac{dI}{dt} = 0 \tag{3}
となります。1項目は起電力で、2項目は抵抗にかかる電圧(オームの法則)、3項目はコイルにかかる電圧です。
さて、交流電流は振動しているので電流は I=I_{0}e^{i\omega t}と書けそうです。(I_0は定数)
これを代入すると、
 V = (R+i\omega L)I \tag{4}
になることがわかります。つまり全体として見れば、 R+i\omega Lの抵抗がかかっているように見えます。
この、VIの比である R+i\omega Lインピーダンスと呼びます。以後、インピーダンスをZと表記します。
 Z= R+i\omega L \tag{5}
(5)式を複素平面で表すで表現すると様々なことがわかります。図1となります。

f:id:tdualdir:20180507231918p:plain
図1.複素平面上のインピーダンス
この図から直ちに大きさ |Z|=\sqrt{R^2+(\omega L)^2},電圧と電流の位相差 \tan\alpha=\frac{\omega L}{R}であるとわかります。



インピーダンス虚数

インピーダンス、つまり電圧と電流の比に虚数が出ました。
つまり、虚数は存在する?
結論から言うとそうとは言い切れません。
オイラーの公式を(1)の\theta \frac{\pi}{2}を代入してみてください。
 e^{(i\frac{\pi}{2})} = iになります。
つまりインピーダンス R+\omega Le^{(i\frac{\pi}{2})}と書けます。
電流が I_0e^{i\omega t}であり、(4)の再び代入すると、
 V=RI_0e^{i\omega t} + \omega LI_0e^{i(\omega t+ \frac{\pi}{2})}となります。
これが示しているのはコイルに入ったら位相が \frac{\pi}{2}ずれるということを表現しているにすぎません。
実際に I=I_{0}e^{i\omega t}の代わりに I=I_{0}\sin(\omega t)と表現しても良いはずです。 V=V_0\sin(\omega t + \alpha)
これを(3)式に代入すると
\begin{align}
V_0\sin(\omega t + \alpha) &= RI_0\sin(\omega t) + \omega LI_0\cos(\omega t) \\
&= I_0\sqrt{R^2+(\omega L)^2}\sin(\omega t + \theta_0) \tag{6}
\end{align}
但し、 \tan\theta_0=\frac{\omega L}{R}
両辺を比べると、 V_0 =  I_0\sqrt{R^2+(\omega L)^2},  \tan\alpha=\frac{\omega L}{R}となって複素数を使わなくても同じ結果を得られます。

ではなぜ最初に I=I_{0}e^{i\omega t}を使ったのかというと(6)式の三角関数の合成を使うよりも複素平面の幾何として扱った方が簡単だからです。
つまり、ここで使っている複素数は本質的なものではなくあくまでも便利な道具として使っています。

実は他の分野で扱われる虚数も同じで、虚数を使わなくても解ける問題が殆どです。
次の量子力学を除いては。


量子力学

量子力学の基礎方程式として状態の変化を記述するシュレディンガー方程式というのがあります。
 ih\frac{d\psi(t,x,y,z)}{dt} =  -\frac{\hbar^2}{2m}\nabla^2 \psi(t,x,y,z) + V(x,y,z) \psi(t,x,y,z)  \tag{7}
h:プランク定数
m:が粒子の質量
V:ポテンシャル
 \psi:波動関数(状態を表す関数)
t:時間
x,y,z:それぞれ空間座標
 \nabla^2:ラプラシアン

この方程式には初めから虚数が入っています。
しかし、人間が観測する物理量は量子力学では波動関数に働く作用で、実数になります。(というか実数になるようにしてます。)
また、\psiに関しても物理として意味があるのは\psiではなく|\psi|^2です。
|\psi|^2が粒子の存在確率密度を表すというのが一般的な量子力学の解釈です。
確率密度なので空間で積分すると1になります。
 \int\int\int |\psi(t,x,y,z)|^2 dxdydz = 1 \tag{8}


では、量子力学においても虚数を使わずに表現できるのでしょうか?

その前に(7)式は両辺に複数共役をとっても成り立つはずなので\psi^*が成り立つ方程式は
 -ih\frac{d\psi^*(t,x,y,z)}{dt} =  -\frac{\hbar^2}{2m}\nabla^2 \psi^*(t,x,y,z) + V(x,y,z) \psi^*(t,x,y,z)  \tag{9}
となります。(これは後で使います。)


さて、確率密度の時間変化を考えます。
\begin{align}
\frac{d|\psi|^2}{dt} &= \frac{d}{dt}(\psi^*\psi) \\
& = \frac{d\psi^*}{dt}\psi + \psi^*\frac{d\psi}{dt} \\
& = -\frac{\hbar}{2mi}\left( \psi^\ast\nabla^2 \psi - (\nabla^2 \psi^\ast)\psi \right)\\
& = -\frac{\hbar}{2mi} \nabla \cdot \left( \psi^* \nabla \psi - (\nabla \psi^*)\psi \right)\\
& = - \nabla \cdot { \frac{\hbar}{2mi} \left(\psi^* \nabla \psi - (\nabla \psi^*)\psi \right) }
\end{align}
3行目の式変形で(7),(8)を使った。また、 \nabla \cdot divとも書かれダイバージェンスですね。


ここで、 \rho =|\psi|^2 ,  j =\frac{\hbar}{2mi} \left(\psi^* \nabla \psi - (\nabla \psi^*)\psi \right) とすると、
 \frac{d\rho}{dt} = - \nabla \cdot j \tag{10}
と書けます。
(10)式は連続方程式と呼ばれていて、確率密度 \rhoの時間変化がjという流れとなるという式です。(jは確率密度流と呼ばれています。)
この連続方程式は確率密度が急に湧いてきたり、無くなったりせず空間上で連続的に変化することを表してます。
確率密度なら当然満たすべき性質です。

さて、この確率密度流の係数に虚数が出てきました。
先ほどのインピーダンスの時と違うのは \psi複素数とした訳ではないのに始めから確率密度流に虚数が入っていることです。
さらに確率密度は実数なので(10)の左辺も実数で、確率密度流は実数になるべきです。そうするためには \psi複素数である必要があります。
(そもそも \psiが実数なら \psi^*=\psiとなって確率密度流は常に0になる。
また、(8)式より「右辺が1なんだから確率密度の時間微分は0になるのでは?・・・」と思った人はガウスの定理などを思い出しながら実際に計算してみて下さい。)

つまり、|\psi|^2 を確率密度と解釈するなら量子力学には虚数は必須であると言えます。


終わりに

これが「虚数はあるのか?」という問いに完璧に答えるかと言われてると微妙ではありますね。
そもそも量子力学の解釈が間違っているとか、実は虚数を使わなくて済む別の方程式があるのではないかとか色々ツッコミどころはあると思います。
ただ、少なくとも私は「虚数はあるの?」とか「虚数は必要なの?」って聞かれた場合は「虚数が無いと量子力学の確率解釈が成立しない。」と答えます。

追記(2018-5-9)

フィードバック



これらの議論を受けて、虚数を使わなくても量子力学は構成できる気もして来ました。

現段階での、理解としては以下のツイートになります。

詳しい方がいたら教えてください><


ツイッターやっているのでフォローお願いします。
↓今すぐフォローすべきキラキラ アカウント

じゃあの。

日記20180507

日記じゃ

前処理大全が業務で役に立った

例えば、

a, 1
b, 2
c, 3     
b, 4
a, 5
a, 6 

a, [1,5,6]
b, [2,4]
c, [3]

という処理をしたかった。
pandasのgroupbyでどうにかなるのか?ってちょっと悩んだが、前処理大全でagg関数でlambdaを使う処理をやったことを思い出した。

agg("カラム名", lambda x: xの計算) の時のxは Seriesオブジェクトになっているのでtolist()でリスト化したら上手くいった。
gist.github.com
なお、SeriesGroupByにapply(list)してもできる模様。(その場合の返り値はDataFrameじゃなくてSeries)

ありがとう前処理大全!




Macの隠しファイル表示/非表示コマンド

以前、日記に以下のコマンドをターミナルに打てば良いと書いた。
tdual.hatenablog.com

defaults write com.apple.finder AppleShowAllFiles TRUE
killAll Finder

しかしもっと簡単なキーボードコマンドがあった。

[command] + [shift] + [.]

で切り替えられる。



TrelloのPower-UpsTwitterに変えた。

Power-Upsは無料プランなら一つのボードに一つ設定できる。
今までは、Githubにしてたのですが、どうも使わないのでTwitterが埋め込めるPower-Upsにした。
f:id:tdualdir:20180507171056p:plain



データドリブンなカナブン

日記20180506

日記じゃ。

Pycon mini Osakaの資料作り

資料を作った。7割くらい出来たけど、資料を作ってるとまたアーキテクチャを変えたり色々と実験したくなるので資料が進まない。
あと、資料にアーキテクチャ図を書こうと思ってTensorboardのグラフを載せようと思ったけどグラフの流れは縦向きなので如何せんスライドに貼りずらい。
Tensorboardのグラフは横向きに出来ないのか?




Tensorflowのデバイスのログ出力

Tensorflowのデバイス(CPU,GPU)のログ出力をするにはSessionで設定すれば良い。

import tensorflow as tf

a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3], name='a')
b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2], name='b')
c = tf.matmul(a, b)

sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))

print(sess.run(c))

出力

2018-05-06 22:58:47.845758: I tensorflow/core/common_runtime/placer.cc:886] MatMul: (MatMul)/job:localhost/replica:0/task:0/device:CPU:0
b: (Const): /job:localhost/replica:0/task:0/device:CPU:0
2018-05-06 22:58:47.845783: I tensorflow/core/common_runtime/placer.cc:886] b: (Const)/job:localhost/replica:0/task:0/device:CPU:0
a: (Const): /job:localhost/replica:0/task:0/device:CPU:0
2018-05-06 22:58:47.845808: I tensorflow/core/common_runtime/placer.cc:886] a: (Const)/job:localhost/replica:0/task:0/device:CPU:0

[[22. 28.]
 [49. 64.]]

インタープリタでやるとこれで良いのだがupyter notebook上で実行するとlogは出力されない・・・
あれ?って思ってjupter notebookのログを見るとそっちに出力されてた。
なんとかしてjupyter notebookで表示しようと思ったけど、C++のエラー標準出力は表示されないだと・・・
stackoverflow.com




分散表現という言葉

単語の埋め込みを分散表現(Distributed representation)とも言うが「分散」ってなんだ?って思って調べたけどなんか深そうだった。
一応、one-hotベクトルじゃなくて複数成分で単語を表現出来ているときに分散表現と呼ばれていると言える。
分布仮説との関係、認識の類似性としての表現、word2vecのように計算ができることなど色々な側面があってちゃんとまとめる必要がありそう。

日記20180505

日記じゃ

茨城のひたち海浜公園ネモフィラを見に行った。

ネモフィラっていう青い花Twitterなどで見かけて綺麗だったのと、せっかくのゴルデンウィークだしちょっと小旅行するかってことで「ひたち海浜公園」に行った。
国営ひたち海浜公園 – 海と空と緑がともだち。ひたち海浜公園は、茨城県ひたちなか市にある国営公園です。

最寄駅は「勝田駅」で、行きは品川から「JR特急ときわ」に乗って行って1時間30分くらい。
それにしても普通の運賃と特急券が別にあるシステムは面倒臭いし、ややこしいのでどうにかならんものか。
(日本人でもややこしいんだから海外の観光客なら尚更混乱するでしょうね。)

勝田駅からは専用のバスが出ていて15分かからないくらいでひたち海浜公園に着いた。
暑かったのでTシャツで行ったが、海の近くなので風が結構冷たかった。
入場料は大人400円で、中学生以下は無料という激安だった。

園内は思ったより広くて、たこ焼きやかき氷などの屋台があちこちにあってテーブルもたくさん設置されていてのんびり過ごせる感じだった。
肝心のネモフィラは10分程度歩いたら見えてきた。
小さな丘を登りながらネモフィラを楽しむ形になってた。
f:id:tdualdir:20180506115852j:plainf:id:tdualdir:20180506115931j:plainf:id:tdualdir:20180506115855j:plainf:id:tdualdir:20180506115911j:plainf:id:tdualdir:20180506115917j:plainf:id:tdualdir:20180506115919j:plain
ネモフィラで丘が青くなっているのは神秘的やな。


丘の頂上からは海が見えた。空も雲一つなくて見渡す限り青色で綺麗だった(写真はない。)


ネモフィラを見た後は厚切りポテトチップスを屋台で買って座って食べて、帰った。
帰りは特急に乗らなかったが、勝田から日暮里まで2時間以上かかった。眠かった。
久しぶりに歩いたので疲れたが、まあ、ゴールデンウィークっぽいことをしたのでよかった。ネモフィラも綺麗だったし。
今、wikiで調べたけどネモフィラって英語では"baby blue eyes"ともいうのか。なるほど。



character level cnnで文書の最大長を変えて実験

文書の最大長が長すぎると埋め込む前の次元が大きくなってしまって処理に時間がかかるので1000文字で切ってた。
もちろん1000文字以上の文書だと途中で切られているがそれでも十分に極性を表現できていると考える。(原論文でも1014とかで切ってた。)
ただ、実験として最大長を2000文字に変えてみた。
まだ途中だけど情報が多い分やはり収束は速い。
f:id:tdualdir:20180506123426p:plain
f:id:tdualdir:20180506123437p:plain
青い方が2000文字
赤い方が1000文字


Instant Hotspotを知らないうちに使ってた

私のiPadwifiしか使えないので外で使う時は毎回iPhoneテザリングで通信してたんだけどあることに気付いた。
iPhoneのインターネット共有をoffにしていてもiPadからwifiを見つけて接続できる・・・
なぜなんだって思って調べたらiOS8から使える「Instant Hotspot」っていう機能だった。
両端末でアップルアカウントにログインしていて、Bluetoothがonになっていれば、wifiで繋ごうとした時に自動でインターネット共有をonにしてくれる。
最近、iPadを再び使い出したので当たり前だと思って享受してたけど、よく考えたらめっちゃ便利な機能やな。

日記20180504

日記じゃ

Character level CNNでアーキテクチャを変える

原論文([1509.01626] Character-level Convolutional Networks for Text Classification)のアーキテクチャではどうも上手く学習できないのでアーキテクチャを全然違うものに変えた。
低次元空間に埋め込みした後に複数のカーネルサイズを通して、最後に結合して特徴を出力するやつ。

アーキテクチャ図(tensorboardのグラフ)

tensorflowで実装したのでtensorboardのグラフで表示しとくと

アーキテクチャ図としては原論文
f:id:tdualdir:20180505000102p:plain
を以下のアーキテクチャに変更じゃ
f:id:tdualdir:20180505000156p:plain

VocabularyProcessor

文字を数値化するのはtensorflow.contrib.learnのpreprocessing.VocabularyProcessorを使ったので日本語も問題なくできる。
注意点としてはこれは元々は単語の処理をする為のものなので最大長を4とかに設定すると

from tensorflow.contrib.learn import preprocessing
vocab_processor = preprocessing.VocabularyProcessor(4)
docs = ["a aa aaa aaaa", "aaa a"]
print(list(vocab_processor.fit_transform(docs)))

出力

[array([1, 2, 3, 4]), array([3, 1, 0, 0])]

なので単語の間にスペースを入れて文字を整数にマッピングするようにした。
gist.github.com
あとcontrib.learn.preprocessingは古いのでtf.dataを使えと言う警告が出るがtf.dataの使い方がわからない。
と言うかドキュメント読んでも同じことが出来るようには思えない・・・ うーむ・・・

方針

学習も上手くいってるのでこのアーキテクチャで色々実験する。


回線のスピードチェックアプリを入れて見た。

なんか回線が遅い気がしたのでせっかくなのでアプリを入れて確認して見た。

speedcheck

これ

Speedcheck Internet Speed Test

Speedcheck Internet Speed Test

  • Frederik Lipfert
  • ユーティリティ
  • 無料

チェックした上下の速度だけでなくSSIDや場所も履歴として残るので良い。
色んな場所のFree wifiの速度をチェックしたくなる。
結果をipadiphoneで同期できるらしいのでアカウントも作った。
ただ広告がウザすぎるので360円くらい払って広告出さないようにした。
また、ipadの方のアプリで支払ったのにiphoneの方でログインしたのにまだ広告出てるのはなんかちょっと微妙やな。
同じアカウントなら一つ買ったら別の端末でも広告出さないようにしてよ。iphoneの方は広告出したままにした。。。

結果

wifiで二種類繋げられるんだけど、チェックしたらなぜか知らないけど遅い方に接続してることが発覚した。
だから遅く感じたのか・・・
速い方に変えた。

速度

  • 遅い方

くだり 21.36Mbps
のぼり 5.63Mbps

  • 早い方

くだり 59.24Mbps
のぼり 4.69Mbps

どっちも普通に速いやんけ。ってかのぼりは同じあまり変わらないのね。



microbit

twitterで見かけたのでちょっと調べた。

http://microbit.org/ja/guide/
教育用のマイコンBBCが作っていてイギリスの小学生とかが使ってるらしい。
マイクロusbでパソコンに繋いでプログラミングできるみたいだ。pythonでもコーディング可。
ジャイロ、温度センサー、無線通信、bluetoothと機能は一通り揃ってるみたいだ。



2、3時間のお昼寝

例のごとくMONSTER ENERGYを昨日二本飲んだので夜は3時間くらいしか眠れなかったので2、3時間お昼寝した。
昼寝すると午後からの作業が捗るな。



ヨドバシの前でGUのセールをやってたのでTシャツを3枚買った。

3枚で3000円ちょっとだった。
なんてないTシャツなので写真は割愛



Trelloのipadアプリでチケットにチケットを添付できない。

Trelloのipadアプリでチケットにチケットを添付しようと思ったらなんか選択肢に出て来なかった。macアプリではできるのに・・・


今日の思い付き


ブログのネタとしてはいいかもしれないけどあまり実用的ではないかも・・・


pycon miniのスライド全然できてないじゃん・・・

やばい・・・