xin9le.net

Microsoft の製品/技術が大好きな Microsoft MVP な管理人の技術ブログです。

ConcurrentDictionary.GetOrAdd のファクトリーメソッドは排他制御されていない

というタイトルの通りなのですが、案外忘れがちです。例えば以下のような期待をしてはいけません。

//--- こんな排他制御機能付きの辞書があるとする
var dic= new ConcurrentDictionary<string, int>();

//--- 値がなければ追加したいけれど...
var value = dic.GetOrAdd(key, x =>
{
    //--- このスコープの処理は排他制御されていないんだZE!!
    return newValue;
});

内部実装を確認

この挙動は Reference Source で .NET Framework の内部実装を見てみれば分かります。ConcurrentDictionary の実装から GetOrAdd の部分をピックアップしたのが以下です。

public TValue GetOrAdd(TKey key, Func<TKey, TValue> valueFactory)
{
    if (key == null) throw new ArgumentNullException("key");
    if (valueFactory == null) throw new ArgumentNullException("valueFactory");

    TValue resultingValue;
    if (TryGetValue(key, out resultingValue))
    {
        return resultingValue;
    }

    //--- valueFactory の実行が何もロックされていない
    TryAddInternal(key, valueFactory(key), false, true, out resultingValue);
    return resultingValue;
}

上記の通り valueFactory(key) で引数で与えたファクトリーメソッドを実行しているのですが、何も排他制御されていません。排他制御がかかっていると思って気を緩めてはいけないので気を付けましょう!

Grani VR Office Tour - 最先端を追求するグラニの新たな取り組み

今回は少し趣向を変えて (?)、僕が所属する Grani, Inc. の新たな取り組みについて紹介します!先日の CLR/H in Tokyo 第 11 回でも「one more thing...」として軽く触れたのですが、来月 11/16 (水) に開催される Japan VR Summit 2グラニも VR コンテンツのブースを出展します。

Grani VR Office Tour

内容は弊社グラニのオフィスツアー。「VR なら会社まで来なくても会社見学できるよね」という発想ですね!専用のサイトもあります。

最先端のスキャン技術を用いたオフィスツアー

やるからには当然リアリティを追求したい。ということで、最先端のスキャン技術で超高精細な 3D モデルを構築しています。どれくらい精細かというと、社員ですら「ここ、もう本当に会社じゃん...」と錯覚するレベルです。

以下は社内をスキャンしたポイントクラウド (点群) データを可視化したもののひとつ。非常に高い精度で座標が取得できていて、形状がハッキリ出ているのが分かるのではないかと思います。

f:id:xin9le:20161114105250j:plain

先の VR Office Tour のロゴも実は写真じゃないんですよ!しかも、現在はそのロゴで使われている 3D モデルよりもさらにテクスチャなどが進化しています。

FPS の維持

VR の最大の敵は VR 酔いです。「コレが起きるコンテンツには価値がない」と言われても過言ではないくらい、シッカリと対策しなければなりません。

特に気を付けなければならないのは FPS (= 1 秒間あたりの画面描画回数) で、PC VR では *1 90 FPS 程度の確保がひとつのラインと言われています。そして、この値がある程度出る (= VR コンテンツをある程度快適に楽しめる) 高性能なマシン/グラフィックカードを「VR Ready」と呼んだりします。

現在のグラフィックカードで最上位モデルと言われる GeForce GTX 1080 でこの数字を出せればいいと言えばそうなのかもしれませんが、グラニでは FPS に対してよりシビアな肌感覚を養うため、敢えて VR Ready ではない GTX 960 をメインで使って開発しています。今回制作している VR Office は、そんな環境下でも一定の FPS が出せる程度にはパフォーマンスに気を配っています。

今後は?

今回の VR Office 制作にはかなり多くの要素を詰め込みました。当然試行錯誤なので作ったけれど捨てたものもあります。この間、非常に多くの知見を得てきたので、今後少しずつでも公開できていければと思っています。

*1:現在は 120 FPS が目安とも言われています

1Password for Windows Store をインストールする方法

数年愛用しているパスワード管理ツールの 1Password。iOS や Mac 向けのアプリは非常に素晴らしく、なくてはならないアプリのひとつです。パスワードデータの同期機能があるので、Windows 環境でも (なんなら Windows 10 Mobile でも) 使いたいものです。

そしていつ頃だったかは分かりませんが UWP アプリも提供され始めました。なのですが、いつの間にか Windows Store で「1Password」と検索してもヒットしなくなっていました。このままではインストールできない!

f:id:xin9le:20161107001125p:plain

直リンクでストアにアクセス

ということで、直リンクで Windows Store の 1Password にアクセスしましょう。以下のサイトを開けば Windows Store を開くための Popup が出てくるので、あとはダウンロードするだけ!

f:id:xin9le:20161107001621p:plain

UWP 版は機能制限が非常に多く、編集用途には全く使えませんのでご注意ください。

Unity Shortcut Cheat Sheet

Unity にはなんだかんだで便利系のマウス/キーボードショートカットがいくつも隠れています。よく忘れてしまうので備忘録としてメモ。

他にも面白いものが見つかったら追記するかもです。

移動 / 回転

ショートカット 説明
Shift + F ゲーム実行時、Scene ビューで選択中の GameObject を注視し続ける
Ctrl + Alt + F Hierarchy で選択した GameObject を現在の Scene の視点の中心に移動

生成

ショートカット 説明
Ctrl + Shift + F 空の GameObject を最上位階層に生成
Shift + Alt + F Hierarychy で選択している GameObject の子階層に空の GameObject を生成

Hierarchy 検索

方法 説明
t:<検索キーワード> 型でフィルタリング

その他

ショートカット 説明
Alt + 左クリック Hierarchy で選択している GameObject の階層をすべて展開/折り畳み
Shift + Alt + A Hierarchy で選択している GameObject の SetActive(bool) 切り替え
コンポーネントの Drag & Drop 別の GameObject にコンポーネントを移動

C# 7 をライブコーディングで解説してきました vol.3

10/22 (土)、日本マイクロソフト品川本社でCLR/H in Tokyo 第 11 回が開催され、そこに参加/登壇してきました。ハッシュタグは #clrhtky11

ハロウィンデーということで謎のハロウィン仮装という辱めを受けながら頑張りました!...「無難じゃね?」という声にめげない強い意志が必要と感じた次第です。ちなみに、勉強会に参加したハズだったのに ELLE (っぽい何か) の表紙モデルになったりと、催眠術だとか超スピードだとかそんなチャチなもんじゃあ断じてねぇような何かが起こったりしました。

イベントが終わってみれば、ハイライトは JK の父兄参観の写真で決まりだった思うので、僕の仮装なんてハナからあってもなくても良かったww

セッション資料

セッション資料は前回/前々回同様、ライブコーディングによるデモのおさらいという形で簡単にまとめてあります。PDF 形式で Docs.com に置いてあるので、ご自由にダウンロードなどしてください。今回はハロウィンデーということで、タイトルスライドのデザインもそれに合わせたものにしてみました。という謎の配慮。

おさらい形式のスライドなので、より詳しく知りたい方は以下の記事やサンプルコードを参照ください。

ちょっとしたトラブル

当日の朝に Roslyn の最新のコミットを pull してビルドしたものでデモしました。どーせやるなら正真正銘世界最新の C# コンパイラでやらなきゃですよね!とは言えそんな危ない橋を渡ろうとするので、セッション開始 20 分前に Visual Studio が立ち上がらなくなったりして冷や汗をかいたり...。

さらにセッション中に不慮の事故でプロジェクターが壊れて数分間中断して、なんだかんだ結構焦って「何もしてないのに壊れた」などとエンジニアが言ってはいけない言葉 (謎) を平気で言ってしまったり...w

本番には魔物が住んでいるというのを痛感した次第ですが、焦らずトラブル対応できるようになりたいですね!