Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
THIRDCHANNEL @svpember
Hi.
First, A Quick Scenario
THIRDCHANNEL @svpember
Balance: $100
THIRDCHANNEL @svpember
Balance: -$100
THIRDCHANNEL @svpember
THIRDCHANNEL @svpember
THIRDCHANNEL @svpember
THIRDCHANNEL @svpember
THIRDCHANNEL @svpember
Richer Data History With Event
Sourcing
Steve Pember
CTO, ThirdChannel
gr8Conf US 2015
THIRDCHANNEL @svpember
Agenda
• Event Sourcing
• Event Sourcing Challenges
• Don’t Worry, ES Is Worth It
• Querying
• Impl...
What Is Event Sourcing?
THIRDCHANNEL @svpember
Event Sourcing
• Alternative Storage Pattern
THIRDCHANNEL @svpember
Instead, Store Facts
THIRDCHANNEL @svpember
THIRDCHANNEL @svpember
Event Sourcing
• Alternative Storage Pattern
• Series of Facts
• Aggregates << Events
Event: Something Which Has
Occurred In The System
Aggregate: The Object of Events’
Affections
THIRDCHANNEL @svpember
Event Sourcing
• Alternative Storage Pattern
• Series of Facts
• Aggregates << Events
• Purely Addi...
There is No Delete
THIRDCHANNEL @svpember
Full History of the Aggregates
THIRDCHANNEL @svpember
THIRDCHANNEL @svpember
Event Sourcing
• Alternative Storage Pattern
• Series of Facts
• Aggregates << Events
• Purely Addi...
THIRDCHANNEL @svpember
• snapshot photo
THIRDCHANNEL @svpember
THIRDCHANNEL @svpember
Event Sourcing
• Alternative Storage Pattern
• Series of Facts
• Aggregates << Events
• Purely Addi...
THIRDCHANNEL @svpember
THIRDCHANNEL @svpember
THIRDCHANNEL @svpember
THIRDCHANNEL @svpember
Event Sourcing
• Alternative Storage Pattern
• Series of Facts
• Aggregates << Events
• Purely Addi...
Objects are Transient Derivatives of Your
Events
THIRDCHANNEL @svpember
Event Sourcing
• Alternative Storage Pattern
• Series of Facts
• Aggregates << Events
• Purely Addi...
THIRDCHANNEL @svpember
THIRDCHANNEL @svpember
THIRDCHANNEL @svpember
Questions So Far?
• Events & Aggregates
• Snapshots
• Additive, loss-less model
• Transient Derivat...
THIRDCHANNEL @svpember
Agenda
• Event Sourcing
• Event Sourcing Challenges
“I Think I Get What You’re Laying
Down, But It Still Seems Bananas”
So much work!
“That’s gotta be a ton of Resource overhead”
“Where’d my Models go? I can’t live without my
MVC!”
THIRDCHANNEL @svpember
Event Sourcing Challenges
• Additional Work To Apply
• Additional CPU Processing
• Non-Traditional ...
THIRDCHANNEL @svpember
Event Sourcing Challenges
• Additional Work To Apply
• Additional CPU Processing
• Non-Traditional ...
THIRDCHANNEL @svpember
THIRDCHANNEL @svpember
Event Sourcing Challenges
• Additional Work To Apply
• Additional CPU Processing
• Non-Traditional ...
Make Use of @Transactional Code
THIRDCHANNEL @svpember
Event Sourcing Challenges
• Additional Work To Apply
• Additional CPU Processing
• Non-Traditional ...
So Why Use ES?
THIRDCHANNEL @svpember
Agenda
• Event Sourcing
• Event Sourcing Challenges
• Don’t Worry, ES Is Worth It
THIRDCHANNEL @svpember
Why Event Sourcing
• More Than an Audit Log
Audit Logs Tell the History
Events Tell the Intent of History
ES is also a perfect Audit Log
THIRDCHANNEL @svpember
Why Event Sourcing
• More Than an Audit Log
• Data Storage is Inexpensive
THIRDCHANNEL @svpember
Why Event Sourcing
• More Than an Audit Log
• Data Storage is Inexpensive
• Used By All Long-Runnin...
THIRDCHANNEL @svpember
All Business Problems Can Be Modeled With
Event Sourcing
THIRDCHANNEL @svpember
Why Event Sourcing
• More Than an Audit Log
• Data Storage is Inexpensive
• Used By All Long-Runnin...
Remember: There Is No Delete
THIRDCHANNEL @svpember
Why Event Sourcing
• More Than an Audit Log
• Data Storage is Inexpensive
• Used By All Long-Runnin...
Unit Test Events, Assert In Integration Tests
Time Travel Eases Debugging
THIRDCHANNEL @svpember
THIRDCHANNEL @svpember
THIRDCHANNEL @svpember
THIRDCHANNEL @svpember
THIRDCHANNEL @svpember
THIRDCHANNEL @svpember
THIRDCHANNEL @svpember
Why Event Sourcing
• More Than an Audit Log
• Data Storage is Inexpensive
• Used By All Long-Runnin...
Future-Proof your Data
THIRDCHANNEL @svpember
But With Event Sourcing…
–Johnny Appleseed
“Type a quote here.”
THIRDCHANNEL @svpember
Current State is a Projection
A 3C Example
THIRDCHANNEL @svpember
Still…
THIRDCHANNEL @svpember
THIRDCHANNEL @svpember
Have you ever built?
• Versioning of objects
• An ‘undo’ action
• Audit Log
• Tracking object value...
THIRDCHANNEL @svpember
Agenda
• Event Sourcing
• Event Sourcing Challenges
• Don’t Worry, ES Is Worth It
• Querying
THIRDCHANNEL @svpember
Querying Events
• All Queries are Projections, including Current State
THIRDCHANNEL @svpember
Querying Events
• All Queries are Projections, including Current State
• Returning Current State is...
THIRDCHANNEL @svpember
THIRDCHANNEL @svpember
Querying Events
• All Queries are Projections, including Current State
• Returning Current State is...
THIRDCHANNEL @svpember
THIRDCHANNEL @svpember
Querying Events
• All Queries are Projections, including Current State
• Returning Current State is...
THIRDCHANNEL @svpember
Use Streams to Filter Events in Code
THIRDCHANNEL @svpember
THIRDCHANNEL @svpember
Querying Events
• All Queries are Projections, including Current State
• Returning Current State is...
THIRDCHANNEL @svpember
THIRDCHANNEL @svpember
Agenda
• Event Sourcing
• Event Sourcing Challenges
• Don’t Worry, ES Is Worth It
• Querying
• Impl...
THIRDCHANNEL @svpember
Implementation (Theory)
• Simple Base Objects
Three Base Objects
THIRDCHANNEL @svpember
THIRDCHANNEL @svpember
Past-Tense Event Names
THIRDCHANNEL @svpember
THIRDCHANNEL @svpember
Implementation (Theory)
• Simple Base Objects
• Aggregate and Event SubClasses Have Transient Prope...
THIRDCHANNEL @svpember
THIRDCHANNEL @svpember
THIRDCHANNEL @svpember
Implementation (Theory)
• Simple Base Objects
• Aggregate and Event SubClasses Have Transient Prope...
Events Modify Aggregates
THIRDCHANNEL @svpember
Implementation (Theory)
• Simple Base Objects
• Aggregate and Event SubClasses Have Transient Prope...
THIRDCHANNEL @svpember
THIRDCHANNEL @svpember
Implementation (Theory)
• Simple Base Objects
• Aggregate and Event SubClasses Have Transient Prope...
THIRDCHANNEL @svpember
Agenda
• Event Sourcing
• Event Sourcing Challenges
• Don’t Worry, ES Is Worth It
• Querying
• Impl...
THIRDCHANNEL @svpember
Implementation (Reality)
• Snapshot Rarely
THIRDCHANNEL @svpember
Implementation (Reality)
• Snapshot Rarely
• ‘Pure’ Event Sourcing is tough to work with
THIRDCHANNEL @svpember
THIRDCHANNEL @svpember
Implementation (Reality)
• Snapshot Rarely
• ‘Pure’ Event Sourcing is tough to work with
• 2 Altern...
THIRDCHANNEL @svpember
Sync
THIRDCHANNEL @svpember
Plus so much more (I could talk all
day about ES)
THIRDCHANNEL @svpember
Agenda
• Event Sourcing
• Event Sourcing Challenges
• Don’t Worry, ES Is Worth It
• Querying
• Impl...
THIRDCHANNEL @svpember
Event Source Libraries
• No Real Need for an ORM
THIRDCHANNEL @svpember
Event Sourcing Libraries
• No Real Need for an ORM
• Akka Persistence (JVM)
THIRDCHANNEL @svpember
Persistence & Event Storage
• No Real Need for an ORM
• Akka Persistence (JVM)
• Database Agnostic
THIRDCHANNEL @svpember
THIRDCHANNEL @svpember
THIRDCHANNEL @svpember
THIRDCHANNEL @svpember
Questions?
THIRDCHANNEL @svpember
Agenda
• Event Sourcing
• Event Sourcing Challenges
• Don’t Worry, ES Is Worth It
• Querying
• Impl...
Demo Time!
THIRDCHANNEL @svpember
In Summary
Event Sourcing -> Additive Only,
Lossless. Can Be Tricky To Work With
Not for your Mom’s Blog
Thank You!
THIRDCHANNEL @svpember
Any Questions?
Steve Pember
@svpember
www.thirdchannel.com
THIRDCHANNEL @svpember
More on Event Sourcing
• ThirdChannel Event Source Library (Java): https://github.com/RSV2/eventsou...
THIRDCHANNEL @svpember
Image Credits
• BOA: http://marketmadhouse.com/wp-content/uploads/2014/11/BofA.jpg
• Khaaaaan: http...
Gr8conf US 2015 - Intro to Event Sourcing with Groovy
Gr8conf US 2015 - Intro to Event Sourcing with Groovy
Gr8conf US 2015 - Intro to Event Sourcing with Groovy
Gr8conf US 2015 - Intro to Event Sourcing with Groovy
Gr8conf US 2015 - Intro to Event Sourcing with Groovy
Gr8conf US 2015 - Intro to Event Sourcing with Groovy
Gr8conf US 2015 - Intro to Event Sourcing with Groovy
Gr8conf US 2015 - Intro to Event Sourcing with Groovy
Gr8conf US 2015 - Intro to Event Sourcing with Groovy
Gr8conf US 2015 - Intro to Event Sourcing with Groovy
Gr8conf US 2015 - Intro to Event Sourcing with Groovy
Gr8conf US 2015 - Intro to Event Sourcing with Groovy
Gr8conf US 2015 - Intro to Event Sourcing with Groovy
Gr8conf US 2015 - Intro to Event Sourcing with Groovy
Upcoming SlideShare
Loading in …5
×

Gr8conf US 2015 - Intro to Event Sourcing with Groovy

1,500 views

Published on

As Grails developers we generally build systems where our data is directly linked to the current state of our application; one row in the database equates to one entity’s current state. Only ever knowing the current state of the data is adequate for many systems, but imagine the possibilities if one had access to the state of the data at any point in time.

Enter Event Sourcing: instead of persisting the current state of our Domain Objects, we store historical events about our data. This pattern changes how we store and process our data, but is surprisingly lightweight and performant. In this talk I will present the basic concepts of Event Sourcing and the positive effects it can have on analytics and performance. We’ll see how naturally it couples with the Event-oriented world of modern Reactive systems, and how easily it can be implemented in Groovy. We’ll examine some practical use cases and example implementations. Event Sourcing will change how you think about your data.

Published in: Software
  • Be the first to comment

Gr8conf US 2015 - Intro to Event Sourcing with Groovy

  1. 1. THIRDCHANNEL @svpember Hi.
  2. 2. First, A Quick Scenario
  3. 3. THIRDCHANNEL @svpember Balance: $100
  4. 4. THIRDCHANNEL @svpember Balance: -$100
  5. 5. THIRDCHANNEL @svpember
  6. 6. THIRDCHANNEL @svpember
  7. 7. THIRDCHANNEL @svpember
  8. 8. THIRDCHANNEL @svpember
  9. 9. THIRDCHANNEL @svpember Richer Data History With Event Sourcing Steve Pember CTO, ThirdChannel gr8Conf US 2015
  10. 10. THIRDCHANNEL @svpember Agenda • Event Sourcing • Event Sourcing Challenges • Don’t Worry, ES Is Worth It • Querying • Implementation (Theory) • Implementation (For Real) • Any Tools Available? • Demo (Hopefully)
  11. 11. What Is Event Sourcing?
  12. 12. THIRDCHANNEL @svpember Event Sourcing • Alternative Storage Pattern
  13. 13. THIRDCHANNEL @svpember
  14. 14. Instead, Store Facts
  15. 15. THIRDCHANNEL @svpember
  16. 16. THIRDCHANNEL @svpember Event Sourcing • Alternative Storage Pattern • Series of Facts • Aggregates << Events
  17. 17. Event: Something Which Has Occurred In The System
  18. 18. Aggregate: The Object of Events’ Affections
  19. 19. THIRDCHANNEL @svpember Event Sourcing • Alternative Storage Pattern • Series of Facts • Aggregates << Events • Purely Additive
  20. 20. There is No Delete
  21. 21. THIRDCHANNEL @svpember
  22. 22. Full History of the Aggregates
  23. 23. THIRDCHANNEL @svpember
  24. 24. THIRDCHANNEL @svpember Event Sourcing • Alternative Storage Pattern • Series of Facts • Aggregates << Events • Purely Additive • Optimization: Snapshots
  25. 25. THIRDCHANNEL @svpember • snapshot photo
  26. 26. THIRDCHANNEL @svpember
  27. 27. THIRDCHANNEL @svpember Event Sourcing • Alternative Storage Pattern • Series of Facts • Aggregates << Events • Purely Additive • Optimization: Snapshots • Example: Shopping Cart
  28. 28. THIRDCHANNEL @svpember
  29. 29. THIRDCHANNEL @svpember
  30. 30. THIRDCHANNEL @svpember
  31. 31. THIRDCHANNEL @svpember Event Sourcing • Alternative Storage Pattern • Series of Facts • Aggregates << Events • Purely Additive • Optimization: Snapshots • Example: Shopping Cart • Transient Objects
  32. 32. Objects are Transient Derivatives of Your Events
  33. 33. THIRDCHANNEL @svpember Event Sourcing • Alternative Storage Pattern • Series of Facts • Aggregates << Events • Purely Additive • Optimization: Snapshots • Example: Shopping Cart • Transient Objects • Natural
  34. 34. THIRDCHANNEL @svpember
  35. 35. THIRDCHANNEL @svpember
  36. 36. THIRDCHANNEL @svpember Questions So Far? • Events & Aggregates • Snapshots • Additive, loss-less model • Transient Derivatives
  37. 37. THIRDCHANNEL @svpember Agenda • Event Sourcing • Event Sourcing Challenges
  38. 38. “I Think I Get What You’re Laying Down, But It Still Seems Bananas”
  39. 39. So much work!
  40. 40. “That’s gotta be a ton of Resource overhead”
  41. 41. “Where’d my Models go? I can’t live without my MVC!”
  42. 42. THIRDCHANNEL @svpember Event Sourcing Challenges • Additional Work To Apply • Additional CPU Processing • Non-Traditional Concept of Models
  43. 43. THIRDCHANNEL @svpember Event Sourcing Challenges • Additional Work To Apply • Additional CPU Processing • Non-Traditional Concept of Models • More Storage Required VS non-ES
  44. 44. THIRDCHANNEL @svpember
  45. 45. THIRDCHANNEL @svpember Event Sourcing Challenges • Additional Work To Apply • Additional CPU Processing • Non-Traditional Concept of Models • More Storage Required VS non-ES • Reduced Database Level Constraints
  46. 46. Make Use of @Transactional Code
  47. 47. THIRDCHANNEL @svpember Event Sourcing Challenges • Additional Work To Apply • Additional CPU Processing • Non-Traditional Concept of Models • More Storage Required VS non-ES • Reduced Transactions / Database Level Constraints • May Be Confusing For Junior Engineers
  48. 48. So Why Use ES?
  49. 49. THIRDCHANNEL @svpember Agenda • Event Sourcing • Event Sourcing Challenges • Don’t Worry, ES Is Worth It
  50. 50. THIRDCHANNEL @svpember Why Event Sourcing • More Than an Audit Log
  51. 51. Audit Logs Tell the History Events Tell the Intent of History
  52. 52. ES is also a perfect Audit Log
  53. 53. THIRDCHANNEL @svpember Why Event Sourcing • More Than an Audit Log • Data Storage is Inexpensive
  54. 54. THIRDCHANNEL @svpember Why Event Sourcing • More Than an Audit Log • Data Storage is Inexpensive • Used By All Long-Running Businesses
  55. 55. THIRDCHANNEL @svpember
  56. 56. All Business Problems Can Be Modeled With Event Sourcing
  57. 57. THIRDCHANNEL @svpember Why Event Sourcing • More Than an Audit Log • Data Storage is Inexpensive • Used By All Long-Running Businesses • Only Structural Model That Does Not Lose Information
  58. 58. Remember: There Is No Delete
  59. 59. THIRDCHANNEL @svpember Why Event Sourcing • More Than an Audit Log • Data Storage is Inexpensive • Used By All Long-Running Businesses • Only Structural Model That Does Not Lose Information • Simplified Testing and Debugging
  60. 60. Unit Test Events, Assert In Integration Tests
  61. 61. Time Travel Eases Debugging
  62. 62. THIRDCHANNEL @svpember
  63. 63. THIRDCHANNEL @svpember
  64. 64. THIRDCHANNEL @svpember
  65. 65. THIRDCHANNEL @svpember
  66. 66. THIRDCHANNEL @svpember
  67. 67. THIRDCHANNEL @svpember
  68. 68. THIRDCHANNEL @svpember Why Event Sourcing • More Than an Audit Log • Data Storage is Inexpensive • Used By All Long-Running Businesses • Only Structural Model That Does Not Lose Information • Simplified Testing and Debugging • Ideal for Business Analysis
  69. 69. Future-Proof your Data
  70. 70. THIRDCHANNEL @svpember
  71. 71. But With Event Sourcing…
  72. 72. –Johnny Appleseed “Type a quote here.”
  73. 73. THIRDCHANNEL @svpember
  74. 74. Current State is a Projection
  75. 75. A 3C Example
  76. 76. THIRDCHANNEL @svpember
  77. 77. Still…
  78. 78. THIRDCHANNEL @svpember
  79. 79. THIRDCHANNEL @svpember Have you ever built? • Versioning of objects • An ‘undo’ action • Audit Log • Tracking object value changes over time? • Time series?
  80. 80. THIRDCHANNEL @svpember Agenda • Event Sourcing • Event Sourcing Challenges • Don’t Worry, ES Is Worth It • Querying
  81. 81. THIRDCHANNEL @svpember Querying Events • All Queries are Projections, including Current State
  82. 82. THIRDCHANNEL @svpember Querying Events • All Queries are Projections, including Current State • Returning Current State is Easy
  83. 83. THIRDCHANNEL @svpember
  84. 84. THIRDCHANNEL @svpember Querying Events • All Queries are Projections, including Current State • Returning Current State is Easy • Other Projections Can Be Tough, use a Read Model
  85. 85. THIRDCHANNEL @svpember
  86. 86. THIRDCHANNEL @svpember Querying Events • All Queries are Projections, including Current State • Returning Current State is Easy • Other Projections Can Be Tough • Try Reactive Streams
  87. 87. THIRDCHANNEL @svpember
  88. 88. Use Streams to Filter Events in Code
  89. 89. THIRDCHANNEL @svpember
  90. 90. THIRDCHANNEL @svpember Querying Events • All Queries are Projections, including Current State • Returning Current State is Easy • Other Projections Can Be Tough • Try Reactive Streams • Initial Projection Work May Require Dev Time
  91. 91. THIRDCHANNEL @svpember
  92. 92. THIRDCHANNEL @svpember Agenda • Event Sourcing • Event Sourcing Challenges • Don’t Worry, ES Is Worth It • Querying • Implementation (Theory)
  93. 93. THIRDCHANNEL @svpember Implementation (Theory) • Simple Base Objects
  94. 94. Three Base Objects
  95. 95. THIRDCHANNEL @svpember
  96. 96. THIRDCHANNEL @svpember
  97. 97. Past-Tense Event Names
  98. 98. THIRDCHANNEL @svpember
  99. 99. THIRDCHANNEL @svpember Implementation (Theory) • Simple Base Objects • Aggregate and Event SubClasses Have Transient Properties
  100. 100. THIRDCHANNEL @svpember
  101. 101. THIRDCHANNEL @svpember
  102. 102. THIRDCHANNEL @svpember Implementation (Theory) • Simple Base Objects • Aggregate and Event SubClasses Have Transient Properties • Aggregates Receive and Play Events
  103. 103. Events Modify Aggregates
  104. 104. THIRDCHANNEL @svpember Implementation (Theory) • Simple Base Objects • Aggregate and Event SubClasses Have Transient Properties • Aggregates Receive and Play Events • Aggregates Require Distinction Between New and Historical Changes
  105. 105. THIRDCHANNEL @svpember
  106. 106. THIRDCHANNEL @svpember Implementation (Theory) • Simple Base Objects • Aggregate and Event SubClasses Have Transient Properties • Aggregates Receive and Play Events • Aggregates Require Distinction Between New and Historical Changes • Event Service Layer Required
  107. 107. THIRDCHANNEL @svpember Agenda • Event Sourcing • Event Sourcing Challenges • Don’t Worry, ES Is Worth It • Querying • Implementation (Theory) • Implementation (Reality)
  108. 108. THIRDCHANNEL @svpember Implementation (Reality) • Snapshot Rarely
  109. 109. THIRDCHANNEL @svpember Implementation (Reality) • Snapshot Rarely • ‘Pure’ Event Sourcing is tough to work with
  110. 110. THIRDCHANNEL @svpember
  111. 111. THIRDCHANNEL @svpember Implementation (Reality) • Snapshot Rarely • ‘Pure’ Event Sourcing is tough to work with • 2 Alternatives
  112. 112. THIRDCHANNEL @svpember Sync
  113. 113. THIRDCHANNEL @svpember
  114. 114. Plus so much more (I could talk all day about ES)
  115. 115. THIRDCHANNEL @svpember Agenda • Event Sourcing • Event Sourcing Challenges • Don’t Worry, ES Is Worth It • Querying • Implementation (Theory) • Implementation (For Real) • Any Tools Available?
  116. 116. THIRDCHANNEL @svpember Event Source Libraries • No Real Need for an ORM
  117. 117. THIRDCHANNEL @svpember Event Sourcing Libraries • No Real Need for an ORM • Akka Persistence (JVM)
  118. 118. THIRDCHANNEL @svpember Persistence & Event Storage • No Real Need for an ORM • Akka Persistence (JVM) • Database Agnostic
  119. 119. THIRDCHANNEL @svpember
  120. 120. THIRDCHANNEL @svpember
  121. 121. THIRDCHANNEL @svpember
  122. 122. THIRDCHANNEL @svpember Questions?
  123. 123. THIRDCHANNEL @svpember Agenda • Event Sourcing • Event Sourcing Challenges • Don’t Worry, ES Is Worth It • Querying • Implementation (Theory) • Implementation (For Real) • Any Tools Available? • Demo?
  124. 124. Demo Time!
  125. 125. THIRDCHANNEL @svpember
  126. 126. In Summary
  127. 127. Event Sourcing -> Additive Only, Lossless. Can Be Tricky To Work With
  128. 128. Not for your Mom’s Blog
  129. 129. Thank You!
  130. 130. THIRDCHANNEL @svpember Any Questions? Steve Pember @svpember www.thirdchannel.com
  131. 131. THIRDCHANNEL @svpember More on Event Sourcing • ThirdChannel Event Source Library (Java): https://github.com/RSV2/eventsource • Demo App: https://github.com/spember/event-source-demo • “Event Sourcing” (Martin Fowler): http://martinfowler.com/eaaDev/EventSourcing.html • Event Store & “Event Sourcing Basics”: http://docs.geteventstore.com/introduction/event-sourcing-basics/ • Event Sourcing presentation by Greg Young: https://www.youtube.com/watch?v=JHGkaShoyNs
  132. 132. THIRDCHANNEL @svpember Image Credits • BOA: http://marketmadhouse.com/wp-content/uploads/2014/11/BofA.jpg • Khaaaaan: http://d1oi7t5trwfj5d.cloudfront.net/38/0d9b80ae5311e1bcc4123138165f92/file/5-things-you-might-not-know-about-star-trek-ii-wrath-of-khan-30th-anniversary.jpg • tribbles: http://de.memory-alpha.org/wiki/Tribble • bank ledger: http://www.iowall.net/accounting-ledger-book.html • ORM: https://guides.codepath.com/android/ActiveAndroid-Guide • hoarders: http://www.aetv.com/hoarders • snapshot stream: https://geteventstore.com/ • office space bobs: http://galleryhip.com/office-space-bobs.html • Nye, Obama, Tyson photo: http://en.wikipedia.org/wiki/Selfie • Printing Press: http://www.directindustry.com/prod/koenig-bauer-ag/offset-printing-presses-high-volume-40462-602574.html

×