Dive into Ofuton

お布団に飛び込もう

BitConverterでGetBytesするよりポインタ使ったほうがメモリに優しい

ykimisaki.hatenablog.jp

byte[]に何かを変換するとき、BitConverter.GetBytesを使わない方がパフォーマンス出る。

GetBytesの中身を見ると、(当然といえば当然だけど)内部で引数の型の大きさ分だけbyte配列をnewしているため、ポインタを使って適当に用意したバッファを使い回した方がメモリに優しい。

GetBytes - http://referencesource.microsoft.com/#mscorlib/system/bitconverter.cs,9108fa2d0b37805b,references

[System.Security.SecuritySafeCritical]  // auto-generated
public unsafe static byte[] GetBytes(int value)
{
    Contract.Ensures(Contract.Result<byte[]>() != null);
    Contract.Ensures(Contract.Result<byte[]>().Length == 4);

    byte[] bytes = new byte[4];
    fixed(byte* b = bytes)
        *((int*)b) = value;
    return bytes;
}

GetBytesを呼んだ回数だけbyte配列もnewされるため、適当にバッファ用意してそこにbyte[]に変換したものをコピーするとよい。
一番上のリンクだと、byte[1024]のバッファに、int[100]をまとめて突っ込んでいた。要点はこんな感じ。

byte[] buf = byte[4];

unsafe{
    fixed(byte* b = &buf[0]) // bufの先頭アドレスのポインタを作成
        *((int*)b) = value;// ポインタに値を入れる(bufに入る)
}

追記

UnityのmonoとBitConverterが微妙にコードが違ったのでこっち(mono/BitConverter.cs at Mono2.12.x-Unity4.x · Unity-Technologies/mono · GitHub)見たほうがいいかも

Android版IL2CPPがなんか遅い

Unity5.2からIL2CPPがAndroidでも使えるようになったみたい。
tsubakit1.hateblo.jp

Unity5.4.0b17時点でも、

IL2CPP on Android is experimental and unsupported

と書いてあるので、まだ実験段階な模様。

ほーん、どれぐらい早くなるんやー?と思って、Mathf.Atan2や、Vector3.DotなどをNexus5xで5,000万回実行して見たら、Atan2は2割くらい早くなって、Dotは逆に2割ほど遅くなった。

生成されるcppファイル読めばわかるのかな…

銭湯に行ってみた

機会があって上司と一対一で飲んでいたら、

「銭湯いいよ」

というアドバイスを頂いた。
一人暮らしでずっとシャワーだったのと、会社の往復しか外出する機会がなくなりつつあったので、この一週間は気分転換に徒歩圏内の銭湯を歩きまわってみた。

宝来湯

宝来湯 : 渋谷区 東京銭湯マップ

靴箱の鍵と脱衣所のロッカーの鍵を交換する。瓶の牛乳がおいてある。

広尾湯

広尾湯 : 渋谷区 東京銭湯マップ

普通。土曜夜だったけど空いてた。瓶の牛乳はない。

アクアガーデン三越

アクアガーデン三越湯 : 港区 東京銭湯マップ

綺麗。日曜夜だったせいか混んでた。瓶の牛乳はない。


風呂あがりは牛乳が一番ってことで宝来湯がベスト()

Xperiaの保護フィルム貼り替えようと思ったら飛散防止フィルムを剥がしていた

愛用しているXperiaZ1なのですが,最近どうもタッチパネルの反応が悪く,保護フィルム貼り替えたらちょっとはましになるかなーと思って貼り替えようとした時の話.

このツイートをしてすぐ,Amazonでポチりました.

nuglas ラウンドエッジ加工 日本産強化ガラス SONY Xperia Z1用 液晶保護フィルム

そして翌日(今日)届いていたのがこちら

最初,iPhone用のを買ってしまったのかと見直しました.本気でiPhone用買っちまったと思いました. 冷静にパッケージを見なおしたら,左下にfor Xperiaってシールが貼ってあるのに気づき胸をなでおろした次第.

GooglePlayに,AppStoreとスクショから完全に同じアプリが並んでるのと似たような心境になった.

保護シートを貼るにはまず前貼ってたシートを剥がさなきゃいけないので剥がしにかかったのですが,若干トラブル.

爪ではどう頑張ってもダメだったので道具を使ってみたけどなかなか剥がれず,結局小さいマイナスドライバーをスキマにねじ込んでようやく剥がせそうな雰囲気になった. この時点で,もしかしてこれ剥がしちゃヤバイタイプのやつかなという疑念が頭の端っこに生まれましたが,タッチパネルの反応が悪いのはこいつのせいだと決めてかかっていたのでとどめを刺してやった.

結果

あれ,前貼ってたやつが癒着しちゃってロゴごとくっついちゃったのか…?と思いつつ,明らかに手応えが保護シートを剥がすときのそれじゃなかったので,やっちまった〜〜〜って感じ.

まあ,届いた保護シートが隙間なく綺麗にはれたのでよしとする.

どうしてこうなったか

Xperia買ったのが今年の2月半ばとかで,すぐにケースも合わせて買ったんだけど,ケースってだいたいフィルムもついてるからそれを貼ったもんだと思い込んでいた. 今思い返すと,すでに貼ってあるし二重にはらなくていいかなっていう風に考えたような気がしなくもない.

結論

保護シート貼り替えるときは気をつけよう!!!!

オープンソースカンファレンス行きたかった

行くからにはなにかネタを持って行こうと思って,Xperia Z1にmikutter突っ込んでたら夜遅くなって,今までの寝不足と重なって死んでしまった.

次の東京開催は行く.と思う. OSPN - We Are Open!!

RaspberryPiハッカソンに行ってきた

おとといRaspberryPiハッカソンなるものがあったので行ってきました.

成果

3行でまとめると,

  • カメラモジュール
  • OpenCV
  • 顔が写ったら保存

以上です.

ハッカソンで使ったRaspberryPi B+とカメラモジュールv1.3とOS入りmicroSDカードもらいました.
やったね

購入した周辺機器

自宅でRaspberryPiをいじるにはいろいろ足りてなかったので帰り際および翌日に購入したブツたちです.

モニタ

価格.com - LGエレクトロニクス 23MP75HM-P [23インチ] 価格比較

ヨドバシのモニタコーナーに言ったら店員さんがプッシュしてたので購入.
あとで調べてみたら24インチモデルがもうちょい安く売ってて悲しくなった.
HDMIケーブルとD-Subケーブルが1本ずつ付いてたのもよい.

無線LANドングル

Amazon.co.jp: BUFFALO 無線LAN子機 コンパクトモデル 11n技術・11g/b対応 WLI-UC-GNM: パソコン・周辺機器

実家暮らしでルーターが親の部屋に入ってるてて有線接続が出来ないので無線LAN用に購入.ちゃんと動きました.(Raspbian 2014-09-09)
レビューにも書かれてますが,かなり発熱するので長時間使うとどうなるかわかりません.

無線キーボード&マウス

Amazon.co.jp: LOGICOOL ワイヤレスコンボ mk270: パソコン・周辺機器

アダプタ一つでマウスとキーボード両方いけるやつです.普通に使えました.

1時間も作業したらsshで接続できるしリモートデスクトップもできるようになったからもはや全部用済みになってしまった 自宅の無線LAN環境ではリモートデスクトップだとかなり遅延がでかいのでGUI使うなら直接モニタに繋いだ方がいい感じだ.母艦とブリッジ接続させたら無線LANルータ介さないからもう少し早くなるのかな…

おまけ

意外とキーボードって自宅に転がってたりしないんだね!!

進捗

ダメです.主に輪講が死んでる.

Twitterクライアントの方に,通知機能を充実させてほしいというリクエストがありますが,現状なかなか厳しそう.

リプライ,DMの通知であれば一定時間おきに新着があるかどうかチェックすれば済む(とは言え実装するのは時間かかりそうな雰囲気ある)けど,ふぁぼ,RTとかの通知をするにはストリーミングにするしかなさ気だ.

RTは,直近の自分のツイートでRTはされたツイート一覧を取得できる(twitter4j.Twitter#getRetweetsOfMe)が,どのユーザーがリツイートしたのかまではわからない.イケてない.

フォローは一番最近フォローされたユーザーをリプライと同じ要領で引っ張ってこれるからいける気がする.リムーブは,フォロワー数が多いと無理.

あと,仮にストリーミングで上の各イベントを取得したとしても,バックグラウンドでやるとメモリが逼迫したり長時間経過した時どうなるかわからない.
現時点でストリーミングの処理は完全にHomeタブを表示しているFragmentに埋め込んでいるので,

アプリがバックグランドに移動→メモリ逼迫 or 長時間経過→Activityが死ぬ→あぼーん

ということで通知ができなくなる.

Serviceにストリーミングの処理を移して,イベントを取得したら必要なFragmentなりActivityなりに通知,みたいな感じがベターなんだろうけど結構大掛かりな作業になるのでこれも実装するとなると時間がかかるだろうなぁー.

今までService使ってまともな処理を書いたことがないっていうのもつらいところ.

それより,マルチアカウント対応を更に進めるのとタブの順序を編集できるようにするやつの方がもっときつそうだけどな!

とりあえず寝よう.( ˘ω˘)スヤァ