銀の光と碧い空

クラウドなインフラとC#なアプリ開発の狭間にいるエンジニアの日々

Q# Coding ContestでのDriverクラスの書き方

昨日紹介したQ# Coding Testですが、書いたクラスをテストするのに最初ちょっと戸惑ったのでメモしておきます。

codeforces.com

実際の問題は登録した後にみられて、今は3問ほど解説も見ることができます。が、テストするためのコードが書けないとそのあとが大変です。 問題の形式はいくつかるのですが、このコメントにあるとおり、引数で渡されたQubitを操作して指定した状態にするという問題があります。

Announcement: Microsoft Q# Coding Contest — Summer 2018 - Codeforces

なんとなく、C# のDriverクラス側で所定の状態のQubitをQ#のクラス(メソッド)に渡して実行して、その結果を見ればいいように思えますが、残念ながら量子コンピューターの性質上、Qubitの初期化などはC#のDriverからはできません。コメントにあるとおり、提出するSolveメソッドのほかにQ#側にDriverとなるメソッドを用意してそこで実行する必要があります。提出用ファイルにこのDriverメソッドを含めたくなかったので、次のようなQ#ファイルを作って、Testメソッドを作成してみました。Solveメソッドが提出対象のメソッドです。

namespace Solution {
    open Microsoft.Quantum.Primitive;
    open Microsoft.Quantum.Canon;
    open Microsoft.Quantum.Extensions.Diagnostics;

    operation Test() : () {
        body {
            using (register = Qubit[1]) {
                let q = register[0];
                DumpMachine("dump-initial.txt");

                Solve(q,-1);

                DumpMachine("dump.txt");
                Reset(q);
            }
        }
    }
}

Qubitの初期化はusingキーワードでQubitを生成します。これにより|0>で初期化されます。

docs.microsoft.com

またQubitの状態を測定すると、それはそれで状態に影響してしまうので、デバッグのために DumpMachineメソッドを使います。これによりQubitの状態をファイルに出力します。

docs.microsoft.com

こんな感じで出力されます。

Ids: [0;]
Wavefunction:
0: 1  0
1: 0  0

ここまでQ#側でやるとC#のDriverはこのような簡単な記述になります。

using Microsoft.Quantum.Simulation.Simulators;

namespace Solution
{
    class Driver
    {
        static void Main(string[] args)
        {
            using (var sim = new QuantumSimulator())
            {
                var received = Test.Run(sim).Result;
            }
        }
    }
}

一応、全部解けたので、Warmup Contestの期間が終わったら問題についてもちょっとまとめてみたいと思います。 f:id:tanaka733:20180701185341p:plain

Q# Programming Contestが開催されるようです

CodeforcesというプログラミングコンテストのサイトでQ# Programming Contestが開催されるようです。

codeforces.com

本番は7/6-9のようですが、6/29からwarmupラウンドということでいくつかの問題が出題されています。簡単な問題3つについては解説するということです。

Q#はVisual Studioだけでなく、LinuxやMaxOSでも.NET CoreとVisual Studio Codeで始めることができます。

Setting up the Q# development environment | Microsoft Docs

上位50人にはMicrosoft Quantum Tシャツがもらえるとあるのでぜひ参加してみてはいかがでしょうか。自分も参加する予定です。

Microsoft Build 2018 のSignalR関連のセッションの整理

Q#に引き続き、SignalR関連セッションの情報まとめです。

tech.tanaka733.net

(ブレークアウトセッション) Meet the new stack for real-time web communication: ASP.NET Core SignalR

ASP.NET Core SignalR overview

  • "Hubs" を使ったRPC style
  • ServerからClientはglobal, グループ、個別を選べる
  • HubのメソッドからのStreamの返り値はChannelクラスとなる
  • クライアントライブラリはTS/JSと.NET
  • JSONとMessagePackがドキュメント化されている実装プロトコル
  • WebScockets, Server Sent Events, Long Pollingから選択
  • ASP.NET Coreのrouting, DIとの統合
  • Redisもしくは新しいAzureのサービスを利用してスケールできる

既存のSignalR からの変更点

  • jQueryの依存性なし
  • メッセージの再送つきの自動再接続なし
  • Hubの状態ももたなくなった
  • 複数Hubのendpointもなし
  • 単一モデルでのスケールアウトもなし
  • 複数サーバー間のping-pongがなくなるため、sticky sessionが必要となる

SignalR機能概要

  • routing
  • Hubパラメーターbinding
  • JSON および MessagePackプロトコル
  • Controllerからのpush通知
  • グループとbackgroundサービスからのpush通知
  • 型付のHub
  • 認可
  • HubメソッドからのStream
  • .NET Client

Hubの下回りの構造

従来のSingalRは Hub-HubDispatcher-PersistentConnectionMiddleware-OWIN-System.Web HttpHandler

ASP.NET Core SignalR Hub-HubConnectionHundler-HubConnectionDispatcher-RoutingMiddleware-ASP.NET Core HTTP Pipeline

HTTPではなくTCP/IPを利用した転送も計画中

over HTTPの場合 Hub-HubConnectionHandler-HttpConnectionDispatcher-RoutingMiddleware-ASP.NET Core HTTP pipeline-Kestrel-Sockets or Libuv

over TCP/IP Hub-HubConnectionHandler-Kestrel-Sockets or Libuv

Project Bedrockの紹介

  • .NETのための新しい高パフォーマンスネットワーク抽象化
  • transport層からapplication層を取り除く
  • System.Net.Sockets と libuv を利用
  • アプリケーション層の書き換えなしに導入可能
  • ASP.NET Coreを対象
  • 新しいSystem.IO.Pipelines APIを利用
  • ClientとServer両方

ベンチマークを公開中 https://aka.ms/aspnet/benchmarks

Demoサンプル

KestrelHttpServer/BenchmarkApplication.cs at dev · aspnet/KestrelHttpServer · GitHub

Azure SignalR Service

  • SignalR clientの接続とスケールアウトのためのPaaS
  • ASP.NET Core SignalR と Bedrockを利用
  • サービスへの接続のオフロードやアプリケーションから/へのトラフィックの転送
  • ドキュメント化されているプロトコルが利用可能
  • web側のtrafficと独立してSignalRのみの簡単のスケールが可能
  • 2行のコードの変更で既存アプリから変更可能
  • public preview!

Azure SignalR Serviceの利用

これだったのか Hub-HubConnectionHandler-HubConnectionDispatcher-RoutingMiddleware-ASP.NET Core HTTP Pipeline

こうなる Hub-HubConnectionHandler-ServiceHubDispatcher-WebSocket Clients

今後の実装計画

  • クライアント再接続
  • より柔軟な接続。client intiated pingsなど
  • クライアント側の型付Hub
  • Java,C++,iOSなどのクライアント
  • TCP/IPを含めたさらなるtransports。サンプルではなく実際に利用できるものとして。

(シアターセッション) Build and manage real-time applications easily with the all new Azure SignalR Service

こちらは動画が公開されていないので、見てきたときのメモから。

Azure SignalR Service, a fully-managed service to add real-time functionality https://azure.microsoft.com/en-us/blog/azure-signalr-service-a-fully-managed-service-to-add-real-time-functionality/

数十人の参加者に開発したことのあるSignalRの規模を質問。ぱっと見た限り、100接続以上が10人くらい、1000接続が数人、10000接続以上はなし。

  • 上のセッションで公開したデモは2'40ほどの間に800人から接続され、100万メッセージ以上、秒間だいたい35kを処理。
  • Free Tier/Basic Tier
  • 使えるリージョンはいまのところ US E/US W/SE Asia/EU W
  • サービスを作成すると接続文字列が表示されるので、それをアプリ側で設定。
  • Azure Functionsを使ってServerless構成も可能