{"id":3421,"date":"2016-12-17T21:31:27","date_gmt":"2016-12-18T05:31:27","guid":{"rendered":"[vc_row type=\"in_container\" scene_position=\"center\" text_color=\"dark\" text_align=\"left\" overlay_strength=\"0.3\"][vc_column column_padding=\"no-extra-padding\" column_padding_position=\"all\" background_color_opacity=\"1\" background_hover_color_opacity=\"1\" width"},"modified":"2017-01-02T13:36:45","modified_gmt":"2017-01-02T21:36:45","slug":"confoo-day-2","status":"publish","type":"post","link":"https:\/\/logmyhours.com\/blog\/confoo-day-2\/","title":{"rendered":"ConFoo: Day 2"},"content":{"rendered":"[vc_row type=&#8221;in_container&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; overlay_strength=&#8221;0.3&#8243;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_position=&#8221;all&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; width=&#8221;1\/1&#8243;][vc_column_text]My experiences at confoo day 2[\/vc_column_text][\/vc_column][\/vc_row][vc_row type=&#8221;in_container&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; overlay_strength=&#8221;0.3&#8243;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_position=&#8221;all&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; width=&#8221;1\/1&#8243;]<div class=\"lvca-heading lvca-style3 lvca-aligncenter \" ><h3 class=\"lvca-title\">5 Unit Testing Facts I Wish I\u2019d Known 7 Years Ago - Dror Helper<\/h3><\/div>[vc_row_inner][vc_column_inner column_padding=&#8221;no-extra-padding&#8221; column_padding_position=&#8221;all&#8221; background_color_opacity=&#8221;1&#8243; width=&#8221;1\/4&#8243;][image_with_animation image_url=&#8221;3455&#8243; alignment=&#8221;&#8221; animation=&#8221;Fade In&#8221;][\/vc_column_inner][vc_column_inner column_padding=&#8221;no-extra-padding&#8221; column_padding_position=&#8221;all&#8221; background_color_opacity=&#8221;1&#8243; width=&#8221;3\/4&#8243;][vc_column_text]&#8221;I started using unit tests eight years ago and failed miserably. It took me two years and the right company to start over and learn how to properly use unit tests and TDD as development tools. But it wasn\u2019t always clear sailing. As I progressed, I found more than my fair share of pitfalls and blind alleys, as well as a fair amount of success. In this talk, I\u2019ll cover the essential facts I learned over the years about unit testing.&#8221;<\/p>\n<p><a href=\"https:\/\/confoo.ca\/en\/yvr2016\/session\/5-unit-testing-fact-i-wish-i-know-7-years-ago\">ConFoo Page<\/a>[\/vc_column_text][\/vc_column_inner][\/vc_row_inner][vc_row_inner][vc_column_inner column_padding=&#8221;no-extra-padding&#8221; column_padding_position=&#8221;all&#8221; background_color_opacity=&#8221;1&#8243; width=&#8221;1\/2&#8243;][vc_column_text]\n<h3><span class=\"ez-toc-section\" id=\"My_Notes\"><\/span>My Notes<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ol>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Have the right environment<\/span>\n<ol>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Build server &amp; Dev machines<\/span><\/li>\n<\/ol>\n<\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Class != Unit<\/span>\n<ol>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Unit of work is a undefined abstract &#8211; no good definition<\/span><\/li>\n<\/ol>\n<\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Not all tests are unit tests<\/span>\n<ol>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Integration tests -&gt; test system wide functions<\/span><\/li>\n<\/ol>\n<\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Code duplication is ok (usually)<\/span>\n<ol>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Readability &gt; DRY<\/span><\/li>\n<\/ol>\n<\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Unit testing is not about writing tests<\/span>\n<ol>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Understand why a test failed<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Find out how to fix the problem<\/span><\/li>\n<\/ol>\n<\/li>\n<\/ol>\n[\/vc_column_text][\/vc_column_inner][vc_column_inner column_padding=&#8221;no-extra-padding&#8221; column_padding_position=&#8221;all&#8221; background_color_opacity=&#8221;1&#8243; width=&#8221;1\/2&#8243;][image_with_animation image_url=&#8221;3465&#8243; alignment=&#8221;&#8221; animation=&#8221;Fade In&#8221;][\/vc_column_inner][\/vc_row_inner][\/vc_column][\/vc_row][vc_row type=&#8221;in_container&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; overlay_strength=&#8221;0.3&#8243;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_position=&#8221;all&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; width=&#8221;1\/1&#8243;]<div class=\"lvca-heading lvca-style3 lvca-aligncenter \" ><h3 class=\"lvca-title\">High Value Apps are Moving to the Desktop - Boris Mann<\/h3><\/div>[vc_row_inner][vc_column_inner column_padding=&#8221;no-extra-padding&#8221; column_padding_position=&#8221;all&#8221; background_color_opacity=&#8221;1&#8243; width=&#8221;1\/4&#8243;][image_with_animation image_url=&#8221;3454&#8243; alignment=&#8221;&#8221; animation=&#8221;Fade In&#8221;][\/vc_column_inner][vc_column_inner column_padding=&#8221;no-extra-padding&#8221; column_padding_position=&#8221;all&#8221; background_color_opacity=&#8221;1&#8243; width=&#8221;3\/4&#8243;][vc_column_text]&#8221;Developers, designers and others whose day job is spent using a professional desktop operating system are demanding more than having their apps trapped in browser tabs. We&#8217;ll talk about how high value apps such as Slack, Microsoft Visual Studio Code, Brave browser are using web technologies but run on the desktop. We&#8217;ll talk a bit about the tech (Electron.js and friends) but the focus will be on the usability, value, and what this trend means.&#8221;<\/p>\n<p><a href=\"https:\/\/confoo.ca\/en\/yvr2016\/session\/high-value-apps-are-moving-to-the-desktop\">ConFoo Page<\/a>[\/vc_column_text][\/vc_column_inner][\/vc_row_inner][vc_row_inner][vc_column_inner column_padding=&#8221;no-extra-padding&#8221; column_padding_position=&#8221;all&#8221; background_color_opacity=&#8221;1&#8243; width=&#8221;1\/2&#8243;][vc_column_text]\n<h3><span class=\"ez-toc-section\" id=\"My_Notes-2\"><\/span>My Notes<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p><span style=\"font-weight: 400;\">Using electron to build native desktop apps. Slack, \u00a0Visual studios Code.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">High Value apps lost in tabs<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Why?<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Focus: alt tab<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Capabilities: access native desktop functionality &#8211; shortcuts notifications, menu bar, spotlight<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Convenience: from menu bar to \u201calways there\u201d<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">Electron created by github for atom.io editor.<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Automatic updates<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Native menus &amp; notifications<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">App Crash reporting<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Debugging &amp; profiling<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Windows installer<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">Quip wiki\/note taking app<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Chromium + nodejs + native APIs = Electron<\/span><\/p>\n<p><span style=\"font-weight: 400;\">How is it not like webdev<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Targeting only a single browser &#8211; the latest version of chromium<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Can have all assets and code locally<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Or mix and match local(large!) assets and remote api calls and assets<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">In many ways, a more controlled environment<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Keytar for storing keys, hashed<\/span><\/li>\n<\/ul>\n[\/vc_column_text][\/vc_column_inner][vc_column_inner column_padding=&#8221;no-extra-padding&#8221; column_padding_position=&#8221;all&#8221; background_color_opacity=&#8221;1&#8243; width=&#8221;1\/2&#8243;][image_with_animation image_url=&#8221;3466&#8243; alignment=&#8221;&#8221; animation=&#8221;Fade In&#8221;][\/vc_column_inner][\/vc_row_inner][\/vc_column][\/vc_row][vc_row type=&#8221;in_container&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; overlay_strength=&#8221;0.3&#8243;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_position=&#8221;all&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; width=&#8221;1\/1&#8243;]<div class=\"lvca-heading lvca-style3 lvca-aligncenter \" ><h3 class=\"lvca-title\">You Don\u2019t Know Node.js - Vance Lucas<\/h3><\/div>[vc_row_inner][vc_column_inner column_padding=&#8221;no-extra-padding&#8221; column_padding_position=&#8221;all&#8221; background_color_opacity=&#8221;1&#8243; width=&#8221;1\/4&#8243;][image_with_animation image_url=&#8221;3457&#8243; alignment=&#8221;&#8221; animation=&#8221;Fade In&#8221;][\/vc_column_inner][vc_column_inner column_padding=&#8221;no-extra-padding&#8221; column_padding_position=&#8221;all&#8221; background_color_opacity=&#8221;1&#8243; width=&#8221;3\/4&#8243;][vc_column_text]&#8221;Node.js can be a powerful platform used in the right situations, but it also has more footguns than PHP does for new developers. Asynchronous programming style, concurrency issues, error handling, the event loop, and no default timeouts for HTTP requests or network calls will give new developers more than their fair share of troubles. This talk gives a thorough introduction to node.js and the event loop model, and covers common pitfalls to avoid.&#8221;<\/p>\n<p><a href=\"https:\/\/confoo.ca\/en\/yvr2016\/session\/python-for-non-python-developers-1\">ConFoo Page<\/a>[\/vc_column_text][\/vc_column_inner][\/vc_row_inner][vc_row_inner][vc_column_inner column_padding=&#8221;no-extra-padding&#8221; column_padding_position=&#8221;all&#8221; background_color_opacity=&#8221;1&#8243; width=&#8221;1\/2&#8243;][vc_column_text]\n<h3><span class=\"ez-toc-section\" id=\"My_Notes-3\"><\/span>My Notes<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p><span style=\"font-weight: 400;\">How the event loop works-\u00a0<\/span><a href=\"http:\/\/latentflip.com\/loupe\/\"><span style=\"font-weight: 400;\">http:\/\/latentflip.com\/loupe\/<\/span><\/a><\/p>\n<p><span style=\"font-weight: 400;\">External apis<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Do everything not javascript<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Can use other threads<\/span>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Network i\/o<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Rendering<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Timeouts\/intervals<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">File system access<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Web workers<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">C++<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">Call back queue only goes to call stack if it\u2019s empty. (settimeout, button callbacks). Queue gets too full, tab crashes. Dont block the event loop. Async: false is bad.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Node mitigation<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Messaging<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Nginx (handle all the static assets)<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">setImmediate()<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">Node Process<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Runs forever<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Does not cleanup\/tear down<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Need to watch memory<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Single threaded<\/span><\/li>\n<\/ul>\n[\/vc_column_text][\/vc_column_inner][vc_column_inner column_padding=&#8221;no-extra-padding&#8221; column_padding_position=&#8221;all&#8221; background_color_opacity=&#8221;1&#8243; width=&#8221;1\/2&#8243;][image_with_animation image_url=&#8221;3467&#8243; alignment=&#8221;&#8221; animation=&#8221;Fade In&#8221;][\/vc_column_inner][\/vc_row_inner][\/vc_column][\/vc_row][vc_row type=&#8221;in_container&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; overlay_strength=&#8221;0.3&#8243;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_position=&#8221;all&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; width=&#8221;1\/1&#8243;]<div class=\"lvca-heading lvca-style3 lvca-aligncenter \" ><h3 class=\"lvca-title\">Unbreakable Unit Tests - Michael Simonson<\/h3><\/div>[vc_row_inner][vc_column_inner column_padding=&#8221;no-extra-padding&#8221; column_padding_position=&#8221;all&#8221; background_color_opacity=&#8221;1&#8243; width=&#8221;1\/4&#8243;][image_with_animation image_url=&#8221;3456&#8243; alignment=&#8221;&#8221; animation=&#8221;Fade In&#8221;][\/vc_column_inner][vc_column_inner column_padding=&#8221;no-extra-padding&#8221; column_padding_position=&#8221;all&#8221; background_color_opacity=&#8221;1&#8243; width=&#8221;3\/4&#8243;][vc_column_text]&#8221;How often have you rewritten your unit tests from scratch just because the code it was testing evolved slightly? In this session we will explore some unit testing techniques from other languages to produce more robust tests in PHP. You\u2019ll never have to send your unit test to the trashcan again.&#8221;<\/p>\n<p><a href=\"https:\/\/confoo.ca\/en\/yvr2016\/session\/mental-health-the-imposter-syndrome-and-working-from-home\">ConFoo Page<\/a>[\/vc_column_text][\/vc_column_inner][\/vc_row_inner][vc_row_inner][vc_column_inner column_padding=&#8221;no-extra-padding&#8221; column_padding_position=&#8221;all&#8221; background_color_opacity=&#8221;1&#8243; width=&#8221;1\/2&#8243;][vc_column_text]\n<h3><span class=\"ez-toc-section\" id=\"My_Notes-4\"><\/span>My Notes<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p><span style=\"font-weight: 400;\">When to test? Only on projects that you want to succeed<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Test Pyramid.<br \/>\n<\/span><span style=\"font-weight: 400;\">UI, slow, expensive.<br \/>\n<\/span><span style=\"font-weight: 400;\">Unit, fast, cheaper &#8211; no dependencies.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Existing code dependencies<\/span><\/p>\n<ol>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Slow<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Hard to setup across machines<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Sometimes subtle (time)<\/span><\/li>\n<\/ol>\n<p><span style=\"font-weight: 400;\">Mutation testing &#8211; humbug? &#8211; randomly changes logic in code to verify it was covered by tests.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">AAA &#8211; Arrange, Act, Assert.<br \/>\n<\/span><span style=\"font-weight: 400;\">Arrange &#8211; setup for test.<br \/>\n<\/span><span style=\"font-weight: 400;\">Act- Running the code.<br \/>\n<\/span><span style=\"font-weight: 400;\">Assert &#8211; making assertion about the behaviour.<\/span>[\/vc_column_text][\/vc_column_inner][vc_column_inner column_padding=&#8221;no-extra-padding&#8221; column_padding_position=&#8221;all&#8221; background_color_opacity=&#8221;1&#8243; width=&#8221;1\/2&#8243;][image_with_animation image_url=&#8221;3468&#8243; alignment=&#8221;&#8221; animation=&#8221;Fade In&#8221;][\/vc_column_inner][\/vc_row_inner][\/vc_column][\/vc_row][vc_row type=&#8221;in_container&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; overlay_strength=&#8221;0.3&#8243;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_position=&#8221;all&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; width=&#8221;1\/1&#8243;][divider line_type=&#8221;Full Width Line&#8221;][\/vc_column][\/vc_row][vc_row type=&#8221;in_container&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; overlay_strength=&#8221;0.3&#8243;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_position=&#8221;all&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; width=&#8221;1\/1&#8243;]<div class=\"lvca-heading lvca-style3 lvca-aligncenter \" ><h3 class=\"lvca-title\">Practical PHP Deployment with Jenkins - Adam Culp<\/h3><\/div>[vc_row_inner][vc_column_inner column_padding=&#8221;no-extra-padding&#8221; column_padding_position=&#8221;all&#8221; background_color_opacity=&#8221;1&#8243; width=&#8221;1\/4&#8243;][image_with_animation image_url=&#8221;3462&#8243; alignment=&#8221;&#8221; animation=&#8221;Fade In&#8221;][\/vc_column_inner][vc_column_inner column_padding=&#8221;no-extra-padding&#8221; column_padding_position=&#8221;all&#8221; background_color_opacity=&#8221;1&#8243; width=&#8221;3\/4&#8243;][vc_column_text]&#8221;Developers love to &#8220;automate all the things,\u201d but where to start? What tools exist, and what can be automated? Without unit tests, can it still benefit to automate? We will show how a PHP application pulled from Git, complete with unit tests, composer dependency management, and package creation, can be repeatedly deployed flawlessly using Jenkins. Then see how &#8220;Dev&#8221; and &#8220;Ops&#8221; are supported if the application breaks through automated rollbacks.&#8221;<\/p>\n<p><a href=\"https:\/\/confoo.ca\/en\/yvr2016\/session\/practical-php-deployment-with-jenkins\">ConFoo Page<\/a>[\/vc_column_text][\/vc_column_inner][\/vc_row_inner][vc_row_inner][vc_column_inner column_padding=&#8221;no-extra-padding&#8221; column_padding_position=&#8221;all&#8221; background_color_opacity=&#8221;1&#8243; width=&#8221;1\/2&#8243;][vc_column_text]\n<h3><span class=\"ez-toc-section\" id=\"My_Notes-5\"><\/span>My Notes<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p><span style=\"font-weight: 400;\">Judo belt gets \u201cdirtier\u201d from all the practice.<br \/>\n<\/span><span style=\"font-weight: 400;\">Don&#8217;t run composer in production.<br \/>\n<\/span><span style=\"font-weight: 400;\">Phing to create password files.<br \/>\n<\/span><span style=\"font-weight: 400;\">Chef, puppet, zend server.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Jenkin plugins<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Build pipeline<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Clone workspace SCM<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">X CloudBees Folder<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Copy Artifact<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Delivery Pipeline<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Join Plugin<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">PostBuild Script<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">Master branch should always be ready to deploy.<\/span>[\/vc_column_text][\/vc_column_inner][vc_column_inner column_padding=&#8221;no-extra-padding&#8221; column_padding_position=&#8221;all&#8221; background_color_opacity=&#8221;1&#8243; width=&#8221;1\/2&#8243;][image_with_animation image_url=&#8221;3469&#8243; alignment=&#8221;&#8221; animation=&#8221;Fade In&#8221;][\/vc_column_inner][\/vc_row_inner][\/vc_column][\/vc_row][vc_row type=&#8221;in_container&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; overlay_strength=&#8221;0.3&#8243;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_position=&#8221;all&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; width=&#8221;1\/1&#8243;]<div class=\"lvca-heading lvca-style3 lvca-aligncenter \" ><h3 class=\"lvca-title\">Database Architecture for SaaS - Shawn Hooper<\/h3><\/div>[vc_row_inner][vc_column_inner column_padding=&#8221;no-extra-padding&#8221; column_padding_position=&#8221;all&#8221; background_color_opacity=&#8221;1&#8243; width=&#8221;1\/4&#8243;][image_with_animation image_url=&#8221;3458&#8243; alignment=&#8221;&#8221; animation=&#8221;Fade In&#8221;][\/vc_column_inner][vc_column_inner column_padding=&#8221;no-extra-padding&#8221; column_padding_position=&#8221;all&#8221; background_color_opacity=&#8221;1&#8243; width=&#8221;3\/4&#8243;][vc_column_text]&#8221;There are many considerations you should take into account when designing the database architecture of a Software-as-a-Service (SaaS) product. Scalability, geography, security, ease of implementation and deployment, performance, and data retention are all factors to consider. We\u2019ll explore these issues, look at single and multi-tenant database models, and discuss options in both relational SQL and non-relational noSQL worlds.&#8221;<\/p>\n<p><a href=\"https:\/\/confoo.ca\/en\/yvr2016\/session\/microservices-minus-the-hype-how-to-build-and-why\">ConFoo Page<\/a>[\/vc_column_text][\/vc_column_inner][\/vc_row_inner][vc_row_inner][vc_column_inner column_padding=&#8221;no-extra-padding&#8221; column_padding_position=&#8221;all&#8221; background_color_opacity=&#8221;1&#8243; width=&#8221;1\/2&#8243;][vc_column_text]\n<h3><span class=\"ez-toc-section\" id=\"My_Notes-6\"><\/span>My Notes<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p><strong>Mult-tenancy model<\/strong><\/p>\n<ul>\n<li><span style=\"font-weight: 400;\">All users\/clients share one database<\/span><\/li>\n<li><span style=\"font-weight: 400;\">Scalability limited by storage and system resources<\/span><\/li>\n<li><span style=\"font-weight: 400;\">Code complexity: Queries need to include client ID<\/span><\/li>\n<li><span style=\"font-weight: 400;\">Security concerns.<\/span><\/li>\n<li><span style=\"font-weight: 400;\">Also Means everyone gets upgraded at the same time.<\/span><\/li>\n<li><span style=\"font-weight: 400;\">Potential for more bugs to reach all users<\/span><\/li>\n<\/ul>\n<p><strong>Single Tenant Model<\/strong><\/p>\n<ul>\n<li><span style=\"font-weight: 400;\">Separate for each tenant<\/span><\/li>\n<li><span style=\"font-weight: 400;\">Self Services: More difficult. Requires the system to be able to create a new database for each new tenant.<\/span><\/li>\n<li><span style=\"font-weight: 400;\">Free trial on a separate server.<\/span><\/li>\n<li><span style=\"font-weight: 400;\">Security: Separation of data.<\/span><\/li>\n<li><span style=\"font-weight: 400;\">Don&#8217;t need tenant ID in every query.<\/span><\/li>\n<li><span style=\"font-weight: 400;\">Can roll out partial upgrades.<\/span><\/li>\n<li><span style=\"font-weight: 400;\">Micro services model.<\/span><\/li>\n<li><span style=\"font-weight: 400;\">Database separated by function.<\/span><\/li>\n<li><span style=\"font-weight: 400;\">Less data stored in each service, limited potential for loss in the event of a breach.<\/span><\/li>\n<li><span style=\"font-weight: 400;\">Multiple database connection to maintain (multiple APIs too).<\/span><\/li>\n<\/ul>\n[\/vc_column_text][\/vc_column_inner][vc_column_inner column_padding=&#8221;no-extra-padding&#8221; column_padding_position=&#8221;all&#8221; background_color_opacity=&#8221;1&#8243; width=&#8221;1\/2&#8243;][image_with_animation image_url=&#8221;3470&#8243; alignment=&#8221;&#8221; animation=&#8221;Fade In&#8221;][\/vc_column_inner][\/vc_row_inner][\/vc_column][\/vc_row][vc_row type=&#8221;in_container&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; overlay_strength=&#8221;0.3&#8243;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_position=&#8221;all&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; width=&#8221;1\/1&#8243;][vc_column_text]Final Thoughts<\/p>\n<p><a href=\"https:\/\/logmyhours.com\/blog\/confoo-developer-conference-day-1\/\">Day 1<\/a>[\/vc_column_text][\/vc_column][\/vc_row]\n","protected":false},"excerpt":{"rendered":"<p>[vc_row type=&#8221;in_container&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; overlay_strength=&#8221;0.3&#8243;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_position=&#8221;all&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; width=&#8221;1\/1&#8243;][vc_column_text]My experiences at confoo day 2[\/vc_column_text][\/vc_column][\/vc_row][vc_row type=&#8221;in_container&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; overlay_strength=&#8221;0.3&#8243;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_position=&#8221;all&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243;&#8230;<\/p>\n","protected":false},"author":1,"featured_media":3464,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>ConFoo: Day 2 - LogMyHours.com Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/logmyhours.com\/blog\/confoo-day-2\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"ConFoo: Day 2 - LogMyHours.com Blog\" \/>\n<meta property=\"og:description\" content=\"[vc_row type=&#8221;in_container&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; overlay_strength=&#8221;0.3&#8243;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_position=&#8221;all&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; width=&#8221;1\/1&#8243;][vc_column_text]My experiences at confoo day 2[\/vc_column_text][\/vc_column][\/vc_row][vc_row type=&#8221;in_container&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; overlay_strength=&#8221;0.3&#8243;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_position=&#8221;all&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243;...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/logmyhours.com\/blog\/confoo-day-2\/\" \/>\n<meta property=\"og:site_name\" content=\"LogMyHours.com Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/facebook.com\/logmyhours\" \/>\n<meta property=\"article:author\" content=\"logmyhours\" \/>\n<meta property=\"article:published_time\" content=\"2016-12-18T05:31:27+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2017-01-02T21:36:45+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/logmyhours.com\/blog\/wp-content\/uploads\/2016\/12\/IMG_1998.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1800\" \/>\n\t<meta property=\"og:image:height\" content=\"1350\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Chris Hopewell\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@logmyhours\" \/>\n<meta name=\"twitter:site\" content=\"@logmyhours\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Chris Hopewell\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/logmyhours.com\/blog\/confoo-day-2\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/logmyhours.com\/blog\/confoo-day-2\/\"},\"author\":{\"name\":\"Chris Hopewell\",\"@id\":\"https:\/\/logmyhours.com\/blog\/#\/schema\/person\/87e1b119689e827324f73f8d47f2fedc\"},\"headline\":\"ConFoo: Day 2\",\"datePublished\":\"2016-12-18T05:31:27+00:00\",\"dateModified\":\"2017-01-02T21:36:45+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/logmyhours.com\/blog\/confoo-day-2\/\"},\"wordCount\":2054,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/logmyhours.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/logmyhours.com\/blog\/confoo-day-2\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/logmyhours.com\/blog\/wp-content\/uploads\/2016\/12\/IMG_1998.jpg\",\"articleSection\":[\"General\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/logmyhours.com\/blog\/confoo-day-2\/\",\"url\":\"https:\/\/logmyhours.com\/blog\/confoo-day-2\/\",\"name\":\"ConFoo: Day 2 - LogMyHours.com Blog\",\"isPartOf\":{\"@id\":\"https:\/\/logmyhours.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/logmyhours.com\/blog\/confoo-day-2\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/logmyhours.com\/blog\/confoo-day-2\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/logmyhours.com\/blog\/wp-content\/uploads\/2016\/12\/IMG_1998.jpg\",\"datePublished\":\"2016-12-18T05:31:27+00:00\",\"dateModified\":\"2017-01-02T21:36:45+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/logmyhours.com\/blog\/confoo-day-2\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/logmyhours.com\/blog\/confoo-day-2\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/logmyhours.com\/blog\/confoo-day-2\/#primaryimage\",\"url\":\"https:\/\/logmyhours.com\/blog\/wp-content\/uploads\/2016\/12\/IMG_1998.jpg\",\"contentUrl\":\"https:\/\/logmyhours.com\/blog\/wp-content\/uploads\/2016\/12\/IMG_1998.jpg\",\"width\":1800,\"height\":1350},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/logmyhours.com\/blog\/confoo-day-2\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/logmyhours.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"ConFoo: Day 2\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/logmyhours.com\/blog\/#website\",\"url\":\"https:\/\/logmyhours.com\/blog\/\",\"name\":\"LogMyHours.com Blog\",\"description\":\"From Side Project to a Profitable Company\",\"publisher\":{\"@id\":\"https:\/\/logmyhours.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/logmyhours.com\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/logmyhours.com\/blog\/#organization\",\"name\":\"LogMyHours.com Blog\",\"url\":\"https:\/\/logmyhours.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/logmyhours.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/logmyhours.com\/blog\/wp-content\/uploads\/2016\/09\/logo.png\",\"contentUrl\":\"https:\/\/logmyhours.com\/blog\/wp-content\/uploads\/2016\/09\/logo.png\",\"width\":222,\"height\":35,\"caption\":\"LogMyHours.com Blog\"},\"image\":{\"@id\":\"https:\/\/logmyhours.com\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/facebook.com\/logmyhours\",\"https:\/\/twitter.com\/logmyhours\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/logmyhours.com\/blog\/#\/schema\/person\/87e1b119689e827324f73f8d47f2fedc\",\"name\":\"Chris Hopewell\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/logmyhours.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/18e61fae7be171e10a85abb8a6806c7b?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/18e61fae7be171e10a85abb8a6806c7b?s=96&d=mm&r=g\",\"caption\":\"Chris Hopewell\"},\"sameAs\":[\"https:\/\/logmyhours.com\",\"logmyhours\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"ConFoo: Day 2 - LogMyHours.com Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/logmyhours.com\/blog\/confoo-day-2\/","og_locale":"en_US","og_type":"article","og_title":"ConFoo: Day 2 - LogMyHours.com Blog","og_description":"[vc_row type=&#8221;in_container&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; overlay_strength=&#8221;0.3&#8243;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_position=&#8221;all&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243; width=&#8221;1\/1&#8243;][vc_column_text]My experiences at confoo day 2[\/vc_column_text][\/vc_column][\/vc_row][vc_row type=&#8221;in_container&#8221; scene_position=&#8221;center&#8221; text_color=&#8221;dark&#8221; text_align=&#8221;left&#8221; overlay_strength=&#8221;0.3&#8243;][vc_column column_padding=&#8221;no-extra-padding&#8221; column_padding_position=&#8221;all&#8221; background_color_opacity=&#8221;1&#8243; background_hover_color_opacity=&#8221;1&#8243;...","og_url":"https:\/\/logmyhours.com\/blog\/confoo-day-2\/","og_site_name":"LogMyHours.com Blog","article_publisher":"https:\/\/facebook.com\/logmyhours","article_author":"logmyhours","article_published_time":"2016-12-18T05:31:27+00:00","article_modified_time":"2017-01-02T21:36:45+00:00","og_image":[{"width":1800,"height":1350,"url":"https:\/\/logmyhours.com\/blog\/wp-content\/uploads\/2016\/12\/IMG_1998.jpg","type":"image\/jpeg"}],"author":"Chris Hopewell","twitter_card":"summary_large_image","twitter_creator":"@logmyhours","twitter_site":"@logmyhours","twitter_misc":{"Written by":"Chris Hopewell","Est. reading time":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/logmyhours.com\/blog\/confoo-day-2\/#article","isPartOf":{"@id":"https:\/\/logmyhours.com\/blog\/confoo-day-2\/"},"author":{"name":"Chris Hopewell","@id":"https:\/\/logmyhours.com\/blog\/#\/schema\/person\/87e1b119689e827324f73f8d47f2fedc"},"headline":"ConFoo: Day 2","datePublished":"2016-12-18T05:31:27+00:00","dateModified":"2017-01-02T21:36:45+00:00","mainEntityOfPage":{"@id":"https:\/\/logmyhours.com\/blog\/confoo-day-2\/"},"wordCount":2054,"commentCount":0,"publisher":{"@id":"https:\/\/logmyhours.com\/blog\/#organization"},"image":{"@id":"https:\/\/logmyhours.com\/blog\/confoo-day-2\/#primaryimage"},"thumbnailUrl":"https:\/\/logmyhours.com\/blog\/wp-content\/uploads\/2016\/12\/IMG_1998.jpg","articleSection":["General"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/logmyhours.com\/blog\/confoo-day-2\/","url":"https:\/\/logmyhours.com\/blog\/confoo-day-2\/","name":"ConFoo: Day 2 - LogMyHours.com Blog","isPartOf":{"@id":"https:\/\/logmyhours.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/logmyhours.com\/blog\/confoo-day-2\/#primaryimage"},"image":{"@id":"https:\/\/logmyhours.com\/blog\/confoo-day-2\/#primaryimage"},"thumbnailUrl":"https:\/\/logmyhours.com\/blog\/wp-content\/uploads\/2016\/12\/IMG_1998.jpg","datePublished":"2016-12-18T05:31:27+00:00","dateModified":"2017-01-02T21:36:45+00:00","breadcrumb":{"@id":"https:\/\/logmyhours.com\/blog\/confoo-day-2\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/logmyhours.com\/blog\/confoo-day-2\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/logmyhours.com\/blog\/confoo-day-2\/#primaryimage","url":"https:\/\/logmyhours.com\/blog\/wp-content\/uploads\/2016\/12\/IMG_1998.jpg","contentUrl":"https:\/\/logmyhours.com\/blog\/wp-content\/uploads\/2016\/12\/IMG_1998.jpg","width":1800,"height":1350},{"@type":"BreadcrumbList","@id":"https:\/\/logmyhours.com\/blog\/confoo-day-2\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/logmyhours.com\/blog\/"},{"@type":"ListItem","position":2,"name":"ConFoo: Day 2"}]},{"@type":"WebSite","@id":"https:\/\/logmyhours.com\/blog\/#website","url":"https:\/\/logmyhours.com\/blog\/","name":"LogMyHours.com Blog","description":"From Side Project to a Profitable Company","publisher":{"@id":"https:\/\/logmyhours.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/logmyhours.com\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/logmyhours.com\/blog\/#organization","name":"LogMyHours.com Blog","url":"https:\/\/logmyhours.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/logmyhours.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/logmyhours.com\/blog\/wp-content\/uploads\/2016\/09\/logo.png","contentUrl":"https:\/\/logmyhours.com\/blog\/wp-content\/uploads\/2016\/09\/logo.png","width":222,"height":35,"caption":"LogMyHours.com Blog"},"image":{"@id":"https:\/\/logmyhours.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/facebook.com\/logmyhours","https:\/\/twitter.com\/logmyhours"]},{"@type":"Person","@id":"https:\/\/logmyhours.com\/blog\/#\/schema\/person\/87e1b119689e827324f73f8d47f2fedc","name":"Chris Hopewell","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/logmyhours.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/18e61fae7be171e10a85abb8a6806c7b?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/18e61fae7be171e10a85abb8a6806c7b?s=96&d=mm&r=g","caption":"Chris Hopewell"},"sameAs":["https:\/\/logmyhours.com","logmyhours"]}]}},"_links":{"self":[{"href":"https:\/\/logmyhours.com\/blog\/wp-json\/wp\/v2\/posts\/3421"}],"collection":[{"href":"https:\/\/logmyhours.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/logmyhours.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/logmyhours.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/logmyhours.com\/blog\/wp-json\/wp\/v2\/comments?post=3421"}],"version-history":[{"count":10,"href":"https:\/\/logmyhours.com\/blog\/wp-json\/wp\/v2\/posts\/3421\/revisions"}],"predecessor-version":[{"id":3507,"href":"https:\/\/logmyhours.com\/blog\/wp-json\/wp\/v2\/posts\/3421\/revisions\/3507"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/logmyhours.com\/blog\/wp-json\/wp\/v2\/media\/3464"}],"wp:attachment":[{"href":"https:\/\/logmyhours.com\/blog\/wp-json\/wp\/v2\/media?parent=3421"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/logmyhours.com\/blog\/wp-json\/wp\/v2\/categories?post=3421"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/logmyhours.com\/blog\/wp-json\/wp\/v2\/tags?post=3421"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}