Coroutines in C++17 MO S T E FFICIE NT, MO S T S CA L A B L E, MO S T OPEN CO R O U T INES OF ANY PR OG R AMMING L A NG UAGE IN E X IST ENCE!

CppNow 2015 • Gor Nishanov ([email protected]) • Microsoft

What this talk is about? • Stackless Resumable Functions • Lightweight, customizable coroutines • C++17 (maybe) • Experimental Implementation in MSVC 2015, Clang in progress, EDG

http://isocpp.org/files/papers/N4402.pdf http://isocpp.org/files/papers/N4403.pdf

CppNow 2015 • Coroutines in C++17

2012 - N3328 2013 - N3564 2013 - N3650 2013 - N3722 2014 - N3858 2014 - N3977 2014 - N4134 EWG direction approved 2014 - N4286 2015 - N4403 EWG accepted, sent to Core WG

Deon Brewis Niklas Gustafsson Herb Sutter Jim Radigan Daveed Vandevoorde 2

Coroutines are popular! Python: PEP 0492 (accepted on May 5, 2015) DART 1.9 Future getPage(t) async { async def abinary(n): var c = new http.Client(); if n <= 0: try { return 1 var r = await c.get('http://url/search?q=$t'); l = await abinary(n - 1) print(r); r = await abinary(n - 1) return r.length(); return l + 1 + r } finally {C# async Task WaitAsynchronouslyAsync() await c.close(); { } await Task.Delay(10000); } return "Finished"; HACK (programming language) }

C++17 future WaitAsynchronouslyAsync() { await sleep_for(10ms); return "Finished“s; } CppNow 2015 • Coroutines in C++17

async function gen1(): Awaitable { $x = await Batcher::fetch(1); $y = await Batcher::fetch(2); return $x + $y; } 3

Design Goals • Scalable (to hundred millions of concurrent coroutines) • Efficient (resume and suspend operations comparable in cost to a function call overhead) • Seamless interaction with existing facilities with no overhead • Open ended coroutine machinery allowing library designers to develop coroutine libraries exposing various high-level semantics, such as generators, goroutines, tasks and more. • Usable in environments where exception are forbidden or not available

CppNow 2015 • Coroutines in C++17

4

2x2x2 • Two new keywords (*) • await • yield

• Two new concepts • Awaitable

• Coroutine Promise

• Two new types • coroutine_handle

• coroutine_traits (*) may change based on discussion at the Lenexa last week

CppNow 2015 • Coroutines in C++17

5

Coroutines 57 years ago

• Introduced in 1958 by Melvin Conway • Donald Knuth, 1968: “generalization of subroutine” subroutines

coroutines

call

Allocate frame, pass parameters

Allocate frame, pass parameters

return

Free frame, return result

Free frame, return eventual result

suspend

x

yes

resume

x

yes

CppNow 2015 • Coroutines in C++17

6

Coroutine classification

User Mode Threads / Fibers Stackless Resumable Functions

• Symmetric / Asymmetric • Modula-2 / Win32 Fibers / Boost::context are symmetric (SwitchToFiber) • C#,Dart,Hack,etc. asymmetric (distinct suspend and resume operations)

• First-class / Constrained • Can coroutine be passed as a parameter, returned from a function, stored in a data structure?

• Stackful / Stackless • How much state coroutine has? Just the locals of the coroutine or entire stack? • Can coroutine be suspended from nested stack frames

CppNow 2015 • Coroutines in C++17

7

Stackful

Parameters

Coroutine State

vs.

Coroutine State (chained stack)

Stackless

Coroutine State:

4k stacklet

Locals & Temporaries

4k stacklet 4k stacklet 1 meg of stack

4k stacklet

1 meg of stack

4k stacklet …

CppNow 2015 • Coroutines in C++17

8

Coroutines in C++

int main() { generator hello() { for (auto auto helloch: = [] "Hello, { world\n") for yield (auto ch;ch: "Hello, world\n") } yield ch; }; int main() { for (auto ch : hello()) cout << ch; }

CppNow 2015 • Coroutines in C++17

future sleepy() { cout << “Going to sleep…\n"; await sleep_for(1ms); cout << “Woke up\n"; return 42; } int main() { cout << sleepy.get(); } 9

When would you want a coroutine?

CppNow 2015 • Coroutines in C++17

12

Interleave int main() { vector a{ 1,2,3,4,5,6,7,8,9 }; vector b{ 10,20,30,40,50 }; vector c{ 100,200,300,400 }; using T = decltype(c.begin()); vector> rg{ Range(a), Range(b), Range(c) }; for (auto v : interleave(rg)) { cout << v << ' '; }

Output: 1 10 100 2 20 200 3 30 300 4 40 400 5 50 6 7 8 9 CppNow 2015 • Coroutines in C++17

13

Not a coroutine (yet) template auto interleave(RangeOfRanges rg) { using T = remove_reference_t; vector ranges(begin(rg), end(rg)); for (;;) { int values_yielded_this_iteration = 0; for (auto && v : ranges) { if (begin(v) != end(v)) { cout << *begin(v++); ++values_yielded_this_iteration; } } if (values_yielded_this_iteration == 0) return; } } CppNow 2015 • Coroutines in C++17

14

A generator coroutine ! template auto interleave(RangeOfRanges rg) { using T = remove_reference_t; vector ranges(begin(rg), end(rg)); for (;;) { int values_yielded_this_iteration = 0; for (auto && v : ranges) { if (begin(v) != end(v)) { yield *begin(v++); ++values_yielded_this_iteration; } } if (values_yielded_this_iteration == 0) return; } } CppNow 2015 • Coroutines in C++17

15

A generator coroutine ! template auto interleave(RangeOfRanges rg) -> generator { using T = remove_reference_t; vector ranges(begin(rg), end(rg)); for (;;) { T int values_yielded_this_iteration = 0; for (auto && v : ranges) { if (begin(v) != end(v)) { yield *begin(v++); ++values_yielded_this_iteration; } } if (values_yielded_this_iteration == 0) return; } } CppNow 2015 • Coroutines in C++17

16

When would you want a coroutine? Part II

CppNow 2015 • Coroutines in C++17

17

Sync IO auto tcp_reader(int total) -> ptrdiff_t { ptrdiff_t result = 0; char buf[64 * 1024]; auto conn = Tcp::ConnectSync("127.0.0.1", 1337); do { auto bytesRead = conn.readSync(buf, sizeof(buf)); total -= bytesRead; result += std::count(buf, buf + bytesRead, 'c'); } while (total > 0); return result; }

CppNow 2015 • Coroutines in C++17

18

Async IO auto tcp_reader(int total) -> future { ptrdiff_t result = 0; char buf[64 * 1024]; auto conn = await Tcp::Connect("127.0.0.1", 1337); do { auto bytesRead = await conn.read(buf, sizeof(buf)); total -= bytesRead; result += std::count(buf, buf + bytesRead, 'c'); } while (total > 0); return result; }

CppNow 2015 • Coroutines in C++17

19

Goroutines? goroutine pusher(channel& left, channel& right) { for (;;) { auto val = await left.pull(); await right.push(val + 1); } }

CppNow 2015 • Coroutines in C++17

20

Goroutines? Sure. 100,000,000 of them goroutine pusher(channel& left, channel& right) { for (;;) { auto val = await left.pull(); await right.push(val + 1); } } int main() { const int N = 100 * 1000 * 1000; vector> c(N + 1); for (int i = 0; i < N; ++i) goroutine::go(pusher(c[i], c[i + 1]));

c0-g0-c1

c1-g1-c2 … cn-gn-cn+1

c.front().sync_push(0); cout << c.back().sync_pull() << endl;

} CppNow 2015 • Coroutines in C++17

21

STL looks like the machine language macro library of an anally retentive assembly language programmer Pamela Seymour, Leiden University

CppNow 2015 • Coroutines in C++17

22

Layered complexity • Everybody • Safe by default, novice friendly Use coroutines and awaitables defined by standard library and boost and other high quality libraries

• Power Users • Define new awaitables to customize await for their environment

• Experts • Define new coroutine types

CppNow 2015 • Coroutines in C++17

23

Compiler, Glue, Library

Libraries

Compiler Types: coroutine_traits coroutine_handle Concepts: Awaitable Coroutine Promise

CppNow 2015 • Coroutines in C++17

generator async_generator future boost::future ….

24

Satisfies Coroutine Promise Requirements

Anatomy of a Stackless Coroutine Coroutine Return Object

Coroutine Frame Coroutine Promise

std::future tcp_reader(int total) { char buf[64 * 1024]; ptrdiff_t result = 0;

Suspend Points

Platform Context* Formals (Copy) Locals / Temporaries

auto conn = await Tcp::Connect("127.0.0.1", 1337); do { auto bytesRead = await conn.Read(buf, sizeof(buf)); total -= bytesRead; result += std::count(buf, buf + bytesRead, 'c'); } while (total > 0); Satisfies Awaitable return result; Requirements

}

Coroutine Eventual Result CppNow 2015 • Coroutines in C++17



25

Compiler vs Coroutine Promise return

.return_value(); goto

yield

.yield_value()

await

wait for it … Slide 32



.get_return_object()



.set_exception ( std::current_exception())



if (.initial_suspend()) { }



if (.final_suspend()) { }

CppNow 2015 • Coroutines in C++17

26

How does it work?

CppNow 2015 • Coroutines in C++17

27

What is this? n

1 1 1 0

CppNow 2015 • Coroutines in C++17

1 1

x

= y

28

Coroutine Frame Coroutine Promise

Generator coroutines generator fib(int n) { int a = 0; int b = 1; while (n-- > 0) { yield a; auto next = a + b; a = b; b = next; } }

generator

int a, b, n; int next;

generator::iterator { auto && __range = fib(35); for (auto __begin = __range.begin(), __end = __range.end() ; __begin != __end ; ++__begin) { auto v = *__begin; { if (v > 10) break; cout << v << ' '; } }

int main() { for (auto v : fib(35)) { if (v > 10) break; cout << v << ' '; } } CppNow 2015 • Coroutines in C++17

int current_value;

}

29

x86_x64 Windows ABI

Call

generator fib(int n)

RSP

generator __range; // raw auto && __range = fib(35) fib(&__range, 35)

Stack __range

&__range slot1

savedRDI slot2

savedRSI slot3

savedRB slot4 X

ret-main

savedRBP

slot1

slot2

slot3

slot4

Suspend!!!!

RCX = &__range RDX = 35 Heap RDI = n RSI = a RBX = b RBP = $fp

Coroutine Promise saved RDI slot RDI saved RSI slot RSI

RAX = &__range

saved RBX RBX slot saved RIP slot RIP

Coroutine Frame

ret-addr

generator CppNow 2015 • Coroutines in C++17

30

x86_x64 Windows ABI

Resume

generator::iterator::operator ++() for(…;…; ++__begin)

RSP

Stack RCX = $fp

__range

slot1

savedRDI slot2

savedRSI slot3

savedRBX slot4

ret-main

savedRBP

slot1

slot2

RDI = n RSI = a RBX = b

slot3

slot4

RBP = $fp

Coroutine Promise saved RDI slot RDI saved RSI slot RSI RBX slot saved RBX saved RIP slot RIP

CppNow 2015 • Coroutines in C++17

Coroutine Frame

ret-addr

struct iterator { iterator& operator ++() { coro.resume(); return *this; } … coroutine_handle coro; }; Heap

31

Awaitable

CppNow 2015 • Coroutines in C++17

32

await Expands into an expression equivalent of

If is a class type and unqualified ids await_ready, await_suspend or await_resume are found in the scope of a class

{ auto && __tmp = ; if (!__tmp.await_ready()) {

__tmp.await_suspend();

suspend resume }

return __tmp.await_resume(); }

CppNow 2015 • Coroutines in C++17

34

await Expands into an expression equivalent of

Otherwise (see rules for range-based-for lookup)

{ auto && __tmp = ; if (! await_ready(__tmp)) {

await_suspend(__tmp, );

suspend resume }

return await_resume(__tmp); }

CppNow 2015 • Coroutines in C++17

35

Trivial Awaitable #1 struct _____blank____ { bool await_ready(){ return false; } template void await_suspend(F){} void await_resume(){} };

CppNow 2015 • Coroutines in C++17

36

Trivial Awaitable #1 struct suspend_always { bool await_ready(){ return false; } template void await_suspend(F){} void await_resume(){} };

await suspend_always {};

CppNow 2015 • Coroutines in C++17

37

Trivial Awaitable #2 struct suspend_never { bool await_ready(){ return true; } template void await_suspend(F){} void await_resume(){} };

CppNow 2015 • Coroutines in C++17

38

Simple Awaitable #1 std::future DoSomething(mutex& m) { unique_lock lock = await lock_or_suspend{m}; // ... } struct lock_or_suspend { std::unique_lock lock; lock_or_suspend(std::mutex & mut) : lock(mut, std::try_to_lock) {} bool await_ready() { return lock.owns_lock(); }

template void await_suspend(F cb) { std::thread t([this, cb]{ lock.lock(); cb(); }); t.detach(); } auto await_resume() { return std::move(lock);} }; CppNow 2015 • Coroutines in C++17

39

Simple Awaiter #2: Making Boost.Future awaitable #include namespace boost { template bool await_ready(unique_future & t) { return t.is_ready(); } template void await_suspend(unique_future & t, F resume_callback) { t.then([=](auto&){resume_callback();}); } template auto await_resume(unique_future & t) { return t.get(); } } } CppNow 2015 • Coroutines in C++17

40

Awaitable Interacting with C APIs

CppNow 2015 • Coroutines in C++17

41

2x2x2 • Two new keywords • await • yield

• Two new concepts • Awaitable

• Coroutine Promise

• Two new types • coroutine_handle

• coroutine_traits

CppNow 2015 • Coroutines in C++17

42

coroutine_handle template struct coroutine_handle; template <> struct coroutine_handle { void resume(); void destroy(); bool done() const; void * to_address(); static coroutine_handle from_address(void*); void operator()(); // same as resume() … };

CppNow 2015 • Coroutines in C++17

== != < > <= >=

43

Simple Awaitable #2: Raw OS APIs await sleep_for(10ms); class sleep_for { static void TimerCallback(PTP_CALLBACK_INSTANCE, void* Context, PTP_TIMER) { std::coroutine_handle<>::from_address(Context).resume(); } PTP_TIMER timer = nullptr; std::chrono::system_clock::duration duration; public: explicit sleep_for(std::chrono::system_clock::duration d) : duration(d){} bool await_ready() const { return duration.count() <= 0; } void await_suspend(std::coroutine_handle<> h) { int64_t relative_count = -duration.count(); timer = CreateThreadpoolTimer(TimerCallback, h.to_address(), 0); SetThreadpoolTimer(timer, (PFILETIME)&relative_count, 0, 0); }

void await_resume() {} ~sleep_for() { if (timer) CloseThreadpoolTimer(timer); } }; CppNow 2015 • Coroutines in C++17

44

2x2x2 • Two new keywords • await • yield

• Two new concepts • Awaitable

• Coroutine Promise

• Two new types • coroutine_handle

• coroutine_traits

CppNow 2015 • Coroutines in C++17

45

coroutine_traits generator fib(int n)

std::coroutine_traits, int>

template struct coroutine_traits { using promise_type = typename R::promise_type; };

CppNow 2015 • Coroutines in C++17

46

Defining Coroutine Promise for boost::future namespace std { template struct coroutine_traits, anything…> { struct promise_type { boost::promise promise; auto get_return_object() { return promise.get_future(); } template void return_value(U && value) { promise.set_value(std::forward(value)); }

void set_exception(std::exception_ptr e) { promise.set_exception(std::move(e)); } bool initial_suspend() { return false; } bool final_suspend() { return false; } }; }; } CppNow 2015 • Coroutines in C++17

47

Awaitable and Exceptions

CppNow 2015 • Coroutines in C++17

48

coroutine_handle template struct coroutine_handle; template <> struct coroutine_handle { void resume(); void destroy(); bool done() const; void * to_address(); static coroutine_handle from_address(void*); void operator()(); // same as resume() … }; template struct coroutine_handle: public coroutine_handle<> { Promise & promise(); explicit coroutine_handle(Promise*); … CppNow 2015 • Coroutines in C++17 };

== != < > <= >=

49

Exceptionless Error Propagation (Part 1/3) #include namespace boost { template bool await_ready(unique_future & t) { return t.is_ready();} template auto await_resume(unique_future & t) { return t.get(); } template void await_suspend( unique_future & t, F cb) { t.then([=](auto& result){ cb(); }); } }

CppNow 2015 • Coroutines in C++17

50

Exceptionless Error Propagation (Part 2/3) #include namespace boost { template bool await_ready(unique_future & t) { return t.is_ready();} template auto await_resume(unique_future & t) { return t.get(); } template void await_suspend( unique_future & t, std::coroutine_handle h) { t.then([=](auto& result){ if(result.has_exception()) { h.promise().set_exception(result.get_exception_ptr()); h.destroy(); } else h.resume(); }); } } CppNow 2015 • Coroutines in C++17

51

Exceptionless Error Propagation (Part 3/3) #include namespace boost { template bool await_ready(unique_future & t) { return t.is_ready() && !t.has_exception();} template auto await_resume(unique_future & t) { return t.get(); } template void await_suspend( unique_future & t, std::coroutine_handle h) { t.then([=](auto& result){ if(result.has_exception()) { h.promise().set_exception(result.get_exception_ptr()); h.destroy(); } else h.resume(); }); } } CppNow 2015 • Coroutines in C++17

52

Simple Happy path and reasonable error propagation

std::future tcp_reader(int total) { char buf[64 * 1024]; ptrdiff_t result = 0; auto conn = await Tcp::Connect("127.0.0.1", 1337); do { auto bytesRead = await conn.Read(buf, sizeof(buf)); total -= bytesRead; result += std::count(buf, buf + bytesRead, 'c'); } while (total > 0); return result; }

CppNow 2015 • Coroutines in C++17

53

Expected, yeah! expected tcp_reader(int total) { char buf[64 * 1024]; ptrdiff_t result = 0; auto conn = await Tcp::Connect("127.0.0.1", 1337); do { auto bytesRead = await conn.Read(buf, sizeof(buf)); total -= bytesRead; result += std::count(buf, buf + bytesRead, 'c'); } while (total > 0); return result; }

CppNow 2015 • Coroutines in C++17

54

Beyond Coroutines M f() { auto x = await f1(); auto y = await f2(); return g(x,y); }

Where

f1: () → M’ f2: () → M’’ g: (X,Y) → T

await: M* → T return: T → M

await: unwraps a value from a container M* return: puts a value back into a container M Future: container of T, unwrapping strips temporal aspect optional: container of T, unwrapping strips “not there aspect” expected: container of T, unwrapping strips “or an error aspect” std::future: unwrapping strips temporal and may have error aspects

CppNow 2015 • Coroutines in C++17

55

Beyond Coroutines: Constexpr Generators constexpr auto strided_init( int from, int to, int step) { while (from < to) { yield from; from += step; } } int a[] = {strided_init(10,100,5)};

CppNow 2015 • Coroutines in C++17

56

Keywords

CppNow 2015 • Coroutines in C++17

57

A future Sum(async_stream & input) { int sum = 0; for await(auto v: input) sum += v; return sum; }

future sleepy() { cout << “Going to sleep…\n"; await sleep_for(1ms); cout << “Woke up\n"; return 42; }

CppNow 2015 • Coroutines in C++17

auto flatten(node* n) { if (n == nullptr) return; yield flatten(n->left); yield n->value; yield flatten(n->right); }

58

B future Sum(async_stream & input) { int sum = 0; co_for(auto v: input) sum += v; co_return sum; }

future sleepy() { cout << “Going to sleep…\n"; co_await sleep_for(1ms); cout << “Woke up\n"; co_return 42; }

CppNow 2015 • Coroutines in C++17

auto flatten(node* n) { if (n == nullptr) co_return; co_yield flatten(n->left); co_yield n->value; co_yield flatten(n->right); }

59

C future Sum(async_stream & input) { int sum = 0; for coawait(auto v: input) sum += v; coreturn sum; }

future sleepy() { cout << “Going to sleep…\n"; coawait sleep_for(1ms); cout << “Woke up\n"; coreturn 42; }

CppNow 2015 • Coroutines in C++17

auto flatten(node* n) { if (n == nullptr) coreturn; coyield flatten(n->left); coyield n->value; coyield flatten(n->right); }

60

The End

CppNow 2015 • Coroutines in C++17

61

C++ will stand out even more! Python: PEP 0492 (accepted on May 5, 2015) DART Future getPage(t) async { async def abinary(n): var c = new http.Client(); if n <= 0: try { return 1 var r = await c.get('http://url/search?q=$t'); l = await abinary(n - 1) print(r); r = await abinary(n - 1) } finally { C# return l + 1 + r await c.close(); async Task WaitAsynchronouslyAsync() } { } await Task.Delay(10000); return "Finished"; HACK (programming language) }

C++17 auto WaitAsynchronouslyAsync() { co_await sleep_for(10ms); co_return "Finished"; } CppNow 2015 • Coroutines in C++17

async function gen1(): Awaitable { $x = await Batcher::fetch(1); $y = await Batcher::fetch(2); return $x + $y; } 62

Reminder: Just Core Language Evolution

Library Designer Paradise

FE-DEVs

BE-DEVs

• Lib devs can design new coroutines types • generator • goroutine

• spawnable • task • …

• Or adapt to existing async facilities • std::future • concurrency::task • IAsyncAction, IAsyncOperation • …

CppNow 2015 • Coroutines in C++17

65

Generator coroutines generator fib(int n) { int a = 0; int b = 1; while (n-- > 0) { yield a; auto next = a + b; a = b; b = next; } } int main() { for (auto v : fib(35)) cout << v << endl; }

CppNow 2015 • Coroutines in C++17

{ auto && __range = fib(35); for (auto __begin = __range.begin(), __end = __range.end() ; __begin != __end ; ++__begin) { auto v = *__begin; cout << v << endl; } }

66

Reminder: Range-Based For

{

int main() { for (auto v : fib(35)) cout << v << endl; }

CppNow 2015 • Coroutines in C++17

auto && __range = fib(35); for (auto __begin = __range.begin(), __end = __range.end() ; __begin != __end ; ++__begin) { auto v = *__begin; cout << v << endl; } }

67

Coroutines in C++17 - GitHub

http://isocpp.org/files/papers/N4403.pdf ... to a function call overhead) ... coroutines call. Allocate frame, pass parameters. Allocate frame, pass parameters return.

957KB Sizes 42 Downloads 300 Views

Recommend Documents

Concepts in Crypto - GitHub
to check your email. ○. Enigmail: Thunderbird addon that adds OpenPGP ... you its certificate, which includes its public key ... iOS, Android: ChatSecure ...

HTML5 in Action - GitHub
on the client machine between sessions. The data can be overwritten or erased only by the application itself or by the user performing a manual clear down of the local stor- age area. The API of the sessionStorage attribute is identical to that of th

Reading in data - GitHub
... handles import from SPSS. Once installed, the package contents can be loaded into R (made available to the R system) with the function call. > library(Hmisc) ...

Functional Programming in Scala - GitHub
Page 1 ... MADRID · NOV 21-22 · 2014. The category design pattern · The functor design pattern … ..... Play! ∘ Why Play? ∘ Introduction. Web Dictionary.

Fingerprint Authentication in Action - GitHub
My name is Ben Oberkfell, I'm an Android developer at American Express on the US ... developer.android.com/resources/dashboard/screens.html ... Page 10 ...

Annotated Algorithms in Python - GitHub
Jun 6, 2017 - 2.1.1 Python versus Java and C++ syntax . . . . . . . . 24. 2.1.2 help, dir ..... 10 years at the School of Computing of DePaul University. The lectures.

Grails In The Enterprise - GitHub
Developer Program portals for all kinds of companies, ... Employer had very antiquated Struts/OJB application. ➢ ..... Blog: http://rvanderwerf.blogspot.com.

Macro Programming in ImageJ - GitHub
example codes using your own computer and run those macros. Modify- .... 10there is no declaration of types, such as number or string, in ImageJ macro. 12 ...... how folders are organized in your laptop) that organizes many classes in.

Text Search in Wade - GitHub
wr(t, q, d) = wm(t, d)[. 1. ∑ p∈ q(µ(p)). ] 1. q is a multiset. 2. µ(p) is the multiplicity of p in the multiset q. 3. ∑p∈ q(µ(p)) is the cardinality of the multiset q. This can be used to represent how much each term should affect the sco

Elliptic curves in Nemo - GitHub
Aug 3, 2017 - The ring End(E) is isomorphic to an order in a quadratic number field. The Frobenius endomorphism is a .... Question. How can we compute the kernel polynomial K(x) of φ : E → j1 ? Idea (Elkies). The rational fraction defining φ sati

A Scandal In Bohemia - GitHub
ton, bachelor. It was all done in an instant, and there was the gentle- man thanking me on the one side and the lady on the other, while the clergyman beamed ...

IDS Data Server in AWS Setup - GitHub
The “Template URL” must match the region you've ... hcp://region.s3.amazonaws.com/ids-‐dataserver-‐template.cf ... When you get an email back, you will.

Functional Programming and Proving in Coq - GitHub
... (Pierce et al, teaching material, CS-oriented, very accessible). • Certified Programming with Dependent Types (Chlipala, MIT Press, DTP, Ltac automation)

Spring in Action FOURTH EDITION - GitHub
process, there were numerous hands on the bits and bytes that you downloaded— hands that edited it, ..... Rod Johnson and described in his book Expert One-on-One: J2EE Design and Development (Wrox, 2002, http:// ...... Spring profiles are a great w

Batch optimization in VW via LBFGS - GitHub
Dec 16, 2011 - gt. Problem: Hessian can be too big (matrix of size dxd) .... terminate if either: the specified number of passes over the data is reached.

Cybercrime in the Deep Web - GitHub
May 14, 2016 - We are based on anarchistic control so nobody haz power certainly not power over the servers or. * - domains who ever says that this or that person haz power here, are trolls and mostly agents of factions. * - that haz butthurt about t

Design Patterns in Ruby: State Pattern - GitHub
State Method Example. Remember Street. Fighter II special moves? .... State pattern http://www.ruby-doc.org/stdlib-1.9.3/libdoc/delegate/rdoc/Delegator.html.

Using the USART in AVR-GCC - GitHub
Jul 17, 2016 - 1.1 What is the USART? ... three wires for bi-directional communication (Rx, Tx and GND). 1.2 The .... #define USART_BAUDRATE 9600.

Changes in the axxia-dev Branch - GitHub
Support setting QoS values for the A53 clusters (6700) with U-Boot environments. ... band boot” or “eioa boot”. An overview is available in Readme.md/Readme.pdf. 2 .... in GPDMA driver. • Define SYSCACHE_ONLY_MODE in config files. 5 ...

Changes in the lsi-v2013.01.01 Branch - GitHub
In simulation, change bootargs to have Linux use virtio (axxia-55xx-sim- virtio) or mmc .... Handle memory sizes larger than 4G. U-Boot 5.8.1.35 ... the U-Boot SPL parameter data prior to system memory initialization and having heap and stack ...

Test-driven development in C++ - GitHub
Richard Thomson. Senior Software Engineer. Fusion-io. @LegalizeAdulthd http://LegalizeAdulthood.wordpress.com [email protected] ...

Funded Research Projects in Data Science - GitHub
logs, social media posts and blogs, satellites ... Due to the proliferation of social media, sensors, and the Internet of. Things .... “troll” on an Internet Web site simply ..... levels of “bad” cholesterol that sometimes kills adults in the

Macro-based type providers in Scala - GitHub
Apr 5, 2014 - dc.title ->- "Frankenstein Draft Notebook B" ... We'll be using the W3C's Banana RDF library throughout: . 9 ...