読者です 読者をやめる 読者になる 読者になる

mattakのブログ

てきとうにあそぶ

Google IO 2017 健忘録 準備編

前置き

毎年外れていたGoogleIOのチケットがついに手に入った! 一人で初海外旅行ということもあって諸々不安だったので準備した。 準備したことと、得られた知見を雑にメモに残す

英語準備

今年の目標も兼ねて、英語準備をした。

やったこと

  • TOEIC受験 => 680 (R:305, L:375)
  • podcastほぼ毎日 (bilingual news, toeic english upgrater, accidental podcast..)
  • youtube 英語 (rwby, gdcセッション)
  • 週末TOEIC過去問勉強 (2-3ヶ月くらい)
  • duolingo (英語コース全部)
  • dmm英会話

申請系準備

  • パスポートチェック
  • ESTA申請
  • 飛行機予約
  • ホテル予約
  • 周辺イベント予約 (maker faire)

持ち物リスト

  • [x] パスポート
  • [x] GoogleIO ticket
  • [x] 航空チケット (紙)
  • [x] MakerFaireチケット (紙)
  • [x] ESTA (紙)
  • [x] ホテル予約 (紙)
  • [x] SIMカード
  • [x] 歯磨き
  • [x] 財布
  • [x] クレジットカード
  • [x] スマホ x2
  • [x] バッテリー
  • [x] mac book
  • [x] イヤフォン
  • [x] PCカバン
  • [x] 服装 x 3-4日
  • [x] 洗面用具 (歯ブラシ, タオル)
  • [x] 胃腸薬
  • [x] ボールペン
  • [x] ティッシュ

事前学習

  • G+ のGDC JAPANの情報参照
  • clipper購入手順確認
  • SIM利用周り確認
  • uber利用方法確認
  • maker faire準備
  • サンフランシスコ街並み調査 (watchdog2 play)
  • 行きたい場所をGoogleMap上で⭐️
  • 観光名所調査 (地球の歩き方購入)
  • 海外旅行力高い上司に色々雑談

得られた知見

Expedia便利

  • 他のサイトも比較して使ったけど、だいたい最安値だった
  • コメントとかで指摘されている治安状況は注意してみて正解だった

紙準備楽

  • 英語の会話で困ったら、物体として差し出せるので楽。
  • 今日予約してたんだけど、これ (紙を差し出す) というパターンが楽

CLIPPER便利

  • 初めは謎システムだったけど、慣れると楽
  • 完成度の低いSUICA見たいな感じ

英語学習多少効果あった

  • Listening力 => あるほど聞く場面が楽になる. 特に倍速リスニングの耳慣れ効果よかった
  • Speaking力 => 場数踏んで度胸つけるのが大事、雑単語で会話できれば十分何とかなる. 英会話気軽に度胸つくので良い
  • 買い物と、道を渡れなくて困ってるばあちゃんの手を引いて渡してあげるくらいのことはできるようになった。

SIMトラブル

    1. SIMカードケースのピンを忘れて現地で付け替えができなくて困った。空港のショップで専用のutilityが売ってたので解決。
    1. 購入したPrepaidSIM (ZIP SIM) がSMS届くのに、通常の通信できずハマった。何も入力しなくていいはずなのだけど、下記のMMSC設定で何とか解決。

APN settings for cellular data and MMS – ZIP SIM

車社会注意

  • 横断歩道もボタン押さない限り渡れない & ボタン押しても即終了する車最適化の交通システム
  • 電車は運行頻度が低い (caltrainだったら1hに1本くらいの心づもりが良さそう
  • 車でないと到達しづらい場所多数
  • 歩くの結構疲れる
  • でもタクシーあんまり使いたくない…

飛行機の搭乗注意

  • 当たり前だったのだろうけど、2h前に空港にいるのが標準的ってのを前日に調べておいてよかった。割と手間取る
  • 韓国 => サンフランシスコは半日弱くらい飛行機乗りっぱなしなので注意
  • 3回食事 & その度に給水あるので、トイレ行っとかないと死ぬ
  • 飛行機のトイレ混んでる & 窓側だとかなり行きづらい
  • 映画見っぱなし注意. 4-5本見れる (君の名は、アサシンクリード、Moana、嗚呼素晴らしきかな人生、sing)
  • 全起きしてると到着した日が辛い..

New year's resolution 2017

Resolution 2017

Slogan

Beat the average and change my life.

Health

Goal

  • weight : 55kg
  • body fat percentage : 13%
  • run : keep 50km / month

Now

  • weight : 58.7 kg
  • body fat percentage : 18.3%
  • run : 56 km / month

Life

Goal

  • get a girlfriend
  • trip one country

Engineering

Goal

  • Create 100 star library.
  • Publish my application on iOS/Android
  • Create DeepLearning application
  • qiita: 1500 stock

Now

  • 43 star
  • no apps
  • I have learned MachineLearning except CNN.
  • qiita: 873 stock

Learn

English

Goal

  • TOEIC 700
  • TOEFL (take a examination)
  • DMM EIKAIWA: 50 times / year
  • duolingo: complete every lesson (56 / 56)
  • keep listening of english podcast, movies, and so on.

Now

  • TOEIC 630
  • TOEFL no result
  • DMM EIKAIWA: 22 times / year
  • duolingo: 35 / 56

Spanish

Goal

  • duolingo: 32 / 64
  • remember: 500 words

Now

  • duolingo: 5/64
  • remember: 20 words

Haskell

Goal

  • start haskell: complete
  • create parser combinator example

Now

Book

Goal

  • Read 10 books worth reading

Et cetera

  • Discover and try something new to change my life.

Review of 2016

review of 2016

New year's resolution of 2016

mattak.hatenablog.com

△ Health

Good health condition against the 2015. I have done well in half of year, but I was lazy at the end of year.

  • ✅ Running => 56 km / month (chart below)
  • ❌ sit up => ??
  • ❌ push up => ??
  • △ 55kg 10% => 58.7kg 18.3% (54kg 16% at August)

△ English

Improved, but need more practice to listen and speak.

  • △ 1 speak / week => 0.42 speak / week (22 times / year)
  • started dmm eikaiwa, duolingo
  • played with english (ff15, life is strange)
  • listened podcast (bilingual news, accidental tech)
  • watched movies (Rogue one, RWBY)
  • talked on issue, and chat... (Unidux, mapbox-gl-native...)

△ Lifestyle

Bad

  • ❌ do not eat at 9 over
  • ❌ do not play at 10 over

Good

  • cleanup my rooms. discard clothes, books, and the stuff not needed. (affected by KonMari)

△ Reading

Read so many comic books, light-novels. Less reading of serious stuff.

  • ❌ forgot to logging

✅ Release

OSS

App

Sample

Qiita

  • 873 stock

✅ Income

  • Promoted to senior engineer.

Summary

I have done well, but not done my best.

Why I create Unidux.

英語も頑張って書いてみるテスト。

Introduction

今日 Unidux v0.0.1 をリリースしました.

Today, I released Unidux v0.0.1.

僕は一般的にはオレオレアーキテクチャをつくるのは下策だとおもっているのだけど、

I think that it's not good way to create application architecture by oneself.

今回はその考えに反してアプリケーション・アーキテクチャを自作しました.

But at this time, I created handmade application architecture against the idea.

それには理由があります.

There is a reason to create application architecture.

Unity上でアプリケーション・アーキテクチャを具体的に実装したよい例を発見できなかったから。より正確にいうならば、疎結合で、データフローがわかりやすく、状態管理が複雑にならないアーキテクチャを採用した事例が見つからなかったです。

I couldn't find any good application architecture example. If more precisely say, I couldn't find loosely coupled, clear dataflow, not complex state management architecture.

細かい経緯は gotanda.mobile #1 でも発表しました。

Details was spoken in gotanda.mobile #1

speakerdeck.com

それから幾日かたち、Unidux v0.0.1をリリースしたというわけです。

Some day passed, so Unidux v0.0.1 was released.

アーキテクチャはまだ穴が多く改善の余地があるのですが、これからissueを地道に消化していこうと思います。

Unidux is still young and has may bugs, I will solve the issues step by step.

pull requestはいつでも待ってるので興味があればください.

Pull request is always welcome.

GeoHexの最適化

GeoHex v0.0.1をリリースした. ただロジック的にはgeohex4jのコピーに過ぎず、いくつかパフォーマンスチューニングの必要性があると思ってた。 その最適化した時のメモ。

計測

まずは各関数の実行時間を正確に計測する。 実行時間を計測するためのクラスを作成した。

gist.github.com

計測結果

10回ほど計測して平均値をとった。

function original (ms) optimized (ms) shrink time percentage (%)
AdjustXY 1.184e-05 1.1345454545454545e-05 95%
GetXYByLocation 0.0001939 0.0001600909090909091 82.5%
GetZoneByCode 0.008047 0.005785454545454546 71.9 %
GetZoneByLocation 1.872 0.0033481818181818183 0.18%
GetZoneByXY 0.003157 0.0028772727272727274 91.1%
Pow3 3.8473684210526316e-06 4.564593301435407e-06 118%
Math.Pow3 3.6705263157894735e-05 3.489952153110048e-05 95.1%
GetHexCoords 0.0006748 0.00052 77.1%
GetHexSize 9.73e-06 4.9e-06 50.4%

比較のために同じ計算値のMath.Pow3を表示している. 絶対時間が小さく、相対値が10%以内のものは誤差と考えてもよさそうだ。

3の累乗を計算する Pow3,Math.Pow3。AdjustXYなどがそれに該当する。

やったこと

全体のコミット差分はこちら

1. Debug.AssertをException throwに変更

一番効果があったのはこれだった。

Debug.Assert => throw ArgumentExpcetionに変更することでGetZoneByLocationが500倍近く高速化した。 一つDebug.Assertするだけで0.5msほどくってのがまるまるなくなった感じだ。

なぜこんなに重いのかが疑問だったが、とにかくこれが一番効果があった。

2. 計算式の削減

数値計算の基本で演算回数を減らすと高速化するので、式を変形してできるだけ演算回数を減らした。

3. 決まった数の定数化

GeoHexのレベルは予め範囲が決まっておりそのlevel値をもとに3の累乗を計算するので、これを事前計算して配列に突っ込んでおいた。

Math.Powをつかわず計算済みの値をつかうことでかなり高速になる。 GetHexSizeはこれにより2倍程度高速になった。 ただし配列へのアクセスが演算速度を下回っている場合に限るので、環境によっては対して変わらないかもしれない。

4. 割り算の削除

数値計算でもっとも重いのは割り算であるので、これを掛け算になおすように調整した。

5. Math.Floor Math.Ceilingの展開

正の整数であることがわかっているにもかかわらず、Math.Floorをしてしまっていたので普通にキャスト。 また正の整数をMath.Ceilingするさいに、shift演算と加算とAND演算に展開することで高速にした。

Performanceをとってみてもこれは確実に高速化に寄与していた。

6. 比較演算の&&の順序を交換

AND条件で左辺と右辺を交換しても意味的な変化がないものは、はじめの条件が高速なように変換した。 数値の場合、一致比較より順序比較のほうが一般的には高速なはずなのでこれに直す。

7. ループ内変数の外出し

正直あまり効果は計測できなかったが、ループ内の変数は外出ししておいた。 もしかしたらコンパイラがよしなに最適化してくれる部分かもしれない。

結論

パフォーマンスが必要な場面では、Debug.Assertは使わないようにしよう。

MapboxでUnity3D対応をしたいので調査...

ただの個人的なメモ書き

手がかりをさぐる

同じことを考えている人はいるはずなのでとりあえず検索してみる。

github.com

Qtで同じことをやっている人はいるようだ。 これを真似すれば良さそう。

どのファイルをいじればいいのか?

commitログを眺める。

$ git log --oneline
efca99c [Qt] expose NorthOrientation
...
69465c9 [Qt] Add a Qt wrapper aroung mbgl::Map
d10cfd0 [ci skip] [android] Main loop integration
69465c9 [Qt] Add a Qt wrapper aroung mbgl::Map
d10cfd0 [ci skip] [android] Main loop integration
fd64b14 [glfw] Main loop integration
c31c91e [core] Add foreign main loop integration support to mbgl::RunLoop
bd5fabd [tests] Adapt tests for rendering on the main thread
1676934 [core] Render from the main thread
0f37b67 [core] Do not use std:: namespace for log2()

[Qt] というタグがついてるコミットが対象っぽい.

masterとの差分ファイル一覧を出す

$ git diff --name-only HEAD...qt-app
Makefile
android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/views/MapView.java
android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/views/NativeMapView.java
configure
gyp/common.gypi
gyp/http-qt.gypi
gyp/linux.gyp
gyp/mbgl.gyp
gyp/osx.gyp
gyp/platform-qt.gypi
gyp/qt.gypi
include/mbgl/map/map.hpp
include/mbgl/platform/default/glfw_view.hpp
include/mbgl/platform/qt/QMapboxGL
include/mbgl/platform/qt/qmapboxgl.hpp
include/mbgl/util/run_loop.hpp
platform/android/jni.cpp
platform/android/native_map_view.cpp
platform/default/async_task.cpp
platform/default/glfw_view.cpp
platform/default/run_loop.cpp
platform/default/timer.cpp
platform/qt/application_root.cpp
platform/qt/asset_root.cpp
platform/qt/async_task.cpp
platform/qt/async_task_impl.hpp
platform/qt/http_context_qt.cpp
platform/qt/http_context_qt.hpp
platform/qt/http_request_qt.cpp
platform/qt/http_request_qt.hpp
platform/qt/image.cpp
platform/qt/qmapboxgl.cpp
platform/qt/qmapboxgl.qrc
platform/qt/qmapboxgl_p.hpp
platform/qt/run_loop.cpp
platform/qt/run_loop_impl.hpp
platform/qt/timer.cpp
platform/qt/timer_impl.hpp
qt/main.cpp
qt/mapwindow.cpp
qt/mapwindow.hpp
qt/qmapboxgl.gypi
scripts/linux/configure.sh
scripts/osx/configure.sh
scripts/osx/install.sh
scripts/osx/setup.sh
src/mbgl/map/map.cpp
src/mbgl/map/map_context.cpp
src/mbgl/map/map_context.hpp
src/mbgl/map/map_data.cpp
src/mbgl/map/map_data.hpp
src/mbgl/util/thread_context.hpp
test/api/annotations.cpp
test/api/api_misuse.cpp
test/api/custom_layer.cpp
test/api/repeated_render.cpp
test/api/set_style.cpp
test/fixtures/util.cpp
test/miscellaneous/map.cpp
test/storage/http_error.cpp
test/storage/http_retry_network_status.cpp
test/test.gypi

変更されたディレクトリ一覧を出す

$ git diff --name-only HEAD...qt-app | xargs -n1 dirname | sort | uniq
.
android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/views
gyp
include/mbgl/map
include/mbgl/platform/default
include/mbgl/platform/qt
include/mbgl/util
platform/android
platform/default
platform/qt
qt
scripts/linux
scripts/osx
src/mbgl/map
src/mbgl/util
test
test/api
test/fixtures
test/miscellaneous
test/storage

一つ一つファイルの変更をみていく

Makefile - qtのビルドオプションが追加されただけ

MapView.java - めっちゃ長い. タップイベントやら諸々が書かれてる

NativeMapView.java - 微修正. リネーム等なされているようだ

configure - printの設定が追加されただけ

gyp/linux.gyp gyp/common.gypi - フラグ変更のみ

gyp/qt.gypi gyp/platform-qt.gypi gyp/http-qt.gypi - 新規追加

gyp/mbgl.gyp - qt用に設定追加

...

こっちのソース見るほうが早いかも...

GitHub - tmpsantos/qmapboxgl: Mapbox GL for Qt

疑問点

  • UnityのTextureにmapboxのレンダリング結果を貼り付けることができるか?
  • MapBoxのタッチイベントをUnityに移譲することができるか?
  • Unityでnative c++のソース (mapbox gl のcore部分) をビルド連携可能か?

raspberry piで自宅の湿度と温度を監視したい

モチベーション

最近部屋が乾燥していて朝起きると喉がカラカラになってしまう・・ 湿度計も温度計もないのでraspberry piで自作してみる. ついでに測定したログを監視サービスにポストするようにした.

設定全般

us配列で入力しにくいので、keyboard 配列を変更 /etc/default/keyboard

XKBMODEL="jp106"
XKBLAYOUT="jp"

Raspberry Piを買ってみたのでRaspbianのインストールとか初期設定とかとか | メモ帳代わりのブログ

$ sudo aptitude install vim
$ sudo reboot

計測

make-motion.hatenablog.com

上記ブログを参考にcで書いた。

データのpost

記録した温度と湿度はdatadogのAPIにpostするようにした。

qiita.com

qiita.com

API Reference

最終的にこんなスクリプトを書いた

実行して問題ないことを確認

$ sudo aptitude install libcurl4-openssl-dev
$ gcc -o dht11 dht11.c -L/usr/local/lib -lwiringPi -lcurl
$ sudo ./dht11

結果

f:id:mattaclj:20160314003642p:plain

概ね何もしないと

  • 温度: 17度
  • 湿度: 39%
  • 不快指数: 61 (何も感じない)

ぐらいだった。エヤコンつけて温度を上げると(18度くらいで) 湿度が1%ぐらい減る。 水に濡らしたタオルをエヤコンの上に干してみたり、ドアノブにかけてみたりしたが湿度は0.5%程度しか影響しないようだ。。

matome.naver.jp

上記サイトによると冬場の適切な湿度は 45% ~ 60%のようだ。 一般的に湿度が40%を切ると乾きを感じてくるようなので、もう少し湿度を上げる工夫が必要そう。 またエアコンで温度を上げると湿度が1%程度下がるというのも観測できた。

できれば50%ぐらいに湿度たもちたい。 もう冬場すぎるけど、この際加湿器買おうかなぁ・・。

余談

c/pythonじゃなくてrubyで書きたい。 pcのノリでanyenv => rbenv => ruby 2.2.4をinstallしてみたらビルドするだけで数時間かかった。 こだわりなければ、おとなしくc か systemにpreinstall済みのpythonで書くのが面倒なくてよさそう。