SlideShare une entreprise Scribd logo
1  sur  29
Télécharger pour lire hors ligne
C++14 Concurrency TS

Future APIの改善

株式会社ロングゲート
高橋 晶(Akira Takahashi)
faithandbrave@longgate.co.jp
2013/12/14(土) C++14規格レビュー勉強会 #2
はじめに

•

この発表は、C++14後のConcurrency TSに予定されている、
Future関連API改善のレビュー資料です。

•

提案文書:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3784.pdf
概要
•

std::futureクラスとstd::shared_futureクラスに、
以下のメンバ関数を追加する。

•
•
•
•

then()
unwrap()
is_ready()

それに加え、以下の非メンバ関数を追加する。

•
•
•
•

when_any()
when_any_swapped()
when_all()
make_ready_future()
提案元
•

提案者はMicrosoftの

•
•
•
•
•

Niklas Gustafsson
Artur Laksberg,
Herb Sutter,
Sana Mithani

Visual C++のPPL(Parallel Pattern Library)、.NET FrameworkのTask
Parallel Libraryから得られた経験を取り入れたものである。
Futureのおさらい
•
•
•
•

Futureとは、並行プログラミングのデザインパターンのひとつ。
スレッド間のデータ(結果値)渡しとして使用する。
C++11から標準ライブラリに<future>ヘッダが導入された。
基本的な使い方として、promiseと対にして使用する。

…計算をする…
…待機…

promiseに結果を書き込む

futureが結果を読み込む
メインスレッド

バックグラウンドスレッド
Futureの基本的な使い方
void calc(std::promise<int> p) {
int sum = 0;
for (int i = 1; i <= 10; ++i) {
sum += i;
}
p.set_value(sum);
}
int main() {
std::promise<int> p;
std::future<int> f = p.get_future();
std::thread t(calc, std::move(p));
t.join();

}

int result = f.get();
std::cout << result << std::endl; // 55
Futureの基本的な使い方
void calc(std::promise<int> p) {
int sum = 0;
for (int i = 1; i <= 10; ++i) {
sum += i;
}
p.set_value(sum);
}
int main() {
1. promiseとfutureの
std::promise<int> p;
std::future<int> f = p.get_future();
共有状態を作る
std::thread t(calc, std::move(p));
t.join();

}

int result = f.get();
std::cout << result << std::endl; // 55
Futureの基本的な使い方
void calc(std::promise<int> p) {
int sum = 0;
for (int i = 1; i <= 10; ++i) {
sum += i;
}
p.set_value(sum);
}
int main() {
std::promise<int> p;
std::future<int> f = p.get_future();
std::thread t(calc, std::move(p));
t.join();

}

2. バックグラウンドスレッドに
promiseの所有権を移譲する

int result = f.get();
std::cout << result << std::endl; // 55
Futureの基本的な使い方
void calc(std::promise<int> p) {
int sum = 0;
for (int i = 1; i <= 10; ++i) {
sum += i;
}
3. バックグラウンドスレッドの
p.set_value(sum);
処理が終わったら、結果を
}
promiseに書き込む
int main() {
std::promise<int> p;
std::future<int> f = p.get_future();
std::thread t(calc, std::move(p));
t.join();

}

int result = f.get();
std::cout << result << std::endl; // 55
Futureの基本的な使い方
void calc(std::promise<int> p) {
int sum = 0;
for (int i = 1; i <= 10; ++i) {
sum += i;
}
p.set_value(sum);
}
int main() {
std::promise<int> p;
std::future<int> f = p.get_future();

}

std::thread t(calc, std::move(p));
t.join();
4. promiseに書き込まれるのを待って、
結果をfutureが読み込む。
int result = f.get();
std::cout << result << std::endl; // 55
async関数
•

std::async()関数は、futureを使用したこのパターンをシンプルに使えるよう
にしたラッパー関数。

•

この関数に登録された処理が終わるのを待ってpromiseに書き込みを行い(*)、
スレッドの起動まで行ってくれる。
int calc() {
…
return sum;
}
int main() {
std::future<int> f = std::async(calc);

}

int result = f.get();
std::cout << result << std::endl;

* 実際は、promiseをラップしたpackaged_taskというクラスを使用する。
おさらい終了!

では、C++14後のConcurrency TSで
予定されている機能の紹介を行っていきます。
thenメンバ関数
•

then()メンバ関数は、非同期処理の平坦化(flatten)を行う関数。
コールバック地獄を解消し、連続的な非同期処理を、ネストではなく
シーケンシャルに記述できるようにする。
int main() {
future<int> f1 = async([] { return 123; });
future<std::string> f2 = f1.then([](future<int> f) {
return to_string(f.get()) + "hoge";
});
}

•

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

then()に登録した関数は、futureオブジェクトの値を取り出す準備が
できたら呼ばれる。(then内のf.get()はブロッキングせずに呼べる)

•

launchポリシーは引き継がれる。
thenメンバ関数
•

実際的なシーケンス非同期処理のサンプル

int main() {
future<std::string> result =
async([] { return 123; })
.then([](future<int> f) {
return to_string(f.get()) + "hoge";
})
.then([](future<string> f) {
return f.get() + "fuga";
});
}

std::cout << result.get() << std::endl; // 123hogefuga
thenメンバ関数
•

最終的な結果もthen()で処理する例。

•

std::futureのデストラクタはwait()するので、最後のwait()はなくてもいい。

•

boost::future(1.55.0 V4)のデストラクタはwait()しない。
int main() {
async(launch::async, [] { return 123; })
.then([](future<int> f) {
return to_string(f.get()) + "hoge";
})
.then([](future<string> f) {
return f.get() + "fuga";
})
.then([](future<string> f) { // 何も返さないとfuture<void>
std::cout << f.get() << std::endl;
}).wait();
}
thenはなぜfutureを受け取るのか
•

futureは値だけでなく、例外(別スレッドで発生したエラー)も
受け取れるから。
int main() {
future<std::string> result =
async([]() -> int {
throw std::runtime_error("error"); // エラー発生
})
.then([](future<int> f) -> std::string {
try {
f.get(); // ここで例外が投げ直される
}
catch (std::runtime_error& e) {
return "error";
}
return "success";
});
std::cout << result.get() << std::endl; // error
}
thenメンバ関数
•

シグニチャは以下のようになる。
template<typename F>
auto then(F&& func) -> future<decltype(func(*this))>;
template<typename F>
auto then(executor& ex, F&& func) -> future<decltype(func(*this))>;
template<typename F>
auto then(launch policy, F&& func) -> future<decltype(func(*this))>;

•

executorは別提案(N3785)のスケジューラ。スレッドプールも含まれる。

•

launchポリシーの個別指定も可能。
unwrapメンバ関数
•

unwrap()メンバ関数は、ネストしたfutureの内側を取り出す。

•

get()と違い、外側のfutureが準備完了するまで待たない。
外側のfutureを除去し、内側を指すプロキシオブジェクトを返す。
int main() {
future<future<int>> outer = async([] {
future<int> inner = async([] {
return 123;
});
return inner;
});

}

•

future<int> inner = outer.unwrap();
std::cout << inner.get() << std::endl; // 123

コールバック関数の中で別の非同期処理を登録する、というようなコードを
futureにすると、こういう状況になる。
暗黙のunwrap
•

then()メンバ関数は、一段階だけ暗黙にunwrapする。
int main() {
future<future<int>> outer = async([] {
future<int> inner = async([] {
return 123;
});
return inner;
});

}

outer.then([](future<int> inner) {
std::cout << inner.get() << std::endl;
}).wait();
is_readyメンバ関数
•

is_ready()メンバ関数は、値を取り出す準備ができているかを調べる。
struct GameLoop {
future<int> f_;
void start() {
f_ = std::async([]() -> int { return …; });
}

};

•

// 1/60秒ごとに呼び出される
void update() {
if (f_.is_ready()) { // 準備ができたら取り出す
int result = f_.get();
}
}

これによって、タスクが完了したかをたびたび問い合わせる、というポーリング
の設計が許可される。これがない頃は、f.wait_for(seconds(0))して
futureの状態を問い合わせていた。
※この関数は、C++11にfutureが提案された初期にはあったが、
機能が多すぎるという理由で提案から削除されていた。
when系非メンバ関数
•

when_any()/when_any_swapped()/when_all()非メンバ関数は、複数のfutureを受け
取り、どれか一つ、もしくは全てが完了するまで待機するfutureを返す。

•

これはfutureの合成操作であり、futureのOR(any)とAND(all)をサポートする。
元となったPPLでは||、&&演算子もサポートしていたが、この提案には含まれない。

•

これらの関数は、futureのコンテナ、もしくはタプルどちらかを使用できる。
たとえば、when_any()のシグニチャは以下のようになっている:
template <class InputIterator>
future<vector<(shared_)future<R>>>
when_any(InputIterator first, InputIterator last);
template <typename... T>
future<tuple<T...>>
when_any(T&&... futures);
when_any非メンバ関数
•

when_any()非メンバ関数は、複数のfutureを受け取り、どれか一つが完了する
まで待機するfutureを作って返す。

•

非同期操作のキューとして使える。

future<int> futures[] = {async([]() { return intResult(125); }),
async([]() { return intResult(456); })};
future<vector<future<int>>> any_f = when_any(begin(futures), end(futures));
future<int> result = any_f.then([](future<vector<future<int>> f) {
// 準備ができた最初のひとつだけを使用する
for (future<int> i : f.get()) {
if (i.is_ready())
return i.get();
}
});
when_any_swapped非メンバ関数
•

when_any_swapped()非メンバ関数は、複数のfutureを受け取り、どれか一つが
完了するまで待機するfutureを作って返す、when_any()の亜種。

•

最初に見つかった準備完了のfutureを、最後尾のfutureとswapする。
こうすることで、準備が完了したfutureを定数時間で抽出できる。

•

先頭でなく最後尾なのは、返すコンテナがvectorで、pop_backが速いから。

future<int> futures[] = {async([]() { return intResult(125); }),
async([]() { return intResult(456); })};
future<vector<future<int>>> any_f =
when_any_swapped(begin(futures), end(futures));
future<int> result = any_f.then([](future<vector<future<int>> f) {
// 最後尾の要素は、必ず準備完了したfuture
return f.get().back().get();
});
when_all非メンバ関数
•

when_all()非メンバ関数は、複数のfutureを受け取り、その全てが完了するま
で待機するfutureを作って返す。

•

並行アルゴリズムの待ち合わせに使える。

shared_future<int> shared_future1 = async([] { return intResult(125); });
future<string> future2 = async([]() { return stringResult(“hi”); });
future<tuple<shared_future<int>, future<string>>> all_f =
when_all(shared_future1, future2);
future<int> result = all_f.then(
[](future<tuple<shared_future<int>, future<string>>> f) {
return doWork(f.get());
});
make_ready_future非メンバ関数
•

make_ready_future()非メンバ関数は、値を指定して準備完了したfutureを
作るヘルパ関数。

•

make_ready_future<void>()でfuture<void>ができる。例外版はない。
future<int> compute(int x) {
// パラメータの値によっては、計算する必要がない。
if (x < 0) return make_ready_future<int>(-1);
if (x == 0) return make_ready_future<int>(0);

}

future<int> f1 = async([]() { return do_work(x); });
return f1;
所感
•

今回追加が予定されているものは、他言語(たとえばC#)やライブラリ(たと
えばPPL)で、実際の設計経験があるもの。
そのため、十分に練られた設計になっている。

•

文面に細かいtypoを発見したが、C++の標準ライブラリに導入するに十分
な動機と設計が成されていると感じた。
細かいtypo 1
•

then()の例。
intは組み込み型なので、to_string()というメンバ関数はない。
#include <future>
using namespace std;
int main() {
future<int> f1 = async([]() { return 123; });
future<string> f2 = f1.then([](future<int> f) {
return f.get().to_string(); // here .get() won’t block
});
}

•

std::to_string()に修正すべきです。
return to_string(f.get()); // here .get() won’t block
細かいtypo 2
•

unwrap()の例。futureにテンプレート引数がない。
#include <future>
using namespace std;
int main() {
future<future<int>> outer_future = async([]{
future<int> inner_future = async([] {
return 1;
});
return inner_future;
});
future<int> inner_future = outer_future.unwrap();

}

•

inner_future.then([](future f) {
do_work(f);
});

future<int>に修正すべきです。
参考情報
•

N3747 A Universal Model for Asynchronous Operations
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3747.pdf

•
•
•

Boost.Asio作者であるChristopher Kohlhoff氏が、非同期操作の
統合モデルを考察している文書。
非同期操作APIの使用法として、コールバック関数の登録、future、
コルーチンといったものを選択的にできる設計を示している。

N3722 Resumable Functions
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3722.pdf

•

future::then()の言語サポート。awaitとresumable。

•

C#から始まり、最近はScalaにも実装があるもの。VC++ 2013 CTPで
__await/__resumableとして実験的に実装されている。

Contenu connexe

Tendances

【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~C# JobSystem 編~
【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~C# JobSystem 編~【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~C# JobSystem 編~
【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~C# JobSystem 編~
Unity Technologies Japan K.K.
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
kikairoya
 

Tendances (20)

Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11
 
C++14 Overview
C++14 OverviewC++14 Overview
C++14 Overview
 
Qt Creator を拡張する
Qt Creator を拡張するQt Creator を拡張する
Qt Creator を拡張する
 
Tensorflow dynamically loadable XLA plugin ソースコード解析
Tensorflow  dynamically loadable XLA plugin ソースコード解析Tensorflow  dynamically loadable XLA plugin ソースコード解析
Tensorflow dynamically loadable XLA plugin ソースコード解析
 
【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~C# JobSystem 編~
【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~C# JobSystem 編~【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~C# JobSystem 編~
【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~C# JobSystem 編~
 
新しい並列for構文のご提案
新しい並列for構文のご提案新しい並列for構文のご提案
新しい並列for構文のご提案
 
Effective modern-c++#9
Effective modern-c++#9Effective modern-c++#9
Effective modern-c++#9
 
effective modern c++ chapeter36
effective modern c++ chapeter36effective modern c++ chapeter36
effective modern c++ chapeter36
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
 
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core GuidelinesBoost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
 
TensorFlow Lite Delegateとは?
TensorFlow Lite Delegateとは?TensorFlow Lite Delegateとは?
TensorFlow Lite Delegateとは?
 
C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1
 
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
 
Async design with Unity3D
Async design with Unity3DAsync design with Unity3D
Async design with Unity3D
 
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうか
 
Inside FastEnum
Inside FastEnumInside FastEnum
Inside FastEnum
 
きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回
 
More C++11
More C++11More C++11
More C++11
 
ジェネリック関数の呼び出され方 #cocoa_kansai
ジェネリック関数の呼び出され方 #cocoa_kansaiジェネリック関数の呼び出され方 #cocoa_kansai
ジェネリック関数の呼び出され方 #cocoa_kansai
 
基礎からのCode Contracts
基礎からのCode Contracts基礎からのCode Contracts
基礎からのCode Contracts
 

En vedette

Define and expansion of cpp macro
Define and expansion of cpp macroDefine and expansion of cpp macro
Define and expansion of cpp macro
digitalghost
 
ComQi
ComQiComQi
ComQi
comqi
 
Sights of SXSW
Sights of SXSWSights of SXSW
Sights of SXSW
Marketo
 
CATIA V5 INTRODUCTION TO MODELING
CATIA V5 INTRODUCTION TO MODELINGCATIA V5 INTRODUCTION TO MODELING
CATIA V5 INTRODUCTION TO MODELING
Robert Wilson
 
00_Atos_for_Media_16_9_V4[1]
00_Atos_for_Media_16_9_V4[1]00_Atos_for_Media_16_9_V4[1]
00_Atos_for_Media_16_9_V4[1]
Ray ffrench
 

En vedette (20)

Define and expansion of cpp macro
Define and expansion of cpp macroDefine and expansion of cpp macro
Define and expansion of cpp macro
 
constexpr idioms
constexpr idiomsconstexpr idioms
constexpr idioms
 
Legal aspects of indian business
Legal aspects of indian businessLegal aspects of indian business
Legal aspects of indian business
 
Workshop-materiaali muotoilu & markkinointi
Workshop-materiaali muotoilu & markkinointiWorkshop-materiaali muotoilu & markkinointi
Workshop-materiaali muotoilu & markkinointi
 
George Aye, "‘Minimal Viable Behavior’ and its Impact on the Future of Social...
George Aye, "‘Minimal Viable Behavior’ and its Impact on the Future of Social...George Aye, "‘Minimal Viable Behavior’ and its Impact on the Future of Social...
George Aye, "‘Minimal Viable Behavior’ and its Impact on the Future of Social...
 
how to check deleted skype messages on iphone
 how to check deleted skype messages on iphone how to check deleted skype messages on iphone
how to check deleted skype messages on iphone
 
Using Social Media Effectively pdf with notes - GSAE
Using Social Media Effectively pdf with notes - GSAEUsing Social Media Effectively pdf with notes - GSAE
Using Social Media Effectively pdf with notes - GSAE
 
ComQi
ComQiComQi
ComQi
 
Thị trường chứng khoán
Thị trường chứng khoán Thị trường chứng khoán
Thị trường chứng khoán
 
ODMedia presentation 2013
ODMedia presentation 2013ODMedia presentation 2013
ODMedia presentation 2013
 
Framework for Socially Influencing Systems
Framework for Socially Influencing SystemsFramework for Socially Influencing Systems
Framework for Socially Influencing Systems
 
Sights of SXSW
Sights of SXSWSights of SXSW
Sights of SXSW
 
CATIA V5 INTRODUCTION TO MODELING
CATIA V5 INTRODUCTION TO MODELINGCATIA V5 INTRODUCTION TO MODELING
CATIA V5 INTRODUCTION TO MODELING
 
00_Atos_for_Media_16_9_V4[1]
00_Atos_for_Media_16_9_V4[1]00_Atos_for_Media_16_9_V4[1]
00_Atos_for_Media_16_9_V4[1]
 
Dreamforce 11: Who's Who in Social Media
Dreamforce 11: Who's Who in Social MediaDreamforce 11: Who's Who in Social Media
Dreamforce 11: Who's Who in Social Media
 
Startup Investors Manifesto
Startup Investors ManifestoStartup Investors Manifesto
Startup Investors Manifesto
 
Frontal lobe
Frontal lobeFrontal lobe
Frontal lobe
 
Presentacion 1computación
Presentacion 1computaciónPresentacion 1computación
Presentacion 1computación
 
Lynne Cazaly - Insights & Connections
Lynne Cazaly - Insights & ConnectionsLynne Cazaly - Insights & Connections
Lynne Cazaly - Insights & Connections
 
Reflexion mirando hacia atras
Reflexion  mirando hacia atrasReflexion  mirando hacia atras
Reflexion mirando hacia atras
 

Similaire à Improvement future api

Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPReplace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JP
Akira Takahashi
 
C++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みくださいC++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みください
digitalghost
 
Continuation with Boost.Context
Continuation with Boost.ContextContinuation with Boost.Context
Continuation with Boost.Context
Akira Takahashi
 
Boost9 session
Boost9 sessionBoost9 session
Boost9 session
freedom404
 
ぱっと見でわかるC++11
ぱっと見でわかるC++11ぱっと見でわかるC++11
ぱっと見でわかるC++11
えぴ 福田
 
Fork/Join Framework。そしてLambdaへ。
Fork/Join Framework。そしてLambdaへ。Fork/Join Framework。そしてLambdaへ。
Fork/Join Framework。そしてLambdaへ。
Yuichi Sakuraba
 
Boost.Flyweight
Boost.FlyweightBoost.Flyweight
Boost.Flyweight
gintenlabo
 

Similaire à Improvement future api (20)

Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPReplace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JP
 
qmake入門
qmake入門qmake入門
qmake入門
 
C++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みくださいC++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みください
 
明日から使える気になるGo言語による並行処理
明日から使える気になるGo言語による並行処理明日から使える気になるGo言語による並行処理
明日から使える気になるGo言語による並行処理
 
Ylug 110th kpatch code reading
Ylug 110th kpatch code readingYlug 110th kpatch code reading
Ylug 110th kpatch code reading
 
20171212 titech lecture_ishizaki_public
20171212 titech lecture_ishizaki_public20171212 titech lecture_ishizaki_public
20171212 titech lecture_ishizaki_public
 
Continuation with Boost.Context
Continuation with Boost.ContextContinuation with Boost.Context
Continuation with Boost.Context
 
Swift 2.0 大域関数の行方から #swift2symposium
Swift 2.0 大域関数の行方から #swift2symposiumSwift 2.0 大域関数の行方から #swift2symposium
Swift 2.0 大域関数の行方から #swift2symposium
 
Boost9 session
Boost9 sessionBoost9 session
Boost9 session
 
GoらしいAPIを求める旅路 (Go Conference 2018 Spring)
GoらしいAPIを求める旅路 (Go Conference 2018 Spring)GoらしいAPIを求める旅路 (Go Conference 2018 Spring)
GoらしいAPIを求める旅路 (Go Conference 2018 Spring)
 
Twitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hackTwitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hack
 
ぱっと見でわかるC++11
ぱっと見でわかるC++11ぱっと見でわかるC++11
ぱっと見でわかるC++11
 
Ansible 2.0を使って組む kubernetesクラスタ vol.1
Ansible 2.0を使って組む kubernetesクラスタ vol.1Ansible 2.0を使って組む kubernetesクラスタ vol.1
Ansible 2.0を使って組む kubernetesクラスタ vol.1
 
JavaScript入門
JavaScript入門JavaScript入門
JavaScript入門
 
2022年ASP.NETCore2.2~6.0の旅.pptx
2022年ASP.NETCore2.2~6.0の旅.pptx2022年ASP.NETCore2.2~6.0の旅.pptx
2022年ASP.NETCore2.2~6.0の旅.pptx
 
Fork/Join Framework。そしてLambdaへ。
Fork/Join Framework。そしてLambdaへ。Fork/Join Framework。そしてLambdaへ。
Fork/Join Framework。そしてLambdaへ。
 
MoteMote Compiler Plugin
MoteMote Compiler PluginMoteMote Compiler Plugin
MoteMote Compiler Plugin
 
Boost.Flyweight
Boost.FlyweightBoost.Flyweight
Boost.Flyweight
 
Objc lambda
Objc lambdaObjc lambda
Objc lambda
 
Flow.js
Flow.jsFlow.js
Flow.js
 

Plus de Akira Takahashi

C++14 solve explicit_default_constructor
C++14 solve explicit_default_constructorC++14 solve explicit_default_constructor
C++14 solve explicit_default_constructor
Akira Takahashi
 

Plus de Akira Takahashi (20)

Cpp20 overview language features
Cpp20 overview language featuresCpp20 overview language features
Cpp20 overview language features
 
Cppmix 02
Cppmix 02Cppmix 02
Cppmix 02
 
Cppmix 01
Cppmix 01Cppmix 01
Cppmix 01
 
Modern C++ Learning
Modern C++ LearningModern C++ Learning
Modern C++ Learning
 
cpprefjp documentation
cpprefjp documentationcpprefjp documentation
cpprefjp documentation
 
C++1z draft
C++1z draftC++1z draft
C++1z draft
 
Boost tour 1_61_0 merge
Boost tour 1_61_0 mergeBoost tour 1_61_0 merge
Boost tour 1_61_0 merge
 
Boost tour 1_61_0
Boost tour 1_61_0Boost tour 1_61_0
Boost tour 1_61_0
 
error handling using expected
error handling using expectederror handling using expected
error handling using expected
 
Boost tour 1.60.0 merge
Boost tour 1.60.0 mergeBoost tour 1.60.0 merge
Boost tour 1.60.0 merge
 
Boost tour 1.60.0
Boost tour 1.60.0Boost tour 1.60.0
Boost tour 1.60.0
 
Boost container feature
Boost container featureBoost container feature
Boost container feature
 
Boost Tour 1_58_0 merge
Boost Tour 1_58_0 mergeBoost Tour 1_58_0 merge
Boost Tour 1_58_0 merge
 
Boost Tour 1_58_0
Boost Tour 1_58_0Boost Tour 1_58_0
Boost Tour 1_58_0
 
C++14 solve explicit_default_constructor
C++14 solve explicit_default_constructorC++14 solve explicit_default_constructor
C++14 solve explicit_default_constructor
 
C++14 enum hash
C++14 enum hashC++14 enum hash
C++14 enum hash
 
Multi paradigm design
Multi paradigm designMulti paradigm design
Multi paradigm design
 
Start Concurrent
Start ConcurrentStart Concurrent
Start Concurrent
 
Programmer mind
Programmer mindProgrammer mind
Programmer mind
 
Boost.Study 14 Opening
Boost.Study 14 OpeningBoost.Study 14 Opening
Boost.Study 14 Opening
 

Dernier

Dernier (7)

NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 

Improvement future api