NETFLIXの本を読んだ

連休中なのですが、前から積んでいたNETFLIXの本を読みました。 こちらの本です。

内容

よくある企業本は会社の歴史を振り返ったり、創業者(またはCEO)のこれまでの歩みを伝記として書かれたりすることが多いのですが、今回の本は、NETFLIXがどうやって大きくなっていったかではなく、NETFLIXの企業文化について書かれています。 ですので、この本を読んでもNETFLIXが過去何をしていた、今どのような事業をしているかはわかりません。

個人における最高水準の報酬を払う

この本の中で自分が1番心に響いたのがこの社内ルールです。 平凡な社員を10人ではなく、一人の優秀な人材のほうが良い成果を生むことができるという考えはNETFLIXだけではないと思います。 自分もエンジニアとして働いている中で、周りが優秀な人が多いこともあり、ゲーム業界で生き残っていくために常にLvを上げ続けないといけないと再認識させられました。

最高水準の報酬

同業他社基準で設定されているので、人を雇用するマネージャー的な人は、この報酬を常に把握しておかないといけないとあり、そのあたり大変だなと感じました。 当然他社はかんたんに報酬を公開しないので、ヘッドハンティング業者に探りを入れて聞くなどしないといけないので、結構水物の値になるなと感じました。 自分も今の水準が業界のどのあたりなのか知らないので、報酬以外にも会社を選ぶ基準はあると思いますが、聞いてみたいなと思いました。

ポジション

この本では、最高水準の報酬は常に変化すると書かれています。 今後どの分野に注力するかで必要なスキルは変わってくるので、需要が下がれば報酬が下がったり、または解雇されることもあります。 自分がやりたいことと会社に求められることが同じだと勉強もしやすいと思いますが、違ってくると修正をしていかないといけません。 会社だけでなく業界のニーズもあるので、今どの分野・スキルが必要になっているのかを把握しておく必要もありそうです。

情報はオープンにする

社員に当事者意識をもたせるために、様々な情報を公開しているのですが、この例え文言がすごくしっくりきました。

野球のルールも説明せずに、写真を試合に送り込んでいるような状況だ。社員は一塁から二塁へ盗塁をしようとするが、試合全体の流れがいまどうなっているかまるで理解していない

個人プレーではなくチームプレーが必要なので、ここの能力が高いだけではなく、今の状況を理解し、それを加味しどう動いていくかが大切だと感じました。 この本の別の項目であげられている「意思決定の承認を一切不要にする」も社員の当事者意識を上げる考えだと思いました。

日本人について

NETFLIXの日本支社についての話も記載があり、それはフィードバックなどのコミュにケーションについてでした。 詳しくは本を読んでいただきたいのですが、文化によって様々な背景があり、それらの人々と働くには「対話」をすることがとても大切だと書かれています。 たくさんの質問をし、好奇心を示すほど、異文化の相手にも適切なフィードバックを与えることができるとありました。

自分はそのような異文化でのコミュにケーションは余り経験がないのですが、同じ文化間での対話はとても大切なのだと感じました。

最後に

NETFLIXに関しては一ヶ月だけ視聴した経験があるので、サービス面についてそれほど詳しくないです。(ウィッチャーのドラマみるために契約していた) ただ、周りでNETFLIXを見ている人が多かったので、興味があり本を読んだのですが、結構考えさせられることが多い内容でしたので読んでみてよかったと思いました。

【読書】赤と白、我が人生を読む

ゴールデンウィークということで普段余りやらないことをやっているのですが、今日はサッカーのアーセン・ベンゲル監督の「赤と白、我が人生」を読みました。

アーセン・ベンゲル

ご存知の方は知っていると思いますが、今回読んだ著者のアーセン・ベンゲル氏は英国プレミアリーグアーセナルの監督を22年間努めたことで有名です。 私がアーセナルというチームを知ったのが2006年のチャンピオンズリーグ決勝を見た時でした。 このときはバルセロナが2-1で勝った試合なのですが、前半にレッドカードで10人になったアーセナルの戦い方がとても印象に残っていました。

UEFAチャンピオンズリーグ 2005-06 決勝 - Wikipedia

名古屋グランパス

ベンゲル監督は、日本の名古屋グランパスでも監督をされていた経験があり、実は日本にも馴染み深い人物です。 今回の本では日本で監督をする経緯なども書かれています。 天皇杯を優勝するなど、いくつかのタイトルを獲得していることなどしっかりと結果も出しています。 日本の選手に対してもとても好意的に捉えている感じで、ぜひ日本代表監督になってくれたらなと個人的に思っています。

監督論

本の内容は、自伝になるので幼少期から現在のFIFAの役員になるまでの半生が綴られているのですが、サッカー監督としてどうすればよいのかの「監督論」が多く語られていました。 これはサッカーだけではなく全ての責任者にも通じる話に感じました。

最後に

本の中では今後監督業はやらなさそうな感じでしたが、日本代表監督ではなくてもよいので、何かしらのチームを率いる姿を見てみたいなと思いました。

【Unity】 mod2演算とは

ある数字を+1ずつ足していき、〇〇以上になった場合に0に戻す。 こういったロジックを実装するときにmod2を使うと簡単に書くことができます。

普通に計算する

「ある数字を+1ずつ足していき、〇〇以上になった場合に0に戻す。」をwhile文を使って実装した場合、このようななります。

while (index != 0)
{
    index = index + 1;
    if (index > 5)
    {
        index = 0;
     }
}

mod2を使う

先程の処理はmod2を使えば次のように置き換えることができます。

while (index != 0)
{
    index = (index + 1) % 5;
}

mod2とは

mod2とは剰余演算子と呼ばれています。 ある数字で割ったときに余りを返します。

Debug.Log(1 % 3); // 1
Debug.Log(2 % 3); // 2
Debug.Log(3 % 3); // 0
Debug.Log(4 % 3); // 1
Debug.Log(5 % 3); // 2

docs.microsoft.com

独習C# 第3版

独習C# 第3版

【C#】LinqのToArrayとToListについて

LinqでToArrayやToListを使うときの注意点なのです。 使い方によっては負荷が上がってしまうので用途により使い分けたほうがよいです。

パフォーマンス比較

次のコードを書いてUnityのProfilerで調べてみます。

 Profiler.BeginSample("None");
 var sample1 = Enumerable.Range(1, 10).Select(GetString);
 Profiler.EndSample();
        
 Profiler.BeginSample("ToArray");
 var sample2 = Enumerable.Range(1, 10).Select(GetString).ToArray();
 Profiler.EndSample();
        
 Profiler.BeginSample("ToList");
 var sample3 = Enumerable.Range(1, 10).Select(GetString).ToList();
 Profiler.EndSample();

画像が見にくいですが1番右がCC Allocです。

f:id:albatrus:20210403213719p:plain
Profilerの比較

見てわかるようにToArrayとToListを使った場合の負荷が上がっています。

用途で使い分ける

配列やListとして扱う必要がある場合にはToArrayやToListを使っていきましょう。 ただ、for文などで中身を取り出すだけで使うのであればIEnumerable<>のまま使ったほうがよいです。

foreach (var s in sample1)
{
    Debug.Log(s);
}

【Unity】switch式について

とあるプルリクエストを見ていたときに、今までみたことのない書き方があり調べてみるとことにしました。

switch式

調べたとこと「switch式」という演算子でした。

docs.microsoft.com

具体例

まず、2つのタイプを用意します。

public enum TestType
{
    None,
    Test,
}

public enum TestChangeType
{
    ChangeNone,
    ChangeTest,
}

これをこのような形で利用します。

var changeType = testType switch
{
      TestType.None => TestChangeType.ChangeNone,
      TestType.Test => TestChangeType.ChangeTest,
       _ => TestChangeType.ChangeNone
};

こうすれば、あるenum値を別のenum値へと置き換えることができます。

_ パターン

先程のコードの次の部分は、switch時にどのパターンにも当てはまらない時にどうするかの指定です。 switch文のdefaultのような感じです。

_ => TestChangeType.ChangeNone

最後に

switch式はc#8.0から使える機能でした。 新しい機能を追っていないと、こういった方法を選択することができなくなるので、もう少し勉強しないといけないなと感じました。 C# 8.0 の新機能 - C# ガイド | Microsoft Docs

【Unity】ZStringを使って文字を操作する

ある文字とある文字を組み合わせて文字列を作る際に今までは次のようなコードを書いていました。

var value = 10;
var maxValue = 100;
var text = string.Format("{0}/{1}", value, maxValue);
Debug.Log(text); // 10/100

上記コードは、Riderを使っているとこのように書けば良いととアドバイスをくれます。

var value = 10;
var maxValue = 100;
var text = $"{value}/{maxValue}";

こちらを使っても同じ文字列が作成できますので、どちらを使っても結果的にはどちらでも良さそうです。

違い

同じ結果ですが、この2つの実装方法は違います。 プロファイラーで確認すると次のようになります。

f:id:albatrus:20210321095822p:plain:w400
Profiler

どちらも同じ結果なのですが、Concatを使ったほうがパフォーマンスが良いみたいです。

複数の文字列を連結する時、連結演算子やConcatメソッドを使って一度に連結する方法が、String.FormatやStringBuilder.Appendメソッドを使った方法よりもパフォーマンスが良いということです。 文字列を連結する - .NET Tips (VB.NET,C#...)

これはプロファイラーを見ても確認ができます。 Concatを使ったほうがCG Allocが小さくなっています。

f:id:albatrus:20210321100611p:plain
string.Formatとstrng.ConcatのGCAlloc

ZString

ここからが本題なのですが、実はさらにパフォーマンスを上げる方法があります。 これが「ZString」です。

くわしい内容はこちらに記載されています。 tech.cygames.co.jp

var text = ZString.Format("{0}/{1}", value, maxValue);

同じようにプロファイラーを見てみるとCGAllocが減っていることがわかります。

f:id:albatrus:20210321101336p:plain
ZString.Format

Concat

ZStringにもConcatメソッドがあります。

var text = ZString.Concat("hoge" ,"hoge", "hoge");

こちらもパフォーマンスが良くなっています。

f:id:albatrus:20210321103613p:plain
Cocatの比較

最後に

ZStringに関しては、結合する文字が多ければ多いほどパフォーマンスに違いが生まれたので、特に理由がないのであれば使わない手はないかと思いました。 Stringに関してはゲーム制作ですと利用頻度も多いと思います。

【Unity】VideoPlayerで 「video unsupported by hardware」のエラーが出た

UnityのVideoPlayerを何気なく使ったところ、エディタ上では動画が再生されるが、実機にビルドすると再生されない問題が出たときの対処方法です。

Codecを変更する

おそらく動画ファイルの設定が問題なのですが、何も考えずに動画をProjectへ入れると、CodecがAutoになっているはずです。 私の動画はmp4というファイル形式でしたので、ここをH264へ変更すると実機でも再生することができました。(iOSとAndorid共に変更)

f:id:albatrus:20210320123525p:plain:w400
CodecをH264に変更する

AAC videos encoded using H.264 or H.265

公式にも記載のあるように、AAC(mp4)はCodecを変更しないと再生できないみたいです。もし、実機で動画が再生できない場合にはまず動画ファイルのCodecを疑ってみるのが良いかもしれません。

docs.unity3d.com