-
Notifications
You must be signed in to change notification settings - Fork 13
/
Todo.txt
727 lines (621 loc) · 29.4 KB
/
Todo.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
Create new blank website (not ASP.NET we just dont need it)
WebApplication projects appear to include publish to azure feature
Integrate the home page into the site generation
Create UAT sub domain
Create new build script
that takes in version for content sub dir target
FTP result to site
Add Amazon links to Csharp in a nutshell, Purely Functional data structures, Paul Betts Book, Linq in a Nutshell?
Add links to LinqPad
Add LinqPad samples
===============================================================================
TODO:
MUST
make sure method names outside code snippets are consistent? I think that sometimes you include parentheses and sometimes you don’t.
Update the HR page break style to have a large margin for screen (to give the impression of a gap)
Marble diagram --> marble diagram
Link section
Offical documentation : http://msdn.microsoft.com/en-us/library/hh242985(v=vs.103)
Official home page : http://msdn.microsoft.com/en-us/data/gg577609.aspx
Official Forums : http://social.msdn.microsoft.com/Forums/en-US/rx/
Official Rx Team Blog : http://blogs.msdn.com/b/rxteam/
Offical Design guidelines http://go.microsoft.com/fwlink/?LinkID=205219
Contribution library : http://rxx.codeplex.com/
C9 Videos : http://channel9.msdn.com/tags/Rx/
Rx Resources and Community http://msdn.microsoft.com/en-US/data/gg577612
101 Samples (shouldn't need this any more!) http://rxwiki.wikidot.com/101samples
LinqPad http://www.linqpad.net/
Great background reading:
APM
MinLINQ
ASYNC/AWAIT
CLR via C# for GC
SHOULD
side effects or side-effects?
Hot & Cold observables --> Hot & Cold sequences.
connectable observables --> connectable sequences? ==> observables for sequences?
** excessive use of "Apply"/"Applying"
**Review SelectMany with Concurrent Streams eg. from x in Interval(1) from y in Interval(0.3)**
if I do add more to Creation of Obserables, then move transition to Obseravbles to it's own chapter.
**In chapter 8 we say that Select is just the same as SelectMany with an operator that returns a single value immediately. We should introduce SelectMany + Observable.Start**
**Each chapter NEEDS an argument or a proposition that must be argued or proved. Chapter 1 nails it, but then it falls away. **
** are references to OnNext/OnError/OnCompleted wrapped in <em> or <code> tags? **
** Have a links section/appendix pointing to Forums/C9/Wiki/Rxx etc **
COULD - v2
**Provide an example of infinite sequence and unfold as the Fibonacci sequence**
**Ultimately we want to be able to build Create, Aggregate/Scan, Where/Skip/Take and SelectMany. This means readers wil have a full understanding of the functional composition.**
**Add an example of building Median & Mode, once we have looked at Select and Aggregate.**
**Each chapter or potentially the book's conclusion should have a "Call to Action" a request to the user, a geusture to motivate the user to get their hands on the keyboard.**
WOULD/WONT - v2.0+
Split the Scheduling chapter into 2. It is too hard to edit, and probably too hard to read in one go. (John Grisham page turner theory)
Use the term 'push' instead of OnNext or publish. This should be clarified in the intro.
I/You/We what are we using?
** Coder vs developer vs user vs consumer. What to use? **
TestScheduler/VirtSched discuss rewinding time?
3 vs three. Use digits for math values/examples (10 seconds) otherwise words (four overloads, called five times)
Can't don't --> can not and do not
** code samples can't extend past character 100 (works out to be the ideal col-size for the web display)**
mark up all references to operators, types and keyword. So we can produce an index.
Examples that could be covered:
Running aggregate (Min/Max/Sum/Count/Avg) of grouped data. i.e. Running OHLC of prices grouped by symbol.
Reading from file
Drag and drop
grep & tail?
standard old fetch collection and load into ObservableCollection<T> for WPF
Game server host select many example?
from host where GetGameHosts()
from gameInstance in host.Games.Where(g=>g.Name=="xmen")
where gameInstance.Ping < 150ms
select new {host, gameInstance};
x Titles - ensure that all the title's are coherent and consistent.
var regex = new Regex(@"<title>(?<title>.*)</title>");
var files = Directory.EnumerateFiles(@"C:\Users\Lee\Documents\ArtemisWest\Marketing\Books\Introduction To Rx\content", "*.html");
var q = from file in files
let content = File.ReadAllText(file)
from matchGroup in regex.Match(content).Groups.OfType<Group>().Skip(1)
select matchGroup.Value;
q.Dump();
00_Forward
Add comments that Rx could be used for
I/O
File and Networks
Messaging systems
Business applications
Real time Spell check
Responsive UIs
Search
"Google suggest"
Multi source search ie Type in "Lee Campbell Rx" and hit Bing, Google, Yahoo, Wikipedia and merge the results.
Social media
Chat
Location based services
Finance
Streaming Financial data (prices, research, bids, offers etc...)
Calculating real time risk
Science
Speech recognition
Map routing
01_keyTypes
AsyncSubject is also cached! How did I not know that? You can subscribe after it completes and still get the OnNext+OnCompleted.
It is a simple interface with just a <a href="http://msdn.microsoft.com/en-us/library/dd782981(v=VS.100).aspx">Subscribe</a> method.
should ideally link to a subscribe chapter in the book, which can then link to the MS doc if it exists
Create a Link or a tooltip explaining what the BCL is
Rx Part 2 Lifetime
you should still dispose of you subscription --> you should still dispose of your subscription
Part Ext Methods
This IDisposable will have it’s Dispose --> This IDisposable will have its Dispose
Functional example of faking ticking prices without side effects ie Interval() and scan together somehow?
ToObservable<T>(IE<T>) -> add warning that switching paradigm is not free, and you need to be carefull to avoid deadlocks --put something in 06 on how this could deadlock.
Rx part 4
instead of just specifying an intial and a failover stream --> instead of just specifying an initial and a failover stream
into wrapped publications of a Notifcation<T> type --> into wrapped publications of a Notification<T> type
As you can imagine the Materialise method --> As you can imagine the Materialize method
you would other wise pass to OnCompleted --> you would otherwise pass to OnCompleted
Rx part 7
Mention ISubject with Multicast/Publish/Connect/Replay etc.. Link to it in part 1.
Rx_Appendix2
What Rx is not
How Rx compares to TPL
Reacting to Streams of data vs Asyncronous continuations of work
Async/Await
How Rx compares to C++ AMP / CUDA / OpenCL
CCR ? Axum? MapReduce? Disruptor? Actors? Mailbox F#? CHESS?
Rx_Appendix3
Contributions to Rx
Rx experimental (with async/await support)
Rxx
Search github/codeplex/code.google.com/sourceforge for other examples.
*.css
get the toc to indent number ie 1.2.3. That would be nice.
have a marble css class (ie so it wont be processed as c#)
needs to be mono spaced
allow for lines
non wrapping
ignore spacing (manually put in line breaks)
toc.html
generate this. This should be a simple parse of the Html files in order 00, 01-->99, indenting H2 more than an H1 etc. Obviously all Hx tags will need anchors
IntroToRx.ncx
generate this.
*.opf
Find out what publisher is appropriate
Find out what subject tags are appropriate http://www.bisg.org/what-we-do-20-73-bisac-subject-headings-2008-edition.php
Create GraphicsIntro/cover.gif
Create IntroToRx.ncx
All external links need to be put in an appendix. It appears the kindle just does not support these.
Submit a chapter to MSDN magazine. Or potentially the entire series?
--------------------------------------------
--Further examples to be added to the book--
--------------------------------------------
Discuss that Observable.Create is an important method and which parts are scheduled where. ie Subscribe on is the delegate and the OnNexts are effecively scheduled to the ObserveOn shceduler
IDisposable and Disposables
FutureDisposable / MutableDisposeable
CompositeDisposable
Empty
Action
Testing buffer time/count
How the subjects are hot/cold
Best practices/guidance
dispose
OnError
Naming
snapshot for Async
Task?
Behavior?
hot v cold
Use marble diagrams (esp first 12 months)
Apply scheduling only at the end consumer
Avoid breaking the monad (.First() etc)
Avoid Side effects (or be explicit via .Do())
Favour composition over creating new operators
Avoid use of Subjects, favour factories.
Use OnError handler
Use the IDisposable
Be as “Lazy” as possible
Consider TakeUntil when looking at selectmany
Consider Switch with Iob<IOb<>>
Honour the Completion contracts
Beware the completing replay subject. Replay(2) is sometimes what you really want, but you probably also want to Prune as well! (needs to be tested)
------------------------------------------
--Internet to update --
------------------------------------------
Rx Forum
TestScheduler
http://social.msdn.microsoft.com/Forums/en/rx/thread/e5173644-69f5-462c-b8c6-aee21277049f
http://social.msdn.microsoft.com/Forums/en-US/rx/thread/398452c2-c97d-4d96-b784-2a2e8a026d12
My Blog
Stackoverflow?
----------------------------------------------------------------------------------------
--Type Index
----------------------------------------------------------------------------------------
-TO BE allocated-
System.Reactive.Observer
--------------------------------------------
--Method index
--------------------------------------------
System.Reactive.Linq.Observable
KeyTypes
Notification.CreateOnCompleted
Notification.CreateOnError
Notification.CreateOnNext
Notification`1.op_Equality
Notification`1.op_Inequality
Subject.Create
Unit.get_Default
Unit.op_Equality
Unit.op_Inequality
x System.IObservable`1
x System.IObserver`1
- System.Reactive.IObserver`2 (not in .NET 4 version?)
x System.Reactive.Subjects.AsyncSubject`1
x System.Reactive.Subjects.BehaviorSubject`1
x System.Reactive.Subjects.ISubject`1
x System.Reactive.Subjects.ISubject`2
x System.Reactive.Subjects.ReplaySubject`1
x System.Reactive.Subjects.Subject
x System.Reactive.Subjects.Subject`1
Lifetime management
Disposable.Create
Disposable.get_Empty
System.Reactive.Disposables.BooleanDisposable
System.Reactive.Disposables.CompositeDisposable
System.Reactive.Disposables.ContextDisposable
System.Reactive.Disposables.Disposable
System.Reactive.Disposables.MultipleAssignmentDisposable
System.Reactive.Disposables.SerialDisposable
System.Reactive.Disposables.SingleAssignmentDisposable
Methods (131 methods!)
Create - Expand - Unfold - Anamorphism
Simple
x Observable.Empty
x Observable.Never
x Observable.Return
x Observable.Throw
Complex
x Observable.Create
x Observable.Generate
x Observable.Range
x Observable.Interval
x Observable.Timer
x Observable.Start
x Observable.FromAsyncPattern
- Observable.FromEvent Seems to be legacy and is really just Observable.Create?
x Observable.FromEventPattern
x Observable.ToObservable
- Observabe.Iterate !!!! Ummm where was this hiding???? We build this in Scheduler chapter.
x System.Reactive.Unit
Filter
x Observable.Where
x Observable.Distinct
x Observable.DistinctUntilChanged
x Observable.IgnoreElements
x Observable.Skip
x Observable.SkipLast
x Observable.SkipUntil
x Observable.SkipWhile
x Observable.Take
x Observable.TakeLast
x Observable.TakeUntil
x Observable.TakeWhile
Inspection
x Observable.Any
x Observable.All
x Observable.Contains
x Observable.DefaultIfEmpty
x Observable.ElementAt
x Observable.ElementAtOrDefault
x Observable.SequenceEqual
- Observable.IsEmpty //Deprecated but recreated in an example
Reduce - Aggregate - Fold - Catamorphism
Simple
x Observable.Count
x Observable.LongCount
x Observable.Min
x Observable.Max
x Observable.Sum
x Observable.Average
x Observable.First
x Observable.FirstOrDefault
x Observable.Last
x Observable.LastOrDefault
x Observable.Single
x Observable.SingleOrDefault
- Observable.FirstAsync
- Observable.FirstOrDefaultAsync
- Observable.LastAsync
- Observable.LastOrDefaultAsync
- Observable.SingleAsync
- Observable.SingleOrDefaultAsync
Complex
x Observable.Aggregate
x Observable.Scan
Partition
x Observable.MinBy
x Observable.MaxBy
x Observable.GroupBy
x System.Reactive.Linq.IGroupedObservable`2
Transformational - Bind
x Observable.SelectMany
x Observable.Select
x Observable.Cast
x Observable.OfType
x Observable.Timestamp
x Observable.TimeInterval
x Observable.Materialize
x Observable.Dematerialize
x System.Reactive.TimeInterval`1
x System.Reactive.Timestamped`1
x System.Reactive.Notification
x System.Reactive.Notification`1
x System.Reactive.NotificationKind
Side effect
x Observable.Do
x Observable.AsObservable
Leaving the Monad
x Observable.ForEach
Observable.GetEnumerator
Observable.Latest
Observable.MostRecent
Observable.Next
x Observable.ToEnumerable
x Observable.ToArray
x Observable.ToList
x Observable.ToDictionary
x Observable.ToLookup
x Observable.ToTask
x Observable.ToEvent
System.Reactive.IEventSource`1
x Observable.ToEventPattern
System.Reactive.IEventPatternSource`1
- Observable.ToAsync
- Observable.ToListObservable
Flow Control
x Observable.Catch
x Observable.Finally
x Observable.Using
x Observable.OnErrorResumeNext
x Observable.Retry
Combining streams
Sequnetial Sequences
x Observable.Concat
x Observable.Repeat
x Observable.StartWith --ToBehaviorSubject (not really as no cache)
Concurrent Sequences
x Observable.Amb
x Observable.Merge
x Observable.Switch
Pairing Sequences
x Observable.CombineLatest
x Observable.Zip
x Observable.And
x Observable.Then
x Observable.When
Part 4 - Concurrency
Schedulers
x Observable.ObserveOn
x Observable.SubscribeOn
x Scheduler.get_CurrentThread
x Scheduler.get_Immediate
x Scheduler.get_NewThread
x Scheduler.get_Now
x Scheduler.get_ThreadPool
Scheduler.Normalize
x Scheduler.Schedule
DispatcherObservable.ObserveOn
DispatcherObservable.ObserveOnDispatcher
DispatcherObservable.SubscribeOn
DispatcherObservable.SubscribeOnDispatcher
x DispatcherScheduler.Instance
x System.Reactive.Linq.DispatcherObservable
x Recursive Schedule
x State Scheduler
x DateTime/TimeSpan schedule
x Combos of above.
**_Cost of slow subscribers. see LeavingTheMonadExamples.Slow_consumer_spike
x System.Reactive.Concurrency.CurrentThreadScheduler
x System.Reactive.Concurrency.DispatcherScheduler
x System.Reactive.Concurrency.EventLoopScheduler
System.Reactive.Concurrency.HistoricalScheduler
System.Reactive.Concurrency.HistoricalSchedulerBase
x System.Reactive.Concurrency.ImmediateScheduler
System.Reactive.Concurrency.IScheduledItem`1
x System.Reactive.Concurrency.IScheduler
x System.Reactive.Concurrency.NewThreadScheduler
x System.Reactive.Concurrency.Scheduler
System.Reactive.Concurrency.SynchronizationContextScheduler
x System.Reactive.Concurrency.ThreadPoolScheduler
System.Reactive.Concurrency.VirtualTimeScheduler`2
System.Reactive.Concurrency.VirtualTimeSchedulerBase`2
System.Reactive.Disposables.ScheduledDisposable
Time Shifted Sequences
x Observable.Buffer
x Observable.Delay
x Observable.Sample
x Observable.Throttle
Observable.Timeout
Observable.GroupByUntil
Observable.Merge reprise(has options to take schedulers too)
Hot and Cold
x Observable.Publish
x Connect
x Observable.RefCount
x Sharing streams
x Replay
x PublishLast --ToAsyncSubject
x Multicast
x System.Reactive.Subjects.IConnectableObservable`1
x System.Reactive.Disposables.RefCountDisposable
Observable.Synchronize
Observable.Defer
Testing
ReactiveAssert.AreElementsEqual
ReactiveAssert.Throws
ReactiveTest.OnCompleted
ReactiveTest.OnError
ReactiveTest.OnNext
ReactiveTest.Subscribe
x TestScheduler.Start()
x TestScheduler.Stop()
x TestScheduler.AdvanceTo()
x TestScheduler.AdvanceBy()
x TestScheduler.Start(Func<IO<T>, long, long, long)
x TestScheduler.CreateColdObservable()
x TestScheduler.CreateHotObservable()
x TestScheduler.CreateHotObservable()
Microsoft.Reactive.Testing.ITestableObservable`1
Microsoft.Reactive.Testing.ITestableObserver`1
Microsoft.Reactive.Testing.ReactiveAssert
Microsoft.Reactive.Testing.ReactiveTest
Microsoft.Reactive.Testing.Recorded`1
Microsoft.Reactive.Testing.Subscription
x Microsoft.Reactive.Testing.TestScheduler
Join, Window and Coinciding events
x Observable.Window
x Observable.Join
x Observable.GroupJoin
Coincidence
Events that have duration are windows eg Server is up, person is room, button is pressed (and not yet released)
Windows that overlap are windows can be said to coincide. This gives us the term Windows of Conincidence
Create windows with self, Skip(1), Never, Timer
System.Reactive.Joins.Pattern
System.Reactive.Joins.Pattern`2
System.Reactive.Joins.Pattern`3
System.Reactive.Joins.Pattern`4
System.Reactive.Joins.Plan`1
Appendix A - Dispelling myths about .NET
Dispelling myths about Events
Events are just syntactic implementation of the observer pattern
Events are multicast
Events are single threaded.
Event handlers that throw act just like any other code that throws.
ie other handlers wont be called
Raising the event can be wrapped in a try catch
Note on WPF/SL Property Changed handlers.
Dispelling myths about concurrency
Concurrency does not imply multi threaded
Message pumps like WinForms, WPF and SL
But Multithreaded does imply concurrency
ThreadPool is not a solve all solution
Creating threads is expensive - compared to what?
WPF dispatcher calls like Dispatcher.Invoke/BeginInvoke(Background..) are performed on the background thread.
Dispatcher calls ar free try calling 10k notifys
-TO BE allocated-
EventPattern`1.op_Equality
EventPattern`1.op_Inequality
EventPattern`2.op_Equality
EventPattern`2.op_Inequality
Observer.AsObserver
Observer.Create
Observer.NotifyOn
Observer.Synchronize
Observer.ToNotifier
Observer.ToObserver
Recorded`1.op_Equality
Recorded`1.op_Inequality
Subject.Synchronize
Subscription.op_Equality
Subscription.op_Inequality
TimeInterval`1.op_Equality
TimeInterval`1.op_Inequality
Timestamped`1.op_Equality
Timestamped`1.op_Inequality
-----------------------------------------------------------------
Once all is said and done:
Update Rx Wiki
-----------------------------------------------------------------
Version 2 TODO
To Enumerator operators
ToEnumertor
Latest
Next
MostRecent
AsyncObservable
await
Cookbook/LinqPad Samples
Conflation
Finance/Games/UI updates
Streaming data from a stream to an IOb
Avoiding the use of subjects
Rx in WPF
INPC to IOb
DO prop change to IOb
Collection changes
SchedulerProvider revisited.
------------------------------------------------------------------------------
Amazon.co.uk snippets
<!--C# in a nutshell 5.0 (Kindle) Amazon.co.uk-->
<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&o=2&p=8&l=as1&asins=B008E6I1K8&ref=qf_sp_asin_til&fc1=000000&IS2=1&lt1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr"
style="width:120px;height:240px;margin: 10px"
scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
</div>
<!--C# Linq pocket reference Amazon.co.uk-->
<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&o=2&p=8&l=as1&asins=0596519249&ref=qf_sp_asin_til&fc1=000000&IS2=1<1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr"
style="width:120px;height:240px;margin: 10px"
scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
</div>
<!--CLR via C# v4 (Kindle) Amazon.co.uk-->
<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&o=2&p=8&l=as1&asins=B00AA36R4U&ref=qf_sp_asin_til&fc1=000000&IS2=1&lt1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr"
style="width:120px;height:240px;"
scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
</div>
<!--Real-world functional programming Amazon.co.uk-->
<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&o=2&p=8&l=as1&asins=1933988924&ref=qf_sp_asin_til&fc1=000000&IS2=1<1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr"
style="width:120px;height:240px;margin: 10px"
scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
</div>
<!--Purely functional data structures Amazon.co.uk-->
<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&o=2&p=8&l=as1&asins=0521663504&ref=qf_sp_asin_til&fc1=000000&IS2=1&lt1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr"
style="width:120px;height:240px;margin: 10px"
scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
</div>
<!--Essential Linq Amazon.co.uk-->
<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&o=2&p=8&l=as1&asins=B001XT616O&ref=qf_sp_asin_til&fc1=000000&IS2=1<1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr"
style="width:120px;height:240px;"
scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
</div>
<!--Head First Design Patterns (Kindle) Amazon.co.uk-->
<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&o=2&p=8&l=as1&asins=B00AA36RZY&ref=qf_sp_asin_til&fc1=000000&IS2=1&lt1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr"
style="width:120px;height:240px;"
scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
</div>
<!--Design Patterns (Kindle) Amazon.co.uk-->
<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&o=2&p=8&l=as1&asins=B000SEIBB8&ref=qf_sp_asin_til&fc1=000000&IS2=1&lt1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr"
style="width:120px;height:240px;"
scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
</div>
<!--Clean Code (Kindle) Amazon.co.uk-->
<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&o=2&p=8&l=as1&asins=0132350882&ref=qf_sp_asin_til&fc1=000000&IS2=1&lt1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr"
style="width:120px;height:240px;"
scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
</div>
<!--C# 3.0 Design Patterns (Kindle) Amazon.co.uk-->
<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&o=2&p=8&l=as1&asins=B0043EWUAC&ref=qf_sp_asin_til&fc1=000000&IS2=1&lt1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr"
style="width:120px;height:240px;"
scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
</div>
<!--Domain Driven Design (Kindle) Amazon.co.uk-->
<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&o=2&p=8&l=as1&asins=B00794TAUG&ref=qf_sp_asin_til&fc1=000000&IS2=1&lt1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr"
style="width:120px;height:240px;"
scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
</div>
<!--Concurrent Programming on Windows: Architecture, Principles, and Patterns (Kindle) Amazon.co.uk-->
<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&o=2&p=8&l=as1&asins=B0015DYKI4&ref=qf_sp_asin_til&fc1=000000&IS2=1&lt1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr"
style="width:120px;height:240px;"
scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
</div>
<!--Parallel Programming with Microsoft® .NET: Design Patterns for Decomposition and Coordination on Multicore Architectures (Patterns & Practices) (Kindle) Amazon.co.uk-->
<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&o=2&p=8&l=as1&asins=B0043EWUG6&ref=qf_sp_asin_til&fc1=000000&IS2=1&lt1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr"
style="width:120px;height:240px;"
scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
</div>
<!--Art of Unit testing Amazon.co.uk-->
<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&o=2&p=8&l=as1&asins=1933988274&ref=qf_sp_asin_til&fc1=000000&IS2=1&lt1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr"
style="width:120px;height:240px;"
scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
</div>
<!--Test Driven development (By example) Amazon.co.uk-->
<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&o=2&p=8&l=as1&asins=0321146530&ref=qf_sp_asin_til&fc1=000000&IS2=1&lt1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr"
style="width:120px;height:240px;"
scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
</div>
<!--Refactoring (Kindle) Amazon.co.uk-->
<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&o=2&p=8&l=as1&asins=B007WTFWJ6&ref=qf_sp_asin_til&fc1=000000&IS2=1&lt1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr"
style="width:120px;height:240px;"
scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
</div>
<!--Framework Design Guidelines 2nd Edition (Kindle) Amazon.co.uk-->
<div style="display:inline-block; vertical-align: top; margin: 10px; width: 140px; font-size: 11px; text-align: center">
<iframe src="http://rcm-uk.amazon.co.uk/e/cm?t=int0b-21&o=2&p=8&l=as1&asins=B0017SWPNO&ref=qf_sp_asin_til&fc1=000000&IS2=1&lt1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr"
style="width:120px;height:240px;"
scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
</div>
--------------------------------------------------------------------------------------------
//From https://highlightjs.org/usage/
//Get custom cSharp only pack from https://highlightjs.org/download/
<link rel="stylesheet" href="..\WebSite\Styles\Site.css" type="text/css" />
<link rel="stylesheet" href="vs.css"> <!-- Visualstudio code style sheet for highlight.pack.js -->
<script src="highlight.cs.pack.js"></script> <!--Custom CSharp highlighter -->
<script>hljs.initHighlightingOnLoad();</script>
By using the bare min of
C:\Users\Lee\AppData\Local\Pandoc\pandoc.exe -o 17_SequencesOfCoincidence.html 17_SequencesOfCoincidence.md
so actually
&$pandocExePath -o $OutputPath $InputPath
i.e. no css, no -s (stand alone), then the title, css and other headers will not be created.
We will get just the raw content.
We are now free to wrap that content in what ever we need.
So we can still use the previous code to generate the side TOC, and potentially an Index too.