SlideShare a Scribd company logo
1 of 29
Download to read offline
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として実験的に実装されている。

More Related Content

What's hot

Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11nekko1119
 
Qt Creator を拡張する
Qt Creator を拡張するQt Creator を拡張する
Qt Creator を拡張するTakumi Asaki
 
Tensorflow dynamically loadable XLA plugin ソースコード解析
Tensorflow  dynamically loadable XLA plugin ソースコード解析Tensorflow  dynamically loadable XLA plugin ソースコード解析
Tensorflow dynamically loadable XLA plugin ソースコード解析Mr. Vengineer
 
【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.
 
新しい並列for構文のご提案
新しい並列for構文のご提案新しい並列for構文のご提案
新しい並列for構文のご提案yohhoy
 
effective modern c++ chapeter36
effective modern c++ chapeter36effective modern c++ chapeter36
effective modern c++ chapeter36Tatsuki SHIMIZU
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由kikairoya
 
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 GuidelinesShintarou Okada
 
TensorFlow Lite Delegateとは?
TensorFlow Lite Delegateとは?TensorFlow Lite Delegateとは?
TensorFlow Lite Delegateとは?Mr. Vengineer
 
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#大統一理論へ向けて性能的課題を払拭するYoshifumi Kawai
 
Async design with Unity3D
Async design with Unity3DAsync design with Unity3D
Async design with Unity3DKouji Hosoda
 
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかYuki Miyatake
 
きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回Tomoya Kawanishi
 
ジェネリック関数の呼び出され方 #cocoa_kansai
ジェネリック関数の呼び出され方 #cocoa_kansaiジェネリック関数の呼び出され方 #cocoa_kansai
ジェネリック関数の呼び出され方 #cocoa_kansaiTomohiro Kumagai
 
基礎からのCode Contracts
基礎からのCode Contracts基礎からのCode Contracts
基礎からのCode ContractsYoshifumi Kawai
 

What's hot (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
 

Viewers also liked

Define and expansion of cpp macro
Define and expansion of cpp macroDefine and expansion of cpp macro
Define and expansion of cpp macrodigitalghost
 
constexpr idioms
constexpr idiomsconstexpr idioms
constexpr idiomsfimbul
 
Legal aspects of indian business
Legal aspects of indian businessLegal aspects of indian business
Legal aspects of indian businessdeepu2000
 
Workshop-materiaali muotoilu & markkinointi
Workshop-materiaali muotoilu & markkinointiWorkshop-materiaali muotoilu & markkinointi
Workshop-materiaali muotoilu & markkinointiMarkus Nieminen
 
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...WebVisions
 
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 iphoneJaneRobert
 
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 - GSAEDeirdre Reid
 
ComQi
ComQiComQi
ComQicomqi
 
ODMedia presentation 2013
ODMedia presentation 2013ODMedia presentation 2013
ODMedia presentation 2013ODMedia
 
Framework for Socially Influencing Systems
Framework for Socially Influencing SystemsFramework for Socially Influencing Systems
Framework for Socially Influencing SystemsAgnis Stibe
 
Sights of SXSW
Sights of SXSWSights of SXSW
Sights of SXSWMarketo
 
CATIA V5 INTRODUCTION TO MODELING
CATIA V5 INTRODUCTION TO MODELINGCATIA V5 INTRODUCTION TO MODELING
CATIA V5 INTRODUCTION TO MODELINGRobert 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
 
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 MediaRoss Mayfield
 
Startup Investors Manifesto
Startup Investors ManifestoStartup Investors Manifesto
Startup Investors Manifestoeban_org
 
Presentacion 1computación
Presentacion 1computaciónPresentacion 1computación
Presentacion 1computaciónNona Muñoz
 
Reflexion mirando hacia atras
Reflexion  mirando hacia atrasReflexion  mirando hacia atras
Reflexion mirando hacia atrasmalupaz
 

Viewers also liked (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
 

Similar to 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 JPAkira Takahashi
 
C++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みくださいC++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みくださいdigitalghost
 
明日から使える気になるGo言語による並行処理
明日から使える気になるGo言語による並行処理明日から使える気になるGo言語による並行処理
明日から使える気になるGo言語による並行処理Yuto Matsukubo
 
Ylug 110th kpatch code reading
Ylug 110th kpatch code readingYlug 110th kpatch code reading
Ylug 110th kpatch code readingMasami Hiramatsu
 
20171212 titech lecture_ishizaki_public
20171212 titech lecture_ishizaki_public20171212 titech lecture_ishizaki_public
20171212 titech lecture_ishizaki_publicKazuaki Ishizaki
 
Continuation with Boost.Context
Continuation with Boost.ContextContinuation with Boost.Context
Continuation with Boost.ContextAkira Takahashi
 
Swift 2.0 大域関数の行方から #swift2symposium
Swift 2.0 大域関数の行方から #swift2symposiumSwift 2.0 大域関数の行方から #swift2symposium
Swift 2.0 大域関数の行方から #swift2symposiumTomohiro Kumagai
 
Boost9 session
Boost9 sessionBoost9 session
Boost9 sessionfreedom404
 
GoらしいAPIを求める旅路 (Go Conference 2018 Spring)
GoらしいAPIを求める旅路 (Go Conference 2018 Spring)GoらしいAPIを求める旅路 (Go Conference 2018 Spring)
GoらしいAPIを求める旅路 (Go Conference 2018 Spring)lestrrat
 
Twitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hackTwitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hackkimukou_26 Kimukou
 
ぱっと見でわかる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.1Hidetoshi Hirokawa
 
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の旅.pptxMasanori Masui
 
Fork/Join Framework。そしてLambdaへ。
Fork/Join Framework。そしてLambdaへ。Fork/Join Framework。そしてLambdaへ。
Fork/Join Framework。そしてLambdaへ。Yuichi Sakuraba
 
Boost.Flyweight
Boost.FlyweightBoost.Flyweight
Boost.Flyweightgintenlabo
 
Flow.js
Flow.jsFlow.js
Flow.jsuupaa
 

Similar to 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
 

More from 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
 

Recently uploaded

プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールsugiuralab
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価sugiuralab
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directoryosamut
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxAtomu Hidaka
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 

Recently uploaded (8)

プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツール
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
 

Improvement future api