kazumalab tech log

流行りとリラックマと嵐が大好きです。技術的ログ。

第2回 技術的ログ Twitterから

前回の記事はこちら。
blog.kazumalab.com

Twitterでの技術エントリー(?)をまとめただけになります。

技術本の大賞

学生が作ったUE4の作品

めっちゃレベル高い。
ゲームの気持ちいい部分を抜き出しててすごくやりたい。

ねこが可愛い...

たまには癒やしも必要ですよん。

RapidAPIを使えばすべて同一のコーディングで利用できるらしい。

Oculus TouchでもSteamVR Pluginが使えるらしい @Unity

The Labのやつができるみたい。
Steam強い。

写真から木を作成SpeedTree

UE4でも動くのすごくいい。

コードの書く際に見直すべきサイト

Gitからコーディングスタイル、ガイドラインまで、幅広い。

UnityのResourcesからLoadする際のキャストの件

かずまです。

UnityでResourcesからLoadするときになにもキャストしない場合Object型で返ってきます。
ただそれではGameObjectとして使えないのでキャストする必要があります。
今回はas演算子もキャストとして扱っています。
どの方法が一番はやく処理ができるのか、気になったので今回はそれを計測してメモしておきたいと思います。

キャスト方法

現在僕が知っている限りResourcesからのGameObjectへの型の変換方法は3つです。

asを使う

GameObject obj = Resources.Load ("Prefabs/Box/Wood") as GameObject;

予想ではasは早いと聞いたのでこれが早いかと!

(GameObject) 対象物

GameObject obj = (GameObject) Resources.Load ("Prefabs/Box/Wood");

これだとInvalidCastExceptionが投げられる場合があるので2つめの引数として型を指定します。

(GameObject)対象物 + typeof(GameObject)

GameObject obj = (GameObject) Resources.Load ("Prefabs/Box/Wood", typeof(GameObject));

二段階で念入りではありますが、これ実は2回も型変換しているので遅いのでは?と思っています。

Genericで指定

GameObject obj = Resources.Load<GameObject> ("Prefabs/Box/Wood");

Genericはコードを書く文にはキャストし忘れ、ということは減るはずなのでいいのですが、はたしてas演算子とどう変わるかといったところですね。

速度計測方法

今回は上記コードを1万回Loadし、そのたびに速度(時間)を計測します。
それを100回試行し、平均を取ります。

計測に使うのは
C#のStopwatchです。
Stopwatch クラス (System.Diagnostics)

プログラムのサンプルはこちら。

// asでの型変換の計測
for(int count = 0; count < times; count++) {
			Stopwatch st = new Stopwatch ();
			st.Start ();
			for (int i = 0; i < 10000; i++) {
				GameObject obj = Resources.Load ("Prefabs/Box/Wood") as GameObject;
			}
			st.Stop ();
			total_as += st.Elapsed.TotalMilliseconds;
}

PCの性能

OS : macOS Sierra 10.12.2
CPU : 2.9 GHz Intel Core i5
メモリ : 8 GB 2133 MHz

Unityと.Net Framework

Unity 5.5.0f3 Personal (64bit)
.NET Framework 4.5

こんな感じです。

計測結果

以下の結果になりました。
f:id:kazumalab:20170115015326p:plain

表に早い順番に並べるとこのような感じ。

方法 実行時間(100回平均)
as演算子 9.47781ms
(GameObject)対象物 + typeof 9.74216ms
(GameObject)対象物 9.99564ms
Generic 10.02538ms

予想ではas演算子が早いということでしたが、ほんとに早かったです。
as演算子を使う場合は少し制約があるのでそこも考えないと行けないです。

nullが返ってくる

キャストが出来なかった場合、InvalidCastExceptionをthrowされますが、
as演算子ではnullが返ってきます。

ufcpp.net

予想より早い(GameObject)対象物 + typeof(GameObject)

今回は早い結果となりましたが、何回か再生をポチポチした時にtypeofがない方が早いという結果になることも。
一概には早かったとはいえないけど、そこまで遅くないので使うのは良さそうですね。

Genericでは他に比べると遅いのかな、という印象でした。
高速に使うならas演算子、確実にキャストするなら(GameObject)対象物 + typeof(GameObject)を使うのが良さそうですね。

もし、もっとこうしたほうが良い、ホントはこうだと思うことがあればどんどんコメントでください。
絶賛C#マスター中ですのでご指摘、議論は嬉しいです。

よろしくお願いします。

初の学会発表に臨んだ件。

かずまです。

1/6 ~ 1/8まで静岡県伊東市にある、
ラフォーレ伊東にてプログラミングシンポジウムに参加、発表してきました。
これが人生初の学会というものです。

毎年この時期恒例だそうです。

発表のもろもろ

専門はデータベースを主としています。
今回の発表もデータベースについての内容でした。
結果としては

図が絶対パスになっていて表示されなかった

内容の良さがあまり伝わってなかった

質問の受け答えが微妙

でした。
発表の際に原稿を一応書いて練習してたはずですが、テンパったあまり真っ白に。
あちゃーです。

反省点

プロジェクターの端子を事前に確認しておく

これは発表前に「HDMIの端子がなくDVIしかない!」となってしまいました。
つまり、新しいMacを画面出力するのに変換ケーブルを持っていたのですがHDMIしか出力できず、あっけなく断念。
先輩のPCを使うことになり、Pathが違うので画像が表示されないという問題に。
相対パスにするべきだ...と反省、卒論は気をつけよう。

用語の意図をきちんと伝える

今回問題になったのはインピーダンスミスマッチ。

インピーダンスミスマッチに関してはここあたりの論文を参考にするのが良いかと。
ci.nii.ac.jp

次回こそはいい発表したいところですが今年3月で学生が終わるので
リベンジは社会人になってからですね。

ところで、こんなツイートが。

いやー確かにこの通りめっちゃ緊張して、ガチガチでした!悔しい!

食べ物、温泉、お酒

学会といえば論文発表もメインですが、それに引けを取らないご飯と温泉とお酒とボドゲです。
夜の部があったのでそちらにも参加しました。

これシンプルなのですが面白かった、オススメです。
f:id:kazumalab:20170110020824j:plain

旅館の近くに美味しい海鮮丼もあります!
f:id:kazumalab:20170110020918j:plain
最高だった。

旅館のご飯も美味しい!
f:id:kazumalab:20170110021042j:plain

さらに部屋には温泉が備え付けられているのでいつでも入り放題!


学会にでると知らないことがまだまだあって、参考になりますし、
トータル最高でした。

発表(記憶分)

3DプリンタのデータをSchemeで書く
対戦型2048の最強AIを作ってきた
中級者向け補完機能
Ocamlによる対話式デバッグ
Rubyでの型推論
オートマトン最高
個人情報(匿名、行動パターンから個人の特定できるか?みたいな)

などなど。

Lepton圧縮技術について

あけましておめでとうございます。
本年もよろしくお願いします。


正月ですが、気になったことがあったのでメモしておきます。


それがこちら。

github.com


2016/07/20にOSSになったということで少し前のお話ですが、
leptonという圧縮技術で、JPEGが平均で22パーセント圧縮できるそうです。

実際に使って見る

blog.kazumalab.com

この記事同様、適当な場所でLeptonをクローンしてきて、/usr/local/binへシンボリックリンクを貼ってあげます。

$ cd ~/.local/
$ git clone https://github.com/dropbox/lepton.git
$ cd lepton

ここからはREADMEに従ってmakeして行きます。
cmakeを使うのでいれてない場合はbrewでサクッといれておきます。

$ brew install cmake


次に./lepton以下にbuild用のフォルダを作成し、cmakeを実行します。
そのあとmakeします。

$ mkdir -p build
$ cd build
$ cmake ..
$ make -j8

makeする際に -j8とあるのは並列化を行うための引数です。

-j [jobs], --jobs[=jobs]
Specifies the number of jobs (commands) to run simultaneously. If
there is more than one -j option, the last one is effective. If
the -j option is given without an argument, make will not limit
the number of jobs that can run simultaneously.

manで詳細を見て見ます。
引数に同時実行したい個数を指定すると並列実行してくれるそうです。

makeが終わるとこのような感じになってます。

[100%] Linking CXX executable lepton-avx
[100%] Built target lepton
[100%] Built target lepton-avx

シンボリックリンク

さてmakeが終わりました。
buildフォルダのleptonをusr/local/binへリンクを貼ります。

$ sudo ln -si ~/.local/lepton/build/lepton /usr/local/bin

これでどこでもleptonが使えるようになります。

$ lepton test.JPG com.lep

上記のように使います。
comは適当な名前を自分でつけます。

全天球写真で試す

Theta Sで撮った写真は4Mありました。
これをLeptonでどれぐらい変わるのか試します。

使う写真はこちら
sinariovr.com

[11:12:16] kazuma:images $ du test.JPG 
7736[Kバイト]        test.JPG
[11:20:36] kazuma:images $ du com.lep 
5768[Kバイト]	com.lep

だいたい2Mぐらい圧縮されている計算になりますね。
JPGに戻す場合は1つ目の引数をlep、2つ目をJPGにします。

圧縮時間も仕様も難しくないのでいいですね。

第1回 技術的ログ Twitterから

[Unity] セキュリティ


[Unity] Processing



[Unity] Video Player


[Ruby on Rails]なんでView からControllerのインスタンス変数にアクセスできるの?

[Unity] Virtual Desktop


[Unity] インスタンスした物をAddComponent


[ツール] Slackでアクションがあった時のTwitterへの通知