http://api.bitcoincharts.com/v1/csv/からいろんなCSVが取得できる。
いまのところbtc/jpyでまともなデータが取れるのは
coincheckJPY.csv.gz
gzip圧縮されてるので7zipなどで解凍します。
データのフォーマットは
1カラム目:時刻 (unixtime)
2カラム目:価格 (price)
3カラム目:取引量 (amount)
です。
Pythonで簡単にチャート表示もできるらしいです。
詳しくはネタ元へ
http://api.bitcoincharts.com/v1/csv/からいろんなCSVが取得できる。
いまのところbtc/jpyでまともなデータが取れるのは
coincheckJPY.csv.gz
gzip圧縮されてるので7zipなどで解凍します。
データのフォーマットは
1カラム目:時刻 (unixtime)
2カラム目:価格 (price)
3カラム目:取引量 (amount)
です。
Pythonで簡単にチャート表示もできるらしいです。
詳しくはネタ元へ
セマフォ ミューテックスなど。
Interlocked
lock
SemaphoreSlim
Semaphore
Mutex
速度はこんな感じらしいです。
Interlocked > lock > SemaphoreSlim > Semaphore > Mutex
使い方の詳細はネタ元を
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 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 関数のように問題の場所を特定するための手間が不要なのがいいところ。
ただ処理速度は恐ろしく遅いため、常時使うというよりはメモリリークを調べるときだけ設定変えて追う、という使い方になるそうです。
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が入ります。
こんなマクロでボタンの位置がとれるんだけど、
なぜかボタンをコピーするとコピー元の座標が返ってくる現象に遭遇する時がある。
MsgBox ActiveSheet.Shapes(Application.Caller).TopLeftCell.Address MsgBox ActiveSheet.Shapes(Application.Caller).TopLeftCell.Row MsgBox ActiveSheet.Shapes(Application.Caller).TopLeftCell.Column
そんなときはボタンを新規作成し、再度マクロを設定し直すとOK。
新規作成したボタンをコピーすればちゃんと思い通りの座標が返ってくる。
たぶんExcelのバグ。
終端と比較して判断
json::value json; ... auto ite = json.as_object().find(U("Hoge")); if ( ite == json.as_object().cend() ) { // 見つからなかった }else{ // 見つかった! }
オフィシャルのマニュアルに
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を返すようになりました。
とのこと。
try-catchで例外捕まえて理由を調べるといいよ。
try { ... } catch (const std::exception& e) { std::wcout << e.what() << endl; }
たぶん返ってきてるjsonになにか不備があると思うよ。
こんな感じ。
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(); } });