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

扁桃腺炎にかかった

扁桃腺炎にかかった

完治まで7日くらいかかった。

10/5~10/12までまるまる寝込んでた。

不定期に高熱が出るわ、喉が痛くて固形物を食べられなくなったりで久々にかなりつらい症状だった。

大きな固形物が口に入らなかったのでなるべくスープやヨーグルト、栄養ゼリー、はちみつなど喉越しが良くて栄養が多く含まれてるものを摂った。

中でもはちみつは喉の細菌によく効くそうです。

不定期に高熱が出る方は出たら頓服薬飲むか頑張って水飲んで寝て直した。

それでもまだ咳が止まらなくて休んでるけど、明日にはもう仕事できるといいな。

KindleUnlimitedはじめた

人類は衰退しました1 (ガガガ文庫)

人類は衰退しました1 (ガガガ文庫)

懐かしい。大学の頃勧められて読んだ

シューティングゲームサイド Vol.12

なんか、掘り出し物見つけた感

魔術士オーフェンはぐれ旅 新装版1

魔術士オーフェンはぐれ旅 新装版1

また懐かしい…

大学のころちょっとやった。 タダなら読みたい。

食べる!SSL! ―HTTPS環境構築から始めるSSL入門

食べる!SSL! ―HTTPS環境構築から始めるSSL入門

ずっと気になってた!

読んだ

映画見てなかなかよかったので買ってみた。 結果、小説としては情景描写が不足してる気がした。 もともと場面の移り変わりとか視点がめまぐるしく変わる映画だったので見てなかったらわからなかった気がする。

とりあえず、中島聡だから読んでみた

書くことについて (小学館文庫)

書くことについて (小学館文庫)

- キングファンは必読

黒猫

黒猫

読んだあとの後味悪さはなんとも言葉にしずらい でも、すぐ読み終わって余韻に浸れるので1時間くらいかけて読んでみるのおすすめ

古めのC#のforeachを使用するとメモリアロケーションが発生して、GCの原因になる

恐怖のStackOverflowを発見した。

stackoverflow.com

最新のC#が使えたり、サーバーサイドなら特に気にする必要がないかもしれないけど、Unityではfor文でやるべきですね...

特に毎フレーム走る処理とかならば。

UnityのJsonUtilsで読み込んだjsonのネストした要素が空だった場合にnullを入れてくれない

今の案件でJsonの読み込みにLitJsonを使用してたんだけど、Unity5.3から標準でJsonツールを用意してくれたと聞いていまさらだけど試してみた。

パフォーマンスは素晴らしく、LitJsonよりも何倍も早かった。(数字とったけど手元にないので後で更新する

ただ、一点問題があり入れ子構造になったjsonの要素がnullだった場合にnull扱いにしてくないで要素の中を全部変数の初期値を入れてしまう。

具体的には↓のテストコードのような状況。

HogeTestで本当はcountsはnullになってほしかったんだけど、nullにしないでintに全部0が挿入されてた。

自分の使い方が間違えてるだけかもしれないけど、単なるバグなのかパフォーマンスのために犠牲にした挙動なのかを知りたい。。。

gist.github.com

dockerfile memo

FROM ubuntu:14.04

RUN apt-get update && apt-get install -y git software-properties-common make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm RUN add-apt-repository ppa:fkrull/deadsnakes && apt-get update RUN apt-get install -y python3.5 python3-setuptools RUN easy_install3 pip

Enjoy UniRx

UniRxクックブックてきな

今までに書いてきたよくあるRxのパターンを書いてく

  • 連打対策.
class HogeController : Monobehaviour{
    [SerializeField]
    Button btn;
    
    void do(){
        Debug.Log("てすてすてす");
    }   

    void Awake(){
        btn.OnClick.AsObservable()
            .ThrottleFirst(TimeSpan.FromSeconds(1))
            .Subscribe(_ => do()).AddTo(this);
    }
}

class RootHoge: MonoBehaviour{
    [SerializeField]
    ChildHoge[] childrenComponent;
    
    void Awake(){
        childrenComponent.Select(child => child.OnClicked).Merge().Subscribe(_ => {
            // いずれかの子供のClickStreamが発行された
        }).AddTo(this);
    }
}

class ChildHoge : MonoBehaviour{

    [SerializeField]
    UIButton btn;

    public IObservable<Unit> OnClicked{
        get; private set;
    }
    
    void Awake(){
        OnClicked = btn.OnClick.AsObservable();
    }
}
  • スタミナの回復時間などで前後時間を比較した計算する

例えばゲームのスタミナの回復時間を表示する箇所。 次の最大回復時間をサーバーから受け取って、現在時刻と比較するのが一般的だと思う。 ちょっと拡張して、次の回復までの時間、最大までの時間、現在の時間をRxで計算してみた

DateTime GetCurrentTime(){
    // なんか
    return DateTime.Now;
}

// 初期化済
ReadOnlyReactiveProperty<int> TimeToMax;
ReactiveProperty<int> timeToMax;
ReactiveProperty<int> present;
ReadOnlyReactiveProperty<int> Present;
ReactiveProperty<int> intervalTime;
ReadOnlyReactiveProperty<int> IntervalTime;
ReactiveProperty<int> maxPoint;
ReadOnlyReactiveProperty NextPointRecoverTime;

// 通信するたびに最大回復までの時刻が更新される
void Init(int timeToMax, int presentTime, int intervalTime){

//最大までの時間(秒)
TimeToMax = timeToMax.Select(ttm => 
    Observable.Timer(TimeSpan.FromSeconds(0),TimeSpan.FromSeconds(1))
        .Select(_ => GetCurrentTime()).Buffer(2, 1)
        .Select(buf => (buf[1] - buf[0]).TotalSeconds)
        .Scan((double)0, (prev, current) => prev + current)
        .DistinctUntilChanged()
        .StartWith(0)
        .Select(t => Mathf.RoundToInt(t)
    ).Switch()
    .ToReadonlyReactiveProperty();
    
    
    // 現在のスタミナ値
Present = present
            .CombineLatest(TimeToMax.Select(sec => Mathf.FloorToInt((TimeToMax.Select(sec => Mathf.FloorToInt(MaxPoint.Value - (float)sec / (float)Interval.Value)), (present, max) => Mathf.Max(p1, p2))
            .DistinctUntilChanged()
                .ToReadOnlyReactiveProperty();
                
                
            NextPointRecoverTime = this.TimeToMax.Select(sec => IntervalTime.Value == 0 ? 0 : sec % Interval.Value).ToReadOnlyReactiveProperty();
            
    
            this.maxPoint.Value = maxPoint;
            this.interval.Value = interval;
            this.timeToMax.Value = timeToMax;

}
  • ストリームをmergeするけど、Streamごとに違う処理をはさみたい.

yes おされたときとno押された時に違う処理をした後に共通処理したい。(FinallyはOnError時にも引っかかってしまうのでそれでは困るケース)

HogePopup popup;
popup.OnYesClicked.SelectMany(_ => API.PostYesData().Select(_ => UniRx.Unit))

.Merge(popup.OnNoClicked.SelectMany(_ => API.PostNo().Select(_ => UniRx.Unit))
.Subscribe(_ => {// 共通処理})
.AddTo(this);

  • Switchする

たとえば、自動ページングするリストビューなど子供の要素数が変化するもの。 子供要素が変化が起こるたびにクリックストリームを更新したい

ReactiveCollection<HogeComponent> collection;

// 子供要素が変化するたびにきちんとcollectionを同期する処理がどっかに実装されてる

void Awake(){
    collection = new RactiveCollection<HogeComponent>();
    // hotにしたいかな
    var stream = collection.OnCountChanged().Select(_ => collection.Value.OnClicked).Switch().Publish();
    
    stream.Connect();
    
    stream.Subscribe(_ => {
        // なんか
    });
}

flyway-sbt の依存が解決できなくなった

半年前くらいに書いたプロジェクトを再び実行しようとしたらCircleCIでエラーが出てきた。

gist.github.com

エラーの内容はFlywayがダウンロードできないだけなんだけど、以前動いてたものだったので原因がさっぱりわからず。

↓当時置いてた project/flyway.sbt gist.github.com

一応Issueは上がってて解決したっぽいことが書いてあるけどまだ解決してないのかな。

flyway-sbt is not resolved · Issue #1281 · flyway/flyway · GitHub

追記

もう少し調べてみたところSame Issueも上がっていてrepositoryのurlをhttpsにすれば解決するとのこと。 SBT plugin published to wrong location in Maven Central · Issue #1276 · flyway/flyway · GitHub

試しにhttpsにしたところうまく行った…

解決した project/flyway.sbt gist.github.com