カサブランカに戻ってきてください



数週間前、マイクロソフトは新しい開発-カサブランカプロジェクトを発表しました。 それが何であるかを理解するためには、過去のGoing Native 2012会議に少し戻って、新しいC ++ 11標準について議論することに加えて、多くの賢い考えが述べられました。 それらの1つはハーブサッターの講義でした。 彼は、最新のC ++の最大の問題は、すべてのガベージコレクターやラムダ式の構文ではなく、標準ライブラリの貧困であると指摘しました。 初心者のJavaまたはC#プログラマーが先輩の同僚にHTTPリクエストの送信/受信、XML \ JSONの解析、ZIPファイルのアーカイブ/解凍などの方法を尋ねたとき。 -彼は、「標準ライブラリのこのクラスを使用する」という具体的で明確な、常に有効な答えを受け取ります。 初心者のC ++プログラマーが同じ質問をするとき、「まあ、これには標準のツールはありません。自分で書くか、いくつかのライブラリが必要ですが、ここではライセンスを選択、テスト、読む必要があります...」 その結果、パフォーマンスのレベルが異なるライブラリの野生動物園があります。多くの場合、ひどいクロスプラットフォーム、自作の自転車の束、プロジェクト間の切り替えが困難です。「ブーストを使用していたが、ここではすべてがQtにある」などです。 ハーブサッターは、主な焦点は標準ライブラリの拡張であることを示唆しました。



したがって、Microsoft Casablancaは、この拡張機能がどのように見えるか、どのように含めることができ、どのようにすべてが一緒に機能するかの最初のスケッチです。 カサブランカを標準C ++ライブラリの拡張として標準化することについては誰も話していませんが、今では別のライブラリ(アルファバージョンのようなもの)としてダウンロードして学習することができます。 さらに、Microsoftは、Azureプラットフォームの生産的なサービスを作成する手段として、カサブランカを宣伝しています。





カサブランカには何が含まれていますか? カサブランカの「Hello world」をすぐに表示します。これは、「Hello World!」というテキストを返すWebサーバーになります。



#include "stdafx.h" #include <iostream> #include "astreambuf.h" using namespace http::listener; int main(int argc, char* argv[]) { http_listener::create("http://localhost:4711/trivial", [](http_request message) { message.reply(http::status_codes::OK, "Hello World!"); }) /* Prevent Listen() from returning until user hits 'Enter' */ .listen([]() { fgetc(stdin); }).wait(); return 0; }
      
      







いいですね



そして今、ライブラリについてもう少し完全に。 次のものが含まれます。



PPLタスク



これは非同期操作を操作するためのライブラリであり、実際には次の(まだリリースされていない)バージョンのVisual Studioに含まれていますが、Casablancaの開発者はそれを個別に分離し、Visual Studio 2010で使用できるようにすることを決定しました。



 http::http_client client("http://localhost:80"); pplx::task<http::http_response> resp = client.request(methods::GET, "/foo.html");
      
      







ここでは、localhost:80にアクセスするためのhttpクライアントと、「GETメソッドでfoo.htmlページを渡す」タスクを作成しました。 タスクは、作成の瞬間から非同期的に実行され始めます。 いつでも、タスクが既に完了しているかどうかをタスクに追加できます。



 bool done = resp.is_done();
      
      







実行結果を要求します。



 http_response response = resp.get();
      
      





2番目のオプションは、タスクをラムダ関数にすぐに転送することです。ラムダ関数は、完了すると実行されます。



 resp.then( [=](http_response response) { ... });
      
      









PPLタスクの詳細については、 こちらをご覧ください。



HTTPクライアントとサーバー



上記の2つの例で両方を簡単に説明します。 住所、ヘッダー、その他のアメニティ用の特別なクラスが存在しない限り、これに追加できます。 一般に、HTTPの操作はC#やJavaほど複雑ではなく、いずれにしても、現在Windowsの一部であるWinInetライブラリを使用するよりもずっと快適です。



Azureストレージサービスにアクセスする



主な目標の1つは、Azure用のアプリケーションの作成を容易にすることであると既に述べました。 Azure Storage Servicesのストレージプロセスは次のようになります



 storage_credentials creds = local_storage::get_credentials(); cloud_blob_client local(local_storage::get_blob_uri(), local_storage::get_credentials()); cloud_blob_client real("http://johndoe.blob.core.windows.net", creds); cloud_blob_container container = client.create_container(L"sampledata").get(); auto blob = container.create_block_blob(L"sample1"); blob.put(L"A first sample blob", L"text/plain");
      
      





非常に簡潔で、私には思えます。



ジョンソン



解析


 std::istream stream = ...; json::value value1(stream); double var = value1["var"].as_double()
      
      







作成


 json::value::element_vector e; e.push_back(json::value(false)); e.push_back(json::value::string("hehe")); json::value arr = json::value::array(e); std::ostream stream = ...; stream << arr;
      
      







俳優



このアイデアはアーランから取ったものです。 外部からの分離の追加レイヤーとしてのメッセージの送信と処理。 いくつかのことを簡単に調べ、マルチスレッドプログラミングのバグを回避し、一般的に良いパターンを作成します。 次の例では、メッセージを受信して​​標準出力に書き込むことができるアクターが作成されます。



 class Hello : public actors::actor { public: Hello() {} actors::actor *factory() { new Hello(); } protected: void initialize(actors::ActorInitEvent e) { } virtual void execute() { std::string name; accept(name).then([=](std::string &name) { std::cout << "Hello, " << name << "!" << std::endl; Done(); }); } }; ... PID h = actor::spawn<Hello>(); h.send<std::string>("Niklas");
      
      







ライブラリはまだ開発中であり、まだ非常に粗雑です。 個人的には、それがどれだけ根付くかを判断するのは難しいです。 一見、すべてが非常に文化的で論理的です。 アーキテクチャはクロスプラットフォームのアイデアで設計されており、APIはオープンです。コードを開き、多くの便利なものを追加したいという要望があります。 一方、「ちょうど良いライブラリ」から「標準C ++ライブラリの拡張」まで、地平線までのギャップがあります。 いずれにせよ、カサブランカへの関心のためにあなたが見ることができます。



関連資料






All Articles