dynamicなSystem.JsonもといJsonValueを使う方法

最終追記

JsonValueは開発終わってるので、似たような使い方ができるDynamicJsonを使いましょう。

シリアライズ

var jsonString = DynamicJson.Serialize(p);
WriteLine(jsonString); // {"Name":"Kato Jun","Age":31}

デシリアライズ

var obj = (Person)DynamicJson.Parse(jsonString);
WriteLine(obj.Name); // Kato Jun
WriteLine(obj.Age);  // 31

いちいち型つくらなくていいから便利。

元記事

NuGetでいれようとしてもGUIのほうからは見つからないので、コンソールから以下のコマンドでインストール

PM> Install-Package JsonValue -Version 0.6.0

こんなデータ

{
 "id":20,
 "name":"味噌",
 "price":250
}

こうコード書くと

using System;
using System.Json;

string data = @"{
     ""id"":20,
     ""name"":""味噌"",
     ""price"":250
 }";

dynamic json = JsonObject.Parse(data).AsDynamic();

Console.WriteLine(json.price);

こう出ます。

250

メモリリークを追う方法 Visual Leak Detectorを使うパターン

以下よりダウンロードして、インストールする。
Visual Leak Detector for Visual C++ 2008-2015

VC++ プロジェクトのプロパティから以下を設定する。
[C/C++] -[全般] - [追加のインクルードディレクトリ]に以下を追加。
  C:\Program Files (x86)\Visual Leak Detector\include
[リンカー] - [全般] - [追加のライブラリディレクトリ]に以下を追加。
  ビルド構成が Win32 の場合
    C:\Program Files (x86)\Visual Leak Detector\lib\Win32
  ビルド構成が x64 の場合
    C:\Program Files (x86)\Visual Leak Detector\lib\Win64
[リンカー] - [入力] - [追加の依存ファイル]に以下を追加。
  vld.lib

最後に、プログラムのいずれかの cpp ファイル、たとえば main.cpp などに以下を記載する。
#include <vld.h>

stdafx.hを使っている場合はstdafx.hを開いて
#include <afxwin.h>の上に記載する。
 
あとはビルドして実行するだけ。
終了時、出力ウィンドウにメモリリークの状況が出力される。


_CrtDumpMemoryLeaks 関数のように問題の場所を特定するための手間が不要なのがいいところ。

ただ処理速度は恐ろしく遅いため、常時使うというよりはメモリリークを調べるときだけ設定変えて追う、という使い方になるそうです。

C++で簡単非同期プログラミング(std::thread,std::async) 

result.get()で処理を待って、値を返してくれる

#include <future>

...

auto result = std::async(std::launch::async, [] { return long_hogehoge(); });

// 非同期中の処理なにか

std::cout << result.get() << std::endl;

処理中かどうか判定をいれてその間アニメーションさせるとかさせるなら

auto status = result->wait_for(std::chrono::milliseconds(0));
bool isGet = status == std::future_status::ready;

上記のように書くことで isGet 変数にスレッドが終わっていれば true, 終わっていなければ falseが入ります。

excelでボタンをコピーしたとき、何故かActiveSheet.Shapes(Application.Caller).TopLeftCell.Addressがコピー元のアドレスが返ってくるとき対策

こんなマクロでボタンの位置がとれるんだけど、
なぜかボタンをコピーするとコピー元の座標が返ってくる現象に遭遇する時がある。

MsgBox ActiveSheet.Shapes(Application.Caller).TopLeftCell.Address

MsgBox ActiveSheet.Shapes(Application.Caller).TopLeftCell.Row
MsgBox ActiveSheet.Shapes(Application.Caller).TopLeftCell.Column

そんなときはボタンを新規作成し、再度マクロを設定し直すとOK。
新規作成したボタンをコピーすればちゃんと思い通りの座標が返ってくる。
たぶんExcelのバグ。

C++ REST SDK json::valueのイテレータ

オフィシャルのマニュアルに
obj.cbegin() とかってかいてあるけど、これはver1.0時代のもの。

執筆時点ではobj.as_object().cbegin()
のようにas_object()をかます必要ある。

json::value obj;
obj[L"key1"] = json::value::boolean(false);
obj[L"key2"] = json::value::number(44);
obj[L"key3"] = json::value::number(43.6);
obj[L"key4"] = json::value::string(U("str"));

// Note the "as_object()" method calls
for(auto iter = obj.as_object().cbegin(); iter != obj.as_object().cend(); ++iter)
{
    // This change lets you get the string straight up from "first"
    const utility::string_t &str = iter->first;
    const json::value &v = iter->second;
    ...
}

理由は

json配列とオブジェクトに対する反復の実行方法を変更しました。もうstd :: pairのイテレータは返されません。代わりに、json :: arrayクラスとjson :: objectクラスの配列とオブジェクトのための別々のイテレータがあります。これにより、パフォーマンスを改善し、それに応じて調整を続けることができます。配列イテレータはjson :: valuesを返し、オブジェクトイテレータはstd :: pairを返すようになりました。

とのこと。

C++ REST SDK websocket_clientのサーバーからのメッセージのコールバックを設定できる版websocket_callback_client がある

こんな感じ。

client.set_message_handler([](websocket_incoming_message msg)
{ //サーバからのメッセージを処理する... 

	try{
		auto is = msg.body();
		streams::container_buffer<std::vector<uint8_t>> ret_data;
		is.read_to_end(ret_data).wait();

		const std::vector<uint8_t> &v = ret_data.collection();
		std::string stdString(v.begin(), v.end());
		std::cout << stdString << std::endl;
	}
	catch (const std::exception& e)
	{
		wostringstream ss;
		ss << e.what() << endl;
		wcout << ss.str();

		//getchar();
	}
});