diff --git a/1-8b9b21b08bbb5c3f244a.js b/1-8b9b21b08bbb5c3f244a.js deleted file mode 100644 index 49ea267..0000000 --- a/1-8b9b21b08bbb5c3f244a.js +++ /dev/null @@ -1,2 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[1],{172:function(e,t,i){"use strict";i.d(t,"a",function(){return n});var n={blue:"#3eb0ef",green:"#a4d037",purple:"#ad26b4",yellow:"#fecd35",red:"#f05230",darkgrey:"#15171A",midgrey:"#738a94",lightgrey:"#c5d2d9",whitegrey:"#e5eff5",pink:"#fa3a57",brown:"#a3821a"}},174:function(e,t,i){"use strict";i.d(t,"b",function(){return p});var n=i(12),a=i(0),o=i.n(a),r=i(6),s=i.n(r),l=i(44),c=i.n(l);i.d(t,"a",function(){return c.a});i(189);var d=o.a.createContext({});function b(e){var t=e.staticQueryData,i=e.data,a=e.query,r=e.render,s=i?i.data:t[a]&&t[a].data;return Object(n.d)(o.a.Fragment,null,s&&r(s),!s&&Object(n.d)("div",null,"Loading (StaticQuery)"))}var p=function(e){var t=e.data,i=e.query,a=e.render,o=e.children;return Object(n.d)(d.Consumer,null,function(e){return Object(n.d)(b,{data:t,query:i,render:a||o,staticQueryData:e})})};p.propTypes={data:s.a.object,query:s.a.string.isRequired,render:s.a.func,children:s.a.func}},175:function(e,t,i){"use strict";t.a={title:"SPHTech Blog",description:"Our collection of adventures, learnings and thoughts!",coverImage:"img/blog-cover.jpg",logo:"",lang:"en",siteUrl:"https://sphtech.github.io",facebook:"",twitter:"",showSubscribe:!1,mailchimpAction:"https://twitter.us19.list-manage.com/subscribe/post?u=a89b6987ac248c81b0b7f3a0f&id=7d777b7d75",mailchimpName:"b_a89b6987ac248c81b0b7f3a0f_7d777b7d75",mailchimpEmailFieldName:"MERGE0",googleSiteVerification:"GoogleCode",footer:"is based on Gatsby Casper"}},177:function(e,t,i){"use strict";i.d(t,"k",function(){return s}),i.d(t,"j",function(){return l}),i.d(t,"g",function(){return c}),i.d(t,"h",function(){return d}),i.d(t,"d",function(){return b}),i.d(t,"b",function(){return p}),i.d(t,"c",function(){return g}),i.d(t,"i",function(){return u}),i.d(t,"e",function(){return m}),i.d(t,"f",function(){return f}),i.d(t,"a",function(){return h});var n=i(171),a=i(12),o=i(172),r=i(173),s={name:"1x0l29j",styles:"position:relative;padding:0 4vw;"},l={name:"s2cjas",styles:"margin:0 auto;max-width:1040px;width:100%;"},c={name:"1ptyxcl",styles:"z-index:100;flex-grow:1;"},d=Object(n.a)("h1",{target:"e1yzaf1e0"})({name:"auy6fs",styles:"z-index:10;margin:0;padding:0;font-size:3.8rem;font-weight:700;"}),b=Object(n.a)("h2",{target:"e1yzaf1e1"})({name:"1c86fji",styles:"z-index:10;margin:0;padding:5px 0;font-size:2.2rem;font-weight:300;letter-spacing:0.5px;opacity:0.8;"}),p={name:"ueft86",styles:"position:relative;display:flex;flex-wrap:wrap;margin:0 -20px;padding:40px 0 0 0;"},g={name:"ettpeh",styles:"@media (min-width:900px){margin-top:-70px;padding-top:0;}"},u={name:"1l1dftb",styles:"display:flex;justify-content:center;align-items:center;margin:0;padding:10px;color:#fff;opacity:0.8;:hover{opacity:1;}svg{height:1.8rem;fill:#fff;}"},m=Object(a.c)("position:relative;padding-top:12px;padding-bottom:12px;color:#fff;background:",Object(r.a)("0.05",o.a.darkgrey)," no-repeat center center;background-size:cover;:before{content:'';position:absolute;top:0;right:0;left:0;bottom:0;z-index:10;display:block;background:rgba(0,0,0,0.5);}"),f=Object(n.a)("div",{target:"e1yzaf1e2"})({name:"h7hfdz",styles:"display:flex;flex-direction:column;justify-content:center;align-items:center;padding:10vw 4vw;min-height:200px;max-height:450px;text-align:center;"}),h=Object(a.c)("display:block;background:",Object(r.c)("0.1",o.a.lightgrey),";border-radius:100%;object-fit:cover;margin-right:15px;width:60px;height:60px;")},182:function(e,t,i){"use strict";var n=i(171),a=i(12),o=(i(0),Object(n.a)("div",{target:"esvym2d0"})({name:"zf0iqh",styles:"display:flex;flex-direction:column;min-height:100vh;"}));t.a=function(e){var t=e.children,i=e.className;return Object(a.d)(o,{className:i},t)}},183:function(e,t,i){"use strict";var n=i(12),a=i(173),o=(i(0),i(181)),r=i.n(o),s=i(172),l=i(198),c=i.n(l),d=Object(n.c)("html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font:inherit;font-size:100%;vertical-align:baseline;}body{line-height:1;}ol,ul{list-style:none;}blockquote,q{quotes:none;}blockquote:before,blockquote:after,q:before,q:after{content:'';content:none;}table{border-spacing:0;border-collapse:collapse;}img{max-width:100%;}html{box-sizing:border-box;font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;}*,*:before,*:after{box-sizing:inherit;}a{background-color:transparent;}a:active,a:hover{outline:0;}b,strong{font-weight:bold;}i,em,dfn{font-style:italic;}h1{margin:0.67em 0;font-size:2em;}small{font-size:80%;}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline;}sup{top:-0.5em;}sub{bottom:-0.25em;}img{border:0;}svg:not(:root){overflow:hidden;}mark{background-color:#fdffb6;}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em;}button,input,optgroup,select,textarea{margin:0;color:inherit;font:inherit;}button{overflow:visible;border:none;}button,select{text-transform:none;}button,html input[type='button'],input[type='reset'],input[type='submit']{cursor:pointer;-webkit-appearance:button;}button[disabled],html input[disabled]{cursor:default;}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0;}input{line-height:normal;}input:focus{outline:none;}input[type='checkbox'],input[type='radio']{box-sizing:border-box;padding:0;}input[type='number']::-webkit-inner-spin-button,input[type='number']::-webkit-outer-spin-button{height:auto;}input[type='search']{box-sizing:content-box;-webkit-appearance:textfield;}input[type='search']::-webkit-search-cancel-button,input[type='search']::-webkit-search-decoration{-webkit-appearance:none;}legend{padding:0;border:0;}textarea{overflow:auto;}table{border-spacing:0;border-collapse:collapse;}td,th{padding:0;}html{overflow-x:hidden;overflow-y:scroll;font-size:62.5%;-webkit-tap-highlight-color:rgba(0,0,0,0);}body{overflow-x:hidden;color:",Object(a.a)("0.25",s.a.midgrey),";font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif;font-size:1.5rem;line-height:1.6em;font-weight:400;font-style:normal;letter-spacing:0;text-rendering:optimizeLegibility;background:#fff;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-moz-font-feature-settings:'liga' on;}::selection{text-shadow:none;background:",Object(a.c)("0.3",s.a.blue),";}hr{position:relative;display:block;width:100%;margin:2.5em 0 3.5em;padding:0;height:1px;border:0;border-top:1px solid ",Object(a.c)("0.1",s.a.lightgrey),";}audio,canvas,iframe,img,svg,video{vertical-align:middle;}fieldset{margin:0;padding:0;border:0;}textarea{resize:vertical;}p,ul,ol,dl,blockquote{margin:0 0 1.5em 0;}ol,ul{padding-left:1.3em;padding-right:1.5em;}ol ol,ul ul,ul ol,ol ul{margin:0.5em 0 1em;}ul{list-style:disc;}ol{list-style:decimal;}ul,ol{max-width:100%;}li{margin:0.5em 0;padding-left:0.3em;line-height:1.6em;}dt{float:left;margin:0 20px 0 0;width:120px;color:",s.a.darkgrey,";font-weight:500;text-align:right;}dd{margin:0 0 5px 0;text-align:left;}blockquote{margin:1.5em 0;padding:0 1.6em 0 1.6em;border-left:",s.a.whitegrey," 0.5em solid;}blockquote p{margin:0.8em 0;font-size:1.2em;font-weight:300;}blockquote small{display:inline-block;margin:0.8em 0 0.8em 1.5em;font-size:0.9em;opacity:0.8;}blockquote small:before{content:'\\2014 \\00A0';}blockquote cite{font-weight:bold;}blockquote cite a{font-weight:normal;}a{color:",Object(a.a)("0.05",s.a.blue),";text-decoration:none;}a:hover{text-decoration:underline;}h1,h2,h3,h4,h5,h6{margin-top:0;line-height:1.15;font-weight:700;text-rendering:optimizeLegibility;}h1{margin:0 0 0.5em 0;font-size:5rem;font-weight:700;}@media (max-width:500px){h1{font-size:2.2rem;}}h2{margin:1.5em 0 0.5em 0;font-size:2rem;}@media (max-width:500px){h2{font-size:1.8rem;}}h3{margin:1.5em 0 0.5em 0;font-size:1.8rem;font-weight:500;}@media (max-width:500px){h3{font-size:1.7rem;}}h4{margin:1.5em 0 0.5em 0;font-size:1.6rem;font-weight:500;}h5{margin:1.5em 0 0.5em 0;font-size:1.4rem;font-weight:500;}h6{margin:1.5em 0 0.5em 0;font-size:1.4rem;font-weight:500;}body{background:#f4f8fb;}");t.a=function(e){return Object(n.d)("div",{className:e.className},Object(n.d)(r.a,null,Object(n.d)("link",{rel:"icon",href:c.a,type:"image/x-icon"})),Object(n.d)(n.a,{styles:d}),e.children)}},184:function(e,t,i){"use strict";var n=i(34),a=i(171),o=i(12),r=i(174),s=i(173),l=(i(0),i(172)),c=i(177),d=i(175),b=Object(o.c)("position:relative;padding-top:20px;padding-bottom:60px;color:#fff;background:",Object(s.e)("0.0015",l.a.darkgrey),";"),p={name:"1ugh7vk",styles:"display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;color:rgba(255,255,255,0.7);font-size:1.3rem;a{color:rgba(255,255,255,0.7);}a:hover{color:rgba(255,255,255,1);text-decoration:none;}@media (max-width:650px){flex-direction:column;}"},g=Object(a.a)("nav",{target:"e1me3zb40"})({name:"j0kq43",styles:"display:flex;a{position:relative;margin-left:20px;}a:before{content:'';position:absolute;top:11px;left:-11px;display:block;width:2px;height:2px;background:#fff;border-radius:100%;}a:first-of-type:before{display:none;}@media (max-width:650px){a:first-child{margin-left:0;}}"});t.a=function(){return Object(o.d)("footer",{css:Object(n.a)([c.k,b])},Object(o.d)("div",{css:Object(n.a)([c.j,p])},Object(o.d)("section",{className:"copyright"},Object(o.d)(r.a,{to:"/"},d.a.title)," © ",(new Date).getFullYear()," ",d.a.footer&&Object(o.d)(r.a,{to:"/"},"| ",d.a.title," ",d.a.footer)),Object(o.d)(g,null,Object(o.d)(r.a,{to:"/"},"Latest Posts"),d.a.facebook&&Object(o.d)("a",{href:d.a.facebook,target:"_blank",rel:"noopener noreferrer"},"Facebook"),d.a.twitter&&Object(o.d)("a",{href:d.a.twitter,target:"_blank",rel:"noopener noreferrer"},"Twitter"))))}},185:function(e,t,i){"use strict";var n=i(34),a=i(8),o=i.n(a),r=i(171),s=i(12),l=i(174),c=i(0),d=i(177),b=i(175),p=i(200),g=i(201),u=i(172),m=i(191),f=(i(179),i(220)),h=Object(r.a)("img",{target:"e1y9uxgx0"})({name:"sgb6d4",styles:"position:fixed;top:23px;left:30px;height:30px;"}),x=function(){return Object(s.d)(l.b,{query:"1115645022",render:function(e){return e.logo&&Object(s.d)(h,{src:e.logo.childImageSharp.fixed.src,alt:b.a.title})},data:f})},y=Object(r.a)("div",{target:"ehky8d0"})("position:fixed;top:0;right:0;bottom:0;left:0;z-index:9000;display:flex;justify-content:center;align-items:center;background:rgba(0,25,40,0.97);opacity:",function(e){return e.open?1:0},";transition:opacity 200ms ease-in;pointer-events:",function(e){return e.open?"auto":"none"},";backdrop-filter:blur(3px);form{display:flex;justify-content:center;align-items:center;margin:0 auto;max-width:500px;}.form-group{flex-grow:1;}.subscribe-email{display:block;padding:14px 20px;width:100%;border:none;color:",u.a.midgrey,";font-size:2rem;line-height:1em;font-weight:normal;letter-spacing:0.5px;user-select:text;border-radius:8px;transition:border-color 0.15s linear;-webkit-appearance:none;}button{display:inline-block;margin:0 0 0 15px;padding:0 25px;height:52px;outline:none;color:#fff;font-size:1.7rem;line-height:37px;font-weight:400;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.1);background:linear-gradient( color(var(--blue) whiteness(+7%)),color(var(--blue) lightness(-7%) saturation(-10%)) 60%,color(var(--blue) lightness(-7%) saturation(-10%)) 90%,color(var(--blue) lightness(-4%) saturation(-10%)) );border-radius:8px;box-shadow:0 0 0 1px inset rgba(0,0,0,0.14);-webkit-font-smoothing:subpixel-antialiased;}"),A=Object(r.a)("a",{target:"ehky8d1"})({name:"1574915",styles:"position:absolute;top:0;right:0;bottom:0;left:0;display:block;:before{content:'';position:absolute;top:40px;right:25px;display:block;width:30px;height:2px;background:#fff;opacity:0.8;transform:rotate(45deg);}:after{content:'';position:absolute;top:40px;right:25px;display:block;width:30px;height:2px;background:#fff;opacity:0.8;transform:rotate(-45deg);}:hover{cursor:default;}"}),w=Object(r.a)("div",{target:"ehky8d2"})({name:"5xk39p",styles:"position:relative;z-index:9999;margin:0 0 5vw 0;padding:4vw;color:#fff;text-align:center;"}),v=Object(r.a)("h1",{target:"ehky8d3"})({name:"1wdd2ea",styles:"display:inline-block;margin:0 0 10px 0;font-size:6rem;line-height:1.15em;"}),j=Object(r.a)("p",{target:"ehky8d4"})({name:"1xbuinu",styles:"margin:0 auto 50px;max-width:650px;font-family:Georgia,serif;font-size:3rem;line-height:1.3em;font-weight:300;opacity:0.8;"}),O=function(e){function t(t){var i;return(i=e.call(this,t)||this).escFunction=function(e){"Escape"===e.key&&i.close()},i.open=function(){i.setState({isOpen:!0}),i.subscribeEsc()},i.close=function(){i.setState({isOpen:!1}),i.unsubscribeEsc()},i.state={isOpen:!1},i}o()(t,e);var i=t.prototype;return i.componentWillUnmount=function(){this.unsubscribeEsc()},i.subscribeEsc=function(){document.addEventListener("keydown",this.escFunction,!1)},i.unsubscribeEsc=function(){document.removeEventListener("keydown",this.escFunction,!1)},i.render=function(){return Object(s.d)(y,{open:this.state.isOpen},Object(s.d)(A,{onClick:this.close}),Object(s.d)(w,null,Object(s.d)(x,null),Object(s.d)(v,null,"Subscribe to ",b.a.title),Object(s.d)(j,null,"Stay up to date! Get all the latest & greatest posts delivered straight to your inbox"),Object(s.d)(m.a,null)))},t}(c.Component),k={name:"1c8x79b",styles:"@media (min-width:900px){position:relative;top:-70px;}"},z={name:"a1zygu",styles:"position:relative;z-index:300;display:flex;justify-content:space-between;align-items:flex-start;overflow-y:hidden;height:40px;font-size:1.2rem;"},C=Object(r.a)("div",{target:"e1sju8vj0"})({name:"25mjrn",styles:"display:flex;align-items:center;overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;margin-right:10px;padding-bottom:80px;letter-spacing:0.4px;white-space:nowrap;-ms-overflow-scrolling:touch;@media (max-width:700px){margin-right:0;padding-left:4vw;}"}),X={name:"1trdsxq",styles:"display:flex;margin:0 0 0 -12px;padding:0;list-style:none;li{display:block;margin:0;padding:0;text-transform:uppercase;}li a{display:block;margin:0;padding:10px 12px;color:#fff;opacity:0.8;}li a:hover{text-decoration:none;opacity:1;}"},G=Object(r.a)("div",{target:"e1sju8vj1"})({name:"cniab2",styles:"flex-shrink:0;display:flex;align-items:center;height:40px;@media (max-width:700px){display:none;}"}),R=Object(r.a)("div",{target:"e1sju8vj2"})({name:"1im5alu",styles:"flex-shrink:0;display:flex;align-items:center;a:last-of-type{padding-right:20px;}"}),W=Object(r.a)("a",{target:"e1sju8vj3"})({name:"13yl2z4",styles:"display:block;padding:4px 10px;border:#fff 1px solid;color:#fff;font-size:1.2rem;line-height:1em;border-radius:10px;opacity:0.8;:hover{text-decoration:none;opacity:1;cursor:pointer;}"}),N=function(e){function t(t){var i;return(i=e.call(this,t)||this).subscribe=c.createRef(),i.openModal=function(){i.subscribe.current&&i.subscribe.current.open()},i.state={isOpen:!1},i}return o()(t,e),t.prototype.render=function(){var e=this.props.isHome,t=void 0!==e&&e;return Object(s.d)("nav",{css:Object(n.a)([t&&k,z])},Object(s.d)(C,null,!t,Object(s.d)("ul",{css:X,role:"menu"},Object(s.d)("li",{role:"menuitem"},Object(s.d)(l.a,{to:"/"},"Home")),Object(s.d)("li",{role:"menuitem"},Object(s.d)(l.a,{to:"/about-us"},"About")))),Object(s.d)(G,null,Object(s.d)(R,null,b.a.facebook&&Object(s.d)("a",{css:d.i,href:b.a.facebook,target:"_blank",title:"Facebook",rel:"noopener noreferrer"},Object(s.d)(p.a,null)),b.a.twitter&&Object(s.d)("a",{css:d.i,href:b.a.twitter,title:"Twitter",target:"_blank",rel:"noopener noreferrer"},Object(s.d)(g.a,null))),b.a.showSubscribe&&Object(s.d)(W,{onClick:this.openModal},"Subscribe"),b.a.showSubscribe&&Object(s.d)(O,{ref:this.subscribe})))},t}(c.Component);t.a=N},189:function(e,t,i){var n;e.exports=(n=i(195))&&n.default||n},191:function(e,t,i){"use strict";var n=i(171),a=i(12),o=i(173),r=(i(0),i(172)),s=i(175),l={name:"b8yrw1",styles:"@media (max-width:500px){-ms-flex-direction:column;flex-direction:column;}"},c=Object(n.a)("input",{target:"egytw1t0"})("display:block;padding:10px;width:100%;border:",Object(o.c)("0.07",r.a.lightgrey),";color:",r.a.midgrey,";font-size:1.8rem;line-height:1em;font-weight:normal;user-select:text;border-radius:5px;transition:border-color 0.15s linear;-webkit-appearance:none;:focus{outline:0;border-color:",Object(o.a)("0.02",r.a.lightgrey),";}"),d=Object(n.a)("button",{target:"egytw1t1"})("display:inline-block;margin:0 0 0 10px;padding:0 20px;height:41px;outline:none;color:#fff;font-size:1.5rem;line-height:37px;font-weight:400;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.1);background:linear-gradient( ",Object(o.d)("0.1","#fff",r.a.blue),",",Object(o.b)("0.1",Object(o.a)("0.07",r.a.blue))," 60%,",Object(o.b)("0.1",Object(o.a)("0.07",r.a.blue))," 90%,",Object(o.b)("0.1",Object(o.a)("0.04",r.a.blue))," );border-radius:5px;box-shadow:0 0 0 1px inset rgba(0,0,0,0.14);-webkit-font-smoothing:subpixel-antialiased;:active,:focus{background:",Object(o.b)("0.1",Object(o.a)("0.09",r.a.blue)),";}@media (max-width:500px){margin:10px 0 0;width:100%;}"),b=Object(n.a)("div",{target:"egytw1t2"})({name:"t7b6tq",styles:"flex-grow:1;@media (max-width:500px){width:100%;}"});t.a=function(){return Object(a.d)("form",{css:l,action:s.a.mailchimpAction,method:"post",id:"mc-embedded-subscribe-form",name:"mc-embedded-subscribe-form",target:"_blank",noValidate:!0},Object(a.d)(b,{className:"form-group"},Object(a.d)(c,{className:"subscribe-email",type:"email",name:s.a.mailchimpEmailFieldName,id:s.a.mailchimpEmailFieldName,placeholder:"youremail@example.com"})),Object(a.d)("div",{style:{position:"absolute",left:"-5000px"},"aria-hidden":"true"},Object(a.d)("input",{type:"text",name:s.a.mailchimpName,tabIndex:-1})),Object(a.d)(d,{type:"submit"},Object(a.d)("span",null,"Subscribe")))}},195:function(e,t,i){"use strict";i.r(t);i(70);var n=i(0),a=i.n(n),o=i(6),r=i.n(o),s=i(74),l=function(e){var t=e.location,i=e.pageResources;return i?a.a.createElement(s.a,Object.assign({location:t,pageResources:i},i.json)):null};l.propTypes={location:r.a.shape({pathname:r.a.string.isRequired}).isRequired},t.default=l},198:function(e,t){e.exports="data:image/png;base64,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"},200:function(e,t,i){"use strict";var n=i(12);i(0);t.a=function(){return Object(n.d)("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32",style:{height:"1.5rem"}},Object(n.d)("path",{d:"M19 6h5V0h-5c-3.86 0-7 3.14-7 7v3H8v6h4v16h6V16h5l1-6h-6V7c0-.542.458-1 1-1z"}))}},201:function(e,t,i){"use strict";var n=i(12);i(0);t.a=function(){return Object(n.d)("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32"},Object(n.d)("path",{d:"M30.063 7.313c-.813 1.125-1.75 2.125-2.875 2.938v.75c0 1.563-.188 3.125-.688 4.625a15.088 15.088 0 0 1-2.063 4.438c-.875 1.438-2 2.688-3.25 3.813a15.015 15.015 0 0 1-4.625 2.563c-1.813.688-3.75 1-5.75 1-3.25 0-6.188-.875-8.875-2.625.438.063.875.125 1.375.125 2.688 0 5.063-.875 7.188-2.5-1.25 0-2.375-.375-3.375-1.125s-1.688-1.688-2.063-2.875c.438.063.813.125 1.125.125.5 0 1-.063 1.5-.25-1.313-.25-2.438-.938-3.313-1.938a5.673 5.673 0 0 1-1.313-3.688v-.063c.813.438 1.688.688 2.625.688a5.228 5.228 0 0 1-1.875-2c-.5-.875-.688-1.813-.688-2.75 0-1.063.25-2.063.75-2.938 1.438 1.75 3.188 3.188 5.25 4.25s4.313 1.688 6.688 1.813a5.579 5.579 0 0 1 1.5-5.438c1.125-1.125 2.5-1.688 4.125-1.688s3.063.625 4.188 1.813a11.48 11.48 0 0 0 3.688-1.375c-.438 1.375-1.313 2.438-2.563 3.188 1.125-.125 2.188-.438 3.313-.875z"}))}},220:function(e){e.exports={data:{logo:{childImageSharp:{fixed:{base64:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsSAAALEgHS3X78AAABFUlEQVQY023PvUrDUBTA8ZuCtoMoOLQ4dWhN14x2kEKXFkGoohQ/QBexOHRycAidKkgHHRq69APRoTjFJYODIA6+gSBYfYMmfYLE/5VT6NALP845NyeHc9UoCHZRQvonCLKKE4ZhAXYURTsYoE9dIy5iCzfUJnEdV+RF4iu6ikFH2EPxazzOcJmg4Rnn5C8ysIEOHqTe5/sT3qXOwYOtRr5/wLAqzpCTDXu4p2ETtyjgGJ/cX+se8jeU9fa4RBt5vWENpjzdkoGPcGg4RQsbOMEFmnBRRwVDHEK/yFXfvr/CoPjvZLKcdByDyzWGeajigzorGy0oOeRJiUtITe/pX1XzDk3buIMltSFR/zTtic3060X+8z8PsEUt8G3LVQAAAABJRU5ErkJggg==",width:400,height:128,src:"/static/2b5eaa0de166a8b5faebad4955c2200c/647de/ghost-logo.png",srcSet:"/static/2b5eaa0de166a8b5faebad4955c2200c/647de/ghost-logo.png 1x"}}}}}}}]); -//# sourceMappingURL=1-8b9b21b08bbb5c3f244a.js.map \ No newline at end of file diff --git a/1-8b9b21b08bbb5c3f244a.js.map b/1-8b9b21b08bbb5c3f244a.js.map deleted file mode 100644 index 0757bb3..0000000 --- a/1-8b9b21b08bbb5c3f244a.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/styles/colors.ts","webpack:///./.cache/gatsby-browser-entry.js","webpack:///./src/website-config.ts","webpack:///./src/styles/shared.ts","webpack:///./src/components/Wrapper.tsx","webpack:///./src/layouts/index.tsx","webpack:///./src/components/Footer.tsx","webpack:///./src/components/subscribe/SubscribeLogo.tsx","webpack:///./src/components/subscribe/SubscribeOverlay.tsx","webpack:///./src/components/header/SiteNav.tsx","webpack:///./.cache/public-page-renderer.js","webpack:///./src/components/subscribe/SubscribeForm.tsx","webpack:///./.cache/public-page-renderer-prod.js","webpack:///./src/sphtech.png","webpack:///./src/components/icons/facebook.tsx","webpack:///./src/components/icons/twitter.tsx"],"names":["__webpack_require__","d","__webpack_exports__","colors","blue","green","purple","yellow","red","darkgrey","midgrey","lightgrey","whitegrey","pink","brown","StaticQueryContext","React","createContext","StaticQueryDataRenderer","_ref","staticQueryData","data","query","render","finalData","Object","_emotion_core__WEBPACK_IMPORTED_MODULE_0__","react__WEBPACK_IMPORTED_MODULE_1___default","a","Fragment","StaticQuery","props","children","Consumer","propTypes","PropTypes","object","string","isRequired","func","config","title","description","coverImage","logo","lang","siteUrl","facebook","twitter","showSubscribe","mailchimpAction","mailchimpName","mailchimpEmailFieldName","googleSiteVerification","footer","outer","name","styles","inner","SiteMain","SiteTitle","_emotion_styled_base__WEBPACK_IMPORTED_MODULE_0__","target","SiteDescription","PostFeed","PostFeedRaise","SocialLink","SiteHeader","css","darken","SiteHeaderContent","AuthorProfileImage","lighten","StyledWrapper","Wrapper","className","_emotion_core__WEBPACK_IMPORTED_MODULE_1__","GlobalStyles","IndexLayout","react_helmet__WEBPACK_IMPORTED_MODULE_3___default","rel","href","favicon","type","SiteFooter","setLightness","SiteFooterContent","SiteFooterNav","_emotion_styled_base__WEBPACK_IMPORTED_MODULE_1__","Footer","_emotion_core__WEBPACK_IMPORTED_MODULE_2__","_emotion_css__WEBPACK_IMPORTED_MODULE_0__","gatsby__WEBPACK_IMPORTED_MODULE_3__","to","Date","getFullYear","SubscribeOverlayLogo","styled_base_browser_esm","SubscribeLogo","core_browser_esm","gatsby_browser_entry","src","childImageSharp","fixed","alt","_1115645022","SubscribeOverlay","open","SubscribeOverlayClose","SubscribeOverlayContent","SubscribeOverlayTitle","SubscribeOverlayDescription","SubscribeModal","_this","_React$Component","call","this","escFunction","event","key","close","setState","isOpen","subscribeEsc","unsubscribeEsc","state","componentWillUnmount","document","addEventListener","removeEventListener","onClick","subscribe_SubscribeLogo","SubscribeForm","HomeNavRaise","SiteNavStyles","SiteNavLeft","NavStyles","SiteNavRight","SocialLinks","SubscribeButton","SiteNav","subscribe","openModal","current","_this$props$isHome","isHome","css_browser_esm","role","subscribe_SubscribeOverlay","ref","m","module","exports","require","default","SubscribeFormStyles","SubscribeEmail","SubscribeFormButton","mix","desaturate","FormGroup","action","method","id","noValidate","placeholder","style","position","left","aria-hidden","tabIndex","ProdPageRenderer","location","pageResources","createElement","InternalPageRenderer","assign","json","shape","pathname","Facebook","xmlns","viewBox","height","Twitter"],"mappings":"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","file":"1-8b9b21b08bbb5c3f244a.js","sourcesContent":["export const colors = {\n blue: '#3eb0ef',\n green: '#a4d037',\n purple: '#ad26b4',\n yellow: '#fecd35',\n red: '#f05230',\n darkgrey: '#15171A',\n midgrey: '#738a94',\n lightgrey: '#c5d2d9',\n whitegrey: '#e5eff5',\n pink: '#fa3a57',\n brown: '#a3821a',\n};\n","import React from \"react\"\nimport PropTypes from \"prop-types\"\nimport Link, {\n withPrefix,\n withAssetPrefix,\n navigate,\n push,\n replace,\n navigateTo,\n parsePath,\n} from \"gatsby-link\"\nimport PageRenderer from \"./public-page-renderer\"\n\nconst StaticQueryContext = React.createContext({})\n\nfunction StaticQueryDataRenderer({ staticQueryData, data, query, render }) {\n const finalData = data\n ? data.data\n : staticQueryData[query] && staticQueryData[query].data\n\n return (\n \n {finalData && render(finalData)}\n {!finalData &&
Loading (StaticQuery)
}\n
\n )\n}\n\nconst StaticQuery = props => {\n const { data, query, render, children } = props\n\n return (\n \n {staticQueryData => (\n \n )}\n \n )\n}\n\nconst useStaticQuery = query => {\n if (\n typeof React.useContext !== `function` &&\n process.env.NODE_ENV === `development`\n ) {\n throw new Error(\n `You're likely using a version of React that doesn't support Hooks\\n` +\n `Please update React and ReactDOM to 16.8.0 or later to use the useStaticQuery hook.`\n )\n }\n const context = React.useContext(StaticQueryContext)\n if (context[query] && context[query].data) {\n return context[query].data\n } else {\n throw new Error(\n `The result of this StaticQuery could not be fetched.\\n\\n` +\n `This is likely a bug in Gatsby and if refreshing the page does not fix it, ` +\n `please open an issue in https://github.com/gatsbyjs/gatsby/issues`\n )\n }\n}\n\nStaticQuery.propTypes = {\n data: PropTypes.object,\n query: PropTypes.string.isRequired,\n render: PropTypes.func,\n children: PropTypes.func,\n}\n\nfunction graphql() {\n throw new Error(\n `It appears like Gatsby is misconfigured. Gatsby related \\`graphql\\` calls ` +\n `are supposed to only be evaluated at compile time, and then compiled away. ` +\n `Unfortunately, something went wrong and the query was left in the compiled code.\\n\\n` +\n `Unless your site has a complex or custom babel/Gatsby configuration this is likely a bug in Gatsby.`\n )\n}\n\nexport {\n Link,\n withAssetPrefix,\n withPrefix,\n graphql,\n parsePath,\n navigate,\n push, // TODO replace for v3\n replace, // TODO remove replace for v3\n navigateTo, // TODO: remove navigateTo for v3\n StaticQueryContext,\n StaticQuery,\n PageRenderer,\n useStaticQuery,\n}\n","export interface WebsiteConfig {\n title: string;\n description: string;\n coverImage: string;\n logo: string;\n /**\n * Specifying a valid BCP 47 language helps screen readers announce text properly.\n * See: https://dequeuniversity.com/rules/axe/2.2/valid-lang\n */\n lang: string;\n /**\n * blog full path, no ending slash!\n */\n siteUrl: string;\n /**\n * full url, no username\n */\n facebook?: string;\n /**\n * full url, no username\n */\n twitter?: string;\n /**\n * hide or show all email subscribe boxes\n */\n showSubscribe: boolean;\n /**\n * create a list on mailchimp and then create an embeddable signup form. this is the form action\n */\n mailchimpAction?: string;\n /**\n * this is the hidden input field name\n */\n mailchimpName?: string;\n /**\n * name and id of the mailchimp email field\n */\n mailchimpEmailFieldName?: string;\n /**\n /**\n * Meta tag for Google Webmaster Tools\n */\n googleSiteVerification?: string;\n /**\n /**\n * Appears alongside the footer, after the credits\n */\n footer?: string;\n}\n\nconst config: WebsiteConfig = {\n title: 'SPHTech Blog',\n description: 'Our collection of adventures, learnings and thoughts!',\n coverImage: 'img/blog-cover.jpg',\n logo: '',\n lang: 'en',\n siteUrl: 'https://sphtech.github.io',\n facebook: '',\n twitter: '',\n showSubscribe: false,\n mailchimpAction: 'https://twitter.us19.list-manage.com/subscribe/post?u=a89b6987ac248c81b0b7f3a0f&id=7d777b7d75',\n mailchimpName: 'b_a89b6987ac248c81b0b7f3a0f_7d777b7d75',\n mailchimpEmailFieldName: 'MERGE0',\n googleSiteVerification: 'GoogleCode',\n footer: 'is based on Gatsby Casper',\n};\n\nexport default config;\n","import { css } from '@emotion/core';\nimport styled from '@emotion/styled';\nimport { colors } from './colors';\nimport { darken, lighten } from 'polished';\n\nexport const outer = css`\n position: relative;\n padding: 0 4vw;\n`;\n\n// Centered content container blocks\nexport const inner = css`\n margin: 0 auto;\n max-width: 1040px;\n width: 100%;\n`;\n\nexport const SiteMain = css`\n z-index: 100;\n flex-grow: 1;\n`;\n\nexport const SiteTitle = styled.h1`\n z-index: 10;\n margin: 0;\n padding: 0;\n font-size: 3.8rem;\n font-weight: 700;\n`;\n\nexport const SiteDescription = styled.h2`\n z-index: 10;\n margin: 0;\n padding: 5px 0;\n font-size: 2.2rem;\n font-weight: 300;\n letter-spacing: 0.5px;\n opacity: 0.8;\n`;\n\nexport const PostFeed = css`\n position: relative;\n display: flex;\n flex-wrap: wrap;\n margin: 0 -20px;\n padding: 40px 0 0 0;\n`;\n\nexport const PostFeedRaise = css`\n @media (min-width: 900px) {\n margin-top: -70px;\n padding-top: 0;\n }\n`;\n\nexport const SocialLink = css`\n display: flex;\n justify-content: center;\n align-items: center;\n margin: 0;\n padding: 10px;\n color: #fff;\n opacity: 0.8;\n\n :hover {\n opacity: 1;\n }\n\n svg {\n height: 1.8rem;\n fill: #fff;\n }\n`;\n\nexport const SiteHeader = css`\n position: relative;\n padding-top: 12px;\n padding-bottom: 12px;\n color: #fff;\n /* background: color(var(--darkgrey) l(-5%)) no-repeat center center; */\n background: ${darken('0.05', colors.darkgrey)} no-repeat center center;\n background-size: cover;\n\n :before {\n content: '';\n position: absolute;\n top: 0;\n right: 0;\n left: 0;\n bottom: 0;\n z-index: 10;\n display: block;\n background: rgba(0,0,0,0.5);\n }\n`;\n\nexport const SiteHeaderContent = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n padding: 10vw 4vw;\n min-height: 200px;\n max-height: 450px;\n text-align: center;\n`;\n\nexport const SiteHeaderStyles = css`\n content: '';\n position: absolute;\n top: 0;\n right: 0;\n bottom: auto;\n left: 0;\n z-index: 10;\n display: block;\n height: 80px;\n background: linear-gradient(rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0));\n\n :before {\n content: '';\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 10;\n display: block;\n background: rgba(0, 0, 0, 0.18);\n }\n\n :after {\n content: '';\n position: absolute;\n top: 0;\n right: 0;\n bottom: auto;\n left: 0;\n z-index: 10;\n display: block;\n height: 80px;\n background: linear-gradient(rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0));\n }\n @media (max-width: 700px) {\n padding-right: 0;\n padding-left: 0;\n }\n`;\n\nexport const AuthorProfileImage = css`\n display: block;\n /* background: color(var(--lightgrey) l(+10%)); */\n background: ${lighten('0.1', colors.lightgrey)};\n border-radius: 100%;\n object-fit: cover;\n margin-right: 15px;\n width: 60px;\n height: 60px;\n`;\n","import * as React from 'react';\nimport styled from '@emotion/styled';\n\nconst StyledWrapper = styled.div`\n display: flex;\n flex-direction: column;\n min-height: 100vh;\n`;\n\ninterface WrapperProps {\n className?: string;\n}\n\nconst Wrapper: React.FC = ({ children, className }) => (\n {children}\n);\n\nexport default Wrapper;\n","import { Global, css } from '@emotion/core';\nimport { darken, lighten } from 'polished';\nimport * as React from 'react';\nimport Helmet from 'react-helmet';\n\nimport { colors } from '../styles/colors';\n// @ts-ignore\nimport favicon from '../../src/sphtech.png';\n\ninterface IndexProps {\n className?: string;\n}\n\nconst GlobalStyles = css`\n html,\n body,\n div,\n span,\n applet,\n object,\n iframe,\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n p,\n blockquote,\n pre,\n a,\n abbr,\n acronym,\n address,\n big,\n cite,\n code,\n del,\n dfn,\n em,\n img,\n ins,\n kbd,\n q,\n s,\n samp,\n small,\n strike,\n strong,\n sub,\n sup,\n tt,\n var,\n dl,\n dt,\n dd,\n ol,\n ul,\n li,\n fieldset,\n form,\n label,\n legend,\n table,\n caption,\n tbody,\n tfoot,\n thead,\n tr,\n th,\n td,\n article,\n aside,\n canvas,\n details,\n embed,\n figure,\n figcaption,\n footer,\n header,\n hgroup,\n menu,\n nav,\n output,\n ruby,\n section,\n summary,\n time,\n mark,\n audio,\n video {\n margin: 0;\n padding: 0;\n border: 0;\n font: inherit;\n font-size: 100%;\n vertical-align: baseline;\n }\n body {\n line-height: 1;\n }\n ol,\n ul {\n list-style: none;\n }\n blockquote,\n q {\n quotes: none;\n }\n blockquote:before,\n blockquote:after,\n q:before,\n q:after {\n content: '';\n content: none;\n }\n table {\n border-spacing: 0;\n border-collapse: collapse;\n }\n img {\n max-width: 100%;\n }\n html {\n box-sizing: border-box;\n font-family: sans-serif;\n\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n }\n *,\n *:before,\n *:after {\n box-sizing: inherit;\n }\n a {\n background-color: transparent;\n }\n a:active,\n a:hover {\n outline: 0;\n }\n b,\n strong {\n font-weight: bold;\n }\n i,\n em,\n dfn {\n font-style: italic;\n }\n h1 {\n margin: 0.67em 0;\n font-size: 2em;\n }\n small {\n font-size: 80%;\n }\n sub,\n sup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n }\n sup {\n top: -0.5em;\n }\n sub {\n bottom: -0.25em;\n }\n img {\n border: 0;\n }\n svg:not(:root) {\n overflow: hidden;\n }\n mark {\n background-color: #fdffb6;\n }\n code,\n kbd,\n pre,\n samp {\n font-family: monospace, monospace;\n font-size: 1em;\n }\n button,\n input,\n optgroup,\n select,\n textarea {\n margin: 0;\n color: inherit;\n font: inherit;\n }\n button {\n overflow: visible;\n border: none;\n }\n button,\n select {\n text-transform: none;\n }\n button,\n html input[type='button'],\n input[type='reset'],\n input[type='submit'] {\n cursor: pointer;\n\n -webkit-appearance: button;\n }\n button[disabled],\n html input[disabled] {\n cursor: default;\n }\n button::-moz-focus-inner,\n input::-moz-focus-inner {\n padding: 0;\n border: 0;\n }\n input {\n line-height: normal;\n }\n input:focus {\n outline: none;\n }\n input[type='checkbox'],\n input[type='radio'] {\n box-sizing: border-box;\n padding: 0;\n }\n input[type='number']::-webkit-inner-spin-button,\n input[type='number']::-webkit-outer-spin-button {\n height: auto;\n }\n input[type='search'] {\n box-sizing: content-box;\n\n -webkit-appearance: textfield;\n }\n input[type='search']::-webkit-search-cancel-button,\n input[type='search']::-webkit-search-decoration {\n -webkit-appearance: none;\n }\n legend {\n padding: 0;\n border: 0;\n }\n textarea {\n overflow: auto;\n }\n table {\n border-spacing: 0;\n border-collapse: collapse;\n }\n td,\n th {\n padding: 0;\n }\n\n html {\n overflow-x: hidden;\n overflow-y: scroll;\n font-size: 62.5%;\n\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n }\n body {\n overflow-x: hidden;\n color: ${darken('0.25', colors.midgrey)};\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell,\n 'Open Sans', 'Helvetica Neue', sans-serif;\n font-size: 1.5rem;\n line-height: 1.6em;\n font-weight: 400;\n font-style: normal;\n letter-spacing: 0;\n text-rendering: optimizeLegibility;\n background: #fff;\n\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n -moz-font-feature-settings: 'liga' on;\n }\n\n ::selection {\n text-shadow: none;\n background: ${lighten('0.3', colors.blue)};\n }\n\n hr {\n position: relative;\n display: block;\n width: 100%;\n margin: 2.5em 0 3.5em;\n padding: 0;\n height: 1px;\n border: 0;\n border-top: 1px solid ${lighten('0.1', colors.lightgrey)};\n }\n\n audio,\n canvas,\n iframe,\n img,\n svg,\n video {\n vertical-align: middle;\n }\n\n fieldset {\n margin: 0;\n padding: 0;\n border: 0;\n }\n\n textarea {\n resize: vertical;\n }\n\n p,\n ul,\n ol,\n dl,\n blockquote {\n margin: 0 0 1.5em 0;\n }\n\n ol,\n ul {\n padding-left: 1.3em;\n padding-right: 1.5em;\n }\n\n ol ol,\n ul ul,\n ul ol,\n ol ul {\n margin: 0.5em 0 1em;\n }\n\n ul {\n list-style: disc;\n }\n\n ol {\n list-style: decimal;\n }\n\n ul,\n ol {\n max-width: 100%;\n }\n\n li {\n margin: 0.5em 0;\n padding-left: 0.3em;\n line-height: 1.6em;\n }\n\n dt {\n float: left;\n margin: 0 20px 0 0;\n width: 120px;\n color: ${colors.darkgrey};\n font-weight: 500;\n text-align: right;\n }\n\n dd {\n margin: 0 0 5px 0;\n text-align: left;\n }\n\n blockquote {\n margin: 1.5em 0;\n padding: 0 1.6em 0 1.6em;\n border-left: ${colors.whitegrey} 0.5em solid;\n }\n\n blockquote p {\n margin: 0.8em 0;\n font-size: 1.2em;\n font-weight: 300;\n }\n\n blockquote small {\n display: inline-block;\n margin: 0.8em 0 0.8em 1.5em;\n font-size: 0.9em;\n opacity: 0.8;\n }\n\n blockquote small:before {\n content: '\\\\2014 \\\\00A0';\n }\n\n blockquote cite {\n font-weight: bold;\n }\n blockquote cite a {\n font-weight: normal;\n }\n\n a {\n color: ${darken('0.05', colors.blue)};\n text-decoration: none;\n }\n\n a:hover {\n text-decoration: underline;\n }\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6 {\n margin-top: 0;\n line-height: 1.15;\n font-weight: 700;\n text-rendering: optimizeLegibility;\n }\n\n h1 {\n margin: 0 0 0.5em 0;\n font-size: 5rem;\n font-weight: 700;\n }\n @media (max-width: 500px) {\n h1 {\n font-size: 2.2rem;\n }\n }\n\n h2 {\n margin: 1.5em 0 0.5em 0;\n font-size: 2rem;\n }\n @media (max-width: 500px) {\n h2 {\n font-size: 1.8rem;\n }\n }\n\n h3 {\n margin: 1.5em 0 0.5em 0;\n font-size: 1.8rem;\n font-weight: 500;\n }\n @media (max-width: 500px) {\n h3 {\n font-size: 1.7rem;\n }\n }\n\n h4 {\n margin: 1.5em 0 0.5em 0;\n font-size: 1.6rem;\n font-weight: 500;\n }\n\n h5 {\n margin: 1.5em 0 0.5em 0;\n font-size: 1.4rem;\n font-weight: 500;\n }\n\n h6 {\n margin: 1.5em 0 0.5em 0;\n font-size: 1.4rem;\n font-weight: 500;\n }\n\n body {\n background: #f4f8fb;\n }\n`;\n\nconst IndexLayout: React.FC = props => {\n return (\n
\n \n \n \n \n {props.children}\n
\n );\n};\n\nexport default IndexLayout;\n","import { Link } from 'gatsby';\nimport { setLightness } from 'polished';\nimport * as React from 'react';\nimport styled from '@emotion/styled';\nimport { css } from '@emotion/core';\n\nimport { colors } from '../styles/colors';\nimport { outer, inner } from '../styles/shared';\nimport config from '../website-config';\n\nconst SiteFooter = css`\n position: relative;\n padding-top: 20px;\n padding-bottom: 60px;\n color: #fff;\n background: ${setLightness('0.0015', colors.darkgrey)};\n`;\n\nconst SiteFooterContent = css`\n display: flex;\n flex-wrap: wrap;\n justify-content: space-between;\n align-items: center;\n color: rgba(255, 255, 255, 0.7);\n font-size: 1.3rem;\n a {\n color: rgba(255, 255, 255, 0.7);\n }\n a:hover {\n color: rgba(255, 255, 255, 1);\n text-decoration: none;\n }\n @media (max-width: 650px) {\n flex-direction: column;\n }\n`;\n\nconst SiteFooterNav = styled.nav`\n display: flex;\n\n a {\n position: relative;\n margin-left: 20px;\n }\n\n a:before {\n content: '';\n position: absolute;\n top: 11px;\n left: -11px;\n display: block;\n width: 2px;\n height: 2px;\n background: #fff;\n border-radius: 100%;\n }\n\n a:first-of-type:before {\n display: none;\n }\n @media (max-width: 650px) {\n a:first-child {\n margin-left: 0;\n }\n }\n`;\n\nconst Footer: React.FC = () => {\n return (\n
\n
\n
\n {config.title} © {new Date().getFullYear()}{' '}\n {config.footer && (\n \n | {config.title} {config.footer}\n \n )}\n
\n \n Latest Posts\n {config.facebook && (\n \n Facebook\n \n )}\n {config.twitter && (\n \n Twitter\n \n )}\n\n {/* \n Ghost\n */}\n\n {/* RSS */}\n \n
\n
\n );\n};\n\nexport default Footer;\n","import { graphql, StaticQuery } from 'gatsby';\nimport * as React from 'react';\nimport styled from '@emotion/styled'\n\nimport config from '../../website-config';\n\nconst SubscribeOverlayLogo = styled.img`\n position: fixed;\n top: 23px;\n left: 30px;\n height: 30px;\n`;\n\ninterface SiteNavLogoProps {\n logo?: {\n childImageSharp: {\n fixed: any;\n };\n };\n}\n\nconst SubscribeLogo = () => (\n \n data.logo && (\n \n )\n }\n />\n);\n\nexport default SubscribeLogo;\n","import * as React from 'react';\nimport styled from '@emotion/styled';\n\nimport { colors } from '../../styles/colors';\nimport config from '../../website-config';\nimport SubscribeForm from './SubscribeForm';\nimport SubscribeLogo from './SubscribeLogo';\n\ninterface SubscribeOverlayProps {\n open?: boolean;\n}\n\nconst SubscribeOverlay = styled.div`\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 9000;\n display: flex;\n justify-content: center;\n align-items: center;\n background: rgba(0, 25, 40, 0.97);\n opacity: ${(props: SubscribeOverlayProps) => (props.open ? 1 : 0)};\n transition: opacity 200ms ease-in;\n pointer-events: ${(props: SubscribeOverlayProps) => (props.open ? 'auto' : 'none')};\n backdrop-filter: blur(3px);\n\n form {\n display: flex;\n justify-content: center;\n align-items: center;\n margin: 0 auto;\n max-width: 500px;\n }\n\n .form-group {\n flex-grow: 1;\n }\n\n .subscribe-email {\n display: block;\n padding: 14px 20px;\n width: 100%;\n border: none;\n color: ${colors.midgrey};\n font-size: 2rem;\n line-height: 1em;\n font-weight: normal;\n letter-spacing: 0.5px;\n user-select: text;\n border-radius: 8px;\n transition: border-color 0.15s linear;\n\n -webkit-appearance: none;\n }\n\n button {\n display: inline-block;\n margin: 0 0 0 15px;\n padding: 0 25px;\n height: 52px;\n outline: none;\n color: #fff;\n font-size: 1.7rem;\n line-height: 37px;\n font-weight: 400;\n text-align: center;\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.1);\n background: linear-gradient(\n color(var(--blue) whiteness(+7%)),\n color(var(--blue) lightness(-7%) saturation(-10%)) 60%,\n color(var(--blue) lightness(-7%) saturation(-10%)) 90%,\n color(var(--blue) lightness(-4%) saturation(-10%))\n );\n border-radius: 8px;\n box-shadow: 0 0 0 1px inset rgba(0, 0, 0, 0.14);\n\n -webkit-font-smoothing: subpixel-antialiased;\n }\n`;\n\nconst SubscribeOverlayClose = styled.a`\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n display: block;\n\n :before {\n content: '';\n position: absolute;\n top: 40px;\n right: 25px;\n display: block;\n width: 30px;\n height: 2px;\n background: #fff;\n opacity: 0.8;\n transform: rotate(45deg);\n }\n\n :after {\n content: '';\n position: absolute;\n top: 40px;\n right: 25px;\n display: block;\n width: 30px;\n height: 2px;\n background: #fff;\n opacity: 0.8;\n transform: rotate(-45deg);\n }\n\n :hover {\n cursor: default;\n }\n`;\n\nconst SubscribeOverlayContent = styled.div`\n position: relative;\n z-index: 9999;\n margin: 0 0 5vw 0;\n padding: 4vw;\n color: #fff;\n text-align: center;\n`;\n\nconst SubscribeOverlayTitle = styled.h1`\n display: inline-block;\n margin: 0 0 10px 0;\n font-size: 6rem;\n line-height: 1.15em;\n`;\n\nconst SubscribeOverlayDescription = styled.p`\n margin: 0 auto 50px;\n max-width: 650px;\n font-family: Georgia, serif;\n font-size: 3rem;\n line-height: 1.3em;\n font-weight: 300;\n opacity: 0.8;\n`;\n\ninterface SubscribeState {\n isOpen: boolean;\n}\n\nclass SubscribeModal extends React.Component {\n constructor(props: any) {\n super(props);\n this.state = { isOpen: false };\n }\n\n componentWillUnmount() {\n this.unsubscribeEsc();\n }\n\n escFunction = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n this.close();\n }\n };\n\n subscribeEsc() {\n document.addEventListener('keydown', this.escFunction, false);\n }\n\n unsubscribeEsc() {\n document.removeEventListener('keydown', this.escFunction, false);\n }\n\n open = () => {\n this.setState({ isOpen: true });\n this.subscribeEsc();\n };\n\n close = () => {\n this.setState({ isOpen: false });\n this.unsubscribeEsc();\n };\n\n render() {\n return (\n \n \n \n \n Subscribe to {config.title}\n \n Stay up to date! Get all the latest & greatest posts delivered straight to your\n inbox\n \n \n \n \n );\n }\n}\n\nexport default SubscribeModal;\n","// tslint:disable:no-http-string\nimport { Link } from 'gatsby';\nimport * as React from 'react';\nimport styled from '@emotion/styled';\nimport { css } from '@emotion/core';\n\nimport { SocialLink } from '../../styles/shared';\nimport config from '../../website-config';\nimport Facebook from '../icons/facebook';\nimport Twitter from '../icons/twitter';\nimport SubscribeModal from '../subscribe/SubscribeOverlay';\n// import SiteNavLogo from './SiteNavLogo';\n\nconst HomeNavRaise = css`\n @media (min-width: 900px) {\n position: relative;\n top: -70px;\n }\n`;\n\nconst SiteNavStyles = css`\n position: relative;\n z-index: 300;\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n overflow-y: hidden;\n height: 40px;\n font-size: 1.2rem;\n`;\n\nconst SiteNavLeft = styled.div`\n display: flex;\n align-items: center;\n overflow-x: auto;\n overflow-y: hidden;\n -webkit-overflow-scrolling: touch;\n margin-right: 10px;\n padding-bottom: 80px;\n letter-spacing: 0.4px;\n white-space: nowrap;\n\n -ms-overflow-scrolling: touch;\n\n @media (max-width: 700px) {\n margin-right: 0;\n padding-left: 4vw;\n }\n`;\n\nconst NavStyles = css`\n display: flex;\n margin: 0 0 0 -12px;\n padding: 0;\n list-style: none;\n\n li {\n display: block;\n margin: 0;\n padding: 0;\n text-transform: uppercase;\n }\n\n li a {\n display: block;\n margin: 0;\n padding: 10px 12px;\n color: #fff;\n opacity: 0.8;\n }\n\n li a:hover {\n text-decoration: none;\n opacity: 1;\n }\n`;\n\nconst SiteNavRight = styled.div`\n flex-shrink: 0;\n display: flex;\n align-items: center;\n height: 40px;\n\n @media (max-width: 700px) {\n display: none;\n }\n`;\n\nconst SocialLinks = styled.div`\n flex-shrink: 0;\n display: flex;\n align-items: center;\n a:last-of-type {\n padding-right: 20px;\n }\n`;\n\nconst SubscribeButton = styled.a`\n display: block;\n padding: 4px 10px;\n border: #fff 1px solid;\n color: #fff;\n font-size: 1.2rem;\n line-height: 1em;\n border-radius: 10px;\n opacity: 0.8;\n\n :hover {\n text-decoration: none;\n opacity: 1;\n cursor: pointer;\n }\n`;\n\ninterface SiteNavProps {\n isHome?: boolean;\n}\n\ninterface SiteNaveState {\n isOpen: boolean;\n}\n\nclass SiteNav extends React.Component {\n subscribe = React.createRef();\n\n constructor(props: SiteNavProps) {\n super(props);\n this.state = { isOpen: false };\n }\n openModal = () => {\n if (this.subscribe.current) {\n this.subscribe.current.open();\n }\n };\n\n render() {\n const { isHome = false } = this.props;\n return (\n \n );\n }\n}\n\nexport default SiteNav;\n","const preferDefault = m => (m && m.default) || m\n\nif (process.env.BUILD_STAGE === `develop`) {\n module.exports = preferDefault(require(`./public-page-renderer-dev`))\n} else if (process.env.BUILD_STAGE === `build-javascript`) {\n module.exports = preferDefault(require(`./public-page-renderer-prod`))\n} else {\n module.exports = () => null\n}\n","import { darken, desaturate, lighten, mix } from 'polished';\nimport * as React from 'react';\nimport styled from '@emotion/styled';\nimport { css } from '@emotion/core';\n\nimport { colors } from '../../styles/colors';\nimport config from '../../website-config';\n\nconst SubscribeFormStyles = css`\n @media (max-width: 500px) {\n -ms-flex-direction: column;\n flex-direction: column;\n }\n`;\n\nconst SubscribeEmail = styled.input`\n display: block;\n padding: 10px;\n width: 100%;\n /* border: color(var(--lightgrey) l(+7%)) 1px solid; */\n border: ${lighten('0.07', colors.lightgrey)};\n color: ${colors.midgrey};\n font-size: 1.8rem;\n line-height: 1em;\n font-weight: normal;\n user-select: text;\n border-radius: 5px;\n transition: border-color 0.15s linear;\n\n -webkit-appearance: none;\n :focus {\n outline: 0;\n /* border-color: color(var(--lightgrey) l(-2%)); */\n border-color: ${darken('0.02', colors.lightgrey)};\n }\n`;\n\nconst SubscribeFormButton = styled.button`\n display: inline-block;\n margin: 0 0 0 10px;\n padding: 0 20px;\n height: 41px;\n outline: none;\n color: #fff;\n font-size: 1.5rem;\n line-height: 37px;\n font-weight: 400;\n text-align: center;\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.1);\n /* background: linear-gradient(\n color(var(--blue) whiteness(+7%)),\n color(var(--blue) lightness(-7%) saturation(-10%)) 60%,\n color(var(--blue) lightness(-7%) saturation(-10%)) 90%,\n color(var(--blue) lightness(-4%) saturation(-10%))\n ); */\n background: linear-gradient(\n ${mix('0.1', '#fff', colors.blue)},\n ${desaturate('0.1', darken('0.07', colors.blue))} 60%,\n ${desaturate('0.1', darken('0.07', colors.blue))} 90%,\n ${desaturate('0.1', darken('0.04', colors.blue))}\n );\n border-radius: 5px;\n box-shadow: 0 0 0 1px inset rgba(0, 0, 0, 0.14);\n\n -webkit-font-smoothing: subpixel-antialiased;\n\n :active,\n :focus {\n /* background: color(var(--blue) lightness(-9%) saturation(-10%)); */\n background: ${desaturate('0.1', darken('0.09', colors.blue))};\n }\n @media (max-width: 500px) {\n margin: 10px 0 0;\n width: 100%;\n }\n`;\n\nconst FormGroup = styled.div`\n flex-grow: 1;\n @media (max-width: 500px) {\n width: 100%;\n }\n`;\n\nconst SubscribeForm: React.FC = () => {\n return (\n \n {/* This is required for the form to work correctly */}\n \n \n \n
\n \n
\n \n Subscribe\n \n \n );\n};\n\nexport default SubscribeForm;\n","import React from \"react\"\nimport PropTypes from \"prop-types\"\n\nimport InternalPageRenderer from \"./page-renderer\"\n\nconst ProdPageRenderer = ({ location, pageResources }) => {\n if (!pageResources) {\n return null\n }\n return React.createElement(InternalPageRenderer, {\n location,\n pageResources,\n ...pageResources.json,\n })\n}\n\nProdPageRenderer.propTypes = {\n location: PropTypes.shape({\n pathname: PropTypes.string.isRequired,\n }).isRequired,\n}\n\nexport default ProdPageRenderer\n","module.exports = \"data:image/png;base64,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\"","// tslint:disable:no-http-string\nimport * as React from 'react';\n\nconst Facebook: React.FC = () => (\n \n \n \n);\nexport default Facebook;\n","// tslint:disable:no-http-string\nimport * as React from 'react';\n\nconst Twitter: React.FC = () => (\n \n \n \n);\nexport default Twitter;\n"],"sourceRoot":""} \ No newline at end of file diff --git a/1-b68cb9e597226f1d3f10.js b/1-b68cb9e597226f1d3f10.js new file mode 100644 index 0000000..a810c91 --- /dev/null +++ b/1-b68cb9e597226f1d3f10.js @@ -0,0 +1,2 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[1],{172:function(e,t,i){"use strict";i.d(t,"a",function(){return n});var n={blue:"#3eb0ef",green:"#a4d037",purple:"#ad26b4",yellow:"#fecd35",red:"#f05230",darkgrey:"#15171A",midgrey:"#738a94",lightgrey:"#c5d2d9",whitegrey:"#e5eff5",pink:"#fa3a57",brown:"#a3821a"}},174:function(e,t,i){"use strict";i.d(t,"b",function(){return p});var n=i(12),a=i(0),o=i.n(a),r=i(6),s=i.n(r),l=i(44),c=i.n(l);i.d(t,"a",function(){return c.a});i(189);var d=o.a.createContext({});function b(e){var t=e.staticQueryData,i=e.data,a=e.query,r=e.render,s=i?i.data:t[a]&&t[a].data;return Object(n.d)(o.a.Fragment,null,s&&r(s),!s&&Object(n.d)("div",null,"Loading (StaticQuery)"))}var p=function(e){var t=e.data,i=e.query,a=e.render,o=e.children;return Object(n.d)(d.Consumer,null,function(e){return Object(n.d)(b,{data:t,query:i,render:a||o,staticQueryData:e})})};p.propTypes={data:s.a.object,query:s.a.string.isRequired,render:s.a.func,children:s.a.func}},175:function(e,t,i){"use strict";t.a={title:"SPHTech Blog",description:"Our collection of adventures, learnings and thoughts!",coverImage:"img/blog-cover.jpg",logo:"",lang:"en",siteUrl:"https://sphtech.github.io",facebook:"",twitter:"",showSubscribe:!1,mailchimpAction:"https://twitter.us19.list-manage.com/subscribe/post?u=a89b6987ac248c81b0b7f3a0f&id=7d777b7d75",mailchimpName:"b_a89b6987ac248c81b0b7f3a0f_7d777b7d75",mailchimpEmailFieldName:"MERGE0",googleSiteVerification:"GoogleCode",footer:"is based on Gatsby Casper"}},177:function(e,t,i){"use strict";i.d(t,"k",function(){return s}),i.d(t,"j",function(){return l}),i.d(t,"g",function(){return c}),i.d(t,"h",function(){return d}),i.d(t,"d",function(){return b}),i.d(t,"b",function(){return p}),i.d(t,"c",function(){return g}),i.d(t,"i",function(){return u}),i.d(t,"e",function(){return m}),i.d(t,"f",function(){return f}),i.d(t,"a",function(){return h});var n=i(171),a=i(12),o=i(172),r=i(173),s={name:"1x0l29j",styles:"position:relative;padding:0 4vw;"},l={name:"s2cjas",styles:"margin:0 auto;max-width:1040px;width:100%;"},c={name:"1ptyxcl",styles:"z-index:100;flex-grow:1;"},d=Object(n.a)("h1",{target:"e1yzaf1e0"})({name:"auy6fs",styles:"z-index:10;margin:0;padding:0;font-size:3.8rem;font-weight:700;"}),b=Object(n.a)("h2",{target:"e1yzaf1e1"})({name:"1c86fji",styles:"z-index:10;margin:0;padding:5px 0;font-size:2.2rem;font-weight:300;letter-spacing:0.5px;opacity:0.8;"}),p={name:"ueft86",styles:"position:relative;display:flex;flex-wrap:wrap;margin:0 -20px;padding:40px 0 0 0;"},g={name:"ettpeh",styles:"@media (min-width:900px){margin-top:-70px;padding-top:0;}"},u={name:"1l1dftb",styles:"display:flex;justify-content:center;align-items:center;margin:0;padding:10px;color:#fff;opacity:0.8;:hover{opacity:1;}svg{height:1.8rem;fill:#fff;}"},m=Object(a.c)("position:relative;padding-top:12px;padding-bottom:12px;color:#fff;background:",Object(r.a)("0.05",o.a.darkgrey)," no-repeat center center;background-size:cover;:before{content:'';position:absolute;top:0;right:0;left:0;bottom:0;z-index:10;display:block;background:rgba(0,0,0,0.5);}"),f=Object(n.a)("div",{target:"e1yzaf1e2"})({name:"h7hfdz",styles:"display:flex;flex-direction:column;justify-content:center;align-items:center;padding:10vw 4vw;min-height:200px;max-height:450px;text-align:center;"}),h=Object(a.c)("display:block;background:",Object(r.c)("0.1",o.a.lightgrey),";border-radius:100%;object-fit:cover;margin-right:15px;width:60px;height:60px;")},182:function(e,t,i){"use strict";var n=i(171),a=i(12),o=(i(0),Object(n.a)("div",{target:"esvym2d0"})({name:"zf0iqh",styles:"display:flex;flex-direction:column;min-height:100vh;"}));t.a=function(e){var t=e.children,i=e.className;return Object(a.d)(o,{className:i},t)}},183:function(e,t,i){"use strict";var n=i(12),a=i(173),o=(i(0),i(181)),r=i.n(o),s=i(172),l=i(198),c=i.n(l),d=Object(n.c)("html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font:inherit;font-size:100%;vertical-align:baseline;}body{line-height:1;}ol,ul{list-style:none;}blockquote,q{quotes:none;}blockquote:before,blockquote:after,q:before,q:after{content:'';content:none;}table{border-spacing:0;border-collapse:collapse;}img{max-width:100%;}html{box-sizing:border-box;font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;}*,*:before,*:after{box-sizing:inherit;}a{background-color:transparent;}a:active,a:hover{outline:0;}b,strong{font-weight:bold;}i,em,dfn{font-style:italic;}h1{margin:0.67em 0;font-size:2em;}small{font-size:80%;}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline;}sup{top:-0.5em;}sub{bottom:-0.25em;}img{border:0;}svg:not(:root){overflow:hidden;}mark{background-color:#fdffb6;}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em;}button,input,optgroup,select,textarea{margin:0;color:inherit;font:inherit;}button{overflow:visible;border:none;}button,select{text-transform:none;}button,html input[type='button'],input[type='reset'],input[type='submit']{cursor:pointer;-webkit-appearance:button;}button[disabled],html input[disabled]{cursor:default;}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0;}input{line-height:normal;}input:focus{outline:none;}input[type='checkbox'],input[type='radio']{box-sizing:border-box;padding:0;}input[type='number']::-webkit-inner-spin-button,input[type='number']::-webkit-outer-spin-button{height:auto;}input[type='search']{box-sizing:content-box;-webkit-appearance:textfield;}input[type='search']::-webkit-search-cancel-button,input[type='search']::-webkit-search-decoration{-webkit-appearance:none;}legend{padding:0;border:0;}textarea{overflow:auto;}table{border-spacing:0;border-collapse:collapse;}td,th{padding:0;}html{overflow-x:hidden;overflow-y:scroll;font-size:62.5%;-webkit-tap-highlight-color:rgba(0,0,0,0);}body{overflow-x:hidden;color:",Object(a.a)("0.25",s.a.midgrey),";font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif;font-size:1.5rem;line-height:1.6em;font-weight:400;font-style:normal;letter-spacing:0;text-rendering:optimizeLegibility;background:#fff;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-moz-font-feature-settings:'liga' on;}::selection{text-shadow:none;background:",Object(a.c)("0.3",s.a.blue),";}hr{position:relative;display:block;width:100%;margin:2.5em 0 3.5em;padding:0;height:1px;border:0;border-top:1px solid ",Object(a.c)("0.1",s.a.lightgrey),";}audio,canvas,iframe,img,svg,video{vertical-align:middle;}fieldset{margin:0;padding:0;border:0;}textarea{resize:vertical;}p,ul,ol,dl,blockquote{margin:0 0 1.5em 0;}ol,ul{padding-left:1.3em;padding-right:1.5em;}ol ol,ul ul,ul ol,ol ul{margin:0.5em 0 1em;}ul{list-style:disc;}ol{list-style:decimal;}ul,ol{max-width:100%;}li{margin:0.5em 0;padding-left:0.3em;line-height:1.6em;}dt{float:left;margin:0 20px 0 0;width:120px;color:",s.a.darkgrey,";font-weight:500;text-align:right;}dd{margin:0 0 5px 0;text-align:left;}blockquote{margin:1.5em 0;padding:0 1.6em 0 1.6em;border-left:",s.a.whitegrey," 0.5em solid;}blockquote p{margin:0.8em 0;font-size:1.2em;font-weight:300;}blockquote small{display:inline-block;margin:0.8em 0 0.8em 1.5em;font-size:0.9em;opacity:0.8;}blockquote small:before{content:'\\2014 \\00A0';}blockquote cite{font-weight:bold;}blockquote cite a{font-weight:normal;}a{color:",Object(a.a)("0.05",s.a.blue),";text-decoration:none;}a:hover{text-decoration:underline;}h1,h2,h3,h4,h5,h6{margin-top:0;line-height:1.15;font-weight:700;text-rendering:optimizeLegibility;}h1{margin:0 0 0.5em 0;font-size:5rem;font-weight:700;}@media (max-width:500px){h1{font-size:2.2rem;}}h2{margin:1.5em 0 0.5em 0;font-size:2rem;}@media (max-width:500px){h2{font-size:1.8rem;}}h3{margin:1.5em 0 0.5em 0;font-size:1.8rem;font-weight:500;}@media (max-width:500px){h3{font-size:1.7rem;}}h4{margin:1.5em 0 0.5em 0;font-size:1.6rem;font-weight:500;}h5{margin:1.5em 0 0.5em 0;font-size:1.4rem;font-weight:500;}h6{margin:1.5em 0 0.5em 0;font-size:1.4rem;font-weight:500;}body{background:#f4f8fb;}");t.a=function(e){return Object(n.d)("div",{className:e.className},Object(n.d)(r.a,null,Object(n.d)("link",{rel:"icon",href:c.a,type:"image/x-icon"})),Object(n.d)(n.a,{styles:d}),e.children)}},184:function(e,t,i){"use strict";var n=i(34),a=i(171),o=i(12),r=i(174),s=i(173),l=(i(0),i(172)),c=i(177),d=i(175),b=Object(o.c)("position:relative;padding-top:20px;padding-bottom:60px;color:#fff;background:",Object(s.e)("0.0015",l.a.darkgrey),";"),p={name:"1ugh7vk",styles:"display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;color:rgba(255,255,255,0.7);font-size:1.3rem;a{color:rgba(255,255,255,0.7);}a:hover{color:rgba(255,255,255,1);text-decoration:none;}@media (max-width:650px){flex-direction:column;}"},g=Object(a.a)("nav",{target:"e1me3zb40"})({name:"j0kq43",styles:"display:flex;a{position:relative;margin-left:20px;}a:before{content:'';position:absolute;top:11px;left:-11px;display:block;width:2px;height:2px;background:#fff;border-radius:100%;}a:first-of-type:before{display:none;}@media (max-width:650px){a:first-child{margin-left:0;}}"});t.a=function(){return Object(o.d)("footer",{css:Object(n.a)([c.k,b])},Object(o.d)("div",{css:Object(n.a)([c.j,p])},Object(o.d)("section",{className:"copyright"},Object(o.d)(r.a,{to:"/"},d.a.title)," © ",(new Date).getFullYear()," ",d.a.footer&&Object(o.d)(r.a,{to:"/"},"| ",d.a.title," ",d.a.footer)),Object(o.d)(g,null,Object(o.d)(r.a,{to:"/"},"Latest Posts"),d.a.facebook&&Object(o.d)("a",{href:d.a.facebook,target:"_blank",rel:"noopener noreferrer"},"Facebook"),d.a.twitter&&Object(o.d)("a",{href:d.a.twitter,target:"_blank",rel:"noopener noreferrer"},"Twitter"),Object(o.d)("a",{href:"https://sph.com.sg/legal/sph_privacy.html",target:"_blank",rel:"noopener noreferrer"},"Privacy Policy"),Object(o.d)("a",{href:"https://sph.com.sg/legal/pdpa.html",target:"_blank",rel:"noopener noreferrer"},"Personal Data Statement"),Object(o.d)("a",{href:"https://sph.com.sg/legal/website_tnc.html",target:"_blank",rel:"noopener noreferrer"},"Terms & Conditions"))))}},185:function(e,t,i){"use strict";var n=i(34),a=i(8),o=i.n(a),r=i(171),s=i(12),l=i(174),c=i(0),d=i(177),b=i(175),p=i(200),g=i(201),u=i(172),m=i(191),f=(i(179),i(220)),h=Object(r.a)("img",{target:"e1y9uxgx0"})({name:"sgb6d4",styles:"position:fixed;top:23px;left:30px;height:30px;"}),x=function(){return Object(s.d)(l.b,{query:"1115645022",render:function(e){return e.logo&&Object(s.d)(h,{src:e.logo.childImageSharp.fixed.src,alt:b.a.title})},data:f})},y=Object(r.a)("div",{target:"ehky8d0"})("position:fixed;top:0;right:0;bottom:0;left:0;z-index:9000;display:flex;justify-content:center;align-items:center;background:rgba(0,25,40,0.97);opacity:",function(e){return e.open?1:0},";transition:opacity 200ms ease-in;pointer-events:",function(e){return e.open?"auto":"none"},";backdrop-filter:blur(3px);form{display:flex;justify-content:center;align-items:center;margin:0 auto;max-width:500px;}.form-group{flex-grow:1;}.subscribe-email{display:block;padding:14px 20px;width:100%;border:none;color:",u.a.midgrey,";font-size:2rem;line-height:1em;font-weight:normal;letter-spacing:0.5px;user-select:text;border-radius:8px;transition:border-color 0.15s linear;-webkit-appearance:none;}button{display:inline-block;margin:0 0 0 15px;padding:0 25px;height:52px;outline:none;color:#fff;font-size:1.7rem;line-height:37px;font-weight:400;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.1);background:linear-gradient( color(var(--blue) whiteness(+7%)),color(var(--blue) lightness(-7%) saturation(-10%)) 60%,color(var(--blue) lightness(-7%) saturation(-10%)) 90%,color(var(--blue) lightness(-4%) saturation(-10%)) );border-radius:8px;box-shadow:0 0 0 1px inset rgba(0,0,0,0.14);-webkit-font-smoothing:subpixel-antialiased;}"),A=Object(r.a)("a",{target:"ehky8d1"})({name:"1574915",styles:"position:absolute;top:0;right:0;bottom:0;left:0;display:block;:before{content:'';position:absolute;top:40px;right:25px;display:block;width:30px;height:2px;background:#fff;opacity:0.8;transform:rotate(45deg);}:after{content:'';position:absolute;top:40px;right:25px;display:block;width:30px;height:2px;background:#fff;opacity:0.8;transform:rotate(-45deg);}:hover{cursor:default;}"}),v=Object(r.a)("div",{target:"ehky8d2"})({name:"5xk39p",styles:"position:relative;z-index:9999;margin:0 0 5vw 0;padding:4vw;color:#fff;text-align:center;"}),w=Object(r.a)("h1",{target:"ehky8d3"})({name:"1wdd2ea",styles:"display:inline-block;margin:0 0 10px 0;font-size:6rem;line-height:1.15em;"}),j=Object(r.a)("p",{target:"ehky8d4"})({name:"1xbuinu",styles:"margin:0 auto 50px;max-width:650px;font-family:Georgia,serif;font-size:3rem;line-height:1.3em;font-weight:300;opacity:0.8;"}),O=function(e){function t(t){var i;return(i=e.call(this,t)||this).escFunction=function(e){"Escape"===e.key&&i.close()},i.open=function(){i.setState({isOpen:!0}),i.subscribeEsc()},i.close=function(){i.setState({isOpen:!1}),i.unsubscribeEsc()},i.state={isOpen:!1},i}o()(t,e);var i=t.prototype;return i.componentWillUnmount=function(){this.unsubscribeEsc()},i.subscribeEsc=function(){document.addEventListener("keydown",this.escFunction,!1)},i.unsubscribeEsc=function(){document.removeEventListener("keydown",this.escFunction,!1)},i.render=function(){return Object(s.d)(y,{open:this.state.isOpen},Object(s.d)(A,{onClick:this.close}),Object(s.d)(v,null,Object(s.d)(x,null),Object(s.d)(w,null,"Subscribe to ",b.a.title),Object(s.d)(j,null,"Stay up to date! Get all the latest & greatest posts delivered straight to your inbox"),Object(s.d)(m.a,null)))},t}(c.Component),k={name:"1c8x79b",styles:"@media (min-width:900px){position:relative;top:-70px;}"},z={name:"a1zygu",styles:"position:relative;z-index:300;display:flex;justify-content:space-between;align-items:flex-start;overflow-y:hidden;height:40px;font-size:1.2rem;"},C=Object(r.a)("div",{target:"e1sju8vj0"})({name:"25mjrn",styles:"display:flex;align-items:center;overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;margin-right:10px;padding-bottom:80px;letter-spacing:0.4px;white-space:nowrap;-ms-overflow-scrolling:touch;@media (max-width:700px){margin-right:0;padding-left:4vw;}"}),X={name:"1trdsxq",styles:"display:flex;margin:0 0 0 -12px;padding:0;list-style:none;li{display:block;margin:0;padding:0;text-transform:uppercase;}li a{display:block;margin:0;padding:10px 12px;color:#fff;opacity:0.8;}li a:hover{text-decoration:none;opacity:1;}"},G=Object(r.a)("div",{target:"e1sju8vj1"})({name:"cniab2",styles:"flex-shrink:0;display:flex;align-items:center;height:40px;@media (max-width:700px){display:none;}"}),R=Object(r.a)("div",{target:"e1sju8vj2"})({name:"1im5alu",styles:"flex-shrink:0;display:flex;align-items:center;a:last-of-type{padding-right:20px;}"}),W=Object(r.a)("a",{target:"e1sju8vj3"})({name:"13yl2z4",styles:"display:block;padding:4px 10px;border:#fff 1px solid;color:#fff;font-size:1.2rem;line-height:1em;border-radius:10px;opacity:0.8;:hover{text-decoration:none;opacity:1;cursor:pointer;}"}),N=function(e){function t(t){var i;return(i=e.call(this,t)||this).subscribe=c.createRef(),i.openModal=function(){i.subscribe.current&&i.subscribe.current.open()},i.state={isOpen:!1},i}return o()(t,e),t.prototype.render=function(){var e=this.props.isHome,t=void 0!==e&&e;return Object(s.d)("nav",{css:Object(n.a)([t&&k,z])},Object(s.d)(C,null,!t,Object(s.d)("ul",{css:X,role:"menu"},Object(s.d)("li",{role:"menuitem"},Object(s.d)(l.a,{to:"/"},"Home")),Object(s.d)("li",{role:"menuitem"},Object(s.d)(l.a,{to:"/about-us"},"About")))),Object(s.d)(G,null,Object(s.d)(R,null,b.a.facebook&&Object(s.d)("a",{css:d.i,href:b.a.facebook,target:"_blank",title:"Facebook",rel:"noopener noreferrer"},Object(s.d)(p.a,null)),b.a.twitter&&Object(s.d)("a",{css:d.i,href:b.a.twitter,title:"Twitter",target:"_blank",rel:"noopener noreferrer"},Object(s.d)(g.a,null))),b.a.showSubscribe&&Object(s.d)(W,{onClick:this.openModal},"Subscribe"),b.a.showSubscribe&&Object(s.d)(O,{ref:this.subscribe})))},t}(c.Component);t.a=N},189:function(e,t,i){var n;e.exports=(n=i(195))&&n.default||n},191:function(e,t,i){"use strict";var n=i(171),a=i(12),o=i(173),r=(i(0),i(172)),s=i(175),l={name:"b8yrw1",styles:"@media (max-width:500px){-ms-flex-direction:column;flex-direction:column;}"},c=Object(n.a)("input",{target:"egytw1t0"})("display:block;padding:10px;width:100%;border:",Object(o.c)("0.07",r.a.lightgrey),";color:",r.a.midgrey,";font-size:1.8rem;line-height:1em;font-weight:normal;user-select:text;border-radius:5px;transition:border-color 0.15s linear;-webkit-appearance:none;:focus{outline:0;border-color:",Object(o.a)("0.02",r.a.lightgrey),";}"),d=Object(n.a)("button",{target:"egytw1t1"})("display:inline-block;margin:0 0 0 10px;padding:0 20px;height:41px;outline:none;color:#fff;font-size:1.5rem;line-height:37px;font-weight:400;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.1);background:linear-gradient( ",Object(o.d)("0.1","#fff",r.a.blue),",",Object(o.b)("0.1",Object(o.a)("0.07",r.a.blue))," 60%,",Object(o.b)("0.1",Object(o.a)("0.07",r.a.blue))," 90%,",Object(o.b)("0.1",Object(o.a)("0.04",r.a.blue))," );border-radius:5px;box-shadow:0 0 0 1px inset rgba(0,0,0,0.14);-webkit-font-smoothing:subpixel-antialiased;:active,:focus{background:",Object(o.b)("0.1",Object(o.a)("0.09",r.a.blue)),";}@media (max-width:500px){margin:10px 0 0;width:100%;}"),b=Object(n.a)("div",{target:"egytw1t2"})({name:"t7b6tq",styles:"flex-grow:1;@media (max-width:500px){width:100%;}"});t.a=function(){return Object(a.d)("form",{css:l,action:s.a.mailchimpAction,method:"post",id:"mc-embedded-subscribe-form",name:"mc-embedded-subscribe-form",target:"_blank",noValidate:!0},Object(a.d)(b,{className:"form-group"},Object(a.d)(c,{className:"subscribe-email",type:"email",name:s.a.mailchimpEmailFieldName,id:s.a.mailchimpEmailFieldName,placeholder:"youremail@example.com"})),Object(a.d)("div",{style:{position:"absolute",left:"-5000px"},"aria-hidden":"true"},Object(a.d)("input",{type:"text",name:s.a.mailchimpName,tabIndex:-1})),Object(a.d)(d,{type:"submit"},Object(a.d)("span",null,"Subscribe")))}},195:function(e,t,i){"use strict";i.r(t);i(70);var n=i(0),a=i.n(n),o=i(6),r=i.n(o),s=i(74),l=function(e){var t=e.location,i=e.pageResources;return i?a.a.createElement(s.a,Object.assign({location:t,pageResources:i},i.json)):null};l.propTypes={location:r.a.shape({pathname:r.a.string.isRequired}).isRequired},t.default=l},198:function(e,t){e.exports="data:image/png;base64,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"},200:function(e,t,i){"use strict";var n=i(12);i(0);t.a=function(){return Object(n.d)("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32",style:{height:"1.5rem"}},Object(n.d)("path",{d:"M19 6h5V0h-5c-3.86 0-7 3.14-7 7v3H8v6h4v16h6V16h5l1-6h-6V7c0-.542.458-1 1-1z"}))}},201:function(e,t,i){"use strict";var n=i(12);i(0);t.a=function(){return Object(n.d)("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32"},Object(n.d)("path",{d:"M30.063 7.313c-.813 1.125-1.75 2.125-2.875 2.938v.75c0 1.563-.188 3.125-.688 4.625a15.088 15.088 0 0 1-2.063 4.438c-.875 1.438-2 2.688-3.25 3.813a15.015 15.015 0 0 1-4.625 2.563c-1.813.688-3.75 1-5.75 1-3.25 0-6.188-.875-8.875-2.625.438.063.875.125 1.375.125 2.688 0 5.063-.875 7.188-2.5-1.25 0-2.375-.375-3.375-1.125s-1.688-1.688-2.063-2.875c.438.063.813.125 1.125.125.5 0 1-.063 1.5-.25-1.313-.25-2.438-.938-3.313-1.938a5.673 5.673 0 0 1-1.313-3.688v-.063c.813.438 1.688.688 2.625.688a5.228 5.228 0 0 1-1.875-2c-.5-.875-.688-1.813-.688-2.75 0-1.063.25-2.063.75-2.938 1.438 1.75 3.188 3.188 5.25 4.25s4.313 1.688 6.688 1.813a5.579 5.579 0 0 1 1.5-5.438c1.125-1.125 2.5-1.688 4.125-1.688s3.063.625 4.188 1.813a11.48 11.48 0 0 0 3.688-1.375c-.438 1.375-1.313 2.438-2.563 3.188 1.125-.125 2.188-.438 3.313-.875z"}))}},220:function(e){e.exports={data:{logo:{childImageSharp:{fixed:{base64:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsSAAALEgHS3X78AAABFUlEQVQY023PvUrDUBTA8ZuCtoMoOLQ4dWhN14x2kEKXFkGoohQ/QBexOHRycAidKkgHHRq69APRoTjFJYODIA6+gSBYfYMmfYLE/5VT6NALP845NyeHc9UoCHZRQvonCLKKE4ZhAXYURTsYoE9dIy5iCzfUJnEdV+RF4iu6ikFH2EPxazzOcJmg4Rnn5C8ysIEOHqTe5/sT3qXOwYOtRr5/wLAqzpCTDXu4p2ETtyjgGJ/cX+se8jeU9fa4RBt5vWENpjzdkoGPcGg4RQsbOMEFmnBRRwVDHEK/yFXfvr/CoPjvZLKcdByDyzWGeajigzorGy0oOeRJiUtITe/pX1XzDk3buIMltSFR/zTtic3060X+8z8PsEUt8G3LVQAAAABJRU5ErkJggg==",width:400,height:128,src:"/static/2b5eaa0de166a8b5faebad4955c2200c/647de/ghost-logo.png",srcSet:"/static/2b5eaa0de166a8b5faebad4955c2200c/647de/ghost-logo.png 1x"}}}}}}}]); +//# sourceMappingURL=1-b68cb9e597226f1d3f10.js.map \ No newline at end of file diff --git a/1-b68cb9e597226f1d3f10.js.map b/1-b68cb9e597226f1d3f10.js.map new file mode 100644 index 0000000..db1837f --- /dev/null +++ b/1-b68cb9e597226f1d3f10.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/styles/colors.ts","webpack:///./.cache/gatsby-browser-entry.js","webpack:///./src/website-config.ts","webpack:///./src/styles/shared.ts","webpack:///./src/components/Wrapper.tsx","webpack:///./src/layouts/index.tsx","webpack:///./src/components/Footer.tsx","webpack:///./src/components/subscribe/SubscribeLogo.tsx","webpack:///./src/components/subscribe/SubscribeOverlay.tsx","webpack:///./src/components/header/SiteNav.tsx","webpack:///./.cache/public-page-renderer.js","webpack:///./src/components/subscribe/SubscribeForm.tsx","webpack:///./.cache/public-page-renderer-prod.js","webpack:///./src/sphtech.png","webpack:///./src/components/icons/facebook.tsx","webpack:///./src/components/icons/twitter.tsx"],"names":["__webpack_require__","d","__webpack_exports__","colors","blue","green","purple","yellow","red","darkgrey","midgrey","lightgrey","whitegrey","pink","brown","StaticQueryContext","React","createContext","StaticQueryDataRenderer","_ref","staticQueryData","data","query","render","finalData","Object","_emotion_core__WEBPACK_IMPORTED_MODULE_0__","react__WEBPACK_IMPORTED_MODULE_1___default","a","Fragment","StaticQuery","props","children","Consumer","propTypes","PropTypes","object","string","isRequired","func","config","title","description","coverImage","logo","lang","siteUrl","facebook","twitter","showSubscribe","mailchimpAction","mailchimpName","mailchimpEmailFieldName","googleSiteVerification","footer","outer","name","styles","inner","SiteMain","SiteTitle","_emotion_styled_base__WEBPACK_IMPORTED_MODULE_0__","target","SiteDescription","PostFeed","PostFeedRaise","SocialLink","SiteHeader","css","darken","SiteHeaderContent","AuthorProfileImage","lighten","StyledWrapper","Wrapper","className","_emotion_core__WEBPACK_IMPORTED_MODULE_1__","GlobalStyles","IndexLayout","react_helmet__WEBPACK_IMPORTED_MODULE_3___default","rel","href","favicon","type","SiteFooter","setLightness","SiteFooterContent","SiteFooterNav","_emotion_styled_base__WEBPACK_IMPORTED_MODULE_1__","Footer","_emotion_core__WEBPACK_IMPORTED_MODULE_2__","_emotion_css__WEBPACK_IMPORTED_MODULE_0__","gatsby__WEBPACK_IMPORTED_MODULE_3__","to","Date","getFullYear","SubscribeOverlayLogo","styled_base_browser_esm","SubscribeLogo","core_browser_esm","gatsby_browser_entry","src","childImageSharp","fixed","alt","_1115645022","SubscribeOverlay","open","SubscribeOverlayClose","SubscribeOverlayContent","SubscribeOverlayTitle","SubscribeOverlayDescription","SubscribeModal","_this","_React$Component","call","this","escFunction","event","key","close","setState","isOpen","subscribeEsc","unsubscribeEsc","state","componentWillUnmount","document","addEventListener","removeEventListener","onClick","subscribe_SubscribeLogo","SubscribeForm","HomeNavRaise","SiteNavStyles","SiteNavLeft","NavStyles","SiteNavRight","SocialLinks","SubscribeButton","SiteNav","subscribe","openModal","current","_this$props$isHome","isHome","css_browser_esm","role","subscribe_SubscribeOverlay","ref","m","module","exports","require","default","SubscribeFormStyles","SubscribeEmail","SubscribeFormButton","mix","desaturate","FormGroup","action","method","id","noValidate","placeholder","style","position","left","aria-hidden","tabIndex","ProdPageRenderer","location","pageResources","createElement","InternalPageRenderer","assign","json","shape","pathname","Facebook","xmlns","viewBox","height","Twitter"],"mappings":"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","file":"1-b68cb9e597226f1d3f10.js","sourcesContent":["export const colors = {\n blue: '#3eb0ef',\n green: '#a4d037',\n purple: '#ad26b4',\n yellow: '#fecd35',\n red: '#f05230',\n darkgrey: '#15171A',\n midgrey: '#738a94',\n lightgrey: '#c5d2d9',\n whitegrey: '#e5eff5',\n pink: '#fa3a57',\n brown: '#a3821a',\n};\n","import React from \"react\"\nimport PropTypes from \"prop-types\"\nimport Link, {\n withPrefix,\n withAssetPrefix,\n navigate,\n push,\n replace,\n navigateTo,\n parsePath,\n} from \"gatsby-link\"\nimport PageRenderer from \"./public-page-renderer\"\n\nconst StaticQueryContext = React.createContext({})\n\nfunction StaticQueryDataRenderer({ staticQueryData, data, query, render }) {\n const finalData = data\n ? data.data\n : staticQueryData[query] && staticQueryData[query].data\n\n return (\n \n {finalData && render(finalData)}\n {!finalData &&
Loading (StaticQuery)
}\n
\n )\n}\n\nconst StaticQuery = props => {\n const { data, query, render, children } = props\n\n return (\n \n {staticQueryData => (\n \n )}\n \n )\n}\n\nconst useStaticQuery = query => {\n if (\n typeof React.useContext !== `function` &&\n process.env.NODE_ENV === `development`\n ) {\n throw new Error(\n `You're likely using a version of React that doesn't support Hooks\\n` +\n `Please update React and ReactDOM to 16.8.0 or later to use the useStaticQuery hook.`\n )\n }\n const context = React.useContext(StaticQueryContext)\n if (context[query] && context[query].data) {\n return context[query].data\n } else {\n throw new Error(\n `The result of this StaticQuery could not be fetched.\\n\\n` +\n `This is likely a bug in Gatsby and if refreshing the page does not fix it, ` +\n `please open an issue in https://github.com/gatsbyjs/gatsby/issues`\n )\n }\n}\n\nStaticQuery.propTypes = {\n data: PropTypes.object,\n query: PropTypes.string.isRequired,\n render: PropTypes.func,\n children: PropTypes.func,\n}\n\nfunction graphql() {\n throw new Error(\n `It appears like Gatsby is misconfigured. Gatsby related \\`graphql\\` calls ` +\n `are supposed to only be evaluated at compile time, and then compiled away. ` +\n `Unfortunately, something went wrong and the query was left in the compiled code.\\n\\n` +\n `Unless your site has a complex or custom babel/Gatsby configuration this is likely a bug in Gatsby.`\n )\n}\n\nexport {\n Link,\n withAssetPrefix,\n withPrefix,\n graphql,\n parsePath,\n navigate,\n push, // TODO replace for v3\n replace, // TODO remove replace for v3\n navigateTo, // TODO: remove navigateTo for v3\n StaticQueryContext,\n StaticQuery,\n PageRenderer,\n useStaticQuery,\n}\n","export interface WebsiteConfig {\n title: string;\n description: string;\n coverImage: string;\n logo: string;\n /**\n * Specifying a valid BCP 47 language helps screen readers announce text properly.\n * See: https://dequeuniversity.com/rules/axe/2.2/valid-lang\n */\n lang: string;\n /**\n * blog full path, no ending slash!\n */\n siteUrl: string;\n /**\n * full url, no username\n */\n facebook?: string;\n /**\n * full url, no username\n */\n twitter?: string;\n /**\n * hide or show all email subscribe boxes\n */\n showSubscribe: boolean;\n /**\n * create a list on mailchimp and then create an embeddable signup form. this is the form action\n */\n mailchimpAction?: string;\n /**\n * this is the hidden input field name\n */\n mailchimpName?: string;\n /**\n * name and id of the mailchimp email field\n */\n mailchimpEmailFieldName?: string;\n /**\n /**\n * Meta tag for Google Webmaster Tools\n */\n googleSiteVerification?: string;\n /**\n /**\n * Appears alongside the footer, after the credits\n */\n footer?: string;\n}\n\nconst config: WebsiteConfig = {\n title: 'SPHTech Blog',\n description: 'Our collection of adventures, learnings and thoughts!',\n coverImage: 'img/blog-cover.jpg',\n logo: '',\n lang: 'en',\n siteUrl: 'https://sphtech.github.io',\n facebook: '',\n twitter: '',\n showSubscribe: false,\n mailchimpAction: 'https://twitter.us19.list-manage.com/subscribe/post?u=a89b6987ac248c81b0b7f3a0f&id=7d777b7d75',\n mailchimpName: 'b_a89b6987ac248c81b0b7f3a0f_7d777b7d75',\n mailchimpEmailFieldName: 'MERGE0',\n googleSiteVerification: 'GoogleCode',\n footer: 'is based on Gatsby Casper',\n};\n\nexport default config;\n","import { css } from '@emotion/core';\nimport styled from '@emotion/styled';\nimport { colors } from './colors';\nimport { darken, lighten } from 'polished';\n\nexport const outer = css`\n position: relative;\n padding: 0 4vw;\n`;\n\n// Centered content container blocks\nexport const inner = css`\n margin: 0 auto;\n max-width: 1040px;\n width: 100%;\n`;\n\nexport const SiteMain = css`\n z-index: 100;\n flex-grow: 1;\n`;\n\nexport const SiteTitle = styled.h1`\n z-index: 10;\n margin: 0;\n padding: 0;\n font-size: 3.8rem;\n font-weight: 700;\n`;\n\nexport const SiteDescription = styled.h2`\n z-index: 10;\n margin: 0;\n padding: 5px 0;\n font-size: 2.2rem;\n font-weight: 300;\n letter-spacing: 0.5px;\n opacity: 0.8;\n`;\n\nexport const PostFeed = css`\n position: relative;\n display: flex;\n flex-wrap: wrap;\n margin: 0 -20px;\n padding: 40px 0 0 0;\n`;\n\nexport const PostFeedRaise = css`\n @media (min-width: 900px) {\n margin-top: -70px;\n padding-top: 0;\n }\n`;\n\nexport const SocialLink = css`\n display: flex;\n justify-content: center;\n align-items: center;\n margin: 0;\n padding: 10px;\n color: #fff;\n opacity: 0.8;\n\n :hover {\n opacity: 1;\n }\n\n svg {\n height: 1.8rem;\n fill: #fff;\n }\n`;\n\nexport const SiteHeader = css`\n position: relative;\n padding-top: 12px;\n padding-bottom: 12px;\n color: #fff;\n /* background: color(var(--darkgrey) l(-5%)) no-repeat center center; */\n background: ${darken('0.05', colors.darkgrey)} no-repeat center center;\n background-size: cover;\n\n :before {\n content: '';\n position: absolute;\n top: 0;\n right: 0;\n left: 0;\n bottom: 0;\n z-index: 10;\n display: block;\n background: rgba(0,0,0,0.5);\n }\n`;\n\nexport const SiteHeaderContent = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n padding: 10vw 4vw;\n min-height: 200px;\n max-height: 450px;\n text-align: center;\n`;\n\nexport const SiteHeaderStyles = css`\n content: '';\n position: absolute;\n top: 0;\n right: 0;\n bottom: auto;\n left: 0;\n z-index: 10;\n display: block;\n height: 80px;\n background: linear-gradient(rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0));\n\n :before {\n content: '';\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 10;\n display: block;\n background: rgba(0, 0, 0, 0.18);\n }\n\n :after {\n content: '';\n position: absolute;\n top: 0;\n right: 0;\n bottom: auto;\n left: 0;\n z-index: 10;\n display: block;\n height: 80px;\n background: linear-gradient(rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0));\n }\n @media (max-width: 700px) {\n padding-right: 0;\n padding-left: 0;\n }\n`;\n\nexport const AuthorProfileImage = css`\n display: block;\n /* background: color(var(--lightgrey) l(+10%)); */\n background: ${lighten('0.1', colors.lightgrey)};\n border-radius: 100%;\n object-fit: cover;\n margin-right: 15px;\n width: 60px;\n height: 60px;\n`;\n","import * as React from 'react';\nimport styled from '@emotion/styled';\n\nconst StyledWrapper = styled.div`\n display: flex;\n flex-direction: column;\n min-height: 100vh;\n`;\n\ninterface WrapperProps {\n className?: string;\n}\n\nconst Wrapper: React.FC = ({ children, className }) => (\n {children}\n);\n\nexport default Wrapper;\n","import { Global, css } from '@emotion/core';\nimport { darken, lighten } from 'polished';\nimport * as React from 'react';\nimport Helmet from 'react-helmet';\n\nimport { colors } from '../styles/colors';\n// @ts-ignore\nimport favicon from '../../src/sphtech.png';\n\ninterface IndexProps {\n className?: string;\n}\n\nconst GlobalStyles = css`\n html,\n body,\n div,\n span,\n applet,\n object,\n iframe,\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n p,\n blockquote,\n pre,\n a,\n abbr,\n acronym,\n address,\n big,\n cite,\n code,\n del,\n dfn,\n em,\n img,\n ins,\n kbd,\n q,\n s,\n samp,\n small,\n strike,\n strong,\n sub,\n sup,\n tt,\n var,\n dl,\n dt,\n dd,\n ol,\n ul,\n li,\n fieldset,\n form,\n label,\n legend,\n table,\n caption,\n tbody,\n tfoot,\n thead,\n tr,\n th,\n td,\n article,\n aside,\n canvas,\n details,\n embed,\n figure,\n figcaption,\n footer,\n header,\n hgroup,\n menu,\n nav,\n output,\n ruby,\n section,\n summary,\n time,\n mark,\n audio,\n video {\n margin: 0;\n padding: 0;\n border: 0;\n font: inherit;\n font-size: 100%;\n vertical-align: baseline;\n }\n body {\n line-height: 1;\n }\n ol,\n ul {\n list-style: none;\n }\n blockquote,\n q {\n quotes: none;\n }\n blockquote:before,\n blockquote:after,\n q:before,\n q:after {\n content: '';\n content: none;\n }\n table {\n border-spacing: 0;\n border-collapse: collapse;\n }\n img {\n max-width: 100%;\n }\n html {\n box-sizing: border-box;\n font-family: sans-serif;\n\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n }\n *,\n *:before,\n *:after {\n box-sizing: inherit;\n }\n a {\n background-color: transparent;\n }\n a:active,\n a:hover {\n outline: 0;\n }\n b,\n strong {\n font-weight: bold;\n }\n i,\n em,\n dfn {\n font-style: italic;\n }\n h1 {\n margin: 0.67em 0;\n font-size: 2em;\n }\n small {\n font-size: 80%;\n }\n sub,\n sup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n }\n sup {\n top: -0.5em;\n }\n sub {\n bottom: -0.25em;\n }\n img {\n border: 0;\n }\n svg:not(:root) {\n overflow: hidden;\n }\n mark {\n background-color: #fdffb6;\n }\n code,\n kbd,\n pre,\n samp {\n font-family: monospace, monospace;\n font-size: 1em;\n }\n button,\n input,\n optgroup,\n select,\n textarea {\n margin: 0;\n color: inherit;\n font: inherit;\n }\n button {\n overflow: visible;\n border: none;\n }\n button,\n select {\n text-transform: none;\n }\n button,\n html input[type='button'],\n input[type='reset'],\n input[type='submit'] {\n cursor: pointer;\n\n -webkit-appearance: button;\n }\n button[disabled],\n html input[disabled] {\n cursor: default;\n }\n button::-moz-focus-inner,\n input::-moz-focus-inner {\n padding: 0;\n border: 0;\n }\n input {\n line-height: normal;\n }\n input:focus {\n outline: none;\n }\n input[type='checkbox'],\n input[type='radio'] {\n box-sizing: border-box;\n padding: 0;\n }\n input[type='number']::-webkit-inner-spin-button,\n input[type='number']::-webkit-outer-spin-button {\n height: auto;\n }\n input[type='search'] {\n box-sizing: content-box;\n\n -webkit-appearance: textfield;\n }\n input[type='search']::-webkit-search-cancel-button,\n input[type='search']::-webkit-search-decoration {\n -webkit-appearance: none;\n }\n legend {\n padding: 0;\n border: 0;\n }\n textarea {\n overflow: auto;\n }\n table {\n border-spacing: 0;\n border-collapse: collapse;\n }\n td,\n th {\n padding: 0;\n }\n\n html {\n overflow-x: hidden;\n overflow-y: scroll;\n font-size: 62.5%;\n\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n }\n body {\n overflow-x: hidden;\n color: ${darken('0.25', colors.midgrey)};\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell,\n 'Open Sans', 'Helvetica Neue', sans-serif;\n font-size: 1.5rem;\n line-height: 1.6em;\n font-weight: 400;\n font-style: normal;\n letter-spacing: 0;\n text-rendering: optimizeLegibility;\n background: #fff;\n\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n -moz-font-feature-settings: 'liga' on;\n }\n\n ::selection {\n text-shadow: none;\n background: ${lighten('0.3', colors.blue)};\n }\n\n hr {\n position: relative;\n display: block;\n width: 100%;\n margin: 2.5em 0 3.5em;\n padding: 0;\n height: 1px;\n border: 0;\n border-top: 1px solid ${lighten('0.1', colors.lightgrey)};\n }\n\n audio,\n canvas,\n iframe,\n img,\n svg,\n video {\n vertical-align: middle;\n }\n\n fieldset {\n margin: 0;\n padding: 0;\n border: 0;\n }\n\n textarea {\n resize: vertical;\n }\n\n p,\n ul,\n ol,\n dl,\n blockquote {\n margin: 0 0 1.5em 0;\n }\n\n ol,\n ul {\n padding-left: 1.3em;\n padding-right: 1.5em;\n }\n\n ol ol,\n ul ul,\n ul ol,\n ol ul {\n margin: 0.5em 0 1em;\n }\n\n ul {\n list-style: disc;\n }\n\n ol {\n list-style: decimal;\n }\n\n ul,\n ol {\n max-width: 100%;\n }\n\n li {\n margin: 0.5em 0;\n padding-left: 0.3em;\n line-height: 1.6em;\n }\n\n dt {\n float: left;\n margin: 0 20px 0 0;\n width: 120px;\n color: ${colors.darkgrey};\n font-weight: 500;\n text-align: right;\n }\n\n dd {\n margin: 0 0 5px 0;\n text-align: left;\n }\n\n blockquote {\n margin: 1.5em 0;\n padding: 0 1.6em 0 1.6em;\n border-left: ${colors.whitegrey} 0.5em solid;\n }\n\n blockquote p {\n margin: 0.8em 0;\n font-size: 1.2em;\n font-weight: 300;\n }\n\n blockquote small {\n display: inline-block;\n margin: 0.8em 0 0.8em 1.5em;\n font-size: 0.9em;\n opacity: 0.8;\n }\n\n blockquote small:before {\n content: '\\\\2014 \\\\00A0';\n }\n\n blockquote cite {\n font-weight: bold;\n }\n blockquote cite a {\n font-weight: normal;\n }\n\n a {\n color: ${darken('0.05', colors.blue)};\n text-decoration: none;\n }\n\n a:hover {\n text-decoration: underline;\n }\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6 {\n margin-top: 0;\n line-height: 1.15;\n font-weight: 700;\n text-rendering: optimizeLegibility;\n }\n\n h1 {\n margin: 0 0 0.5em 0;\n font-size: 5rem;\n font-weight: 700;\n }\n @media (max-width: 500px) {\n h1 {\n font-size: 2.2rem;\n }\n }\n\n h2 {\n margin: 1.5em 0 0.5em 0;\n font-size: 2rem;\n }\n @media (max-width: 500px) {\n h2 {\n font-size: 1.8rem;\n }\n }\n\n h3 {\n margin: 1.5em 0 0.5em 0;\n font-size: 1.8rem;\n font-weight: 500;\n }\n @media (max-width: 500px) {\n h3 {\n font-size: 1.7rem;\n }\n }\n\n h4 {\n margin: 1.5em 0 0.5em 0;\n font-size: 1.6rem;\n font-weight: 500;\n }\n\n h5 {\n margin: 1.5em 0 0.5em 0;\n font-size: 1.4rem;\n font-weight: 500;\n }\n\n h6 {\n margin: 1.5em 0 0.5em 0;\n font-size: 1.4rem;\n font-weight: 500;\n }\n\n body {\n background: #f4f8fb;\n }\n`;\n\nconst IndexLayout: React.FC = props => {\n return (\n
\n \n \n \n \n {props.children}\n
\n );\n};\n\nexport default IndexLayout;\n","import { Link } from 'gatsby';\nimport { setLightness } from 'polished';\nimport * as React from 'react';\nimport styled from '@emotion/styled';\nimport { css } from '@emotion/core';\n\nimport { colors } from '../styles/colors';\nimport { outer, inner } from '../styles/shared';\nimport config from '../website-config';\n\nconst SiteFooter = css`\n position: relative;\n padding-top: 20px;\n padding-bottom: 60px;\n color: #fff;\n background: ${setLightness('0.0015', colors.darkgrey)};\n`;\n\nconst SiteFooterContent = css`\n display: flex;\n flex-wrap: wrap;\n justify-content: space-between;\n align-items: center;\n color: rgba(255, 255, 255, 0.7);\n font-size: 1.3rem;\n a {\n color: rgba(255, 255, 255, 0.7);\n }\n a:hover {\n color: rgba(255, 255, 255, 1);\n text-decoration: none;\n }\n @media (max-width: 650px) {\n flex-direction: column;\n }\n`;\n\nconst SiteFooterNav = styled.nav`\n display: flex;\n\n a {\n position: relative;\n margin-left: 20px;\n }\n\n a:before {\n content: '';\n position: absolute;\n top: 11px;\n left: -11px;\n display: block;\n width: 2px;\n height: 2px;\n background: #fff;\n border-radius: 100%;\n }\n\n a:first-of-type:before {\n display: none;\n }\n @media (max-width: 650px) {\n a:first-child {\n margin-left: 0;\n }\n }\n`;\n\nconst Footer: React.FC = () => {\n return (\n \n );\n};\n\nexport default Footer;\n","import { graphql, StaticQuery } from 'gatsby';\nimport * as React from 'react';\nimport styled from '@emotion/styled'\n\nimport config from '../../website-config';\n\nconst SubscribeOverlayLogo = styled.img`\n position: fixed;\n top: 23px;\n left: 30px;\n height: 30px;\n`;\n\ninterface SiteNavLogoProps {\n logo?: {\n childImageSharp: {\n fixed: any;\n };\n };\n}\n\nconst SubscribeLogo = () => (\n \n data.logo && (\n \n )\n }\n />\n);\n\nexport default SubscribeLogo;\n","import * as React from 'react';\nimport styled from '@emotion/styled';\n\nimport { colors } from '../../styles/colors';\nimport config from '../../website-config';\nimport SubscribeForm from './SubscribeForm';\nimport SubscribeLogo from './SubscribeLogo';\n\ninterface SubscribeOverlayProps {\n open?: boolean;\n}\n\nconst SubscribeOverlay = styled.div`\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 9000;\n display: flex;\n justify-content: center;\n align-items: center;\n background: rgba(0, 25, 40, 0.97);\n opacity: ${(props: SubscribeOverlayProps) => (props.open ? 1 : 0)};\n transition: opacity 200ms ease-in;\n pointer-events: ${(props: SubscribeOverlayProps) => (props.open ? 'auto' : 'none')};\n backdrop-filter: blur(3px);\n\n form {\n display: flex;\n justify-content: center;\n align-items: center;\n margin: 0 auto;\n max-width: 500px;\n }\n\n .form-group {\n flex-grow: 1;\n }\n\n .subscribe-email {\n display: block;\n padding: 14px 20px;\n width: 100%;\n border: none;\n color: ${colors.midgrey};\n font-size: 2rem;\n line-height: 1em;\n font-weight: normal;\n letter-spacing: 0.5px;\n user-select: text;\n border-radius: 8px;\n transition: border-color 0.15s linear;\n\n -webkit-appearance: none;\n }\n\n button {\n display: inline-block;\n margin: 0 0 0 15px;\n padding: 0 25px;\n height: 52px;\n outline: none;\n color: #fff;\n font-size: 1.7rem;\n line-height: 37px;\n font-weight: 400;\n text-align: center;\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.1);\n background: linear-gradient(\n color(var(--blue) whiteness(+7%)),\n color(var(--blue) lightness(-7%) saturation(-10%)) 60%,\n color(var(--blue) lightness(-7%) saturation(-10%)) 90%,\n color(var(--blue) lightness(-4%) saturation(-10%))\n );\n border-radius: 8px;\n box-shadow: 0 0 0 1px inset rgba(0, 0, 0, 0.14);\n\n -webkit-font-smoothing: subpixel-antialiased;\n }\n`;\n\nconst SubscribeOverlayClose = styled.a`\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n display: block;\n\n :before {\n content: '';\n position: absolute;\n top: 40px;\n right: 25px;\n display: block;\n width: 30px;\n height: 2px;\n background: #fff;\n opacity: 0.8;\n transform: rotate(45deg);\n }\n\n :after {\n content: '';\n position: absolute;\n top: 40px;\n right: 25px;\n display: block;\n width: 30px;\n height: 2px;\n background: #fff;\n opacity: 0.8;\n transform: rotate(-45deg);\n }\n\n :hover {\n cursor: default;\n }\n`;\n\nconst SubscribeOverlayContent = styled.div`\n position: relative;\n z-index: 9999;\n margin: 0 0 5vw 0;\n padding: 4vw;\n color: #fff;\n text-align: center;\n`;\n\nconst SubscribeOverlayTitle = styled.h1`\n display: inline-block;\n margin: 0 0 10px 0;\n font-size: 6rem;\n line-height: 1.15em;\n`;\n\nconst SubscribeOverlayDescription = styled.p`\n margin: 0 auto 50px;\n max-width: 650px;\n font-family: Georgia, serif;\n font-size: 3rem;\n line-height: 1.3em;\n font-weight: 300;\n opacity: 0.8;\n`;\n\ninterface SubscribeState {\n isOpen: boolean;\n}\n\nclass SubscribeModal extends React.Component {\n constructor(props: any) {\n super(props);\n this.state = { isOpen: false };\n }\n\n componentWillUnmount() {\n this.unsubscribeEsc();\n }\n\n escFunction = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n this.close();\n }\n };\n\n subscribeEsc() {\n document.addEventListener('keydown', this.escFunction, false);\n }\n\n unsubscribeEsc() {\n document.removeEventListener('keydown', this.escFunction, false);\n }\n\n open = () => {\n this.setState({ isOpen: true });\n this.subscribeEsc();\n };\n\n close = () => {\n this.setState({ isOpen: false });\n this.unsubscribeEsc();\n };\n\n render() {\n return (\n \n \n \n \n Subscribe to {config.title}\n \n Stay up to date! Get all the latest & greatest posts delivered straight to your\n inbox\n \n \n \n \n );\n }\n}\n\nexport default SubscribeModal;\n","// tslint:disable:no-http-string\nimport { Link } from 'gatsby';\nimport * as React from 'react';\nimport styled from '@emotion/styled';\nimport { css } from '@emotion/core';\n\nimport { SocialLink } from '../../styles/shared';\nimport config from '../../website-config';\nimport Facebook from '../icons/facebook';\nimport Twitter from '../icons/twitter';\nimport SubscribeModal from '../subscribe/SubscribeOverlay';\n// import SiteNavLogo from './SiteNavLogo';\n\nconst HomeNavRaise = css`\n @media (min-width: 900px) {\n position: relative;\n top: -70px;\n }\n`;\n\nconst SiteNavStyles = css`\n position: relative;\n z-index: 300;\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n overflow-y: hidden;\n height: 40px;\n font-size: 1.2rem;\n`;\n\nconst SiteNavLeft = styled.div`\n display: flex;\n align-items: center;\n overflow-x: auto;\n overflow-y: hidden;\n -webkit-overflow-scrolling: touch;\n margin-right: 10px;\n padding-bottom: 80px;\n letter-spacing: 0.4px;\n white-space: nowrap;\n\n -ms-overflow-scrolling: touch;\n\n @media (max-width: 700px) {\n margin-right: 0;\n padding-left: 4vw;\n }\n`;\n\nconst NavStyles = css`\n display: flex;\n margin: 0 0 0 -12px;\n padding: 0;\n list-style: none;\n\n li {\n display: block;\n margin: 0;\n padding: 0;\n text-transform: uppercase;\n }\n\n li a {\n display: block;\n margin: 0;\n padding: 10px 12px;\n color: #fff;\n opacity: 0.8;\n }\n\n li a:hover {\n text-decoration: none;\n opacity: 1;\n }\n`;\n\nconst SiteNavRight = styled.div`\n flex-shrink: 0;\n display: flex;\n align-items: center;\n height: 40px;\n\n @media (max-width: 700px) {\n display: none;\n }\n`;\n\nconst SocialLinks = styled.div`\n flex-shrink: 0;\n display: flex;\n align-items: center;\n a:last-of-type {\n padding-right: 20px;\n }\n`;\n\nconst SubscribeButton = styled.a`\n display: block;\n padding: 4px 10px;\n border: #fff 1px solid;\n color: #fff;\n font-size: 1.2rem;\n line-height: 1em;\n border-radius: 10px;\n opacity: 0.8;\n\n :hover {\n text-decoration: none;\n opacity: 1;\n cursor: pointer;\n }\n`;\n\ninterface SiteNavProps {\n isHome?: boolean;\n}\n\ninterface SiteNaveState {\n isOpen: boolean;\n}\n\nclass SiteNav extends React.Component {\n subscribe = React.createRef();\n\n constructor(props: SiteNavProps) {\n super(props);\n this.state = { isOpen: false };\n }\n openModal = () => {\n if (this.subscribe.current) {\n this.subscribe.current.open();\n }\n };\n\n render() {\n const { isHome = false } = this.props;\n return (\n \n );\n }\n}\n\nexport default SiteNav;\n","const preferDefault = m => (m && m.default) || m\n\nif (process.env.BUILD_STAGE === `develop`) {\n module.exports = preferDefault(require(`./public-page-renderer-dev`))\n} else if (process.env.BUILD_STAGE === `build-javascript`) {\n module.exports = preferDefault(require(`./public-page-renderer-prod`))\n} else {\n module.exports = () => null\n}\n","import { darken, desaturate, lighten, mix } from 'polished';\nimport * as React from 'react';\nimport styled from '@emotion/styled';\nimport { css } from '@emotion/core';\n\nimport { colors } from '../../styles/colors';\nimport config from '../../website-config';\n\nconst SubscribeFormStyles = css`\n @media (max-width: 500px) {\n -ms-flex-direction: column;\n flex-direction: column;\n }\n`;\n\nconst SubscribeEmail = styled.input`\n display: block;\n padding: 10px;\n width: 100%;\n /* border: color(var(--lightgrey) l(+7%)) 1px solid; */\n border: ${lighten('0.07', colors.lightgrey)};\n color: ${colors.midgrey};\n font-size: 1.8rem;\n line-height: 1em;\n font-weight: normal;\n user-select: text;\n border-radius: 5px;\n transition: border-color 0.15s linear;\n\n -webkit-appearance: none;\n :focus {\n outline: 0;\n /* border-color: color(var(--lightgrey) l(-2%)); */\n border-color: ${darken('0.02', colors.lightgrey)};\n }\n`;\n\nconst SubscribeFormButton = styled.button`\n display: inline-block;\n margin: 0 0 0 10px;\n padding: 0 20px;\n height: 41px;\n outline: none;\n color: #fff;\n font-size: 1.5rem;\n line-height: 37px;\n font-weight: 400;\n text-align: center;\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.1);\n /* background: linear-gradient(\n color(var(--blue) whiteness(+7%)),\n color(var(--blue) lightness(-7%) saturation(-10%)) 60%,\n color(var(--blue) lightness(-7%) saturation(-10%)) 90%,\n color(var(--blue) lightness(-4%) saturation(-10%))\n ); */\n background: linear-gradient(\n ${mix('0.1', '#fff', colors.blue)},\n ${desaturate('0.1', darken('0.07', colors.blue))} 60%,\n ${desaturate('0.1', darken('0.07', colors.blue))} 90%,\n ${desaturate('0.1', darken('0.04', colors.blue))}\n );\n border-radius: 5px;\n box-shadow: 0 0 0 1px inset rgba(0, 0, 0, 0.14);\n\n -webkit-font-smoothing: subpixel-antialiased;\n\n :active,\n :focus {\n /* background: color(var(--blue) lightness(-9%) saturation(-10%)); */\n background: ${desaturate('0.1', darken('0.09', colors.blue))};\n }\n @media (max-width: 500px) {\n margin: 10px 0 0;\n width: 100%;\n }\n`;\n\nconst FormGroup = styled.div`\n flex-grow: 1;\n @media (max-width: 500px) {\n width: 100%;\n }\n`;\n\nconst SubscribeForm: React.FC = () => {\n return (\n \n {/* This is required for the form to work correctly */}\n \n \n \n
\n \n
\n \n Subscribe\n \n \n );\n};\n\nexport default SubscribeForm;\n","import React from \"react\"\nimport PropTypes from \"prop-types\"\n\nimport InternalPageRenderer from \"./page-renderer\"\n\nconst ProdPageRenderer = ({ location, pageResources }) => {\n if (!pageResources) {\n return null\n }\n return React.createElement(InternalPageRenderer, {\n location,\n pageResources,\n ...pageResources.json,\n })\n}\n\nProdPageRenderer.propTypes = {\n location: PropTypes.shape({\n pathname: PropTypes.string.isRequired,\n }).isRequired,\n}\n\nexport default ProdPageRenderer\n","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAACXBIWXMAAAsTAAALEwEAmpwYAAACC2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS40LjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx0aWZmOlJlc29sdXRpb25Vbml0PjI8L3RpZmY6UmVzb2x1dGlvblVuaXQ+CiAgICAgICAgIDx0aWZmOkNvbXByZXNzaW9uPjE8L3RpZmY6Q29tcHJlc3Npb24+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgICAgIDx0aWZmOlBob3RvbWV0cmljSW50ZXJwcmV0YXRpb24+MjwvdGlmZjpQaG90b21ldHJpY0ludGVycHJldGF0aW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KD0UqkwAAE7JJREFUeAHVmwmMXeV1x//3LfPmjT1exh7vxmCPbcCOWWzMWgJZiiK1iVAQbRNIAwLaUpoqIqpaEoTUJlVaaFSq0qQhEUlp0iUFEdqCDYTNBkxsMLYH7xs2GG+M19necm9/57v3ztyZefPmzbMrJce+23e/5Zz/Od855/vuGy+A9CtBsGGseKmh3DgW7Z3HOzvOHnm/EgA4wROC+UXJDi8tpRuQNvEu8HmsAFKdmGTqbHf2miUFOrVX6nhD6toMACcRtFHKTpWaFkjjPyaNnRMK7wAzFhLA1MnR2QfAmOO/482ZbBXOYuHLBen9p6TD90ql9wfKZX0ZZeZLE74izbwJQKZRYC/igaxCfXR2p8BgUx78nOQxFt5MfccjCP9VqaEN4VupZZrF1GMNByVk/QhwdlPnN6R5/yhNWkIZADgjqN8Szh4AkbBB2Zd//JRSzWPkNWBgFUFIaG7Pz6R9N0s5BFMv9bu5ZhEM8+8DAV9gIHj4g9KrXPPSog1YBFYRA0nteqh+AEwwZ4LRJZVS0FtQz8q3VFq3R6kFU5X/7BVKjRtDNdNUQksx08d3SJuY397iUKigiyv1/Q8RdP9AeWwKeM1Sajw4vYRP+Jp00Tdxkrmh/Q9sWfVp9O7UhIkFMm9sB8IblfYeVOHn78BUSqXnt6u4+b2hg7u21DcQ3vtPiRkQBM0Kyp0U5RUUfgmss6UZj0kLV0kLXpWmfpf3voLi2xjCSQXp5Qo6HlJwdFPUPzzVSdjoKCjWnDWx+55jUuGUAi8jb9x0paa0Os0H+47Km9HM84QKndvcTis4AvOHv4FzWwRyaF5NCLlOXtPt0uIHpHHn9LedyfSYcq2Cd3GShZW0uZY2YH94DeAsC5UQK6W/VU13tQMQC++XFRx6S8GHv5BOrUaDaNybpGDsDUqd97vKf+njKu05ovTUscrOnRExEZm/64P5XC4q2PvvTgicBWACQHCcg/rn/zlgIrwJ5Igr08ebfKHU9oCCjSso7QnfnHxXXhGfkcUn1Em1ARAJH3QeVbD1UengfeFwGUzZm8s9MfsjM8mHlD7v+8pc8QWmBXPZyEfjNv/7BOL2/dfQ/rfx6EsBw+L9WOb1RrT8l/ImtoXtzL+4hMfaRn204vmbvqyg80d0iXX1HmFK9MpzABhgEdBRD7VcRgYgFv70IQXr7lVw4idSI4yblzaPbWEM81X6Kp5PK9h2l4R1pBbfL28q5h35h5i54Nhe+Vv+gkcAKsN0UAjr0I2Xn8MpEiK+OinCMi/TIL+BOmYsGJKCHBjZjdHohbdWqLAKxcKTqPgbHyEUI3zuOkyXcFU4zLXTmbNKCFE8EgqUu5Kp8R/y31wif/MTaAuroX1Q6JJ/4G35a5nHPWsY9IKoPToACBsqwJ84SlhLWBCdrbwAyFa3CAq5eWgf8M+ARrYAOg8+WM/xV1L+MuYcAgWm9ay9cbjDFmRdWTmOES8tH4t5l6xtz6eIXjiqAu1O/CBUVAYLKpmwhj+tzQpQYHDoBYzqi1gC5l3Gy8XWY9MonaH9Abz/E5RfJnWvlVroxyzAgKnPABzXMFGBXKcwyDU48DoMUcdvQJsgHwlvrULh7c4o4iKweY0Qlsd3v6rg1AuhrBnmsAdwZjlEgrC1SY5FeUsR8Cn57Z9RetkdTmDr0RFhNejtVHnDo2h+L3UBJ7tU6VlXRBWMi+rGHFUccqliAdap50w3OL4l9GElNOxHWhvc1QAkDAi0apmdJTlZS1ZAkFgflpvQyQZo2Dx7erH87X9AUDiq1PzPYTmtDqPg+D6VNz/OQukfqLOAabVd6av/hWgBwK6fCHh6GS0NnwnG87/7JEnN3cxr5n8WUzbtxmgnZRh2ZCpZX846AM94rdjOCs0qyBEKm1w9L38ddUtMi9VuZey6sRqXrVT6gt/kDnKWWj8AVSwg6hTPa6Zs097DFJ3D8kyocPxh5Qlfh+cgNs+KkvfXdPk+dTKXYmldWMJq3hFtMssAgSSp9S6lL79XqWkLon6pOyBa9HdV610VAMIuvGwjpjhf/j6es2jIQleCBj7xYkhBovLg2yF1DU6zFpsqsOZdyEF6fPpNpdr+Vpmr/4joS84QT58zFN7YGR4Ap1o4ZBBvCvOYxZecD7AmCc4Tt9ahUbJogIVYd4PeuwaVTi4/GIdreJPx/7BfeDJRlyCdBeFt2Ng2K7DQz2pqFt675QtoYh3CtTAtSWVxxO6AH/NvycPy9PiwOvG9RRKr5yKKXZPvBt+XAbpE2o1vdA7RNG/CW9g7S8LDQTUAeGupKJ7HaxpHevs1F66D7l2AgE+A4aBEiHRXu08cJmjyebj7YevRLwAEJD1GXvM0d/3/OFWxgHg4swQ873mXKPPpF7ECEpwT7NuxhJVPFgYIKjFvETK8t2fuTcPx4epYeYXDfEpcz+5dP1FfZYsIDGWah9wGts1/Cwd9B89nQCMDYOYWOZ3M4uvVcPMG5uQdZGRMh+53GHo8vJAgAUJQJm8o2UGT5GHlwx0D6ls92rp+mGYBZg8A/i6yPsgjG3TmH+9DuKvxZ4DUB8TweYAbMnGyAaK5F/R2qbTpFZVef5D1wUskJOT1tl3lJzO8ZNvEfbXbATLYeNYn4dA/osyV31N6HnlImkwyw/6DXRublGJ6xny5lWecPlcbJ/GudgCskUPZGAsNxz92SMU3nlD5zT9mYTJJXmYmzNrmxsiGNSBUOIbCqeZu7eTAQLOWOvs9ZH+7XTKkLKCkZwBCKwvKuWy8XMaeyseVnn9JuDI0a4j46+urys3oAIg7skGMooGKG1ep+PSXnbaUmeIY5qWrUvE0QNMVa0QA2DsDHNNP4W/K3egAgH1zDCym2B6zbNuGSi/7lhpuuFOpiZY+1w5CfQDEPMdhiefC6qdUfPJGdmovgkHjCiZGEnSk9/E48fy2L0XOugxcrMwBQ6Zo0+TwBpKl31PjbX+vVIspgfFrmA412GrMRYWrxWRbtkLpNtLX/FzS1z2UYaZFGKjk9WsqS7blPo4SRcYqov0iABexhMIJVpvsIFPmTblG/pZ/U+//fh8DoIEJHwNXgfW46MwAsF765htaCSws4gidJ7dYPuhA+DB3iK6D38fPLoLEdek2buf65dldLWIQJv0s65ReEib2IVouVGn1/SrtYDEF1fLd1/Las0Llg/vkH2lnG+ACGGLlFJiZ2gHVYuoj1an6Hku0PYUsexDgX9q8VtmFF6ObyAqqZI5nBkA0z4JCr0qv/RxTNGHHAADaiCKBQTCE9yEFVKpEI9aLKjiwmSpmhPTj79sKHj3ycvgHVxIposIY9QOQyAsKb7+m0ssPypu+BFPEMzuGQuaGyDCkoAJXyaKR6rv3duKwZbpNj9N8PCmVACAsjg0x2W18f2YAYGLljqMq/Ne3cYB0WWbryszfeet4CK6OycRz8ta9G1xhkMYGv062j+8NdEzdfVrMTyR9IH+ogeoDIKH94rpV8t96Xt75lxMBDsOEdTkMxxWLKXThLFKXxXi31R4KNFxXQ2QzAFL0RXqQmjGfJNL6g6rMf3tdHwBRx0FPt0prVvIZiwL8gFmAM8OKglqjQWQJS9riOOWnN8I5Tiw/mzIWWhZNSnx3sG2yWIjh+jWFpNA4897MPbNoaThQDblAfQBEFlA+cojNSpxfntS0FwB8RoeG49PeWQ1r7mql0FLPEb4qcUxn06XQoWALIYzp5E2bT3rNpmeRJbF9/nIghP1ba0euH0MPGjNZwfrVytx6v7IXsH9hFAMXPlU81wdA1JXP/A8OHCQft9AHI9Ukj96FF84pVpC9J3AX45X7+o+VXXQRDhSL2r1DxdUrVH7+YfcFSHNb2A+YB7h4tzIgm9XEqbhTNxbEx5Hgl2ycXvPbyt9yNzOKvQS078JgRbH7C+sCwIRwmuxGM7ZnYVvlZXO/8Zv+AfruQsmjR1rbHN16QNlv/lSNn/xMX7XMufOUu+o6FT9/u4qvvajSM4/If26tvJlUIc33Grgxy0nBui2SPiTkvYbZ33e38vfcp/QUNk9qFN4GrQuAPkO0lZllwrH2nREMkDRh8jZcRPajho6NfDK4TLlrPuEKbZvNtrs8zNZrbFTDoiXuKP3WTSq2b1Dp7TXy3+Ejy8FX3QIo6AAMUv7U5bcre/+N/MDketZLY0LrqGENELNSFwCxntOT4aA1R+jBDDKkwdF0jDu360A4KDBTxmT9Vb5y/3wHGmOeQ14mEbbMeRkhSGbGLHcEn7iBJfEplQ/jdw4d5oNyk9Itk5SaPBXBGduoBqcXVuw/Y7ujJ9OSUXr6TKWuvlvBzv08sHtjixV2c/oWL2Ydg48AQbs75c1hFlx5revH5usAMg3aYVOKd24+M6/xiirv7eYjK+/8icqcc14ovE898wuj0Hw8Xl0AOO8Kc15Dg3Kf/R0Fu+jO9gUdCJiyCY2ihxwWKptaFazYosyXvq7M3DbHRwyoe0ieDGibEgjmd/eq6ycvqvfx1wm9O9Tz0LPqedm25CCnj/pEqa9VOKw755YuV+4H/yT/mfUwwtzOTUY7dFsEAba1+65W1jybr8xv8/sfdrNuusV5a2e2kUUluu2/DWMmC63j8vcfU2ohO0HTx8s7d4JK2w6Q8jKGaz9ksvX3UeWuLh/g+rNBoznX9MXbCGG9KtzzVWfaXhtxON9CtX6mggIRY9Ub7Cjz6oWVrNbOD9mqJnw4UHhubmILjNB5lOnTQtg70qnUsjmASKJ0BnRmO0I2cARCQBjsXfWKen78Pfk/+llFltJ33arGO+9Rbtny8L1pd0QAqBrVK2zcpd7/5vdJpwtKndui/OevUnoy2WOt/VTg6swBMP4AIU46/BPHVdyymU2JbZgta4N0mo+ZM5SZN99pPdVMmms0GqYTdcvH+FXa6W6lWycQLgnDiXdhx6M7nxUA3JDGiBEa7TN8A8Y0nNSyWczgsrBl9XMlQSuVVe9lyNuzB0DctYWjvm2yuJCrCW5UR6gKG3I2ZPuA5j4JbF+l0d3UBUCsYYs+ffzw4Mo5+ZGwKafpkKFhQ11Ffq0n6z1JlcqS7+u7H1UYtE3G/u9z4X1szWWSEWO540SXHnhsrX74dLsKhKhY8LBtrUwmhUdwh3JUFiNea1cj1KsZABPAhBl8xP2nUyGDJRKibz32nv6n/SNloxDV3yauXeM1Fjxp6sn7GrupVq2mPCAWvswPltdvO6T1O47yY5GUZk5u0u6Dp5TnZ/FLWLa27+lQhvJv3DZHHZ1F7T1wXO27PtLBji5d/bFpWtQ2hV/Pva/y/p18cid1NgFJi1Oz2cFpaVV5ZzuJE9ligQ3NSdP4Is03R8j/8D3S373csM83nfR32myVd7UrRZ3U5Olsj5fk73pX3njWBlNnhf3WCNSIABiPsRk/+dIO3fzDrbr10oma0JjWbb9gDXAQhnMpzZi0Xwc+6NGtSyfq0T+9Sj99bqvmPcA6NU+iso8k6NwPdOCBazW9kXy+kZ3jD/fAKFFi2nksjghnpMn+zvVKzWxja511bwPrfKi8d5vKm1bz1ecSV98As6W3v3sTqTh1AMBWkWV2gq2tA8C1rO1UAwCh6Xd1F/Xgi/v4+JDV3TfM08ULp+rPjnXp97+7Vls6S3r2ros1hxR1w/bDymER1186S8+3jtUlC6boO09s0l8/DQCHTmj6heQE49G2/dqUlWFmcZgU+adJEXN87Z0x12nY2Lclsr8DUNouVuYCvjxFZNvwHnXFzq/7CtTdRUbY4I64Tq3XEQGILSnfmNEdy6dp7eO7dOXfvaXblkzU8rnjtfZ0SVc0ZzRv1kSNaWrQtUvPUZkoYGCcO4MsDZo7hXX6Sf6SBGvqI/ukFodGCs2DmKWV331DJT62phcu4+f2fG2mXnoiy27IAHHLZjNLfitQxgr8g3udZQSn2CCoI8TWAACJDQMac3d+brE+uXSmNjGvH8YaHnv6PVY1ZHrNWdY9YZw/0tGpcWMbsQK2zClL4xMciI0mYoKs0L1IlDGOadsEd9PCvgNS5jZLqNa3Z2BdMQ1SsxcoPWchW2vdKrNZkgQ00WvV2xGjgIHtNIMwL6/bp46TPVrSNlnXnGO/3gj4qX5aK48V9PiKrXrq5R361+e2M2Cg9h2HdaoLAaBe2zH6AHO1ziKy9Dn+6YsV2auAvyNwWrTfJiKgl+fvjibgOHducJsh7oPHKaaK1eUH2t4YVoVj+MMM+xqM9gOc5GhpRADcaPSaIsyt3XZUy/9mneY9uEZP7zypr1w5WQvQ9MwGTy9sO6YbH27XoZO92rz7qJ55cz9hMOx+LNNHlzQpZ78zjMi0afM2JgPZy491wpZeeVLl7eFaP7P4CmfupTUr2Ad4VuX3dzlhvRxbx5Z1Qs5CzAfYr0ZGSaPKBAus8Tu7+cOo3pIacxksLtAtD6/ht5OBHv+TyxEww6YQmgMsywInjss7Kz+NJfQWShqLjzAHaWRma5r0GhHECIdo3/OcGZtgBpAJST/mB0z71sAbMw5B2fW1aED08CyCMH7Q0+WA6vsg4jod+TSiD0h20YAGGxJ/ntKJYCs+Mm+OK0Cw8c1h6Eq2sXsT3I4kOeGSBbYhiskPIYQzgb3xtr/QTy6PiB+d9VRoG7+vch0VADaHbRbbNW1zjn/3X8QPJ60wIosApn0rcmsBrq6dadsYjX1h3KivwFWMeoku9s6OuG78NlkWt4/rxM9x3RGuo5oCg/sywYq2FwjZfDcBf93ojAD4dRO2Er//B1XOw2dtb3VIAAAAAElFTkSuQmCC\"","// tslint:disable:no-http-string\nimport * as React from 'react';\n\nconst Facebook: React.FC = () => (\n \n \n \n);\nexport default Facebook;\n","// tslint:disable:no-http-string\nimport * as React from 'react';\n\nconst Twitter: React.FC = () => (\n \n \n \n);\nexport default Twitter;\n"],"sourceRoot":""} \ No newline at end of file diff --git a/404.html b/404.html index 13dcb60..9058d66 100644 --- a/404.html +++ b/404.html @@ -13,7 +13,7 @@ } -

404

Page not found

Go to the front page →
\ No newline at end of file diff --git a/404/index.html b/404/index.html index 940342a..f9ab2e0 100644 --- a/404/index.html +++ b/404/index.html @@ -13,7 +13,7 @@ } -

404

Page not found

Go to the front page →
\ No newline at end of file diff --git a/about-us/index.html b/about-us/index.html index a3382cc..8c9d963 100644 --- a/about-us/index.html +++ b/about-us/index.html @@ -13,8 +13,8 @@ } -

About Us

\ No newline at end of file diff --git a/about/index.html b/about/index.html index 1ea62bc..f66c172 100644 --- a/about/index.html +++ b/about/index.html @@ -13,4 +13,4 @@ } -

About

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc commodo finibus leo, non tempus magna vehicula ac. Maecenas mollis ante finibus pharetra imperdiet. Maecenas in aliquam purus. Nam et massa a nulla fermentum dapibus sit amet in neque. Ut ipsum ipsum, rhoncus a sodales pellentesque, interdum a elit. Nullam aliquam tellus nibh, eget laoreet dui aliquet non. Vestibulum malesuada ante at diam tempus, ac interdum risus scelerisque. Sed ipsum neque, vulputate porta diam eget, consequat blandit nulla. Integer volutpat velit vitae purus lacinia aliquam. Integer bibendum ipsum vitae magna pulvinar, nec vehicula dolor vulputate. Nulla eu massa id orci placerat finibus vel sit amet eros. Vestibulum quis consequat massa. Sed sagittis sollicitudin massa at commodo. Praesent diam nisi, imperdiet posuere eleifend nec, blandit ac massa.

Vestibulum semper pretium ipsum nec congue. Ut ac eros nisi. Donec leo sem, aliquam mollis sapien ultrices, dapibus congue diam. Proin viverra dapibus blandit. Ut mauris tellus, tristique id felis vel, venenatis vestibulum nunc. Nam molestie pulvinar nibh, eget egestas augue. Maecenas tellus arcu, mattis ut ipsum non, sollicitudin convallis nunc. Donec nec neque tristique, aliquet lacus id, laoreet nunc. Cras dapibus nisi nulla, ullamcorper faucibus neque suscipit ac. Donec eget orci venenatis justo lobortis volutpat. Proin vel placerat nisl. Integer arcu nunc, sodales eu fringilla non, aliquam non diam. Cras placerat, massa et faucibus pretium, ante elit tincidunt tellus, tristique ultricies velit quam et massa.

In nunc lacus, dapibus vitae lacus sit amet, efficitur iaculis neque. Suspendisse ut tellus quis leo vestibulum tincidunt. Aenean nec enim ac dolor lacinia semper. Ut sed laoreet libero. Nunc elementum sollicitudin accumsan. Nunc eu augue neque. Proin a tortor nibh. Cras eu nisl ornare sapien feugiat pellentesque. Mauris dignissim vel quam eu pellentesque. Integer sit amet posuere quam, eu ullamcorper odio. Nullam a lacus tempus sapien dignissim ullamcorper. In hac habitasse platea dictumst. Proin quis massa aliquam, feugiat tortor sit amet, tincidunt urna. Donec posuere pulvinar lectus, ac semper ipsum vulputate quis.

\ No newline at end of file +

About

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc commodo finibus leo, non tempus magna vehicula ac. Maecenas mollis ante finibus pharetra imperdiet. Maecenas in aliquam purus. Nam et massa a nulla fermentum dapibus sit amet in neque. Ut ipsum ipsum, rhoncus a sodales pellentesque, interdum a elit. Nullam aliquam tellus nibh, eget laoreet dui aliquet non. Vestibulum malesuada ante at diam tempus, ac interdum risus scelerisque. Sed ipsum neque, vulputate porta diam eget, consequat blandit nulla. Integer volutpat velit vitae purus lacinia aliquam. Integer bibendum ipsum vitae magna pulvinar, nec vehicula dolor vulputate. Nulla eu massa id orci placerat finibus vel sit amet eros. Vestibulum quis consequat massa. Sed sagittis sollicitudin massa at commodo. Praesent diam nisi, imperdiet posuere eleifend nec, blandit ac massa.

Vestibulum semper pretium ipsum nec congue. Ut ac eros nisi. Donec leo sem, aliquam mollis sapien ultrices, dapibus congue diam. Proin viverra dapibus blandit. Ut mauris tellus, tristique id felis vel, venenatis vestibulum nunc. Nam molestie pulvinar nibh, eget egestas augue. Maecenas tellus arcu, mattis ut ipsum non, sollicitudin convallis nunc. Donec nec neque tristique, aliquet lacus id, laoreet nunc. Cras dapibus nisi nulla, ullamcorper faucibus neque suscipit ac. Donec eget orci venenatis justo lobortis volutpat. Proin vel placerat nisl. Integer arcu nunc, sodales eu fringilla non, aliquam non diam. Cras placerat, massa et faucibus pretium, ante elit tincidunt tellus, tristique ultricies velit quam et massa.

In nunc lacus, dapibus vitae lacus sit amet, efficitur iaculis neque. Suspendisse ut tellus quis leo vestibulum tincidunt. Aenean nec enim ac dolor lacinia semper. Ut sed laoreet libero. Nunc elementum sollicitudin accumsan. Nunc eu augue neque. Proin a tortor nibh. Cras eu nisl ornare sapien feugiat pellentesque. Mauris dignissim vel quam eu pellentesque. Integer sit amet posuere quam, eu ullamcorper odio. Nullam a lacus tempus sapien dignissim ullamcorper. In hac habitasse platea dictumst. Proin quis massa aliquam, feugiat tortor sit amet, tincidunt urna. Donec posuere pulvinar lectus, ac semper ipsum vulputate quis.

\ No newline at end of file diff --git a/ai-in-news-media/index.html b/ai-in-news-media/index.html index 3f1a071..63eccfc 100644 --- a/ai-in-news-media/index.html +++ b/ai-in-news-media/index.html @@ -13,7 +13,7 @@ } -

AI in News Media

Meetup

Updates to Govtech Agile Practices by Steven Koh - 2 July

It was our great pleasure to have invited Mr Steven Koh, the Deputy Director of Government Digital Services (GDS) at Govtech, to update us…

  • SPHTech
    SPHTech
3 min read
\ No newline at end of file diff --git a/author/ghost/index.html b/author/ghost/index.html index 65c71f4..ce377f8 100644 --- a/author/ghost/index.html +++ b/author/ghost/index.html @@ -13,4 +13,4 @@ } -
Ghost

Ghost

The professional publishing platform

On a plane
No posts
\ No newline at end of file +
Ghost

Ghost

The professional publishing platform

On a plane
No posts
\ No newline at end of file diff --git a/author/sph-tech/index.html b/author/sph-tech/index.html index ea989f4..528b697 100644 --- a/author/sph-tech/index.html +++ b/author/sph-tech/index.html @@ -13,7 +13,7 @@ } -
SPHTech

SPHTech

12 posts
XConf Review - Economics of Software Quality cover image

AI in News Media

IntroductionNews media companies like Singapore Press Holdings (SPH) continue to be faced with rapidly accelerating technology innovation…

  • SPHTech
    SPHTech
3 min read
\ No newline at end of file diff --git a/developers-gym-by-thoughtworks-14-july/index.html b/developers-gym-by-thoughtworks-14-july/index.html index 3d00ad5..040869a 100644 --- a/developers-gym-by-thoughtworks-14-july/index.html +++ b/developers-gym-by-thoughtworks-14-july/index.html @@ -13,7 +13,7 @@ } -
/Meetup

Developers Gym by Thoughtworks - 14 July

Android

How to get your mobile app users to give you ratings and feedback!

TL;DR Does asking users for feedback and ratings help in your app? Yes!When I joined Singapore Press Holdings in late 2015, most of the apps…

  • SPHTech
    SPHTech
3 min read
\ No newline at end of file diff --git a/developers-role-in-test-automation/index.html b/developers-role-in-test-automation/index.html index 3ffd204..666c9b7 100644 --- a/developers-role-in-test-automation/index.html +++ b/developers-role-in-test-automation/index.html @@ -13,7 +13,7 @@ } -
/Testing

The developer's role in a successful implementation of the test automation

About Us

This is the beginning of an exciting era for our SPHTech team!Over here, you will get to read about our learnings and reviews of the new…

  • SPHTech
    SPHTech
1 min read
\ No newline at end of file diff --git a/docker-workshop-in-sph/index.html b/docker-workshop-in-sph/index.html index 3c212f5..883b32e 100644 --- a/docker-workshop-in-sph/index.html +++ b/docker-workshop-in-sph/index.html @@ -13,7 +13,7 @@ } -
/Docker

Docker workshop in SPH

Meetup

Towards a Privacy Aware Smart Nation

On the 21st of November, SPH staff gathered for a cozy SPHTech Meetup session at The Inspiration Hub to learn about Data Privacy efforts in…

  • SPHTech
    SPHTech
1 min read
\ No newline at end of file diff --git a/get-your-app-users-to-give-feedback/index.html b/get-your-app-users-to-give-feedback/index.html index 3fd5195..3ac77ae 100644 --- a/get-your-app-users-to-give-feedback/index.html +++ b/get-your-app-users-to-give-feedback/index.html @@ -13,7 +13,7 @@ } -
/Android

How to get your mobile app users to give you ratings and feedback!

Android

Using Mockito's ArgumentCaptor on SingleLiveEvent

A class is an observable live data that can be used to send events from ViewModel to View in Android MVVM-styled designs.This link…

  • SPHTech
    SPHTech
4 min read
\ No newline at end of file diff --git a/index.html b/index.html index 1122245..523a27e 100644 --- a/index.html +++ b/index.html @@ -13,7 +13,7 @@ } -

SPHTech Blog

Our collection of adventures, learnings and thoughts!

XConf Review - Economics of Software Quality cover image

AI in News Media

IntroductionNews media companies like Singapore Press Holdings (SPH) continue to be faced with rapidly accelerating technology innovation…

  • SPHTech
    SPHTech
3 min read
\ No newline at end of file diff --git a/page-data/404.html/page-data.json b/page-data/404.html/page-data.json index 330c735..df4e358 100644 --- a/page-data/404.html/page-data.json +++ b/page-data/404.html/page-data.json @@ -1 +1 @@ -{"componentChunkName":"component---src-pages-404-tsx","path":"/404.html","webpackCompilationHash":"e6542130e6dfe73197bb","result":{"data":{"allMarkdownRemark":{"edges":[{"node":{"timeToRead":4,"frontmatter":{"title":"XConf Review - Economics of Software Quality","date":"2019-04-29T12:46:00.000Z","tags":["Review"],"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAMABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAMEBf/EABUBAQEAAAAAAAAAAAAAAAAAAAEC/9oADAMBAAIQAxAAAAGJ0yCtYUS//8QAGxAAAgIDAQAAAAAAAAAAAAAAAQIAAxESEyH/2gAIAQEAAQUCcLpxqlVqpWh2mfOYE//EABYRAQEBAAAAAAAAAAAAAAAAAAABEf/aAAgBAwEBPwGsf//EABYRAQEBAAAAAAAAAAAAAAAAAAABEf/aAAgBAgEBPwGVr//EAB0QAAMAAAcAAAAAAAAAAAAAAAABERASISJxgZH/2gAIAQEABj8Cqeot17Esq8JBc4f/xAAaEAEAAwEBAQAAAAAAAAAAAAABABEhQVEx/9oACAEBAAE/Ia5FjR9iHQmwq0fdyhYfTezbURbavdn/2gAMAwEAAgADAAAAEJAP/8QAFxEBAQEBAAAAAAAAAAAAAAAAAREAUf/aAAgBAwEBPxAVG6Ob/8QAGBEAAgMAAAAAAAAAAAAAAAAAAAERMUH/2gAIAQIBAT8QUrRPD//EABwQAQACAgMBAAAAAAAAAAAAAAEAESExQXGhkf/aAAgBAQABPxBKPijxjqFgV4E15Di4tQT2yytaAmA3g+SylgjXFET1otnWJ//Z","aspectRatio":1.696969696969697,"src":"/static/4eba5c89024d95c479a7a9ee73e9ac18/3dc2b/IMG__0303.jpg","srcSet":"/static/4eba5c89024d95c479a7a9ee73e9ac18/f8f18/IMG__0303.jpg 930w,\n/static/4eba5c89024d95c479a7a9ee73e9ac18/3dc2b/IMG__0303.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"excerpt":"Mr Martin Fowler was one of the founding members of the Agile Manifesto, author of many books including my favourite Refactoring (1st…","fields":{"layout":"post","slug":"/xconf-economics-of-software-quality/"}}},{"node":{"timeToRead":6,"frontmatter":{"title":"Revitalizing our engineering - Engineering 2.0","date":"2019-03-12T14:00:00.000Z","tags":[],"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAQBAgMF/8QAFgEBAQEAAAAAAAAAAAAAAAAAAgED/9oADAMBAAIQAxAAAAHa/IbjgWMn/8QAHBAAAwABBQAAAAAAAAAAAAAAAQIDEwAEERIU/9oACAEBAAEFAgiMfONPHhs5LS3B72qcv//EABYRAQEBAAAAAAAAAAAAAAAAAAABEf/aAAgBAwEBPwGNj//EABcRAAMBAAAAAAAAAAAAAAAAAAABAiH/2gAIAQIBAT8Bps0//8QAGBABAQEBAQAAAAAAAAAAAAAAAQARECH/2gAIAQEABj8CzmWrGrPrf//EABkQAQEBAQEBAAAAAAAAAAAAABEBADFBUf/aAAgBAQABPyEO6ezPyOWGsOpmACfuCwnf/9oADAMBAAIAAwAAABBA3//EABcRAAMBAAAAAAAAAAAAAAAAAAABETH/2gAIAQMBAT8QmkdR/8QAFhEBAQEAAAAAAAAAAAAAAAAAEQAB/9oACAECAQE/ED2PG//EABoQAQEBAAMBAAAAAAAAAAAAAAERACExQXH/2gAIAQEAAT8Q5hISiCfR5xeVaWEnkM+D1NSZrywMwqmEFfN//9k=","aspectRatio":1.3333333333333333,"src":"/static/2ecbc0836b73436a052109efa9ccde4e/3dc2b/william-warby-1357858-unsplash-1.jpg","srcSet":"/static/2ecbc0836b73436a052109efa9ccde4e/f8f18/william-warby-1357858-unsplash-1.jpg 930w,\n/static/2ecbc0836b73436a052109efa9ccde4e/3dc2b/william-warby-1357858-unsplash-1.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"excerpt":"We developed a News Tablet application for the Samsung Knox recently, and we are able to institute the various good engineering practices…","fields":{"layout":"post","slug":"/revitalizing-our-engineering/"}}},{"node":{"timeToRead":1,"frontmatter":{"title":"About Us","date":"2019-01-01T23:46:37.131Z","tags":[],"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAIEBf/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAGuZFjMNEX/xAAdEAEAAQMFAAAAAAAAAAAAAAACAAEDBBAREhMh/9oACAEBAAEFAqk73admiQMNvhDjef/EABURAQEAAAAAAAAAAAAAAAAAABAR/9oACAEDAQE/AYf/xAAVEQEBAAAAAAAAAAAAAAAAAAAQEf/aAAgBAgEBPwGn/8QAHhAAAQMEAwAAAAAAAAAAAAAAAQACERASITEiMqH/2gAIAQEABj8CuZiUJOhNBvKc67iRC7+L/8QAGxAAAwEBAAMAAAAAAAAAAAAAAAERIUExUZH/2gAIAQEAAT8hXdlJvRVr82FbLNeeRv6zEU2luHoB/9oADAMBAAIAAwAAABCbz//EABYRAQEBAAAAAAAAAAAAAAAAAAARIf/aAAgBAwEBPxCq1//EABURAQEAAAAAAAAAAAAAAAAAABAx/9oACAECAQE/EIP/xAAdEAEAAwACAwEAAAAAAAAAAAABABEhMUFhgaGx/9oACAEBAAE/EGQtNWliantl6rW3JQv7Ft0sdQkrFDejvYtC2gI4vfMdTuuls+z/2Q==","aspectRatio":1.3333333333333333,"src":"/static/e26b6c56a85123d553d70dcd1ce2285a/3dc2b/cafe-ppl-collab.jpg","srcSet":"/static/e26b6c56a85123d553d70dcd1ce2285a/f8f18/cafe-ppl-collab.jpg 930w,\n/static/e26b6c56a85123d553d70dcd1ce2285a/3dc2b/cafe-ppl-collab.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"excerpt":"This is the beginning of an exciting era for our SPHTech team!Over here, you will get to read about our learnings and reviews of the new…","fields":{"layout":"postnodate","slug":"/about-us/"}}}]}},"pageContext":{"isCreatedByStatefulCreatePages":true}}} \ No newline at end of file +{"componentChunkName":"component---src-pages-404-tsx","path":"/404.html","webpackCompilationHash":"4d127609ee78b8f0aee7","result":{"data":{"allMarkdownRemark":{"edges":[{"node":{"timeToRead":4,"frontmatter":{"title":"XConf Review - Economics of Software Quality","date":"2019-04-29T12:46:00.000Z","tags":["Review"],"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAMABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAMEBf/EABUBAQEAAAAAAAAAAAAAAAAAAAEC/9oADAMBAAIQAxAAAAGJ0yCtYUS//8QAGxAAAgIDAQAAAAAAAAAAAAAAAQIAAxESEyH/2gAIAQEAAQUCcLpxqlVqpWh2mfOYE//EABYRAQEBAAAAAAAAAAAAAAAAAAABEf/aAAgBAwEBPwGsf//EABYRAQEBAAAAAAAAAAAAAAAAAAABEf/aAAgBAgEBPwGVr//EAB0QAAMAAAcAAAAAAAAAAAAAAAABERASISJxgZH/2gAIAQEABj8Cqeot17Esq8JBc4f/xAAaEAEAAwEBAQAAAAAAAAAAAAABABEhQVEx/9oACAEBAAE/Ia5FjR9iHQmwq0fdyhYfTezbURbavdn/2gAMAwEAAgADAAAAEJAP/8QAFxEBAQEBAAAAAAAAAAAAAAAAAREAUf/aAAgBAwEBPxAVG6Ob/8QAGBEAAgMAAAAAAAAAAAAAAAAAAAERMUH/2gAIAQIBAT8QUrRPD//EABwQAQACAgMBAAAAAAAAAAAAAAEAESExQXGhkf/aAAgBAQABPxBKPijxjqFgV4E15Di4tQT2yytaAmA3g+SylgjXFET1otnWJ//Z","aspectRatio":1.696969696969697,"src":"/static/4eba5c89024d95c479a7a9ee73e9ac18/3dc2b/IMG__0303.jpg","srcSet":"/static/4eba5c89024d95c479a7a9ee73e9ac18/f8f18/IMG__0303.jpg 930w,\n/static/4eba5c89024d95c479a7a9ee73e9ac18/3dc2b/IMG__0303.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"excerpt":"Mr Martin Fowler was one of the founding members of the Agile Manifesto, author of many books including my favourite Refactoring (1st…","fields":{"layout":"post","slug":"/xconf-economics-of-software-quality/"}}},{"node":{"timeToRead":6,"frontmatter":{"title":"Revitalizing our engineering - Engineering 2.0","date":"2019-03-12T14:00:00.000Z","tags":[],"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAQBAgMF/8QAFgEBAQEAAAAAAAAAAAAAAAAAAgED/9oADAMBAAIQAxAAAAHa/IbjgWMn/8QAHBAAAwABBQAAAAAAAAAAAAAAAQIDEwAEERIU/9oACAEBAAEFAgiMfONPHhs5LS3B72qcv//EABYRAQEBAAAAAAAAAAAAAAAAAAABEf/aAAgBAwEBPwGNj//EABcRAAMBAAAAAAAAAAAAAAAAAAABAiH/2gAIAQIBAT8Bps0//8QAGBABAQEBAQAAAAAAAAAAAAAAAQARECH/2gAIAQEABj8CzmWrGrPrf//EABkQAQEBAQEBAAAAAAAAAAAAABEBADFBUf/aAAgBAQABPyEO6ezPyOWGsOpmACfuCwnf/9oADAMBAAIAAwAAABBA3//EABcRAAMBAAAAAAAAAAAAAAAAAAABETH/2gAIAQMBAT8QmkdR/8QAFhEBAQEAAAAAAAAAAAAAAAAAEQAB/9oACAECAQE/ED2PG//EABoQAQEBAAMBAAAAAAAAAAAAAAERACExQXH/2gAIAQEAAT8Q5hISiCfR5xeVaWEnkM+D1NSZrywMwqmEFfN//9k=","aspectRatio":1.3333333333333333,"src":"/static/2ecbc0836b73436a052109efa9ccde4e/3dc2b/william-warby-1357858-unsplash-1.jpg","srcSet":"/static/2ecbc0836b73436a052109efa9ccde4e/f8f18/william-warby-1357858-unsplash-1.jpg 930w,\n/static/2ecbc0836b73436a052109efa9ccde4e/3dc2b/william-warby-1357858-unsplash-1.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"excerpt":"We developed a News Tablet application for the Samsung Knox recently, and we are able to institute the various good engineering practices…","fields":{"layout":"post","slug":"/revitalizing-our-engineering/"}}},{"node":{"timeToRead":1,"frontmatter":{"title":"About Us","date":"2019-01-01T23:46:37.131Z","tags":[],"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAIEBf/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAGuZFjMNEX/xAAdEAEAAQMFAAAAAAAAAAAAAAACAAEDBBAREhMh/9oACAEBAAEFAqk73admiQMNvhDjef/EABURAQEAAAAAAAAAAAAAAAAAABAR/9oACAEDAQE/AYf/xAAVEQEBAAAAAAAAAAAAAAAAAAAQEf/aAAgBAgEBPwGn/8QAHhAAAQMEAwAAAAAAAAAAAAAAAQACERASITEiMqH/2gAIAQEABj8CuZiUJOhNBvKc67iRC7+L/8QAGxAAAwEBAAMAAAAAAAAAAAAAAAERIUExUZH/2gAIAQEAAT8hXdlJvRVr82FbLNeeRv6zEU2luHoB/9oADAMBAAIAAwAAABCbz//EABYRAQEBAAAAAAAAAAAAAAAAAAARIf/aAAgBAwEBPxCq1//EABURAQEAAAAAAAAAAAAAAAAAABAx/9oACAECAQE/EIP/xAAdEAEAAwACAwEAAAAAAAAAAAABABEhMUFhgaGx/9oACAEBAAE/EGQtNWliantl6rW3JQv7Ft0sdQkrFDejvYtC2gI4vfMdTuuls+z/2Q==","aspectRatio":1.3333333333333333,"src":"/static/e26b6c56a85123d553d70dcd1ce2285a/3dc2b/cafe-ppl-collab.jpg","srcSet":"/static/e26b6c56a85123d553d70dcd1ce2285a/f8f18/cafe-ppl-collab.jpg 930w,\n/static/e26b6c56a85123d553d70dcd1ce2285a/3dc2b/cafe-ppl-collab.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"excerpt":"This is the beginning of an exciting era for our SPHTech team!Over here, you will get to read about our learnings and reviews of the new…","fields":{"layout":"postnodate","slug":"/about-us/"}}}]}},"pageContext":{"isCreatedByStatefulCreatePages":true}}} \ No newline at end of file diff --git a/page-data/404/page-data.json b/page-data/404/page-data.json index 8fad892..0deea3c 100644 --- a/page-data/404/page-data.json +++ b/page-data/404/page-data.json @@ -1 +1 @@ -{"componentChunkName":"component---src-pages-404-tsx","path":"/404/","webpackCompilationHash":"e6542130e6dfe73197bb","result":{"data":{"allMarkdownRemark":{"edges":[{"node":{"timeToRead":4,"frontmatter":{"title":"XConf Review - Economics of Software Quality","date":"2019-04-29T12:46:00.000Z","tags":["Review"],"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAMABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAMEBf/EABUBAQEAAAAAAAAAAAAAAAAAAAEC/9oADAMBAAIQAxAAAAGJ0yCtYUS//8QAGxAAAgIDAQAAAAAAAAAAAAAAAQIAAxESEyH/2gAIAQEAAQUCcLpxqlVqpWh2mfOYE//EABYRAQEBAAAAAAAAAAAAAAAAAAABEf/aAAgBAwEBPwGsf//EABYRAQEBAAAAAAAAAAAAAAAAAAABEf/aAAgBAgEBPwGVr//EAB0QAAMAAAcAAAAAAAAAAAAAAAABERASISJxgZH/2gAIAQEABj8Cqeot17Esq8JBc4f/xAAaEAEAAwEBAQAAAAAAAAAAAAABABEhQVEx/9oACAEBAAE/Ia5FjR9iHQmwq0fdyhYfTezbURbavdn/2gAMAwEAAgADAAAAEJAP/8QAFxEBAQEBAAAAAAAAAAAAAAAAAREAUf/aAAgBAwEBPxAVG6Ob/8QAGBEAAgMAAAAAAAAAAAAAAAAAAAERMUH/2gAIAQIBAT8QUrRPD//EABwQAQACAgMBAAAAAAAAAAAAAAEAESExQXGhkf/aAAgBAQABPxBKPijxjqFgV4E15Di4tQT2yytaAmA3g+SylgjXFET1otnWJ//Z","aspectRatio":1.696969696969697,"src":"/static/4eba5c89024d95c479a7a9ee73e9ac18/3dc2b/IMG__0303.jpg","srcSet":"/static/4eba5c89024d95c479a7a9ee73e9ac18/f8f18/IMG__0303.jpg 930w,\n/static/4eba5c89024d95c479a7a9ee73e9ac18/3dc2b/IMG__0303.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"excerpt":"Mr Martin Fowler was one of the founding members of the Agile Manifesto, author of many books including my favourite Refactoring (1st…","fields":{"layout":"post","slug":"/xconf-economics-of-software-quality/"}}},{"node":{"timeToRead":6,"frontmatter":{"title":"Revitalizing our engineering - Engineering 2.0","date":"2019-03-12T14:00:00.000Z","tags":[],"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAQBAgMF/8QAFgEBAQEAAAAAAAAAAAAAAAAAAgED/9oADAMBAAIQAxAAAAHa/IbjgWMn/8QAHBAAAwABBQAAAAAAAAAAAAAAAQIDEwAEERIU/9oACAEBAAEFAgiMfONPHhs5LS3B72qcv//EABYRAQEBAAAAAAAAAAAAAAAAAAABEf/aAAgBAwEBPwGNj//EABcRAAMBAAAAAAAAAAAAAAAAAAABAiH/2gAIAQIBAT8Bps0//8QAGBABAQEBAQAAAAAAAAAAAAAAAQARECH/2gAIAQEABj8CzmWrGrPrf//EABkQAQEBAQEBAAAAAAAAAAAAABEBADFBUf/aAAgBAQABPyEO6ezPyOWGsOpmACfuCwnf/9oADAMBAAIAAwAAABBA3//EABcRAAMBAAAAAAAAAAAAAAAAAAABETH/2gAIAQMBAT8QmkdR/8QAFhEBAQEAAAAAAAAAAAAAAAAAEQAB/9oACAECAQE/ED2PG//EABoQAQEBAAMBAAAAAAAAAAAAAAERACExQXH/2gAIAQEAAT8Q5hISiCfR5xeVaWEnkM+D1NSZrywMwqmEFfN//9k=","aspectRatio":1.3333333333333333,"src":"/static/2ecbc0836b73436a052109efa9ccde4e/3dc2b/william-warby-1357858-unsplash-1.jpg","srcSet":"/static/2ecbc0836b73436a052109efa9ccde4e/f8f18/william-warby-1357858-unsplash-1.jpg 930w,\n/static/2ecbc0836b73436a052109efa9ccde4e/3dc2b/william-warby-1357858-unsplash-1.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"excerpt":"We developed a News Tablet application for the Samsung Knox recently, and we are able to institute the various good engineering practices…","fields":{"layout":"post","slug":"/revitalizing-our-engineering/"}}},{"node":{"timeToRead":1,"frontmatter":{"title":"About Us","date":"2019-01-01T23:46:37.131Z","tags":[],"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAIEBf/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAGuZFjMNEX/xAAdEAEAAQMFAAAAAAAAAAAAAAACAAEDBBAREhMh/9oACAEBAAEFAqk73admiQMNvhDjef/EABURAQEAAAAAAAAAAAAAAAAAABAR/9oACAEDAQE/AYf/xAAVEQEBAAAAAAAAAAAAAAAAAAAQEf/aAAgBAgEBPwGn/8QAHhAAAQMEAwAAAAAAAAAAAAAAAQACERASITEiMqH/2gAIAQEABj8CuZiUJOhNBvKc67iRC7+L/8QAGxAAAwEBAAMAAAAAAAAAAAAAAAERIUExUZH/2gAIAQEAAT8hXdlJvRVr82FbLNeeRv6zEU2luHoB/9oADAMBAAIAAwAAABCbz//EABYRAQEBAAAAAAAAAAAAAAAAAAARIf/aAAgBAwEBPxCq1//EABURAQEAAAAAAAAAAAAAAAAAABAx/9oACAECAQE/EIP/xAAdEAEAAwACAwEAAAAAAAAAAAABABEhMUFhgaGx/9oACAEBAAE/EGQtNWliantl6rW3JQv7Ft0sdQkrFDejvYtC2gI4vfMdTuuls+z/2Q==","aspectRatio":1.3333333333333333,"src":"/static/e26b6c56a85123d553d70dcd1ce2285a/3dc2b/cafe-ppl-collab.jpg","srcSet":"/static/e26b6c56a85123d553d70dcd1ce2285a/f8f18/cafe-ppl-collab.jpg 930w,\n/static/e26b6c56a85123d553d70dcd1ce2285a/3dc2b/cafe-ppl-collab.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"excerpt":"This is the beginning of an exciting era for our SPHTech team!Over here, you will get to read about our learnings and reviews of the new…","fields":{"layout":"postnodate","slug":"/about-us/"}}}]}},"pageContext":{"isCreatedByStatefulCreatePages":true}}} \ No newline at end of file +{"componentChunkName":"component---src-pages-404-tsx","path":"/404/","webpackCompilationHash":"4d127609ee78b8f0aee7","result":{"data":{"allMarkdownRemark":{"edges":[{"node":{"timeToRead":4,"frontmatter":{"title":"XConf Review - Economics of Software Quality","date":"2019-04-29T12:46:00.000Z","tags":["Review"],"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAMABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAMEBf/EABUBAQEAAAAAAAAAAAAAAAAAAAEC/9oADAMBAAIQAxAAAAGJ0yCtYUS//8QAGxAAAgIDAQAAAAAAAAAAAAAAAQIAAxESEyH/2gAIAQEAAQUCcLpxqlVqpWh2mfOYE//EABYRAQEBAAAAAAAAAAAAAAAAAAABEf/aAAgBAwEBPwGsf//EABYRAQEBAAAAAAAAAAAAAAAAAAABEf/aAAgBAgEBPwGVr//EAB0QAAMAAAcAAAAAAAAAAAAAAAABERASISJxgZH/2gAIAQEABj8Cqeot17Esq8JBc4f/xAAaEAEAAwEBAQAAAAAAAAAAAAABABEhQVEx/9oACAEBAAE/Ia5FjR9iHQmwq0fdyhYfTezbURbavdn/2gAMAwEAAgADAAAAEJAP/8QAFxEBAQEBAAAAAAAAAAAAAAAAAREAUf/aAAgBAwEBPxAVG6Ob/8QAGBEAAgMAAAAAAAAAAAAAAAAAAAERMUH/2gAIAQIBAT8QUrRPD//EABwQAQACAgMBAAAAAAAAAAAAAAEAESExQXGhkf/aAAgBAQABPxBKPijxjqFgV4E15Di4tQT2yytaAmA3g+SylgjXFET1otnWJ//Z","aspectRatio":1.696969696969697,"src":"/static/4eba5c89024d95c479a7a9ee73e9ac18/3dc2b/IMG__0303.jpg","srcSet":"/static/4eba5c89024d95c479a7a9ee73e9ac18/f8f18/IMG__0303.jpg 930w,\n/static/4eba5c89024d95c479a7a9ee73e9ac18/3dc2b/IMG__0303.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"excerpt":"Mr Martin Fowler was one of the founding members of the Agile Manifesto, author of many books including my favourite Refactoring (1st…","fields":{"layout":"post","slug":"/xconf-economics-of-software-quality/"}}},{"node":{"timeToRead":6,"frontmatter":{"title":"Revitalizing our engineering - Engineering 2.0","date":"2019-03-12T14:00:00.000Z","tags":[],"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAQBAgMF/8QAFgEBAQEAAAAAAAAAAAAAAAAAAgED/9oADAMBAAIQAxAAAAHa/IbjgWMn/8QAHBAAAwABBQAAAAAAAAAAAAAAAQIDEwAEERIU/9oACAEBAAEFAgiMfONPHhs5LS3B72qcv//EABYRAQEBAAAAAAAAAAAAAAAAAAABEf/aAAgBAwEBPwGNj//EABcRAAMBAAAAAAAAAAAAAAAAAAABAiH/2gAIAQIBAT8Bps0//8QAGBABAQEBAQAAAAAAAAAAAAAAAQARECH/2gAIAQEABj8CzmWrGrPrf//EABkQAQEBAQEBAAAAAAAAAAAAABEBADFBUf/aAAgBAQABPyEO6ezPyOWGsOpmACfuCwnf/9oADAMBAAIAAwAAABBA3//EABcRAAMBAAAAAAAAAAAAAAAAAAABETH/2gAIAQMBAT8QmkdR/8QAFhEBAQEAAAAAAAAAAAAAAAAAEQAB/9oACAECAQE/ED2PG//EABoQAQEBAAMBAAAAAAAAAAAAAAERACExQXH/2gAIAQEAAT8Q5hISiCfR5xeVaWEnkM+D1NSZrywMwqmEFfN//9k=","aspectRatio":1.3333333333333333,"src":"/static/2ecbc0836b73436a052109efa9ccde4e/3dc2b/william-warby-1357858-unsplash-1.jpg","srcSet":"/static/2ecbc0836b73436a052109efa9ccde4e/f8f18/william-warby-1357858-unsplash-1.jpg 930w,\n/static/2ecbc0836b73436a052109efa9ccde4e/3dc2b/william-warby-1357858-unsplash-1.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"excerpt":"We developed a News Tablet application for the Samsung Knox recently, and we are able to institute the various good engineering practices…","fields":{"layout":"post","slug":"/revitalizing-our-engineering/"}}},{"node":{"timeToRead":1,"frontmatter":{"title":"About Us","date":"2019-01-01T23:46:37.131Z","tags":[],"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAIEBf/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAGuZFjMNEX/xAAdEAEAAQMFAAAAAAAAAAAAAAACAAEDBBAREhMh/9oACAEBAAEFAqk73admiQMNvhDjef/EABURAQEAAAAAAAAAAAAAAAAAABAR/9oACAEDAQE/AYf/xAAVEQEBAAAAAAAAAAAAAAAAAAAQEf/aAAgBAgEBPwGn/8QAHhAAAQMEAwAAAAAAAAAAAAAAAQACERASITEiMqH/2gAIAQEABj8CuZiUJOhNBvKc67iRC7+L/8QAGxAAAwEBAAMAAAAAAAAAAAAAAAERIUExUZH/2gAIAQEAAT8hXdlJvRVr82FbLNeeRv6zEU2luHoB/9oADAMBAAIAAwAAABCbz//EABYRAQEBAAAAAAAAAAAAAAAAAAARIf/aAAgBAwEBPxCq1//EABURAQEAAAAAAAAAAAAAAAAAABAx/9oACAECAQE/EIP/xAAdEAEAAwACAwEAAAAAAAAAAAABABEhMUFhgaGx/9oACAEBAAE/EGQtNWliantl6rW3JQv7Ft0sdQkrFDejvYtC2gI4vfMdTuuls+z/2Q==","aspectRatio":1.3333333333333333,"src":"/static/e26b6c56a85123d553d70dcd1ce2285a/3dc2b/cafe-ppl-collab.jpg","srcSet":"/static/e26b6c56a85123d553d70dcd1ce2285a/f8f18/cafe-ppl-collab.jpg 930w,\n/static/e26b6c56a85123d553d70dcd1ce2285a/3dc2b/cafe-ppl-collab.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"excerpt":"This is the beginning of an exciting era for our SPHTech team!Over here, you will get to read about our learnings and reviews of the new…","fields":{"layout":"postnodate","slug":"/about-us/"}}}]}},"pageContext":{"isCreatedByStatefulCreatePages":true}}} \ No newline at end of file diff --git a/page-data/about-us/page-data.json b/page-data/about-us/page-data.json index fbee8ed..48cdbf0 100644 --- a/page-data/about-us/page-data.json +++ b/page-data/about-us/page-data.json @@ -1 +1 @@ -{"componentChunkName":"component---src-templates-postnodate-tsx","path":"/about-us/","webpackCompilationHash":"e6542130e6dfe73197bb","result":{"data":{"logo":{"childImageSharp":{"fixed":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsSAAALEgHS3X78AAABFUlEQVQY023PvUrDUBTA8ZuCtoMoOLQ4dWhN14x2kEKXFkGoohQ/QBexOHRycAidKkgHHRq69APRoTjFJYODIA6+gSBYfYMmfYLE/5VT6NALP845NyeHc9UoCHZRQvonCLKKE4ZhAXYURTsYoE9dIy5iCzfUJnEdV+RF4iu6ikFH2EPxazzOcJmg4Rnn5C8ysIEOHqTe5/sT3qXOwYOtRr5/wLAqzpCTDXu4p2ETtyjgGJ/cX+se8jeU9fa4RBt5vWENpjzdkoGPcGg4RQsbOMEFmnBRRwVDHEK/yFXfvr/CoPjvZLKcdByDyzWGeajigzorGy0oOeRJiUtITe/pX1XzDk3buIMltSFR/zTtic3060X+8z8PsEUt8G3LVQAAAABJRU5ErkJggg==","width":400,"height":128,"src":"/static/2b5eaa0de166a8b5faebad4955c2200c/647de/ghost-logo.png","srcSet":"/static/2b5eaa0de166a8b5faebad4955c2200c/647de/ghost-logo.png 1x"}}},"markdownRemark":{"html":"

This is the beginning of an exciting era for our SPHTech team!

\n

Over here, you will get to read about our learnings and reviews of the new technologies we are playing with, the meet-ups and conferences we attend, some of the presentations that we do on a regular basis and many other great content!

\n

We believe that the information and knowledge learned by the individual can be put to great use when they are being shared with the rest of the team. This platform serves to connect any of us who share the same interest in certain topics, to propagate and champion for the usage of new technologies, as well as to promote the adoption of technology, security and programming best practices!

\n

May you have an enjoyable time here reading the blog articles!

","htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"This is the beginning of an exciting era for our SPHTech team!"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Over here, you will get to read about our learnings and reviews of the new technologies we are playing with, the meet-ups and conferences we attend, some of the presentations that we do on a regular basis and many other great content!"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"We believe that the information and knowledge learned by the individual can be put to great use when they are being shared with the rest of the team. This platform serves to connect any of us who share the same interest in certain topics, to propagate and champion for the usage of new technologies, as well as to promote the adoption of technology, security and programming best practices!"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"May you have an enjoyable time here reading the blog articles!"}]}],"data":{"quirksMode":false}},"excerpt":"This is the beginning of an exciting era for our SPHTech team!Over here, you will get to read about our learnings and reviews of the new…","timeToRead":1,"frontmatter":{"title":"About Us","userDate":"1 January 2019","date":"2019-01-01T23:46:37.131Z","tags":[],"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAIEBf/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAGuZFjMNEX/xAAdEAEAAQMFAAAAAAAAAAAAAAACAAEDBBAREhMh/9oACAEBAAEFAqk73admiQMNvhDjef/EABURAQEAAAAAAAAAAAAAAAAAABAR/9oACAEDAQE/AYf/xAAVEQEBAAAAAAAAAAAAAAAAAAAQEf/aAAgBAgEBPwGn/8QAHhAAAQMEAwAAAAAAAAAAAAAAAQACERASITEiMqH/2gAIAQEABj8CuZiUJOhNBvKc67iRC7+L/8QAGxAAAwEBAAMAAAAAAAAAAAAAAAERIUExUZH/2gAIAQEAAT8hXdlJvRVr82FbLNeeRv6zEU2luHoB/9oADAMBAAIAAwAAABCbz//EABYRAQEBAAAAAAAAAAAAAAAAAAARIf/aAAgBAwEBPxCq1//EABURAQEAAAAAAAAAAAAAAAAAABAx/9oACAECAQE/EIP/xAAdEAEAAwACAwEAAAAAAAAAAAABABEhMUFhgaGx/9oACAEBAAE/EGQtNWliantl6rW3JQv7Ft0sdQkrFDejvYtC2gI4vfMdTuuls+z/2Q==","aspectRatio":1.3333333333333333,"src":"/static/e26b6c56a85123d553d70dcd1ce2285a/3dc2b/cafe-ppl-collab.jpg","srcSet":"/static/e26b6c56a85123d553d70dcd1ce2285a/f8f18/cafe-ppl-collab.jpg 930w,\n/static/e26b6c56a85123d553d70dcd1ce2285a/3dc2b/cafe-ppl-collab.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAADQElEQVQ4y5VUW0tUURSeX9BDhFZQ1Nx0lCAqI+o1KMiHoqjIesisXiLSQOhiRUWUdKEwKqKHtNIyJLuY0UWS0lBKM8mcrEadcnIc58zlzMyZvc/+WjNnRs+xIWjDd9a+fudba6+1TaAmhEDaCqESONItOZewCUitgK8JIu7TxrQXqbV0M00lSzd1LAgRiU5u/3oAaJ0NQcC7RYC/LXWOJz6ThHoVyX74GynpRKTuLZjTo815SNWzbIjuEsD7EqJjHUT7KoNnBoVpZer3G+DN+eBNNvD2Egh5BCLqAW9ZCf7YDBF0agTjXbRnAbkezESYikPIBfYgH+y+BawhD6x+LtjDAsJSxOutiN+zgPechWAyeNs+sNZiXagyEKq+Xig1dii386DcyiU4oFRbodwk1CT6dq1fnQv2vJiUj6cIVYNKk55dadyC6PnpiF3LRfRqziSu2Ak0d9mC2I0C6JtQVYNSk+Evsg9K035EKs2InLUhci6HrD0F6ldaEbmwEKz7HrjrHamUpqg0pM1kyrD3dxE+Ykb4mB3ho2nYaI5shQXhg3MRPmyGfGY5+OCHlFKuv+UUKY8nLR/8iFCZBaH9VoKN+glr11BK41KyZTkI7poBuaook8vCcFvypRIEts1EYLcdgRILAjttkLbOhlQ0C4EdiXEOrTlozxyEjhQaLsY0Nbjq7yE67IC00Qxps5VAZOvJxeNbET61HdKG+fCvyYK/MBv+1TMQa66ZcDkjIf/los02OmSBf62DDs2DtGkxVZCWxKy/G5HrZ+gHe6G8eWqoeWPp6SpGPl0O74JpGFuSBR/ZaHWVdiiuxTjW0o/QxeY0laEEDZeiksoEJYvTjTXeQfRkOeSG2mQ+CJ0XzOVBvGtgwk09x4TLqhCGhP1EKTaeXsO/21+PA1e1iVfOMRx94iT048SjPuyp68GL3l+Aux/MMwTuHqAS9UClOKveEaijbkpu+e/SYynC2x1uZB16gWXn2zA8JqO2043d9X2AxwnF/R3scwf4QE+SlH/rBet6TS/Q+NRLERPuDoyGUUHqVlxox6svXri8Mtp+kO+RAFQ5RCk1nCRQRwbpdZI0KNHMj4M+hr0/g8YY/UcM/wD4fYcC4gOWgAAAAABJRU5ErkJggg==","width":400,"height":400,"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png","srcSet":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png 1x,\n/static/7fa6bee9d2080bd021828c70f67a4720/fca9c/sphtech.png 1.5x"}}]}}}}},"pageContext":{"isCreatedByStatefulCreatePages":false,"slug":"/about-us/","prev":{"excerpt":"Rod Michael, director of global market access strategy and channels at Rockwell Automation, famously said, “If you automate a mess, you get…","timeToRead":3,"frontmatter":{"title":"The developer's role in a successful implementation of the test automation","tags":["Testing"],"date":"2018-12-06T12:54:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"aspectRatio":1.8252933507170794,"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAACiElEQVQoz02SS0hUURjHZ9WqoE0RbcJFRUWBROuKCKqNFY1iD2yRo5ELicqoSBOMMGSsQHpDlBbVooYwhKgcSU3thUo048C0cJh7ve9zn/P6950zjnThz3fvuYff9z//74TiI8OIj05ibHwKo6RP8XGMTXxHOpXE1+kkfqVlqHIWiqKSFKTTaczNzQklEgkkk0mkUqklhTbuasaKzbVYs/0EVlUfR2jtfhxoaEcxn4PvewBKKJVKKBaLQvydK5fLgTEGx3FQKBTEGq+hzt7nONP+EFd7X+BC9zO0XHuEewNDCJiFwPXhuR5c10U+n18C88q/+eP7vnBuGIZYCyX//MTv2UnMzEwiMTuBv4kfkDJp6AsKtKwMXWVQNQOKpoPZtnD2P5A7nJ+fhyRJ4l/o8/t+vOmP4nqkBq9vX8bgqz5MfRkC002YBLUtBw45ZbYDj9xUnFbA3H0mk4Esy2WHE8Mx3L/VgTtnG/Gg6xJiL+9i+lscjmHCok2MjhO4ATzPg20zAeJPxSEHZrNZcWwBHPswgG1b1qGtO4qGxiZEz9cjNTuCIMjDWliAKcmwDQqfHDJmE9gX4VfAvBF3p6pqGXix4ylWb2jGjr1dqN7diaqtrejti5UDp4EwgtrU3WeOGJBDLoPFo1fEG/BhiSnvPBLDsqpBLF//Fis3vaNrE8PJcx8JVyQXBWiKBkXiU3RhMA+qacOiTHO5vJhwEJTj4FU4bOt6gnCkB/WnexBuuoGDdVcQvflYOORddUWHSkBdc6AaDiSauEbQ3GKG/OimaVK+ttgfikROoa72EI4dDSMcrsHhfXtwpbUFLmVl08U1KB9DlmCqOgxdJ7BKVRMQy7KE+B3kw+HQf+uQ+eTE1QltAAAAAElFTkSuQmCC","sizes":"(max-width: 1400px) 100vw, 1400px","src":"/static/131b22d7fad4398f72deddd43464e6a3/cd9a9/blog-test-automation.png","srcSet":"/static/131b22d7fad4398f72deddd43464e6a3/4c9af/blog-test-automation.png 930w,\n/static/131b22d7fad4398f72deddd43464e6a3/cd9a9/blog-test-automation.png 1400w"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/b4a08/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/developers-role-in-test-automation/"}},"next":{"excerpt":"We developed a News Tablet application for the Samsung Knox recently, and we are able to institute the various good engineering practices…","timeToRead":6,"frontmatter":{"title":"Revitalizing our engineering - Engineering 2.0","tags":[],"date":"2019-03-12T14:00:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"aspectRatio":1.3333333333333333,"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAQBAgMF/8QAFgEBAQEAAAAAAAAAAAAAAAAAAgED/9oADAMBAAIQAxAAAAHa/IbjgWMn/8QAHBAAAwABBQAAAAAAAAAAAAAAAQIDEwAEERIU/9oACAEBAAEFAgiMfONPHhs5LS3B72qcv//EABYRAQEBAAAAAAAAAAAAAAAAAAABEf/aAAgBAwEBPwGNj//EABcRAAMBAAAAAAAAAAAAAAAAAAABAiH/2gAIAQIBAT8Bps0//8QAGBABAQEBAQAAAAAAAAAAAAAAAQARECH/2gAIAQEABj8CzmWrGrPrf//EABkQAQEBAQEBAAAAAAAAAAAAABEBADFBUf/aAAgBAQABPyEO6ezPyOWGsOpmACfuCwnf/9oADAMBAAIAAwAAABBA3//EABcRAAMBAAAAAAAAAAAAAAAAAAABETH/2gAIAQMBAT8QmkdR/8QAFhEBAQEAAAAAAAAAAAAAAAAAEQAB/9oACAECAQE/ED2PG//EABoQAQEBAAMBAAAAAAAAAAAAAAERACExQXH/2gAIAQEAAT8Q5hISiCfR5xeVaWEnkM+D1NSZrywMwqmEFfN//9k=","sizes":"(max-width: 1400px) 100vw, 1400px","src":"/static/2ecbc0836b73436a052109efa9ccde4e/3dc2b/william-warby-1357858-unsplash-1.jpg","srcSet":"/static/2ecbc0836b73436a052109efa9ccde4e/f8f18/william-warby-1357858-unsplash-1.jpg 930w,\n/static/2ecbc0836b73436a052109efa9ccde4e/3dc2b/william-warby-1357858-unsplash-1.jpg 1400w"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/b4a08/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/revitalizing-our-engineering/"}}}}} \ No newline at end of file +{"componentChunkName":"component---src-templates-postnodate-tsx","path":"/about-us/","webpackCompilationHash":"4d127609ee78b8f0aee7","result":{"data":{"logo":{"childImageSharp":{"fixed":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsSAAALEgHS3X78AAABFUlEQVQY023PvUrDUBTA8ZuCtoMoOLQ4dWhN14x2kEKXFkGoohQ/QBexOHRycAidKkgHHRq69APRoTjFJYODIA6+gSBYfYMmfYLE/5VT6NALP845NyeHc9UoCHZRQvonCLKKE4ZhAXYURTsYoE9dIy5iCzfUJnEdV+RF4iu6ikFH2EPxazzOcJmg4Rnn5C8ysIEOHqTe5/sT3qXOwYOtRr5/wLAqzpCTDXu4p2ETtyjgGJ/cX+se8jeU9fa4RBt5vWENpjzdkoGPcGg4RQsbOMEFmnBRRwVDHEK/yFXfvr/CoPjvZLKcdByDyzWGeajigzorGy0oOeRJiUtITe/pX1XzDk3buIMltSFR/zTtic3060X+8z8PsEUt8G3LVQAAAABJRU5ErkJggg==","width":400,"height":128,"src":"/static/2b5eaa0de166a8b5faebad4955c2200c/647de/ghost-logo.png","srcSet":"/static/2b5eaa0de166a8b5faebad4955c2200c/647de/ghost-logo.png 1x"}}},"markdownRemark":{"html":"

This is the beginning of an exciting era for our SPHTech team!

\n

Over here, you will get to read about our learnings and reviews of the new technologies we are playing with, the meet-ups and conferences we attend, some of the presentations that we do on a regular basis and many other great content!

\n

We believe that the information and knowledge learned by the individual can be put to great use when they are being shared with the rest of the team. This platform serves to connect any of us who share the same interest in certain topics, to propagate and champion for the usage of new technologies, as well as to promote the adoption of technology, security and programming best practices!

\n

May you have an enjoyable time here reading the blog articles!

","htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"This is the beginning of an exciting era for our SPHTech team!"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Over here, you will get to read about our learnings and reviews of the new technologies we are playing with, the meet-ups and conferences we attend, some of the presentations that we do on a regular basis and many other great content!"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"We believe that the information and knowledge learned by the individual can be put to great use when they are being shared with the rest of the team. This platform serves to connect any of us who share the same interest in certain topics, to propagate and champion for the usage of new technologies, as well as to promote the adoption of technology, security and programming best practices!"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"May you have an enjoyable time here reading the blog articles!"}]}],"data":{"quirksMode":false}},"excerpt":"This is the beginning of an exciting era for our SPHTech team!Over here, you will get to read about our learnings and reviews of the new…","timeToRead":1,"frontmatter":{"title":"About Us","userDate":"1 January 2019","date":"2019-01-01T23:46:37.131Z","tags":[],"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAIEBf/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAGuZFjMNEX/xAAdEAEAAQMFAAAAAAAAAAAAAAACAAEDBBAREhMh/9oACAEBAAEFAqk73admiQMNvhDjef/EABURAQEAAAAAAAAAAAAAAAAAABAR/9oACAEDAQE/AYf/xAAVEQEBAAAAAAAAAAAAAAAAAAAQEf/aAAgBAgEBPwGn/8QAHhAAAQMEAwAAAAAAAAAAAAAAAQACERASITEiMqH/2gAIAQEABj8CuZiUJOhNBvKc67iRC7+L/8QAGxAAAwEBAAMAAAAAAAAAAAAAAAERIUExUZH/2gAIAQEAAT8hXdlJvRVr82FbLNeeRv6zEU2luHoB/9oADAMBAAIAAwAAABCbz//EABYRAQEBAAAAAAAAAAAAAAAAAAARIf/aAAgBAwEBPxCq1//EABURAQEAAAAAAAAAAAAAAAAAABAx/9oACAECAQE/EIP/xAAdEAEAAwACAwEAAAAAAAAAAAABABEhMUFhgaGx/9oACAEBAAE/EGQtNWliantl6rW3JQv7Ft0sdQkrFDejvYtC2gI4vfMdTuuls+z/2Q==","aspectRatio":1.3333333333333333,"src":"/static/e26b6c56a85123d553d70dcd1ce2285a/3dc2b/cafe-ppl-collab.jpg","srcSet":"/static/e26b6c56a85123d553d70dcd1ce2285a/f8f18/cafe-ppl-collab.jpg 930w,\n/static/e26b6c56a85123d553d70dcd1ce2285a/3dc2b/cafe-ppl-collab.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAADQElEQVQ4y5VUW0tUURSeX9BDhFZQ1Nx0lCAqI+o1KMiHoqjIesisXiLSQOhiRUWUdKEwKqKHtNIyJLuY0UWS0lBKM8mcrEadcnIc58zlzMyZvc/+WjNnRs+xIWjDd9a+fudba6+1TaAmhEDaCqESONItOZewCUitgK8JIu7TxrQXqbV0M00lSzd1LAgRiU5u/3oAaJ0NQcC7RYC/LXWOJz6ThHoVyX74GynpRKTuLZjTo815SNWzbIjuEsD7EqJjHUT7KoNnBoVpZer3G+DN+eBNNvD2Egh5BCLqAW9ZCf7YDBF0agTjXbRnAbkezESYikPIBfYgH+y+BawhD6x+LtjDAsJSxOutiN+zgPechWAyeNs+sNZiXagyEKq+Xig1dii386DcyiU4oFRbodwk1CT6dq1fnQv2vJiUj6cIVYNKk55dadyC6PnpiF3LRfRqziSu2Ak0d9mC2I0C6JtQVYNSk+Evsg9K035EKs2InLUhci6HrD0F6ldaEbmwEKz7HrjrHamUpqg0pM1kyrD3dxE+Ykb4mB3ho2nYaI5shQXhg3MRPmyGfGY5+OCHlFKuv+UUKY8nLR/8iFCZBaH9VoKN+glr11BK41KyZTkI7poBuaook8vCcFvypRIEts1EYLcdgRILAjttkLbOhlQ0C4EdiXEOrTlozxyEjhQaLsY0Nbjq7yE67IC00Qxps5VAZOvJxeNbET61HdKG+fCvyYK/MBv+1TMQa66ZcDkjIf/los02OmSBf62DDs2DtGkxVZCWxKy/G5HrZ+gHe6G8eWqoeWPp6SpGPl0O74JpGFuSBR/ZaHWVdiiuxTjW0o/QxeY0laEEDZeiksoEJYvTjTXeQfRkOeSG2mQ+CJ0XzOVBvGtgwk09x4TLqhCGhP1EKTaeXsO/21+PA1e1iVfOMRx94iT048SjPuyp68GL3l+Aux/MMwTuHqAS9UClOKveEaijbkpu+e/SYynC2x1uZB16gWXn2zA8JqO2043d9X2AxwnF/R3scwf4QE+SlH/rBet6TS/Q+NRLERPuDoyGUUHqVlxox6svXri8Mtp+kO+RAFQ5RCk1nCRQRwbpdZI0KNHMj4M+hr0/g8YY/UcM/wD4fYcC4gOWgAAAAABJRU5ErkJggg==","width":400,"height":400,"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png","srcSet":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png 1x,\n/static/7fa6bee9d2080bd021828c70f67a4720/fca9c/sphtech.png 1.5x"}}]}}}}},"pageContext":{"isCreatedByStatefulCreatePages":false,"slug":"/about-us/","prev":{"excerpt":"Rod Michael, director of global market access strategy and channels at Rockwell Automation, famously said, “If you automate a mess, you get…","timeToRead":3,"frontmatter":{"title":"The developer's role in a successful implementation of the test automation","tags":["Testing"],"date":"2018-12-06T12:54:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"aspectRatio":1.8252933507170794,"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAACiElEQVQoz02SS0hUURjHZ9WqoE0RbcJFRUWBROuKCKqNFY1iD2yRo5ELicqoSBOMMGSsQHpDlBbVooYwhKgcSU3thUo048C0cJh7ve9zn/P6950zjnThz3fvuYff9z//74TiI8OIj05ibHwKo6RP8XGMTXxHOpXE1+kkfqVlqHIWiqKSFKTTaczNzQklEgkkk0mkUqklhTbuasaKzbVYs/0EVlUfR2jtfhxoaEcxn4PvewBKKJVKKBaLQvydK5fLgTEGx3FQKBTEGq+hzt7nONP+EFd7X+BC9zO0XHuEewNDCJiFwPXhuR5c10U+n18C88q/+eP7vnBuGIZYCyX//MTv2UnMzEwiMTuBv4kfkDJp6AsKtKwMXWVQNQOKpoPZtnD2P5A7nJ+fhyRJ4l/o8/t+vOmP4nqkBq9vX8bgqz5MfRkC002YBLUtBw45ZbYDj9xUnFbA3H0mk4Esy2WHE8Mx3L/VgTtnG/Gg6xJiL+9i+lscjmHCok2MjhO4ATzPg20zAeJPxSEHZrNZcWwBHPswgG1b1qGtO4qGxiZEz9cjNTuCIMjDWliAKcmwDQqfHDJmE9gX4VfAvBF3p6pqGXix4ylWb2jGjr1dqN7diaqtrejti5UDp4EwgtrU3WeOGJBDLoPFo1fEG/BhiSnvPBLDsqpBLF//Fis3vaNrE8PJcx8JVyQXBWiKBkXiU3RhMA+qacOiTHO5vJhwEJTj4FU4bOt6gnCkB/WnexBuuoGDdVcQvflYOORddUWHSkBdc6AaDiSauEbQ3GKG/OimaVK+ttgfikROoa72EI4dDSMcrsHhfXtwpbUFLmVl08U1KB9DlmCqOgxdJ7BKVRMQy7KE+B3kw+HQf+uQ+eTE1QltAAAAAElFTkSuQmCC","sizes":"(max-width: 1400px) 100vw, 1400px","src":"/static/131b22d7fad4398f72deddd43464e6a3/cd9a9/blog-test-automation.png","srcSet":"/static/131b22d7fad4398f72deddd43464e6a3/4c9af/blog-test-automation.png 930w,\n/static/131b22d7fad4398f72deddd43464e6a3/cd9a9/blog-test-automation.png 1400w"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/b4a08/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/developers-role-in-test-automation/"}},"next":{"excerpt":"We developed a News Tablet application for the Samsung Knox recently, and we are able to institute the various good engineering practices…","timeToRead":6,"frontmatter":{"title":"Revitalizing our engineering - Engineering 2.0","tags":[],"date":"2019-03-12T14:00:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"aspectRatio":1.3333333333333333,"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAQBAgMF/8QAFgEBAQEAAAAAAAAAAAAAAAAAAgED/9oADAMBAAIQAxAAAAHa/IbjgWMn/8QAHBAAAwABBQAAAAAAAAAAAAAAAQIDEwAEERIU/9oACAEBAAEFAgiMfONPHhs5LS3B72qcv//EABYRAQEBAAAAAAAAAAAAAAAAAAABEf/aAAgBAwEBPwGNj//EABcRAAMBAAAAAAAAAAAAAAAAAAABAiH/2gAIAQIBAT8Bps0//8QAGBABAQEBAQAAAAAAAAAAAAAAAQARECH/2gAIAQEABj8CzmWrGrPrf//EABkQAQEBAQEBAAAAAAAAAAAAABEBADFBUf/aAAgBAQABPyEO6ezPyOWGsOpmACfuCwnf/9oADAMBAAIAAwAAABBA3//EABcRAAMBAAAAAAAAAAAAAAAAAAABETH/2gAIAQMBAT8QmkdR/8QAFhEBAQEAAAAAAAAAAAAAAAAAEQAB/9oACAECAQE/ED2PG//EABoQAQEBAAMBAAAAAAAAAAAAAAERACExQXH/2gAIAQEAAT8Q5hISiCfR5xeVaWEnkM+D1NSZrywMwqmEFfN//9k=","sizes":"(max-width: 1400px) 100vw, 1400px","src":"/static/2ecbc0836b73436a052109efa9ccde4e/3dc2b/william-warby-1357858-unsplash-1.jpg","srcSet":"/static/2ecbc0836b73436a052109efa9ccde4e/f8f18/william-warby-1357858-unsplash-1.jpg 930w,\n/static/2ecbc0836b73436a052109efa9ccde4e/3dc2b/william-warby-1357858-unsplash-1.jpg 1400w"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/b4a08/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/revitalizing-our-engineering/"}}}}} \ No newline at end of file diff --git a/page-data/about/page-data.json b/page-data/about/page-data.json index 6ba0cf2..a5d61bf 100644 --- a/page-data/about/page-data.json +++ b/page-data/about/page-data.json @@ -1 +1 @@ -{"componentChunkName":"component---src-pages-about-tsx","path":"/about/","webpackCompilationHash":"e6542130e6dfe73197bb","result":{"pageContext":{"isCreatedByStatefulCreatePages":true}}} \ No newline at end of file +{"componentChunkName":"component---src-pages-about-tsx","path":"/about/","webpackCompilationHash":"4d127609ee78b8f0aee7","result":{"pageContext":{"isCreatedByStatefulCreatePages":true}}} \ No newline at end of file diff --git a/page-data/ai-in-news-media/page-data.json b/page-data/ai-in-news-media/page-data.json index ec7fcc0..ffbda92 100644 --- a/page-data/ai-in-news-media/page-data.json +++ b/page-data/ai-in-news-media/page-data.json @@ -1 +1 @@ -{"componentChunkName":"component---src-templates-post-tsx","path":"/ai-in-news-media/","webpackCompilationHash":"e6542130e6dfe73197bb","result":{"data":{"logo":{"childImageSharp":{"fixed":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsSAAALEgHS3X78AAABFUlEQVQY023PvUrDUBTA8ZuCtoMoOLQ4dWhN14x2kEKXFkGoohQ/QBexOHRycAidKkgHHRq69APRoTjFJYODIA6+gSBYfYMmfYLE/5VT6NALP845NyeHc9UoCHZRQvonCLKKE4ZhAXYURTsYoE9dIy5iCzfUJnEdV+RF4iu6ikFH2EPxazzOcJmg4Rnn5C8ysIEOHqTe5/sT3qXOwYOtRr5/wLAqzpCTDXu4p2ETtyjgGJ/cX+se8jeU9fa4RBt5vWENpjzdkoGPcGg4RQsbOMEFmnBRRwVDHEK/yFXfvr/CoPjvZLKcdByDyzWGeajigzorGy0oOeRJiUtITe/pX1XzDk3buIMltSFR/zTtic3060X+8z8PsEUt8G3LVQAAAABJRU5ErkJggg==","width":400,"height":128,"src":"/static/2b5eaa0de166a8b5faebad4955c2200c/647de/ghost-logo.png","srcSet":"/static/2b5eaa0de166a8b5faebad4955c2200c/647de/ghost-logo.png 1x"}}},"markdownRemark":{"html":"

Introduction

\n

News media companies like Singapore Press Holdings (SPH) continue to be faced with rapidly accelerating technology innovation that will profoundly impact the business. Major disruptions are already happening in the industry due to evolving content consumption patterns, competition from Facebook and Google, and emergence of innovative technologies. In this dynamic global environment, news media companies must evolve and change.

\n

Artificial intelligence (AI) is currently one of the most widely discussed and hyped technology. At SPH, we are convinced that AI is no longer a hype. AI has become a game changer which will profoundly impact the future of our business. The ultimate goal is to exploit AI to automate workflow processes and better connect with our customers to drive efficiency, customer engagement and revenue.

\n

Opportunities

\n

AI and machine learning are presenting huge opportunities in the entire news publishing value chain: Content creation - Content distribution - Content consumption.

\n

1) Content Creation
\nAI deployments to automate newsroom processes and increase productivity of journalists are on the rise in the news media industry. Intelligent tools to scan, predict, surface trends for story production, conduct automated fact checking will assist journalists to do their jobs better with greater speed, accuracy and scale.

\n

Publishers such as Associated Press, Washington Post and Yahoo! Sports are already using AI to automate story creation relating to financial reporting and sports games results. At SPH, we are exploring the use of AI tools to partially automate data into text stories as well as text into videos. The use of robot-journalism is especially suited for routine and laborious writing of news articles that are data-rich and follow a structured template. Journalists can then be freed up to focus on creating more in-depth stories.

\n

To increase newsroom efficiency, we also developed an auto-tagger tool to speed up the metadata tagging in news content. The tool was implemented using Grated Recurrent Unit (GRU) neural network model and technologies such as Python, Tensorflow and Keras. We trained the neural network using data from past archives of news articles that were manually tagged by the journalists.

\n

2) Content Distribution
\nCustomers are interacting with news across different media channels and devices. Publishers have to follow their customers and push the right content to the right audience at the right time through the right channel. Digital news at SPH is currently distributed through websites, mobile apps, push notifications, messaging apps, email newsletters and social media platforms. AI tools that analyse user and content data to provide actionable insights on when and where to promote a story will help publishers to optimise traffic and improve customer engagement.

\n

Publishers including SPH are also experimenting with news delivery through AI-powered chatbots and voice-enabled smart speakers such as Amazon Echo and Google Home. This allows publishers to reach new audience through a conversational and frictionless interface.

\n

3) Content Consumption
\nCustomers expect customization, personalization and real-time responsiveness. Publishers are sitting on a goldmine of user and content data that can be analyzed to derive actionable insights for personalising a user’s journey and uncover potential opportunities.

\n

At SPH, we are working on a content recommendation system that uses AI and machine learning to recommend personalized news based on similar content topics, story popularity, user activity and other users with similar behavior. This will help to increase user stickiness on our news sites and enhance monetization opportunities.

\n

News publishers such as Wall Street Journal are implementing AI-driven dynamic paywall that leverage user browsing data to predict a user’s propensity to subscribe. Content access rules and marketing messages will be personalized depending on how likely users will convert to become paying subscribers.

\n

Challenges

\n

The opportunities of AI to transform news media business are huge. However, there are also challenges to AI adoption. Implementation of AI requires large amount of investment in terms of technology, infrastructure and talent.

\n

At SPH, we started AI experimentation by leveraging open source natural language processing software and ready-to-use machine learning algorithms. Service providers such as IBM Watson, Amazon and Google also enable companies to jumpstart AI experimentation via easy–to-use APIs, tools and cloud-based services.

\n

To overcome the shortage of AI talent and better manage complexity and risks, we collaborate with AI technology partners in implementing the content recommendation engine. SPH’s ready availability of training data (news archives) coupled with partners’ expertise to customize the machine learning algorithms will hopefully drive AI deployment and results much faster.

\n

Conclusion

\n

AI will continue to make breakthroughs and become a key differentiator among news media companies to stay competitive in the digital ecosystem. News media companies must leverage the power of AI across the entire value chain to drive deeper customer engagement and improve monetization.

\n

Original post by Liang Moung

","htmlAst":{"type":"root","children":[{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"Introduction"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"News media companies like Singapore Press Holdings (SPH) continue to be faced with rapidly accelerating technology innovation that will profoundly impact the business. Major disruptions are already happening in the industry due to evolving content consumption patterns, competition from Facebook and Google, and emergence of innovative technologies. In this dynamic global environment, news media companies must evolve and change. "}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Artificial intelligence (AI) is currently one of the most widely discussed and hyped technology. At SPH, we are convinced that AI is no longer a hype. AI has become a game changer which will profoundly impact the future of our business. The ultimate goal is to exploit AI to automate workflow processes and better connect with our customers to drive efficiency, customer engagement and revenue."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"Opportunities"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"AI and machine learning are presenting huge opportunities in the entire news publishing value chain: Content creation - Content distribution - Content consumption."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1) Content Creation"}]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nAI deployments to automate newsroom processes and increase productivity of journalists are on the rise in the news media industry. Intelligent tools to scan, predict, surface trends for story production, conduct automated fact checking will assist journalists to do their jobs better with greater speed, accuracy and scale."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Publishers such as Associated Press, Washington Post and Yahoo! Sports are already using AI to automate story creation relating to financial reporting and sports games results. At SPH, we are exploring the use of AI tools to partially automate data into text stories as well as text into videos. The use of robot-journalism is especially suited for routine and laborious writing of news articles that are data-rich and follow a structured template. Journalists can then be freed up to focus on creating more in-depth stories."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"To increase newsroom efficiency, we also developed an auto-tagger tool to speed up the metadata tagging in news content. The tool was implemented using Grated Recurrent Unit (GRU) neural network model and technologies such as Python, Tensorflow and Keras. We trained the neural network using data from past archives of news articles that were manually tagged by the journalists."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2) Content Distribution"}]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nCustomers are interacting with news across different media channels and devices. Publishers have to follow their customers and push the right content to the right audience at the right time through the right channel. Digital news at SPH is currently distributed through websites, mobile apps, push notifications, messaging apps, email newsletters and social media platforms. AI tools that analyse user and content data to provide actionable insights on when and where to promote a story will help publishers to optimise traffic and improve customer engagement."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Publishers including SPH are also experimenting with news delivery through AI-powered chatbots and voice-enabled smart speakers such as Amazon Echo and Google Home. This allows publishers to reach new audience through a conversational and frictionless interface."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3) Content Consumption"}]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nCustomers expect customization, personalization and real-time responsiveness. Publishers are sitting on a goldmine of user and content data that can be analyzed to derive actionable insights for personalising a user’s journey and uncover potential opportunities."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"At SPH, we are working on a content recommendation system that uses AI and machine learning to recommend personalized news based on similar content topics, story popularity, user activity and other users with similar behavior. This will help to increase user stickiness on our news sites and enhance monetization opportunities."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"News publishers such as Wall Street Journal are implementing AI-driven dynamic paywall that leverage user browsing data to predict a user’s propensity to subscribe. Content access rules and marketing messages will be personalized depending on how likely users will convert to become paying subscribers."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"Challenges"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"The opportunities of AI to transform news media business are huge. However, there are also challenges to AI adoption. Implementation of AI requires large amount of investment in terms of technology, infrastructure and talent."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"At SPH, we started AI experimentation by leveraging open source natural language processing software and ready-to-use machine learning algorithms. Service providers such as IBM Watson, Amazon and Google also enable companies to jumpstart AI experimentation via easy–to-use APIs, tools and cloud-based services."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"To overcome the shortage of AI talent and better manage complexity and risks, we collaborate with AI technology partners in implementing the content recommendation engine. SPH’s ready availability of training data (news archives) coupled with partners’ expertise to customize the machine learning algorithms will hopefully drive AI deployment and results much faster."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"Conclusion"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"AI will continue to make breakthroughs and become a key differentiator among news media companies to stay competitive in the digital ecosystem. News media companies must leverage the power of AI across the entire value chain to drive deeper customer engagement and improve monetization."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Original post by Liang Moung"}]}]}],"data":{"quirksMode":false}},"excerpt":"IntroductionNews media companies like Singapore Press Holdings (SPH) continue to be faced with rapidly accelerating technology innovation…","timeToRead":3,"frontmatter":{"title":"AI in News Media","userDate":"12 July 2018","date":"2018-07-12T22:46:00.000Z","tags":[],"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAIEAQP/xAAVAQEBAAAAAAAAAAAAAAAAAAABAv/aAAwDAQACEAMQAAABbnkrNAwn/8QAHBABAAEEAwAAAAAAAAAAAAAAAQACAxESEyEi/9oACAEBAAEFAsLGnvhuTKVL6trr/8QAFxEAAwEAAAAAAAAAAAAAAAAAAAEREv/aAAgBAwEBPwHKIj//xAAXEQEAAwAAAAAAAAAAAAAAAAAAAREh/9oACAECAQE/Ablr/8QAGhAAAgIDAAAAAAAAAAAAAAAAABABITEy8P/aAAgBAQAGPwJayV1rJ//EABsQAAMAAgMAAAAAAAAAAAAAAAABESExQWGB/9oACAEBAAE/IaHM9j2KZRS6mkHc3sbyZ+n/2gAMAwEAAgADAAAAEJvf/8QAFhEBAQEAAAAAAAAAAAAAAAAAABFB/9oACAEDAQE/EHHH/8QAFxEAAwEAAAAAAAAAAAAAAAAAAAERQf/aAAgBAgEBPxBFX0//xAAdEAEBAAMAAgMAAAAAAAAAAAABEQAhMUFRYXGh/9oACAEBAAE/EI4MDolZ4mCAJTthy4toHwXFAiuj0y/hiQMnbf3nFcwq5DP/2Q==","aspectRatio":1.8741633199464525,"src":"/static/9bea42284114acb5ba9e14a5fe42867c/3dc2b/INMANews-ArtificialIntelligence-1800.jpg","srcSet":"/static/9bea42284114acb5ba9e14a5fe42867c/f8f18/INMANews-ArtificialIntelligence-1800.jpg 930w,\n/static/9bea42284114acb5ba9e14a5fe42867c/3dc2b/INMANews-ArtificialIntelligence-1800.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAADQElEQVQ4y5VUW0tUURSeX9BDhFZQ1Nx0lCAqI+o1KMiHoqjIesisXiLSQOhiRUWUdKEwKqKHtNIyJLuY0UWS0lBKM8mcrEadcnIc58zlzMyZvc/+WjNnRs+xIWjDd9a+fudba6+1TaAmhEDaCqESONItOZewCUitgK8JIu7TxrQXqbV0M00lSzd1LAgRiU5u/3oAaJ0NQcC7RYC/LXWOJz6ThHoVyX74GynpRKTuLZjTo815SNWzbIjuEsD7EqJjHUT7KoNnBoVpZer3G+DN+eBNNvD2Egh5BCLqAW9ZCf7YDBF0agTjXbRnAbkezESYikPIBfYgH+y+BawhD6x+LtjDAsJSxOutiN+zgPechWAyeNs+sNZiXagyEKq+Xig1dii386DcyiU4oFRbodwk1CT6dq1fnQv2vJiUj6cIVYNKk55dadyC6PnpiF3LRfRqziSu2Ak0d9mC2I0C6JtQVYNSk+Evsg9K035EKs2InLUhci6HrD0F6ldaEbmwEKz7HrjrHamUpqg0pM1kyrD3dxE+Ykb4mB3ho2nYaI5shQXhg3MRPmyGfGY5+OCHlFKuv+UUKY8nLR/8iFCZBaH9VoKN+glr11BK41KyZTkI7poBuaook8vCcFvypRIEts1EYLcdgRILAjttkLbOhlQ0C4EdiXEOrTlozxyEjhQaLsY0Nbjq7yE67IC00Qxps5VAZOvJxeNbET61HdKG+fCvyYK/MBv+1TMQa66ZcDkjIf/los02OmSBf62DDs2DtGkxVZCWxKy/G5HrZ+gHe6G8eWqoeWPp6SpGPl0O74JpGFuSBR/ZaHWVdiiuxTjW0o/QxeY0laEEDZeiksoEJYvTjTXeQfRkOeSG2mQ+CJ0XzOVBvGtgwk09x4TLqhCGhP1EKTaeXsO/21+PA1e1iVfOMRx94iT048SjPuyp68GL3l+Aux/MMwTuHqAS9UClOKveEaijbkpu+e/SYynC2x1uZB16gWXn2zA8JqO2043d9X2AxwnF/R3scwf4QE+SlH/rBet6TS/Q+NRLERPuDoyGUUHqVlxox6svXri8Mtp+kO+RAFQ5RCk1nCRQRwbpdZI0KNHMj4M+hr0/g8YY/UcM/wD4fYcC4gOWgAAAAABJRU5ErkJggg==","width":400,"height":400,"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png","srcSet":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png 1x,\n/static/7fa6bee9d2080bd021828c70f67a4720/fca9c/sphtech.png 1.5x"}}]}}}},"relatedPosts":{"totalCount":0,"edges":[]}},"pageContext":{"isCreatedByStatefulCreatePages":false,"slug":"/ai-in-news-media/","prev":{"excerpt":"Hi all! It has been a while since some of us have gone for the Scrum training by Mr Stuart, building balloon animal zoos to learn what is…","timeToRead":3,"frontmatter":{"title":"Video Review - Carousell Level-Up: Applying Scrum for Better Delivery","tags":["Review","Meetup"],"date":"2018-02-05T07:53:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"aspectRatio":1.7793696275071633,"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAA7DAAAOwwHHb6hkAAACqklEQVQozwGfAmD9ADEVFzklJjolJzceITslJTchIjwpLDolKDglJTYhITsmJj4qKzkiJDspKTYoKDYpKiwaG0AyMj8xMi4ZGgCoNTmrQkWqOD2pPEGpOT2pLDGqMziqLzSoJiqpJSmqJyurKCypIyirLjKbTEt8KCpoHSBvLTFzLTF2LTEAyzQ5zUVJzT9DzDxAzD9FzUZKykNIy0JHyjo/yTk+yjo/yjtAyztAzDpB0IJ+u25rpVZYmFRVo2ZnrHV1ANZCR9x2edhqbthcYNpqbdltcdlhZdtobNtobNtgZN1nbNliZthtcdZPVNx1adJXSsKIfqFoYq9ER6xERwDXR0vXaGzXa2/YaW3XZWrbfH/Yf4PajI/Yd3vGaWzGZ2rXcHTagITabXLcVkPROCaUW0+KQz+4Hh+tIyYA1UNH12dq1mNo2Gxx2Wxw8sXH56+x4pOVyIaJXFVVTUpKyIqL99LS6KWn3U89WiUnFR4vISxFWx0ovjk3ANMyN9M4PdI3PdM6P9M5PtI5PtI8QtU4PswrMZ8qL5kpLcstMtUrMdc+QthdTFFESi4zQh0nNltDRcJHRwDSNTrURkvURkrUS07TTVHURUnUSEzTQUbUOD7bPUPaO0HTLTPSJCvVQkXaXEmadXBEPj5HPjypamLAS00A0Ds/z0ZLzzxB0D1CzTg8zzY6zjpAz0FFzUFGzkRJz0NJzjQ6zyYr0kdK20k4Xx8gAAQPBAcNdRAUwU1PAOM5P+FITuNMUuNQVeJFTOI8QuIzOeJCR+JVWuRaX+NVWuNCSOMqMOZNUdhFPolxdUhpcUZpcY07QMpOUQCLGx+LHCCKIiaKIiWKJCeLIyeLHSGLHCGLIiaLIyeJISWKHCCKHCCLKCyJOjx+TE5vTlFsVlp0REaBQEJqGgpHmAn0+wAAAABJRU5ErkJggg==","sizes":"(max-width: 621px) 100vw, 621px","src":"/static/dbb7bd9058838337f25ad9090b348997/748f9/scrum-video-intro.png","srcSet":"/static/dbb7bd9058838337f25ad9090b348997/748f9/scrum-video-intro.png 621w"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/b4a08/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/video-review-carousell-level-up/"}},"next":{"excerpt":"It was our great pleasure to have invited Mr Steven Koh, the Deputy Director of Government Digital Services (GDS) at Govtech, to update us…","timeToRead":3,"frontmatter":{"title":"Updates to Govtech Agile Practices by Steven Koh - 2 July","tags":["Meetup"],"date":"2018-07-18T17:50:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"aspectRatio":1.3333333333333333,"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAABAACBf/EABYBAQEBAAAAAAAAAAAAAAAAAAIAAf/aAAwDAQACEAMQAAABZzh6OLgyv//EABwQAAIBBQEAAAAAAAAAAAAAAAECAwAREhMxQf/aAAgBAQABBQJtITwRlqbls2eUhv/EABYRAAMAAAAAAAAAAAAAAAAAAAABEf/aAAgBAwEBPwFqkP/EABURAQEAAAAAAAAAAAAAAAAAAAEQ/9oACAECAQE/ARJ//8QAHBAAAgICAwAAAAAAAAAAAAAAAAECESExEiIy/9oACAEBAAY/ApNS0dnxPQ87LTwOj//EABoQAAIDAQEAAAAAAAAAAAAAAAERACExQVH/2gAIAQEAAT8hsI8g5G21q4MYOMQGmoCwNG4Escn/2gAMAwEAAgADAAAAEP8AD//EABYRAAMAAAAAAAAAAAAAAAAAAAEQQf/aAAgBAwEBPxCAr//EABcRAQADAAAAAAAAAAAAAAAAAAABETH/2gAIAQIBAT8Qhat//8QAGhAAAwEBAQEAAAAAAAAAAAAAAREhADFBsf/aAAgBAQABPxBl5yWG8GJujIADqfnNA21SvuiI6OdbA0bJgUoL4MagESyDDd3/2Q==","sizes":"(max-width: 1400px) 100vw, 1400px","src":"/static/8d8fee52f47c44485daff296b0c76794/3dc2b/meetup-speaker.jpg","srcSet":"/static/8d8fee52f47c44485daff296b0c76794/f8f18/meetup-speaker.jpg 930w,\n/static/8d8fee52f47c44485daff296b0c76794/3dc2b/meetup-speaker.jpg 1400w"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/b4a08/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/updates-to-govtech-agile-practices/"}}}}} \ No newline at end of file +{"componentChunkName":"component---src-templates-post-tsx","path":"/ai-in-news-media/","webpackCompilationHash":"4d127609ee78b8f0aee7","result":{"data":{"logo":{"childImageSharp":{"fixed":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsSAAALEgHS3X78AAABFUlEQVQY023PvUrDUBTA8ZuCtoMoOLQ4dWhN14x2kEKXFkGoohQ/QBexOHRycAidKkgHHRq69APRoTjFJYODIA6+gSBYfYMmfYLE/5VT6NALP845NyeHc9UoCHZRQvonCLKKE4ZhAXYURTsYoE9dIy5iCzfUJnEdV+RF4iu6ikFH2EPxazzOcJmg4Rnn5C8ysIEOHqTe5/sT3qXOwYOtRr5/wLAqzpCTDXu4p2ETtyjgGJ/cX+se8jeU9fa4RBt5vWENpjzdkoGPcGg4RQsbOMEFmnBRRwVDHEK/yFXfvr/CoPjvZLKcdByDyzWGeajigzorGy0oOeRJiUtITe/pX1XzDk3buIMltSFR/zTtic3060X+8z8PsEUt8G3LVQAAAABJRU5ErkJggg==","width":400,"height":128,"src":"/static/2b5eaa0de166a8b5faebad4955c2200c/647de/ghost-logo.png","srcSet":"/static/2b5eaa0de166a8b5faebad4955c2200c/647de/ghost-logo.png 1x"}}},"markdownRemark":{"html":"

Introduction

\n

News media companies like Singapore Press Holdings (SPH) continue to be faced with rapidly accelerating technology innovation that will profoundly impact the business. Major disruptions are already happening in the industry due to evolving content consumption patterns, competition from Facebook and Google, and emergence of innovative technologies. In this dynamic global environment, news media companies must evolve and change.

\n

Artificial intelligence (AI) is currently one of the most widely discussed and hyped technology. At SPH, we are convinced that AI is no longer a hype. AI has become a game changer which will profoundly impact the future of our business. The ultimate goal is to exploit AI to automate workflow processes and better connect with our customers to drive efficiency, customer engagement and revenue.

\n

Opportunities

\n

AI and machine learning are presenting huge opportunities in the entire news publishing value chain: Content creation - Content distribution - Content consumption.

\n

1) Content Creation
\nAI deployments to automate newsroom processes and increase productivity of journalists are on the rise in the news media industry. Intelligent tools to scan, predict, surface trends for story production, conduct automated fact checking will assist journalists to do their jobs better with greater speed, accuracy and scale.

\n

Publishers such as Associated Press, Washington Post and Yahoo! Sports are already using AI to automate story creation relating to financial reporting and sports games results. At SPH, we are exploring the use of AI tools to partially automate data into text stories as well as text into videos. The use of robot-journalism is especially suited for routine and laborious writing of news articles that are data-rich and follow a structured template. Journalists can then be freed up to focus on creating more in-depth stories.

\n

To increase newsroom efficiency, we also developed an auto-tagger tool to speed up the metadata tagging in news content. The tool was implemented using Grated Recurrent Unit (GRU) neural network model and technologies such as Python, Tensorflow and Keras. We trained the neural network using data from past archives of news articles that were manually tagged by the journalists.

\n

2) Content Distribution
\nCustomers are interacting with news across different media channels and devices. Publishers have to follow their customers and push the right content to the right audience at the right time through the right channel. Digital news at SPH is currently distributed through websites, mobile apps, push notifications, messaging apps, email newsletters and social media platforms. AI tools that analyse user and content data to provide actionable insights on when and where to promote a story will help publishers to optimise traffic and improve customer engagement.

\n

Publishers including SPH are also experimenting with news delivery through AI-powered chatbots and voice-enabled smart speakers such as Amazon Echo and Google Home. This allows publishers to reach new audience through a conversational and frictionless interface.

\n

3) Content Consumption
\nCustomers expect customization, personalization and real-time responsiveness. Publishers are sitting on a goldmine of user and content data that can be analyzed to derive actionable insights for personalising a user’s journey and uncover potential opportunities.

\n

At SPH, we are working on a content recommendation system that uses AI and machine learning to recommend personalized news based on similar content topics, story popularity, user activity and other users with similar behavior. This will help to increase user stickiness on our news sites and enhance monetization opportunities.

\n

News publishers such as Wall Street Journal are implementing AI-driven dynamic paywall that leverage user browsing data to predict a user’s propensity to subscribe. Content access rules and marketing messages will be personalized depending on how likely users will convert to become paying subscribers.

\n

Challenges

\n

The opportunities of AI to transform news media business are huge. However, there are also challenges to AI adoption. Implementation of AI requires large amount of investment in terms of technology, infrastructure and talent.

\n

At SPH, we started AI experimentation by leveraging open source natural language processing software and ready-to-use machine learning algorithms. Service providers such as IBM Watson, Amazon and Google also enable companies to jumpstart AI experimentation via easy–to-use APIs, tools and cloud-based services.

\n

To overcome the shortage of AI talent and better manage complexity and risks, we collaborate with AI technology partners in implementing the content recommendation engine. SPH’s ready availability of training data (news archives) coupled with partners’ expertise to customize the machine learning algorithms will hopefully drive AI deployment and results much faster.

\n

Conclusion

\n

AI will continue to make breakthroughs and become a key differentiator among news media companies to stay competitive in the digital ecosystem. News media companies must leverage the power of AI across the entire value chain to drive deeper customer engagement and improve monetization.

\n

Original post by Liang Moung

","htmlAst":{"type":"root","children":[{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"Introduction"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"News media companies like Singapore Press Holdings (SPH) continue to be faced with rapidly accelerating technology innovation that will profoundly impact the business. Major disruptions are already happening in the industry due to evolving content consumption patterns, competition from Facebook and Google, and emergence of innovative technologies. In this dynamic global environment, news media companies must evolve and change. "}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Artificial intelligence (AI) is currently one of the most widely discussed and hyped technology. At SPH, we are convinced that AI is no longer a hype. AI has become a game changer which will profoundly impact the future of our business. The ultimate goal is to exploit AI to automate workflow processes and better connect with our customers to drive efficiency, customer engagement and revenue."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"Opportunities"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"AI and machine learning are presenting huge opportunities in the entire news publishing value chain: Content creation - Content distribution - Content consumption."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1) Content Creation"}]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nAI deployments to automate newsroom processes and increase productivity of journalists are on the rise in the news media industry. Intelligent tools to scan, predict, surface trends for story production, conduct automated fact checking will assist journalists to do their jobs better with greater speed, accuracy and scale."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Publishers such as Associated Press, Washington Post and Yahoo! Sports are already using AI to automate story creation relating to financial reporting and sports games results. At SPH, we are exploring the use of AI tools to partially automate data into text stories as well as text into videos. The use of robot-journalism is especially suited for routine and laborious writing of news articles that are data-rich and follow a structured template. Journalists can then be freed up to focus on creating more in-depth stories."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"To increase newsroom efficiency, we also developed an auto-tagger tool to speed up the metadata tagging in news content. The tool was implemented using Grated Recurrent Unit (GRU) neural network model and technologies such as Python, Tensorflow and Keras. We trained the neural network using data from past archives of news articles that were manually tagged by the journalists."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2) Content Distribution"}]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nCustomers are interacting with news across different media channels and devices. Publishers have to follow their customers and push the right content to the right audience at the right time through the right channel. Digital news at SPH is currently distributed through websites, mobile apps, push notifications, messaging apps, email newsletters and social media platforms. AI tools that analyse user and content data to provide actionable insights on when and where to promote a story will help publishers to optimise traffic and improve customer engagement."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Publishers including SPH are also experimenting with news delivery through AI-powered chatbots and voice-enabled smart speakers such as Amazon Echo and Google Home. This allows publishers to reach new audience through a conversational and frictionless interface."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3) Content Consumption"}]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nCustomers expect customization, personalization and real-time responsiveness. Publishers are sitting on a goldmine of user and content data that can be analyzed to derive actionable insights for personalising a user’s journey and uncover potential opportunities."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"At SPH, we are working on a content recommendation system that uses AI and machine learning to recommend personalized news based on similar content topics, story popularity, user activity and other users with similar behavior. This will help to increase user stickiness on our news sites and enhance monetization opportunities."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"News publishers such as Wall Street Journal are implementing AI-driven dynamic paywall that leverage user browsing data to predict a user’s propensity to subscribe. Content access rules and marketing messages will be personalized depending on how likely users will convert to become paying subscribers."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"Challenges"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"The opportunities of AI to transform news media business are huge. However, there are also challenges to AI adoption. Implementation of AI requires large amount of investment in terms of technology, infrastructure and talent."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"At SPH, we started AI experimentation by leveraging open source natural language processing software and ready-to-use machine learning algorithms. Service providers such as IBM Watson, Amazon and Google also enable companies to jumpstart AI experimentation via easy–to-use APIs, tools and cloud-based services."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"To overcome the shortage of AI talent and better manage complexity and risks, we collaborate with AI technology partners in implementing the content recommendation engine. SPH’s ready availability of training data (news archives) coupled with partners’ expertise to customize the machine learning algorithms will hopefully drive AI deployment and results much faster."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"Conclusion"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"AI will continue to make breakthroughs and become a key differentiator among news media companies to stay competitive in the digital ecosystem. News media companies must leverage the power of AI across the entire value chain to drive deeper customer engagement and improve monetization."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Original post by Liang Moung"}]}]}],"data":{"quirksMode":false}},"excerpt":"IntroductionNews media companies like Singapore Press Holdings (SPH) continue to be faced with rapidly accelerating technology innovation…","timeToRead":3,"frontmatter":{"title":"AI in News Media","userDate":"12 July 2018","date":"2018-07-12T22:46:00.000Z","tags":[],"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAIEAQP/xAAVAQEBAAAAAAAAAAAAAAAAAAABAv/aAAwDAQACEAMQAAABbnkrNAwn/8QAHBABAAEEAwAAAAAAAAAAAAAAAQACAxESEyEi/9oACAEBAAEFAsLGnvhuTKVL6trr/8QAFxEAAwEAAAAAAAAAAAAAAAAAAAEREv/aAAgBAwEBPwHKIj//xAAXEQEAAwAAAAAAAAAAAAAAAAAAAREh/9oACAECAQE/Ablr/8QAGhAAAgIDAAAAAAAAAAAAAAAAABABITEy8P/aAAgBAQAGPwJayV1rJ//EABsQAAMAAgMAAAAAAAAAAAAAAAABESExQWGB/9oACAEBAAE/IaHM9j2KZRS6mkHc3sbyZ+n/2gAMAwEAAgADAAAAEJvf/8QAFhEBAQEAAAAAAAAAAAAAAAAAABFB/9oACAEDAQE/EHHH/8QAFxEAAwEAAAAAAAAAAAAAAAAAAAERQf/aAAgBAgEBPxBFX0//xAAdEAEBAAMAAgMAAAAAAAAAAAABEQAhMUFRYXGh/9oACAEBAAE/EI4MDolZ4mCAJTthy4toHwXFAiuj0y/hiQMnbf3nFcwq5DP/2Q==","aspectRatio":1.8741633199464525,"src":"/static/9bea42284114acb5ba9e14a5fe42867c/3dc2b/INMANews-ArtificialIntelligence-1800.jpg","srcSet":"/static/9bea42284114acb5ba9e14a5fe42867c/f8f18/INMANews-ArtificialIntelligence-1800.jpg 930w,\n/static/9bea42284114acb5ba9e14a5fe42867c/3dc2b/INMANews-ArtificialIntelligence-1800.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAADQElEQVQ4y5VUW0tUURSeX9BDhFZQ1Nx0lCAqI+o1KMiHoqjIesisXiLSQOhiRUWUdKEwKqKHtNIyJLuY0UWS0lBKM8mcrEadcnIc58zlzMyZvc/+WjNnRs+xIWjDd9a+fudba6+1TaAmhEDaCqESONItOZewCUitgK8JIu7TxrQXqbV0M00lSzd1LAgRiU5u/3oAaJ0NQcC7RYC/LXWOJz6ThHoVyX74GynpRKTuLZjTo815SNWzbIjuEsD7EqJjHUT7KoNnBoVpZer3G+DN+eBNNvD2Egh5BCLqAW9ZCf7YDBF0agTjXbRnAbkezESYikPIBfYgH+y+BawhD6x+LtjDAsJSxOutiN+zgPechWAyeNs+sNZiXagyEKq+Xig1dii386DcyiU4oFRbodwk1CT6dq1fnQv2vJiUj6cIVYNKk55dadyC6PnpiF3LRfRqziSu2Ak0d9mC2I0C6JtQVYNSk+Evsg9K035EKs2InLUhci6HrD0F6ldaEbmwEKz7HrjrHamUpqg0pM1kyrD3dxE+Ykb4mB3ho2nYaI5shQXhg3MRPmyGfGY5+OCHlFKuv+UUKY8nLR/8iFCZBaH9VoKN+glr11BK41KyZTkI7poBuaook8vCcFvypRIEts1EYLcdgRILAjttkLbOhlQ0C4EdiXEOrTlozxyEjhQaLsY0Nbjq7yE67IC00Qxps5VAZOvJxeNbET61HdKG+fCvyYK/MBv+1TMQa66ZcDkjIf/los02OmSBf62DDs2DtGkxVZCWxKy/G5HrZ+gHe6G8eWqoeWPp6SpGPl0O74JpGFuSBR/ZaHWVdiiuxTjW0o/QxeY0laEEDZeiksoEJYvTjTXeQfRkOeSG2mQ+CJ0XzOVBvGtgwk09x4TLqhCGhP1EKTaeXsO/21+PA1e1iVfOMRx94iT048SjPuyp68GL3l+Aux/MMwTuHqAS9UClOKveEaijbkpu+e/SYynC2x1uZB16gWXn2zA8JqO2043d9X2AxwnF/R3scwf4QE+SlH/rBet6TS/Q+NRLERPuDoyGUUHqVlxox6svXri8Mtp+kO+RAFQ5RCk1nCRQRwbpdZI0KNHMj4M+hr0/g8YY/UcM/wD4fYcC4gOWgAAAAABJRU5ErkJggg==","width":400,"height":400,"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png","srcSet":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png 1x,\n/static/7fa6bee9d2080bd021828c70f67a4720/fca9c/sphtech.png 1.5x"}}]}}}},"relatedPosts":{"totalCount":0,"edges":[]}},"pageContext":{"isCreatedByStatefulCreatePages":false,"slug":"/ai-in-news-media/","prev":{"excerpt":"Hi all! It has been a while since some of us have gone for the Scrum training by Mr Stuart, building balloon animal zoos to learn what is…","timeToRead":3,"frontmatter":{"title":"Video Review - Carousell Level-Up: Applying Scrum for Better Delivery","tags":["Review","Meetup"],"date":"2018-02-05T07:53:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"aspectRatio":1.7793696275071633,"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAA7DAAAOwwHHb6hkAAACqklEQVQozwGfAmD9ADEVFzklJjolJzceITslJTchIjwpLDolKDglJTYhITsmJj4qKzkiJDspKTYoKDYpKiwaG0AyMj8xMi4ZGgCoNTmrQkWqOD2pPEGpOT2pLDGqMziqLzSoJiqpJSmqJyurKCypIyirLjKbTEt8KCpoHSBvLTFzLTF2LTEAyzQ5zUVJzT9DzDxAzD9FzUZKykNIy0JHyjo/yTk+yjo/yjtAyztAzDpB0IJ+u25rpVZYmFRVo2ZnrHV1ANZCR9x2edhqbthcYNpqbdltcdlhZdtobNtobNtgZN1nbNliZthtcdZPVNx1adJXSsKIfqFoYq9ER6xERwDXR0vXaGzXa2/YaW3XZWrbfH/Yf4PajI/Yd3vGaWzGZ2rXcHTagITabXLcVkPROCaUW0+KQz+4Hh+tIyYA1UNH12dq1mNo2Gxx2Wxw8sXH56+x4pOVyIaJXFVVTUpKyIqL99LS6KWn3U89WiUnFR4vISxFWx0ovjk3ANMyN9M4PdI3PdM6P9M5PtI5PtI8QtU4PswrMZ8qL5kpLcstMtUrMdc+QthdTFFESi4zQh0nNltDRcJHRwDSNTrURkvURkrUS07TTVHURUnUSEzTQUbUOD7bPUPaO0HTLTPSJCvVQkXaXEmadXBEPj5HPjypamLAS00A0Ds/z0ZLzzxB0D1CzTg8zzY6zjpAz0FFzUFGzkRJz0NJzjQ6zyYr0kdK20k4Xx8gAAQPBAcNdRAUwU1PAOM5P+FITuNMUuNQVeJFTOI8QuIzOeJCR+JVWuRaX+NVWuNCSOMqMOZNUdhFPolxdUhpcUZpcY07QMpOUQCLGx+LHCCKIiaKIiWKJCeLIyeLHSGLHCGLIiaLIyeJISWKHCCKHCCLKCyJOjx+TE5vTlFsVlp0REaBQEJqGgpHmAn0+wAAAABJRU5ErkJggg==","sizes":"(max-width: 621px) 100vw, 621px","src":"/static/dbb7bd9058838337f25ad9090b348997/748f9/scrum-video-intro.png","srcSet":"/static/dbb7bd9058838337f25ad9090b348997/748f9/scrum-video-intro.png 621w"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/b4a08/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/video-review-carousell-level-up/"}},"next":{"excerpt":"It was our great pleasure to have invited Mr Steven Koh, the Deputy Director of Government Digital Services (GDS) at Govtech, to update us…","timeToRead":3,"frontmatter":{"title":"Updates to Govtech Agile Practices by Steven Koh - 2 July","tags":["Meetup"],"date":"2018-07-18T17:50:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"aspectRatio":1.3333333333333333,"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAABAACBf/EABYBAQEBAAAAAAAAAAAAAAAAAAIAAf/aAAwDAQACEAMQAAABZzh6OLgyv//EABwQAAIBBQEAAAAAAAAAAAAAAAECAwAREhMxQf/aAAgBAQABBQJtITwRlqbls2eUhv/EABYRAAMAAAAAAAAAAAAAAAAAAAABEf/aAAgBAwEBPwFqkP/EABURAQEAAAAAAAAAAAAAAAAAAAEQ/9oACAECAQE/ARJ//8QAHBAAAgICAwAAAAAAAAAAAAAAAAECESExEiIy/9oACAEBAAY/ApNS0dnxPQ87LTwOj//EABoQAAIDAQEAAAAAAAAAAAAAAAERACExQVH/2gAIAQEAAT8hsI8g5G21q4MYOMQGmoCwNG4Escn/2gAMAwEAAgADAAAAEP8AD//EABYRAAMAAAAAAAAAAAAAAAAAAAEQQf/aAAgBAwEBPxCAr//EABcRAQADAAAAAAAAAAAAAAAAAAABETH/2gAIAQIBAT8Qhat//8QAGhAAAwEBAQEAAAAAAAAAAAAAAREhADFBsf/aAAgBAQABPxBl5yWG8GJujIADqfnNA21SvuiI6OdbA0bJgUoL4MagESyDDd3/2Q==","sizes":"(max-width: 1400px) 100vw, 1400px","src":"/static/8d8fee52f47c44485daff296b0c76794/3dc2b/meetup-speaker.jpg","srcSet":"/static/8d8fee52f47c44485daff296b0c76794/f8f18/meetup-speaker.jpg 930w,\n/static/8d8fee52f47c44485daff296b0c76794/3dc2b/meetup-speaker.jpg 1400w"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/b4a08/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/updates-to-govtech-agile-practices/"}}}}} \ No newline at end of file diff --git a/page-data/author/ghost/page-data.json b/page-data/author/ghost/page-data.json index 468d368..a338754 100644 --- a/page-data/author/ghost/page-data.json +++ b/page-data/author/ghost/page-data.json @@ -1 +1 @@ -{"componentChunkName":"component---src-templates-author-tsx","path":"/author/ghost/","webpackCompilationHash":"e6542130e6dfe73197bb","result":{"data":{"authorYaml":{"id":"Ghost","website":"https://ghost.org/","twitter":"TryGhost","bio":"The professional publishing platform","facebook":"ghost","location":"On a plane","profile_image":null,"avatar":{"childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAABMUlEQVQ4y2MwsXf5T03MMGogGBvbOYNpUwdXOIbJwdgwNQQNhCk0snX6r2thC8Y6QGxg7QCWA/FBcrgMxepCkAZrV6//EYmpYBydkvHfMzjiv5mj2//whJT/Nm7ecEMJGgjykp6V/f+AqLj/O/Ye+L8diA8dO/m/pbv/v72n3/+tu/f9D45N/K9naYcSFESFoRXQlSCX2rh7g/kgr1u5epIWhiAMCi/3wLD/fVNn/u+fNgtMT5g+6//kmXOB/Jn/PYLCwWrINnDijDlAPBvKJ8NAZC+DIgCkGYRBbJAYSV5GjpTte/b/PwiMkLj0nP8xqVn/Dxw9AY6kwOh40iIFlmzCgUkmKjnjvx0wdu08fMFskJi1mxfxyQY9YetAEzJyQic5YaNnPeTgIDnrjZaHJGMACtTMXoVAJ6sAAAAASUVORK5CYII=","aspectRatio":1,"src":"/static/5f2c129e42248a92c87b13b4293950cf/7c0ed/ghost.png","srcSet":"/static/5f2c129e42248a92c87b13b4293950cf/09f8c/ghost.png 50w,\n/static/5f2c129e42248a92c87b13b4293950cf/bf65b/ghost.png 100w,\n/static/5f2c129e42248a92c87b13b4293950cf/7c0ed/ghost.png 200w,\n/static/5f2c129e42248a92c87b13b4293950cf/fdbb0/ghost.png 300w,\n/static/5f2c129e42248a92c87b13b4293950cf/647de/ghost.png 400w","sizes":"(max-width: 200px) 100vw, 200px"}}}},"allMarkdownRemark":{"edges":[{"node":{"excerpt":"Mr Martin Fowler was one of the founding members of the Agile Manifesto, author of many books including my favourite Refactoring (1st…","timeToRead":4,"frontmatter":{"title":"XConf Review - Economics of Software Quality","tags":["Review"],"date":"2019-04-29T12:46:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAMABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAMEBf/EABUBAQEAAAAAAAAAAAAAAAAAAAEC/9oADAMBAAIQAxAAAAGJ0yCtYUS//8QAGxAAAgIDAQAAAAAAAAAAAAAAAQIAAxESEyH/2gAIAQEAAQUCcLpxqlVqpWh2mfOYE//EABYRAQEBAAAAAAAAAAAAAAAAAAABEf/aAAgBAwEBPwGsf//EABYRAQEBAAAAAAAAAAAAAAAAAAABEf/aAAgBAgEBPwGVr//EAB0QAAMAAAcAAAAAAAAAAAAAAAABERASISJxgZH/2gAIAQEABj8Cqeot17Esq8JBc4f/xAAaEAEAAwEBAQAAAAAAAAAAAAABABEhQVEx/9oACAEBAAE/Ia5FjR9iHQmwq0fdyhYfTezbURbavdn/2gAMAwEAAgADAAAAEJAP/8QAFxEBAQEBAAAAAAAAAAAAAAAAAREAUf/aAAgBAwEBPxAVG6Ob/8QAGBEAAgMAAAAAAAAAAAAAAAAAAAERMUH/2gAIAQIBAT8QUrRPD//EABwQAQACAgMBAAAAAAAAAAAAAAEAESExQXGhkf/aAAgBAQABPxBKPijxjqFgV4E15Di4tQT2yytaAmA3g+SylgjXFET1otnWJ//Z","aspectRatio":1.696969696969697,"src":"/static/4eba5c89024d95c479a7a9ee73e9ac18/3dc2b/IMG__0303.jpg","srcSet":"/static/4eba5c89024d95c479a7a9ee73e9ac18/f8f18/IMG__0303.jpg 930w,\n/static/4eba5c89024d95c479a7a9ee73e9ac18/3dc2b/IMG__0303.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/xconf-economics-of-software-quality/"}}},{"node":{"excerpt":"We developed a News Tablet application for the Samsung Knox recently, and we are able to institute the various good engineering practices…","timeToRead":6,"frontmatter":{"title":"Revitalizing our engineering - Engineering 2.0","tags":[],"date":"2019-03-12T14:00:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAQBAgMF/8QAFgEBAQEAAAAAAAAAAAAAAAAAAgED/9oADAMBAAIQAxAAAAHa/IbjgWMn/8QAHBAAAwABBQAAAAAAAAAAAAAAAQIDEwAEERIU/9oACAEBAAEFAgiMfONPHhs5LS3B72qcv//EABYRAQEBAAAAAAAAAAAAAAAAAAABEf/aAAgBAwEBPwGNj//EABcRAAMBAAAAAAAAAAAAAAAAAAABAiH/2gAIAQIBAT8Bps0//8QAGBABAQEBAQAAAAAAAAAAAAAAAQARECH/2gAIAQEABj8CzmWrGrPrf//EABkQAQEBAQEBAAAAAAAAAAAAABEBADFBUf/aAAgBAQABPyEO6ezPyOWGsOpmACfuCwnf/9oADAMBAAIAAwAAABBA3//EABcRAAMBAAAAAAAAAAAAAAAAAAABETH/2gAIAQMBAT8QmkdR/8QAFhEBAQEAAAAAAAAAAAAAAAAAEQAB/9oACAECAQE/ED2PG//EABoQAQEBAAMBAAAAAAAAAAAAAAERACExQXH/2gAIAQEAAT8Q5hISiCfR5xeVaWEnkM+D1NSZrywMwqmEFfN//9k=","aspectRatio":1.3333333333333333,"src":"/static/2ecbc0836b73436a052109efa9ccde4e/3dc2b/william-warby-1357858-unsplash-1.jpg","srcSet":"/static/2ecbc0836b73436a052109efa9ccde4e/f8f18/william-warby-1357858-unsplash-1.jpg 930w,\n/static/2ecbc0836b73436a052109efa9ccde4e/3dc2b/william-warby-1357858-unsplash-1.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/revitalizing-our-engineering/"}}},{"node":{"excerpt":"This is the beginning of an exciting era for our SPHTech team!Over here, you will get to read about our learnings and reviews of the new…","timeToRead":1,"frontmatter":{"title":"About Us","tags":[],"date":"2019-01-01T23:46:37.131Z","draft":false,"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAIEBf/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAGuZFjMNEX/xAAdEAEAAQMFAAAAAAAAAAAAAAACAAEDBBAREhMh/9oACAEBAAEFAqk73admiQMNvhDjef/EABURAQEAAAAAAAAAAAAAAAAAABAR/9oACAEDAQE/AYf/xAAVEQEBAAAAAAAAAAAAAAAAAAAQEf/aAAgBAgEBPwGn/8QAHhAAAQMEAwAAAAAAAAAAAAAAAQACERASITEiMqH/2gAIAQEABj8CuZiUJOhNBvKc67iRC7+L/8QAGxAAAwEBAAMAAAAAAAAAAAAAAAERIUExUZH/2gAIAQEAAT8hXdlJvRVr82FbLNeeRv6zEU2luHoB/9oADAMBAAIAAwAAABCbz//EABYRAQEBAAAAAAAAAAAAAAAAAAARIf/aAAgBAwEBPxCq1//EABURAQEAAAAAAAAAAAAAAAAAABAx/9oACAECAQE/EIP/xAAdEAEAAwACAwEAAAAAAAAAAAABABEhMUFhgaGx/9oACAEBAAE/EGQtNWliantl6rW3JQv7Ft0sdQkrFDejvYtC2gI4vfMdTuuls+z/2Q==","aspectRatio":1.3333333333333333,"src":"/static/e26b6c56a85123d553d70dcd1ce2285a/3dc2b/cafe-ppl-collab.jpg","srcSet":"/static/e26b6c56a85123d553d70dcd1ce2285a/f8f18/cafe-ppl-collab.jpg 930w,\n/static/e26b6c56a85123d553d70dcd1ce2285a/3dc2b/cafe-ppl-collab.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"fields":{"layout":"postnodate","slug":"/about-us/"}}},{"node":{"excerpt":"Rod Michael, director of global market access strategy and channels at Rockwell Automation, famously said, “If you automate a mess, you get…","timeToRead":3,"frontmatter":{"title":"The developer's role in a successful implementation of the test automation","tags":["Testing"],"date":"2018-12-06T12:54:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAACiElEQVQoz02SS0hUURjHZ9WqoE0RbcJFRUWBROuKCKqNFY1iD2yRo5ELicqoSBOMMGSsQHpDlBbVooYwhKgcSU3thUo048C0cJh7ve9zn/P6950zjnThz3fvuYff9z//74TiI8OIj05ibHwKo6RP8XGMTXxHOpXE1+kkfqVlqHIWiqKSFKTTaczNzQklEgkkk0mkUqklhTbuasaKzbVYs/0EVlUfR2jtfhxoaEcxn4PvewBKKJVKKBaLQvydK5fLgTEGx3FQKBTEGq+hzt7nONP+EFd7X+BC9zO0XHuEewNDCJiFwPXhuR5c10U+n18C88q/+eP7vnBuGIZYCyX//MTv2UnMzEwiMTuBv4kfkDJp6AsKtKwMXWVQNQOKpoPZtnD2P5A7nJ+fhyRJ4l/o8/t+vOmP4nqkBq9vX8bgqz5MfRkC002YBLUtBw45ZbYDj9xUnFbA3H0mk4Esy2WHE8Mx3L/VgTtnG/Gg6xJiL+9i+lscjmHCok2MjhO4ATzPg20zAeJPxSEHZrNZcWwBHPswgG1b1qGtO4qGxiZEz9cjNTuCIMjDWliAKcmwDQqfHDJmE9gX4VfAvBF3p6pqGXix4ylWb2jGjr1dqN7diaqtrejti5UDp4EwgtrU3WeOGJBDLoPFo1fEG/BhiSnvPBLDsqpBLF//Fis3vaNrE8PJcx8JVyQXBWiKBkXiU3RhMA+qacOiTHO5vJhwEJTj4FU4bOt6gnCkB/WnexBuuoGDdVcQvflYOORddUWHSkBdc6AaDiSauEbQ3GKG/OimaVK+ttgfikROoa72EI4dDSMcrsHhfXtwpbUFLmVl08U1KB9DlmCqOgxdJ7BKVRMQy7KE+B3kw+HQf+uQ+eTE1QltAAAAAElFTkSuQmCC","aspectRatio":1.8252933507170794,"src":"/static/131b22d7fad4398f72deddd43464e6a3/cd9a9/blog-test-automation.png","srcSet":"/static/131b22d7fad4398f72deddd43464e6a3/4c9af/blog-test-automation.png 930w,\n/static/131b22d7fad4398f72deddd43464e6a3/cd9a9/blog-test-automation.png 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/developers-role-in-test-automation/"}}},{"node":{"excerpt":"On the 21st of November, SPH staff gathered for a cozy SPHTech Meetup session at The Inspiration Hub to learn about Data Privacy efforts in…","timeToRead":1,"frontmatter":{"title":"Towards a Privacy Aware Smart Nation","tags":["Meetup","Review"],"date":"2018-11-29T12:43:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAJABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAEFAgT/xAAVAQEBAAAAAAAAAAAAAAAAAAABAv/aAAwDAQACEAMQAAAB053bCyYWf//EABsQAQEAAQUAAAAAAAAAAAAAAAECAAMEETFD/9oACAEBAAEFAm5ETmN0SanXkZ//xAAWEQADAAAAAAAAAAAAAAAAAAACEBP/2gAIAQMBAT8BmK//xAAWEQADAAAAAAAAAAAAAAAAAAABEBL/2gAIAQIBAT8Bsr//xAAdEAACAgEFAAAAAAAAAAAAAAAAAQIRIgMhMVFx/9oACAEBAAY/AlhsPC1dIpx46IGmP0//xAAZEAEBAQEBAQAAAAAAAAAAAAABABExkaH/2gAIAQEAAT8h5JXdYTvtDIM+p9zM9V//2gAMAwEAAgADAAAAED/v/8QAFxEBAQEBAAAAAAAAAAAAAAAAAQAhEf/aAAgBAwEBPxBDebDf/8QAFxEBAQEBAAAAAAAAAAAAAAAAAQAhYf/aAAgBAgEBPxDE7Jf/xAAeEAEAAQMFAQAAAAAAAAAAAAABABEhMRBBUZGhsf/aAAgBAQABPxByuAIDK1Q3gs3CANhxD6tQMee610h6X4z3J//Z","aspectRatio":2.130492676431425,"src":"/static/ef473fd608a488e0579a6ab7fe528337/989b1/sphtech-meetup-ncript.jpg","srcSet":"/static/ef473fd608a488e0579a6ab7fe528337/f8f18/sphtech-meetup-ncript.jpg 930w,\n/static/ef473fd608a488e0579a6ab7fe528337/989b1/sphtech-meetup-ncript.jpg 1600w","sizes":"(max-width: 1600px) 100vw, 1600px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/towards-a-privacy-aware-smart-nation/"}}},{"node":{"excerpt":"Containerization has been one of the most talk about topics in the digital world. It enabled a whole new paradigm shift in getting software…","timeToRead":2,"frontmatter":{"title":"Docker workshop in SPH","tags":["Docker"],"date":"2018-11-27T11:06:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAQBAgMF/8QAFgEBAQEAAAAAAAAAAAAAAAAAAQAC/9oADAMBAAIQAxAAAAHSOfXC0Lkf/8QAGBABAAMBAAAAAAAAAAAAAAAAAgABEhH/2gAIAQEAAQUCOLjJ5m4moTbOan//xAAWEQEBAQAAAAAAAAAAAAAAAAAAARL/2gAIAQMBAT8BZr//xAAXEQEAAwAAAAAAAAAAAAAAAAAAARIh/9oACAECAQE/AcWh/8QAGxAAAgIDAQAAAAAAAAAAAAAAAAERIQIiMkH/2gAIAQEABj8Ci5Nc0zpFPwtwdM//xAAbEAEBAQADAQEAAAAAAAAAAAABEQAhMUFx4f/aAAgBAQABPyEl3QNMM0vR81rOLjQlC9jIEfoufyN//9oADAMBAAIAAwAAABCAL//EABgRAAIDAAAAAAAAAAAAAAAAAAABESFh/9oACAEDAQE/EIbpGh//xAAYEQACAwAAAAAAAAAAAAAAAAAAAREhYf/aAAgBAgEBPxCUVmJ//8QAGxABAQACAwEAAAAAAAAAAAAAAREAITFBUWH/2gAIAQEAAT8QbJCQCVvU+YydZkj3BMNVBNOVRsBAXfyZuoUFFzxTBMS8DH//2Q==","aspectRatio":1.3333333333333333,"src":"/static/67c833d51f70a35acd4074e27a1b9a26/3dc2b/IMG_9175-1.jpg","srcSet":"/static/67c833d51f70a35acd4074e27a1b9a26/f8f18/IMG_9175-1.jpg 930w,\n/static/67c833d51f70a35acd4074e27a1b9a26/3dc2b/IMG_9175-1.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/docker-workshop-in-sph/"}}},{"node":{"excerpt":"A class is an observable live data that can be used to send events from ViewModel to View in Android MVVM-styled designs.This link…","timeToRead":4,"frontmatter":{"title":"Using Mockito's ArgumentCaptor on SingleLiveEvent","tags":["Android","Testing","Tutorial"],"date":"2018-10-10T17:21:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAgADBf/EABcBAAMBAAAAAAAAAAAAAAAAAAABAgP/2gAMAwEAAhADEAAAAU+M2Gxqz//EABkQAQEAAwEAAAAAAAAAAAAAAAIBAAMEEf/aAAgBAQABBQLQIl0GiQ3wqzHsSmf/xAAWEQEBAQAAAAAAAAAAAAAAAAARAAH/2gAIAQMBAT8BwJv/xAAWEQEBAQAAAAAAAAAAAAAAAAAAESH/2gAIAQIBAT8B1H//xAAcEAACAgIDAAAAAAAAAAAAAAAAASFBAxARQlL/2gAIAQEABj8CycrsNrzZRBOv/8QAHBABAAEEAwAAAAAAAAAAAAAAAQAQESFhMZGh/9oACAEBAAE/Ic7lodhS47RAT1OVOdwQJbbp/9oADAMBAAIAAwAAABBwH//EABcRAQADAAAAAAAAAAAAAAAAAAABETH/2gAIAQMBAT8Q1Ss//8QAFhEAAwAAAAAAAAAAAAAAAAAAARAh/9oACAECAQE/EDSf/8QAGxABAQADAQEBAAAAAAAAAAAAAREAITFRQXH/2gAIAQEAAT8QnlojNn4/MQFk9hRx777jIQnJxujdmMrgpzi1i1uf/9k=","aspectRatio":1.5005359056806002,"src":"/static/7c9ee95dd61b5588277447a33ccd293c/3dc2b/code-sunshine.jpg","srcSet":"/static/7c9ee95dd61b5588277447a33ccd293c/f8f18/code-sunshine.jpg 930w,\n/static/7c9ee95dd61b5588277447a33ccd293c/3dc2b/code-sunshine.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/using-mockitos-argumentcaptor/"}}},{"node":{"excerpt":"TL;DR Does asking users for feedback and ratings help in your app? Yes!When I joined Singapore Press Holdings in late 2015, most of the apps…","timeToRead":3,"frontmatter":{"title":"How to get your mobile app users to give you ratings and feedback!","tags":["Android"],"date":"2018-10-07T23:10:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAIAAAA7N+mxAAAACXBIWXMAAAsSAAALEgHS3X78AAABo0lEQVQoz2WRWW/TQBSF/c954kcgJErFA+ob8NBKhCVSaSsEArElJG3tZqkdjz2JZ+zZN+5MWoHEkT26tu935txx5pOcs7D4dAcfqGTHNxcvr8cv8ouPm5kzxqWvUsphGJzbQz7TWncdUUoj1HDOA8gHqfC8ev6rGq26dcso9IQkxhjA4V5Z8qNCYkKxMTaxwfWVRz9jZZzTVps7GEjghVI2JgkZvLLOaM2s0w7Sg4F3itJ+uVJaq3tZaxPcS6X+7lyjGmMshNTa7PtgMMDA6e5RKfAG0zYKN3V19Hnx4Hj26EOeQSsBUQJF+EdwdvsRQGjQiHLS7VqM2waNp7cH5/m7Ocogj4txwRoSG2h9Nh+flRMolIZtIYZkQgyCxyHgMsp7u7eNsA2euTiSSevDT4dPJ6+3QnFtwn/yKYwBCn6VNa7sFmf5qOPbTVd2TCxWj78WTw5/HJwUb98vT0eL0+/t9M3y/KQYf6m+HU1eTdFvqeOxZcqYpr3hXbHZrWtSlttbMeSKXqohJ/11Sy5rcrXaXlUkr/Cs7YtmN8X9mpt4QH8Ad7k0jshkD1kAAAAASUVORK5CYII=","aspectRatio":2.074786324786325,"src":"/static/4d42232e07032296408b0a75d8f9815e/a83d1/zaobao-app-chart1.png","srcSet":"/static/4d42232e07032296408b0a75d8f9815e/4c9af/zaobao-app-chart1.png 930w,\n/static/4d42232e07032296408b0a75d8f9815e/a83d1/zaobao-app-chart1.png 971w","sizes":"(max-width: 971px) 100vw, 971px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/get-your-app-users-to-give-feedback/"}}},{"node":{"excerpt":"This was the second Developers Gym session organized by Thoughtworks, of which we were honoured to play host to. The coding dojo, formulated…","timeToRead":2,"frontmatter":{"title":"Developers Gym by Thoughtworks - 14 July","tags":["Meetup","Reviews"],"date":"2018-07-25T14:25:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAABAADBf/EABUBAQEAAAAAAAAAAAAAAAAAAAEA/9oADAMBAAIQAxAAAAFBg5F0Ycn/xAAZEAADAQEBAAAAAAAAAAAAAAAAARICAxP/2gAIAQEAAQUC88RpKp2b6Muikj//xAAWEQEBAQAAAAAAAAAAAAAAAAAAARH/2gAIAQMBAT8BZX//xAAWEQEBAQAAAAAAAAAAAAAAAAAAARH/2gAIAQIBAT8BjY//xAAcEAACAgIDAAAAAAAAAAAAAAAAARExAiESQXH/2gAIAQEABj8C5THo1i1otF6KOz//xAAdEAACAgIDAQAAAAAAAAAAAAAAAREhMUFRYYGh/9oACAEBAAE/IXBpbgTKVtySYg6Ki8xM1pmaowl9n//aAAwDAQACAAMAAAAQoA//xAAXEQADAQAAAAAAAAAAAAAAAAAAASFh/9oACAEDAQE/EHVGbn//xAAXEQEBAQEAAAAAAAAAAAAAAAABABFh/9oACAECAQE/EEZqXC//xAAcEAEAAgIDAQAAAAAAAAAAAAABABEhMUFhcVH/2gAIAQEAAT8QGhkCBsvx3AVpM2ixeMzYf0WSkaQrsF8QpXaeLg+ErhYbNDqf/9k=","aspectRatio":1.3333333333333333,"src":"/static/9f96e81e6f6d55da468755a49a4b0666/3dc2b/IMG_8071.jpg","srcSet":"/static/9f96e81e6f6d55da468755a49a4b0666/f8f18/IMG_8071.jpg 930w,\n/static/9f96e81e6f6d55da468755a49a4b0666/3dc2b/IMG_8071.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/developers-gym-by-thoughtworks-14-july/"}}},{"node":{"excerpt":"It was our great pleasure to have invited Mr Steven Koh, the Deputy Director of Government Digital Services (GDS) at Govtech, to update us…","timeToRead":3,"frontmatter":{"title":"Updates to Govtech Agile Practices by Steven Koh - 2 July","tags":["Meetup"],"date":"2018-07-18T17:50:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAABAACBf/EABYBAQEBAAAAAAAAAAAAAAAAAAIAAf/aAAwDAQACEAMQAAABZzh6OLgyv//EABwQAAIBBQEAAAAAAAAAAAAAAAECAwAREhMxQf/aAAgBAQABBQJtITwRlqbls2eUhv/EABYRAAMAAAAAAAAAAAAAAAAAAAABEf/aAAgBAwEBPwFqkP/EABURAQEAAAAAAAAAAAAAAAAAAAEQ/9oACAECAQE/ARJ//8QAHBAAAgICAwAAAAAAAAAAAAAAAAECESExEiIy/9oACAEBAAY/ApNS0dnxPQ87LTwOj//EABoQAAIDAQEAAAAAAAAAAAAAAAERACExQVH/2gAIAQEAAT8hsI8g5G21q4MYOMQGmoCwNG4Escn/2gAMAwEAAgADAAAAEP8AD//EABYRAAMAAAAAAAAAAAAAAAAAAAEQQf/aAAgBAwEBPxCAr//EABcRAQADAAAAAAAAAAAAAAAAAAABETH/2gAIAQIBAT8Qhat//8QAGhAAAwEBAQEAAAAAAAAAAAAAAREhADFBsf/aAAgBAQABPxBl5yWG8GJujIADqfnNA21SvuiI6OdbA0bJgUoL4MagESyDDd3/2Q==","aspectRatio":1.3333333333333333,"src":"/static/8d8fee52f47c44485daff296b0c76794/3dc2b/meetup-speaker.jpg","srcSet":"/static/8d8fee52f47c44485daff296b0c76794/f8f18/meetup-speaker.jpg 930w,\n/static/8d8fee52f47c44485daff296b0c76794/3dc2b/meetup-speaker.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/updates-to-govtech-agile-practices/"}}},{"node":{"excerpt":"IntroductionNews media companies like Singapore Press Holdings (SPH) continue to be faced with rapidly accelerating technology innovation…","timeToRead":3,"frontmatter":{"title":"AI in News Media","tags":[],"date":"2018-07-12T22:46:00.000Z","draft":false,"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAIEAQP/xAAVAQEBAAAAAAAAAAAAAAAAAAABAv/aAAwDAQACEAMQAAABbnkrNAwn/8QAHBABAAEEAwAAAAAAAAAAAAAAAQACAxESEyEi/9oACAEBAAEFAsLGnvhuTKVL6trr/8QAFxEAAwEAAAAAAAAAAAAAAAAAAAEREv/aAAgBAwEBPwHKIj//xAAXEQEAAwAAAAAAAAAAAAAAAAAAAREh/9oACAECAQE/Ablr/8QAGhAAAgIDAAAAAAAAAAAAAAAAABABITEy8P/aAAgBAQAGPwJayV1rJ//EABsQAAMAAgMAAAAAAAAAAAAAAAABESExQWGB/9oACAEBAAE/IaHM9j2KZRS6mkHc3sbyZ+n/2gAMAwEAAgADAAAAEJvf/8QAFhEBAQEAAAAAAAAAAAAAAAAAABFB/9oACAEDAQE/EHHH/8QAFxEAAwEAAAAAAAAAAAAAAAAAAAERQf/aAAgBAgEBPxBFX0//xAAdEAEBAAMAAgMAAAAAAAAAAAABEQAhMUFRYXGh/9oACAEBAAE/EI4MDolZ4mCAJTthy4toHwXFAiuj0y/hiQMnbf3nFcwq5DP/2Q==","aspectRatio":1.8741633199464525,"src":"/static/9bea42284114acb5ba9e14a5fe42867c/3dc2b/INMANews-ArtificialIntelligence-1800.jpg","srcSet":"/static/9bea42284114acb5ba9e14a5fe42867c/f8f18/INMANews-ArtificialIntelligence-1800.jpg 930w,\n/static/9bea42284114acb5ba9e14a5fe42867c/3dc2b/INMANews-ArtificialIntelligence-1800.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/ai-in-news-media/"}}},{"node":{"excerpt":"Hi all! It has been a while since some of us have gone for the Scrum training by Mr Stuart, building balloon animal zoos to learn what is…","timeToRead":3,"frontmatter":{"title":"Video Review - Carousell Level-Up: Applying Scrum for Better Delivery","tags":["Review","Meetup"],"date":"2018-02-05T07:53:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAA7DAAAOwwHHb6hkAAACqklEQVQozwGfAmD9ADEVFzklJjolJzceITslJTchIjwpLDolKDglJTYhITsmJj4qKzkiJDspKTYoKDYpKiwaG0AyMj8xMi4ZGgCoNTmrQkWqOD2pPEGpOT2pLDGqMziqLzSoJiqpJSmqJyurKCypIyirLjKbTEt8KCpoHSBvLTFzLTF2LTEAyzQ5zUVJzT9DzDxAzD9FzUZKykNIy0JHyjo/yTk+yjo/yjtAyztAzDpB0IJ+u25rpVZYmFRVo2ZnrHV1ANZCR9x2edhqbthcYNpqbdltcdlhZdtobNtobNtgZN1nbNliZthtcdZPVNx1adJXSsKIfqFoYq9ER6xERwDXR0vXaGzXa2/YaW3XZWrbfH/Yf4PajI/Yd3vGaWzGZ2rXcHTagITabXLcVkPROCaUW0+KQz+4Hh+tIyYA1UNH12dq1mNo2Gxx2Wxw8sXH56+x4pOVyIaJXFVVTUpKyIqL99LS6KWn3U89WiUnFR4vISxFWx0ovjk3ANMyN9M4PdI3PdM6P9M5PtI5PtI8QtU4PswrMZ8qL5kpLcstMtUrMdc+QthdTFFESi4zQh0nNltDRcJHRwDSNTrURkvURkrUS07TTVHURUnUSEzTQUbUOD7bPUPaO0HTLTPSJCvVQkXaXEmadXBEPj5HPjypamLAS00A0Ds/z0ZLzzxB0D1CzTg8zzY6zjpAz0FFzUFGzkRJz0NJzjQ6zyYr0kdK20k4Xx8gAAQPBAcNdRAUwU1PAOM5P+FITuNMUuNQVeJFTOI8QuIzOeJCR+JVWuRaX+NVWuNCSOMqMOZNUdhFPolxdUhpcUZpcY07QMpOUQCLGx+LHCCKIiaKIiWKJCeLIyeLHSGLHCGLIiaLIyeJISWKHCCKHCCLKCyJOjx+TE5vTlFsVlp0REaBQEJqGgpHmAn0+wAAAABJRU5ErkJggg==","aspectRatio":1.7793696275071633,"src":"/static/dbb7bd9058838337f25ad9090b348997/748f9/scrum-video-intro.png","srcSet":"/static/dbb7bd9058838337f25ad9090b348997/748f9/scrum-video-intro.png 621w","sizes":"(max-width: 621px) 100vw, 621px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/video-review-carousell-level-up/"}}}]}},"pageContext":{"isCreatedByStatefulCreatePages":false,"author":"Ghost"}}} \ No newline at end of file +{"componentChunkName":"component---src-templates-author-tsx","path":"/author/ghost/","webpackCompilationHash":"4d127609ee78b8f0aee7","result":{"data":{"authorYaml":{"id":"Ghost","website":"https://ghost.org/","twitter":"TryGhost","bio":"The professional publishing platform","facebook":"ghost","location":"On a plane","profile_image":null,"avatar":{"childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAABMUlEQVQ4y2MwsXf5T03MMGogGBvbOYNpUwdXOIbJwdgwNQQNhCk0snX6r2thC8Y6QGxg7QCWA/FBcrgMxepCkAZrV6//EYmpYBydkvHfMzjiv5mj2//whJT/Nm7ecEMJGgjykp6V/f+AqLj/O/Ye+L8diA8dO/m/pbv/v72n3/+tu/f9D45N/K9naYcSFESFoRXQlSCX2rh7g/kgr1u5epIWhiAMCi/3wLD/fVNn/u+fNgtMT5g+6//kmXOB/Jn/PYLCwWrINnDijDlAPBvKJ8NAZC+DIgCkGYRBbJAYSV5GjpTte/b/PwiMkLj0nP8xqVn/Dxw9AY6kwOh40iIFlmzCgUkmKjnjvx0wdu08fMFskJi1mxfxyQY9YetAEzJyQic5YaNnPeTgIDnrjZaHJGMACtTMXoVAJ6sAAAAASUVORK5CYII=","aspectRatio":1,"src":"/static/5f2c129e42248a92c87b13b4293950cf/7c0ed/ghost.png","srcSet":"/static/5f2c129e42248a92c87b13b4293950cf/09f8c/ghost.png 50w,\n/static/5f2c129e42248a92c87b13b4293950cf/bf65b/ghost.png 100w,\n/static/5f2c129e42248a92c87b13b4293950cf/7c0ed/ghost.png 200w,\n/static/5f2c129e42248a92c87b13b4293950cf/fdbb0/ghost.png 300w,\n/static/5f2c129e42248a92c87b13b4293950cf/647de/ghost.png 400w","sizes":"(max-width: 200px) 100vw, 200px"}}}},"allMarkdownRemark":{"edges":[{"node":{"excerpt":"Mr Martin Fowler was one of the founding members of the Agile Manifesto, author of many books including my favourite Refactoring (1st…","timeToRead":4,"frontmatter":{"title":"XConf Review - Economics of Software Quality","tags":["Review"],"date":"2019-04-29T12:46:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAMABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAMEBf/EABUBAQEAAAAAAAAAAAAAAAAAAAEC/9oADAMBAAIQAxAAAAGJ0yCtYUS//8QAGxAAAgIDAQAAAAAAAAAAAAAAAQIAAxESEyH/2gAIAQEAAQUCcLpxqlVqpWh2mfOYE//EABYRAQEBAAAAAAAAAAAAAAAAAAABEf/aAAgBAwEBPwGsf//EABYRAQEBAAAAAAAAAAAAAAAAAAABEf/aAAgBAgEBPwGVr//EAB0QAAMAAAcAAAAAAAAAAAAAAAABERASISJxgZH/2gAIAQEABj8Cqeot17Esq8JBc4f/xAAaEAEAAwEBAQAAAAAAAAAAAAABABEhQVEx/9oACAEBAAE/Ia5FjR9iHQmwq0fdyhYfTezbURbavdn/2gAMAwEAAgADAAAAEJAP/8QAFxEBAQEBAAAAAAAAAAAAAAAAAREAUf/aAAgBAwEBPxAVG6Ob/8QAGBEAAgMAAAAAAAAAAAAAAAAAAAERMUH/2gAIAQIBAT8QUrRPD//EABwQAQACAgMBAAAAAAAAAAAAAAEAESExQXGhkf/aAAgBAQABPxBKPijxjqFgV4E15Di4tQT2yytaAmA3g+SylgjXFET1otnWJ//Z","aspectRatio":1.696969696969697,"src":"/static/4eba5c89024d95c479a7a9ee73e9ac18/3dc2b/IMG__0303.jpg","srcSet":"/static/4eba5c89024d95c479a7a9ee73e9ac18/f8f18/IMG__0303.jpg 930w,\n/static/4eba5c89024d95c479a7a9ee73e9ac18/3dc2b/IMG__0303.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/xconf-economics-of-software-quality/"}}},{"node":{"excerpt":"We developed a News Tablet application for the Samsung Knox recently, and we are able to institute the various good engineering practices…","timeToRead":6,"frontmatter":{"title":"Revitalizing our engineering - Engineering 2.0","tags":[],"date":"2019-03-12T14:00:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAQBAgMF/8QAFgEBAQEAAAAAAAAAAAAAAAAAAgED/9oADAMBAAIQAxAAAAHa/IbjgWMn/8QAHBAAAwABBQAAAAAAAAAAAAAAAQIDEwAEERIU/9oACAEBAAEFAgiMfONPHhs5LS3B72qcv//EABYRAQEBAAAAAAAAAAAAAAAAAAABEf/aAAgBAwEBPwGNj//EABcRAAMBAAAAAAAAAAAAAAAAAAABAiH/2gAIAQIBAT8Bps0//8QAGBABAQEBAQAAAAAAAAAAAAAAAQARECH/2gAIAQEABj8CzmWrGrPrf//EABkQAQEBAQEBAAAAAAAAAAAAABEBADFBUf/aAAgBAQABPyEO6ezPyOWGsOpmACfuCwnf/9oADAMBAAIAAwAAABBA3//EABcRAAMBAAAAAAAAAAAAAAAAAAABETH/2gAIAQMBAT8QmkdR/8QAFhEBAQEAAAAAAAAAAAAAAAAAEQAB/9oACAECAQE/ED2PG//EABoQAQEBAAMBAAAAAAAAAAAAAAERACExQXH/2gAIAQEAAT8Q5hISiCfR5xeVaWEnkM+D1NSZrywMwqmEFfN//9k=","aspectRatio":1.3333333333333333,"src":"/static/2ecbc0836b73436a052109efa9ccde4e/3dc2b/william-warby-1357858-unsplash-1.jpg","srcSet":"/static/2ecbc0836b73436a052109efa9ccde4e/f8f18/william-warby-1357858-unsplash-1.jpg 930w,\n/static/2ecbc0836b73436a052109efa9ccde4e/3dc2b/william-warby-1357858-unsplash-1.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/revitalizing-our-engineering/"}}},{"node":{"excerpt":"This is the beginning of an exciting era for our SPHTech team!Over here, you will get to read about our learnings and reviews of the new…","timeToRead":1,"frontmatter":{"title":"About Us","tags":[],"date":"2019-01-01T23:46:37.131Z","draft":false,"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAIEBf/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAGuZFjMNEX/xAAdEAEAAQMFAAAAAAAAAAAAAAACAAEDBBAREhMh/9oACAEBAAEFAqk73admiQMNvhDjef/EABURAQEAAAAAAAAAAAAAAAAAABAR/9oACAEDAQE/AYf/xAAVEQEBAAAAAAAAAAAAAAAAAAAQEf/aAAgBAgEBPwGn/8QAHhAAAQMEAwAAAAAAAAAAAAAAAQACERASITEiMqH/2gAIAQEABj8CuZiUJOhNBvKc67iRC7+L/8QAGxAAAwEBAAMAAAAAAAAAAAAAAAERIUExUZH/2gAIAQEAAT8hXdlJvRVr82FbLNeeRv6zEU2luHoB/9oADAMBAAIAAwAAABCbz//EABYRAQEBAAAAAAAAAAAAAAAAAAARIf/aAAgBAwEBPxCq1//EABURAQEAAAAAAAAAAAAAAAAAABAx/9oACAECAQE/EIP/xAAdEAEAAwACAwEAAAAAAAAAAAABABEhMUFhgaGx/9oACAEBAAE/EGQtNWliantl6rW3JQv7Ft0sdQkrFDejvYtC2gI4vfMdTuuls+z/2Q==","aspectRatio":1.3333333333333333,"src":"/static/e26b6c56a85123d553d70dcd1ce2285a/3dc2b/cafe-ppl-collab.jpg","srcSet":"/static/e26b6c56a85123d553d70dcd1ce2285a/f8f18/cafe-ppl-collab.jpg 930w,\n/static/e26b6c56a85123d553d70dcd1ce2285a/3dc2b/cafe-ppl-collab.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"fields":{"layout":"postnodate","slug":"/about-us/"}}},{"node":{"excerpt":"Rod Michael, director of global market access strategy and channels at Rockwell Automation, famously said, “If you automate a mess, you get…","timeToRead":3,"frontmatter":{"title":"The developer's role in a successful implementation of the test automation","tags":["Testing"],"date":"2018-12-06T12:54:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAACiElEQVQoz02SS0hUURjHZ9WqoE0RbcJFRUWBROuKCKqNFY1iD2yRo5ELicqoSBOMMGSsQHpDlBbVooYwhKgcSU3thUo048C0cJh7ve9zn/P6950zjnThz3fvuYff9z//74TiI8OIj05ibHwKo6RP8XGMTXxHOpXE1+kkfqVlqHIWiqKSFKTTaczNzQklEgkkk0mkUqklhTbuasaKzbVYs/0EVlUfR2jtfhxoaEcxn4PvewBKKJVKKBaLQvydK5fLgTEGx3FQKBTEGq+hzt7nONP+EFd7X+BC9zO0XHuEewNDCJiFwPXhuR5c10U+n18C88q/+eP7vnBuGIZYCyX//MTv2UnMzEwiMTuBv4kfkDJp6AsKtKwMXWVQNQOKpoPZtnD2P5A7nJ+fhyRJ4l/o8/t+vOmP4nqkBq9vX8bgqz5MfRkC002YBLUtBw45ZbYDj9xUnFbA3H0mk4Esy2WHE8Mx3L/VgTtnG/Gg6xJiL+9i+lscjmHCok2MjhO4ATzPg20zAeJPxSEHZrNZcWwBHPswgG1b1qGtO4qGxiZEz9cjNTuCIMjDWliAKcmwDQqfHDJmE9gX4VfAvBF3p6pqGXix4ylWb2jGjr1dqN7diaqtrejti5UDp4EwgtrU3WeOGJBDLoPFo1fEG/BhiSnvPBLDsqpBLF//Fis3vaNrE8PJcx8JVyQXBWiKBkXiU3RhMA+qacOiTHO5vJhwEJTj4FU4bOt6gnCkB/WnexBuuoGDdVcQvflYOORddUWHSkBdc6AaDiSauEbQ3GKG/OimaVK+ttgfikROoa72EI4dDSMcrsHhfXtwpbUFLmVl08U1KB9DlmCqOgxdJ7BKVRMQy7KE+B3kw+HQf+uQ+eTE1QltAAAAAElFTkSuQmCC","aspectRatio":1.8252933507170794,"src":"/static/131b22d7fad4398f72deddd43464e6a3/cd9a9/blog-test-automation.png","srcSet":"/static/131b22d7fad4398f72deddd43464e6a3/4c9af/blog-test-automation.png 930w,\n/static/131b22d7fad4398f72deddd43464e6a3/cd9a9/blog-test-automation.png 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/developers-role-in-test-automation/"}}},{"node":{"excerpt":"On the 21st of November, SPH staff gathered for a cozy SPHTech Meetup session at The Inspiration Hub to learn about Data Privacy efforts in…","timeToRead":1,"frontmatter":{"title":"Towards a Privacy Aware Smart Nation","tags":["Meetup","Review"],"date":"2018-11-29T12:43:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAJABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAEFAgT/xAAVAQEBAAAAAAAAAAAAAAAAAAABAv/aAAwDAQACEAMQAAAB053bCyYWf//EABsQAQEAAQUAAAAAAAAAAAAAAAECAAMEETFD/9oACAEBAAEFAm5ETmN0SanXkZ//xAAWEQADAAAAAAAAAAAAAAAAAAACEBP/2gAIAQMBAT8BmK//xAAWEQADAAAAAAAAAAAAAAAAAAABEBL/2gAIAQIBAT8Bsr//xAAdEAACAgEFAAAAAAAAAAAAAAAAAQIRIgMhMVFx/9oACAEBAAY/AlhsPC1dIpx46IGmP0//xAAZEAEBAQEBAQAAAAAAAAAAAAABABExkaH/2gAIAQEAAT8h5JXdYTvtDIM+p9zM9V//2gAMAwEAAgADAAAAED/v/8QAFxEBAQEBAAAAAAAAAAAAAAAAAQAhEf/aAAgBAwEBPxBDebDf/8QAFxEBAQEBAAAAAAAAAAAAAAAAAQAhYf/aAAgBAgEBPxDE7Jf/xAAeEAEAAQMFAQAAAAAAAAAAAAABABEhMRBBUZGhsf/aAAgBAQABPxByuAIDK1Q3gs3CANhxD6tQMee610h6X4z3J//Z","aspectRatio":2.130492676431425,"src":"/static/ef473fd608a488e0579a6ab7fe528337/989b1/sphtech-meetup-ncript.jpg","srcSet":"/static/ef473fd608a488e0579a6ab7fe528337/f8f18/sphtech-meetup-ncript.jpg 930w,\n/static/ef473fd608a488e0579a6ab7fe528337/989b1/sphtech-meetup-ncript.jpg 1600w","sizes":"(max-width: 1600px) 100vw, 1600px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/towards-a-privacy-aware-smart-nation/"}}},{"node":{"excerpt":"Containerization has been one of the most talk about topics in the digital world. It enabled a whole new paradigm shift in getting software…","timeToRead":2,"frontmatter":{"title":"Docker workshop in SPH","tags":["Docker"],"date":"2018-11-27T11:06:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAQBAgMF/8QAFgEBAQEAAAAAAAAAAAAAAAAAAQAC/9oADAMBAAIQAxAAAAHSOfXC0Lkf/8QAGBABAAMBAAAAAAAAAAAAAAAAAgABEhH/2gAIAQEAAQUCOLjJ5m4moTbOan//xAAWEQEBAQAAAAAAAAAAAAAAAAAAARL/2gAIAQMBAT8BZr//xAAXEQEAAwAAAAAAAAAAAAAAAAAAARIh/9oACAECAQE/AcWh/8QAGxAAAgIDAQAAAAAAAAAAAAAAAAERIQIiMkH/2gAIAQEABj8Ci5Nc0zpFPwtwdM//xAAbEAEBAQADAQEAAAAAAAAAAAABEQAhMUFx4f/aAAgBAQABPyEl3QNMM0vR81rOLjQlC9jIEfoufyN//9oADAMBAAIAAwAAABCAL//EABgRAAIDAAAAAAAAAAAAAAAAAAABESFh/9oACAEDAQE/EIbpGh//xAAYEQACAwAAAAAAAAAAAAAAAAAAAREhYf/aAAgBAgEBPxCUVmJ//8QAGxABAQACAwEAAAAAAAAAAAAAAREAITFBUWH/2gAIAQEAAT8QbJCQCVvU+YydZkj3BMNVBNOVRsBAXfyZuoUFFzxTBMS8DH//2Q==","aspectRatio":1.3333333333333333,"src":"/static/67c833d51f70a35acd4074e27a1b9a26/3dc2b/IMG_9175-1.jpg","srcSet":"/static/67c833d51f70a35acd4074e27a1b9a26/f8f18/IMG_9175-1.jpg 930w,\n/static/67c833d51f70a35acd4074e27a1b9a26/3dc2b/IMG_9175-1.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/docker-workshop-in-sph/"}}},{"node":{"excerpt":"A class is an observable live data that can be used to send events from ViewModel to View in Android MVVM-styled designs.This link…","timeToRead":4,"frontmatter":{"title":"Using Mockito's ArgumentCaptor on SingleLiveEvent","tags":["Android","Testing","Tutorial"],"date":"2018-10-10T17:21:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAgADBf/EABcBAAMBAAAAAAAAAAAAAAAAAAABAgP/2gAMAwEAAhADEAAAAU+M2Gxqz//EABkQAQEAAwEAAAAAAAAAAAAAAAIBAAMEEf/aAAgBAQABBQLQIl0GiQ3wqzHsSmf/xAAWEQEBAQAAAAAAAAAAAAAAAAARAAH/2gAIAQMBAT8BwJv/xAAWEQEBAQAAAAAAAAAAAAAAAAAAESH/2gAIAQIBAT8B1H//xAAcEAACAgIDAAAAAAAAAAAAAAAAASFBAxARQlL/2gAIAQEABj8CycrsNrzZRBOv/8QAHBABAAEEAwAAAAAAAAAAAAAAAQAQESFhMZGh/9oACAEBAAE/Ic7lodhS47RAT1OVOdwQJbbp/9oADAMBAAIAAwAAABBwH//EABcRAQADAAAAAAAAAAAAAAAAAAABETH/2gAIAQMBAT8Q1Ss//8QAFhEAAwAAAAAAAAAAAAAAAAAAARAh/9oACAECAQE/EDSf/8QAGxABAQADAQEBAAAAAAAAAAAAAREAITFRQXH/2gAIAQEAAT8QnlojNn4/MQFk9hRx777jIQnJxujdmMrgpzi1i1uf/9k=","aspectRatio":1.5005359056806002,"src":"/static/7c9ee95dd61b5588277447a33ccd293c/3dc2b/code-sunshine.jpg","srcSet":"/static/7c9ee95dd61b5588277447a33ccd293c/f8f18/code-sunshine.jpg 930w,\n/static/7c9ee95dd61b5588277447a33ccd293c/3dc2b/code-sunshine.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/using-mockitos-argumentcaptor/"}}},{"node":{"excerpt":"TL;DR Does asking users for feedback and ratings help in your app? Yes!When I joined Singapore Press Holdings in late 2015, most of the apps…","timeToRead":3,"frontmatter":{"title":"How to get your mobile app users to give you ratings and feedback!","tags":["Android"],"date":"2018-10-07T23:10:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAIAAAA7N+mxAAAACXBIWXMAAAsSAAALEgHS3X78AAABo0lEQVQoz2WRWW/TQBSF/c954kcgJErFA+ob8NBKhCVSaSsEArElJG3tZqkdjz2JZ+zZN+5MWoHEkT26tu935txx5pOcs7D4dAcfqGTHNxcvr8cv8ouPm5kzxqWvUsphGJzbQz7TWncdUUoj1HDOA8gHqfC8ev6rGq26dcso9IQkxhjA4V5Z8qNCYkKxMTaxwfWVRz9jZZzTVps7GEjghVI2JgkZvLLOaM2s0w7Sg4F3itJ+uVJaq3tZaxPcS6X+7lyjGmMshNTa7PtgMMDA6e5RKfAG0zYKN3V19Hnx4Hj26EOeQSsBUQJF+EdwdvsRQGjQiHLS7VqM2waNp7cH5/m7Ocogj4txwRoSG2h9Nh+flRMolIZtIYZkQgyCxyHgMsp7u7eNsA2euTiSSevDT4dPJ6+3QnFtwn/yKYwBCn6VNa7sFmf5qOPbTVd2TCxWj78WTw5/HJwUb98vT0eL0+/t9M3y/KQYf6m+HU1eTdFvqeOxZcqYpr3hXbHZrWtSlttbMeSKXqohJ/11Sy5rcrXaXlUkr/Cs7YtmN8X9mpt4QH8Ad7k0jshkD1kAAAAASUVORK5CYII=","aspectRatio":2.074786324786325,"src":"/static/4d42232e07032296408b0a75d8f9815e/a83d1/zaobao-app-chart1.png","srcSet":"/static/4d42232e07032296408b0a75d8f9815e/4c9af/zaobao-app-chart1.png 930w,\n/static/4d42232e07032296408b0a75d8f9815e/a83d1/zaobao-app-chart1.png 971w","sizes":"(max-width: 971px) 100vw, 971px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/get-your-app-users-to-give-feedback/"}}},{"node":{"excerpt":"This was the second Developers Gym session organized by Thoughtworks, of which we were honoured to play host to. The coding dojo, formulated…","timeToRead":2,"frontmatter":{"title":"Developers Gym by Thoughtworks - 14 July","tags":["Meetup","Reviews"],"date":"2018-07-25T14:25:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAABAADBf/EABUBAQEAAAAAAAAAAAAAAAAAAAEA/9oADAMBAAIQAxAAAAFBg5F0Ycn/xAAZEAADAQEBAAAAAAAAAAAAAAAAARICAxP/2gAIAQEAAQUC88RpKp2b6Muikj//xAAWEQEBAQAAAAAAAAAAAAAAAAAAARH/2gAIAQMBAT8BZX//xAAWEQEBAQAAAAAAAAAAAAAAAAAAARH/2gAIAQIBAT8BjY//xAAcEAACAgIDAAAAAAAAAAAAAAAAARExAiESQXH/2gAIAQEABj8C5THo1i1otF6KOz//xAAdEAACAgIDAQAAAAAAAAAAAAAAAREhMUFRYYGh/9oACAEBAAE/IXBpbgTKVtySYg6Ki8xM1pmaowl9n//aAAwDAQACAAMAAAAQoA//xAAXEQADAQAAAAAAAAAAAAAAAAAAASFh/9oACAEDAQE/EHVGbn//xAAXEQEBAQEAAAAAAAAAAAAAAAABABFh/9oACAECAQE/EEZqXC//xAAcEAEAAgIDAQAAAAAAAAAAAAABABEhMUFhcVH/2gAIAQEAAT8QGhkCBsvx3AVpM2ixeMzYf0WSkaQrsF8QpXaeLg+ErhYbNDqf/9k=","aspectRatio":1.3333333333333333,"src":"/static/9f96e81e6f6d55da468755a49a4b0666/3dc2b/IMG_8071.jpg","srcSet":"/static/9f96e81e6f6d55da468755a49a4b0666/f8f18/IMG_8071.jpg 930w,\n/static/9f96e81e6f6d55da468755a49a4b0666/3dc2b/IMG_8071.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/developers-gym-by-thoughtworks-14-july/"}}},{"node":{"excerpt":"It was our great pleasure to have invited Mr Steven Koh, the Deputy Director of Government Digital Services (GDS) at Govtech, to update us…","timeToRead":3,"frontmatter":{"title":"Updates to Govtech Agile Practices by Steven Koh - 2 July","tags":["Meetup"],"date":"2018-07-18T17:50:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAABAACBf/EABYBAQEBAAAAAAAAAAAAAAAAAAIAAf/aAAwDAQACEAMQAAABZzh6OLgyv//EABwQAAIBBQEAAAAAAAAAAAAAAAECAwAREhMxQf/aAAgBAQABBQJtITwRlqbls2eUhv/EABYRAAMAAAAAAAAAAAAAAAAAAAABEf/aAAgBAwEBPwFqkP/EABURAQEAAAAAAAAAAAAAAAAAAAEQ/9oACAECAQE/ARJ//8QAHBAAAgICAwAAAAAAAAAAAAAAAAECESExEiIy/9oACAEBAAY/ApNS0dnxPQ87LTwOj//EABoQAAIDAQEAAAAAAAAAAAAAAAERACExQVH/2gAIAQEAAT8hsI8g5G21q4MYOMQGmoCwNG4Escn/2gAMAwEAAgADAAAAEP8AD//EABYRAAMAAAAAAAAAAAAAAAAAAAEQQf/aAAgBAwEBPxCAr//EABcRAQADAAAAAAAAAAAAAAAAAAABETH/2gAIAQIBAT8Qhat//8QAGhAAAwEBAQEAAAAAAAAAAAAAAREhADFBsf/aAAgBAQABPxBl5yWG8GJujIADqfnNA21SvuiI6OdbA0bJgUoL4MagESyDDd3/2Q==","aspectRatio":1.3333333333333333,"src":"/static/8d8fee52f47c44485daff296b0c76794/3dc2b/meetup-speaker.jpg","srcSet":"/static/8d8fee52f47c44485daff296b0c76794/f8f18/meetup-speaker.jpg 930w,\n/static/8d8fee52f47c44485daff296b0c76794/3dc2b/meetup-speaker.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/updates-to-govtech-agile-practices/"}}},{"node":{"excerpt":"IntroductionNews media companies like Singapore Press Holdings (SPH) continue to be faced with rapidly accelerating technology innovation…","timeToRead":3,"frontmatter":{"title":"AI in News Media","tags":[],"date":"2018-07-12T22:46:00.000Z","draft":false,"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAIEAQP/xAAVAQEBAAAAAAAAAAAAAAAAAAABAv/aAAwDAQACEAMQAAABbnkrNAwn/8QAHBABAAEEAwAAAAAAAAAAAAAAAQACAxESEyEi/9oACAEBAAEFAsLGnvhuTKVL6trr/8QAFxEAAwEAAAAAAAAAAAAAAAAAAAEREv/aAAgBAwEBPwHKIj//xAAXEQEAAwAAAAAAAAAAAAAAAAAAAREh/9oACAECAQE/Ablr/8QAGhAAAgIDAAAAAAAAAAAAAAAAABABITEy8P/aAAgBAQAGPwJayV1rJ//EABsQAAMAAgMAAAAAAAAAAAAAAAABESExQWGB/9oACAEBAAE/IaHM9j2KZRS6mkHc3sbyZ+n/2gAMAwEAAgADAAAAEJvf/8QAFhEBAQEAAAAAAAAAAAAAAAAAABFB/9oACAEDAQE/EHHH/8QAFxEAAwEAAAAAAAAAAAAAAAAAAAERQf/aAAgBAgEBPxBFX0//xAAdEAEBAAMAAgMAAAAAAAAAAAABEQAhMUFRYXGh/9oACAEBAAE/EI4MDolZ4mCAJTthy4toHwXFAiuj0y/hiQMnbf3nFcwq5DP/2Q==","aspectRatio":1.8741633199464525,"src":"/static/9bea42284114acb5ba9e14a5fe42867c/3dc2b/INMANews-ArtificialIntelligence-1800.jpg","srcSet":"/static/9bea42284114acb5ba9e14a5fe42867c/f8f18/INMANews-ArtificialIntelligence-1800.jpg 930w,\n/static/9bea42284114acb5ba9e14a5fe42867c/3dc2b/INMANews-ArtificialIntelligence-1800.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/ai-in-news-media/"}}},{"node":{"excerpt":"Hi all! It has been a while since some of us have gone for the Scrum training by Mr Stuart, building balloon animal zoos to learn what is…","timeToRead":3,"frontmatter":{"title":"Video Review - Carousell Level-Up: Applying Scrum for Better Delivery","tags":["Review","Meetup"],"date":"2018-02-05T07:53:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAA7DAAAOwwHHb6hkAAACqklEQVQozwGfAmD9ADEVFzklJjolJzceITslJTchIjwpLDolKDglJTYhITsmJj4qKzkiJDspKTYoKDYpKiwaG0AyMj8xMi4ZGgCoNTmrQkWqOD2pPEGpOT2pLDGqMziqLzSoJiqpJSmqJyurKCypIyirLjKbTEt8KCpoHSBvLTFzLTF2LTEAyzQ5zUVJzT9DzDxAzD9FzUZKykNIy0JHyjo/yTk+yjo/yjtAyztAzDpB0IJ+u25rpVZYmFRVo2ZnrHV1ANZCR9x2edhqbthcYNpqbdltcdlhZdtobNtobNtgZN1nbNliZthtcdZPVNx1adJXSsKIfqFoYq9ER6xERwDXR0vXaGzXa2/YaW3XZWrbfH/Yf4PajI/Yd3vGaWzGZ2rXcHTagITabXLcVkPROCaUW0+KQz+4Hh+tIyYA1UNH12dq1mNo2Gxx2Wxw8sXH56+x4pOVyIaJXFVVTUpKyIqL99LS6KWn3U89WiUnFR4vISxFWx0ovjk3ANMyN9M4PdI3PdM6P9M5PtI5PtI8QtU4PswrMZ8qL5kpLcstMtUrMdc+QthdTFFESi4zQh0nNltDRcJHRwDSNTrURkvURkrUS07TTVHURUnUSEzTQUbUOD7bPUPaO0HTLTPSJCvVQkXaXEmadXBEPj5HPjypamLAS00A0Ds/z0ZLzzxB0D1CzTg8zzY6zjpAz0FFzUFGzkRJz0NJzjQ6zyYr0kdK20k4Xx8gAAQPBAcNdRAUwU1PAOM5P+FITuNMUuNQVeJFTOI8QuIzOeJCR+JVWuRaX+NVWuNCSOMqMOZNUdhFPolxdUhpcUZpcY07QMpOUQCLGx+LHCCKIiaKIiWKJCeLIyeLHSGLHCGLIiaLIyeJISWKHCCKHCCLKCyJOjx+TE5vTlFsVlp0REaBQEJqGgpHmAn0+wAAAABJRU5ErkJggg==","aspectRatio":1.7793696275071633,"src":"/static/dbb7bd9058838337f25ad9090b348997/748f9/scrum-video-intro.png","srcSet":"/static/dbb7bd9058838337f25ad9090b348997/748f9/scrum-video-intro.png 621w","sizes":"(max-width: 621px) 100vw, 621px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/video-review-carousell-level-up/"}}}]}},"pageContext":{"isCreatedByStatefulCreatePages":false,"author":"Ghost"}}} \ No newline at end of file diff --git a/page-data/author/sph-tech/page-data.json b/page-data/author/sph-tech/page-data.json index c8de1e8..2882bd2 100644 --- a/page-data/author/sph-tech/page-data.json +++ b/page-data/author/sph-tech/page-data.json @@ -1 +1 @@ -{"componentChunkName":"component---src-templates-author-tsx","path":"/author/sph-tech/","webpackCompilationHash":"e6542130e6dfe73197bb","result":{"data":{"authorYaml":{"id":"SPHTech","website":null,"twitter":null,"bio":null,"facebook":null,"location":null,"profile_image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAMEAQX/xAAWAQEBAQAAAAAAAAAAAAAAAAABAgP/2gAMAwEAAhADEAAAAeM6TazeTg//xAAYEAADAQEAAAAAAAAAAAAAAAAAAQIREv/aAAgBAQABBQJSZJUrdOmN6//EABgRAAIDAAAAAAAAAAAAAAAAAAABAhES/9oACAEDAQE/AXGzLP/EABURAQEAAAAAAAAAAAAAAAAAAAAR/9oACAECAQE/Aar/xAAWEAEBAQAAAAAAAAAAAAAAAAAxACD/2gAIAQEABj8CZnH/xAAaEAEAAwADAAAAAAAAAAAAAAABABExECFx/9oACAEBAAE/IQNEKOxMEPkGZwLYz//aAAwDAQACAAMAAAAQj+//xAAXEQEBAQEAAAAAAAAAAAAAAAABADFB/9oACAEDAQE/EH6gDb//xAAWEQEBAQAAAAAAAAAAAAAAAAARADH/2gAIAQIBAT8QJkL/xAAZEAEBAQEBAQAAAAAAAAAAAAABESEAMVH/2gAIAQEAAT8QlQUuvEaGfXrkrNGcWkb7hwQlNJ5z6Vfnf//Z","aspectRatio":1.5,"src":"/static/c2756fa06c84564e79951c785c6a316b/45a11/alex-knight-326705-unsplash.jpg","srcSet":"/static/c2756fa06c84564e79951c785c6a316b/f8f18/alex-knight-326705-unsplash.jpg 930w,\n/static/c2756fa06c84564e79951c785c6a316b/0e6ff/alex-knight-326705-unsplash.jpg 1860w,\n/static/c2756fa06c84564e79951c785c6a316b/45a11/alex-knight-326705-unsplash.jpg 3720w,\n/static/c2756fa06c84564e79951c785c6a316b/ad7c9/alex-knight-326705-unsplash.jpg 4896w","sizes":"(max-width: 3720px) 100vw, 3720px"}}},"avatar":{"childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAADQElEQVQ4y5VUW0tUURSeX9BDhFZQ1Nx0lCAqI+o1KMiHoqjIesisXiLSQOhiRUWUdKEwKqKHtNIyJLuY0UWS0lBKM8mcrEadcnIc58zlzMyZvc/+WjNnRs+xIWjDd9a+fudba6+1TaAmhEDaCqESONItOZewCUitgK8JIu7TxrQXqbV0M00lSzd1LAgRiU5u/3oAaJ0NQcC7RYC/LXWOJz6ThHoVyX74GynpRKTuLZjTo815SNWzbIjuEsD7EqJjHUT7KoNnBoVpZer3G+DN+eBNNvD2Egh5BCLqAW9ZCf7YDBF0agTjXbRnAbkezESYikPIBfYgH+y+BawhD6x+LtjDAsJSxOutiN+zgPechWAyeNs+sNZiXagyEKq+Xig1dii386DcyiU4oFRbodwk1CT6dq1fnQv2vJiUj6cIVYNKk55dadyC6PnpiF3LRfRqziSu2Ak0d9mC2I0C6JtQVYNSk+Evsg9K035EKs2InLUhci6HrD0F6ldaEbmwEKz7HrjrHamUpqg0pM1kyrD3dxE+Ykb4mB3ho2nYaI5shQXhg3MRPmyGfGY5+OCHlFKuv+UUKY8nLR/8iFCZBaH9VoKN+glr11BK41KyZTkI7poBuaook8vCcFvypRIEts1EYLcdgRILAjttkLbOhlQ0C4EdiXEOrTlozxyEjhQaLsY0Nbjq7yE67IC00Qxps5VAZOvJxeNbET61HdKG+fCvyYK/MBv+1TMQa66ZcDkjIf/los02OmSBf62DDs2DtGkxVZCWxKy/G5HrZ+gHe6G8eWqoeWPp6SpGPl0O74JpGFuSBR/ZaHWVdiiuxTjW0o/QxeY0laEEDZeiksoEJYvTjTXeQfRkOeSG2mQ+CJ0XzOVBvGtgwk09x4TLqhCGhP1EKTaeXsO/21+PA1e1iVfOMRx94iT048SjPuyp68GL3l+Aux/MMwTuHqAS9UClOKveEaijbkpu+e/SYynC2x1uZB16gWXn2zA8JqO2043d9X2AxwnF/R3scwf4QE+SlH/rBet6TS/Q+NRLERPuDoyGUUHqVlxox6svXri8Mtp+kO+RAFQ5RCk1nCRQRwbpdZI0KNHMj4M+hr0/g8YY/UcM/wD4fYcC4gOWgAAAAABJRU5ErkJggg==","aspectRatio":1,"src":"/static/7fa6bee9d2080bd021828c70f67a4720/7c0ed/sphtech.png","srcSet":"/static/7fa6bee9d2080bd021828c70f67a4720/09f8c/sphtech.png 50w,\n/static/7fa6bee9d2080bd021828c70f67a4720/bf65b/sphtech.png 100w,\n/static/7fa6bee9d2080bd021828c70f67a4720/7c0ed/sphtech.png 200w,\n/static/7fa6bee9d2080bd021828c70f67a4720/fdbb0/sphtech.png 300w,\n/static/7fa6bee9d2080bd021828c70f67a4720/647de/sphtech.png 400w,\n/static/7fa6bee9d2080bd021828c70f67a4720/cff51/sphtech.png 640w","sizes":"(max-width: 200px) 100vw, 200px"}}}},"allMarkdownRemark":{"edges":[{"node":{"excerpt":"Mr Martin Fowler was one of the founding members of the Agile Manifesto, author of many books including my favourite Refactoring (1st…","timeToRead":4,"frontmatter":{"title":"XConf Review - Economics of Software Quality","tags":["Review"],"date":"2019-04-29T12:46:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAMABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAMEBf/EABUBAQEAAAAAAAAAAAAAAAAAAAEC/9oADAMBAAIQAxAAAAGJ0yCtYUS//8QAGxAAAgIDAQAAAAAAAAAAAAAAAQIAAxESEyH/2gAIAQEAAQUCcLpxqlVqpWh2mfOYE//EABYRAQEBAAAAAAAAAAAAAAAAAAABEf/aAAgBAwEBPwGsf//EABYRAQEBAAAAAAAAAAAAAAAAAAABEf/aAAgBAgEBPwGVr//EAB0QAAMAAAcAAAAAAAAAAAAAAAABERASISJxgZH/2gAIAQEABj8Cqeot17Esq8JBc4f/xAAaEAEAAwEBAQAAAAAAAAAAAAABABEhQVEx/9oACAEBAAE/Ia5FjR9iHQmwq0fdyhYfTezbURbavdn/2gAMAwEAAgADAAAAEJAP/8QAFxEBAQEBAAAAAAAAAAAAAAAAAREAUf/aAAgBAwEBPxAVG6Ob/8QAGBEAAgMAAAAAAAAAAAAAAAAAAAERMUH/2gAIAQIBAT8QUrRPD//EABwQAQACAgMBAAAAAAAAAAAAAAEAESExQXGhkf/aAAgBAQABPxBKPijxjqFgV4E15Di4tQT2yytaAmA3g+SylgjXFET1otnWJ//Z","aspectRatio":1.696969696969697,"src":"/static/4eba5c89024d95c479a7a9ee73e9ac18/3dc2b/IMG__0303.jpg","srcSet":"/static/4eba5c89024d95c479a7a9ee73e9ac18/f8f18/IMG__0303.jpg 930w,\n/static/4eba5c89024d95c479a7a9ee73e9ac18/3dc2b/IMG__0303.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/xconf-economics-of-software-quality/"}}},{"node":{"excerpt":"We developed a News Tablet application for the Samsung Knox recently, and we are able to institute the various good engineering practices…","timeToRead":6,"frontmatter":{"title":"Revitalizing our engineering - Engineering 2.0","tags":[],"date":"2019-03-12T14:00:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAQBAgMF/8QAFgEBAQEAAAAAAAAAAAAAAAAAAgED/9oADAMBAAIQAxAAAAHa/IbjgWMn/8QAHBAAAwABBQAAAAAAAAAAAAAAAQIDEwAEERIU/9oACAEBAAEFAgiMfONPHhs5LS3B72qcv//EABYRAQEBAAAAAAAAAAAAAAAAAAABEf/aAAgBAwEBPwGNj//EABcRAAMBAAAAAAAAAAAAAAAAAAABAiH/2gAIAQIBAT8Bps0//8QAGBABAQEBAQAAAAAAAAAAAAAAAQARECH/2gAIAQEABj8CzmWrGrPrf//EABkQAQEBAQEBAAAAAAAAAAAAABEBADFBUf/aAAgBAQABPyEO6ezPyOWGsOpmACfuCwnf/9oADAMBAAIAAwAAABBA3//EABcRAAMBAAAAAAAAAAAAAAAAAAABETH/2gAIAQMBAT8QmkdR/8QAFhEBAQEAAAAAAAAAAAAAAAAAEQAB/9oACAECAQE/ED2PG//EABoQAQEBAAMBAAAAAAAAAAAAAAERACExQXH/2gAIAQEAAT8Q5hISiCfR5xeVaWEnkM+D1NSZrywMwqmEFfN//9k=","aspectRatio":1.3333333333333333,"src":"/static/2ecbc0836b73436a052109efa9ccde4e/3dc2b/william-warby-1357858-unsplash-1.jpg","srcSet":"/static/2ecbc0836b73436a052109efa9ccde4e/f8f18/william-warby-1357858-unsplash-1.jpg 930w,\n/static/2ecbc0836b73436a052109efa9ccde4e/3dc2b/william-warby-1357858-unsplash-1.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/revitalizing-our-engineering/"}}},{"node":{"excerpt":"This is the beginning of an exciting era for our SPHTech team!Over here, you will get to read about our learnings and reviews of the new…","timeToRead":1,"frontmatter":{"title":"About Us","tags":[],"date":"2019-01-01T23:46:37.131Z","draft":false,"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAIEBf/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAGuZFjMNEX/xAAdEAEAAQMFAAAAAAAAAAAAAAACAAEDBBAREhMh/9oACAEBAAEFAqk73admiQMNvhDjef/EABURAQEAAAAAAAAAAAAAAAAAABAR/9oACAEDAQE/AYf/xAAVEQEBAAAAAAAAAAAAAAAAAAAQEf/aAAgBAgEBPwGn/8QAHhAAAQMEAwAAAAAAAAAAAAAAAQACERASITEiMqH/2gAIAQEABj8CuZiUJOhNBvKc67iRC7+L/8QAGxAAAwEBAAMAAAAAAAAAAAAAAAERIUExUZH/2gAIAQEAAT8hXdlJvRVr82FbLNeeRv6zEU2luHoB/9oADAMBAAIAAwAAABCbz//EABYRAQEBAAAAAAAAAAAAAAAAAAARIf/aAAgBAwEBPxCq1//EABURAQEAAAAAAAAAAAAAAAAAABAx/9oACAECAQE/EIP/xAAdEAEAAwACAwEAAAAAAAAAAAABABEhMUFhgaGx/9oACAEBAAE/EGQtNWliantl6rW3JQv7Ft0sdQkrFDejvYtC2gI4vfMdTuuls+z/2Q==","aspectRatio":1.3333333333333333,"src":"/static/e26b6c56a85123d553d70dcd1ce2285a/3dc2b/cafe-ppl-collab.jpg","srcSet":"/static/e26b6c56a85123d553d70dcd1ce2285a/f8f18/cafe-ppl-collab.jpg 930w,\n/static/e26b6c56a85123d553d70dcd1ce2285a/3dc2b/cafe-ppl-collab.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"fields":{"layout":"postnodate","slug":"/about-us/"}}},{"node":{"excerpt":"Rod Michael, director of global market access strategy and channels at Rockwell Automation, famously said, “If you automate a mess, you get…","timeToRead":3,"frontmatter":{"title":"The developer's role in a successful implementation of the test automation","tags":["Testing"],"date":"2018-12-06T12:54:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAACiElEQVQoz02SS0hUURjHZ9WqoE0RbcJFRUWBROuKCKqNFY1iD2yRo5ELicqoSBOMMGSsQHpDlBbVooYwhKgcSU3thUo048C0cJh7ve9zn/P6950zjnThz3fvuYff9z//74TiI8OIj05ibHwKo6RP8XGMTXxHOpXE1+kkfqVlqHIWiqKSFKTTaczNzQklEgkkk0mkUqklhTbuasaKzbVYs/0EVlUfR2jtfhxoaEcxn4PvewBKKJVKKBaLQvydK5fLgTEGx3FQKBTEGq+hzt7nONP+EFd7X+BC9zO0XHuEewNDCJiFwPXhuR5c10U+n18C88q/+eP7vnBuGIZYCyX//MTv2UnMzEwiMTuBv4kfkDJp6AsKtKwMXWVQNQOKpoPZtnD2P5A7nJ+fhyRJ4l/o8/t+vOmP4nqkBq9vX8bgqz5MfRkC002YBLUtBw45ZbYDj9xUnFbA3H0mk4Esy2WHE8Mx3L/VgTtnG/Gg6xJiL+9i+lscjmHCok2MjhO4ATzPg20zAeJPxSEHZrNZcWwBHPswgG1b1qGtO4qGxiZEz9cjNTuCIMjDWliAKcmwDQqfHDJmE9gX4VfAvBF3p6pqGXix4ylWb2jGjr1dqN7diaqtrejti5UDp4EwgtrU3WeOGJBDLoPFo1fEG/BhiSnvPBLDsqpBLF//Fis3vaNrE8PJcx8JVyQXBWiKBkXiU3RhMA+qacOiTHO5vJhwEJTj4FU4bOt6gnCkB/WnexBuuoGDdVcQvflYOORddUWHSkBdc6AaDiSauEbQ3GKG/OimaVK+ttgfikROoa72EI4dDSMcrsHhfXtwpbUFLmVl08U1KB9DlmCqOgxdJ7BKVRMQy7KE+B3kw+HQf+uQ+eTE1QltAAAAAElFTkSuQmCC","aspectRatio":1.8252933507170794,"src":"/static/131b22d7fad4398f72deddd43464e6a3/cd9a9/blog-test-automation.png","srcSet":"/static/131b22d7fad4398f72deddd43464e6a3/4c9af/blog-test-automation.png 930w,\n/static/131b22d7fad4398f72deddd43464e6a3/cd9a9/blog-test-automation.png 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/developers-role-in-test-automation/"}}},{"node":{"excerpt":"On the 21st of November, SPH staff gathered for a cozy SPHTech Meetup session at The Inspiration Hub to learn about Data Privacy efforts in…","timeToRead":1,"frontmatter":{"title":"Towards a Privacy Aware Smart Nation","tags":["Meetup","Review"],"date":"2018-11-29T12:43:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAJABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAEFAgT/xAAVAQEBAAAAAAAAAAAAAAAAAAABAv/aAAwDAQACEAMQAAAB053bCyYWf//EABsQAQEAAQUAAAAAAAAAAAAAAAECAAMEETFD/9oACAEBAAEFAm5ETmN0SanXkZ//xAAWEQADAAAAAAAAAAAAAAAAAAACEBP/2gAIAQMBAT8BmK//xAAWEQADAAAAAAAAAAAAAAAAAAABEBL/2gAIAQIBAT8Bsr//xAAdEAACAgEFAAAAAAAAAAAAAAAAAQIRIgMhMVFx/9oACAEBAAY/AlhsPC1dIpx46IGmP0//xAAZEAEBAQEBAQAAAAAAAAAAAAABABExkaH/2gAIAQEAAT8h5JXdYTvtDIM+p9zM9V//2gAMAwEAAgADAAAAED/v/8QAFxEBAQEBAAAAAAAAAAAAAAAAAQAhEf/aAAgBAwEBPxBDebDf/8QAFxEBAQEBAAAAAAAAAAAAAAAAAQAhYf/aAAgBAgEBPxDE7Jf/xAAeEAEAAQMFAQAAAAAAAAAAAAABABEhMRBBUZGhsf/aAAgBAQABPxByuAIDK1Q3gs3CANhxD6tQMee610h6X4z3J//Z","aspectRatio":2.130492676431425,"src":"/static/ef473fd608a488e0579a6ab7fe528337/989b1/sphtech-meetup-ncript.jpg","srcSet":"/static/ef473fd608a488e0579a6ab7fe528337/f8f18/sphtech-meetup-ncript.jpg 930w,\n/static/ef473fd608a488e0579a6ab7fe528337/989b1/sphtech-meetup-ncript.jpg 1600w","sizes":"(max-width: 1600px) 100vw, 1600px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/towards-a-privacy-aware-smart-nation/"}}},{"node":{"excerpt":"Containerization has been one of the most talk about topics in the digital world. It enabled a whole new paradigm shift in getting software…","timeToRead":2,"frontmatter":{"title":"Docker workshop in SPH","tags":["Docker"],"date":"2018-11-27T11:06:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAQBAgMF/8QAFgEBAQEAAAAAAAAAAAAAAAAAAQAC/9oADAMBAAIQAxAAAAHSOfXC0Lkf/8QAGBABAAMBAAAAAAAAAAAAAAAAAgABEhH/2gAIAQEAAQUCOLjJ5m4moTbOan//xAAWEQEBAQAAAAAAAAAAAAAAAAAAARL/2gAIAQMBAT8BZr//xAAXEQEAAwAAAAAAAAAAAAAAAAAAARIh/9oACAECAQE/AcWh/8QAGxAAAgIDAQAAAAAAAAAAAAAAAAERIQIiMkH/2gAIAQEABj8Ci5Nc0zpFPwtwdM//xAAbEAEBAQADAQEAAAAAAAAAAAABEQAhMUFx4f/aAAgBAQABPyEl3QNMM0vR81rOLjQlC9jIEfoufyN//9oADAMBAAIAAwAAABCAL//EABgRAAIDAAAAAAAAAAAAAAAAAAABESFh/9oACAEDAQE/EIbpGh//xAAYEQACAwAAAAAAAAAAAAAAAAAAAREhYf/aAAgBAgEBPxCUVmJ//8QAGxABAQACAwEAAAAAAAAAAAAAAREAITFBUWH/2gAIAQEAAT8QbJCQCVvU+YydZkj3BMNVBNOVRsBAXfyZuoUFFzxTBMS8DH//2Q==","aspectRatio":1.3333333333333333,"src":"/static/67c833d51f70a35acd4074e27a1b9a26/3dc2b/IMG_9175-1.jpg","srcSet":"/static/67c833d51f70a35acd4074e27a1b9a26/f8f18/IMG_9175-1.jpg 930w,\n/static/67c833d51f70a35acd4074e27a1b9a26/3dc2b/IMG_9175-1.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/docker-workshop-in-sph/"}}},{"node":{"excerpt":"A class is an observable live data that can be used to send events from ViewModel to View in Android MVVM-styled designs.This link…","timeToRead":4,"frontmatter":{"title":"Using Mockito's ArgumentCaptor on SingleLiveEvent","tags":["Android","Testing","Tutorial"],"date":"2018-10-10T17:21:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAgADBf/EABcBAAMBAAAAAAAAAAAAAAAAAAABAgP/2gAMAwEAAhADEAAAAU+M2Gxqz//EABkQAQEAAwEAAAAAAAAAAAAAAAIBAAMEEf/aAAgBAQABBQLQIl0GiQ3wqzHsSmf/xAAWEQEBAQAAAAAAAAAAAAAAAAARAAH/2gAIAQMBAT8BwJv/xAAWEQEBAQAAAAAAAAAAAAAAAAAAESH/2gAIAQIBAT8B1H//xAAcEAACAgIDAAAAAAAAAAAAAAAAASFBAxARQlL/2gAIAQEABj8CycrsNrzZRBOv/8QAHBABAAEEAwAAAAAAAAAAAAAAAQAQESFhMZGh/9oACAEBAAE/Ic7lodhS47RAT1OVOdwQJbbp/9oADAMBAAIAAwAAABBwH//EABcRAQADAAAAAAAAAAAAAAAAAAABETH/2gAIAQMBAT8Q1Ss//8QAFhEAAwAAAAAAAAAAAAAAAAAAARAh/9oACAECAQE/EDSf/8QAGxABAQADAQEBAAAAAAAAAAAAAREAITFRQXH/2gAIAQEAAT8QnlojNn4/MQFk9hRx777jIQnJxujdmMrgpzi1i1uf/9k=","aspectRatio":1.5005359056806002,"src":"/static/7c9ee95dd61b5588277447a33ccd293c/3dc2b/code-sunshine.jpg","srcSet":"/static/7c9ee95dd61b5588277447a33ccd293c/f8f18/code-sunshine.jpg 930w,\n/static/7c9ee95dd61b5588277447a33ccd293c/3dc2b/code-sunshine.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/using-mockitos-argumentcaptor/"}}},{"node":{"excerpt":"TL;DR Does asking users for feedback and ratings help in your app? Yes!When I joined Singapore Press Holdings in late 2015, most of the apps…","timeToRead":3,"frontmatter":{"title":"How to get your mobile app users to give you ratings and feedback!","tags":["Android"],"date":"2018-10-07T23:10:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAIAAAA7N+mxAAAACXBIWXMAAAsSAAALEgHS3X78AAABo0lEQVQoz2WRWW/TQBSF/c954kcgJErFA+ob8NBKhCVSaSsEArElJG3tZqkdjz2JZ+zZN+5MWoHEkT26tu935txx5pOcs7D4dAcfqGTHNxcvr8cv8ouPm5kzxqWvUsphGJzbQz7TWncdUUoj1HDOA8gHqfC8ev6rGq26dcso9IQkxhjA4V5Z8qNCYkKxMTaxwfWVRz9jZZzTVps7GEjghVI2JgkZvLLOaM2s0w7Sg4F3itJ+uVJaq3tZaxPcS6X+7lyjGmMshNTa7PtgMMDA6e5RKfAG0zYKN3V19Hnx4Hj26EOeQSsBUQJF+EdwdvsRQGjQiHLS7VqM2waNp7cH5/m7Ocogj4txwRoSG2h9Nh+flRMolIZtIYZkQgyCxyHgMsp7u7eNsA2euTiSSevDT4dPJ6+3QnFtwn/yKYwBCn6VNa7sFmf5qOPbTVd2TCxWj78WTw5/HJwUb98vT0eL0+/t9M3y/KQYf6m+HU1eTdFvqeOxZcqYpr3hXbHZrWtSlttbMeSKXqohJ/11Sy5rcrXaXlUkr/Cs7YtmN8X9mpt4QH8Ad7k0jshkD1kAAAAASUVORK5CYII=","aspectRatio":2.074786324786325,"src":"/static/4d42232e07032296408b0a75d8f9815e/a83d1/zaobao-app-chart1.png","srcSet":"/static/4d42232e07032296408b0a75d8f9815e/4c9af/zaobao-app-chart1.png 930w,\n/static/4d42232e07032296408b0a75d8f9815e/a83d1/zaobao-app-chart1.png 971w","sizes":"(max-width: 971px) 100vw, 971px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/get-your-app-users-to-give-feedback/"}}},{"node":{"excerpt":"This was the second Developers Gym session organized by Thoughtworks, of which we were honoured to play host to. The coding dojo, formulated…","timeToRead":2,"frontmatter":{"title":"Developers Gym by Thoughtworks - 14 July","tags":["Meetup","Reviews"],"date":"2018-07-25T14:25:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAABAADBf/EABUBAQEAAAAAAAAAAAAAAAAAAAEA/9oADAMBAAIQAxAAAAFBg5F0Ycn/xAAZEAADAQEBAAAAAAAAAAAAAAAAARICAxP/2gAIAQEAAQUC88RpKp2b6Muikj//xAAWEQEBAQAAAAAAAAAAAAAAAAAAARH/2gAIAQMBAT8BZX//xAAWEQEBAQAAAAAAAAAAAAAAAAAAARH/2gAIAQIBAT8BjY//xAAcEAACAgIDAAAAAAAAAAAAAAAAARExAiESQXH/2gAIAQEABj8C5THo1i1otF6KOz//xAAdEAACAgIDAQAAAAAAAAAAAAAAAREhMUFRYYGh/9oACAEBAAE/IXBpbgTKVtySYg6Ki8xM1pmaowl9n//aAAwDAQACAAMAAAAQoA//xAAXEQADAQAAAAAAAAAAAAAAAAAAASFh/9oACAEDAQE/EHVGbn//xAAXEQEBAQEAAAAAAAAAAAAAAAABABFh/9oACAECAQE/EEZqXC//xAAcEAEAAgIDAQAAAAAAAAAAAAABABEhMUFhcVH/2gAIAQEAAT8QGhkCBsvx3AVpM2ixeMzYf0WSkaQrsF8QpXaeLg+ErhYbNDqf/9k=","aspectRatio":1.3333333333333333,"src":"/static/9f96e81e6f6d55da468755a49a4b0666/3dc2b/IMG_8071.jpg","srcSet":"/static/9f96e81e6f6d55da468755a49a4b0666/f8f18/IMG_8071.jpg 930w,\n/static/9f96e81e6f6d55da468755a49a4b0666/3dc2b/IMG_8071.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/developers-gym-by-thoughtworks-14-july/"}}},{"node":{"excerpt":"It was our great pleasure to have invited Mr Steven Koh, the Deputy Director of Government Digital Services (GDS) at Govtech, to update us…","timeToRead":3,"frontmatter":{"title":"Updates to Govtech Agile Practices by Steven Koh - 2 July","tags":["Meetup"],"date":"2018-07-18T17:50:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAABAACBf/EABYBAQEBAAAAAAAAAAAAAAAAAAIAAf/aAAwDAQACEAMQAAABZzh6OLgyv//EABwQAAIBBQEAAAAAAAAAAAAAAAECAwAREhMxQf/aAAgBAQABBQJtITwRlqbls2eUhv/EABYRAAMAAAAAAAAAAAAAAAAAAAABEf/aAAgBAwEBPwFqkP/EABURAQEAAAAAAAAAAAAAAAAAAAEQ/9oACAECAQE/ARJ//8QAHBAAAgICAwAAAAAAAAAAAAAAAAECESExEiIy/9oACAEBAAY/ApNS0dnxPQ87LTwOj//EABoQAAIDAQEAAAAAAAAAAAAAAAERACExQVH/2gAIAQEAAT8hsI8g5G21q4MYOMQGmoCwNG4Escn/2gAMAwEAAgADAAAAEP8AD//EABYRAAMAAAAAAAAAAAAAAAAAAAEQQf/aAAgBAwEBPxCAr//EABcRAQADAAAAAAAAAAAAAAAAAAABETH/2gAIAQIBAT8Qhat//8QAGhAAAwEBAQEAAAAAAAAAAAAAAREhADFBsf/aAAgBAQABPxBl5yWG8GJujIADqfnNA21SvuiI6OdbA0bJgUoL4MagESyDDd3/2Q==","aspectRatio":1.3333333333333333,"src":"/static/8d8fee52f47c44485daff296b0c76794/3dc2b/meetup-speaker.jpg","srcSet":"/static/8d8fee52f47c44485daff296b0c76794/f8f18/meetup-speaker.jpg 930w,\n/static/8d8fee52f47c44485daff296b0c76794/3dc2b/meetup-speaker.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/updates-to-govtech-agile-practices/"}}},{"node":{"excerpt":"IntroductionNews media companies like Singapore Press Holdings (SPH) continue to be faced with rapidly accelerating technology innovation…","timeToRead":3,"frontmatter":{"title":"AI in News Media","tags":[],"date":"2018-07-12T22:46:00.000Z","draft":false,"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAIEAQP/xAAVAQEBAAAAAAAAAAAAAAAAAAABAv/aAAwDAQACEAMQAAABbnkrNAwn/8QAHBABAAEEAwAAAAAAAAAAAAAAAQACAxESEyEi/9oACAEBAAEFAsLGnvhuTKVL6trr/8QAFxEAAwEAAAAAAAAAAAAAAAAAAAEREv/aAAgBAwEBPwHKIj//xAAXEQEAAwAAAAAAAAAAAAAAAAAAAREh/9oACAECAQE/Ablr/8QAGhAAAgIDAAAAAAAAAAAAAAAAABABITEy8P/aAAgBAQAGPwJayV1rJ//EABsQAAMAAgMAAAAAAAAAAAAAAAABESExQWGB/9oACAEBAAE/IaHM9j2KZRS6mkHc3sbyZ+n/2gAMAwEAAgADAAAAEJvf/8QAFhEBAQEAAAAAAAAAAAAAAAAAABFB/9oACAEDAQE/EHHH/8QAFxEAAwEAAAAAAAAAAAAAAAAAAAERQf/aAAgBAgEBPxBFX0//xAAdEAEBAAMAAgMAAAAAAAAAAAABEQAhMUFRYXGh/9oACAEBAAE/EI4MDolZ4mCAJTthy4toHwXFAiuj0y/hiQMnbf3nFcwq5DP/2Q==","aspectRatio":1.8741633199464525,"src":"/static/9bea42284114acb5ba9e14a5fe42867c/3dc2b/INMANews-ArtificialIntelligence-1800.jpg","srcSet":"/static/9bea42284114acb5ba9e14a5fe42867c/f8f18/INMANews-ArtificialIntelligence-1800.jpg 930w,\n/static/9bea42284114acb5ba9e14a5fe42867c/3dc2b/INMANews-ArtificialIntelligence-1800.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/ai-in-news-media/"}}},{"node":{"excerpt":"Hi all! It has been a while since some of us have gone for the Scrum training by Mr Stuart, building balloon animal zoos to learn what is…","timeToRead":3,"frontmatter":{"title":"Video Review - Carousell Level-Up: Applying Scrum for Better Delivery","tags":["Review","Meetup"],"date":"2018-02-05T07:53:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAA7DAAAOwwHHb6hkAAACqklEQVQozwGfAmD9ADEVFzklJjolJzceITslJTchIjwpLDolKDglJTYhITsmJj4qKzkiJDspKTYoKDYpKiwaG0AyMj8xMi4ZGgCoNTmrQkWqOD2pPEGpOT2pLDGqMziqLzSoJiqpJSmqJyurKCypIyirLjKbTEt8KCpoHSBvLTFzLTF2LTEAyzQ5zUVJzT9DzDxAzD9FzUZKykNIy0JHyjo/yTk+yjo/yjtAyztAzDpB0IJ+u25rpVZYmFRVo2ZnrHV1ANZCR9x2edhqbthcYNpqbdltcdlhZdtobNtobNtgZN1nbNliZthtcdZPVNx1adJXSsKIfqFoYq9ER6xERwDXR0vXaGzXa2/YaW3XZWrbfH/Yf4PajI/Yd3vGaWzGZ2rXcHTagITabXLcVkPROCaUW0+KQz+4Hh+tIyYA1UNH12dq1mNo2Gxx2Wxw8sXH56+x4pOVyIaJXFVVTUpKyIqL99LS6KWn3U89WiUnFR4vISxFWx0ovjk3ANMyN9M4PdI3PdM6P9M5PtI5PtI8QtU4PswrMZ8qL5kpLcstMtUrMdc+QthdTFFESi4zQh0nNltDRcJHRwDSNTrURkvURkrUS07TTVHURUnUSEzTQUbUOD7bPUPaO0HTLTPSJCvVQkXaXEmadXBEPj5HPjypamLAS00A0Ds/z0ZLzzxB0D1CzTg8zzY6zjpAz0FFzUFGzkRJz0NJzjQ6zyYr0kdK20k4Xx8gAAQPBAcNdRAUwU1PAOM5P+FITuNMUuNQVeJFTOI8QuIzOeJCR+JVWuRaX+NVWuNCSOMqMOZNUdhFPolxdUhpcUZpcY07QMpOUQCLGx+LHCCKIiaKIiWKJCeLIyeLHSGLHCGLIiaLIyeJISWKHCCKHCCLKCyJOjx+TE5vTlFsVlp0REaBQEJqGgpHmAn0+wAAAABJRU5ErkJggg==","aspectRatio":1.7793696275071633,"src":"/static/dbb7bd9058838337f25ad9090b348997/748f9/scrum-video-intro.png","srcSet":"/static/dbb7bd9058838337f25ad9090b348997/748f9/scrum-video-intro.png 621w","sizes":"(max-width: 621px) 100vw, 621px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/video-review-carousell-level-up/"}}}]}},"pageContext":{"isCreatedByStatefulCreatePages":false,"author":"SPHTech"}}} \ No newline at end of file +{"componentChunkName":"component---src-templates-author-tsx","path":"/author/sph-tech/","webpackCompilationHash":"4d127609ee78b8f0aee7","result":{"data":{"authorYaml":{"id":"SPHTech","website":null,"twitter":null,"bio":null,"facebook":null,"location":null,"profile_image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAMEAQX/xAAWAQEBAQAAAAAAAAAAAAAAAAABAgP/2gAMAwEAAhADEAAAAeM6TazeTg//xAAYEAADAQEAAAAAAAAAAAAAAAAAAQIREv/aAAgBAQABBQJSZJUrdOmN6//EABgRAAIDAAAAAAAAAAAAAAAAAAABAhES/9oACAEDAQE/AXGzLP/EABURAQEAAAAAAAAAAAAAAAAAAAAR/9oACAECAQE/Aar/xAAWEAEBAQAAAAAAAAAAAAAAAAAxACD/2gAIAQEABj8CZnH/xAAaEAEAAwADAAAAAAAAAAAAAAABABExECFx/9oACAEBAAE/IQNEKOxMEPkGZwLYz//aAAwDAQACAAMAAAAQj+//xAAXEQEBAQEAAAAAAAAAAAAAAAABADFB/9oACAEDAQE/EH6gDb//xAAWEQEBAQAAAAAAAAAAAAAAAAARADH/2gAIAQIBAT8QJkL/xAAZEAEBAQEBAQAAAAAAAAAAAAABESEAMVH/2gAIAQEAAT8QlQUuvEaGfXrkrNGcWkb7hwQlNJ5z6Vfnf//Z","aspectRatio":1.5,"src":"/static/c2756fa06c84564e79951c785c6a316b/45a11/alex-knight-326705-unsplash.jpg","srcSet":"/static/c2756fa06c84564e79951c785c6a316b/f8f18/alex-knight-326705-unsplash.jpg 930w,\n/static/c2756fa06c84564e79951c785c6a316b/0e6ff/alex-knight-326705-unsplash.jpg 1860w,\n/static/c2756fa06c84564e79951c785c6a316b/45a11/alex-knight-326705-unsplash.jpg 3720w,\n/static/c2756fa06c84564e79951c785c6a316b/ad7c9/alex-knight-326705-unsplash.jpg 4896w","sizes":"(max-width: 3720px) 100vw, 3720px"}}},"avatar":{"childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAADQElEQVQ4y5VUW0tUURSeX9BDhFZQ1Nx0lCAqI+o1KMiHoqjIesisXiLSQOhiRUWUdKEwKqKHtNIyJLuY0UWS0lBKM8mcrEadcnIc58zlzMyZvc/+WjNnRs+xIWjDd9a+fudba6+1TaAmhEDaCqESONItOZewCUitgK8JIu7TxrQXqbV0M00lSzd1LAgRiU5u/3oAaJ0NQcC7RYC/LXWOJz6ThHoVyX74GynpRKTuLZjTo815SNWzbIjuEsD7EqJjHUT7KoNnBoVpZer3G+DN+eBNNvD2Egh5BCLqAW9ZCf7YDBF0agTjXbRnAbkezESYikPIBfYgH+y+BawhD6x+LtjDAsJSxOutiN+zgPechWAyeNs+sNZiXagyEKq+Xig1dii386DcyiU4oFRbodwk1CT6dq1fnQv2vJiUj6cIVYNKk55dadyC6PnpiF3LRfRqziSu2Ak0d9mC2I0C6JtQVYNSk+Evsg9K035EKs2InLUhci6HrD0F6ldaEbmwEKz7HrjrHamUpqg0pM1kyrD3dxE+Ykb4mB3ho2nYaI5shQXhg3MRPmyGfGY5+OCHlFKuv+UUKY8nLR/8iFCZBaH9VoKN+glr11BK41KyZTkI7poBuaook8vCcFvypRIEts1EYLcdgRILAjttkLbOhlQ0C4EdiXEOrTlozxyEjhQaLsY0Nbjq7yE67IC00Qxps5VAZOvJxeNbET61HdKG+fCvyYK/MBv+1TMQa66ZcDkjIf/los02OmSBf62DDs2DtGkxVZCWxKy/G5HrZ+gHe6G8eWqoeWPp6SpGPl0O74JpGFuSBR/ZaHWVdiiuxTjW0o/QxeY0laEEDZeiksoEJYvTjTXeQfRkOeSG2mQ+CJ0XzOVBvGtgwk09x4TLqhCGhP1EKTaeXsO/21+PA1e1iVfOMRx94iT048SjPuyp68GL3l+Aux/MMwTuHqAS9UClOKveEaijbkpu+e/SYynC2x1uZB16gWXn2zA8JqO2043d9X2AxwnF/R3scwf4QE+SlH/rBet6TS/Q+NRLERPuDoyGUUHqVlxox6svXri8Mtp+kO+RAFQ5RCk1nCRQRwbpdZI0KNHMj4M+hr0/g8YY/UcM/wD4fYcC4gOWgAAAAABJRU5ErkJggg==","aspectRatio":1,"src":"/static/7fa6bee9d2080bd021828c70f67a4720/7c0ed/sphtech.png","srcSet":"/static/7fa6bee9d2080bd021828c70f67a4720/09f8c/sphtech.png 50w,\n/static/7fa6bee9d2080bd021828c70f67a4720/bf65b/sphtech.png 100w,\n/static/7fa6bee9d2080bd021828c70f67a4720/7c0ed/sphtech.png 200w,\n/static/7fa6bee9d2080bd021828c70f67a4720/fdbb0/sphtech.png 300w,\n/static/7fa6bee9d2080bd021828c70f67a4720/647de/sphtech.png 400w,\n/static/7fa6bee9d2080bd021828c70f67a4720/cff51/sphtech.png 640w","sizes":"(max-width: 200px) 100vw, 200px"}}}},"allMarkdownRemark":{"edges":[{"node":{"excerpt":"Mr Martin Fowler was one of the founding members of the Agile Manifesto, author of many books including my favourite Refactoring (1st…","timeToRead":4,"frontmatter":{"title":"XConf Review - Economics of Software Quality","tags":["Review"],"date":"2019-04-29T12:46:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAMABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAMEBf/EABUBAQEAAAAAAAAAAAAAAAAAAAEC/9oADAMBAAIQAxAAAAGJ0yCtYUS//8QAGxAAAgIDAQAAAAAAAAAAAAAAAQIAAxESEyH/2gAIAQEAAQUCcLpxqlVqpWh2mfOYE//EABYRAQEBAAAAAAAAAAAAAAAAAAABEf/aAAgBAwEBPwGsf//EABYRAQEBAAAAAAAAAAAAAAAAAAABEf/aAAgBAgEBPwGVr//EAB0QAAMAAAcAAAAAAAAAAAAAAAABERASISJxgZH/2gAIAQEABj8Cqeot17Esq8JBc4f/xAAaEAEAAwEBAQAAAAAAAAAAAAABABEhQVEx/9oACAEBAAE/Ia5FjR9iHQmwq0fdyhYfTezbURbavdn/2gAMAwEAAgADAAAAEJAP/8QAFxEBAQEBAAAAAAAAAAAAAAAAAREAUf/aAAgBAwEBPxAVG6Ob/8QAGBEAAgMAAAAAAAAAAAAAAAAAAAERMUH/2gAIAQIBAT8QUrRPD//EABwQAQACAgMBAAAAAAAAAAAAAAEAESExQXGhkf/aAAgBAQABPxBKPijxjqFgV4E15Di4tQT2yytaAmA3g+SylgjXFET1otnWJ//Z","aspectRatio":1.696969696969697,"src":"/static/4eba5c89024d95c479a7a9ee73e9ac18/3dc2b/IMG__0303.jpg","srcSet":"/static/4eba5c89024d95c479a7a9ee73e9ac18/f8f18/IMG__0303.jpg 930w,\n/static/4eba5c89024d95c479a7a9ee73e9ac18/3dc2b/IMG__0303.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/xconf-economics-of-software-quality/"}}},{"node":{"excerpt":"We developed a News Tablet application for the Samsung Knox recently, and we are able to institute the various good engineering practices…","timeToRead":6,"frontmatter":{"title":"Revitalizing our engineering - Engineering 2.0","tags":[],"date":"2019-03-12T14:00:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAQBAgMF/8QAFgEBAQEAAAAAAAAAAAAAAAAAAgED/9oADAMBAAIQAxAAAAHa/IbjgWMn/8QAHBAAAwABBQAAAAAAAAAAAAAAAQIDEwAEERIU/9oACAEBAAEFAgiMfONPHhs5LS3B72qcv//EABYRAQEBAAAAAAAAAAAAAAAAAAABEf/aAAgBAwEBPwGNj//EABcRAAMBAAAAAAAAAAAAAAAAAAABAiH/2gAIAQIBAT8Bps0//8QAGBABAQEBAQAAAAAAAAAAAAAAAQARECH/2gAIAQEABj8CzmWrGrPrf//EABkQAQEBAQEBAAAAAAAAAAAAABEBADFBUf/aAAgBAQABPyEO6ezPyOWGsOpmACfuCwnf/9oADAMBAAIAAwAAABBA3//EABcRAAMBAAAAAAAAAAAAAAAAAAABETH/2gAIAQMBAT8QmkdR/8QAFhEBAQEAAAAAAAAAAAAAAAAAEQAB/9oACAECAQE/ED2PG//EABoQAQEBAAMBAAAAAAAAAAAAAAERACExQXH/2gAIAQEAAT8Q5hISiCfR5xeVaWEnkM+D1NSZrywMwqmEFfN//9k=","aspectRatio":1.3333333333333333,"src":"/static/2ecbc0836b73436a052109efa9ccde4e/3dc2b/william-warby-1357858-unsplash-1.jpg","srcSet":"/static/2ecbc0836b73436a052109efa9ccde4e/f8f18/william-warby-1357858-unsplash-1.jpg 930w,\n/static/2ecbc0836b73436a052109efa9ccde4e/3dc2b/william-warby-1357858-unsplash-1.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/revitalizing-our-engineering/"}}},{"node":{"excerpt":"This is the beginning of an exciting era for our SPHTech team!Over here, you will get to read about our learnings and reviews of the new…","timeToRead":1,"frontmatter":{"title":"About Us","tags":[],"date":"2019-01-01T23:46:37.131Z","draft":false,"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAIEBf/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAGuZFjMNEX/xAAdEAEAAQMFAAAAAAAAAAAAAAACAAEDBBAREhMh/9oACAEBAAEFAqk73admiQMNvhDjef/EABURAQEAAAAAAAAAAAAAAAAAABAR/9oACAEDAQE/AYf/xAAVEQEBAAAAAAAAAAAAAAAAAAAQEf/aAAgBAgEBPwGn/8QAHhAAAQMEAwAAAAAAAAAAAAAAAQACERASITEiMqH/2gAIAQEABj8CuZiUJOhNBvKc67iRC7+L/8QAGxAAAwEBAAMAAAAAAAAAAAAAAAERIUExUZH/2gAIAQEAAT8hXdlJvRVr82FbLNeeRv6zEU2luHoB/9oADAMBAAIAAwAAABCbz//EABYRAQEBAAAAAAAAAAAAAAAAAAARIf/aAAgBAwEBPxCq1//EABURAQEAAAAAAAAAAAAAAAAAABAx/9oACAECAQE/EIP/xAAdEAEAAwACAwEAAAAAAAAAAAABABEhMUFhgaGx/9oACAEBAAE/EGQtNWliantl6rW3JQv7Ft0sdQkrFDejvYtC2gI4vfMdTuuls+z/2Q==","aspectRatio":1.3333333333333333,"src":"/static/e26b6c56a85123d553d70dcd1ce2285a/3dc2b/cafe-ppl-collab.jpg","srcSet":"/static/e26b6c56a85123d553d70dcd1ce2285a/f8f18/cafe-ppl-collab.jpg 930w,\n/static/e26b6c56a85123d553d70dcd1ce2285a/3dc2b/cafe-ppl-collab.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"fields":{"layout":"postnodate","slug":"/about-us/"}}},{"node":{"excerpt":"Rod Michael, director of global market access strategy and channels at Rockwell Automation, famously said, “If you automate a mess, you get…","timeToRead":3,"frontmatter":{"title":"The developer's role in a successful implementation of the test automation","tags":["Testing"],"date":"2018-12-06T12:54:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAACiElEQVQoz02SS0hUURjHZ9WqoE0RbcJFRUWBROuKCKqNFY1iD2yRo5ELicqoSBOMMGSsQHpDlBbVooYwhKgcSU3thUo048C0cJh7ve9zn/P6950zjnThz3fvuYff9z//74TiI8OIj05ibHwKo6RP8XGMTXxHOpXE1+kkfqVlqHIWiqKSFKTTaczNzQklEgkkk0mkUqklhTbuasaKzbVYs/0EVlUfR2jtfhxoaEcxn4PvewBKKJVKKBaLQvydK5fLgTEGx3FQKBTEGq+hzt7nONP+EFd7X+BC9zO0XHuEewNDCJiFwPXhuR5c10U+n18C88q/+eP7vnBuGIZYCyX//MTv2UnMzEwiMTuBv4kfkDJp6AsKtKwMXWVQNQOKpoPZtnD2P5A7nJ+fhyRJ4l/o8/t+vOmP4nqkBq9vX8bgqz5MfRkC002YBLUtBw45ZbYDj9xUnFbA3H0mk4Esy2WHE8Mx3L/VgTtnG/Gg6xJiL+9i+lscjmHCok2MjhO4ATzPg20zAeJPxSEHZrNZcWwBHPswgG1b1qGtO4qGxiZEz9cjNTuCIMjDWliAKcmwDQqfHDJmE9gX4VfAvBF3p6pqGXix4ylWb2jGjr1dqN7diaqtrejti5UDp4EwgtrU3WeOGJBDLoPFo1fEG/BhiSnvPBLDsqpBLF//Fis3vaNrE8PJcx8JVyQXBWiKBkXiU3RhMA+qacOiTHO5vJhwEJTj4FU4bOt6gnCkB/WnexBuuoGDdVcQvflYOORddUWHSkBdc6AaDiSauEbQ3GKG/OimaVK+ttgfikROoa72EI4dDSMcrsHhfXtwpbUFLmVl08U1KB9DlmCqOgxdJ7BKVRMQy7KE+B3kw+HQf+uQ+eTE1QltAAAAAElFTkSuQmCC","aspectRatio":1.8252933507170794,"src":"/static/131b22d7fad4398f72deddd43464e6a3/cd9a9/blog-test-automation.png","srcSet":"/static/131b22d7fad4398f72deddd43464e6a3/4c9af/blog-test-automation.png 930w,\n/static/131b22d7fad4398f72deddd43464e6a3/cd9a9/blog-test-automation.png 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/developers-role-in-test-automation/"}}},{"node":{"excerpt":"On the 21st of November, SPH staff gathered for a cozy SPHTech Meetup session at The Inspiration Hub to learn about Data Privacy efforts in…","timeToRead":1,"frontmatter":{"title":"Towards a Privacy Aware Smart Nation","tags":["Meetup","Review"],"date":"2018-11-29T12:43:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAJABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAEFAgT/xAAVAQEBAAAAAAAAAAAAAAAAAAABAv/aAAwDAQACEAMQAAAB053bCyYWf//EABsQAQEAAQUAAAAAAAAAAAAAAAECAAMEETFD/9oACAEBAAEFAm5ETmN0SanXkZ//xAAWEQADAAAAAAAAAAAAAAAAAAACEBP/2gAIAQMBAT8BmK//xAAWEQADAAAAAAAAAAAAAAAAAAABEBL/2gAIAQIBAT8Bsr//xAAdEAACAgEFAAAAAAAAAAAAAAAAAQIRIgMhMVFx/9oACAEBAAY/AlhsPC1dIpx46IGmP0//xAAZEAEBAQEBAQAAAAAAAAAAAAABABExkaH/2gAIAQEAAT8h5JXdYTvtDIM+p9zM9V//2gAMAwEAAgADAAAAED/v/8QAFxEBAQEBAAAAAAAAAAAAAAAAAQAhEf/aAAgBAwEBPxBDebDf/8QAFxEBAQEBAAAAAAAAAAAAAAAAAQAhYf/aAAgBAgEBPxDE7Jf/xAAeEAEAAQMFAQAAAAAAAAAAAAABABEhMRBBUZGhsf/aAAgBAQABPxByuAIDK1Q3gs3CANhxD6tQMee610h6X4z3J//Z","aspectRatio":2.130492676431425,"src":"/static/ef473fd608a488e0579a6ab7fe528337/989b1/sphtech-meetup-ncript.jpg","srcSet":"/static/ef473fd608a488e0579a6ab7fe528337/f8f18/sphtech-meetup-ncript.jpg 930w,\n/static/ef473fd608a488e0579a6ab7fe528337/989b1/sphtech-meetup-ncript.jpg 1600w","sizes":"(max-width: 1600px) 100vw, 1600px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/towards-a-privacy-aware-smart-nation/"}}},{"node":{"excerpt":"Containerization has been one of the most talk about topics in the digital world. It enabled a whole new paradigm shift in getting software…","timeToRead":2,"frontmatter":{"title":"Docker workshop in SPH","tags":["Docker"],"date":"2018-11-27T11:06:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAQBAgMF/8QAFgEBAQEAAAAAAAAAAAAAAAAAAQAC/9oADAMBAAIQAxAAAAHSOfXC0Lkf/8QAGBABAAMBAAAAAAAAAAAAAAAAAgABEhH/2gAIAQEAAQUCOLjJ5m4moTbOan//xAAWEQEBAQAAAAAAAAAAAAAAAAAAARL/2gAIAQMBAT8BZr//xAAXEQEAAwAAAAAAAAAAAAAAAAAAARIh/9oACAECAQE/AcWh/8QAGxAAAgIDAQAAAAAAAAAAAAAAAAERIQIiMkH/2gAIAQEABj8Ci5Nc0zpFPwtwdM//xAAbEAEBAQADAQEAAAAAAAAAAAABEQAhMUFx4f/aAAgBAQABPyEl3QNMM0vR81rOLjQlC9jIEfoufyN//9oADAMBAAIAAwAAABCAL//EABgRAAIDAAAAAAAAAAAAAAAAAAABESFh/9oACAEDAQE/EIbpGh//xAAYEQACAwAAAAAAAAAAAAAAAAAAAREhYf/aAAgBAgEBPxCUVmJ//8QAGxABAQACAwEAAAAAAAAAAAAAAREAITFBUWH/2gAIAQEAAT8QbJCQCVvU+YydZkj3BMNVBNOVRsBAXfyZuoUFFzxTBMS8DH//2Q==","aspectRatio":1.3333333333333333,"src":"/static/67c833d51f70a35acd4074e27a1b9a26/3dc2b/IMG_9175-1.jpg","srcSet":"/static/67c833d51f70a35acd4074e27a1b9a26/f8f18/IMG_9175-1.jpg 930w,\n/static/67c833d51f70a35acd4074e27a1b9a26/3dc2b/IMG_9175-1.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/docker-workshop-in-sph/"}}},{"node":{"excerpt":"A class is an observable live data that can be used to send events from ViewModel to View in Android MVVM-styled designs.This link…","timeToRead":4,"frontmatter":{"title":"Using Mockito's ArgumentCaptor on SingleLiveEvent","tags":["Android","Testing","Tutorial"],"date":"2018-10-10T17:21:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAgADBf/EABcBAAMBAAAAAAAAAAAAAAAAAAABAgP/2gAMAwEAAhADEAAAAU+M2Gxqz//EABkQAQEAAwEAAAAAAAAAAAAAAAIBAAMEEf/aAAgBAQABBQLQIl0GiQ3wqzHsSmf/xAAWEQEBAQAAAAAAAAAAAAAAAAARAAH/2gAIAQMBAT8BwJv/xAAWEQEBAQAAAAAAAAAAAAAAAAAAESH/2gAIAQIBAT8B1H//xAAcEAACAgIDAAAAAAAAAAAAAAAAASFBAxARQlL/2gAIAQEABj8CycrsNrzZRBOv/8QAHBABAAEEAwAAAAAAAAAAAAAAAQAQESFhMZGh/9oACAEBAAE/Ic7lodhS47RAT1OVOdwQJbbp/9oADAMBAAIAAwAAABBwH//EABcRAQADAAAAAAAAAAAAAAAAAAABETH/2gAIAQMBAT8Q1Ss//8QAFhEAAwAAAAAAAAAAAAAAAAAAARAh/9oACAECAQE/EDSf/8QAGxABAQADAQEBAAAAAAAAAAAAAREAITFRQXH/2gAIAQEAAT8QnlojNn4/MQFk9hRx777jIQnJxujdmMrgpzi1i1uf/9k=","aspectRatio":1.5005359056806002,"src":"/static/7c9ee95dd61b5588277447a33ccd293c/3dc2b/code-sunshine.jpg","srcSet":"/static/7c9ee95dd61b5588277447a33ccd293c/f8f18/code-sunshine.jpg 930w,\n/static/7c9ee95dd61b5588277447a33ccd293c/3dc2b/code-sunshine.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/using-mockitos-argumentcaptor/"}}},{"node":{"excerpt":"TL;DR Does asking users for feedback and ratings help in your app? Yes!When I joined Singapore Press Holdings in late 2015, most of the apps…","timeToRead":3,"frontmatter":{"title":"How to get your mobile app users to give you ratings and feedback!","tags":["Android"],"date":"2018-10-07T23:10:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAIAAAA7N+mxAAAACXBIWXMAAAsSAAALEgHS3X78AAABo0lEQVQoz2WRWW/TQBSF/c954kcgJErFA+ob8NBKhCVSaSsEArElJG3tZqkdjz2JZ+zZN+5MWoHEkT26tu935txx5pOcs7D4dAcfqGTHNxcvr8cv8ouPm5kzxqWvUsphGJzbQz7TWncdUUoj1HDOA8gHqfC8ev6rGq26dcso9IQkxhjA4V5Z8qNCYkKxMTaxwfWVRz9jZZzTVps7GEjghVI2JgkZvLLOaM2s0w7Sg4F3itJ+uVJaq3tZaxPcS6X+7lyjGmMshNTa7PtgMMDA6e5RKfAG0zYKN3V19Hnx4Hj26EOeQSsBUQJF+EdwdvsRQGjQiHLS7VqM2waNp7cH5/m7Ocogj4txwRoSG2h9Nh+flRMolIZtIYZkQgyCxyHgMsp7u7eNsA2euTiSSevDT4dPJ6+3QnFtwn/yKYwBCn6VNa7sFmf5qOPbTVd2TCxWj78WTw5/HJwUb98vT0eL0+/t9M3y/KQYf6m+HU1eTdFvqeOxZcqYpr3hXbHZrWtSlttbMeSKXqohJ/11Sy5rcrXaXlUkr/Cs7YtmN8X9mpt4QH8Ad7k0jshkD1kAAAAASUVORK5CYII=","aspectRatio":2.074786324786325,"src":"/static/4d42232e07032296408b0a75d8f9815e/a83d1/zaobao-app-chart1.png","srcSet":"/static/4d42232e07032296408b0a75d8f9815e/4c9af/zaobao-app-chart1.png 930w,\n/static/4d42232e07032296408b0a75d8f9815e/a83d1/zaobao-app-chart1.png 971w","sizes":"(max-width: 971px) 100vw, 971px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/get-your-app-users-to-give-feedback/"}}},{"node":{"excerpt":"This was the second Developers Gym session organized by Thoughtworks, of which we were honoured to play host to. The coding dojo, formulated…","timeToRead":2,"frontmatter":{"title":"Developers Gym by Thoughtworks - 14 July","tags":["Meetup","Reviews"],"date":"2018-07-25T14:25:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAABAADBf/EABUBAQEAAAAAAAAAAAAAAAAAAAEA/9oADAMBAAIQAxAAAAFBg5F0Ycn/xAAZEAADAQEBAAAAAAAAAAAAAAAAARICAxP/2gAIAQEAAQUC88RpKp2b6Muikj//xAAWEQEBAQAAAAAAAAAAAAAAAAAAARH/2gAIAQMBAT8BZX//xAAWEQEBAQAAAAAAAAAAAAAAAAAAARH/2gAIAQIBAT8BjY//xAAcEAACAgIDAAAAAAAAAAAAAAAAARExAiESQXH/2gAIAQEABj8C5THo1i1otF6KOz//xAAdEAACAgIDAQAAAAAAAAAAAAAAAREhMUFRYYGh/9oACAEBAAE/IXBpbgTKVtySYg6Ki8xM1pmaowl9n//aAAwDAQACAAMAAAAQoA//xAAXEQADAQAAAAAAAAAAAAAAAAAAASFh/9oACAEDAQE/EHVGbn//xAAXEQEBAQEAAAAAAAAAAAAAAAABABFh/9oACAECAQE/EEZqXC//xAAcEAEAAgIDAQAAAAAAAAAAAAABABEhMUFhcVH/2gAIAQEAAT8QGhkCBsvx3AVpM2ixeMzYf0WSkaQrsF8QpXaeLg+ErhYbNDqf/9k=","aspectRatio":1.3333333333333333,"src":"/static/9f96e81e6f6d55da468755a49a4b0666/3dc2b/IMG_8071.jpg","srcSet":"/static/9f96e81e6f6d55da468755a49a4b0666/f8f18/IMG_8071.jpg 930w,\n/static/9f96e81e6f6d55da468755a49a4b0666/3dc2b/IMG_8071.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/developers-gym-by-thoughtworks-14-july/"}}},{"node":{"excerpt":"It was our great pleasure to have invited Mr Steven Koh, the Deputy Director of Government Digital Services (GDS) at Govtech, to update us…","timeToRead":3,"frontmatter":{"title":"Updates to Govtech Agile Practices by Steven Koh - 2 July","tags":["Meetup"],"date":"2018-07-18T17:50:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAABAACBf/EABYBAQEBAAAAAAAAAAAAAAAAAAIAAf/aAAwDAQACEAMQAAABZzh6OLgyv//EABwQAAIBBQEAAAAAAAAAAAAAAAECAwAREhMxQf/aAAgBAQABBQJtITwRlqbls2eUhv/EABYRAAMAAAAAAAAAAAAAAAAAAAABEf/aAAgBAwEBPwFqkP/EABURAQEAAAAAAAAAAAAAAAAAAAEQ/9oACAECAQE/ARJ//8QAHBAAAgICAwAAAAAAAAAAAAAAAAECESExEiIy/9oACAEBAAY/ApNS0dnxPQ87LTwOj//EABoQAAIDAQEAAAAAAAAAAAAAAAERACExQVH/2gAIAQEAAT8hsI8g5G21q4MYOMQGmoCwNG4Escn/2gAMAwEAAgADAAAAEP8AD//EABYRAAMAAAAAAAAAAAAAAAAAAAEQQf/aAAgBAwEBPxCAr//EABcRAQADAAAAAAAAAAAAAAAAAAABETH/2gAIAQIBAT8Qhat//8QAGhAAAwEBAQEAAAAAAAAAAAAAAREhADFBsf/aAAgBAQABPxBl5yWG8GJujIADqfnNA21SvuiI6OdbA0bJgUoL4MagESyDDd3/2Q==","aspectRatio":1.3333333333333333,"src":"/static/8d8fee52f47c44485daff296b0c76794/3dc2b/meetup-speaker.jpg","srcSet":"/static/8d8fee52f47c44485daff296b0c76794/f8f18/meetup-speaker.jpg 930w,\n/static/8d8fee52f47c44485daff296b0c76794/3dc2b/meetup-speaker.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/updates-to-govtech-agile-practices/"}}},{"node":{"excerpt":"IntroductionNews media companies like Singapore Press Holdings (SPH) continue to be faced with rapidly accelerating technology innovation…","timeToRead":3,"frontmatter":{"title":"AI in News Media","tags":[],"date":"2018-07-12T22:46:00.000Z","draft":false,"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAIEAQP/xAAVAQEBAAAAAAAAAAAAAAAAAAABAv/aAAwDAQACEAMQAAABbnkrNAwn/8QAHBABAAEEAwAAAAAAAAAAAAAAAQACAxESEyEi/9oACAEBAAEFAsLGnvhuTKVL6trr/8QAFxEAAwEAAAAAAAAAAAAAAAAAAAEREv/aAAgBAwEBPwHKIj//xAAXEQEAAwAAAAAAAAAAAAAAAAAAAREh/9oACAECAQE/Ablr/8QAGhAAAgIDAAAAAAAAAAAAAAAAABABITEy8P/aAAgBAQAGPwJayV1rJ//EABsQAAMAAgMAAAAAAAAAAAAAAAABESExQWGB/9oACAEBAAE/IaHM9j2KZRS6mkHc3sbyZ+n/2gAMAwEAAgADAAAAEJvf/8QAFhEBAQEAAAAAAAAAAAAAAAAAABFB/9oACAEDAQE/EHHH/8QAFxEAAwEAAAAAAAAAAAAAAAAAAAERQf/aAAgBAgEBPxBFX0//xAAdEAEBAAMAAgMAAAAAAAAAAAABEQAhMUFRYXGh/9oACAEBAAE/EI4MDolZ4mCAJTthy4toHwXFAiuj0y/hiQMnbf3nFcwq5DP/2Q==","aspectRatio":1.8741633199464525,"src":"/static/9bea42284114acb5ba9e14a5fe42867c/3dc2b/INMANews-ArtificialIntelligence-1800.jpg","srcSet":"/static/9bea42284114acb5ba9e14a5fe42867c/f8f18/INMANews-ArtificialIntelligence-1800.jpg 930w,\n/static/9bea42284114acb5ba9e14a5fe42867c/3dc2b/INMANews-ArtificialIntelligence-1800.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/ai-in-news-media/"}}},{"node":{"excerpt":"Hi all! It has been a while since some of us have gone for the Scrum training by Mr Stuart, building balloon animal zoos to learn what is…","timeToRead":3,"frontmatter":{"title":"Video Review - Carousell Level-Up: Applying Scrum for Better Delivery","tags":["Review","Meetup"],"date":"2018-02-05T07:53:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAA7DAAAOwwHHb6hkAAACqklEQVQozwGfAmD9ADEVFzklJjolJzceITslJTchIjwpLDolKDglJTYhITsmJj4qKzkiJDspKTYoKDYpKiwaG0AyMj8xMi4ZGgCoNTmrQkWqOD2pPEGpOT2pLDGqMziqLzSoJiqpJSmqJyurKCypIyirLjKbTEt8KCpoHSBvLTFzLTF2LTEAyzQ5zUVJzT9DzDxAzD9FzUZKykNIy0JHyjo/yTk+yjo/yjtAyztAzDpB0IJ+u25rpVZYmFRVo2ZnrHV1ANZCR9x2edhqbthcYNpqbdltcdlhZdtobNtobNtgZN1nbNliZthtcdZPVNx1adJXSsKIfqFoYq9ER6xERwDXR0vXaGzXa2/YaW3XZWrbfH/Yf4PajI/Yd3vGaWzGZ2rXcHTagITabXLcVkPROCaUW0+KQz+4Hh+tIyYA1UNH12dq1mNo2Gxx2Wxw8sXH56+x4pOVyIaJXFVVTUpKyIqL99LS6KWn3U89WiUnFR4vISxFWx0ovjk3ANMyN9M4PdI3PdM6P9M5PtI5PtI8QtU4PswrMZ8qL5kpLcstMtUrMdc+QthdTFFESi4zQh0nNltDRcJHRwDSNTrURkvURkrUS07TTVHURUnUSEzTQUbUOD7bPUPaO0HTLTPSJCvVQkXaXEmadXBEPj5HPjypamLAS00A0Ds/z0ZLzzxB0D1CzTg8zzY6zjpAz0FFzUFGzkRJz0NJzjQ6zyYr0kdK20k4Xx8gAAQPBAcNdRAUwU1PAOM5P+FITuNMUuNQVeJFTOI8QuIzOeJCR+JVWuRaX+NVWuNCSOMqMOZNUdhFPolxdUhpcUZpcY07QMpOUQCLGx+LHCCKIiaKIiWKJCeLIyeLHSGLHCGLIiaLIyeJISWKHCCKHCCLKCyJOjx+TE5vTlFsVlp0REaBQEJqGgpHmAn0+wAAAABJRU5ErkJggg==","aspectRatio":1.7793696275071633,"src":"/static/dbb7bd9058838337f25ad9090b348997/748f9/scrum-video-intro.png","srcSet":"/static/dbb7bd9058838337f25ad9090b348997/748f9/scrum-video-intro.png 621w","sizes":"(max-width: 621px) 100vw, 621px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/video-review-carousell-level-up/"}}}]}},"pageContext":{"isCreatedByStatefulCreatePages":false,"author":"SPHTech"}}} \ No newline at end of file diff --git a/page-data/developers-gym-by-thoughtworks-14-july/page-data.json b/page-data/developers-gym-by-thoughtworks-14-july/page-data.json index f614a7b..2bd5e61 100644 --- a/page-data/developers-gym-by-thoughtworks-14-july/page-data.json +++ b/page-data/developers-gym-by-thoughtworks-14-july/page-data.json @@ -1 +1 @@ -{"componentChunkName":"component---src-templates-post-tsx","path":"/developers-gym-by-thoughtworks-14-july/","webpackCompilationHash":"e6542130e6dfe73197bb","result":{"data":{"logo":{"childImageSharp":{"fixed":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsSAAALEgHS3X78AAABFUlEQVQY023PvUrDUBTA8ZuCtoMoOLQ4dWhN14x2kEKXFkGoohQ/QBexOHRycAidKkgHHRq69APRoTjFJYODIA6+gSBYfYMmfYLE/5VT6NALP845NyeHc9UoCHZRQvonCLKKE4ZhAXYURTsYoE9dIy5iCzfUJnEdV+RF4iu6ikFH2EPxazzOcJmg4Rnn5C8ysIEOHqTe5/sT3qXOwYOtRr5/wLAqzpCTDXu4p2ETtyjgGJ/cX+se8jeU9fa4RBt5vWENpjzdkoGPcGg4RQsbOMEFmnBRRwVDHEK/yFXfvr/CoPjvZLKcdByDyzWGeajigzorGy0oOeRJiUtITe/pX1XzDk3buIMltSFR/zTtic3060X+8z8PsEUt8G3LVQAAAABJRU5ErkJggg==","width":400,"height":128,"src":"/static/2b5eaa0de166a8b5faebad4955c2200c/647de/ghost-logo.png","srcSet":"/static/2b5eaa0de166a8b5faebad4955c2200c/647de/ghost-logo.png 1x"}}},"markdownRemark":{"html":"

This was the second Developers Gym session organized by Thoughtworks, of which we were honoured to play host to. The coding dojo, formulated and taught by Gordon Song from Thoughtworks, aimed to impart programmers with the skills of practicing Test Driven Development (TDD) in their software development projects.

\n

To ensure that there is enough face-time between the instructor and the students, and for them to reap the maximum benefits through the session, the seating capacity is confined to 20 students only. Madhu and Ye Maw joined in this session.

\n

\n \n \n \n \n \n \n
Michael advising some of the students on TDD.
\n

\n

The session was organized into the following segments:

\n
    \n
  • Theory teaching
  • \n
  • Practical Part 1
  • \n
  • Break
  • \n
  • Sharing of what has been done for Part 1
  • \n
  • Practical Part 2
  • \n
  • Sharing of what has been done for Part 2
  • \n
  • Conclusion
  • \n
\n

The programmers were tasked to do pair programming, based on the programming challenge introduced by the instructor during the Theory segment. After part 1, the programmers were then asked to change their pair partners before commencing part 2. This was to facilitate the exchange of ideas among more people in the group.

\n

Some of the students were so enthusiastic that spontaneous deep discussions on how they tackled the programming challenge sprung up during the breaks. Their passion in coding was infectious!

\n

\n \n \n \n \n \n \n
Presentation and feedback after part 1 segment.
\n

\n

Overall, it was a beneficial session for our folks, as we got to revise about the TDD concepts and put them into practice. Some of us felt that TDD would be helpful for long-term projects, since the tests will be of great use when it comes to system maintenance and project scope updates. However, for TDD to be possible, we will need to factor in more time during software development, but it is definitely a time-cost that will be well spent. Project owners need to recognise the importance of TDD as insurance for the project’s health and well-being.

\n

There will be more of this coding sessions to come in the near future, if you would like to learn TDD with the expert, do keep a lookout on the meetup group!

\n

Background: JuniorDevSG is a meetup group founded by Michael Cheng, the veteran serial meetup founder and self taught programmer. It focuses on interfacing with programmers who have just joined the workforce, as well as fostering strong relationships and engaging with the programmers through talks, sharing and networking sessions.

","htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"This was the second Developers Gym session organized by Thoughtworks, of which we were honoured to play host to. The coding dojo, formulated and taught by Gordon Song from Thoughtworks, aimed to impart programmers with the skills of practicing Test Driven Development (TDD) in their software development projects."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"To ensure that there is enough face-time between the instructor and the students, and for them to reap the maximum benefits through the session, the seating capacity is confined to 20 students only. Madhu and Ye Maw joined in this session."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[]},{"type":"element","tagName":"figure","properties":{"className":["gatsby-resp-image-figure"],"style":""},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/0acf2740e149ed4b8a4950a7927acb73/5fd2a/IMG_8075.jpg","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1170px;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 75%; position: relative; bottom: 0; left: 0; background-image: url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAABAAF/8QAFQEBAQAAAAAAAAAAAAAAAAAAAQD/2gAMAwEAAhADEAAAAVDyWEqHJ//EAB0QAAAFBQAAAAAAAAAAAAAAAAABAgMSBBETISL/2gAIAQEAAQUCOrCnoqy7BvdzK/8A/8QAFxEBAAMAAAAAAAAAAAAAAAAAARARMf/aAAgBAwEBPwGh2P/EABURAQEAAAAAAAAAAAAAAAAAAAAR/9oACAECAQE/AVf/xAAgEAACAQEJAAAAAAAAAAAAAAAAAREhAhASMTJBUWFx/9oACAEBAAY/AqZbDwOeStqPLtKkfbP/xAAcEAEAAgIDAQAAAAAAAAAAAAABABEhUTFBYZH/2gAIAQEAAT8hzOF8Lu4XsoSrdxurUdAqZ+Sg8TA6jduzif/aAAwDAQACAAMAAAAQbC//xAAYEQEAAwEAAAAAAAAAAAAAAAABABEhkf/aAAgBAwEBPxChFBgHJ//EABkRAQACAwAAAAAAAAAAAAAAAAEAETFBkf/aAAgBAgEBPxBUxK7vs//EABwQAQEAAgMBAQAAAAAAAAAAAAERACExQVFxof/aAAgBAQABPxDdCeB0HL49axLINZ0JR9V0YIHqKA+NwYFVOAvBcawgKai3X7je6D4HP//Z'); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;box-shadow:inset 0px 0px 0px 400px white;","alt":"Michael advising some of the students on TDD.","title":"","src":"/static/0acf2740e149ed4b8a4950a7927acb73/64a7b/IMG_8075.jpg","srcSet":["/static/0acf2740e149ed4b8a4950a7927acb73/57443/IMG_8075.jpg 293w","/static/0acf2740e149ed4b8a4950a7927acb73/bedd3/IMG_8075.jpg 585w","/static/0acf2740e149ed4b8a4950a7927acb73/64a7b/IMG_8075.jpg 1170w","/static/0acf2740e149ed4b8a4950a7927acb73/5fd2a/IMG_8075.jpg 1400w"],"sizes":["(max-width:","1170px)","100vw,","1170px"]},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "},{"type":"element","tagName":"figcaption","properties":{"className":["gatsby-resp-image-figcaption"]},"children":[{"type":"text","value":"Michael advising some of the students on TDD."}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"The session was organized into the following segments:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Theory teaching"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Practical Part 1"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Break"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Sharing of what has been done for Part 1"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Practical Part 2"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Sharing of what has been done for Part 2"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Conclusion"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"The programmers were tasked to do pair programming, based on the programming challenge introduced by the instructor during the Theory segment. After part 1, the programmers were then asked to change their pair partners before commencing part 2. This was to facilitate the exchange of ideas among more people in the group."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Some of the students were so enthusiastic that spontaneous deep discussions on how they tackled the programming challenge sprung up during the breaks. Their passion in coding was infectious!"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[]},{"type":"element","tagName":"figure","properties":{"className":["gatsby-resp-image-figure"],"style":""},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/73cd5864326efe7cad3072cebc656eb1/0a4ca/enthu-coders.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 614px;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 163.19218241042347%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,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'); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;box-shadow:inset 0px 0px 0px 400px white;","alt":"Courtesy of Michael and Hui Qian","title":"","src":"/static/73cd5864326efe7cad3072cebc656eb1/0a4ca/enthu-coders.png","srcSet":["/static/73cd5864326efe7cad3072cebc656eb1/eb41c/enthu-coders.png 293w","/static/73cd5864326efe7cad3072cebc656eb1/7110a/enthu-coders.png 585w","/static/73cd5864326efe7cad3072cebc656eb1/0a4ca/enthu-coders.png 614w"],"sizes":["(max-width:","614px)","100vw,","614px"]},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "},{"type":"element","tagName":"figcaption","properties":{"className":["gatsby-resp-image-figcaption"]},"children":[{"type":"text","value":"Courtesy of Michael and Hui Qian"}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"We observed that pair programming may or may not be appealing to programmers. It can be of an “acquired taste”, some perform better and some perform less if they were to practice pair programming. Also, part 1 of the practical segment may be a little short too (45 minutes), since new students would need time to set up their IDEs and get the unit testing framework working, as well as pick up the theories and understand the programming challenge too."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[]},{"type":"element","tagName":"figure","properties":{"className":["gatsby-resp-image-figure"],"style":""},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/02e3c7b5b410b96e758f856f153a0136/5fd2a/IMG_8082.jpg","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1170px;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 75%; position: relative; bottom: 0; left: 0; background-image: url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAQD/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAEC/9oADAMBAAIQAxAAAAHXSCXNpB//xAAZEAEBAQEBAQAAAAAAAAAAAAACAwETACL/2gAIAQEAAQUCPPkRPVemToqfM1qeHV7/xAAWEQEBAQAAAAAAAAAAAAAAAAAAARL/2gAIAQMBAT8BZr//xAAWEQEBAQAAAAAAAAAAAAAAAAAAARH/2gAIAQIBAT8BjY//xAAbEAACAgMBAAAAAAAAAAAAAAAAAQISESGRMf/aAAgBAQAGPwK1GelUn0cXtDwkZko8P//EABoQAQEAAwEBAAAAAAAAAAAAAAERACFBMWH/2gAIAQEAAT8hmnAvrMcmpuFxCoS4HaIe5AJrvTBKrz4z/9oADAMBAAIAAwAAABBj7//EABYRAQEBAAAAAAAAAAAAAAAAAAAxYf/aAAgBAwEBPxCxg//EABcRAQEBAQAAAAAAAAAAAAAAAAEAEWH/2gAIAQIBAT8QQm3a/8QAHBABAAMAAgMAAAAAAAAAAAAAAQARITFRYXGh/9oACAEBAAE/ELkmrY019iwuCRgBzsLHwEy2epYKtUzLuL7CxE10PibYukBocGz/2Q=='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;box-shadow:inset 0px 0px 0px 400px white;","alt":"Presentation and feedback after part 1 segment.","title":"","src":"/static/02e3c7b5b410b96e758f856f153a0136/64a7b/IMG_8082.jpg","srcSet":["/static/02e3c7b5b410b96e758f856f153a0136/57443/IMG_8082.jpg 293w","/static/02e3c7b5b410b96e758f856f153a0136/bedd3/IMG_8082.jpg 585w","/static/02e3c7b5b410b96e758f856f153a0136/64a7b/IMG_8082.jpg 1170w","/static/02e3c7b5b410b96e758f856f153a0136/5fd2a/IMG_8082.jpg 1400w"],"sizes":["(max-width:","1170px)","100vw,","1170px"]},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "},{"type":"element","tagName":"figcaption","properties":{"className":["gatsby-resp-image-figcaption"]},"children":[{"type":"text","value":"Presentation and feedback after part 1 segment."}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Overall, it was a beneficial session for our folks, as we got to revise about the TDD concepts and put them into practice. Some of us felt that TDD would be helpful for long-term projects, since the tests will be of great use when it comes to system maintenance and project scope updates. However, for TDD to be possible, we will need to factor in more time during software development, but it is definitely a time-cost that will be well spent. Project owners need to recognise the importance of TDD as insurance for the project’s health and well-being."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"There will be more of this coding sessions to come in the near future, if you would like to learn TDD with the expert, do keep a lookout on the "},{"type":"element","tagName":"a","properties":{"href":"https://www.meetup.com/Junior-Developers-Singapore/"},"children":[{"type":"text","value":"meetup group"}]},{"type":"text","value":"!"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"i","properties":{},"children":[{"type":"text","value":"Background:"}]},{"type":"text","value":" JuniorDevSG is a meetup group founded by Michael Cheng, the veteran serial meetup founder and self taught programmer. It focuses on interfacing with programmers who have just joined the workforce, as well as fostering strong relationships and engaging with the programmers through talks, sharing and networking sessions."}]}],"data":{"quirksMode":false}},"excerpt":"This was the second Developers Gym session organized by Thoughtworks, of which we were honoured to play host to. The coding dojo, formulated…","timeToRead":2,"frontmatter":{"title":"Developers Gym by Thoughtworks - 14 July","userDate":"25 July 2018","date":"2018-07-25T14:25:00.000Z","tags":["Meetup","Reviews"],"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAABAADBf/EABUBAQEAAAAAAAAAAAAAAAAAAAEA/9oADAMBAAIQAxAAAAFBg5F0Ycn/xAAZEAADAQEBAAAAAAAAAAAAAAAAARICAxP/2gAIAQEAAQUC88RpKp2b6Muikj//xAAWEQEBAQAAAAAAAAAAAAAAAAAAARH/2gAIAQMBAT8BZX//xAAWEQEBAQAAAAAAAAAAAAAAAAAAARH/2gAIAQIBAT8BjY//xAAcEAACAgIDAAAAAAAAAAAAAAAAARExAiESQXH/2gAIAQEABj8C5THo1i1otF6KOz//xAAdEAACAgIDAQAAAAAAAAAAAAAAAREhMUFRYYGh/9oACAEBAAE/IXBpbgTKVtySYg6Ki8xM1pmaowl9n//aAAwDAQACAAMAAAAQoA//xAAXEQADAQAAAAAAAAAAAAAAAAAAASFh/9oACAEDAQE/EHVGbn//xAAXEQEBAQEAAAAAAAAAAAAAAAABABFh/9oACAECAQE/EEZqXC//xAAcEAEAAgIDAQAAAAAAAAAAAAABABEhMUFhcVH/2gAIAQEAAT8QGhkCBsvx3AVpM2ixeMzYf0WSkaQrsF8QpXaeLg+ErhYbNDqf/9k=","aspectRatio":1.3333333333333333,"src":"/static/9f96e81e6f6d55da468755a49a4b0666/3dc2b/IMG_8071.jpg","srcSet":"/static/9f96e81e6f6d55da468755a49a4b0666/f8f18/IMG_8071.jpg 930w,\n/static/9f96e81e6f6d55da468755a49a4b0666/3dc2b/IMG_8071.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAADQElEQVQ4y5VUW0tUURSeX9BDhFZQ1Nx0lCAqI+o1KMiHoqjIesisXiLSQOhiRUWUdKEwKqKHtNIyJLuY0UWS0lBKM8mcrEadcnIc58zlzMyZvc/+WjNnRs+xIWjDd9a+fudba6+1TaAmhEDaCqESONItOZewCUitgK8JIu7TxrQXqbV0M00lSzd1LAgRiU5u/3oAaJ0NQcC7RYC/LXWOJz6ThHoVyX74GynpRKTuLZjTo815SNWzbIjuEsD7EqJjHUT7KoNnBoVpZer3G+DN+eBNNvD2Egh5BCLqAW9ZCf7YDBF0agTjXbRnAbkezESYikPIBfYgH+y+BawhD6x+LtjDAsJSxOutiN+zgPechWAyeNs+sNZiXagyEKq+Xig1dii386DcyiU4oFRbodwk1CT6dq1fnQv2vJiUj6cIVYNKk55dadyC6PnpiF3LRfRqziSu2Ak0d9mC2I0C6JtQVYNSk+Evsg9K035EKs2InLUhci6HrD0F6ldaEbmwEKz7HrjrHamUpqg0pM1kyrD3dxE+Ykb4mB3ho2nYaI5shQXhg3MRPmyGfGY5+OCHlFKuv+UUKY8nLR/8iFCZBaH9VoKN+glr11BK41KyZTkI7poBuaook8vCcFvypRIEts1EYLcdgRILAjttkLbOhlQ0C4EdiXEOrTlozxyEjhQaLsY0Nbjq7yE67IC00Qxps5VAZOvJxeNbET61HdKG+fCvyYK/MBv+1TMQa66ZcDkjIf/los02OmSBf62DDs2DtGkxVZCWxKy/G5HrZ+gHe6G8eWqoeWPp6SpGPl0O74JpGFuSBR/ZaHWVdiiuxTjW0o/QxeY0laEEDZeiksoEJYvTjTXeQfRkOeSG2mQ+CJ0XzOVBvGtgwk09x4TLqhCGhP1EKTaeXsO/21+PA1e1iVfOMRx94iT048SjPuyp68GL3l+Aux/MMwTuHqAS9UClOKveEaijbkpu+e/SYynC2x1uZB16gWXn2zA8JqO2043d9X2AxwnF/R3scwf4QE+SlH/rBet6TS/Q+NRLERPuDoyGUUHqVlxox6svXri8Mtp+kO+RAFQ5RCk1nCRQRwbpdZI0KNHMj4M+hr0/g8YY/UcM/wD4fYcC4gOWgAAAAABJRU5ErkJggg==","width":400,"height":400,"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png","srcSet":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png 1x,\n/static/7fa6bee9d2080bd021828c70f67a4720/fca9c/sphtech.png 1.5x"}}]}}}},"relatedPosts":{"totalCount":4,"edges":[{"node":{"id":"8865d4be-7fa3-5582-9991-55bc98517819","timeToRead":2,"excerpt":"This was the second Developers Gym session organized by Thoughtworks, of which we were honoured to play host to. The coding dojo, formulated…","frontmatter":{"title":"Developers Gym by Thoughtworks - 14 July"},"fields":{"slug":"/developers-gym-by-thoughtworks-14-july/"}}},{"node":{"id":"8d28738e-5a45-5b0a-ab5d-f4bd55529568","timeToRead":1,"excerpt":"On the 21st of November, SPH staff gathered for a cozy SPHTech Meetup session at The Inspiration Hub to learn about Data Privacy efforts in…","frontmatter":{"title":"Towards a Privacy Aware Smart Nation"},"fields":{"slug":"/towards-a-privacy-aware-smart-nation/"}}},{"node":{"id":"1ee10358-b30a-5691-b583-a3aaec6a020b","timeToRead":3,"excerpt":"It was our great pleasure to have invited Mr Steven Koh, the Deputy Director of Government Digital Services (GDS) at Govtech, to update us…","frontmatter":{"title":"Updates to Govtech Agile Practices by Steven Koh - 2 July"},"fields":{"slug":"/updates-to-govtech-agile-practices/"}}}]}},"pageContext":{"isCreatedByStatefulCreatePages":false,"slug":"/developers-gym-by-thoughtworks-14-july/","prev":{"excerpt":"It was our great pleasure to have invited Mr Steven Koh, the Deputy Director of Government Digital Services (GDS) at Govtech, to update us…","timeToRead":3,"frontmatter":{"title":"Updates to Govtech Agile Practices by Steven Koh - 2 July","tags":["Meetup"],"date":"2018-07-18T17:50:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"aspectRatio":1.3333333333333333,"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAABAACBf/EABYBAQEBAAAAAAAAAAAAAAAAAAIAAf/aAAwDAQACEAMQAAABZzh6OLgyv//EABwQAAIBBQEAAAAAAAAAAAAAAAECAwAREhMxQf/aAAgBAQABBQJtITwRlqbls2eUhv/EABYRAAMAAAAAAAAAAAAAAAAAAAABEf/aAAgBAwEBPwFqkP/EABURAQEAAAAAAAAAAAAAAAAAAAEQ/9oACAECAQE/ARJ//8QAHBAAAgICAwAAAAAAAAAAAAAAAAECESExEiIy/9oACAEBAAY/ApNS0dnxPQ87LTwOj//EABoQAAIDAQEAAAAAAAAAAAAAAAERACExQVH/2gAIAQEAAT8hsI8g5G21q4MYOMQGmoCwNG4Escn/2gAMAwEAAgADAAAAEP8AD//EABYRAAMAAAAAAAAAAAAAAAAAAAEQQf/aAAgBAwEBPxCAr//EABcRAQADAAAAAAAAAAAAAAAAAAABETH/2gAIAQIBAT8Qhat//8QAGhAAAwEBAQEAAAAAAAAAAAAAAREhADFBsf/aAAgBAQABPxBl5yWG8GJujIADqfnNA21SvuiI6OdbA0bJgUoL4MagESyDDd3/2Q==","sizes":"(max-width: 1400px) 100vw, 1400px","src":"/static/8d8fee52f47c44485daff296b0c76794/3dc2b/meetup-speaker.jpg","srcSet":"/static/8d8fee52f47c44485daff296b0c76794/f8f18/meetup-speaker.jpg 930w,\n/static/8d8fee52f47c44485daff296b0c76794/3dc2b/meetup-speaker.jpg 1400w"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/b4a08/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/updates-to-govtech-agile-practices/"}},"next":{"excerpt":"TL;DR Does asking users for feedback and ratings help in your app? Yes!When I joined Singapore Press Holdings in late 2015, most of the apps…","timeToRead":3,"frontmatter":{"title":"How to get your mobile app users to give you ratings and feedback!","tags":["Android"],"date":"2018-10-07T23:10:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"aspectRatio":2.074786324786325,"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAIAAAA7N+mxAAAACXBIWXMAAAsSAAALEgHS3X78AAABo0lEQVQoz2WRWW/TQBSF/c954kcgJErFA+ob8NBKhCVSaSsEArElJG3tZqkdjz2JZ+zZN+5MWoHEkT26tu935txx5pOcs7D4dAcfqGTHNxcvr8cv8ouPm5kzxqWvUsphGJzbQz7TWncdUUoj1HDOA8gHqfC8ev6rGq26dcso9IQkxhjA4V5Z8qNCYkKxMTaxwfWVRz9jZZzTVps7GEjghVI2JgkZvLLOaM2s0w7Sg4F3itJ+uVJaq3tZaxPcS6X+7lyjGmMshNTa7PtgMMDA6e5RKfAG0zYKN3V19Hnx4Hj26EOeQSsBUQJF+EdwdvsRQGjQiHLS7VqM2waNp7cH5/m7Ocogj4txwRoSG2h9Nh+flRMolIZtIYZkQgyCxyHgMsp7u7eNsA2euTiSSevDT4dPJ6+3QnFtwn/yKYwBCn6VNa7sFmf5qOPbTVd2TCxWj78WTw5/HJwUb98vT0eL0+/t9M3y/KQYf6m+HU1eTdFvqeOxZcqYpr3hXbHZrWtSlttbMeSKXqohJ/11Sy5rcrXaXlUkr/Cs7YtmN8X9mpt4QH8Ad7k0jshkD1kAAAAASUVORK5CYII=","sizes":"(max-width: 971px) 100vw, 971px","src":"/static/4d42232e07032296408b0a75d8f9815e/a83d1/zaobao-app-chart1.png","srcSet":"/static/4d42232e07032296408b0a75d8f9815e/4c9af/zaobao-app-chart1.png 930w,\n/static/4d42232e07032296408b0a75d8f9815e/a83d1/zaobao-app-chart1.png 971w"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/b4a08/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/get-your-app-users-to-give-feedback/"}},"primaryTag":"Meetup"}}} \ No newline at end of file +{"componentChunkName":"component---src-templates-post-tsx","path":"/developers-gym-by-thoughtworks-14-july/","webpackCompilationHash":"4d127609ee78b8f0aee7","result":{"data":{"logo":{"childImageSharp":{"fixed":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsSAAALEgHS3X78AAABFUlEQVQY023PvUrDUBTA8ZuCtoMoOLQ4dWhN14x2kEKXFkGoohQ/QBexOHRycAidKkgHHRq69APRoTjFJYODIA6+gSBYfYMmfYLE/5VT6NALP845NyeHc9UoCHZRQvonCLKKE4ZhAXYURTsYoE9dIy5iCzfUJnEdV+RF4iu6ikFH2EPxazzOcJmg4Rnn5C8ysIEOHqTe5/sT3qXOwYOtRr5/wLAqzpCTDXu4p2ETtyjgGJ/cX+se8jeU9fa4RBt5vWENpjzdkoGPcGg4RQsbOMEFmnBRRwVDHEK/yFXfvr/CoPjvZLKcdByDyzWGeajigzorGy0oOeRJiUtITe/pX1XzDk3buIMltSFR/zTtic3060X+8z8PsEUt8G3LVQAAAABJRU5ErkJggg==","width":400,"height":128,"src":"/static/2b5eaa0de166a8b5faebad4955c2200c/647de/ghost-logo.png","srcSet":"/static/2b5eaa0de166a8b5faebad4955c2200c/647de/ghost-logo.png 1x"}}},"markdownRemark":{"html":"

This was the second Developers Gym session organized by Thoughtworks, of which we were honoured to play host to. The coding dojo, formulated and taught by Gordon Song from Thoughtworks, aimed to impart programmers with the skills of practicing Test Driven Development (TDD) in their software development projects.

\n

To ensure that there is enough face-time between the instructor and the students, and for them to reap the maximum benefits through the session, the seating capacity is confined to 20 students only. Madhu and Ye Maw joined in this session.

\n

\n \n \n \n \n \n \n
Michael advising some of the students on TDD.
\n

\n

The session was organized into the following segments:

\n
    \n
  • Theory teaching
  • \n
  • Practical Part 1
  • \n
  • Break
  • \n
  • Sharing of what has been done for Part 1
  • \n
  • Practical Part 2
  • \n
  • Sharing of what has been done for Part 2
  • \n
  • Conclusion
  • \n
\n

The programmers were tasked to do pair programming, based on the programming challenge introduced by the instructor during the Theory segment. After part 1, the programmers were then asked to change their pair partners before commencing part 2. This was to facilitate the exchange of ideas among more people in the group.

\n

Some of the students were so enthusiastic that spontaneous deep discussions on how they tackled the programming challenge sprung up during the breaks. Their passion in coding was infectious!

\n

\n \n \n \n \n \n \n
Presentation and feedback after part 1 segment.
\n

\n

Overall, it was a beneficial session for our folks, as we got to revise about the TDD concepts and put them into practice. Some of us felt that TDD would be helpful for long-term projects, since the tests will be of great use when it comes to system maintenance and project scope updates. However, for TDD to be possible, we will need to factor in more time during software development, but it is definitely a time-cost that will be well spent. Project owners need to recognise the importance of TDD as insurance for the project’s health and well-being.

\n

There will be more of this coding sessions to come in the near future, if you would like to learn TDD with the expert, do keep a lookout on the meetup group!

\n

Background: JuniorDevSG is a meetup group founded by Michael Cheng, the veteran serial meetup founder and self taught programmer. It focuses on interfacing with programmers who have just joined the workforce, as well as fostering strong relationships and engaging with the programmers through talks, sharing and networking sessions.

","htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"This was the second Developers Gym session organized by Thoughtworks, of which we were honoured to play host to. The coding dojo, formulated and taught by Gordon Song from Thoughtworks, aimed to impart programmers with the skills of practicing Test Driven Development (TDD) in their software development projects."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"To ensure that there is enough face-time between the instructor and the students, and for them to reap the maximum benefits through the session, the seating capacity is confined to 20 students only. Madhu and Ye Maw joined in this session."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[]},{"type":"element","tagName":"figure","properties":{"className":["gatsby-resp-image-figure"],"style":""},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/0acf2740e149ed4b8a4950a7927acb73/5fd2a/IMG_8075.jpg","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1170px;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 75%; position: relative; bottom: 0; left: 0; background-image: url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAABAAF/8QAFQEBAQAAAAAAAAAAAAAAAAAAAQD/2gAMAwEAAhADEAAAAVDyWEqHJ//EAB0QAAAFBQAAAAAAAAAAAAAAAAABAgMSBBETISL/2gAIAQEAAQUCOrCnoqy7BvdzK/8A/8QAFxEBAAMAAAAAAAAAAAAAAAAAARARMf/aAAgBAwEBPwGh2P/EABURAQEAAAAAAAAAAAAAAAAAAAAR/9oACAECAQE/AVf/xAAgEAACAQEJAAAAAAAAAAAAAAAAAREhAhASMTJBUWFx/9oACAEBAAY/AqZbDwOeStqPLtKkfbP/xAAcEAEAAgIDAQAAAAAAAAAAAAABABEhUTFBYZH/2gAIAQEAAT8hzOF8Lu4XsoSrdxurUdAqZ+Sg8TA6jduzif/aAAwDAQACAAMAAAAQbC//xAAYEQEAAwEAAAAAAAAAAAAAAAABABEhkf/aAAgBAwEBPxChFBgHJ//EABkRAQACAwAAAAAAAAAAAAAAAAEAETFBkf/aAAgBAgEBPxBUxK7vs//EABwQAQEAAgMBAQAAAAAAAAAAAAERACExQVFxof/aAAgBAQABPxDdCeB0HL49axLINZ0JR9V0YIHqKA+NwYFVOAvBcawgKai3X7je6D4HP//Z'); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;box-shadow:inset 0px 0px 0px 400px white;","alt":"Michael advising some of the students on TDD.","title":"","src":"/static/0acf2740e149ed4b8a4950a7927acb73/64a7b/IMG_8075.jpg","srcSet":["/static/0acf2740e149ed4b8a4950a7927acb73/57443/IMG_8075.jpg 293w","/static/0acf2740e149ed4b8a4950a7927acb73/bedd3/IMG_8075.jpg 585w","/static/0acf2740e149ed4b8a4950a7927acb73/64a7b/IMG_8075.jpg 1170w","/static/0acf2740e149ed4b8a4950a7927acb73/5fd2a/IMG_8075.jpg 1400w"],"sizes":["(max-width:","1170px)","100vw,","1170px"]},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "},{"type":"element","tagName":"figcaption","properties":{"className":["gatsby-resp-image-figcaption"]},"children":[{"type":"text","value":"Michael advising some of the students on TDD."}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"The session was organized into the following segments:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Theory teaching"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Practical Part 1"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Break"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Sharing of what has been done for Part 1"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Practical Part 2"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Sharing of what has been done for Part 2"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Conclusion"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"The programmers were tasked to do pair programming, based on the programming challenge introduced by the instructor during the Theory segment. After part 1, the programmers were then asked to change their pair partners before commencing part 2. This was to facilitate the exchange of ideas among more people in the group."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Some of the students were so enthusiastic that spontaneous deep discussions on how they tackled the programming challenge sprung up during the breaks. Their passion in coding was infectious!"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[]},{"type":"element","tagName":"figure","properties":{"className":["gatsby-resp-image-figure"],"style":""},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/73cd5864326efe7cad3072cebc656eb1/0a4ca/enthu-coders.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 614px;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 163.19218241042347%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,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'); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;box-shadow:inset 0px 0px 0px 400px white;","alt":"Courtesy of Michael and Hui Qian","title":"","src":"/static/73cd5864326efe7cad3072cebc656eb1/0a4ca/enthu-coders.png","srcSet":["/static/73cd5864326efe7cad3072cebc656eb1/eb41c/enthu-coders.png 293w","/static/73cd5864326efe7cad3072cebc656eb1/7110a/enthu-coders.png 585w","/static/73cd5864326efe7cad3072cebc656eb1/0a4ca/enthu-coders.png 614w"],"sizes":["(max-width:","614px)","100vw,","614px"]},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "},{"type":"element","tagName":"figcaption","properties":{"className":["gatsby-resp-image-figcaption"]},"children":[{"type":"text","value":"Courtesy of Michael and Hui Qian"}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"We observed that pair programming may or may not be appealing to programmers. It can be of an “acquired taste”, some perform better and some perform less if they were to practice pair programming. Also, part 1 of the practical segment may be a little short too (45 minutes), since new students would need time to set up their IDEs and get the unit testing framework working, as well as pick up the theories and understand the programming challenge too."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[]},{"type":"element","tagName":"figure","properties":{"className":["gatsby-resp-image-figure"],"style":""},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/02e3c7b5b410b96e758f856f153a0136/5fd2a/IMG_8082.jpg","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1170px;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 75%; position: relative; bottom: 0; left: 0; background-image: url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAQD/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAEC/9oADAMBAAIQAxAAAAHXSCXNpB//xAAZEAEBAQEBAQAAAAAAAAAAAAACAwETACL/2gAIAQEAAQUCPPkRPVemToqfM1qeHV7/xAAWEQEBAQAAAAAAAAAAAAAAAAAAARL/2gAIAQMBAT8BZr//xAAWEQEBAQAAAAAAAAAAAAAAAAAAARH/2gAIAQIBAT8BjY//xAAbEAACAgMBAAAAAAAAAAAAAAAAAQISESGRMf/aAAgBAQAGPwK1GelUn0cXtDwkZko8P//EABoQAQEAAwEBAAAAAAAAAAAAAAERACFBMWH/2gAIAQEAAT8hmnAvrMcmpuFxCoS4HaIe5AJrvTBKrz4z/9oADAMBAAIAAwAAABBj7//EABYRAQEBAAAAAAAAAAAAAAAAAAAxYf/aAAgBAwEBPxCxg//EABcRAQEBAQAAAAAAAAAAAAAAAAEAEWH/2gAIAQIBAT8QQm3a/8QAHBABAAMAAgMAAAAAAAAAAAAAAQARITFRYXGh/9oACAEBAAE/ELkmrY019iwuCRgBzsLHwEy2epYKtUzLuL7CxE10PibYukBocGz/2Q=='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;box-shadow:inset 0px 0px 0px 400px white;","alt":"Presentation and feedback after part 1 segment.","title":"","src":"/static/02e3c7b5b410b96e758f856f153a0136/64a7b/IMG_8082.jpg","srcSet":["/static/02e3c7b5b410b96e758f856f153a0136/57443/IMG_8082.jpg 293w","/static/02e3c7b5b410b96e758f856f153a0136/bedd3/IMG_8082.jpg 585w","/static/02e3c7b5b410b96e758f856f153a0136/64a7b/IMG_8082.jpg 1170w","/static/02e3c7b5b410b96e758f856f153a0136/5fd2a/IMG_8082.jpg 1400w"],"sizes":["(max-width:","1170px)","100vw,","1170px"]},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "},{"type":"element","tagName":"figcaption","properties":{"className":["gatsby-resp-image-figcaption"]},"children":[{"type":"text","value":"Presentation and feedback after part 1 segment."}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Overall, it was a beneficial session for our folks, as we got to revise about the TDD concepts and put them into practice. Some of us felt that TDD would be helpful for long-term projects, since the tests will be of great use when it comes to system maintenance and project scope updates. However, for TDD to be possible, we will need to factor in more time during software development, but it is definitely a time-cost that will be well spent. Project owners need to recognise the importance of TDD as insurance for the project’s health and well-being."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"There will be more of this coding sessions to come in the near future, if you would like to learn TDD with the expert, do keep a lookout on the "},{"type":"element","tagName":"a","properties":{"href":"https://www.meetup.com/Junior-Developers-Singapore/"},"children":[{"type":"text","value":"meetup group"}]},{"type":"text","value":"!"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"i","properties":{},"children":[{"type":"text","value":"Background:"}]},{"type":"text","value":" JuniorDevSG is a meetup group founded by Michael Cheng, the veteran serial meetup founder and self taught programmer. It focuses on interfacing with programmers who have just joined the workforce, as well as fostering strong relationships and engaging with the programmers through talks, sharing and networking sessions."}]}],"data":{"quirksMode":false}},"excerpt":"This was the second Developers Gym session organized by Thoughtworks, of which we were honoured to play host to. The coding dojo, formulated…","timeToRead":2,"frontmatter":{"title":"Developers Gym by Thoughtworks - 14 July","userDate":"25 July 2018","date":"2018-07-25T14:25:00.000Z","tags":["Meetup","Reviews"],"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAABAADBf/EABUBAQEAAAAAAAAAAAAAAAAAAAEA/9oADAMBAAIQAxAAAAFBg5F0Ycn/xAAZEAADAQEBAAAAAAAAAAAAAAAAARICAxP/2gAIAQEAAQUC88RpKp2b6Muikj//xAAWEQEBAQAAAAAAAAAAAAAAAAAAARH/2gAIAQMBAT8BZX//xAAWEQEBAQAAAAAAAAAAAAAAAAAAARH/2gAIAQIBAT8BjY//xAAcEAACAgIDAAAAAAAAAAAAAAAAARExAiESQXH/2gAIAQEABj8C5THo1i1otF6KOz//xAAdEAACAgIDAQAAAAAAAAAAAAAAAREhMUFRYYGh/9oACAEBAAE/IXBpbgTKVtySYg6Ki8xM1pmaowl9n//aAAwDAQACAAMAAAAQoA//xAAXEQADAQAAAAAAAAAAAAAAAAAAASFh/9oACAEDAQE/EHVGbn//xAAXEQEBAQEAAAAAAAAAAAAAAAABABFh/9oACAECAQE/EEZqXC//xAAcEAEAAgIDAQAAAAAAAAAAAAABABEhMUFhcVH/2gAIAQEAAT8QGhkCBsvx3AVpM2ixeMzYf0WSkaQrsF8QpXaeLg+ErhYbNDqf/9k=","aspectRatio":1.3333333333333333,"src":"/static/9f96e81e6f6d55da468755a49a4b0666/3dc2b/IMG_8071.jpg","srcSet":"/static/9f96e81e6f6d55da468755a49a4b0666/f8f18/IMG_8071.jpg 930w,\n/static/9f96e81e6f6d55da468755a49a4b0666/3dc2b/IMG_8071.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAADQElEQVQ4y5VUW0tUURSeX9BDhFZQ1Nx0lCAqI+o1KMiHoqjIesisXiLSQOhiRUWUdKEwKqKHtNIyJLuY0UWS0lBKM8mcrEadcnIc58zlzMyZvc/+WjNnRs+xIWjDd9a+fudba6+1TaAmhEDaCqESONItOZewCUitgK8JIu7TxrQXqbV0M00lSzd1LAgRiU5u/3oAaJ0NQcC7RYC/LXWOJz6ThHoVyX74GynpRKTuLZjTo815SNWzbIjuEsD7EqJjHUT7KoNnBoVpZer3G+DN+eBNNvD2Egh5BCLqAW9ZCf7YDBF0agTjXbRnAbkezESYikPIBfYgH+y+BawhD6x+LtjDAsJSxOutiN+zgPechWAyeNs+sNZiXagyEKq+Xig1dii386DcyiU4oFRbodwk1CT6dq1fnQv2vJiUj6cIVYNKk55dadyC6PnpiF3LRfRqziSu2Ak0d9mC2I0C6JtQVYNSk+Evsg9K035EKs2InLUhci6HrD0F6ldaEbmwEKz7HrjrHamUpqg0pM1kyrD3dxE+Ykb4mB3ho2nYaI5shQXhg3MRPmyGfGY5+OCHlFKuv+UUKY8nLR/8iFCZBaH9VoKN+glr11BK41KyZTkI7poBuaook8vCcFvypRIEts1EYLcdgRILAjttkLbOhlQ0C4EdiXEOrTlozxyEjhQaLsY0Nbjq7yE67IC00Qxps5VAZOvJxeNbET61HdKG+fCvyYK/MBv+1TMQa66ZcDkjIf/los02OmSBf62DDs2DtGkxVZCWxKy/G5HrZ+gHe6G8eWqoeWPp6SpGPl0O74JpGFuSBR/ZaHWVdiiuxTjW0o/QxeY0laEEDZeiksoEJYvTjTXeQfRkOeSG2mQ+CJ0XzOVBvGtgwk09x4TLqhCGhP1EKTaeXsO/21+PA1e1iVfOMRx94iT048SjPuyp68GL3l+Aux/MMwTuHqAS9UClOKveEaijbkpu+e/SYynC2x1uZB16gWXn2zA8JqO2043d9X2AxwnF/R3scwf4QE+SlH/rBet6TS/Q+NRLERPuDoyGUUHqVlxox6svXri8Mtp+kO+RAFQ5RCk1nCRQRwbpdZI0KNHMj4M+hr0/g8YY/UcM/wD4fYcC4gOWgAAAAABJRU5ErkJggg==","width":400,"height":400,"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png","srcSet":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png 1x,\n/static/7fa6bee9d2080bd021828c70f67a4720/fca9c/sphtech.png 1.5x"}}]}}}},"relatedPosts":{"totalCount":4,"edges":[{"node":{"id":"8865d4be-7fa3-5582-9991-55bc98517819","timeToRead":2,"excerpt":"This was the second Developers Gym session organized by Thoughtworks, of which we were honoured to play host to. The coding dojo, formulated…","frontmatter":{"title":"Developers Gym by Thoughtworks - 14 July"},"fields":{"slug":"/developers-gym-by-thoughtworks-14-july/"}}},{"node":{"id":"8d28738e-5a45-5b0a-ab5d-f4bd55529568","timeToRead":1,"excerpt":"On the 21st of November, SPH staff gathered for a cozy SPHTech Meetup session at The Inspiration Hub to learn about Data Privacy efforts in…","frontmatter":{"title":"Towards a Privacy Aware Smart Nation"},"fields":{"slug":"/towards-a-privacy-aware-smart-nation/"}}},{"node":{"id":"1ee10358-b30a-5691-b583-a3aaec6a020b","timeToRead":3,"excerpt":"It was our great pleasure to have invited Mr Steven Koh, the Deputy Director of Government Digital Services (GDS) at Govtech, to update us…","frontmatter":{"title":"Updates to Govtech Agile Practices by Steven Koh - 2 July"},"fields":{"slug":"/updates-to-govtech-agile-practices/"}}}]}},"pageContext":{"isCreatedByStatefulCreatePages":false,"slug":"/developers-gym-by-thoughtworks-14-july/","prev":{"excerpt":"It was our great pleasure to have invited Mr Steven Koh, the Deputy Director of Government Digital Services (GDS) at Govtech, to update us…","timeToRead":3,"frontmatter":{"title":"Updates to Govtech Agile Practices by Steven Koh - 2 July","tags":["Meetup"],"date":"2018-07-18T17:50:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"aspectRatio":1.3333333333333333,"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAABAACBf/EABYBAQEBAAAAAAAAAAAAAAAAAAIAAf/aAAwDAQACEAMQAAABZzh6OLgyv//EABwQAAIBBQEAAAAAAAAAAAAAAAECAwAREhMxQf/aAAgBAQABBQJtITwRlqbls2eUhv/EABYRAAMAAAAAAAAAAAAAAAAAAAABEf/aAAgBAwEBPwFqkP/EABURAQEAAAAAAAAAAAAAAAAAAAEQ/9oACAECAQE/ARJ//8QAHBAAAgICAwAAAAAAAAAAAAAAAAECESExEiIy/9oACAEBAAY/ApNS0dnxPQ87LTwOj//EABoQAAIDAQEAAAAAAAAAAAAAAAERACExQVH/2gAIAQEAAT8hsI8g5G21q4MYOMQGmoCwNG4Escn/2gAMAwEAAgADAAAAEP8AD//EABYRAAMAAAAAAAAAAAAAAAAAAAEQQf/aAAgBAwEBPxCAr//EABcRAQADAAAAAAAAAAAAAAAAAAABETH/2gAIAQIBAT8Qhat//8QAGhAAAwEBAQEAAAAAAAAAAAAAAREhADFBsf/aAAgBAQABPxBl5yWG8GJujIADqfnNA21SvuiI6OdbA0bJgUoL4MagESyDDd3/2Q==","sizes":"(max-width: 1400px) 100vw, 1400px","src":"/static/8d8fee52f47c44485daff296b0c76794/3dc2b/meetup-speaker.jpg","srcSet":"/static/8d8fee52f47c44485daff296b0c76794/f8f18/meetup-speaker.jpg 930w,\n/static/8d8fee52f47c44485daff296b0c76794/3dc2b/meetup-speaker.jpg 1400w"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/b4a08/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/updates-to-govtech-agile-practices/"}},"next":{"excerpt":"TL;DR Does asking users for feedback and ratings help in your app? Yes!When I joined Singapore Press Holdings in late 2015, most of the apps…","timeToRead":3,"frontmatter":{"title":"How to get your mobile app users to give you ratings and feedback!","tags":["Android"],"date":"2018-10-07T23:10:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"aspectRatio":2.074786324786325,"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAIAAAA7N+mxAAAACXBIWXMAAAsSAAALEgHS3X78AAABo0lEQVQoz2WRWW/TQBSF/c954kcgJErFA+ob8NBKhCVSaSsEArElJG3tZqkdjz2JZ+zZN+5MWoHEkT26tu935txx5pOcs7D4dAcfqGTHNxcvr8cv8ouPm5kzxqWvUsphGJzbQz7TWncdUUoj1HDOA8gHqfC8ev6rGq26dcso9IQkxhjA4V5Z8qNCYkKxMTaxwfWVRz9jZZzTVps7GEjghVI2JgkZvLLOaM2s0w7Sg4F3itJ+uVJaq3tZaxPcS6X+7lyjGmMshNTa7PtgMMDA6e5RKfAG0zYKN3V19Hnx4Hj26EOeQSsBUQJF+EdwdvsRQGjQiHLS7VqM2waNp7cH5/m7Ocogj4txwRoSG2h9Nh+flRMolIZtIYZkQgyCxyHgMsp7u7eNsA2euTiSSevDT4dPJ6+3QnFtwn/yKYwBCn6VNa7sFmf5qOPbTVd2TCxWj78WTw5/HJwUb98vT0eL0+/t9M3y/KQYf6m+HU1eTdFvqeOxZcqYpr3hXbHZrWtSlttbMeSKXqohJ/11Sy5rcrXaXlUkr/Cs7YtmN8X9mpt4QH8Ad7k0jshkD1kAAAAASUVORK5CYII=","sizes":"(max-width: 971px) 100vw, 971px","src":"/static/4d42232e07032296408b0a75d8f9815e/a83d1/zaobao-app-chart1.png","srcSet":"/static/4d42232e07032296408b0a75d8f9815e/4c9af/zaobao-app-chart1.png 930w,\n/static/4d42232e07032296408b0a75d8f9815e/a83d1/zaobao-app-chart1.png 971w"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/b4a08/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/get-your-app-users-to-give-feedback/"}},"primaryTag":"Meetup"}}} \ No newline at end of file diff --git a/page-data/developers-role-in-test-automation/page-data.json b/page-data/developers-role-in-test-automation/page-data.json index ea753fd..8a2bca2 100644 --- a/page-data/developers-role-in-test-automation/page-data.json +++ b/page-data/developers-role-in-test-automation/page-data.json @@ -1 +1 @@ -{"componentChunkName":"component---src-templates-post-tsx","path":"/developers-role-in-test-automation/","webpackCompilationHash":"e6542130e6dfe73197bb","result":{"data":{"logo":{"childImageSharp":{"fixed":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsSAAALEgHS3X78AAABFUlEQVQY023PvUrDUBTA8ZuCtoMoOLQ4dWhN14x2kEKXFkGoohQ/QBexOHRycAidKkgHHRq69APRoTjFJYODIA6+gSBYfYMmfYLE/5VT6NALP845NyeHc9UoCHZRQvonCLKKE4ZhAXYURTsYoE9dIy5iCzfUJnEdV+RF4iu6ikFH2EPxazzOcJmg4Rnn5C8ysIEOHqTe5/sT3qXOwYOtRr5/wLAqzpCTDXu4p2ETtyjgGJ/cX+se8jeU9fa4RBt5vWENpjzdkoGPcGg4RQsbOMEFmnBRRwVDHEK/yFXfvr/CoPjvZLKcdByDyzWGeajigzorGy0oOeRJiUtITe/pX1XzDk3buIMltSFR/zTtic3060X+8z8PsEUt8G3LVQAAAABJRU5ErkJggg==","width":400,"height":128,"src":"/static/2b5eaa0de166a8b5faebad4955c2200c/647de/ghost-logo.png","srcSet":"/static/2b5eaa0de166a8b5faebad4955c2200c/647de/ghost-logo.png 1x"}}},"markdownRemark":{"html":"

Rod Michael, director of global market access strategy and channels at Rockwell Automation, famously said,

\n
\n

“If you automate a mess, you get an automated mess.”

\n
\n

A meaningful and therefore effective automated test system is created with intelligent design. It is not something that just happens.

\n

As we all know, testing processes are important in order to deliver a bug-free application. Amplifying its impact, automated testing is beneficial in saving build validation time and effort, as well as helpful in demystifying crucial performance hurdles in the application. Eventually, this paves the way to deliver outstanding softwares.

\n

Hence, it is crucial for a test engineer to create an effective road map and choose the right tools to build a robust test automation framework. Besides the test engineers, developers also play a vital role in the successful implementation of the automation framework.

\n

There are several guidelines/principles available online to guide a test engineer to effectively strategise and implement the test automation framework. However, in this post, we would like to shed some light on the contribution that is required from fellow developers.

\n

Some development practices that set the foundation to naturally drive the automation are:

\n
    \n
  1. Make sure the app is CI/CD ready (can be deployed anywhere).
  2. \n
  3. Use APIs to help automation with quick setup/cleanup.
  4. \n
  5. Follow naming conventions/standards to intuitively allow automation engineers/tools to determine the element ID.
  6. \n
  7. Write design documents for new features, involve at least 1 automation engineer to review the same and actively involve in test case review processes.
  8. \n
  9. Have a centralise repository (that is easily accessible) to check-in/check-out development source codes.
  10. \n
  11. Move towards Behavioural Driven Development (BDD) - product owner/developers to come up with the set of user stories for the feature to be developed. That would help test engineers to map it to their Cucumber feature file.
  12. \n
  13. Write unit test cases to ensure the first hand validation of the feature and provide a baseline for automation engineers to improvise further.
  14. \n
\n

Some of the immediate action items for developers to contribute towards effective software automation are:

\n

1. Always assign unique locators for page elements in a single view

\n

How:

\n

\n \n \n \n \n

\n

i. As shown above, every element in application view have identifiers to locate from backend.

\n
    \n
  1. For iOS apps, it is the Accessibility ID
  2. \n
  3. For Android apps, it is the ID
  4. \n
\n

ii. It is always a best practice to have a unique value to such identifiers (or at least try to have it unique across the same page/view).

\n

Why: Unique locators allow better navigation.

\n

2. Avoid creating dynamic IDs for page elements, which keeps changing with view/session reload

\n

How: Dynamic IDs are worse than non-unique locators, as that serves as anti-automation practice. Use static locators (such as IDs instead of Xpath).

\n

Why: Static locators contributes to robust automation framework.

\n

3. Always provide a proper title to window or screen

\n

How: Follow standard naming conventions for element IDs and locators.

\n

Why: For automation engineers to be able to intuitively determine the element locators in future, allowing:
\ni. feature development and automation to work in parallel,
\nii. minimal dependency and work efficiently in agile.

\n

Conclusion

\n

Hence, the developers has the important responsibility to make object identifications easy and make application behaviour predictable. These pointers, if taken care of, will help test automation to be more efficient, and the test automation framework to be more robust. Otherwise no matter how good the test automation architecture or tool is, it can not help much and will not be effective.

","htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Rod Michael, director of global market access strategy and channels at Rockwell Automation, famously said, "}]},{"type":"text","value":"\n"},{"type":"element","tagName":"blockquote","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"“If you automate a mess, you get an automated mess.”"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"A meaningful and therefore effective automated test system is created with intelligent design. It is not something that just happens."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"As we all know, testing processes are important in order to deliver a bug-free application. Amplifying its impact, automated testing is beneficial in saving build validation time and effort, as well as helpful in demystifying crucial performance hurdles in the application. Eventually, this paves the way to deliver outstanding softwares."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hence, it is crucial for a test engineer to create an effective road map and choose the right tools to build a robust test automation framework. Besides the test engineers, developers also play a vital role in the successful implementation of the automation framework."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"There are several guidelines/principles available online to guide a test engineer to effectively strategise and implement the test automation framework. However, in this post, we would like to shed some light on the contribution that is required from fellow developers."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Some development practices that set the foundation to naturally drive the automation are:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ol","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Make sure the app is CI/CD ready (can be deployed anywhere)."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Use APIs to help automation with quick setup/cleanup."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Follow naming conventions/standards to intuitively allow automation engineers/tools to determine the element ID."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Write design documents for new features, involve at least 1 automation engineer to review the same and actively involve in test case review processes."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Have a centralise repository (that is easily accessible) to check-in/check-out development source codes."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Move towards Behavioural Driven Development (BDD) - product owner/developers to come up with the set of user stories for the feature to be developed. That would help test engineers to map it to their Cucumber feature file."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Write unit test cases to ensure the first hand validation of the feature and provide a baseline for automation engineers to improvise further."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Some of the immediate action items for developers to contribute towards effective software automation are:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"1. Always assign unique locators for page elements in a single view"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"How:"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/6edd066752220a341bee836a46884a85/51a3e/blog-test-automation2.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1170px;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 58.785714285714285%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsTAAALEwEAmpwYAAACGUlEQVQoz4WTy2sTURjF70oX2qaG6qI+liqljTEutCtrUBRFFIrmUa2bQjcuxVgQCq2CCwUf+AfYhYKCOxFcuHPnv1GS5jFJ5nFnJjOT4z03nUmTjR8c5s6de3+c7zHiarmCfHEdl+9XsFh4hoW7T7D97Rd6nkSj2YR0XUgp4TjOiCzLgmEYqNfr6Ha7sG1b74tUpoBDswUcni2Ca3HiBl59/ApG12hDqsO+6yEIQvT7fcQRRZGW7/vwPA9hGOp98fz1J0xlyjhzZQ2nLlUgTq5h891n/dFst9Ha2YFjmogUjABCKQLonKI7vlNiIX8b6dwjBS3iyLlViJkCXrz/ooHSkTCqVVitFsaDl3u9nhZTpUuuxdncogam5kuYPl+GOH49AfKAqWCmqqXruElqdBoEgX5nynTJs3Qurt25h6nsinJYUg4VcObmCLCjit6pVeHZEp5qEAGxMwIJdtV+XFORyZeQzj7A5FwRxy6sKIdDYKAOGG0Lu7stNAwbTVMmjeHl2CHhDO3w4tK6dpZSjZnOPRwB2qaFTqOpn2HU143Z3xSC6JBKgKuVD5iYY0OWcXQM6Kqm+ExnbyTUlcQhgXEj9oPF46cvMTFf1imns8u6hlt7QLqKY+AMCZAQDvS4xI/ff3Hg9JKGDWp4C5tvB3MYhGGS4hA6BPJPGZf4/vMPDirgpE67rIEbb7b/C+SoVNWM1mo1/Yz1DyELGLxLgt9oAAAAAElFTkSuQmCC'); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;box-shadow:inset 0px 0px 0px 400px white;","alt":"blog test automation2","title":"","src":"/static/6edd066752220a341bee836a46884a85/1c968/blog-test-automation2.png","srcSet":["/static/6edd066752220a341bee836a46884a85/eb41c/blog-test-automation2.png 293w","/static/6edd066752220a341bee836a46884a85/7110a/blog-test-automation2.png 585w","/static/6edd066752220a341bee836a46884a85/1c968/blog-test-automation2.png 1170w","/static/6edd066752220a341bee836a46884a85/51a3e/blog-test-automation2.png 1400w"],"sizes":["(max-width:","1170px)","100vw,","1170px"]},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"i. As shown above, every element in application view have identifiers to locate from backend."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ol","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"For iOS apps, it is the Accessibility ID"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"For Android apps, it is the ID"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"ii. It is always a best practice to have a unique value to such identifiers (or at least try to have it unique across the same page/view)."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Why:"}]},{"type":"text","value":" Unique locators allow better navigation."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"2. Avoid creating dynamic IDs for page elements, which keeps changing with view/session reload"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"How:"}]},{"type":"text","value":" Dynamic IDs are worse than non-unique locators, as that serves as anti-automation practice. Use static locators (such as IDs instead of Xpath)."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Why:"}]},{"type":"text","value":" Static locators contributes to robust automation framework."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"3. Always provide a proper title to window or screen"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"How:"}]},{"type":"text","value":" Follow standard naming conventions for element IDs and locators."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Why:"}]},{"type":"text","value":" For automation engineers to be able to intuitively determine the element locators in future, allowing:"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\ni. feature development and automation to work in parallel,"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nii. minimal dependency and work efficiently in agile."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"Conclusion"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hence, the developers has the important responsibility to make object identifications easy and make application behaviour predictable. These pointers, if taken care of, will help test automation to be more efficient, and the test automation framework to be more robust. Otherwise no matter how good the test automation architecture or tool is, it can not help much and will not be effective."}]}],"data":{"quirksMode":false}},"excerpt":"Rod Michael, director of global market access strategy and channels at Rockwell Automation, famously said, “If you automate a mess, you get…","timeToRead":3,"frontmatter":{"title":"The developer's role in a successful implementation of the test automation","userDate":"6 December 2018","date":"2018-12-06T12:54:00.000Z","tags":["Testing"],"image":{"childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAACiElEQVQoz02SS0hUURjHZ9WqoE0RbcJFRUWBROuKCKqNFY1iD2yRo5ELicqoSBOMMGSsQHpDlBbVooYwhKgcSU3thUo048C0cJh7ve9zn/P6950zjnThz3fvuYff9z//74TiI8OIj05ibHwKo6RP8XGMTXxHOpXE1+kkfqVlqHIWiqKSFKTTaczNzQklEgkkk0mkUqklhTbuasaKzbVYs/0EVlUfR2jtfhxoaEcxn4PvewBKKJVKKBaLQvydK5fLgTEGx3FQKBTEGq+hzt7nONP+EFd7X+BC9zO0XHuEewNDCJiFwPXhuR5c10U+n18C88q/+eP7vnBuGIZYCyX//MTv2UnMzEwiMTuBv4kfkDJp6AsKtKwMXWVQNQOKpoPZtnD2P5A7nJ+fhyRJ4l/o8/t+vOmP4nqkBq9vX8bgqz5MfRkC002YBLUtBw45ZbYDj9xUnFbA3H0mk4Esy2WHE8Mx3L/VgTtnG/Gg6xJiL+9i+lscjmHCok2MjhO4ATzPg20zAeJPxSEHZrNZcWwBHPswgG1b1qGtO4qGxiZEz9cjNTuCIMjDWliAKcmwDQqfHDJmE9gX4VfAvBF3p6pqGXix4ylWb2jGjr1dqN7diaqtrejti5UDp4EwgtrU3WeOGJBDLoPFo1fEG/BhiSnvPBLDsqpBLF//Fis3vaNrE8PJcx8JVyQXBWiKBkXiU3RhMA+qacOiTHO5vJhwEJTj4FU4bOt6gnCkB/WnexBuuoGDdVcQvflYOORddUWHSkBdc6AaDiSauEbQ3GKG/OimaVK+ttgfikROoa72EI4dDSMcrsHhfXtwpbUFLmVl08U1KB9DlmCqOgxdJ7BKVRMQy7KE+B3kw+HQf+uQ+eTE1QltAAAAAElFTkSuQmCC","aspectRatio":1.8252933507170794,"src":"/static/131b22d7fad4398f72deddd43464e6a3/cd9a9/blog-test-automation.png","srcSet":"/static/131b22d7fad4398f72deddd43464e6a3/4c9af/blog-test-automation.png 930w,\n/static/131b22d7fad4398f72deddd43464e6a3/cd9a9/blog-test-automation.png 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAADQElEQVQ4y5VUW0tUURSeX9BDhFZQ1Nx0lCAqI+o1KMiHoqjIesisXiLSQOhiRUWUdKEwKqKHtNIyJLuY0UWS0lBKM8mcrEadcnIc58zlzMyZvc/+WjNnRs+xIWjDd9a+fudba6+1TaAmhEDaCqESONItOZewCUitgK8JIu7TxrQXqbV0M00lSzd1LAgRiU5u/3oAaJ0NQcC7RYC/LXWOJz6ThHoVyX74GynpRKTuLZjTo815SNWzbIjuEsD7EqJjHUT7KoNnBoVpZer3G+DN+eBNNvD2Egh5BCLqAW9ZCf7YDBF0agTjXbRnAbkezESYikPIBfYgH+y+BawhD6x+LtjDAsJSxOutiN+zgPechWAyeNs+sNZiXagyEKq+Xig1dii386DcyiU4oFRbodwk1CT6dq1fnQv2vJiUj6cIVYNKk55dadyC6PnpiF3LRfRqziSu2Ak0d9mC2I0C6JtQVYNSk+Evsg9K035EKs2InLUhci6HrD0F6ldaEbmwEKz7HrjrHamUpqg0pM1kyrD3dxE+Ykb4mB3ho2nYaI5shQXhg3MRPmyGfGY5+OCHlFKuv+UUKY8nLR/8iFCZBaH9VoKN+glr11BK41KyZTkI7poBuaook8vCcFvypRIEts1EYLcdgRILAjttkLbOhlQ0C4EdiXEOrTlozxyEjhQaLsY0Nbjq7yE67IC00Qxps5VAZOvJxeNbET61HdKG+fCvyYK/MBv+1TMQa66ZcDkjIf/los02OmSBf62DDs2DtGkxVZCWxKy/G5HrZ+gHe6G8eWqoeWPp6SpGPl0O74JpGFuSBR/ZaHWVdiiuxTjW0o/QxeY0laEEDZeiksoEJYvTjTXeQfRkOeSG2mQ+CJ0XzOVBvGtgwk09x4TLqhCGhP1EKTaeXsO/21+PA1e1iVfOMRx94iT048SjPuyp68GL3l+Aux/MMwTuHqAS9UClOKveEaijbkpu+e/SYynC2x1uZB16gWXn2zA8JqO2043d9X2AxwnF/R3scwf4QE+SlH/rBet6TS/Q+NRLERPuDoyGUUHqVlxox6svXri8Mtp+kO+RAFQ5RCk1nCRQRwbpdZI0KNHMj4M+hr0/g8YY/UcM/wD4fYcC4gOWgAAAAABJRU5ErkJggg==","width":400,"height":400,"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png","srcSet":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png 1x,\n/static/7fa6bee9d2080bd021828c70f67a4720/fca9c/sphtech.png 1.5x"}}]}}}},"relatedPosts":{"totalCount":2,"edges":[{"node":{"id":"f38178da-53a5-503d-9d60-cc7df7f03750","timeToRead":3,"excerpt":"Rod Michael, director of global market access strategy and channels at Rockwell Automation, famously said, “If you automate a mess, you get…","frontmatter":{"title":"The developer's role in a successful implementation of the test automation"},"fields":{"slug":"/developers-role-in-test-automation/"}}},{"node":{"id":"12eeed0a-39f3-5439-83c9-9a5c79531c30","timeToRead":4,"excerpt":"A class is an observable live data that can be used to send events from ViewModel to View in Android MVVM-styled designs.This link…","frontmatter":{"title":"Using Mockito's ArgumentCaptor on SingleLiveEvent"},"fields":{"slug":"/using-mockitos-argumentcaptor/"}}}]}},"pageContext":{"isCreatedByStatefulCreatePages":false,"slug":"/developers-role-in-test-automation/","prev":{"excerpt":"On the 21st of November, SPH staff gathered for a cozy SPHTech Meetup session at The Inspiration Hub to learn about Data Privacy efforts in…","timeToRead":1,"frontmatter":{"title":"Towards a Privacy Aware Smart Nation","tags":["Meetup","Review"],"date":"2018-11-29T12:43:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"aspectRatio":2.130492676431425,"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAJABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAEFAgT/xAAVAQEBAAAAAAAAAAAAAAAAAAABAv/aAAwDAQACEAMQAAAB053bCyYWf//EABsQAQEAAQUAAAAAAAAAAAAAAAECAAMEETFD/9oACAEBAAEFAm5ETmN0SanXkZ//xAAWEQADAAAAAAAAAAAAAAAAAAACEBP/2gAIAQMBAT8BmK//xAAWEQADAAAAAAAAAAAAAAAAAAABEBL/2gAIAQIBAT8Bsr//xAAdEAACAgEFAAAAAAAAAAAAAAAAAQIRIgMhMVFx/9oACAEBAAY/AlhsPC1dIpx46IGmP0//xAAZEAEBAQEBAQAAAAAAAAAAAAABABExkaH/2gAIAQEAAT8h5JXdYTvtDIM+p9zM9V//2gAMAwEAAgADAAAAED/v/8QAFxEBAQEBAAAAAAAAAAAAAAAAAQAhEf/aAAgBAwEBPxBDebDf/8QAFxEBAQEBAAAAAAAAAAAAAAAAAQAhYf/aAAgBAgEBPxDE7Jf/xAAeEAEAAQMFAQAAAAAAAAAAAAABABEhMRBBUZGhsf/aAAgBAQABPxByuAIDK1Q3gs3CANhxD6tQMee610h6X4z3J//Z","sizes":"(max-width: 1600px) 100vw, 1600px","src":"/static/ef473fd608a488e0579a6ab7fe528337/989b1/sphtech-meetup-ncript.jpg","srcSet":"/static/ef473fd608a488e0579a6ab7fe528337/f8f18/sphtech-meetup-ncript.jpg 930w,\n/static/ef473fd608a488e0579a6ab7fe528337/989b1/sphtech-meetup-ncript.jpg 1600w"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/b4a08/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/towards-a-privacy-aware-smart-nation/"}},"next":{"excerpt":"This is the beginning of an exciting era for our SPHTech team!Over here, you will get to read about our learnings and reviews of the new…","timeToRead":1,"frontmatter":{"title":"About Us","tags":[],"date":"2019-01-01T23:46:37.131Z","draft":false,"image":{"childImageSharp":{"fluid":{"aspectRatio":1.3333333333333333,"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAIEBf/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAGuZFjMNEX/xAAdEAEAAQMFAAAAAAAAAAAAAAACAAEDBBAREhMh/9oACAEBAAEFAqk73admiQMNvhDjef/EABURAQEAAAAAAAAAAAAAAAAAABAR/9oACAEDAQE/AYf/xAAVEQEBAAAAAAAAAAAAAAAAAAAQEf/aAAgBAgEBPwGn/8QAHhAAAQMEAwAAAAAAAAAAAAAAAQACERASITEiMqH/2gAIAQEABj8CuZiUJOhNBvKc67iRC7+L/8QAGxAAAwEBAAMAAAAAAAAAAAAAAAERIUExUZH/2gAIAQEAAT8hXdlJvRVr82FbLNeeRv6zEU2luHoB/9oADAMBAAIAAwAAABCbz//EABYRAQEBAAAAAAAAAAAAAAAAAAARIf/aAAgBAwEBPxCq1//EABURAQEAAAAAAAAAAAAAAAAAABAx/9oACAECAQE/EIP/xAAdEAEAAwACAwEAAAAAAAAAAAABABEhMUFhgaGx/9oACAEBAAE/EGQtNWliantl6rW3JQv7Ft0sdQkrFDejvYtC2gI4vfMdTuuls+z/2Q==","sizes":"(max-width: 1400px) 100vw, 1400px","src":"/static/e26b6c56a85123d553d70dcd1ce2285a/3dc2b/cafe-ppl-collab.jpg","srcSet":"/static/e26b6c56a85123d553d70dcd1ce2285a/f8f18/cafe-ppl-collab.jpg 930w,\n/static/e26b6c56a85123d553d70dcd1ce2285a/3dc2b/cafe-ppl-collab.jpg 1400w"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/b4a08/sphtech.png"}}]}}},"fields":{"layout":"postnodate","slug":"/about-us/"}},"primaryTag":"Testing"}}} \ No newline at end of file +{"componentChunkName":"component---src-templates-post-tsx","path":"/developers-role-in-test-automation/","webpackCompilationHash":"4d127609ee78b8f0aee7","result":{"data":{"logo":{"childImageSharp":{"fixed":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsSAAALEgHS3X78AAABFUlEQVQY023PvUrDUBTA8ZuCtoMoOLQ4dWhN14x2kEKXFkGoohQ/QBexOHRycAidKkgHHRq69APRoTjFJYODIA6+gSBYfYMmfYLE/5VT6NALP845NyeHc9UoCHZRQvonCLKKE4ZhAXYURTsYoE9dIy5iCzfUJnEdV+RF4iu6ikFH2EPxazzOcJmg4Rnn5C8ysIEOHqTe5/sT3qXOwYOtRr5/wLAqzpCTDXu4p2ETtyjgGJ/cX+se8jeU9fa4RBt5vWENpjzdkoGPcGg4RQsbOMEFmnBRRwVDHEK/yFXfvr/CoPjvZLKcdByDyzWGeajigzorGy0oOeRJiUtITe/pX1XzDk3buIMltSFR/zTtic3060X+8z8PsEUt8G3LVQAAAABJRU5ErkJggg==","width":400,"height":128,"src":"/static/2b5eaa0de166a8b5faebad4955c2200c/647de/ghost-logo.png","srcSet":"/static/2b5eaa0de166a8b5faebad4955c2200c/647de/ghost-logo.png 1x"}}},"markdownRemark":{"html":"

Rod Michael, director of global market access strategy and channels at Rockwell Automation, famously said,

\n
\n

“If you automate a mess, you get an automated mess.”

\n
\n

A meaningful and therefore effective automated test system is created with intelligent design. It is not something that just happens.

\n

As we all know, testing processes are important in order to deliver a bug-free application. Amplifying its impact, automated testing is beneficial in saving build validation time and effort, as well as helpful in demystifying crucial performance hurdles in the application. Eventually, this paves the way to deliver outstanding softwares.

\n

Hence, it is crucial for a test engineer to create an effective road map and choose the right tools to build a robust test automation framework. Besides the test engineers, developers also play a vital role in the successful implementation of the automation framework.

\n

There are several guidelines/principles available online to guide a test engineer to effectively strategise and implement the test automation framework. However, in this post, we would like to shed some light on the contribution that is required from fellow developers.

\n

Some development practices that set the foundation to naturally drive the automation are:

\n
    \n
  1. Make sure the app is CI/CD ready (can be deployed anywhere).
  2. \n
  3. Use APIs to help automation with quick setup/cleanup.
  4. \n
  5. Follow naming conventions/standards to intuitively allow automation engineers/tools to determine the element ID.
  6. \n
  7. Write design documents for new features, involve at least 1 automation engineer to review the same and actively involve in test case review processes.
  8. \n
  9. Have a centralise repository (that is easily accessible) to check-in/check-out development source codes.
  10. \n
  11. Move towards Behavioural Driven Development (BDD) - product owner/developers to come up with the set of user stories for the feature to be developed. That would help test engineers to map it to their Cucumber feature file.
  12. \n
  13. Write unit test cases to ensure the first hand validation of the feature and provide a baseline for automation engineers to improvise further.
  14. \n
\n

Some of the immediate action items for developers to contribute towards effective software automation are:

\n

1. Always assign unique locators for page elements in a single view

\n

How:

\n

\n \n \n \n \n

\n

i. As shown above, every element in application view have identifiers to locate from backend.

\n
    \n
  1. For iOS apps, it is the Accessibility ID
  2. \n
  3. For Android apps, it is the ID
  4. \n
\n

ii. It is always a best practice to have a unique value to such identifiers (or at least try to have it unique across the same page/view).

\n

Why: Unique locators allow better navigation.

\n

2. Avoid creating dynamic IDs for page elements, which keeps changing with view/session reload

\n

How: Dynamic IDs are worse than non-unique locators, as that serves as anti-automation practice. Use static locators (such as IDs instead of Xpath).

\n

Why: Static locators contributes to robust automation framework.

\n

3. Always provide a proper title to window or screen

\n

How: Follow standard naming conventions for element IDs and locators.

\n

Why: For automation engineers to be able to intuitively determine the element locators in future, allowing:
\ni. feature development and automation to work in parallel,
\nii. minimal dependency and work efficiently in agile.

\n

Conclusion

\n

Hence, the developers has the important responsibility to make object identifications easy and make application behaviour predictable. These pointers, if taken care of, will help test automation to be more efficient, and the test automation framework to be more robust. Otherwise no matter how good the test automation architecture or tool is, it can not help much and will not be effective.

","htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Rod Michael, director of global market access strategy and channels at Rockwell Automation, famously said, "}]},{"type":"text","value":"\n"},{"type":"element","tagName":"blockquote","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"“If you automate a mess, you get an automated mess.”"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"A meaningful and therefore effective automated test system is created with intelligent design. It is not something that just happens."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"As we all know, testing processes are important in order to deliver a bug-free application. Amplifying its impact, automated testing is beneficial in saving build validation time and effort, as well as helpful in demystifying crucial performance hurdles in the application. Eventually, this paves the way to deliver outstanding softwares."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hence, it is crucial for a test engineer to create an effective road map and choose the right tools to build a robust test automation framework. Besides the test engineers, developers also play a vital role in the successful implementation of the automation framework."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"There are several guidelines/principles available online to guide a test engineer to effectively strategise and implement the test automation framework. However, in this post, we would like to shed some light on the contribution that is required from fellow developers."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Some development practices that set the foundation to naturally drive the automation are:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ol","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Make sure the app is CI/CD ready (can be deployed anywhere)."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Use APIs to help automation with quick setup/cleanup."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Follow naming conventions/standards to intuitively allow automation engineers/tools to determine the element ID."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Write design documents for new features, involve at least 1 automation engineer to review the same and actively involve in test case review processes."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Have a centralise repository (that is easily accessible) to check-in/check-out development source codes."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Move towards Behavioural Driven Development (BDD) - product owner/developers to come up with the set of user stories for the feature to be developed. That would help test engineers to map it to their Cucumber feature file."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Write unit test cases to ensure the first hand validation of the feature and provide a baseline for automation engineers to improvise further."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Some of the immediate action items for developers to contribute towards effective software automation are:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"1. Always assign unique locators for page elements in a single view"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"How:"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/6edd066752220a341bee836a46884a85/51a3e/blog-test-automation2.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1170px;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 58.785714285714285%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsTAAALEwEAmpwYAAACGUlEQVQoz4WTy2sTURjF70oX2qaG6qI+liqljTEutCtrUBRFFIrmUa2bQjcuxVgQCq2CCwUf+AfYhYKCOxFcuHPnv1GS5jFJ5nFnJjOT4z03nUmTjR8c5s6de3+c7zHiarmCfHEdl+9XsFh4hoW7T7D97Rd6nkSj2YR0XUgp4TjOiCzLgmEYqNfr6Ha7sG1b74tUpoBDswUcni2Ca3HiBl59/ApG12hDqsO+6yEIQvT7fcQRRZGW7/vwPA9hGOp98fz1J0xlyjhzZQ2nLlUgTq5h891n/dFst9Ha2YFjmogUjABCKQLonKI7vlNiIX8b6dwjBS3iyLlViJkCXrz/ooHSkTCqVVitFsaDl3u9nhZTpUuuxdncogam5kuYPl+GOH49AfKAqWCmqqXruElqdBoEgX5nynTJs3Qurt25h6nsinJYUg4VcObmCLCjit6pVeHZEp5qEAGxMwIJdtV+XFORyZeQzj7A5FwRxy6sKIdDYKAOGG0Lu7stNAwbTVMmjeHl2CHhDO3w4tK6dpZSjZnOPRwB2qaFTqOpn2HU143Z3xSC6JBKgKuVD5iYY0OWcXQM6Kqm+ExnbyTUlcQhgXEj9oPF46cvMTFf1imns8u6hlt7QLqKY+AMCZAQDvS4xI/ff3Hg9JKGDWp4C5tvB3MYhGGS4hA6BPJPGZf4/vMPDirgpE67rIEbb7b/C+SoVNWM1mo1/Yz1DyELGLxLgt9oAAAAAElFTkSuQmCC'); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;box-shadow:inset 0px 0px 0px 400px white;","alt":"blog test automation2","title":"","src":"/static/6edd066752220a341bee836a46884a85/1c968/blog-test-automation2.png","srcSet":["/static/6edd066752220a341bee836a46884a85/eb41c/blog-test-automation2.png 293w","/static/6edd066752220a341bee836a46884a85/7110a/blog-test-automation2.png 585w","/static/6edd066752220a341bee836a46884a85/1c968/blog-test-automation2.png 1170w","/static/6edd066752220a341bee836a46884a85/51a3e/blog-test-automation2.png 1400w"],"sizes":["(max-width:","1170px)","100vw,","1170px"]},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"i. As shown above, every element in application view have identifiers to locate from backend."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ol","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"For iOS apps, it is the Accessibility ID"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"For Android apps, it is the ID"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"ii. It is always a best practice to have a unique value to such identifiers (or at least try to have it unique across the same page/view)."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Why:"}]},{"type":"text","value":" Unique locators allow better navigation."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"2. Avoid creating dynamic IDs for page elements, which keeps changing with view/session reload"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"How:"}]},{"type":"text","value":" Dynamic IDs are worse than non-unique locators, as that serves as anti-automation practice. Use static locators (such as IDs instead of Xpath)."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Why:"}]},{"type":"text","value":" Static locators contributes to robust automation framework."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"3. Always provide a proper title to window or screen"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"How:"}]},{"type":"text","value":" Follow standard naming conventions for element IDs and locators."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Why:"}]},{"type":"text","value":" For automation engineers to be able to intuitively determine the element locators in future, allowing:"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\ni. feature development and automation to work in parallel,"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nii. minimal dependency and work efficiently in agile."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"Conclusion"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hence, the developers has the important responsibility to make object identifications easy and make application behaviour predictable. These pointers, if taken care of, will help test automation to be more efficient, and the test automation framework to be more robust. Otherwise no matter how good the test automation architecture or tool is, it can not help much and will not be effective."}]}],"data":{"quirksMode":false}},"excerpt":"Rod Michael, director of global market access strategy and channels at Rockwell Automation, famously said, “If you automate a mess, you get…","timeToRead":3,"frontmatter":{"title":"The developer's role in a successful implementation of the test automation","userDate":"6 December 2018","date":"2018-12-06T12:54:00.000Z","tags":["Testing"],"image":{"childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAACiElEQVQoz02SS0hUURjHZ9WqoE0RbcJFRUWBROuKCKqNFY1iD2yRo5ELicqoSBOMMGSsQHpDlBbVooYwhKgcSU3thUo048C0cJh7ve9zn/P6950zjnThz3fvuYff9z//74TiI8OIj05ibHwKo6RP8XGMTXxHOpXE1+kkfqVlqHIWiqKSFKTTaczNzQklEgkkk0mkUqklhTbuasaKzbVYs/0EVlUfR2jtfhxoaEcxn4PvewBKKJVKKBaLQvydK5fLgTEGx3FQKBTEGq+hzt7nONP+EFd7X+BC9zO0XHuEewNDCJiFwPXhuR5c10U+n18C88q/+eP7vnBuGIZYCyX//MTv2UnMzEwiMTuBv4kfkDJp6AsKtKwMXWVQNQOKpoPZtnD2P5A7nJ+fhyRJ4l/o8/t+vOmP4nqkBq9vX8bgqz5MfRkC002YBLUtBw45ZbYDj9xUnFbA3H0mk4Esy2WHE8Mx3L/VgTtnG/Gg6xJiL+9i+lscjmHCok2MjhO4ATzPg20zAeJPxSEHZrNZcWwBHPswgG1b1qGtO4qGxiZEz9cjNTuCIMjDWliAKcmwDQqfHDJmE9gX4VfAvBF3p6pqGXix4ylWb2jGjr1dqN7diaqtrejti5UDp4EwgtrU3WeOGJBDLoPFo1fEG/BhiSnvPBLDsqpBLF//Fis3vaNrE8PJcx8JVyQXBWiKBkXiU3RhMA+qacOiTHO5vJhwEJTj4FU4bOt6gnCkB/WnexBuuoGDdVcQvflYOORddUWHSkBdc6AaDiSauEbQ3GKG/OimaVK+ttgfikROoa72EI4dDSMcrsHhfXtwpbUFLmVl08U1KB9DlmCqOgxdJ7BKVRMQy7KE+B3kw+HQf+uQ+eTE1QltAAAAAElFTkSuQmCC","aspectRatio":1.8252933507170794,"src":"/static/131b22d7fad4398f72deddd43464e6a3/cd9a9/blog-test-automation.png","srcSet":"/static/131b22d7fad4398f72deddd43464e6a3/4c9af/blog-test-automation.png 930w,\n/static/131b22d7fad4398f72deddd43464e6a3/cd9a9/blog-test-automation.png 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAADQElEQVQ4y5VUW0tUURSeX9BDhFZQ1Nx0lCAqI+o1KMiHoqjIesisXiLSQOhiRUWUdKEwKqKHtNIyJLuY0UWS0lBKM8mcrEadcnIc58zlzMyZvc/+WjNnRs+xIWjDd9a+fudba6+1TaAmhEDaCqESONItOZewCUitgK8JIu7TxrQXqbV0M00lSzd1LAgRiU5u/3oAaJ0NQcC7RYC/LXWOJz6ThHoVyX74GynpRKTuLZjTo815SNWzbIjuEsD7EqJjHUT7KoNnBoVpZer3G+DN+eBNNvD2Egh5BCLqAW9ZCf7YDBF0agTjXbRnAbkezESYikPIBfYgH+y+BawhD6x+LtjDAsJSxOutiN+zgPechWAyeNs+sNZiXagyEKq+Xig1dii386DcyiU4oFRbodwk1CT6dq1fnQv2vJiUj6cIVYNKk55dadyC6PnpiF3LRfRqziSu2Ak0d9mC2I0C6JtQVYNSk+Evsg9K035EKs2InLUhci6HrD0F6ldaEbmwEKz7HrjrHamUpqg0pM1kyrD3dxE+Ykb4mB3ho2nYaI5shQXhg3MRPmyGfGY5+OCHlFKuv+UUKY8nLR/8iFCZBaH9VoKN+glr11BK41KyZTkI7poBuaook8vCcFvypRIEts1EYLcdgRILAjttkLbOhlQ0C4EdiXEOrTlozxyEjhQaLsY0Nbjq7yE67IC00Qxps5VAZOvJxeNbET61HdKG+fCvyYK/MBv+1TMQa66ZcDkjIf/los02OmSBf62DDs2DtGkxVZCWxKy/G5HrZ+gHe6G8eWqoeWPp6SpGPl0O74JpGFuSBR/ZaHWVdiiuxTjW0o/QxeY0laEEDZeiksoEJYvTjTXeQfRkOeSG2mQ+CJ0XzOVBvGtgwk09x4TLqhCGhP1EKTaeXsO/21+PA1e1iVfOMRx94iT048SjPuyp68GL3l+Aux/MMwTuHqAS9UClOKveEaijbkpu+e/SYynC2x1uZB16gWXn2zA8JqO2043d9X2AxwnF/R3scwf4QE+SlH/rBet6TS/Q+NRLERPuDoyGUUHqVlxox6svXri8Mtp+kO+RAFQ5RCk1nCRQRwbpdZI0KNHMj4M+hr0/g8YY/UcM/wD4fYcC4gOWgAAAAABJRU5ErkJggg==","width":400,"height":400,"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png","srcSet":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png 1x,\n/static/7fa6bee9d2080bd021828c70f67a4720/fca9c/sphtech.png 1.5x"}}]}}}},"relatedPosts":{"totalCount":2,"edges":[{"node":{"id":"f38178da-53a5-503d-9d60-cc7df7f03750","timeToRead":3,"excerpt":"Rod Michael, director of global market access strategy and channels at Rockwell Automation, famously said, “If you automate a mess, you get…","frontmatter":{"title":"The developer's role in a successful implementation of the test automation"},"fields":{"slug":"/developers-role-in-test-automation/"}}},{"node":{"id":"12eeed0a-39f3-5439-83c9-9a5c79531c30","timeToRead":4,"excerpt":"A class is an observable live data that can be used to send events from ViewModel to View in Android MVVM-styled designs.This link…","frontmatter":{"title":"Using Mockito's ArgumentCaptor on SingleLiveEvent"},"fields":{"slug":"/using-mockitos-argumentcaptor/"}}}]}},"pageContext":{"isCreatedByStatefulCreatePages":false,"slug":"/developers-role-in-test-automation/","prev":{"excerpt":"On the 21st of November, SPH staff gathered for a cozy SPHTech Meetup session at The Inspiration Hub to learn about Data Privacy efforts in…","timeToRead":1,"frontmatter":{"title":"Towards a Privacy Aware Smart Nation","tags":["Meetup","Review"],"date":"2018-11-29T12:43:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"aspectRatio":2.130492676431425,"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAJABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAEFAgT/xAAVAQEBAAAAAAAAAAAAAAAAAAABAv/aAAwDAQACEAMQAAAB053bCyYWf//EABsQAQEAAQUAAAAAAAAAAAAAAAECAAMEETFD/9oACAEBAAEFAm5ETmN0SanXkZ//xAAWEQADAAAAAAAAAAAAAAAAAAACEBP/2gAIAQMBAT8BmK//xAAWEQADAAAAAAAAAAAAAAAAAAABEBL/2gAIAQIBAT8Bsr//xAAdEAACAgEFAAAAAAAAAAAAAAAAAQIRIgMhMVFx/9oACAEBAAY/AlhsPC1dIpx46IGmP0//xAAZEAEBAQEBAQAAAAAAAAAAAAABABExkaH/2gAIAQEAAT8h5JXdYTvtDIM+p9zM9V//2gAMAwEAAgADAAAAED/v/8QAFxEBAQEBAAAAAAAAAAAAAAAAAQAhEf/aAAgBAwEBPxBDebDf/8QAFxEBAQEBAAAAAAAAAAAAAAAAAQAhYf/aAAgBAgEBPxDE7Jf/xAAeEAEAAQMFAQAAAAAAAAAAAAABABEhMRBBUZGhsf/aAAgBAQABPxByuAIDK1Q3gs3CANhxD6tQMee610h6X4z3J//Z","sizes":"(max-width: 1600px) 100vw, 1600px","src":"/static/ef473fd608a488e0579a6ab7fe528337/989b1/sphtech-meetup-ncript.jpg","srcSet":"/static/ef473fd608a488e0579a6ab7fe528337/f8f18/sphtech-meetup-ncript.jpg 930w,\n/static/ef473fd608a488e0579a6ab7fe528337/989b1/sphtech-meetup-ncript.jpg 1600w"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/b4a08/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/towards-a-privacy-aware-smart-nation/"}},"next":{"excerpt":"This is the beginning of an exciting era for our SPHTech team!Over here, you will get to read about our learnings and reviews of the new…","timeToRead":1,"frontmatter":{"title":"About Us","tags":[],"date":"2019-01-01T23:46:37.131Z","draft":false,"image":{"childImageSharp":{"fluid":{"aspectRatio":1.3333333333333333,"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAIEBf/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAGuZFjMNEX/xAAdEAEAAQMFAAAAAAAAAAAAAAACAAEDBBAREhMh/9oACAEBAAEFAqk73admiQMNvhDjef/EABURAQEAAAAAAAAAAAAAAAAAABAR/9oACAEDAQE/AYf/xAAVEQEBAAAAAAAAAAAAAAAAAAAQEf/aAAgBAgEBPwGn/8QAHhAAAQMEAwAAAAAAAAAAAAAAAQACERASITEiMqH/2gAIAQEABj8CuZiUJOhNBvKc67iRC7+L/8QAGxAAAwEBAAMAAAAAAAAAAAAAAAERIUExUZH/2gAIAQEAAT8hXdlJvRVr82FbLNeeRv6zEU2luHoB/9oADAMBAAIAAwAAABCbz//EABYRAQEBAAAAAAAAAAAAAAAAAAARIf/aAAgBAwEBPxCq1//EABURAQEAAAAAAAAAAAAAAAAAABAx/9oACAECAQE/EIP/xAAdEAEAAwACAwEAAAAAAAAAAAABABEhMUFhgaGx/9oACAEBAAE/EGQtNWliantl6rW3JQv7Ft0sdQkrFDejvYtC2gI4vfMdTuuls+z/2Q==","sizes":"(max-width: 1400px) 100vw, 1400px","src":"/static/e26b6c56a85123d553d70dcd1ce2285a/3dc2b/cafe-ppl-collab.jpg","srcSet":"/static/e26b6c56a85123d553d70dcd1ce2285a/f8f18/cafe-ppl-collab.jpg 930w,\n/static/e26b6c56a85123d553d70dcd1ce2285a/3dc2b/cafe-ppl-collab.jpg 1400w"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/b4a08/sphtech.png"}}]}}},"fields":{"layout":"postnodate","slug":"/about-us/"}},"primaryTag":"Testing"}}} \ No newline at end of file diff --git a/page-data/docker-workshop-in-sph/page-data.json b/page-data/docker-workshop-in-sph/page-data.json index 169abcd..eb32584 100644 --- a/page-data/docker-workshop-in-sph/page-data.json +++ b/page-data/docker-workshop-in-sph/page-data.json @@ -1 +1 @@ -{"componentChunkName":"component---src-templates-post-tsx","path":"/docker-workshop-in-sph/","webpackCompilationHash":"e6542130e6dfe73197bb","result":{"data":{"logo":{"childImageSharp":{"fixed":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsSAAALEgHS3X78AAABFUlEQVQY023PvUrDUBTA8ZuCtoMoOLQ4dWhN14x2kEKXFkGoohQ/QBexOHRycAidKkgHHRq69APRoTjFJYODIA6+gSBYfYMmfYLE/5VT6NALP845NyeHc9UoCHZRQvonCLKKE4ZhAXYURTsYoE9dIy5iCzfUJnEdV+RF4iu6ikFH2EPxazzOcJmg4Rnn5C8ysIEOHqTe5/sT3qXOwYOtRr5/wLAqzpCTDXu4p2ETtyjgGJ/cX+se8jeU9fa4RBt5vWENpjzdkoGPcGg4RQsbOMEFmnBRRwVDHEK/yFXfvr/CoPjvZLKcdByDyzWGeajigzorGy0oOeRJiUtITe/pX1XzDk3buIMltSFR/zTtic3060X+8z8PsEUt8G3LVQAAAABJRU5ErkJggg==","width":400,"height":128,"src":"/static/2b5eaa0de166a8b5faebad4955c2200c/647de/ghost-logo.png","srcSet":"/static/2b5eaa0de166a8b5faebad4955c2200c/647de/ghost-logo.png 1x"}}},"markdownRemark":{"html":"

Containerization has been one of the most talk about topics in the digital world. It enabled a whole new paradigm shift in getting software to run reliability when moving from one environment to another.

\n

I have the privilege to run 2 docker workshops in SPH as I managed to set up docker running zaobao.com locally on my PC. It has been an amazing experience.

\n

The first docker workshop was held on 19th October 2018, with 23 people attending. We went through what is containerization and its difference with virtual machines. Then we have exercises on docker command, docker-compose.yml and set up a completely new drupal website from scratch. And we have great food at the end!

\n

\n \n \n \n \n \n \n
Food! Glorious Food!
\n

\n

I also demonstrated that it was possible to run zaobao and zaobao.sg on the same container with the help of traefik on localhost.

\n

The objective of the part 1 familiarisation was to prepare for the docker workshop 2. In that workshop, we got the participants to run their actual drupal sites. Yes, actual BT, ST, BH sites on our laptops and the same docker images can be deployed to Staging and Production servers on Amazon Web Services with the help of ECS.

\n

On 2nd November 2018, I ran the second docker workshop. Before that day, I did nag the developers to get their production code and database of their drupal sites so that they can get the best value out of their workshop. On that day, they did bring their stuff, except we have an unexpected guest:

\n

\n \n \n \n \n \n \n
Blackout!
\n

\n

Despite the set back, we were still able to achieve our objectives. Swee Hock was able to get ST dockerized locally and present to us all. BT and TNP were able to be dockerized as well during the workshop.

\n

\n \n \n Containerization has been one of the most talk about topics in the digital world. It enabled a whole new paradigm shift in getting software to run reliability when moving from one environment to another.

\n

I have the privilege to run 2 docker workshops in SPH as I managed to set up docker running zaobao.com locally on my PC. It has been an amazing experience.

\n

The first docker workshop was held on 19th October 2018, with 23 people attending. We went through what is containerization and its difference with virtual machines. Then we have exercises on docker command, docker-compose.yml and set up a completely new drupal website from scratch. And we have great food at the end!

\n

\n \n \n \n \n \n \n
Food! Glorious Food!
\n

\n

I also demonstrated that it was possible to run zaobao and zaobao.sg on the same container with the help of traefik on localhost.

\n

The objective of the part 1 familiarisation was to prepare for the docker workshop 2. In that workshop, we got the participants to run their actual drupal sites. Yes, actual BT, ST, BH sites on our laptops and the same docker images can be deployed to Staging and Production servers on Amazon Web Services with the help of ECS.

\n

On 2nd November 2018, I ran the second docker workshop. Before that day, I did nag the developers to get their production code and database of their drupal sites so that they can get the best value out of their workshop. On that day, they did bring their stuff, except we have an unexpected guest:

\n

\n \n \n \n \n \n \n
Blackout!
\n

\n

Despite the set back, we were still able to achieve our objectives. Swee Hock was able to get ST dockerized locally and present to us all. BT and TNP were able to be dockerized as well during the workshop.

\n

\n \n \n TL;DR Does asking users for feedback and ratings help in your app? Yes!

\n

When I joined Singapore Press Holdings in late 2015, most of the apps published were receiving low ratings and bad reviews. As I was working in the Chinese media mobile application team, I proposed a method to collect reviews and encourage users to give ratings. We tested the implementation in the zaobao.sg app (the flagship Chinese language news and videos app).

\n

After rolling out the new functionality, the reviews and ratings in the Google Play Store doubled. Most of the reviews received were very helpful for the team, as they shed light on how we could improve the product.

\n

From the screenshot below, you could see that there was a huge surge of reviews, and ratings increased by 10% after the implementation was added in February 2017. The average number of reviews increased beyond 100%.

\n

\n \n \n \n \n \n \n
A screenshot is taken from Zaobao app
\n

\n

While it did receive some responses from users, I felt that it was not significant enough. The users who sent feedback via the Settings page was either a hardcore user who love your app or probably a subscriber who was going to complain about something >.<

\n

Be proactive. Prod the user for feedback in the app!

\n

We targeted users who had installed the app for over a certain period of time and consumed a lot of contents. We thought these users would be potential feedback providers. You would also have to think what are the best criteria to determine a potential user of your app, as it depends on the uses of your app.

\n

In our case, since we were working on a news app, we expected the user to open and consume it on a daily basis. Also, some users may uninstall the app after a short period of usage. (On that note, it would be helpful if Google Play Store allows app developers to collect users’ feedback upon un-installation) Therefore we could only target users who continued to use the app. We wanted to know the reasons why they continued to use the app, and what motivations or goals made them continue to use the app etc.

\n

Hence, we just asked: ”Enjoy the app?” (Enjoy my article? LoL)

\n

\n \n \n .<"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"Be proactive. Prod the user for feedback in the app!"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"We targeted users who had installed the app for over a certain period of time "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"and"}]},{"type":"text","value":" consumed a lot of contents. We thought these users would be potential feedback providers. You would also have to think what are the best criteria to determine a potential user of your app, as it depends on the uses of your app."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"In our case, since we were working on a news app, we expected the user to open and consume it on a daily basis. Also, some users may uninstall the app after a short period of usage. "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"(On that note, it would be helpful if Google Play Store allows app developers to collect users’ feedback upon un-installation)"}]},{"type":"text","value":" Therefore we could only target users who continued to use the app. We wanted to know the reasons why they continued to use the app, and what motivations or goals made them continue to use the app etc."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hence, we just asked: ”"},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Enjoy the app?"}]},{"type":"text","value":"” (Enjoy my article? LoL)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[]},{"type":"element","tagName":"figure","properties":{"className":["gatsby-resp-image-figure"],"style":""},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/555dd2a108db1df2087c6a836f018b19/51a3e/zaobao-app-chart3.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1170px;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 72.14285714285715%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAAAsTAAALEwEAmpwYAAADdElEQVQ4y02Uf0xVZRjH779stZJxL/fnOed9zzn3BxcQuCAm10HgNWHGD5W2bLVmW7k2cxVk4aZ/FekfjmotEfHKmjh1BrTo11obW3P+wYI7MloaiSE1xGbighru03v4EZ7tu+ec9zzns+c8z/d9XUIIHBmGgSVNYtIirAvMQAhLMwg7z2pdGCpHGKzmayo/akj6ErsZqm9hYlsL75Rsx+W8lCrZJzTqZCFdWWUcf3QjJwNVfJhVTIfL4pgrQkKzCDlAYwWoa0TDUS59/i2/T99kcn6WY50fPACUOnW+KH3uavpFLQOijh/bu5lMD/DdM29Rlq2hmcu5UiqgXyO+Oc7YrV8YuTVB39RlDr3/7gpQLFdYqxfQVbCF7kiKtJFi6NB7XO7s5cy+11hvm/hVhZoDU+CAqjBemc/wle+5OnWd6TszHD/RuQxc6qFuYIct8hJhYkJF1Ts720siy0N5jk5pwqYoJij2SRJ+kzxbJ688zvWJSWb/vM3i4n1O9/SsAYUahGEb6MUCXQ0jKHTikSinQjWc8dfQG0rRK1KcXlfBBU81rfFShC15Ze/LtO7bz8E3DrCrqUkBjTWgjErMfCUHrn4tT5eks5Oc99VwTksxUPIU/YXNfFq6k1djpWwORTmRvYmT/krSwWqOeh/DFTJ0VY2qKKjiJoNAWEVNVz3ViSngOXcVX8d3cvGRJJn9R1n4aZK54VE6KpvZvuUJbk/cYPbX37g39QejQ5dw7ZGlHPZtpM1fTptRxpuBMg56N/C6t4QCabPbn8/znnyec6sYKGKPKGOvXk6tO0Jjww7mFua5t/gv/wCjP4zhejtYwWD24/SFtvJlQTP9/hQXH05y9qEK4n5BjqGRqwaQG9Hx2BpuK0juep11EQ9PvlTPzPQUN4fHmB2/RmZkBFebO8Fn2jYu6CkGNzzNtZ4Bbpz/isEXWoiYPmTCwipSfVVyolVsYudZ+ANemp7dxcyVnxk90s3V7k8Yy2RwHYhVccrcykeW8l5iB1+0HuGbwx183PgihbaFFhbL205NflVSSLy5CljfyH3WrvHxcVym2qeW+sDZr2FhIt0+RI4XWw1JqjXHn/9ba0XSVECvl4bGBubuznH3zl8s/D1PxqnQORT0B2SoZEf6yoGxZHrlgtX7JaCUyhVBkskkXV1dS0qn07S3t/MfXHMlnLtnif8AAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;box-shadow:inset 0px 0px 0px 400px white;","alt":"Example flow we used (Words are translated into English for demo purpose)","title":"","src":"/static/555dd2a108db1df2087c6a836f018b19/1c968/zaobao-app-chart3.png","srcSet":["/static/555dd2a108db1df2087c6a836f018b19/eb41c/zaobao-app-chart3.png 293w","/static/555dd2a108db1df2087c6a836f018b19/7110a/zaobao-app-chart3.png 585w","/static/555dd2a108db1df2087c6a836f018b19/1c968/zaobao-app-chart3.png 1170w","/static/555dd2a108db1df2087c6a836f018b19/51a3e/zaobao-app-chart3.png 1400w"],"sizes":["(max-width:","1170px)","100vw,","1170px"]},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "},{"type":"element","tagName":"figcaption","properties":{"className":["gatsby-resp-image-figcaption"]},"children":[{"type":"text","value":"Example flow we used (Words are translated into English for demo purpose)"}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Our prompt only had a ”"},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Yes"}]},{"type":"text","value":"” and ”"},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"No"}]},{"type":"text","value":"” option, with no other way to dismiss the “annoying” question. Selecting an option will lead to the next dialog box:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"If the user answered ”"},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Yes"}]},{"type":"text","value":"”, we would ask them a favour to give the app a rating on the Google Play Store. Some helpful users did give some useful suggestions besides rating the app."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"If the user answered ”"},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"No"}]},{"type":"text","value":"”, we would appeal for their feedback so that we could improve the app. This would be the opportunity you could receive helpful feedback from the user."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"We found that this technique had helped us tremendously. You might have seen similar patterns and prompts in some apps in the market too. This could perhaps become the trend or "},{"type":"element","tagName":"a","properties":{"href":"https://www.urbandictionary.com/define.php?term=M.E.T.A"},"children":[{"type":"text","value":"M.E.T.A"}]},{"type":"text","value":" in harnessing user feedback for product improvements!"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hope our discovery will help in your application development journey :)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Original post by Winson Tan at "},{"type":"element","tagName":"a","properties":{"href":"https://medium.com/@winsontan520/how-to-get-more-feedback-and-ratings-from-your-mobile-app-users-f74145895471"},"children":[{"type":"text","value":"here"}]},{"type":"text","value":"."}]}]}],"data":{"quirksMode":false}},"excerpt":"TL;DR Does asking users for feedback and ratings help in your app? Yes!When I joined Singapore Press Holdings in late 2015, most of the apps…","timeToRead":3,"frontmatter":{"title":"How to get your mobile app users to give you ratings and feedback!","userDate":"7 October 2018","date":"2018-10-07T23:10:00.000Z","tags":["Android"],"image":{"childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAIAAAA7N+mxAAAACXBIWXMAAAsSAAALEgHS3X78AAABo0lEQVQoz2WRWW/TQBSF/c954kcgJErFA+ob8NBKhCVSaSsEArElJG3tZqkdjz2JZ+zZN+5MWoHEkT26tu935txx5pOcs7D4dAcfqGTHNxcvr8cv8ouPm5kzxqWvUsphGJzbQz7TWncdUUoj1HDOA8gHqfC8ev6rGq26dcso9IQkxhjA4V5Z8qNCYkKxMTaxwfWVRz9jZZzTVps7GEjghVI2JgkZvLLOaM2s0w7Sg4F3itJ+uVJaq3tZaxPcS6X+7lyjGmMshNTa7PtgMMDA6e5RKfAG0zYKN3V19Hnx4Hj26EOeQSsBUQJF+EdwdvsRQGjQiHLS7VqM2waNp7cH5/m7Ocogj4txwRoSG2h9Nh+flRMolIZtIYZkQgyCxyHgMsp7u7eNsA2euTiSSevDT4dPJ6+3QnFtwn/yKYwBCn6VNa7sFmf5qOPbTVd2TCxWj78WTw5/HJwUb98vT0eL0+/t9M3y/KQYf6m+HU1eTdFvqeOxZcqYpr3hXbHZrWtSlttbMeSKXqohJ/11Sy5rcrXaXlUkr/Cs7YtmN8X9mpt4QH8Ad7k0jshkD1kAAAAASUVORK5CYII=","aspectRatio":2.074786324786325,"src":"/static/4d42232e07032296408b0a75d8f9815e/a83d1/zaobao-app-chart1.png","srcSet":"/static/4d42232e07032296408b0a75d8f9815e/4c9af/zaobao-app-chart1.png 930w,\n/static/4d42232e07032296408b0a75d8f9815e/a83d1/zaobao-app-chart1.png 971w","sizes":"(max-width: 971px) 100vw, 971px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAADQElEQVQ4y5VUW0tUURSeX9BDhFZQ1Nx0lCAqI+o1KMiHoqjIesisXiLSQOhiRUWUdKEwKqKHtNIyJLuY0UWS0lBKM8mcrEadcnIc58zlzMyZvc/+WjNnRs+xIWjDd9a+fudba6+1TaAmhEDaCqESONItOZewCUitgK8JIu7TxrQXqbV0M00lSzd1LAgRiU5u/3oAaJ0NQcC7RYC/LXWOJz6ThHoVyX74GynpRKTuLZjTo815SNWzbIjuEsD7EqJjHUT7KoNnBoVpZer3G+DN+eBNNvD2Egh5BCLqAW9ZCf7YDBF0agTjXbRnAbkezESYikPIBfYgH+y+BawhD6x+LtjDAsJSxOutiN+zgPechWAyeNs+sNZiXagyEKq+Xig1dii386DcyiU4oFRbodwk1CT6dq1fnQv2vJiUj6cIVYNKk55dadyC6PnpiF3LRfRqziSu2Ak0d9mC2I0C6JtQVYNSk+Evsg9K035EKs2InLUhci6HrD0F6ldaEbmwEKz7HrjrHamUpqg0pM1kyrD3dxE+Ykb4mB3ho2nYaI5shQXhg3MRPmyGfGY5+OCHlFKuv+UUKY8nLR/8iFCZBaH9VoKN+glr11BK41KyZTkI7poBuaook8vCcFvypRIEts1EYLcdgRILAjttkLbOhlQ0C4EdiXEOrTlozxyEjhQaLsY0Nbjq7yE67IC00Qxps5VAZOvJxeNbET61HdKG+fCvyYK/MBv+1TMQa66ZcDkjIf/los02OmSBf62DDs2DtGkxVZCWxKy/G5HrZ+gHe6G8eWqoeWPp6SpGPl0O74JpGFuSBR/ZaHWVdiiuxTjW0o/QxeY0laEEDZeiksoEJYvTjTXeQfRkOeSG2mQ+CJ0XzOVBvGtgwk09x4TLqhCGhP1EKTaeXsO/21+PA1e1iVfOMRx94iT048SjPuyp68GL3l+Aux/MMwTuHqAS9UClOKveEaijbkpu+e/SYynC2x1uZB16gWXn2zA8JqO2043d9X2AxwnF/R3scwf4QE+SlH/rBet6TS/Q+NRLERPuDoyGUUHqVlxox6svXri8Mtp+kO+RAFQ5RCk1nCRQRwbpdZI0KNHMj4M+hr0/g8YY/UcM/wD4fYcC4gOWgAAAAABJRU5ErkJggg==","width":400,"height":400,"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png","srcSet":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png 1x,\n/static/7fa6bee9d2080bd021828c70f67a4720/fca9c/sphtech.png 1.5x"}}]}}}},"relatedPosts":{"totalCount":2,"edges":[{"node":{"id":"b29c15f7-9c98-53b0-a0cc-d9c54502b32a","timeToRead":3,"excerpt":"TL;DR Does asking users for feedback and ratings help in your app? Yes!When I joined Singapore Press Holdings in late 2015, most of the apps…","frontmatter":{"title":"How to get your mobile app users to give you ratings and feedback!"},"fields":{"slug":"/get-your-app-users-to-give-feedback/"}}},{"node":{"id":"12eeed0a-39f3-5439-83c9-9a5c79531c30","timeToRead":4,"excerpt":"A class is an observable live data that can be used to send events from ViewModel to View in Android MVVM-styled designs.This link…","frontmatter":{"title":"Using Mockito's ArgumentCaptor on SingleLiveEvent"},"fields":{"slug":"/using-mockitos-argumentcaptor/"}}}]}},"pageContext":{"isCreatedByStatefulCreatePages":false,"slug":"/get-your-app-users-to-give-feedback/","prev":{"excerpt":"This was the second Developers Gym session organized by Thoughtworks, of which we were honoured to play host to. The coding dojo, formulated…","timeToRead":2,"frontmatter":{"title":"Developers Gym by Thoughtworks - 14 July","tags":["Meetup","Reviews"],"date":"2018-07-25T14:25:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"aspectRatio":1.3333333333333333,"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAABAADBf/EABUBAQEAAAAAAAAAAAAAAAAAAAEA/9oADAMBAAIQAxAAAAFBg5F0Ycn/xAAZEAADAQEBAAAAAAAAAAAAAAAAARICAxP/2gAIAQEAAQUC88RpKp2b6Muikj//xAAWEQEBAQAAAAAAAAAAAAAAAAAAARH/2gAIAQMBAT8BZX//xAAWEQEBAQAAAAAAAAAAAAAAAAAAARH/2gAIAQIBAT8BjY//xAAcEAACAgIDAAAAAAAAAAAAAAAAARExAiESQXH/2gAIAQEABj8C5THo1i1otF6KOz//xAAdEAACAgIDAQAAAAAAAAAAAAAAAREhMUFRYYGh/9oACAEBAAE/IXBpbgTKVtySYg6Ki8xM1pmaowl9n//aAAwDAQACAAMAAAAQoA//xAAXEQADAQAAAAAAAAAAAAAAAAAAASFh/9oACAEDAQE/EHVGbn//xAAXEQEBAQEAAAAAAAAAAAAAAAABABFh/9oACAECAQE/EEZqXC//xAAcEAEAAgIDAQAAAAAAAAAAAAABABEhMUFhcVH/2gAIAQEAAT8QGhkCBsvx3AVpM2ixeMzYf0WSkaQrsF8QpXaeLg+ErhYbNDqf/9k=","sizes":"(max-width: 1400px) 100vw, 1400px","src":"/static/9f96e81e6f6d55da468755a49a4b0666/3dc2b/IMG_8071.jpg","srcSet":"/static/9f96e81e6f6d55da468755a49a4b0666/f8f18/IMG_8071.jpg 930w,\n/static/9f96e81e6f6d55da468755a49a4b0666/3dc2b/IMG_8071.jpg 1400w"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/b4a08/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/developers-gym-by-thoughtworks-14-july/"}},"next":{"excerpt":"A class is an observable live data that can be used to send events from ViewModel to View in Android MVVM-styled designs.This link…","timeToRead":4,"frontmatter":{"title":"Using Mockito's ArgumentCaptor on SingleLiveEvent","tags":["Android","Testing","Tutorial"],"date":"2018-10-10T17:21:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"aspectRatio":1.5005359056806002,"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAgADBf/EABcBAAMBAAAAAAAAAAAAAAAAAAABAgP/2gAMAwEAAhADEAAAAU+M2Gxqz//EABkQAQEAAwEAAAAAAAAAAAAAAAIBAAMEEf/aAAgBAQABBQLQIl0GiQ3wqzHsSmf/xAAWEQEBAQAAAAAAAAAAAAAAAAARAAH/2gAIAQMBAT8BwJv/xAAWEQEBAQAAAAAAAAAAAAAAAAAAESH/2gAIAQIBAT8B1H//xAAcEAACAgIDAAAAAAAAAAAAAAAAASFBAxARQlL/2gAIAQEABj8CycrsNrzZRBOv/8QAHBABAAEEAwAAAAAAAAAAAAAAAQAQESFhMZGh/9oACAEBAAE/Ic7lodhS47RAT1OVOdwQJbbp/9oADAMBAAIAAwAAABBwH//EABcRAQADAAAAAAAAAAAAAAAAAAABETH/2gAIAQMBAT8Q1Ss//8QAFhEAAwAAAAAAAAAAAAAAAAAAARAh/9oACAECAQE/EDSf/8QAGxABAQADAQEBAAAAAAAAAAAAAREAITFRQXH/2gAIAQEAAT8QnlojNn4/MQFk9hRx777jIQnJxujdmMrgpzi1i1uf/9k=","sizes":"(max-width: 1400px) 100vw, 1400px","src":"/static/7c9ee95dd61b5588277447a33ccd293c/3dc2b/code-sunshine.jpg","srcSet":"/static/7c9ee95dd61b5588277447a33ccd293c/f8f18/code-sunshine.jpg 930w,\n/static/7c9ee95dd61b5588277447a33ccd293c/3dc2b/code-sunshine.jpg 1400w"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/b4a08/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/using-mockitos-argumentcaptor/"}},"primaryTag":"Android"}}} \ No newline at end of file +{"componentChunkName":"component---src-templates-post-tsx","path":"/get-your-app-users-to-give-feedback/","webpackCompilationHash":"4d127609ee78b8f0aee7","result":{"data":{"logo":{"childImageSharp":{"fixed":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsSAAALEgHS3X78AAABFUlEQVQY023PvUrDUBTA8ZuCtoMoOLQ4dWhN14x2kEKXFkGoohQ/QBexOHRycAidKkgHHRq69APRoTjFJYODIA6+gSBYfYMmfYLE/5VT6NALP845NyeHc9UoCHZRQvonCLKKE4ZhAXYURTsYoE9dIy5iCzfUJnEdV+RF4iu6ikFH2EPxazzOcJmg4Rnn5C8ysIEOHqTe5/sT3qXOwYOtRr5/wLAqzpCTDXu4p2ETtyjgGJ/cX+se8jeU9fa4RBt5vWENpjzdkoGPcGg4RQsbOMEFmnBRRwVDHEK/yFXfvr/CoPjvZLKcdByDyzWGeajigzorGy0oOeRJiUtITe/pX1XzDk3buIMltSFR/zTtic3060X+8z8PsEUt8G3LVQAAAABJRU5ErkJggg==","width":400,"height":128,"src":"/static/2b5eaa0de166a8b5faebad4955c2200c/647de/ghost-logo.png","srcSet":"/static/2b5eaa0de166a8b5faebad4955c2200c/647de/ghost-logo.png 1x"}}},"markdownRemark":{"html":"

TL;DR Does asking users for feedback and ratings help in your app? Yes!

\n

When I joined Singapore Press Holdings in late 2015, most of the apps published were receiving low ratings and bad reviews. As I was working in the Chinese media mobile application team, I proposed a method to collect reviews and encourage users to give ratings. We tested the implementation in the zaobao.sg app (the flagship Chinese language news and videos app).

\n

After rolling out the new functionality, the reviews and ratings in the Google Play Store doubled. Most of the reviews received were very helpful for the team, as they shed light on how we could improve the product.

\n

From the screenshot below, you could see that there was a huge surge of reviews, and ratings increased by 10% after the implementation was added in February 2017. The average number of reviews increased beyond 100%.

\n

\n \n \n \n \n \n \n
A screenshot is taken from Zaobao app
\n

\n

While it did receive some responses from users, I felt that it was not significant enough. The users who sent feedback via the Settings page was either a hardcore user who love your app or probably a subscriber who was going to complain about something >.<

\n

Be proactive. Prod the user for feedback in the app!

\n

We targeted users who had installed the app for over a certain period of time and consumed a lot of contents. We thought these users would be potential feedback providers. You would also have to think what are the best criteria to determine a potential user of your app, as it depends on the uses of your app.

\n

In our case, since we were working on a news app, we expected the user to open and consume it on a daily basis. Also, some users may uninstall the app after a short period of usage. (On that note, it would be helpful if Google Play Store allows app developers to collect users’ feedback upon un-installation) Therefore we could only target users who continued to use the app. We wanted to know the reasons why they continued to use the app, and what motivations or goals made them continue to use the app etc.

\n

Hence, we just asked: ”Enjoy the app?” (Enjoy my article? LoL)

\n

\n \n \n .<"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"Be proactive. Prod the user for feedback in the app!"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"We targeted users who had installed the app for over a certain period of time "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"and"}]},{"type":"text","value":" consumed a lot of contents. We thought these users would be potential feedback providers. You would also have to think what are the best criteria to determine a potential user of your app, as it depends on the uses of your app."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"In our case, since we were working on a news app, we expected the user to open and consume it on a daily basis. Also, some users may uninstall the app after a short period of usage. "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"(On that note, it would be helpful if Google Play Store allows app developers to collect users’ feedback upon un-installation)"}]},{"type":"text","value":" Therefore we could only target users who continued to use the app. We wanted to know the reasons why they continued to use the app, and what motivations or goals made them continue to use the app etc."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hence, we just asked: ”"},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Enjoy the app?"}]},{"type":"text","value":"” (Enjoy my article? LoL)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[]},{"type":"element","tagName":"figure","properties":{"className":["gatsby-resp-image-figure"],"style":""},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/static/555dd2a108db1df2087c6a836f018b19/51a3e/zaobao-app-chart3.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1170px;"},"children":[{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 72.14285714285715%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAAAsTAAALEwEAmpwYAAADdElEQVQ4y02Uf0xVZRjH779stZJxL/fnOed9zzn3BxcQuCAm10HgNWHGD5W2bLVmW7k2cxVk4aZ/FekfjmotEfHKmjh1BrTo11obW3P+wYI7MloaiSE1xGbighru03v4EZ7tu+ec9zzns+c8z/d9XUIIHBmGgSVNYtIirAvMQAhLMwg7z2pdGCpHGKzmayo/akj6ErsZqm9hYlsL75Rsx+W8lCrZJzTqZCFdWWUcf3QjJwNVfJhVTIfL4pgrQkKzCDlAYwWoa0TDUS59/i2/T99kcn6WY50fPACUOnW+KH3uavpFLQOijh/bu5lMD/DdM29Rlq2hmcu5UiqgXyO+Oc7YrV8YuTVB39RlDr3/7gpQLFdYqxfQVbCF7kiKtJFi6NB7XO7s5cy+11hvm/hVhZoDU+CAqjBemc/wle+5OnWd6TszHD/RuQxc6qFuYIct8hJhYkJF1Ts720siy0N5jk5pwqYoJij2SRJ+kzxbJ688zvWJSWb/vM3i4n1O9/SsAYUahGEb6MUCXQ0jKHTikSinQjWc8dfQG0rRK1KcXlfBBU81rfFShC15Ze/LtO7bz8E3DrCrqUkBjTWgjErMfCUHrn4tT5eks5Oc99VwTksxUPIU/YXNfFq6k1djpWwORTmRvYmT/krSwWqOeh/DFTJ0VY2qKKjiJoNAWEVNVz3ViSngOXcVX8d3cvGRJJn9R1n4aZK54VE6KpvZvuUJbk/cYPbX37g39QejQ5dw7ZGlHPZtpM1fTptRxpuBMg56N/C6t4QCabPbn8/znnyec6sYKGKPKGOvXk6tO0Jjww7mFua5t/gv/wCjP4zhejtYwWD24/SFtvJlQTP9/hQXH05y9qEK4n5BjqGRqwaQG9Hx2BpuK0juep11EQ9PvlTPzPQUN4fHmB2/RmZkBFebO8Fn2jYu6CkGNzzNtZ4Bbpz/isEXWoiYPmTCwipSfVVyolVsYudZ+ANemp7dxcyVnxk90s3V7k8Yy2RwHYhVccrcykeW8l5iB1+0HuGbwx183PgihbaFFhbL205NflVSSLy5CljfyH3WrvHxcVym2qeW+sDZr2FhIt0+RI4XWw1JqjXHn/9ba0XSVECvl4bGBubuznH3zl8s/D1PxqnQORT0B2SoZEf6yoGxZHrlgtX7JaCUyhVBkskkXV1dS0qn07S3t/MfXHMlnLtnif8AAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;box-shadow:inset 0px 0px 0px 400px white;","alt":"Example flow we used (Words are translated into English for demo purpose)","title":"","src":"/static/555dd2a108db1df2087c6a836f018b19/1c968/zaobao-app-chart3.png","srcSet":["/static/555dd2a108db1df2087c6a836f018b19/eb41c/zaobao-app-chart3.png 293w","/static/555dd2a108db1df2087c6a836f018b19/7110a/zaobao-app-chart3.png 585w","/static/555dd2a108db1df2087c6a836f018b19/1c968/zaobao-app-chart3.png 1170w","/static/555dd2a108db1df2087c6a836f018b19/51a3e/zaobao-app-chart3.png 1400w"],"sizes":["(max-width:","1170px)","100vw,","1170px"]},"children":[]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "}]},{"type":"text","value":"\n "},{"type":"element","tagName":"figcaption","properties":{"className":["gatsby-resp-image-figcaption"]},"children":[{"type":"text","value":"Example flow we used (Words are translated into English for demo purpose)"}]},{"type":"text","value":"\n "}]},{"type":"element","tagName":"p","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Our prompt only had a ”"},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Yes"}]},{"type":"text","value":"” and ”"},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"No"}]},{"type":"text","value":"” option, with no other way to dismiss the “annoying” question. Selecting an option will lead to the next dialog box:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"If the user answered ”"},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Yes"}]},{"type":"text","value":"”, we would ask them a favour to give the app a rating on the Google Play Store. Some helpful users did give some useful suggestions besides rating the app."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"If the user answered ”"},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"No"}]},{"type":"text","value":"”, we would appeal for their feedback so that we could improve the app. This would be the opportunity you could receive helpful feedback from the user."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"We found that this technique had helped us tremendously. You might have seen similar patterns and prompts in some apps in the market too. This could perhaps become the trend or "},{"type":"element","tagName":"a","properties":{"href":"https://www.urbandictionary.com/define.php?term=M.E.T.A"},"children":[{"type":"text","value":"M.E.T.A"}]},{"type":"text","value":" in harnessing user feedback for product improvements!"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hope our discovery will help in your application development journey :)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Original post by Winson Tan at "},{"type":"element","tagName":"a","properties":{"href":"https://medium.com/@winsontan520/how-to-get-more-feedback-and-ratings-from-your-mobile-app-users-f74145895471"},"children":[{"type":"text","value":"here"}]},{"type":"text","value":"."}]}]}],"data":{"quirksMode":false}},"excerpt":"TL;DR Does asking users for feedback and ratings help in your app? Yes!When I joined Singapore Press Holdings in late 2015, most of the apps…","timeToRead":3,"frontmatter":{"title":"How to get your mobile app users to give you ratings and feedback!","userDate":"7 October 2018","date":"2018-10-07T23:10:00.000Z","tags":["Android"],"image":{"childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAIAAAA7N+mxAAAACXBIWXMAAAsSAAALEgHS3X78AAABo0lEQVQoz2WRWW/TQBSF/c954kcgJErFA+ob8NBKhCVSaSsEArElJG3tZqkdjz2JZ+zZN+5MWoHEkT26tu935txx5pOcs7D4dAcfqGTHNxcvr8cv8ouPm5kzxqWvUsphGJzbQz7TWncdUUoj1HDOA8gHqfC8ev6rGq26dcso9IQkxhjA4V5Z8qNCYkKxMTaxwfWVRz9jZZzTVps7GEjghVI2JgkZvLLOaM2s0w7Sg4F3itJ+uVJaq3tZaxPcS6X+7lyjGmMshNTa7PtgMMDA6e5RKfAG0zYKN3V19Hnx4Hj26EOeQSsBUQJF+EdwdvsRQGjQiHLS7VqM2waNp7cH5/m7Ocogj4txwRoSG2h9Nh+flRMolIZtIYZkQgyCxyHgMsp7u7eNsA2euTiSSevDT4dPJ6+3QnFtwn/yKYwBCn6VNa7sFmf5qOPbTVd2TCxWj78WTw5/HJwUb98vT0eL0+/t9M3y/KQYf6m+HU1eTdFvqeOxZcqYpr3hXbHZrWtSlttbMeSKXqohJ/11Sy5rcrXaXlUkr/Cs7YtmN8X9mpt4QH8Ad7k0jshkD1kAAAAASUVORK5CYII=","aspectRatio":2.074786324786325,"src":"/static/4d42232e07032296408b0a75d8f9815e/a83d1/zaobao-app-chart1.png","srcSet":"/static/4d42232e07032296408b0a75d8f9815e/4c9af/zaobao-app-chart1.png 930w,\n/static/4d42232e07032296408b0a75d8f9815e/a83d1/zaobao-app-chart1.png 971w","sizes":"(max-width: 971px) 100vw, 971px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAADQElEQVQ4y5VUW0tUURSeX9BDhFZQ1Nx0lCAqI+o1KMiHoqjIesisXiLSQOhiRUWUdKEwKqKHtNIyJLuY0UWS0lBKM8mcrEadcnIc58zlzMyZvc/+WjNnRs+xIWjDd9a+fudba6+1TaAmhEDaCqESONItOZewCUitgK8JIu7TxrQXqbV0M00lSzd1LAgRiU5u/3oAaJ0NQcC7RYC/LXWOJz6ThHoVyX74GynpRKTuLZjTo815SNWzbIjuEsD7EqJjHUT7KoNnBoVpZer3G+DN+eBNNvD2Egh5BCLqAW9ZCf7YDBF0agTjXbRnAbkezESYikPIBfYgH+y+BawhD6x+LtjDAsJSxOutiN+zgPechWAyeNs+sNZiXagyEKq+Xig1dii386DcyiU4oFRbodwk1CT6dq1fnQv2vJiUj6cIVYNKk55dadyC6PnpiF3LRfRqziSu2Ak0d9mC2I0C6JtQVYNSk+Evsg9K035EKs2InLUhci6HrD0F6ldaEbmwEKz7HrjrHamUpqg0pM1kyrD3dxE+Ykb4mB3ho2nYaI5shQXhg3MRPmyGfGY5+OCHlFKuv+UUKY8nLR/8iFCZBaH9VoKN+glr11BK41KyZTkI7poBuaook8vCcFvypRIEts1EYLcdgRILAjttkLbOhlQ0C4EdiXEOrTlozxyEjhQaLsY0Nbjq7yE67IC00Qxps5VAZOvJxeNbET61HdKG+fCvyYK/MBv+1TMQa66ZcDkjIf/los02OmSBf62DDs2DtGkxVZCWxKy/G5HrZ+gHe6G8eWqoeWPp6SpGPl0O74JpGFuSBR/ZaHWVdiiuxTjW0o/QxeY0laEEDZeiksoEJYvTjTXeQfRkOeSG2mQ+CJ0XzOVBvGtgwk09x4TLqhCGhP1EKTaeXsO/21+PA1e1iVfOMRx94iT048SjPuyp68GL3l+Aux/MMwTuHqAS9UClOKveEaijbkpu+e/SYynC2x1uZB16gWXn2zA8JqO2043d9X2AxwnF/R3scwf4QE+SlH/rBet6TS/Q+NRLERPuDoyGUUHqVlxox6svXri8Mtp+kO+RAFQ5RCk1nCRQRwbpdZI0KNHMj4M+hr0/g8YY/UcM/wD4fYcC4gOWgAAAAABJRU5ErkJggg==","width":400,"height":400,"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png","srcSet":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png 1x,\n/static/7fa6bee9d2080bd021828c70f67a4720/fca9c/sphtech.png 1.5x"}}]}}}},"relatedPosts":{"totalCount":2,"edges":[{"node":{"id":"b29c15f7-9c98-53b0-a0cc-d9c54502b32a","timeToRead":3,"excerpt":"TL;DR Does asking users for feedback and ratings help in your app? Yes!When I joined Singapore Press Holdings in late 2015, most of the apps…","frontmatter":{"title":"How to get your mobile app users to give you ratings and feedback!"},"fields":{"slug":"/get-your-app-users-to-give-feedback/"}}},{"node":{"id":"12eeed0a-39f3-5439-83c9-9a5c79531c30","timeToRead":4,"excerpt":"A class is an observable live data that can be used to send events from ViewModel to View in Android MVVM-styled designs.This link…","frontmatter":{"title":"Using Mockito's ArgumentCaptor on SingleLiveEvent"},"fields":{"slug":"/using-mockitos-argumentcaptor/"}}}]}},"pageContext":{"isCreatedByStatefulCreatePages":false,"slug":"/get-your-app-users-to-give-feedback/","prev":{"excerpt":"This was the second Developers Gym session organized by Thoughtworks, of which we were honoured to play host to. The coding dojo, formulated…","timeToRead":2,"frontmatter":{"title":"Developers Gym by Thoughtworks - 14 July","tags":["Meetup","Reviews"],"date":"2018-07-25T14:25:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"aspectRatio":1.3333333333333333,"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAABAADBf/EABUBAQEAAAAAAAAAAAAAAAAAAAEA/9oADAMBAAIQAxAAAAFBg5F0Ycn/xAAZEAADAQEBAAAAAAAAAAAAAAAAARICAxP/2gAIAQEAAQUC88RpKp2b6Muikj//xAAWEQEBAQAAAAAAAAAAAAAAAAAAARH/2gAIAQMBAT8BZX//xAAWEQEBAQAAAAAAAAAAAAAAAAAAARH/2gAIAQIBAT8BjY//xAAcEAACAgIDAAAAAAAAAAAAAAAAARExAiESQXH/2gAIAQEABj8C5THo1i1otF6KOz//xAAdEAACAgIDAQAAAAAAAAAAAAAAAREhMUFRYYGh/9oACAEBAAE/IXBpbgTKVtySYg6Ki8xM1pmaowl9n//aAAwDAQACAAMAAAAQoA//xAAXEQADAQAAAAAAAAAAAAAAAAAAASFh/9oACAEDAQE/EHVGbn//xAAXEQEBAQEAAAAAAAAAAAAAAAABABFh/9oACAECAQE/EEZqXC//xAAcEAEAAgIDAQAAAAAAAAAAAAABABEhMUFhcVH/2gAIAQEAAT8QGhkCBsvx3AVpM2ixeMzYf0WSkaQrsF8QpXaeLg+ErhYbNDqf/9k=","sizes":"(max-width: 1400px) 100vw, 1400px","src":"/static/9f96e81e6f6d55da468755a49a4b0666/3dc2b/IMG_8071.jpg","srcSet":"/static/9f96e81e6f6d55da468755a49a4b0666/f8f18/IMG_8071.jpg 930w,\n/static/9f96e81e6f6d55da468755a49a4b0666/3dc2b/IMG_8071.jpg 1400w"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/b4a08/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/developers-gym-by-thoughtworks-14-july/"}},"next":{"excerpt":"A class is an observable live data that can be used to send events from ViewModel to View in Android MVVM-styled designs.This link…","timeToRead":4,"frontmatter":{"title":"Using Mockito's ArgumentCaptor on SingleLiveEvent","tags":["Android","Testing","Tutorial"],"date":"2018-10-10T17:21:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"aspectRatio":1.5005359056806002,"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAgADBf/EABcBAAMBAAAAAAAAAAAAAAAAAAABAgP/2gAMAwEAAhADEAAAAU+M2Gxqz//EABkQAQEAAwEAAAAAAAAAAAAAAAIBAAMEEf/aAAgBAQABBQLQIl0GiQ3wqzHsSmf/xAAWEQEBAQAAAAAAAAAAAAAAAAARAAH/2gAIAQMBAT8BwJv/xAAWEQEBAQAAAAAAAAAAAAAAAAAAESH/2gAIAQIBAT8B1H//xAAcEAACAgIDAAAAAAAAAAAAAAAAASFBAxARQlL/2gAIAQEABj8CycrsNrzZRBOv/8QAHBABAAEEAwAAAAAAAAAAAAAAAQAQESFhMZGh/9oACAEBAAE/Ic7lodhS47RAT1OVOdwQJbbp/9oADAMBAAIAAwAAABBwH//EABcRAQADAAAAAAAAAAAAAAAAAAABETH/2gAIAQMBAT8Q1Ss//8QAFhEAAwAAAAAAAAAAAAAAAAAAARAh/9oACAECAQE/EDSf/8QAGxABAQADAQEBAAAAAAAAAAAAAREAITFRQXH/2gAIAQEAAT8QnlojNn4/MQFk9hRx777jIQnJxujdmMrgpzi1i1uf/9k=","sizes":"(max-width: 1400px) 100vw, 1400px","src":"/static/7c9ee95dd61b5588277447a33ccd293c/3dc2b/code-sunshine.jpg","srcSet":"/static/7c9ee95dd61b5588277447a33ccd293c/f8f18/code-sunshine.jpg 930w,\n/static/7c9ee95dd61b5588277447a33ccd293c/3dc2b/code-sunshine.jpg 1400w"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/b4a08/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/using-mockitos-argumentcaptor/"}},"primaryTag":"Android"}}} \ No newline at end of file diff --git a/page-data/index/page-data.json b/page-data/index/page-data.json index 8ff18ee..fa9f844 100644 --- a/page-data/index/page-data.json +++ b/page-data/index/page-data.json @@ -1 +1 @@ -{"componentChunkName":"component---src-pages-index-tsx","path":"/","webpackCompilationHash":"e6542130e6dfe73197bb","result":{"data":{"logo":{"childImageSharp":{"fixed":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsSAAALEgHS3X78AAABFUlEQVQY023PvUrDUBTA8ZuCtoMoOLQ4dWhN14x2kEKXFkGoohQ/QBexOHRycAidKkgHHRq69APRoTjFJYODIA6+gSBYfYMmfYLE/5VT6NALP845NyeHc9UoCHZRQvonCLKKE4ZhAXYURTsYoE9dIy5iCzfUJnEdV+RF4iu6ikFH2EPxazzOcJmg4Rnn5C8ysIEOHqTe5/sT3qXOwYOtRr5/wLAqzpCTDXu4p2ETtyjgGJ/cX+se8jeU9fa4RBt5vWENpjzdkoGPcGg4RQsbOMEFmnBRRwVDHEK/yFXfvr/CoPjvZLKcdByDyzWGeajigzorGy0oOeRJiUtITe/pX1XzDk3buIMltSFR/zTtic3060X+8z8PsEUt8G3LVQAAAABJRU5ErkJggg==","width":400,"height":128,"src":"/static/2b5eaa0de166a8b5faebad4955c2200c/647de/ghost-logo.png","srcSet":"/static/2b5eaa0de166a8b5faebad4955c2200c/647de/ghost-logo.png 1x"}}},"header":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAEDBf/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAHHi1SLB//EABgQAAIDAAAAAAAAAAAAAAAAAAEREiAx/9oACAEBAAEFAtrIr//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABkQAAEFAAAAAAAAAAAAAAAAAAEAESAhcf/aAAgBAQAGPwJzexC//8QAGRABAAMBAQAAAAAAAAAAAAAAAQARMUFR/9oACAEBAAE/IXsU9Ud9lMMJyWWOFE//2gAMAwEAAgADAAAAEKMf/8QAFxEBAAMAAAAAAAAAAAAAAAAAAAERMf/aAAgBAwEBPxDVQ//EABURAQEAAAAAAAAAAAAAAAAAAAAh/9oACAECAQE/EFf/xAAbEAEAAgMBAQAAAAAAAAAAAAABABExQWEhUf/aAAgBAQABPxBhA0ZFStqWm5wfeTKjtESqHYYPk//Z","aspectRatio":1.7811704834605597,"src":"/static/139cd143d28a3a2218d99f77ef96f2af/3dc2b/blog-cover.jpg","srcSet":"/static/139cd143d28a3a2218d99f77ef96f2af/32ee9/blog-cover.jpg 500w,\n/static/139cd143d28a3a2218d99f77ef96f2af/2f7e7/blog-cover.jpg 1000w,\n/static/139cd143d28a3a2218d99f77ef96f2af/3dc2b/blog-cover.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"allMarkdownRemark":{"edges":[{"node":{"timeToRead":4,"frontmatter":{"title":"XConf Review - Economics of Software Quality","date":"2019-04-29T12:46:00.000Z","tags":["Review"],"draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAMABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAMEBf/EABUBAQEAAAAAAAAAAAAAAAAAAAEC/9oADAMBAAIQAxAAAAGJ0yCtYUS//8QAGxAAAgIDAQAAAAAAAAAAAAAAAQIAAxESEyH/2gAIAQEAAQUCcLpxqlVqpWh2mfOYE//EABYRAQEBAAAAAAAAAAAAAAAAAAABEf/aAAgBAwEBPwGsf//EABYRAQEBAAAAAAAAAAAAAAAAAAABEf/aAAgBAgEBPwGVr//EAB0QAAMAAAcAAAAAAAAAAAAAAAABERASISJxgZH/2gAIAQEABj8Cqeot17Esq8JBc4f/xAAaEAEAAwEBAQAAAAAAAAAAAAABABEhQVEx/9oACAEBAAE/Ia5FjR9iHQmwq0fdyhYfTezbURbavdn/2gAMAwEAAgADAAAAEJAP/8QAFxEBAQEBAAAAAAAAAAAAAAAAAREAUf/aAAgBAwEBPxAVG6Ob/8QAGBEAAgMAAAAAAAAAAAAAAAAAAAERMUH/2gAIAQIBAT8QUrRPD//EABwQAQACAgMBAAAAAAAAAAAAAAEAESExQXGhkf/aAAgBAQABPxBKPijxjqFgV4E15Di4tQT2yytaAmA3g+SylgjXFET1otnWJ//Z","aspectRatio":1.696969696969697,"src":"/static/4eba5c89024d95c479a7a9ee73e9ac18/3dc2b/IMG__0303.jpg","srcSet":"/static/4eba5c89024d95c479a7a9ee73e9ac18/f8f18/IMG__0303.jpg 930w,\n/static/4eba5c89024d95c479a7a9ee73e9ac18/3dc2b/IMG__0303.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"excerpt":"Mr Martin Fowler was one of the founding members of the Agile Manifesto, author of many books including my favourite Refactoring (1st…","fields":{"layout":"post","slug":"/xconf-economics-of-software-quality/"}}},{"node":{"timeToRead":6,"frontmatter":{"title":"Revitalizing our engineering - Engineering 2.0","date":"2019-03-12T14:00:00.000Z","tags":[],"draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAQBAgMF/8QAFgEBAQEAAAAAAAAAAAAAAAAAAgED/9oADAMBAAIQAxAAAAHa/IbjgWMn/8QAHBAAAwABBQAAAAAAAAAAAAAAAQIDEwAEERIU/9oACAEBAAEFAgiMfONPHhs5LS3B72qcv//EABYRAQEBAAAAAAAAAAAAAAAAAAABEf/aAAgBAwEBPwGNj//EABcRAAMBAAAAAAAAAAAAAAAAAAABAiH/2gAIAQIBAT8Bps0//8QAGBABAQEBAQAAAAAAAAAAAAAAAQARECH/2gAIAQEABj8CzmWrGrPrf//EABkQAQEBAQEBAAAAAAAAAAAAABEBADFBUf/aAAgBAQABPyEO6ezPyOWGsOpmACfuCwnf/9oADAMBAAIAAwAAABBA3//EABcRAAMBAAAAAAAAAAAAAAAAAAABETH/2gAIAQMBAT8QmkdR/8QAFhEBAQEAAAAAAAAAAAAAAAAAEQAB/9oACAECAQE/ED2PG//EABoQAQEBAAMBAAAAAAAAAAAAAAERACExQXH/2gAIAQEAAT8Q5hISiCfR5xeVaWEnkM+D1NSZrywMwqmEFfN//9k=","aspectRatio":1.3333333333333333,"src":"/static/2ecbc0836b73436a052109efa9ccde4e/3dc2b/william-warby-1357858-unsplash-1.jpg","srcSet":"/static/2ecbc0836b73436a052109efa9ccde4e/f8f18/william-warby-1357858-unsplash-1.jpg 930w,\n/static/2ecbc0836b73436a052109efa9ccde4e/3dc2b/william-warby-1357858-unsplash-1.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"excerpt":"We developed a News Tablet application for the Samsung Knox recently, and we are able to institute the various good engineering practices…","fields":{"layout":"post","slug":"/revitalizing-our-engineering/"}}},{"node":{"timeToRead":3,"frontmatter":{"title":"The developer's role in a successful implementation of the test automation","date":"2018-12-06T12:54:00.000Z","tags":["Testing"],"draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAACiElEQVQoz02SS0hUURjHZ9WqoE0RbcJFRUWBROuKCKqNFY1iD2yRo5ELicqoSBOMMGSsQHpDlBbVooYwhKgcSU3thUo048C0cJh7ve9zn/P6950zjnThz3fvuYff9z//74TiI8OIj05ibHwKo6RP8XGMTXxHOpXE1+kkfqVlqHIWiqKSFKTTaczNzQklEgkkk0mkUqklhTbuasaKzbVYs/0EVlUfR2jtfhxoaEcxn4PvewBKKJVKKBaLQvydK5fLgTEGx3FQKBTEGq+hzt7nONP+EFd7X+BC9zO0XHuEewNDCJiFwPXhuR5c10U+n18C88q/+eP7vnBuGIZYCyX//MTv2UnMzEwiMTuBv4kfkDJp6AsKtKwMXWVQNQOKpoPZtnD2P5A7nJ+fhyRJ4l/o8/t+vOmP4nqkBq9vX8bgqz5MfRkC002YBLUtBw45ZbYDj9xUnFbA3H0mk4Esy2WHE8Mx3L/VgTtnG/Gg6xJiL+9i+lscjmHCok2MjhO4ATzPg20zAeJPxSEHZrNZcWwBHPswgG1b1qGtO4qGxiZEz9cjNTuCIMjDWliAKcmwDQqfHDJmE9gX4VfAvBF3p6pqGXix4ylWb2jGjr1dqN7diaqtrejti5UDp4EwgtrU3WeOGJBDLoPFo1fEG/BhiSnvPBLDsqpBLF//Fis3vaNrE8PJcx8JVyQXBWiKBkXiU3RhMA+qacOiTHO5vJhwEJTj4FU4bOt6gnCkB/WnexBuuoGDdVcQvflYOORddUWHSkBdc6AaDiSauEbQ3GKG/OimaVK+ttgfikROoa72EI4dDSMcrsHhfXtwpbUFLmVl08U1KB9DlmCqOgxdJ7BKVRMQy7KE+B3kw+HQf+uQ+eTE1QltAAAAAElFTkSuQmCC","aspectRatio":1.8252933507170794,"src":"/static/131b22d7fad4398f72deddd43464e6a3/cd9a9/blog-test-automation.png","srcSet":"/static/131b22d7fad4398f72deddd43464e6a3/4c9af/blog-test-automation.png 930w,\n/static/131b22d7fad4398f72deddd43464e6a3/cd9a9/blog-test-automation.png 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"excerpt":"Rod Michael, director of global market access strategy and channels at Rockwell Automation, famously said, “If you automate a mess, you get…","fields":{"layout":"post","slug":"/developers-role-in-test-automation/"}}},{"node":{"timeToRead":1,"frontmatter":{"title":"Towards a Privacy Aware Smart Nation","date":"2018-11-29T12:43:00.000Z","tags":["Meetup","Review"],"draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAJABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAEFAgT/xAAVAQEBAAAAAAAAAAAAAAAAAAABAv/aAAwDAQACEAMQAAAB053bCyYWf//EABsQAQEAAQUAAAAAAAAAAAAAAAECAAMEETFD/9oACAEBAAEFAm5ETmN0SanXkZ//xAAWEQADAAAAAAAAAAAAAAAAAAACEBP/2gAIAQMBAT8BmK//xAAWEQADAAAAAAAAAAAAAAAAAAABEBL/2gAIAQIBAT8Bsr//xAAdEAACAgEFAAAAAAAAAAAAAAAAAQIRIgMhMVFx/9oACAEBAAY/AlhsPC1dIpx46IGmP0//xAAZEAEBAQEBAQAAAAAAAAAAAAABABExkaH/2gAIAQEAAT8h5JXdYTvtDIM+p9zM9V//2gAMAwEAAgADAAAAED/v/8QAFxEBAQEBAAAAAAAAAAAAAAAAAQAhEf/aAAgBAwEBPxBDebDf/8QAFxEBAQEBAAAAAAAAAAAAAAAAAQAhYf/aAAgBAgEBPxDE7Jf/xAAeEAEAAQMFAQAAAAAAAAAAAAABABEhMRBBUZGhsf/aAAgBAQABPxByuAIDK1Q3gs3CANhxD6tQMee610h6X4z3J//Z","aspectRatio":2.130492676431425,"src":"/static/ef473fd608a488e0579a6ab7fe528337/989b1/sphtech-meetup-ncript.jpg","srcSet":"/static/ef473fd608a488e0579a6ab7fe528337/f8f18/sphtech-meetup-ncript.jpg 930w,\n/static/ef473fd608a488e0579a6ab7fe528337/989b1/sphtech-meetup-ncript.jpg 1600w","sizes":"(max-width: 1600px) 100vw, 1600px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"excerpt":"On the 21st of November, SPH staff gathered for a cozy SPHTech Meetup session at The Inspiration Hub to learn about Data Privacy efforts in…","fields":{"layout":"post","slug":"/towards-a-privacy-aware-smart-nation/"}}},{"node":{"timeToRead":2,"frontmatter":{"title":"Docker workshop in SPH","date":"2018-11-27T11:06:00.000Z","tags":["Docker"],"draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAQBAgMF/8QAFgEBAQEAAAAAAAAAAAAAAAAAAQAC/9oADAMBAAIQAxAAAAHSOfXC0Lkf/8QAGBABAAMBAAAAAAAAAAAAAAAAAgABEhH/2gAIAQEAAQUCOLjJ5m4moTbOan//xAAWEQEBAQAAAAAAAAAAAAAAAAAAARL/2gAIAQMBAT8BZr//xAAXEQEAAwAAAAAAAAAAAAAAAAAAARIh/9oACAECAQE/AcWh/8QAGxAAAgIDAQAAAAAAAAAAAAAAAAERIQIiMkH/2gAIAQEABj8Ci5Nc0zpFPwtwdM//xAAbEAEBAQADAQEAAAAAAAAAAAABEQAhMUFx4f/aAAgBAQABPyEl3QNMM0vR81rOLjQlC9jIEfoufyN//9oADAMBAAIAAwAAABCAL//EABgRAAIDAAAAAAAAAAAAAAAAAAABESFh/9oACAEDAQE/EIbpGh//xAAYEQACAwAAAAAAAAAAAAAAAAAAAREhYf/aAAgBAgEBPxCUVmJ//8QAGxABAQACAwEAAAAAAAAAAAAAAREAITFBUWH/2gAIAQEAAT8QbJCQCVvU+YydZkj3BMNVBNOVRsBAXfyZuoUFFzxTBMS8DH//2Q==","aspectRatio":1.3333333333333333,"src":"/static/67c833d51f70a35acd4074e27a1b9a26/3dc2b/IMG_9175-1.jpg","srcSet":"/static/67c833d51f70a35acd4074e27a1b9a26/f8f18/IMG_9175-1.jpg 930w,\n/static/67c833d51f70a35acd4074e27a1b9a26/3dc2b/IMG_9175-1.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"excerpt":"Containerization has been one of the most talk about topics in the digital world. It enabled a whole new paradigm shift in getting software…","fields":{"layout":"post","slug":"/docker-workshop-in-sph/"}}},{"node":{"timeToRead":4,"frontmatter":{"title":"Using Mockito's ArgumentCaptor on SingleLiveEvent","date":"2018-10-10T17:21:00.000Z","tags":["Android","Testing","Tutorial"],"draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAgADBf/EABcBAAMBAAAAAAAAAAAAAAAAAAABAgP/2gAMAwEAAhADEAAAAU+M2Gxqz//EABkQAQEAAwEAAAAAAAAAAAAAAAIBAAMEEf/aAAgBAQABBQLQIl0GiQ3wqzHsSmf/xAAWEQEBAQAAAAAAAAAAAAAAAAARAAH/2gAIAQMBAT8BwJv/xAAWEQEBAQAAAAAAAAAAAAAAAAAAESH/2gAIAQIBAT8B1H//xAAcEAACAgIDAAAAAAAAAAAAAAAAASFBAxARQlL/2gAIAQEABj8CycrsNrzZRBOv/8QAHBABAAEEAwAAAAAAAAAAAAAAAQAQESFhMZGh/9oACAEBAAE/Ic7lodhS47RAT1OVOdwQJbbp/9oADAMBAAIAAwAAABBwH//EABcRAQADAAAAAAAAAAAAAAAAAAABETH/2gAIAQMBAT8Q1Ss//8QAFhEAAwAAAAAAAAAAAAAAAAAAARAh/9oACAECAQE/EDSf/8QAGxABAQADAQEBAAAAAAAAAAAAAREAITFRQXH/2gAIAQEAAT8QnlojNn4/MQFk9hRx777jIQnJxujdmMrgpzi1i1uf/9k=","aspectRatio":1.5005359056806002,"src":"/static/7c9ee95dd61b5588277447a33ccd293c/3dc2b/code-sunshine.jpg","srcSet":"/static/7c9ee95dd61b5588277447a33ccd293c/f8f18/code-sunshine.jpg 930w,\n/static/7c9ee95dd61b5588277447a33ccd293c/3dc2b/code-sunshine.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"excerpt":"A class is an observable live data that can be used to send events from ViewModel to View in Android MVVM-styled designs.This link…","fields":{"layout":"post","slug":"/using-mockitos-argumentcaptor/"}}},{"node":{"timeToRead":3,"frontmatter":{"title":"How to get your mobile app users to give you ratings and feedback!","date":"2018-10-07T23:10:00.000Z","tags":["Android"],"draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAIAAAA7N+mxAAAACXBIWXMAAAsSAAALEgHS3X78AAABo0lEQVQoz2WRWW/TQBSF/c954kcgJErFA+ob8NBKhCVSaSsEArElJG3tZqkdjz2JZ+zZN+5MWoHEkT26tu935txx5pOcs7D4dAcfqGTHNxcvr8cv8ouPm5kzxqWvUsphGJzbQz7TWncdUUoj1HDOA8gHqfC8ev6rGq26dcso9IQkxhjA4V5Z8qNCYkKxMTaxwfWVRz9jZZzTVps7GEjghVI2JgkZvLLOaM2s0w7Sg4F3itJ+uVJaq3tZaxPcS6X+7lyjGmMshNTa7PtgMMDA6e5RKfAG0zYKN3V19Hnx4Hj26EOeQSsBUQJF+EdwdvsRQGjQiHLS7VqM2waNp7cH5/m7Ocogj4txwRoSG2h9Nh+flRMolIZtIYZkQgyCxyHgMsp7u7eNsA2euTiSSevDT4dPJ6+3QnFtwn/yKYwBCn6VNa7sFmf5qOPbTVd2TCxWj78WTw5/HJwUb98vT0eL0+/t9M3y/KQYf6m+HU1eTdFvqeOxZcqYpr3hXbHZrWtSlttbMeSKXqohJ/11Sy5rcrXaXlUkr/Cs7YtmN8X9mpt4QH8Ad7k0jshkD1kAAAAASUVORK5CYII=","aspectRatio":2.074786324786325,"src":"/static/4d42232e07032296408b0a75d8f9815e/a83d1/zaobao-app-chart1.png","srcSet":"/static/4d42232e07032296408b0a75d8f9815e/4c9af/zaobao-app-chart1.png 930w,\n/static/4d42232e07032296408b0a75d8f9815e/a83d1/zaobao-app-chart1.png 971w","sizes":"(max-width: 971px) 100vw, 971px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"excerpt":"TL;DR Does asking users for feedback and ratings help in your app? Yes!When I joined Singapore Press Holdings in late 2015, most of the apps…","fields":{"layout":"post","slug":"/get-your-app-users-to-give-feedback/"}}},{"node":{"timeToRead":2,"frontmatter":{"title":"Developers Gym by Thoughtworks - 14 July","date":"2018-07-25T14:25:00.000Z","tags":["Meetup","Reviews"],"draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAABAADBf/EABUBAQEAAAAAAAAAAAAAAAAAAAEA/9oADAMBAAIQAxAAAAFBg5F0Ycn/xAAZEAADAQEBAAAAAAAAAAAAAAAAARICAxP/2gAIAQEAAQUC88RpKp2b6Muikj//xAAWEQEBAQAAAAAAAAAAAAAAAAAAARH/2gAIAQMBAT8BZX//xAAWEQEBAQAAAAAAAAAAAAAAAAAAARH/2gAIAQIBAT8BjY//xAAcEAACAgIDAAAAAAAAAAAAAAAAARExAiESQXH/2gAIAQEABj8C5THo1i1otF6KOz//xAAdEAACAgIDAQAAAAAAAAAAAAAAAREhMUFRYYGh/9oACAEBAAE/IXBpbgTKVtySYg6Ki8xM1pmaowl9n//aAAwDAQACAAMAAAAQoA//xAAXEQADAQAAAAAAAAAAAAAAAAAAASFh/9oACAEDAQE/EHVGbn//xAAXEQEBAQEAAAAAAAAAAAAAAAABABFh/9oACAECAQE/EEZqXC//xAAcEAEAAgIDAQAAAAAAAAAAAAABABEhMUFhcVH/2gAIAQEAAT8QGhkCBsvx3AVpM2ixeMzYf0WSkaQrsF8QpXaeLg+ErhYbNDqf/9k=","aspectRatio":1.3333333333333333,"src":"/static/9f96e81e6f6d55da468755a49a4b0666/3dc2b/IMG_8071.jpg","srcSet":"/static/9f96e81e6f6d55da468755a49a4b0666/f8f18/IMG_8071.jpg 930w,\n/static/9f96e81e6f6d55da468755a49a4b0666/3dc2b/IMG_8071.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"excerpt":"This was the second Developers Gym session organized by Thoughtworks, of which we were honoured to play host to. The coding dojo, formulated…","fields":{"layout":"post","slug":"/developers-gym-by-thoughtworks-14-july/"}}},{"node":{"timeToRead":3,"frontmatter":{"title":"Updates to Govtech Agile Practices by Steven Koh - 2 July","date":"2018-07-18T17:50:00.000Z","tags":["Meetup"],"draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAABAACBf/EABYBAQEBAAAAAAAAAAAAAAAAAAIAAf/aAAwDAQACEAMQAAABZzh6OLgyv//EABwQAAIBBQEAAAAAAAAAAAAAAAECAwAREhMxQf/aAAgBAQABBQJtITwRlqbls2eUhv/EABYRAAMAAAAAAAAAAAAAAAAAAAABEf/aAAgBAwEBPwFqkP/EABURAQEAAAAAAAAAAAAAAAAAAAEQ/9oACAECAQE/ARJ//8QAHBAAAgICAwAAAAAAAAAAAAAAAAECESExEiIy/9oACAEBAAY/ApNS0dnxPQ87LTwOj//EABoQAAIDAQEAAAAAAAAAAAAAAAERACExQVH/2gAIAQEAAT8hsI8g5G21q4MYOMQGmoCwNG4Escn/2gAMAwEAAgADAAAAEP8AD//EABYRAAMAAAAAAAAAAAAAAAAAAAEQQf/aAAgBAwEBPxCAr//EABcRAQADAAAAAAAAAAAAAAAAAAABETH/2gAIAQIBAT8Qhat//8QAGhAAAwEBAQEAAAAAAAAAAAAAAREhADFBsf/aAAgBAQABPxBl5yWG8GJujIADqfnNA21SvuiI6OdbA0bJgUoL4MagESyDDd3/2Q==","aspectRatio":1.3333333333333333,"src":"/static/8d8fee52f47c44485daff296b0c76794/3dc2b/meetup-speaker.jpg","srcSet":"/static/8d8fee52f47c44485daff296b0c76794/f8f18/meetup-speaker.jpg 930w,\n/static/8d8fee52f47c44485daff296b0c76794/3dc2b/meetup-speaker.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"excerpt":"It was our great pleasure to have invited Mr Steven Koh, the Deputy Director of Government Digital Services (GDS) at Govtech, to update us…","fields":{"layout":"post","slug":"/updates-to-govtech-agile-practices/"}}},{"node":{"timeToRead":3,"frontmatter":{"title":"AI in News Media","date":"2018-07-12T22:46:00.000Z","tags":[],"draft":false,"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAIEAQP/xAAVAQEBAAAAAAAAAAAAAAAAAAABAv/aAAwDAQACEAMQAAABbnkrNAwn/8QAHBABAAEEAwAAAAAAAAAAAAAAAQACAxESEyEi/9oACAEBAAEFAsLGnvhuTKVL6trr/8QAFxEAAwEAAAAAAAAAAAAAAAAAAAEREv/aAAgBAwEBPwHKIj//xAAXEQEAAwAAAAAAAAAAAAAAAAAAAREh/9oACAECAQE/Ablr/8QAGhAAAgIDAAAAAAAAAAAAAAAAABABITEy8P/aAAgBAQAGPwJayV1rJ//EABsQAAMAAgMAAAAAAAAAAAAAAAABESExQWGB/9oACAEBAAE/IaHM9j2KZRS6mkHc3sbyZ+n/2gAMAwEAAgADAAAAEJvf/8QAFhEBAQEAAAAAAAAAAAAAAAAAABFB/9oACAEDAQE/EHHH/8QAFxEAAwEAAAAAAAAAAAAAAAAAAAERQf/aAAgBAgEBPxBFX0//xAAdEAEBAAMAAgMAAAAAAAAAAAABEQAhMUFRYXGh/9oACAEBAAE/EI4MDolZ4mCAJTthy4toHwXFAiuj0y/hiQMnbf3nFcwq5DP/2Q==","aspectRatio":1.8741633199464525,"src":"/static/9bea42284114acb5ba9e14a5fe42867c/3dc2b/INMANews-ArtificialIntelligence-1800.jpg","srcSet":"/static/9bea42284114acb5ba9e14a5fe42867c/f8f18/INMANews-ArtificialIntelligence-1800.jpg 930w,\n/static/9bea42284114acb5ba9e14a5fe42867c/3dc2b/INMANews-ArtificialIntelligence-1800.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"excerpt":"IntroductionNews media companies like Singapore Press Holdings (SPH) continue to be faced with rapidly accelerating technology innovation…","fields":{"layout":"post","slug":"/ai-in-news-media/"}}},{"node":{"timeToRead":3,"frontmatter":{"title":"Video Review - Carousell Level-Up: Applying Scrum for Better Delivery","date":"2018-02-05T07:53:00.000Z","tags":["Review","Meetup"],"draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAA7DAAAOwwHHb6hkAAACqklEQVQozwGfAmD9ADEVFzklJjolJzceITslJTchIjwpLDolKDglJTYhITsmJj4qKzkiJDspKTYoKDYpKiwaG0AyMj8xMi4ZGgCoNTmrQkWqOD2pPEGpOT2pLDGqMziqLzSoJiqpJSmqJyurKCypIyirLjKbTEt8KCpoHSBvLTFzLTF2LTEAyzQ5zUVJzT9DzDxAzD9FzUZKykNIy0JHyjo/yTk+yjo/yjtAyztAzDpB0IJ+u25rpVZYmFRVo2ZnrHV1ANZCR9x2edhqbthcYNpqbdltcdlhZdtobNtobNtgZN1nbNliZthtcdZPVNx1adJXSsKIfqFoYq9ER6xERwDXR0vXaGzXa2/YaW3XZWrbfH/Yf4PajI/Yd3vGaWzGZ2rXcHTagITabXLcVkPROCaUW0+KQz+4Hh+tIyYA1UNH12dq1mNo2Gxx2Wxw8sXH56+x4pOVyIaJXFVVTUpKyIqL99LS6KWn3U89WiUnFR4vISxFWx0ovjk3ANMyN9M4PdI3PdM6P9M5PtI5PtI8QtU4PswrMZ8qL5kpLcstMtUrMdc+QthdTFFESi4zQh0nNltDRcJHRwDSNTrURkvURkrUS07TTVHURUnUSEzTQUbUOD7bPUPaO0HTLTPSJCvVQkXaXEmadXBEPj5HPjypamLAS00A0Ds/z0ZLzzxB0D1CzTg8zzY6zjpAz0FFzUFGzkRJz0NJzjQ6zyYr0kdK20k4Xx8gAAQPBAcNdRAUwU1PAOM5P+FITuNMUuNQVeJFTOI8QuIzOeJCR+JVWuRaX+NVWuNCSOMqMOZNUdhFPolxdUhpcUZpcY07QMpOUQCLGx+LHCCKIiaKIiWKJCeLIyeLHSGLHCGLIiaLIyeJISWKHCCKHCCLKCyJOjx+TE5vTlFsVlp0REaBQEJqGgpHmAn0+wAAAABJRU5ErkJggg==","aspectRatio":1.7793696275071633,"src":"/static/dbb7bd9058838337f25ad9090b348997/748f9/scrum-video-intro.png","srcSet":"/static/dbb7bd9058838337f25ad9090b348997/748f9/scrum-video-intro.png 621w","sizes":"(max-width: 621px) 100vw, 621px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"excerpt":"Hi all! It has been a while since some of us have gone for the Scrum training by Mr Stuart, building balloon animal zoos to learn what is…","fields":{"layout":"post","slug":"/video-review-carousell-level-up/"}}}]}},"pageContext":{"isCreatedByStatefulCreatePages":true}}} \ No newline at end of file +{"componentChunkName":"component---src-pages-index-tsx","path":"/","webpackCompilationHash":"4d127609ee78b8f0aee7","result":{"data":{"logo":{"childImageSharp":{"fixed":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsSAAALEgHS3X78AAABFUlEQVQY023PvUrDUBTA8ZuCtoMoOLQ4dWhN14x2kEKXFkGoohQ/QBexOHRycAidKkgHHRq69APRoTjFJYODIA6+gSBYfYMmfYLE/5VT6NALP845NyeHc9UoCHZRQvonCLKKE4ZhAXYURTsYoE9dIy5iCzfUJnEdV+RF4iu6ikFH2EPxazzOcJmg4Rnn5C8ysIEOHqTe5/sT3qXOwYOtRr5/wLAqzpCTDXu4p2ETtyjgGJ/cX+se8jeU9fa4RBt5vWENpjzdkoGPcGg4RQsbOMEFmnBRRwVDHEK/yFXfvr/CoPjvZLKcdByDyzWGeajigzorGy0oOeRJiUtITe/pX1XzDk3buIMltSFR/zTtic3060X+8z8PsEUt8G3LVQAAAABJRU5ErkJggg==","width":400,"height":128,"src":"/static/2b5eaa0de166a8b5faebad4955c2200c/647de/ghost-logo.png","srcSet":"/static/2b5eaa0de166a8b5faebad4955c2200c/647de/ghost-logo.png 1x"}}},"header":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAEDBf/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAHHi1SLB//EABgQAAIDAAAAAAAAAAAAAAAAAAEREiAx/9oACAEBAAEFAtrIr//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABkQAAEFAAAAAAAAAAAAAAAAAAEAESAhcf/aAAgBAQAGPwJzexC//8QAGRABAAMBAQAAAAAAAAAAAAAAAQARMUFR/9oACAEBAAE/IXsU9Ud9lMMJyWWOFE//2gAMAwEAAgADAAAAEKMf/8QAFxEBAAMAAAAAAAAAAAAAAAAAAAERMf/aAAgBAwEBPxDVQ//EABURAQEAAAAAAAAAAAAAAAAAAAAh/9oACAECAQE/EFf/xAAbEAEAAgMBAQAAAAAAAAAAAAABABExQWEhUf/aAAgBAQABPxBhA0ZFStqWm5wfeTKjtESqHYYPk//Z","aspectRatio":1.7811704834605597,"src":"/static/139cd143d28a3a2218d99f77ef96f2af/3dc2b/blog-cover.jpg","srcSet":"/static/139cd143d28a3a2218d99f77ef96f2af/32ee9/blog-cover.jpg 500w,\n/static/139cd143d28a3a2218d99f77ef96f2af/2f7e7/blog-cover.jpg 1000w,\n/static/139cd143d28a3a2218d99f77ef96f2af/3dc2b/blog-cover.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"allMarkdownRemark":{"edges":[{"node":{"timeToRead":4,"frontmatter":{"title":"XConf Review - Economics of Software Quality","date":"2019-04-29T12:46:00.000Z","tags":["Review"],"draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAMABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAMEBf/EABUBAQEAAAAAAAAAAAAAAAAAAAEC/9oADAMBAAIQAxAAAAGJ0yCtYUS//8QAGxAAAgIDAQAAAAAAAAAAAAAAAQIAAxESEyH/2gAIAQEAAQUCcLpxqlVqpWh2mfOYE//EABYRAQEBAAAAAAAAAAAAAAAAAAABEf/aAAgBAwEBPwGsf//EABYRAQEBAAAAAAAAAAAAAAAAAAABEf/aAAgBAgEBPwGVr//EAB0QAAMAAAcAAAAAAAAAAAAAAAABERASISJxgZH/2gAIAQEABj8Cqeot17Esq8JBc4f/xAAaEAEAAwEBAQAAAAAAAAAAAAABABEhQVEx/9oACAEBAAE/Ia5FjR9iHQmwq0fdyhYfTezbURbavdn/2gAMAwEAAgADAAAAEJAP/8QAFxEBAQEBAAAAAAAAAAAAAAAAAREAUf/aAAgBAwEBPxAVG6Ob/8QAGBEAAgMAAAAAAAAAAAAAAAAAAAERMUH/2gAIAQIBAT8QUrRPD//EABwQAQACAgMBAAAAAAAAAAAAAAEAESExQXGhkf/aAAgBAQABPxBKPijxjqFgV4E15Di4tQT2yytaAmA3g+SylgjXFET1otnWJ//Z","aspectRatio":1.696969696969697,"src":"/static/4eba5c89024d95c479a7a9ee73e9ac18/3dc2b/IMG__0303.jpg","srcSet":"/static/4eba5c89024d95c479a7a9ee73e9ac18/f8f18/IMG__0303.jpg 930w,\n/static/4eba5c89024d95c479a7a9ee73e9ac18/3dc2b/IMG__0303.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"excerpt":"Mr Martin Fowler was one of the founding members of the Agile Manifesto, author of many books including my favourite Refactoring (1st…","fields":{"layout":"post","slug":"/xconf-economics-of-software-quality/"}}},{"node":{"timeToRead":6,"frontmatter":{"title":"Revitalizing our engineering - Engineering 2.0","date":"2019-03-12T14:00:00.000Z","tags":[],"draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAQBAgMF/8QAFgEBAQEAAAAAAAAAAAAAAAAAAgED/9oADAMBAAIQAxAAAAHa/IbjgWMn/8QAHBAAAwABBQAAAAAAAAAAAAAAAQIDEwAEERIU/9oACAEBAAEFAgiMfONPHhs5LS3B72qcv//EABYRAQEBAAAAAAAAAAAAAAAAAAABEf/aAAgBAwEBPwGNj//EABcRAAMBAAAAAAAAAAAAAAAAAAABAiH/2gAIAQIBAT8Bps0//8QAGBABAQEBAQAAAAAAAAAAAAAAAQARECH/2gAIAQEABj8CzmWrGrPrf//EABkQAQEBAQEBAAAAAAAAAAAAABEBADFBUf/aAAgBAQABPyEO6ezPyOWGsOpmACfuCwnf/9oADAMBAAIAAwAAABBA3//EABcRAAMBAAAAAAAAAAAAAAAAAAABETH/2gAIAQMBAT8QmkdR/8QAFhEBAQEAAAAAAAAAAAAAAAAAEQAB/9oACAECAQE/ED2PG//EABoQAQEBAAMBAAAAAAAAAAAAAAERACExQXH/2gAIAQEAAT8Q5hISiCfR5xeVaWEnkM+D1NSZrywMwqmEFfN//9k=","aspectRatio":1.3333333333333333,"src":"/static/2ecbc0836b73436a052109efa9ccde4e/3dc2b/william-warby-1357858-unsplash-1.jpg","srcSet":"/static/2ecbc0836b73436a052109efa9ccde4e/f8f18/william-warby-1357858-unsplash-1.jpg 930w,\n/static/2ecbc0836b73436a052109efa9ccde4e/3dc2b/william-warby-1357858-unsplash-1.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"excerpt":"We developed a News Tablet application for the Samsung Knox recently, and we are able to institute the various good engineering practices…","fields":{"layout":"post","slug":"/revitalizing-our-engineering/"}}},{"node":{"timeToRead":3,"frontmatter":{"title":"The developer's role in a successful implementation of the test automation","date":"2018-12-06T12:54:00.000Z","tags":["Testing"],"draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAACiElEQVQoz02SS0hUURjHZ9WqoE0RbcJFRUWBROuKCKqNFY1iD2yRo5ELicqoSBOMMGSsQHpDlBbVooYwhKgcSU3thUo048C0cJh7ve9zn/P6950zjnThz3fvuYff9z//74TiI8OIj05ibHwKo6RP8XGMTXxHOpXE1+kkfqVlqHIWiqKSFKTTaczNzQklEgkkk0mkUqklhTbuasaKzbVYs/0EVlUfR2jtfhxoaEcxn4PvewBKKJVKKBaLQvydK5fLgTEGx3FQKBTEGq+hzt7nONP+EFd7X+BC9zO0XHuEewNDCJiFwPXhuR5c10U+n18C88q/+eP7vnBuGIZYCyX//MTv2UnMzEwiMTuBv4kfkDJp6AsKtKwMXWVQNQOKpoPZtnD2P5A7nJ+fhyRJ4l/o8/t+vOmP4nqkBq9vX8bgqz5MfRkC002YBLUtBw45ZbYDj9xUnFbA3H0mk4Esy2WHE8Mx3L/VgTtnG/Gg6xJiL+9i+lscjmHCok2MjhO4ATzPg20zAeJPxSEHZrNZcWwBHPswgG1b1qGtO4qGxiZEz9cjNTuCIMjDWliAKcmwDQqfHDJmE9gX4VfAvBF3p6pqGXix4ylWb2jGjr1dqN7diaqtrejti5UDp4EwgtrU3WeOGJBDLoPFo1fEG/BhiSnvPBLDsqpBLF//Fis3vaNrE8PJcx8JVyQXBWiKBkXiU3RhMA+qacOiTHO5vJhwEJTj4FU4bOt6gnCkB/WnexBuuoGDdVcQvflYOORddUWHSkBdc6AaDiSauEbQ3GKG/OimaVK+ttgfikROoa72EI4dDSMcrsHhfXtwpbUFLmVl08U1KB9DlmCqOgxdJ7BKVRMQy7KE+B3kw+HQf+uQ+eTE1QltAAAAAElFTkSuQmCC","aspectRatio":1.8252933507170794,"src":"/static/131b22d7fad4398f72deddd43464e6a3/cd9a9/blog-test-automation.png","srcSet":"/static/131b22d7fad4398f72deddd43464e6a3/4c9af/blog-test-automation.png 930w,\n/static/131b22d7fad4398f72deddd43464e6a3/cd9a9/blog-test-automation.png 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"excerpt":"Rod Michael, director of global market access strategy and channels at Rockwell Automation, famously said, “If you automate a mess, you get…","fields":{"layout":"post","slug":"/developers-role-in-test-automation/"}}},{"node":{"timeToRead":1,"frontmatter":{"title":"Towards a Privacy Aware Smart Nation","date":"2018-11-29T12:43:00.000Z","tags":["Meetup","Review"],"draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAJABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAEFAgT/xAAVAQEBAAAAAAAAAAAAAAAAAAABAv/aAAwDAQACEAMQAAAB053bCyYWf//EABsQAQEAAQUAAAAAAAAAAAAAAAECAAMEETFD/9oACAEBAAEFAm5ETmN0SanXkZ//xAAWEQADAAAAAAAAAAAAAAAAAAACEBP/2gAIAQMBAT8BmK//xAAWEQADAAAAAAAAAAAAAAAAAAABEBL/2gAIAQIBAT8Bsr//xAAdEAACAgEFAAAAAAAAAAAAAAAAAQIRIgMhMVFx/9oACAEBAAY/AlhsPC1dIpx46IGmP0//xAAZEAEBAQEBAQAAAAAAAAAAAAABABExkaH/2gAIAQEAAT8h5JXdYTvtDIM+p9zM9V//2gAMAwEAAgADAAAAED/v/8QAFxEBAQEBAAAAAAAAAAAAAAAAAQAhEf/aAAgBAwEBPxBDebDf/8QAFxEBAQEBAAAAAAAAAAAAAAAAAQAhYf/aAAgBAgEBPxDE7Jf/xAAeEAEAAQMFAQAAAAAAAAAAAAABABEhMRBBUZGhsf/aAAgBAQABPxByuAIDK1Q3gs3CANhxD6tQMee610h6X4z3J//Z","aspectRatio":2.130492676431425,"src":"/static/ef473fd608a488e0579a6ab7fe528337/989b1/sphtech-meetup-ncript.jpg","srcSet":"/static/ef473fd608a488e0579a6ab7fe528337/f8f18/sphtech-meetup-ncript.jpg 930w,\n/static/ef473fd608a488e0579a6ab7fe528337/989b1/sphtech-meetup-ncript.jpg 1600w","sizes":"(max-width: 1600px) 100vw, 1600px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"excerpt":"On the 21st of November, SPH staff gathered for a cozy SPHTech Meetup session at The Inspiration Hub to learn about Data Privacy efforts in…","fields":{"layout":"post","slug":"/towards-a-privacy-aware-smart-nation/"}}},{"node":{"timeToRead":2,"frontmatter":{"title":"Docker workshop in SPH","date":"2018-11-27T11:06:00.000Z","tags":["Docker"],"draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAQBAgMF/8QAFgEBAQEAAAAAAAAAAAAAAAAAAQAC/9oADAMBAAIQAxAAAAHSOfXC0Lkf/8QAGBABAAMBAAAAAAAAAAAAAAAAAgABEhH/2gAIAQEAAQUCOLjJ5m4moTbOan//xAAWEQEBAQAAAAAAAAAAAAAAAAAAARL/2gAIAQMBAT8BZr//xAAXEQEAAwAAAAAAAAAAAAAAAAAAARIh/9oACAECAQE/AcWh/8QAGxAAAgIDAQAAAAAAAAAAAAAAAAERIQIiMkH/2gAIAQEABj8Ci5Nc0zpFPwtwdM//xAAbEAEBAQADAQEAAAAAAAAAAAABEQAhMUFx4f/aAAgBAQABPyEl3QNMM0vR81rOLjQlC9jIEfoufyN//9oADAMBAAIAAwAAABCAL//EABgRAAIDAAAAAAAAAAAAAAAAAAABESFh/9oACAEDAQE/EIbpGh//xAAYEQACAwAAAAAAAAAAAAAAAAAAAREhYf/aAAgBAgEBPxCUVmJ//8QAGxABAQACAwEAAAAAAAAAAAAAAREAITFBUWH/2gAIAQEAAT8QbJCQCVvU+YydZkj3BMNVBNOVRsBAXfyZuoUFFzxTBMS8DH//2Q==","aspectRatio":1.3333333333333333,"src":"/static/67c833d51f70a35acd4074e27a1b9a26/3dc2b/IMG_9175-1.jpg","srcSet":"/static/67c833d51f70a35acd4074e27a1b9a26/f8f18/IMG_9175-1.jpg 930w,\n/static/67c833d51f70a35acd4074e27a1b9a26/3dc2b/IMG_9175-1.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"excerpt":"Containerization has been one of the most talk about topics in the digital world. It enabled a whole new paradigm shift in getting software…","fields":{"layout":"post","slug":"/docker-workshop-in-sph/"}}},{"node":{"timeToRead":4,"frontmatter":{"title":"Using Mockito's ArgumentCaptor on SingleLiveEvent","date":"2018-10-10T17:21:00.000Z","tags":["Android","Testing","Tutorial"],"draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAgADBf/EABcBAAMBAAAAAAAAAAAAAAAAAAABAgP/2gAMAwEAAhADEAAAAU+M2Gxqz//EABkQAQEAAwEAAAAAAAAAAAAAAAIBAAMEEf/aAAgBAQABBQLQIl0GiQ3wqzHsSmf/xAAWEQEBAQAAAAAAAAAAAAAAAAARAAH/2gAIAQMBAT8BwJv/xAAWEQEBAQAAAAAAAAAAAAAAAAAAESH/2gAIAQIBAT8B1H//xAAcEAACAgIDAAAAAAAAAAAAAAAAASFBAxARQlL/2gAIAQEABj8CycrsNrzZRBOv/8QAHBABAAEEAwAAAAAAAAAAAAAAAQAQESFhMZGh/9oACAEBAAE/Ic7lodhS47RAT1OVOdwQJbbp/9oADAMBAAIAAwAAABBwH//EABcRAQADAAAAAAAAAAAAAAAAAAABETH/2gAIAQMBAT8Q1Ss//8QAFhEAAwAAAAAAAAAAAAAAAAAAARAh/9oACAECAQE/EDSf/8QAGxABAQADAQEBAAAAAAAAAAAAAREAITFRQXH/2gAIAQEAAT8QnlojNn4/MQFk9hRx777jIQnJxujdmMrgpzi1i1uf/9k=","aspectRatio":1.5005359056806002,"src":"/static/7c9ee95dd61b5588277447a33ccd293c/3dc2b/code-sunshine.jpg","srcSet":"/static/7c9ee95dd61b5588277447a33ccd293c/f8f18/code-sunshine.jpg 930w,\n/static/7c9ee95dd61b5588277447a33ccd293c/3dc2b/code-sunshine.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"excerpt":"A class is an observable live data that can be used to send events from ViewModel to View in Android MVVM-styled designs.This link…","fields":{"layout":"post","slug":"/using-mockitos-argumentcaptor/"}}},{"node":{"timeToRead":3,"frontmatter":{"title":"How to get your mobile app users to give you ratings and feedback!","date":"2018-10-07T23:10:00.000Z","tags":["Android"],"draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAIAAAA7N+mxAAAACXBIWXMAAAsSAAALEgHS3X78AAABo0lEQVQoz2WRWW/TQBSF/c954kcgJErFA+ob8NBKhCVSaSsEArElJG3tZqkdjz2JZ+zZN+5MWoHEkT26tu935txx5pOcs7D4dAcfqGTHNxcvr8cv8ouPm5kzxqWvUsphGJzbQz7TWncdUUoj1HDOA8gHqfC8ev6rGq26dcso9IQkxhjA4V5Z8qNCYkKxMTaxwfWVRz9jZZzTVps7GEjghVI2JgkZvLLOaM2s0w7Sg4F3itJ+uVJaq3tZaxPcS6X+7lyjGmMshNTa7PtgMMDA6e5RKfAG0zYKN3V19Hnx4Hj26EOeQSsBUQJF+EdwdvsRQGjQiHLS7VqM2waNp7cH5/m7Ocogj4txwRoSG2h9Nh+flRMolIZtIYZkQgyCxyHgMsp7u7eNsA2euTiSSevDT4dPJ6+3QnFtwn/yKYwBCn6VNa7sFmf5qOPbTVd2TCxWj78WTw5/HJwUb98vT0eL0+/t9M3y/KQYf6m+HU1eTdFvqeOxZcqYpr3hXbHZrWtSlttbMeSKXqohJ/11Sy5rcrXaXlUkr/Cs7YtmN8X9mpt4QH8Ad7k0jshkD1kAAAAASUVORK5CYII=","aspectRatio":2.074786324786325,"src":"/static/4d42232e07032296408b0a75d8f9815e/a83d1/zaobao-app-chart1.png","srcSet":"/static/4d42232e07032296408b0a75d8f9815e/4c9af/zaobao-app-chart1.png 930w,\n/static/4d42232e07032296408b0a75d8f9815e/a83d1/zaobao-app-chart1.png 971w","sizes":"(max-width: 971px) 100vw, 971px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"excerpt":"TL;DR Does asking users for feedback and ratings help in your app? Yes!When I joined Singapore Press Holdings in late 2015, most of the apps…","fields":{"layout":"post","slug":"/get-your-app-users-to-give-feedback/"}}},{"node":{"timeToRead":2,"frontmatter":{"title":"Developers Gym by Thoughtworks - 14 July","date":"2018-07-25T14:25:00.000Z","tags":["Meetup","Reviews"],"draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAABAADBf/EABUBAQEAAAAAAAAAAAAAAAAAAAEA/9oADAMBAAIQAxAAAAFBg5F0Ycn/xAAZEAADAQEBAAAAAAAAAAAAAAAAARICAxP/2gAIAQEAAQUC88RpKp2b6Muikj//xAAWEQEBAQAAAAAAAAAAAAAAAAAAARH/2gAIAQMBAT8BZX//xAAWEQEBAQAAAAAAAAAAAAAAAAAAARH/2gAIAQIBAT8BjY//xAAcEAACAgIDAAAAAAAAAAAAAAAAARExAiESQXH/2gAIAQEABj8C5THo1i1otF6KOz//xAAdEAACAgIDAQAAAAAAAAAAAAAAAREhMUFRYYGh/9oACAEBAAE/IXBpbgTKVtySYg6Ki8xM1pmaowl9n//aAAwDAQACAAMAAAAQoA//xAAXEQADAQAAAAAAAAAAAAAAAAAAASFh/9oACAEDAQE/EHVGbn//xAAXEQEBAQEAAAAAAAAAAAAAAAABABFh/9oACAECAQE/EEZqXC//xAAcEAEAAgIDAQAAAAAAAAAAAAABABEhMUFhcVH/2gAIAQEAAT8QGhkCBsvx3AVpM2ixeMzYf0WSkaQrsF8QpXaeLg+ErhYbNDqf/9k=","aspectRatio":1.3333333333333333,"src":"/static/9f96e81e6f6d55da468755a49a4b0666/3dc2b/IMG_8071.jpg","srcSet":"/static/9f96e81e6f6d55da468755a49a4b0666/f8f18/IMG_8071.jpg 930w,\n/static/9f96e81e6f6d55da468755a49a4b0666/3dc2b/IMG_8071.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"excerpt":"This was the second Developers Gym session organized by Thoughtworks, of which we were honoured to play host to. The coding dojo, formulated…","fields":{"layout":"post","slug":"/developers-gym-by-thoughtworks-14-july/"}}},{"node":{"timeToRead":3,"frontmatter":{"title":"Updates to Govtech Agile Practices by Steven Koh - 2 July","date":"2018-07-18T17:50:00.000Z","tags":["Meetup"],"draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAABAACBf/EABYBAQEBAAAAAAAAAAAAAAAAAAIAAf/aAAwDAQACEAMQAAABZzh6OLgyv//EABwQAAIBBQEAAAAAAAAAAAAAAAECAwAREhMxQf/aAAgBAQABBQJtITwRlqbls2eUhv/EABYRAAMAAAAAAAAAAAAAAAAAAAABEf/aAAgBAwEBPwFqkP/EABURAQEAAAAAAAAAAAAAAAAAAAEQ/9oACAECAQE/ARJ//8QAHBAAAgICAwAAAAAAAAAAAAAAAAECESExEiIy/9oACAEBAAY/ApNS0dnxPQ87LTwOj//EABoQAAIDAQEAAAAAAAAAAAAAAAERACExQVH/2gAIAQEAAT8hsI8g5G21q4MYOMQGmoCwNG4Escn/2gAMAwEAAgADAAAAEP8AD//EABYRAAMAAAAAAAAAAAAAAAAAAAEQQf/aAAgBAwEBPxCAr//EABcRAQADAAAAAAAAAAAAAAAAAAABETH/2gAIAQIBAT8Qhat//8QAGhAAAwEBAQEAAAAAAAAAAAAAAREhADFBsf/aAAgBAQABPxBl5yWG8GJujIADqfnNA21SvuiI6OdbA0bJgUoL4MagESyDDd3/2Q==","aspectRatio":1.3333333333333333,"src":"/static/8d8fee52f47c44485daff296b0c76794/3dc2b/meetup-speaker.jpg","srcSet":"/static/8d8fee52f47c44485daff296b0c76794/f8f18/meetup-speaker.jpg 930w,\n/static/8d8fee52f47c44485daff296b0c76794/3dc2b/meetup-speaker.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"excerpt":"It was our great pleasure to have invited Mr Steven Koh, the Deputy Director of Government Digital Services (GDS) at Govtech, to update us…","fields":{"layout":"post","slug":"/updates-to-govtech-agile-practices/"}}},{"node":{"timeToRead":3,"frontmatter":{"title":"AI in News Media","date":"2018-07-12T22:46:00.000Z","tags":[],"draft":false,"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAIEAQP/xAAVAQEBAAAAAAAAAAAAAAAAAAABAv/aAAwDAQACEAMQAAABbnkrNAwn/8QAHBABAAEEAwAAAAAAAAAAAAAAAQACAxESEyEi/9oACAEBAAEFAsLGnvhuTKVL6trr/8QAFxEAAwEAAAAAAAAAAAAAAAAAAAEREv/aAAgBAwEBPwHKIj//xAAXEQEAAwAAAAAAAAAAAAAAAAAAAREh/9oACAECAQE/Ablr/8QAGhAAAgIDAAAAAAAAAAAAAAAAABABITEy8P/aAAgBAQAGPwJayV1rJ//EABsQAAMAAgMAAAAAAAAAAAAAAAABESExQWGB/9oACAEBAAE/IaHM9j2KZRS6mkHc3sbyZ+n/2gAMAwEAAgADAAAAEJvf/8QAFhEBAQEAAAAAAAAAAAAAAAAAABFB/9oACAEDAQE/EHHH/8QAFxEAAwEAAAAAAAAAAAAAAAAAAAERQf/aAAgBAgEBPxBFX0//xAAdEAEBAAMAAgMAAAAAAAAAAAABEQAhMUFRYXGh/9oACAEBAAE/EI4MDolZ4mCAJTthy4toHwXFAiuj0y/hiQMnbf3nFcwq5DP/2Q==","aspectRatio":1.8741633199464525,"src":"/static/9bea42284114acb5ba9e14a5fe42867c/3dc2b/INMANews-ArtificialIntelligence-1800.jpg","srcSet":"/static/9bea42284114acb5ba9e14a5fe42867c/f8f18/INMANews-ArtificialIntelligence-1800.jpg 930w,\n/static/9bea42284114acb5ba9e14a5fe42867c/3dc2b/INMANews-ArtificialIntelligence-1800.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"excerpt":"IntroductionNews media companies like Singapore Press Holdings (SPH) continue to be faced with rapidly accelerating technology innovation…","fields":{"layout":"post","slug":"/ai-in-news-media/"}}},{"node":{"timeToRead":3,"frontmatter":{"title":"Video Review - Carousell Level-Up: Applying Scrum for Better Delivery","date":"2018-02-05T07:53:00.000Z","tags":["Review","Meetup"],"draft":null,"image":{"childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAA7DAAAOwwHHb6hkAAACqklEQVQozwGfAmD9ADEVFzklJjolJzceITslJTchIjwpLDolKDglJTYhITsmJj4qKzkiJDspKTYoKDYpKiwaG0AyMj8xMi4ZGgCoNTmrQkWqOD2pPEGpOT2pLDGqMziqLzSoJiqpJSmqJyurKCypIyirLjKbTEt8KCpoHSBvLTFzLTF2LTEAyzQ5zUVJzT9DzDxAzD9FzUZKykNIy0JHyjo/yTk+yjo/yjtAyztAzDpB0IJ+u25rpVZYmFRVo2ZnrHV1ANZCR9x2edhqbthcYNpqbdltcdlhZdtobNtobNtgZN1nbNliZthtcdZPVNx1adJXSsKIfqFoYq9ER6xERwDXR0vXaGzXa2/YaW3XZWrbfH/Yf4PajI/Yd3vGaWzGZ2rXcHTagITabXLcVkPROCaUW0+KQz+4Hh+tIyYA1UNH12dq1mNo2Gxx2Wxw8sXH56+x4pOVyIaJXFVVTUpKyIqL99LS6KWn3U89WiUnFR4vISxFWx0ovjk3ANMyN9M4PdI3PdM6P9M5PtI5PtI8QtU4PswrMZ8qL5kpLcstMtUrMdc+QthdTFFESi4zQh0nNltDRcJHRwDSNTrURkvURkrUS07TTVHURUnUSEzTQUbUOD7bPUPaO0HTLTPSJCvVQkXaXEmadXBEPj5HPjypamLAS00A0Ds/z0ZLzzxB0D1CzTg8zzY6zjpAz0FFzUFGzkRJz0NJzjQ6zyYr0kdK20k4Xx8gAAQPBAcNdRAUwU1PAOM5P+FITuNMUuNQVeJFTOI8QuIzOeJCR+JVWuRaX+NVWuNCSOMqMOZNUdhFPolxdUhpcUZpcY07QMpOUQCLGx+LHCCKIiaKIiWKJCeLIyeLHSGLHCGLIiaLIyeJISWKHCCKHCCLKCyJOjx+TE5vTlFsVlp0REaBQEJqGgpHmAn0+wAAAABJRU5ErkJggg==","aspectRatio":1.7793696275071633,"src":"/static/dbb7bd9058838337f25ad9090b348997/748f9/scrum-video-intro.png","srcSet":"/static/dbb7bd9058838337f25ad9090b348997/748f9/scrum-video-intro.png 621w","sizes":"(max-width: 621px) 100vw, 621px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png"}}]}}},"excerpt":"Hi all! It has been a while since some of us have gone for the Scrum training by Mr Stuart, building balloon animal zoos to learn what is…","fields":{"layout":"post","slug":"/video-review-carousell-level-up/"}}}]}},"pageContext":{"isCreatedByStatefulCreatePages":true}}} \ No newline at end of file diff --git a/page-data/revitalizing-our-engineering/page-data.json b/page-data/revitalizing-our-engineering/page-data.json index 98ad203..3f23dc2 100644 --- a/page-data/revitalizing-our-engineering/page-data.json +++ b/page-data/revitalizing-our-engineering/page-data.json @@ -1 +1 @@ -{"componentChunkName":"component---src-templates-post-tsx","path":"/revitalizing-our-engineering/","webpackCompilationHash":"e6542130e6dfe73197bb","result":{"data":{"logo":{"childImageSharp":{"fixed":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsSAAALEgHS3X78AAABFUlEQVQY023PvUrDUBTA8ZuCtoMoOLQ4dWhN14x2kEKXFkGoohQ/QBexOHRycAidKkgHHRq69APRoTjFJYODIA6+gSBYfYMmfYLE/5VT6NALP845NyeHc9UoCHZRQvonCLKKE4ZhAXYURTsYoE9dIy5iCzfUJnEdV+RF4iu6ikFH2EPxazzOcJmg4Rnn5C8ysIEOHqTe5/sT3qXOwYOtRr5/wLAqzpCTDXu4p2ETtyjgGJ/cX+se8jeU9fa4RBt5vWENpjzdkoGPcGg4RQsbOMEFmnBRRwVDHEK/yFXfvr/CoPjvZLKcdByDyzWGeajigzorGy0oOeRJiUtITe/pX1XzDk3buIMltSFR/zTtic3060X+8z8PsEUt8G3LVQAAAABJRU5ErkJggg==","width":400,"height":128,"src":"/static/2b5eaa0de166a8b5faebad4955c2200c/647de/ghost-logo.png","srcSet":"/static/2b5eaa0de166a8b5faebad4955c2200c/647de/ghost-logo.png 1x"}}},"markdownRemark":{"html":"

We developed a News Tablet application for the Samsung Knox recently, and we are able to institute the various good engineering practices into our workflow process. Read on to find out more!

\n
\n

For quite some time now, we have visited Govtech who showed us their engineering quarters, and we have attended conferences, and read articles which advocated good engineering practices. While we do agree and recognize its benefits, adopting them require much time, resources and proper planning.

\n

It is with the recent development of the News Tablet application for the Samsung Knox, that we are able to institute the various good engineering practices into our engineering workflow.

\n

As a quick introduction, the News Tablet application is a collaboration between SPH and Samsung, to produce a mobile application exclusively for the Samsung Knox, that allows users to read the various SPH publications’ e-paper on the device.

\n

Our engineering workflow

\n

\n \n \n \n \n \n \n
An example of new codes that have failed linting from the Bitrise dashboard.
\n

\n

\n \n \n \n \n \n \n
The linter would point out which parts of the codes failed, along with suggestions on how to correct it.
\n

\n

Unit Testing

\n

We remember when we were tackling long story problem sums, where each statement would entail us drawing some model diagram and doing some math calculation: while we have generally used the correct steps in solving the problem, we were waylaid by a careless mistake in our calculation in one of the steps (e.g. forgot to include the remainder of a long division), that led to an incorrect final answer. Our teachers would always sigh and remind us to always “check our answers again”.

\n

Unit tests, in this sense, help us to be sure that our individual problem solving steps always give us the correct and expected answers. We would also wish to highlight that unit tests zooms in on the smaller (or even smallest) units of our code base, essentially testing the individual functions by itself. Hence, when one of us writes new codes, the new codes should have accompanying unit tests to prove its integrity.

\n

\n \n \n \n \n \n \n
An example of “happy path” (i.e. default scenario with no exception or error conditions) test case, which verifies that the intended functionality works.
\n

\n

\n \n \n \n \n \n

\n

During the initial phase when we were starting out with the project, we only covered 19% of our codes with unit tests. With our workflow in place, our tests coverage grew steadily to 41% after 3 months! Seeing the chart line ascending is very encouraging.

\n

\n \n \n \n \n \n

An example of new codes that have failed linting from the Bitrise dashboard.
\n

\n

\n \n \n \n \n \n \n
The linter would point out which parts of the codes failed, along with suggestions on how to correct it.
\n

\n

Unit Testing

\n

We remember when we were tackling long story problem sums, where each statement would entail us drawing some model diagram and doing some math calculation: while we have generally used the correct steps in solving the problem, we were waylaid by a careless mistake in our calculation in one of the steps (e.g. forgot to include the remainder of a long division), that led to an incorrect final answer. Our teachers would always sigh and remind us to always “check our answers again”.

\n

Unit tests, in this sense, help us to be sure that our individual problem solving steps always give us the correct and expected answers. We would also wish to highlight that unit tests zooms in on the smaller (or even smallest) units of our code base, essentially testing the individual functions by itself. Hence, when one of us writes new codes, the new codes should have accompanying unit tests to prove its integrity.

\n

\n \n \n \n \n \n \n
An example of “happy path” (i.e. default scenario with no exception or error conditions) test case, which verifies that the intended functionality works.
\n

\n

\n \n \n \n \n \n

\n

During the initial phase when we were starting out with the project, we only covered 19% of our codes with unit tests. With our workflow in place, our tests coverage grew steadily to 41% after 3 months! Seeing the chart line ascending is very encouraging.

\n

\n \n On the 21st of November, SPH staff gathered for a cozy SPHTech Meetup session at The Inspiration Hub to learn about Data Privacy efforts in Singapore.

\n

Professor Anthony Tung, Associate Professor at National University of Singapore (School of Computing), shared insights on moving “towards a Privacy-Aware Smart Nation”. During the session, Prof Tung introduced the newly developed N-CRiPT (NUS Centre for Research in Privacy Technologies) which aims to develop privacy-preserving technologies to protect identities and sensitive data with greater focus on unstructured data throughout the data life cycle.

\n

N-CRiPT is a crucial step for Singapore as R&D in developing privacy-protecting systems in tandem with technology advancement will help to ensure sustained growth in moving forward as a Smart Nation. Prof Tung also shared about the prevalence of the risks involved in the world of big data we live in today, leaving a lasting impression on those present at the meetup.

\n

This meetup session is just one of many planned by SPHTech to promote a spirit of innovation and digitisation to improve our efficiency and effectiveness in the way we work. Do look out more more sessions to come!

","htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"On the 21st of November, SPH staff gathered for a cozy SPHTech Meetup session at The Inspiration Hub to learn about Data Privacy efforts in Singapore."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Professor Anthony Tung, Associate Professor at National University of Singapore (School of Computing), shared insights on moving “towards a Privacy-Aware Smart Nation”. During the session, Prof Tung introduced the newly developed N-CRiPT (NUS Centre for Research in Privacy Technologies) which aims to develop privacy-preserving technologies to protect identities and sensitive data with greater focus on unstructured data throughout the data life cycle."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"N-CRiPT is a crucial step for Singapore as R&D in developing privacy-protecting systems in tandem with technology advancement will help to ensure sustained growth in moving forward as a Smart Nation. Prof Tung also shared about the prevalence of the risks involved in the world of big data we live in today, leaving a lasting impression on those present at the meetup."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"This meetup session is just one of many planned by SPHTech to promote a spirit of innovation and digitisation to improve our efficiency and effectiveness in the way we work. Do look out more more sessions to come!"}]}],"data":{"quirksMode":false}},"excerpt":"On the 21st of November, SPH staff gathered for a cozy SPHTech Meetup session at The Inspiration Hub to learn about Data Privacy efforts in…","timeToRead":1,"frontmatter":{"title":"Towards a Privacy Aware Smart Nation","userDate":"29 November 2018","date":"2018-11-29T12:43:00.000Z","tags":["Meetup","Review"],"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAJABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAEFAgT/xAAVAQEBAAAAAAAAAAAAAAAAAAABAv/aAAwDAQACEAMQAAAB053bCyYWf//EABsQAQEAAQUAAAAAAAAAAAAAAAECAAMEETFD/9oACAEBAAEFAm5ETmN0SanXkZ//xAAWEQADAAAAAAAAAAAAAAAAAAACEBP/2gAIAQMBAT8BmK//xAAWEQADAAAAAAAAAAAAAAAAAAABEBL/2gAIAQIBAT8Bsr//xAAdEAACAgEFAAAAAAAAAAAAAAAAAQIRIgMhMVFx/9oACAEBAAY/AlhsPC1dIpx46IGmP0//xAAZEAEBAQEBAQAAAAAAAAAAAAABABExkaH/2gAIAQEAAT8h5JXdYTvtDIM+p9zM9V//2gAMAwEAAgADAAAAED/v/8QAFxEBAQEBAAAAAAAAAAAAAAAAAQAhEf/aAAgBAwEBPxBDebDf/8QAFxEBAQEBAAAAAAAAAAAAAAAAAQAhYf/aAAgBAgEBPxDE7Jf/xAAeEAEAAQMFAQAAAAAAAAAAAAABABEhMRBBUZGhsf/aAAgBAQABPxByuAIDK1Q3gs3CANhxD6tQMee610h6X4z3J//Z","aspectRatio":2.130492676431425,"src":"/static/ef473fd608a488e0579a6ab7fe528337/989b1/sphtech-meetup-ncript.jpg","srcSet":"/static/ef473fd608a488e0579a6ab7fe528337/f8f18/sphtech-meetup-ncript.jpg 930w,\n/static/ef473fd608a488e0579a6ab7fe528337/989b1/sphtech-meetup-ncript.jpg 1600w","sizes":"(max-width: 1600px) 100vw, 1600px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAADQElEQVQ4y5VUW0tUURSeX9BDhFZQ1Nx0lCAqI+o1KMiHoqjIesisXiLSQOhiRUWUdKEwKqKHtNIyJLuY0UWS0lBKM8mcrEadcnIc58zlzMyZvc/+WjNnRs+xIWjDd9a+fudba6+1TaAmhEDaCqESONItOZewCUitgK8JIu7TxrQXqbV0M00lSzd1LAgRiU5u/3oAaJ0NQcC7RYC/LXWOJz6ThHoVyX74GynpRKTuLZjTo815SNWzbIjuEsD7EqJjHUT7KoNnBoVpZer3G+DN+eBNNvD2Egh5BCLqAW9ZCf7YDBF0agTjXbRnAbkezESYikPIBfYgH+y+BawhD6x+LtjDAsJSxOutiN+zgPechWAyeNs+sNZiXagyEKq+Xig1dii386DcyiU4oFRbodwk1CT6dq1fnQv2vJiUj6cIVYNKk55dadyC6PnpiF3LRfRqziSu2Ak0d9mC2I0C6JtQVYNSk+Evsg9K035EKs2InLUhci6HrD0F6ldaEbmwEKz7HrjrHamUpqg0pM1kyrD3dxE+Ykb4mB3ho2nYaI5shQXhg3MRPmyGfGY5+OCHlFKuv+UUKY8nLR/8iFCZBaH9VoKN+glr11BK41KyZTkI7poBuaook8vCcFvypRIEts1EYLcdgRILAjttkLbOhlQ0C4EdiXEOrTlozxyEjhQaLsY0Nbjq7yE67IC00Qxps5VAZOvJxeNbET61HdKG+fCvyYK/MBv+1TMQa66ZcDkjIf/los02OmSBf62DDs2DtGkxVZCWxKy/G5HrZ+gHe6G8eWqoeWPp6SpGPl0O74JpGFuSBR/ZaHWVdiiuxTjW0o/QxeY0laEEDZeiksoEJYvTjTXeQfRkOeSG2mQ+CJ0XzOVBvGtgwk09x4TLqhCGhP1EKTaeXsO/21+PA1e1iVfOMRx94iT048SjPuyp68GL3l+Aux/MMwTuHqAS9UClOKveEaijbkpu+e/SYynC2x1uZB16gWXn2zA8JqO2043d9X2AxwnF/R3scwf4QE+SlH/rBet6TS/Q+NRLERPuDoyGUUHqVlxox6svXri8Mtp+kO+RAFQ5RCk1nCRQRwbpdZI0KNHMj4M+hr0/g8YY/UcM/wD4fYcC4gOWgAAAAABJRU5ErkJggg==","width":400,"height":400,"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png","srcSet":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png 1x,\n/static/7fa6bee9d2080bd021828c70f67a4720/fca9c/sphtech.png 1.5x"}}]}}}},"relatedPosts":{"totalCount":4,"edges":[{"node":{"id":"8865d4be-7fa3-5582-9991-55bc98517819","timeToRead":2,"excerpt":"This was the second Developers Gym session organized by Thoughtworks, of which we were honoured to play host to. The coding dojo, formulated…","frontmatter":{"title":"Developers Gym by Thoughtworks - 14 July"},"fields":{"slug":"/developers-gym-by-thoughtworks-14-july/"}}},{"node":{"id":"8d28738e-5a45-5b0a-ab5d-f4bd55529568","timeToRead":1,"excerpt":"On the 21st of November, SPH staff gathered for a cozy SPHTech Meetup session at The Inspiration Hub to learn about Data Privacy efforts in…","frontmatter":{"title":"Towards a Privacy Aware Smart Nation"},"fields":{"slug":"/towards-a-privacy-aware-smart-nation/"}}},{"node":{"id":"1ee10358-b30a-5691-b583-a3aaec6a020b","timeToRead":3,"excerpt":"It was our great pleasure to have invited Mr Steven Koh, the Deputy Director of Government Digital Services (GDS) at Govtech, to update us…","frontmatter":{"title":"Updates to Govtech Agile Practices by Steven Koh - 2 July"},"fields":{"slug":"/updates-to-govtech-agile-practices/"}}}]}},"pageContext":{"isCreatedByStatefulCreatePages":false,"slug":"/towards-a-privacy-aware-smart-nation/","prev":{"excerpt":"Containerization has been one of the most talk about topics in the digital world. It enabled a whole new paradigm shift in getting software…","timeToRead":2,"frontmatter":{"title":"Docker workshop in SPH","tags":["Docker"],"date":"2018-11-27T11:06:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"aspectRatio":1.3333333333333333,"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAQBAgMF/8QAFgEBAQEAAAAAAAAAAAAAAAAAAQAC/9oADAMBAAIQAxAAAAHSOfXC0Lkf/8QAGBABAAMBAAAAAAAAAAAAAAAAAgABEhH/2gAIAQEAAQUCOLjJ5m4moTbOan//xAAWEQEBAQAAAAAAAAAAAAAAAAAAARL/2gAIAQMBAT8BZr//xAAXEQEAAwAAAAAAAAAAAAAAAAAAARIh/9oACAECAQE/AcWh/8QAGxAAAgIDAQAAAAAAAAAAAAAAAAERIQIiMkH/2gAIAQEABj8Ci5Nc0zpFPwtwdM//xAAbEAEBAQADAQEAAAAAAAAAAAABEQAhMUFx4f/aAAgBAQABPyEl3QNMM0vR81rOLjQlC9jIEfoufyN//9oADAMBAAIAAwAAABCAL//EABgRAAIDAAAAAAAAAAAAAAAAAAABESFh/9oACAEDAQE/EIbpGh//xAAYEQACAwAAAAAAAAAAAAAAAAAAAREhYf/aAAgBAgEBPxCUVmJ//8QAGxABAQACAwEAAAAAAAAAAAAAAREAITFBUWH/2gAIAQEAAT8QbJCQCVvU+YydZkj3BMNVBNOVRsBAXfyZuoUFFzxTBMS8DH//2Q==","sizes":"(max-width: 1400px) 100vw, 1400px","src":"/static/67c833d51f70a35acd4074e27a1b9a26/3dc2b/IMG_9175-1.jpg","srcSet":"/static/67c833d51f70a35acd4074e27a1b9a26/f8f18/IMG_9175-1.jpg 930w,\n/static/67c833d51f70a35acd4074e27a1b9a26/3dc2b/IMG_9175-1.jpg 1400w"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/b4a08/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/docker-workshop-in-sph/"}},"next":{"excerpt":"Rod Michael, director of global market access strategy and channels at Rockwell Automation, famously said, “If you automate a mess, you get…","timeToRead":3,"frontmatter":{"title":"The developer's role in a successful implementation of the test automation","tags":["Testing"],"date":"2018-12-06T12:54:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"aspectRatio":1.8252933507170794,"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAACiElEQVQoz02SS0hUURjHZ9WqoE0RbcJFRUWBROuKCKqNFY1iD2yRo5ELicqoSBOMMGSsQHpDlBbVooYwhKgcSU3thUo048C0cJh7ve9zn/P6950zjnThz3fvuYff9z//74TiI8OIj05ibHwKo6RP8XGMTXxHOpXE1+kkfqVlqHIWiqKSFKTTaczNzQklEgkkk0mkUqklhTbuasaKzbVYs/0EVlUfR2jtfhxoaEcxn4PvewBKKJVKKBaLQvydK5fLgTEGx3FQKBTEGq+hzt7nONP+EFd7X+BC9zO0XHuEewNDCJiFwPXhuR5c10U+n18C88q/+eP7vnBuGIZYCyX//MTv2UnMzEwiMTuBv4kfkDJp6AsKtKwMXWVQNQOKpoPZtnD2P5A7nJ+fhyRJ4l/o8/t+vOmP4nqkBq9vX8bgqz5MfRkC002YBLUtBw45ZbYDj9xUnFbA3H0mk4Esy2WHE8Mx3L/VgTtnG/Gg6xJiL+9i+lscjmHCok2MjhO4ATzPg20zAeJPxSEHZrNZcWwBHPswgG1b1qGtO4qGxiZEz9cjNTuCIMjDWliAKcmwDQqfHDJmE9gX4VfAvBF3p6pqGXix4ylWb2jGjr1dqN7diaqtrejti5UDp4EwgtrU3WeOGJBDLoPFo1fEG/BhiSnvPBLDsqpBLF//Fis3vaNrE8PJcx8JVyQXBWiKBkXiU3RhMA+qacOiTHO5vJhwEJTj4FU4bOt6gnCkB/WnexBuuoGDdVcQvflYOORddUWHSkBdc6AaDiSauEbQ3GKG/OimaVK+ttgfikROoa72EI4dDSMcrsHhfXtwpbUFLmVl08U1KB9DlmCqOgxdJ7BKVRMQy7KE+B3kw+HQf+uQ+eTE1QltAAAAAElFTkSuQmCC","sizes":"(max-width: 1400px) 100vw, 1400px","src":"/static/131b22d7fad4398f72deddd43464e6a3/cd9a9/blog-test-automation.png","srcSet":"/static/131b22d7fad4398f72deddd43464e6a3/4c9af/blog-test-automation.png 930w,\n/static/131b22d7fad4398f72deddd43464e6a3/cd9a9/blog-test-automation.png 1400w"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/b4a08/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/developers-role-in-test-automation/"}},"primaryTag":"Meetup"}}} \ No newline at end of file +{"componentChunkName":"component---src-templates-post-tsx","path":"/towards-a-privacy-aware-smart-nation/","webpackCompilationHash":"4d127609ee78b8f0aee7","result":{"data":{"logo":{"childImageSharp":{"fixed":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsSAAALEgHS3X78AAABFUlEQVQY023PvUrDUBTA8ZuCtoMoOLQ4dWhN14x2kEKXFkGoohQ/QBexOHRycAidKkgHHRq69APRoTjFJYODIA6+gSBYfYMmfYLE/5VT6NALP845NyeHc9UoCHZRQvonCLKKE4ZhAXYURTsYoE9dIy5iCzfUJnEdV+RF4iu6ikFH2EPxazzOcJmg4Rnn5C8ysIEOHqTe5/sT3qXOwYOtRr5/wLAqzpCTDXu4p2ETtyjgGJ/cX+se8jeU9fa4RBt5vWENpjzdkoGPcGg4RQsbOMEFmnBRRwVDHEK/yFXfvr/CoPjvZLKcdByDyzWGeajigzorGy0oOeRJiUtITe/pX1XzDk3buIMltSFR/zTtic3060X+8z8PsEUt8G3LVQAAAABJRU5ErkJggg==","width":400,"height":128,"src":"/static/2b5eaa0de166a8b5faebad4955c2200c/647de/ghost-logo.png","srcSet":"/static/2b5eaa0de166a8b5faebad4955c2200c/647de/ghost-logo.png 1x"}}},"markdownRemark":{"html":"

On the 21st of November, SPH staff gathered for a cozy SPHTech Meetup session at The Inspiration Hub to learn about Data Privacy efforts in Singapore.

\n

Professor Anthony Tung, Associate Professor at National University of Singapore (School of Computing), shared insights on moving “towards a Privacy-Aware Smart Nation”. During the session, Prof Tung introduced the newly developed N-CRiPT (NUS Centre for Research in Privacy Technologies) which aims to develop privacy-preserving technologies to protect identities and sensitive data with greater focus on unstructured data throughout the data life cycle.

\n

N-CRiPT is a crucial step for Singapore as R&D in developing privacy-protecting systems in tandem with technology advancement will help to ensure sustained growth in moving forward as a Smart Nation. Prof Tung also shared about the prevalence of the risks involved in the world of big data we live in today, leaving a lasting impression on those present at the meetup.

\n

This meetup session is just one of many planned by SPHTech to promote a spirit of innovation and digitisation to improve our efficiency and effectiveness in the way we work. Do look out more more sessions to come!

","htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"On the 21st of November, SPH staff gathered for a cozy SPHTech Meetup session at The Inspiration Hub to learn about Data Privacy efforts in Singapore."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Professor Anthony Tung, Associate Professor at National University of Singapore (School of Computing), shared insights on moving “towards a Privacy-Aware Smart Nation”. During the session, Prof Tung introduced the newly developed N-CRiPT (NUS Centre for Research in Privacy Technologies) which aims to develop privacy-preserving technologies to protect identities and sensitive data with greater focus on unstructured data throughout the data life cycle."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"N-CRiPT is a crucial step for Singapore as R&D in developing privacy-protecting systems in tandem with technology advancement will help to ensure sustained growth in moving forward as a Smart Nation. Prof Tung also shared about the prevalence of the risks involved in the world of big data we live in today, leaving a lasting impression on those present at the meetup."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"This meetup session is just one of many planned by SPHTech to promote a spirit of innovation and digitisation to improve our efficiency and effectiveness in the way we work. Do look out more more sessions to come!"}]}],"data":{"quirksMode":false}},"excerpt":"On the 21st of November, SPH staff gathered for a cozy SPHTech Meetup session at The Inspiration Hub to learn about Data Privacy efforts in…","timeToRead":1,"frontmatter":{"title":"Towards a Privacy Aware Smart Nation","userDate":"29 November 2018","date":"2018-11-29T12:43:00.000Z","tags":["Meetup","Review"],"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAJABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAEFAgT/xAAVAQEBAAAAAAAAAAAAAAAAAAABAv/aAAwDAQACEAMQAAAB053bCyYWf//EABsQAQEAAQUAAAAAAAAAAAAAAAECAAMEETFD/9oACAEBAAEFAm5ETmN0SanXkZ//xAAWEQADAAAAAAAAAAAAAAAAAAACEBP/2gAIAQMBAT8BmK//xAAWEQADAAAAAAAAAAAAAAAAAAABEBL/2gAIAQIBAT8Bsr//xAAdEAACAgEFAAAAAAAAAAAAAAAAAQIRIgMhMVFx/9oACAEBAAY/AlhsPC1dIpx46IGmP0//xAAZEAEBAQEBAQAAAAAAAAAAAAABABExkaH/2gAIAQEAAT8h5JXdYTvtDIM+p9zM9V//2gAMAwEAAgADAAAAED/v/8QAFxEBAQEBAAAAAAAAAAAAAAAAAQAhEf/aAAgBAwEBPxBDebDf/8QAFxEBAQEBAAAAAAAAAAAAAAAAAQAhYf/aAAgBAgEBPxDE7Jf/xAAeEAEAAQMFAQAAAAAAAAAAAAABABEhMRBBUZGhsf/aAAgBAQABPxByuAIDK1Q3gs3CANhxD6tQMee610h6X4z3J//Z","aspectRatio":2.130492676431425,"src":"/static/ef473fd608a488e0579a6ab7fe528337/989b1/sphtech-meetup-ncript.jpg","srcSet":"/static/ef473fd608a488e0579a6ab7fe528337/f8f18/sphtech-meetup-ncript.jpg 930w,\n/static/ef473fd608a488e0579a6ab7fe528337/989b1/sphtech-meetup-ncript.jpg 1600w","sizes":"(max-width: 1600px) 100vw, 1600px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAADQElEQVQ4y5VUW0tUURSeX9BDhFZQ1Nx0lCAqI+o1KMiHoqjIesisXiLSQOhiRUWUdKEwKqKHtNIyJLuY0UWS0lBKM8mcrEadcnIc58zlzMyZvc/+WjNnRs+xIWjDd9a+fudba6+1TaAmhEDaCqESONItOZewCUitgK8JIu7TxrQXqbV0M00lSzd1LAgRiU5u/3oAaJ0NQcC7RYC/LXWOJz6ThHoVyX74GynpRKTuLZjTo815SNWzbIjuEsD7EqJjHUT7KoNnBoVpZer3G+DN+eBNNvD2Egh5BCLqAW9ZCf7YDBF0agTjXbRnAbkezESYikPIBfYgH+y+BawhD6x+LtjDAsJSxOutiN+zgPechWAyeNs+sNZiXagyEKq+Xig1dii386DcyiU4oFRbodwk1CT6dq1fnQv2vJiUj6cIVYNKk55dadyC6PnpiF3LRfRqziSu2Ak0d9mC2I0C6JtQVYNSk+Evsg9K035EKs2InLUhci6HrD0F6ldaEbmwEKz7HrjrHamUpqg0pM1kyrD3dxE+Ykb4mB3ho2nYaI5shQXhg3MRPmyGfGY5+OCHlFKuv+UUKY8nLR/8iFCZBaH9VoKN+glr11BK41KyZTkI7poBuaook8vCcFvypRIEts1EYLcdgRILAjttkLbOhlQ0C4EdiXEOrTlozxyEjhQaLsY0Nbjq7yE67IC00Qxps5VAZOvJxeNbET61HdKG+fCvyYK/MBv+1TMQa66ZcDkjIf/los02OmSBf62DDs2DtGkxVZCWxKy/G5HrZ+gHe6G8eWqoeWPp6SpGPl0O74JpGFuSBR/ZaHWVdiiuxTjW0o/QxeY0laEEDZeiksoEJYvTjTXeQfRkOeSG2mQ+CJ0XzOVBvGtgwk09x4TLqhCGhP1EKTaeXsO/21+PA1e1iVfOMRx94iT048SjPuyp68GL3l+Aux/MMwTuHqAS9UClOKveEaijbkpu+e/SYynC2x1uZB16gWXn2zA8JqO2043d9X2AxwnF/R3scwf4QE+SlH/rBet6TS/Q+NRLERPuDoyGUUHqVlxox6svXri8Mtp+kO+RAFQ5RCk1nCRQRwbpdZI0KNHMj4M+hr0/g8YY/UcM/wD4fYcC4gOWgAAAAABJRU5ErkJggg==","width":400,"height":400,"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png","srcSet":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png 1x,\n/static/7fa6bee9d2080bd021828c70f67a4720/fca9c/sphtech.png 1.5x"}}]}}}},"relatedPosts":{"totalCount":4,"edges":[{"node":{"id":"8865d4be-7fa3-5582-9991-55bc98517819","timeToRead":2,"excerpt":"This was the second Developers Gym session organized by Thoughtworks, of which we were honoured to play host to. The coding dojo, formulated…","frontmatter":{"title":"Developers Gym by Thoughtworks - 14 July"},"fields":{"slug":"/developers-gym-by-thoughtworks-14-july/"}}},{"node":{"id":"8d28738e-5a45-5b0a-ab5d-f4bd55529568","timeToRead":1,"excerpt":"On the 21st of November, SPH staff gathered for a cozy SPHTech Meetup session at The Inspiration Hub to learn about Data Privacy efforts in…","frontmatter":{"title":"Towards a Privacy Aware Smart Nation"},"fields":{"slug":"/towards-a-privacy-aware-smart-nation/"}}},{"node":{"id":"1ee10358-b30a-5691-b583-a3aaec6a020b","timeToRead":3,"excerpt":"It was our great pleasure to have invited Mr Steven Koh, the Deputy Director of Government Digital Services (GDS) at Govtech, to update us…","frontmatter":{"title":"Updates to Govtech Agile Practices by Steven Koh - 2 July"},"fields":{"slug":"/updates-to-govtech-agile-practices/"}}}]}},"pageContext":{"isCreatedByStatefulCreatePages":false,"slug":"/towards-a-privacy-aware-smart-nation/","prev":{"excerpt":"Containerization has been one of the most talk about topics in the digital world. It enabled a whole new paradigm shift in getting software…","timeToRead":2,"frontmatter":{"title":"Docker workshop in SPH","tags":["Docker"],"date":"2018-11-27T11:06:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"aspectRatio":1.3333333333333333,"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAQBAgMF/8QAFgEBAQEAAAAAAAAAAAAAAAAAAQAC/9oADAMBAAIQAxAAAAHSOfXC0Lkf/8QAGBABAAMBAAAAAAAAAAAAAAAAAgABEhH/2gAIAQEAAQUCOLjJ5m4moTbOan//xAAWEQEBAQAAAAAAAAAAAAAAAAAAARL/2gAIAQMBAT8BZr//xAAXEQEAAwAAAAAAAAAAAAAAAAAAARIh/9oACAECAQE/AcWh/8QAGxAAAgIDAQAAAAAAAAAAAAAAAAERIQIiMkH/2gAIAQEABj8Ci5Nc0zpFPwtwdM//xAAbEAEBAQADAQEAAAAAAAAAAAABEQAhMUFx4f/aAAgBAQABPyEl3QNMM0vR81rOLjQlC9jIEfoufyN//9oADAMBAAIAAwAAABCAL//EABgRAAIDAAAAAAAAAAAAAAAAAAABESFh/9oACAEDAQE/EIbpGh//xAAYEQACAwAAAAAAAAAAAAAAAAAAAREhYf/aAAgBAgEBPxCUVmJ//8QAGxABAQACAwEAAAAAAAAAAAAAAREAITFBUWH/2gAIAQEAAT8QbJCQCVvU+YydZkj3BMNVBNOVRsBAXfyZuoUFFzxTBMS8DH//2Q==","sizes":"(max-width: 1400px) 100vw, 1400px","src":"/static/67c833d51f70a35acd4074e27a1b9a26/3dc2b/IMG_9175-1.jpg","srcSet":"/static/67c833d51f70a35acd4074e27a1b9a26/f8f18/IMG_9175-1.jpg 930w,\n/static/67c833d51f70a35acd4074e27a1b9a26/3dc2b/IMG_9175-1.jpg 1400w"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/b4a08/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/docker-workshop-in-sph/"}},"next":{"excerpt":"Rod Michael, director of global market access strategy and channels at Rockwell Automation, famously said, “If you automate a mess, you get…","timeToRead":3,"frontmatter":{"title":"The developer's role in a successful implementation of the test automation","tags":["Testing"],"date":"2018-12-06T12:54:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"aspectRatio":1.8252933507170794,"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAACiElEQVQoz02SS0hUURjHZ9WqoE0RbcJFRUWBROuKCKqNFY1iD2yRo5ELicqoSBOMMGSsQHpDlBbVooYwhKgcSU3thUo048C0cJh7ve9zn/P6950zjnThz3fvuYff9z//74TiI8OIj05ibHwKo6RP8XGMTXxHOpXE1+kkfqVlqHIWiqKSFKTTaczNzQklEgkkk0mkUqklhTbuasaKzbVYs/0EVlUfR2jtfhxoaEcxn4PvewBKKJVKKBaLQvydK5fLgTEGx3FQKBTEGq+hzt7nONP+EFd7X+BC9zO0XHuEewNDCJiFwPXhuR5c10U+n18C88q/+eP7vnBuGIZYCyX//MTv2UnMzEwiMTuBv4kfkDJp6AsKtKwMXWVQNQOKpoPZtnD2P5A7nJ+fhyRJ4l/o8/t+vOmP4nqkBq9vX8bgqz5MfRkC002YBLUtBw45ZbYDj9xUnFbA3H0mk4Esy2WHE8Mx3L/VgTtnG/Gg6xJiL+9i+lscjmHCok2MjhO4ATzPg20zAeJPxSEHZrNZcWwBHPswgG1b1qGtO4qGxiZEz9cjNTuCIMjDWliAKcmwDQqfHDJmE9gX4VfAvBF3p6pqGXix4ylWb2jGjr1dqN7diaqtrejti5UDp4EwgtrU3WeOGJBDLoPFo1fEG/BhiSnvPBLDsqpBLF//Fis3vaNrE8PJcx8JVyQXBWiKBkXiU3RhMA+qacOiTHO5vJhwEJTj4FU4bOt6gnCkB/WnexBuuoGDdVcQvflYOORddUWHSkBdc6AaDiSauEbQ3GKG/OimaVK+ttgfikROoa72EI4dDSMcrsHhfXtwpbUFLmVl08U1KB9DlmCqOgxdJ7BKVRMQy7KE+B3kw+HQf+uQ+eTE1QltAAAAAElFTkSuQmCC","sizes":"(max-width: 1400px) 100vw, 1400px","src":"/static/131b22d7fad4398f72deddd43464e6a3/cd9a9/blog-test-automation.png","srcSet":"/static/131b22d7fad4398f72deddd43464e6a3/4c9af/blog-test-automation.png 930w,\n/static/131b22d7fad4398f72deddd43464e6a3/cd9a9/blog-test-automation.png 1400w"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/b4a08/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/developers-role-in-test-automation/"}},"primaryTag":"Meetup"}}} \ No newline at end of file diff --git a/page-data/updates-to-govtech-agile-practices/page-data.json b/page-data/updates-to-govtech-agile-practices/page-data.json index c53ab16..098b484 100644 --- a/page-data/updates-to-govtech-agile-practices/page-data.json +++ b/page-data/updates-to-govtech-agile-practices/page-data.json @@ -1 +1 @@ -{"componentChunkName":"component---src-templates-post-tsx","path":"/updates-to-govtech-agile-practices/","webpackCompilationHash":"e6542130e6dfe73197bb","result":{"data":{"logo":{"childImageSharp":{"fixed":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsSAAALEgHS3X78AAABFUlEQVQY023PvUrDUBTA8ZuCtoMoOLQ4dWhN14x2kEKXFkGoohQ/QBexOHRycAidKkgHHRq69APRoTjFJYODIA6+gSBYfYMmfYLE/5VT6NALP845NyeHc9UoCHZRQvonCLKKE4ZhAXYURTsYoE9dIy5iCzfUJnEdV+RF4iu6ikFH2EPxazzOcJmg4Rnn5C8ysIEOHqTe5/sT3qXOwYOtRr5/wLAqzpCTDXu4p2ETtyjgGJ/cX+se8jeU9fa4RBt5vWENpjzdkoGPcGg4RQsbOMEFmnBRRwVDHEK/yFXfvr/CoPjvZLKcdByDyzWGeajigzorGy0oOeRJiUtITe/pX1XzDk3buIMltSFR/zTtic3060X+8z8PsEUt8G3LVQAAAABJRU5ErkJggg==","width":400,"height":128,"src":"/static/2b5eaa0de166a8b5faebad4955c2200c/647de/ghost-logo.png","srcSet":"/static/2b5eaa0de166a8b5faebad4955c2200c/647de/ghost-logo.png 1x"}}},"markdownRemark":{"html":"

It was our great pleasure to have invited Mr Steven Koh, the Deputy Director of Government Digital Services (GDS) at Govtech, to update us on the journey that his organisation is currently in, with regards to practicing agile within the various teams.

\n

He gave a quick overview of the various products which GDS has implemented for the past 2 years, for example the Business Grants Portal, the OneService app, the myResponder app, Beeline etc. He also elaborated to us in depth how the teams in GDS collaborated when they were building these applications, and some of the challenges they have faced.

\n

Some of the key points he shared were quite enlightening. He has a strong view on how an individual has to make one’s own deal, if one is to thrive in the technology industry. One can be at the top of the crop today, but relegated to the bottom the next day. One has to continuously strive to prove one’s value everyday.

\n

He also shared, based on his past experiences, how companies with a long history can tend to be narrow minded when it comes to agile or digital transformation. He observed that these old companies are inclined to view technology as a hammer, to nail each and all kinds of problems with it. The truth is, he elaborated, not all problems can be, or needs to be solved using technology. One should understand the problem and the context fully and apply the right solution to it.

\n

Another aspect of experiences he shared, was in the light of product development. He advised that one should choose one’s Product Owner wisely — in the case of his organization, the Product Owners are operational people from the various government agencies.

\n

A good Product Owner, he elaborated, needs to have good business acumen, and a good domain knowledge to be able to prioritize what tasks are important. A Product Owner should not be invoking the “boogeyman” tactic to scare developers into getting things done, and needs to listen to inputs from others, before deciding and forming one’s own opinions on what are the right things to do. The Product Owner should be given the autonomy and power to make decisions since he/she is responsible for the product. The Product Owner needs to be the person who steers the product.

\n

While there are these many expectations from a Product Owner, Steven also highlighted that the product at hand has to be important and high-valued enough, so as to get the Product Owner to be deeply invested in it.

\n
Product Owner needs to figure out what are the right things to do.
\nThe development team needs to figure out how to do the things right.
\n
\n

Our discussion then moved on to the development team’s component in an agile team. In terms of hiring, Steven advised that hiring via the traditional method of putting JDs in job portals is no longer enough to attract talent. The organisation needs to proactively attend events and network with individuals to promote the visibility of the organisation.

\n

He added on that since there is only a finite pool of talents in the local market, instead of adopting agile for all the products — which means dedicating specific human resources for one product, be strategic and choose the products that require greater focus wisely. Also, even though an agile team is laser focused in delivering the end product, he reminded that it is important to have incorporate slack time for the developers, so that they have the bandwidth to think, reflect and innovate in their work.

\n

It was really a wonderful morning session, learning these tips from an agile coach who has been there done that — and is still practicing — agile. Hopefully we are able to invite more thought leaders and practitioners to come and share with us their enlightening ideas and experiences!

","htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"It was our great pleasure to have invited Mr Steven Koh, the Deputy Director of Government Digital Services (GDS) at Govtech, to update us on the journey that his organisation is currently in, with regards to practicing agile within the various teams."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"He gave a quick overview of the various products which GDS has implemented for the past 2 years, for example the Business Grants Portal, the OneService app, the myResponder app, Beeline etc. He also elaborated to us in depth how the teams in GDS collaborated when they were building these applications, and some of the challenges they have faced."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Some of the key points he shared were quite enlightening. He has a strong view on how an individual has to make one’s own deal, if one is to thrive in the technology industry. One can be at the top of the crop today, but relegated to the bottom the next day. One has to continuously strive to prove one’s value everyday."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"He also shared, based on his past experiences, how companies with a long history can tend to be narrow minded when it comes to agile or digital transformation. He observed that these old companies are inclined to view technology as a hammer, to nail each and all kinds of problems with it. The truth is, he elaborated, not all problems can be, or needs to be solved using technology. One should understand the problem and the context fully and apply the right solution to it."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Another aspect of experiences he shared, was in the light of product development. He advised that one should choose one’s Product Owner wisely — in the case of his organization, the Product Owners are operational people from the various government agencies."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"A good Product Owner, he elaborated, needs to have good business acumen, and a good domain knowledge to be able to prioritize what tasks are important. A Product Owner should not be invoking the “boogeyman” tactic to scare developers into getting things done, and needs to listen to inputs from others, before deciding and forming one’s own opinions on what are the right things to do. The Product Owner should be given the autonomy and power to make decisions since he/she is responsible for the product. The Product Owner needs to be the person who steers the product."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"While there are these many expectations from a Product Owner, Steven also highlighted that the product at hand has to be important and high-valued enough, so as to get the Product Owner to be deeply invested in it."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"blockquote","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Product Owner needs to figure out what are the right things to do."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nThe development team needs to figure out how to do the things right."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Our discussion then moved on to the development team’s component in an agile team. In terms of hiring, Steven advised that hiring via the traditional method of putting JDs in job portals is no longer enough to attract talent. The organisation needs to proactively attend events and network with individuals to promote the visibility of the organisation."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"He added on that since there is only a finite pool of talents in the local market, instead of adopting agile for all the products — which means dedicating specific human resources for one product, be strategic and choose the products that require greater focus wisely. Also, even though an agile team is laser focused in delivering the end product, he reminded that it is important to have incorporate slack time for the developers, so that they have the bandwidth to think, reflect and innovate in their work."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"It was really a wonderful morning session, learning these tips from an agile coach who has been there done that — and is still practicing — agile. Hopefully we are able to invite more thought leaders and practitioners to come and share with us their enlightening ideas and experiences!"}]}],"data":{"quirksMode":false}},"excerpt":"It was our great pleasure to have invited Mr Steven Koh, the Deputy Director of Government Digital Services (GDS) at Govtech, to update us…","timeToRead":3,"frontmatter":{"title":"Updates to Govtech Agile Practices by Steven Koh - 2 July","userDate":"18 July 2018","date":"2018-07-18T17:50:00.000Z","tags":["Meetup"],"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAABAACBf/EABYBAQEBAAAAAAAAAAAAAAAAAAIAAf/aAAwDAQACEAMQAAABZzh6OLgyv//EABwQAAIBBQEAAAAAAAAAAAAAAAECAwAREhMxQf/aAAgBAQABBQJtITwRlqbls2eUhv/EABYRAAMAAAAAAAAAAAAAAAAAAAABEf/aAAgBAwEBPwFqkP/EABURAQEAAAAAAAAAAAAAAAAAAAEQ/9oACAECAQE/ARJ//8QAHBAAAgICAwAAAAAAAAAAAAAAAAECESExEiIy/9oACAEBAAY/ApNS0dnxPQ87LTwOj//EABoQAAIDAQEAAAAAAAAAAAAAAAERACExQVH/2gAIAQEAAT8hsI8g5G21q4MYOMQGmoCwNG4Escn/2gAMAwEAAgADAAAAEP8AD//EABYRAAMAAAAAAAAAAAAAAAAAAAEQQf/aAAgBAwEBPxCAr//EABcRAQADAAAAAAAAAAAAAAAAAAABETH/2gAIAQIBAT8Qhat//8QAGhAAAwEBAQEAAAAAAAAAAAAAAREhADFBsf/aAAgBAQABPxBl5yWG8GJujIADqfnNA21SvuiI6OdbA0bJgUoL4MagESyDDd3/2Q==","aspectRatio":1.3333333333333333,"src":"/static/8d8fee52f47c44485daff296b0c76794/3dc2b/meetup-speaker.jpg","srcSet":"/static/8d8fee52f47c44485daff296b0c76794/f8f18/meetup-speaker.jpg 930w,\n/static/8d8fee52f47c44485daff296b0c76794/3dc2b/meetup-speaker.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAADQElEQVQ4y5VUW0tUURSeX9BDhFZQ1Nx0lCAqI+o1KMiHoqjIesisXiLSQOhiRUWUdKEwKqKHtNIyJLuY0UWS0lBKM8mcrEadcnIc58zlzMyZvc/+WjNnRs+xIWjDd9a+fudba6+1TaAmhEDaCqESONItOZewCUitgK8JIu7TxrQXqbV0M00lSzd1LAgRiU5u/3oAaJ0NQcC7RYC/LXWOJz6ThHoVyX74GynpRKTuLZjTo815SNWzbIjuEsD7EqJjHUT7KoNnBoVpZer3G+DN+eBNNvD2Egh5BCLqAW9ZCf7YDBF0agTjXbRnAbkezESYikPIBfYgH+y+BawhD6x+LtjDAsJSxOutiN+zgPechWAyeNs+sNZiXagyEKq+Xig1dii386DcyiU4oFRbodwk1CT6dq1fnQv2vJiUj6cIVYNKk55dadyC6PnpiF3LRfRqziSu2Ak0d9mC2I0C6JtQVYNSk+Evsg9K035EKs2InLUhci6HrD0F6ldaEbmwEKz7HrjrHamUpqg0pM1kyrD3dxE+Ykb4mB3ho2nYaI5shQXhg3MRPmyGfGY5+OCHlFKuv+UUKY8nLR/8iFCZBaH9VoKN+glr11BK41KyZTkI7poBuaook8vCcFvypRIEts1EYLcdgRILAjttkLbOhlQ0C4EdiXEOrTlozxyEjhQaLsY0Nbjq7yE67IC00Qxps5VAZOvJxeNbET61HdKG+fCvyYK/MBv+1TMQa66ZcDkjIf/los02OmSBf62DDs2DtGkxVZCWxKy/G5HrZ+gHe6G8eWqoeWPp6SpGPl0O74JpGFuSBR/ZaHWVdiiuxTjW0o/QxeY0laEEDZeiksoEJYvTjTXeQfRkOeSG2mQ+CJ0XzOVBvGtgwk09x4TLqhCGhP1EKTaeXsO/21+PA1e1iVfOMRx94iT048SjPuyp68GL3l+Aux/MMwTuHqAS9UClOKveEaijbkpu+e/SYynC2x1uZB16gWXn2zA8JqO2043d9X2AxwnF/R3scwf4QE+SlH/rBet6TS/Q+NRLERPuDoyGUUHqVlxox6svXri8Mtp+kO+RAFQ5RCk1nCRQRwbpdZI0KNHMj4M+hr0/g8YY/UcM/wD4fYcC4gOWgAAAAABJRU5ErkJggg==","width":400,"height":400,"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png","srcSet":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png 1x,\n/static/7fa6bee9d2080bd021828c70f67a4720/fca9c/sphtech.png 1.5x"}}]}}}},"relatedPosts":{"totalCount":4,"edges":[{"node":{"id":"8865d4be-7fa3-5582-9991-55bc98517819","timeToRead":2,"excerpt":"This was the second Developers Gym session organized by Thoughtworks, of which we were honoured to play host to. The coding dojo, formulated…","frontmatter":{"title":"Developers Gym by Thoughtworks - 14 July"},"fields":{"slug":"/developers-gym-by-thoughtworks-14-july/"}}},{"node":{"id":"8d28738e-5a45-5b0a-ab5d-f4bd55529568","timeToRead":1,"excerpt":"On the 21st of November, SPH staff gathered for a cozy SPHTech Meetup session at The Inspiration Hub to learn about Data Privacy efforts in…","frontmatter":{"title":"Towards a Privacy Aware Smart Nation"},"fields":{"slug":"/towards-a-privacy-aware-smart-nation/"}}},{"node":{"id":"1ee10358-b30a-5691-b583-a3aaec6a020b","timeToRead":3,"excerpt":"It was our great pleasure to have invited Mr Steven Koh, the Deputy Director of Government Digital Services (GDS) at Govtech, to update us…","frontmatter":{"title":"Updates to Govtech Agile Practices by Steven Koh - 2 July"},"fields":{"slug":"/updates-to-govtech-agile-practices/"}}}]}},"pageContext":{"isCreatedByStatefulCreatePages":false,"slug":"/updates-to-govtech-agile-practices/","prev":{"excerpt":"IntroductionNews media companies like Singapore Press Holdings (SPH) continue to be faced with rapidly accelerating technology innovation…","timeToRead":3,"frontmatter":{"title":"AI in News Media","tags":[],"date":"2018-07-12T22:46:00.000Z","draft":false,"image":{"childImageSharp":{"fluid":{"aspectRatio":1.8741633199464525,"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAIEAQP/xAAVAQEBAAAAAAAAAAAAAAAAAAABAv/aAAwDAQACEAMQAAABbnkrNAwn/8QAHBABAAEEAwAAAAAAAAAAAAAAAQACAxESEyEi/9oACAEBAAEFAsLGnvhuTKVL6trr/8QAFxEAAwEAAAAAAAAAAAAAAAAAAAEREv/aAAgBAwEBPwHKIj//xAAXEQEAAwAAAAAAAAAAAAAAAAAAAREh/9oACAECAQE/Ablr/8QAGhAAAgIDAAAAAAAAAAAAAAAAABABITEy8P/aAAgBAQAGPwJayV1rJ//EABsQAAMAAgMAAAAAAAAAAAAAAAABESExQWGB/9oACAEBAAE/IaHM9j2KZRS6mkHc3sbyZ+n/2gAMAwEAAgADAAAAEJvf/8QAFhEBAQEAAAAAAAAAAAAAAAAAABFB/9oACAEDAQE/EHHH/8QAFxEAAwEAAAAAAAAAAAAAAAAAAAERQf/aAAgBAgEBPxBFX0//xAAdEAEBAAMAAgMAAAAAAAAAAAABEQAhMUFRYXGh/9oACAEBAAE/EI4MDolZ4mCAJTthy4toHwXFAiuj0y/hiQMnbf3nFcwq5DP/2Q==","sizes":"(max-width: 1400px) 100vw, 1400px","src":"/static/9bea42284114acb5ba9e14a5fe42867c/3dc2b/INMANews-ArtificialIntelligence-1800.jpg","srcSet":"/static/9bea42284114acb5ba9e14a5fe42867c/f8f18/INMANews-ArtificialIntelligence-1800.jpg 930w,\n/static/9bea42284114acb5ba9e14a5fe42867c/3dc2b/INMANews-ArtificialIntelligence-1800.jpg 1400w"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/b4a08/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/ai-in-news-media/"}},"next":{"excerpt":"This was the second Developers Gym session organized by Thoughtworks, of which we were honoured to play host to. The coding dojo, formulated…","timeToRead":2,"frontmatter":{"title":"Developers Gym by Thoughtworks - 14 July","tags":["Meetup","Reviews"],"date":"2018-07-25T14:25:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"aspectRatio":1.3333333333333333,"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAABAADBf/EABUBAQEAAAAAAAAAAAAAAAAAAAEA/9oADAMBAAIQAxAAAAFBg5F0Ycn/xAAZEAADAQEBAAAAAAAAAAAAAAAAARICAxP/2gAIAQEAAQUC88RpKp2b6Muikj//xAAWEQEBAQAAAAAAAAAAAAAAAAAAARH/2gAIAQMBAT8BZX//xAAWEQEBAQAAAAAAAAAAAAAAAAAAARH/2gAIAQIBAT8BjY//xAAcEAACAgIDAAAAAAAAAAAAAAAAARExAiESQXH/2gAIAQEABj8C5THo1i1otF6KOz//xAAdEAACAgIDAQAAAAAAAAAAAAAAAREhMUFRYYGh/9oACAEBAAE/IXBpbgTKVtySYg6Ki8xM1pmaowl9n//aAAwDAQACAAMAAAAQoA//xAAXEQADAQAAAAAAAAAAAAAAAAAAASFh/9oACAEDAQE/EHVGbn//xAAXEQEBAQEAAAAAAAAAAAAAAAABABFh/9oACAECAQE/EEZqXC//xAAcEAEAAgIDAQAAAAAAAAAAAAABABEhMUFhcVH/2gAIAQEAAT8QGhkCBsvx3AVpM2ixeMzYf0WSkaQrsF8QpXaeLg+ErhYbNDqf/9k=","sizes":"(max-width: 1400px) 100vw, 1400px","src":"/static/9f96e81e6f6d55da468755a49a4b0666/3dc2b/IMG_8071.jpg","srcSet":"/static/9f96e81e6f6d55da468755a49a4b0666/f8f18/IMG_8071.jpg 930w,\n/static/9f96e81e6f6d55da468755a49a4b0666/3dc2b/IMG_8071.jpg 1400w"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/b4a08/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/developers-gym-by-thoughtworks-14-july/"}},"primaryTag":"Meetup"}}} \ No newline at end of file +{"componentChunkName":"component---src-templates-post-tsx","path":"/updates-to-govtech-agile-practices/","webpackCompilationHash":"4d127609ee78b8f0aee7","result":{"data":{"logo":{"childImageSharp":{"fixed":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsSAAALEgHS3X78AAABFUlEQVQY023PvUrDUBTA8ZuCtoMoOLQ4dWhN14x2kEKXFkGoohQ/QBexOHRycAidKkgHHRq69APRoTjFJYODIA6+gSBYfYMmfYLE/5VT6NALP845NyeHc9UoCHZRQvonCLKKE4ZhAXYURTsYoE9dIy5iCzfUJnEdV+RF4iu6ikFH2EPxazzOcJmg4Rnn5C8ysIEOHqTe5/sT3qXOwYOtRr5/wLAqzpCTDXu4p2ETtyjgGJ/cX+se8jeU9fa4RBt5vWENpjzdkoGPcGg4RQsbOMEFmnBRRwVDHEK/yFXfvr/CoPjvZLKcdByDyzWGeajigzorGy0oOeRJiUtITe/pX1XzDk3buIMltSFR/zTtic3060X+8z8PsEUt8G3LVQAAAABJRU5ErkJggg==","width":400,"height":128,"src":"/static/2b5eaa0de166a8b5faebad4955c2200c/647de/ghost-logo.png","srcSet":"/static/2b5eaa0de166a8b5faebad4955c2200c/647de/ghost-logo.png 1x"}}},"markdownRemark":{"html":"

It was our great pleasure to have invited Mr Steven Koh, the Deputy Director of Government Digital Services (GDS) at Govtech, to update us on the journey that his organisation is currently in, with regards to practicing agile within the various teams.

\n

He gave a quick overview of the various products which GDS has implemented for the past 2 years, for example the Business Grants Portal, the OneService app, the myResponder app, Beeline etc. He also elaborated to us in depth how the teams in GDS collaborated when they were building these applications, and some of the challenges they have faced.

\n

Some of the key points he shared were quite enlightening. He has a strong view on how an individual has to make one’s own deal, if one is to thrive in the technology industry. One can be at the top of the crop today, but relegated to the bottom the next day. One has to continuously strive to prove one’s value everyday.

\n

He also shared, based on his past experiences, how companies with a long history can tend to be narrow minded when it comes to agile or digital transformation. He observed that these old companies are inclined to view technology as a hammer, to nail each and all kinds of problems with it. The truth is, he elaborated, not all problems can be, or needs to be solved using technology. One should understand the problem and the context fully and apply the right solution to it.

\n

Another aspect of experiences he shared, was in the light of product development. He advised that one should choose one’s Product Owner wisely — in the case of his organization, the Product Owners are operational people from the various government agencies.

\n

A good Product Owner, he elaborated, needs to have good business acumen, and a good domain knowledge to be able to prioritize what tasks are important. A Product Owner should not be invoking the “boogeyman” tactic to scare developers into getting things done, and needs to listen to inputs from others, before deciding and forming one’s own opinions on what are the right things to do. The Product Owner should be given the autonomy and power to make decisions since he/she is responsible for the product. The Product Owner needs to be the person who steers the product.

\n

While there are these many expectations from a Product Owner, Steven also highlighted that the product at hand has to be important and high-valued enough, so as to get the Product Owner to be deeply invested in it.

\n
Product Owner needs to figure out what are the right things to do.
\nThe development team needs to figure out how to do the things right.
\n
\n

Our discussion then moved on to the development team’s component in an agile team. In terms of hiring, Steven advised that hiring via the traditional method of putting JDs in job portals is no longer enough to attract talent. The organisation needs to proactively attend events and network with individuals to promote the visibility of the organisation.

\n

He added on that since there is only a finite pool of talents in the local market, instead of adopting agile for all the products — which means dedicating specific human resources for one product, be strategic and choose the products that require greater focus wisely. Also, even though an agile team is laser focused in delivering the end product, he reminded that it is important to have incorporate slack time for the developers, so that they have the bandwidth to think, reflect and innovate in their work.

\n

It was really a wonderful morning session, learning these tips from an agile coach who has been there done that — and is still practicing — agile. Hopefully we are able to invite more thought leaders and practitioners to come and share with us their enlightening ideas and experiences!

","htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"It was our great pleasure to have invited Mr Steven Koh, the Deputy Director of Government Digital Services (GDS) at Govtech, to update us on the journey that his organisation is currently in, with regards to practicing agile within the various teams."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"He gave a quick overview of the various products which GDS has implemented for the past 2 years, for example the Business Grants Portal, the OneService app, the myResponder app, Beeline etc. He also elaborated to us in depth how the teams in GDS collaborated when they were building these applications, and some of the challenges they have faced."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Some of the key points he shared were quite enlightening. He has a strong view on how an individual has to make one’s own deal, if one is to thrive in the technology industry. One can be at the top of the crop today, but relegated to the bottom the next day. One has to continuously strive to prove one’s value everyday."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"He also shared, based on his past experiences, how companies with a long history can tend to be narrow minded when it comes to agile or digital transformation. He observed that these old companies are inclined to view technology as a hammer, to nail each and all kinds of problems with it. The truth is, he elaborated, not all problems can be, or needs to be solved using technology. One should understand the problem and the context fully and apply the right solution to it."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Another aspect of experiences he shared, was in the light of product development. He advised that one should choose one’s Product Owner wisely — in the case of his organization, the Product Owners are operational people from the various government agencies."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"A good Product Owner, he elaborated, needs to have good business acumen, and a good domain knowledge to be able to prioritize what tasks are important. A Product Owner should not be invoking the “boogeyman” tactic to scare developers into getting things done, and needs to listen to inputs from others, before deciding and forming one’s own opinions on what are the right things to do. The Product Owner should be given the autonomy and power to make decisions since he/she is responsible for the product. The Product Owner needs to be the person who steers the product."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"While there are these many expectations from a Product Owner, Steven also highlighted that the product at hand has to be important and high-valued enough, so as to get the Product Owner to be deeply invested in it."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"blockquote","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Product Owner needs to figure out what are the right things to do."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nThe development team needs to figure out how to do the things right."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Our discussion then moved on to the development team’s component in an agile team. In terms of hiring, Steven advised that hiring via the traditional method of putting JDs in job portals is no longer enough to attract talent. The organisation needs to proactively attend events and network with individuals to promote the visibility of the organisation."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"He added on that since there is only a finite pool of talents in the local market, instead of adopting agile for all the products — which means dedicating specific human resources for one product, be strategic and choose the products that require greater focus wisely. Also, even though an agile team is laser focused in delivering the end product, he reminded that it is important to have incorporate slack time for the developers, so that they have the bandwidth to think, reflect and innovate in their work."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"It was really a wonderful morning session, learning these tips from an agile coach who has been there done that — and is still practicing — agile. Hopefully we are able to invite more thought leaders and practitioners to come and share with us their enlightening ideas and experiences!"}]}],"data":{"quirksMode":false}},"excerpt":"It was our great pleasure to have invited Mr Steven Koh, the Deputy Director of Government Digital Services (GDS) at Govtech, to update us…","timeToRead":3,"frontmatter":{"title":"Updates to Govtech Agile Practices by Steven Koh - 2 July","userDate":"18 July 2018","date":"2018-07-18T17:50:00.000Z","tags":["Meetup"],"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAABAACBf/EABYBAQEBAAAAAAAAAAAAAAAAAAIAAf/aAAwDAQACEAMQAAABZzh6OLgyv//EABwQAAIBBQEAAAAAAAAAAAAAAAECAwAREhMxQf/aAAgBAQABBQJtITwRlqbls2eUhv/EABYRAAMAAAAAAAAAAAAAAAAAAAABEf/aAAgBAwEBPwFqkP/EABURAQEAAAAAAAAAAAAAAAAAAAEQ/9oACAECAQE/ARJ//8QAHBAAAgICAwAAAAAAAAAAAAAAAAECESExEiIy/9oACAEBAAY/ApNS0dnxPQ87LTwOj//EABoQAAIDAQEAAAAAAAAAAAAAAAERACExQVH/2gAIAQEAAT8hsI8g5G21q4MYOMQGmoCwNG4Escn/2gAMAwEAAgADAAAAEP8AD//EABYRAAMAAAAAAAAAAAAAAAAAAAEQQf/aAAgBAwEBPxCAr//EABcRAQADAAAAAAAAAAAAAAAAAAABETH/2gAIAQIBAT8Qhat//8QAGhAAAwEBAQEAAAAAAAAAAAAAAREhADFBsf/aAAgBAQABPxBl5yWG8GJujIADqfnNA21SvuiI6OdbA0bJgUoL4MagESyDDd3/2Q==","aspectRatio":1.3333333333333333,"src":"/static/8d8fee52f47c44485daff296b0c76794/3dc2b/meetup-speaker.jpg","srcSet":"/static/8d8fee52f47c44485daff296b0c76794/f8f18/meetup-speaker.jpg 930w,\n/static/8d8fee52f47c44485daff296b0c76794/3dc2b/meetup-speaker.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAADQElEQVQ4y5VUW0tUURSeX9BDhFZQ1Nx0lCAqI+o1KMiHoqjIesisXiLSQOhiRUWUdKEwKqKHtNIyJLuY0UWS0lBKM8mcrEadcnIc58zlzMyZvc/+WjNnRs+xIWjDd9a+fudba6+1TaAmhEDaCqESONItOZewCUitgK8JIu7TxrQXqbV0M00lSzd1LAgRiU5u/3oAaJ0NQcC7RYC/LXWOJz6ThHoVyX74GynpRKTuLZjTo815SNWzbIjuEsD7EqJjHUT7KoNnBoVpZer3G+DN+eBNNvD2Egh5BCLqAW9ZCf7YDBF0agTjXbRnAbkezESYikPIBfYgH+y+BawhD6x+LtjDAsJSxOutiN+zgPechWAyeNs+sNZiXagyEKq+Xig1dii386DcyiU4oFRbodwk1CT6dq1fnQv2vJiUj6cIVYNKk55dadyC6PnpiF3LRfRqziSu2Ak0d9mC2I0C6JtQVYNSk+Evsg9K035EKs2InLUhci6HrD0F6ldaEbmwEKz7HrjrHamUpqg0pM1kyrD3dxE+Ykb4mB3ho2nYaI5shQXhg3MRPmyGfGY5+OCHlFKuv+UUKY8nLR/8iFCZBaH9VoKN+glr11BK41KyZTkI7poBuaook8vCcFvypRIEts1EYLcdgRILAjttkLbOhlQ0C4EdiXEOrTlozxyEjhQaLsY0Nbjq7yE67IC00Qxps5VAZOvJxeNbET61HdKG+fCvyYK/MBv+1TMQa66ZcDkjIf/los02OmSBf62DDs2DtGkxVZCWxKy/G5HrZ+gHe6G8eWqoeWPp6SpGPl0O74JpGFuSBR/ZaHWVdiiuxTjW0o/QxeY0laEEDZeiksoEJYvTjTXeQfRkOeSG2mQ+CJ0XzOVBvGtgwk09x4TLqhCGhP1EKTaeXsO/21+PA1e1iVfOMRx94iT048SjPuyp68GL3l+Aux/MMwTuHqAS9UClOKveEaijbkpu+e/SYynC2x1uZB16gWXn2zA8JqO2043d9X2AxwnF/R3scwf4QE+SlH/rBet6TS/Q+NRLERPuDoyGUUHqVlxox6svXri8Mtp+kO+RAFQ5RCk1nCRQRwbpdZI0KNHMj4M+hr0/g8YY/UcM/wD4fYcC4gOWgAAAAABJRU5ErkJggg==","width":400,"height":400,"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png","srcSet":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png 1x,\n/static/7fa6bee9d2080bd021828c70f67a4720/fca9c/sphtech.png 1.5x"}}]}}}},"relatedPosts":{"totalCount":4,"edges":[{"node":{"id":"8865d4be-7fa3-5582-9991-55bc98517819","timeToRead":2,"excerpt":"This was the second Developers Gym session organized by Thoughtworks, of which we were honoured to play host to. The coding dojo, formulated…","frontmatter":{"title":"Developers Gym by Thoughtworks - 14 July"},"fields":{"slug":"/developers-gym-by-thoughtworks-14-july/"}}},{"node":{"id":"8d28738e-5a45-5b0a-ab5d-f4bd55529568","timeToRead":1,"excerpt":"On the 21st of November, SPH staff gathered for a cozy SPHTech Meetup session at The Inspiration Hub to learn about Data Privacy efforts in…","frontmatter":{"title":"Towards a Privacy Aware Smart Nation"},"fields":{"slug":"/towards-a-privacy-aware-smart-nation/"}}},{"node":{"id":"1ee10358-b30a-5691-b583-a3aaec6a020b","timeToRead":3,"excerpt":"It was our great pleasure to have invited Mr Steven Koh, the Deputy Director of Government Digital Services (GDS) at Govtech, to update us…","frontmatter":{"title":"Updates to Govtech Agile Practices by Steven Koh - 2 July"},"fields":{"slug":"/updates-to-govtech-agile-practices/"}}}]}},"pageContext":{"isCreatedByStatefulCreatePages":false,"slug":"/updates-to-govtech-agile-practices/","prev":{"excerpt":"IntroductionNews media companies like Singapore Press Holdings (SPH) continue to be faced with rapidly accelerating technology innovation…","timeToRead":3,"frontmatter":{"title":"AI in News Media","tags":[],"date":"2018-07-12T22:46:00.000Z","draft":false,"image":{"childImageSharp":{"fluid":{"aspectRatio":1.8741633199464525,"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAIEAQP/xAAVAQEBAAAAAAAAAAAAAAAAAAABAv/aAAwDAQACEAMQAAABbnkrNAwn/8QAHBABAAEEAwAAAAAAAAAAAAAAAQACAxESEyEi/9oACAEBAAEFAsLGnvhuTKVL6trr/8QAFxEAAwEAAAAAAAAAAAAAAAAAAAEREv/aAAgBAwEBPwHKIj//xAAXEQEAAwAAAAAAAAAAAAAAAAAAAREh/9oACAECAQE/Ablr/8QAGhAAAgIDAAAAAAAAAAAAAAAAABABITEy8P/aAAgBAQAGPwJayV1rJ//EABsQAAMAAgMAAAAAAAAAAAAAAAABESExQWGB/9oACAEBAAE/IaHM9j2KZRS6mkHc3sbyZ+n/2gAMAwEAAgADAAAAEJvf/8QAFhEBAQEAAAAAAAAAAAAAAAAAABFB/9oACAEDAQE/EHHH/8QAFxEAAwEAAAAAAAAAAAAAAAAAAAERQf/aAAgBAgEBPxBFX0//xAAdEAEBAAMAAgMAAAAAAAAAAAABEQAhMUFRYXGh/9oACAEBAAE/EI4MDolZ4mCAJTthy4toHwXFAiuj0y/hiQMnbf3nFcwq5DP/2Q==","sizes":"(max-width: 1400px) 100vw, 1400px","src":"/static/9bea42284114acb5ba9e14a5fe42867c/3dc2b/INMANews-ArtificialIntelligence-1800.jpg","srcSet":"/static/9bea42284114acb5ba9e14a5fe42867c/f8f18/INMANews-ArtificialIntelligence-1800.jpg 930w,\n/static/9bea42284114acb5ba9e14a5fe42867c/3dc2b/INMANews-ArtificialIntelligence-1800.jpg 1400w"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/b4a08/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/ai-in-news-media/"}},"next":{"excerpt":"This was the second Developers Gym session organized by Thoughtworks, of which we were honoured to play host to. The coding dojo, formulated…","timeToRead":2,"frontmatter":{"title":"Developers Gym by Thoughtworks - 14 July","tags":["Meetup","Reviews"],"date":"2018-07-25T14:25:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"aspectRatio":1.3333333333333333,"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAABAADBf/EABUBAQEAAAAAAAAAAAAAAAAAAAEA/9oADAMBAAIQAxAAAAFBg5F0Ycn/xAAZEAADAQEBAAAAAAAAAAAAAAAAARICAxP/2gAIAQEAAQUC88RpKp2b6Muikj//xAAWEQEBAQAAAAAAAAAAAAAAAAAAARH/2gAIAQMBAT8BZX//xAAWEQEBAQAAAAAAAAAAAAAAAAAAARH/2gAIAQIBAT8BjY//xAAcEAACAgIDAAAAAAAAAAAAAAAAARExAiESQXH/2gAIAQEABj8C5THo1i1otF6KOz//xAAdEAACAgIDAQAAAAAAAAAAAAAAAREhMUFRYYGh/9oACAEBAAE/IXBpbgTKVtySYg6Ki8xM1pmaowl9n//aAAwDAQACAAMAAAAQoA//xAAXEQADAQAAAAAAAAAAAAAAAAAAASFh/9oACAEDAQE/EHVGbn//xAAXEQEBAQEAAAAAAAAAAAAAAAABABFh/9oACAECAQE/EEZqXC//xAAcEAEAAgIDAQAAAAAAAAAAAAABABEhMUFhcVH/2gAIAQEAAT8QGhkCBsvx3AVpM2ixeMzYf0WSkaQrsF8QpXaeLg+ErhYbNDqf/9k=","sizes":"(max-width: 1400px) 100vw, 1400px","src":"/static/9f96e81e6f6d55da468755a49a4b0666/3dc2b/IMG_8071.jpg","srcSet":"/static/9f96e81e6f6d55da468755a49a4b0666/f8f18/IMG_8071.jpg 930w,\n/static/9f96e81e6f6d55da468755a49a4b0666/3dc2b/IMG_8071.jpg 1400w"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/b4a08/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/developers-gym-by-thoughtworks-14-july/"}},"primaryTag":"Meetup"}}} \ No newline at end of file diff --git a/page-data/using-mockitos-argumentcaptor/page-data.json b/page-data/using-mockitos-argumentcaptor/page-data.json index e87c57e..7def031 100644 --- a/page-data/using-mockitos-argumentcaptor/page-data.json +++ b/page-data/using-mockitos-argumentcaptor/page-data.json @@ -1 +1 @@ -{"componentChunkName":"component---src-templates-post-tsx","path":"/using-mockitos-argumentcaptor/","webpackCompilationHash":"e6542130e6dfe73197bb","result":{"data":{"logo":{"childImageSharp":{"fixed":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsSAAALEgHS3X78AAABFUlEQVQY023PvUrDUBTA8ZuCtoMoOLQ4dWhN14x2kEKXFkGoohQ/QBexOHRycAidKkgHHRq69APRoTjFJYODIA6+gSBYfYMmfYLE/5VT6NALP845NyeHc9UoCHZRQvonCLKKE4ZhAXYURTsYoE9dIy5iCzfUJnEdV+RF4iu6ikFH2EPxazzOcJmg4Rnn5C8ysIEOHqTe5/sT3qXOwYOtRr5/wLAqzpCTDXu4p2ETtyjgGJ/cX+se8jeU9fa4RBt5vWENpjzdkoGPcGg4RQsbOMEFmnBRRwVDHEK/yFXfvr/CoPjvZLKcdByDyzWGeajigzorGy0oOeRJiUtITe/pX1XzDk3buIMltSFR/zTtic3060X+8z8PsEUt8G3LVQAAAABJRU5ErkJggg==","width":400,"height":128,"src":"/static/2b5eaa0de166a8b5faebad4955c2200c/647de/ghost-logo.png","srcSet":"/static/2b5eaa0de166a8b5faebad4955c2200c/647de/ghost-logo.png 1x"}}},"markdownRemark":{"html":"

A SingleLiveEvent class is an observable live data that can be used to send events from ViewModel to View in Android MVVM-styled designs.

\n

This link describes using Kotlin’s sealed data class with a SingleLiveEvent to create such a mechanism.

\n

I used that in one of my projects and ended up with a ViewModel that looks like this:

\n

ViewModel Class

\n
val command: SingleLiveEvent<Command> = dependencyProvider.getCommmand()\n\n// This value will be set by other business logic\nvar todayDate : String? = null\n\nfun handleButtonClick(){\n   todayDate?.let {\n      command.value = Command.LaunchNextActivity(it)\n   }\n}
\n

Command Sealed Class

\n
sealed class Command {\n    class LaunchNextActivity(val dateString : String) : Command()\n}
\n

How does it work?

\n

A user event will trigger this handleButtonClick() in my ViewModel class.

\n

It must then instruct a View to launch NextActivity using a variable todayDate.

\n

The todayDate value is set by some other UseCase class.

\n

I am using a simple Kotlin object class to provide dependencies, SingleLiveEvent<Command> type class being one of them.

\n
interface DependencyProvider {\n    fun getCommmand(): SingleLiveEvent<Command>\n}\n\nobject Injector : DependencyProvider {\n    override fun getCommmand(): SingleLiveEvent<Command> {\n        return SingleLiveEvent()\n    }\n}
\n

Writing a Unit Test

\n

When I am writing unit test, I often find myself stuck with the question, “What to check?” I usually got out by thinking inwardly and selfishly. What is the single concern for this function?

\n

So in this case, I am not concerned with who is observing this command event. But I am concerned about:

\n
    \n
  • command’s value being set with todayDate, if todayDate is not null.
  • \n
  • command’s setValue is not called when todayDate is null.
  • \n
\n

Let us address the first concern, which is to be able to verify that command’s setValue is being called.

\n
@Mock\nlateinit var mockProvider: DependencyProvider\n\n@Mock\nlateinit var mockCommand : SingleLiveEvent<Command>\n\n@Before\nfun setUp() {\n    MockitoAnnotations.initMocks(this)\n    whenever(mockProvider.getCommmand()).thenReturn(mockCommand)\n    viewModel = MyViewModel(mockProvider)\n}\n\n@Test\nfun handleButtonClick_whenTodayDateNotNull() {\n    val testDate = \"2018-07-22\"\n\n    //Pretend here that some UseCase sets todayDate as testDate\n    viewModel.todayDate = testDate\n    viewModel.handleButtonClick()\n\n    val argumentCaptor : ArgumentCaptor<Command.LaunchNextActivity> = \n            ArgumentCaptor.forClass(Command.LaunchNextActivity::class.java)\n  \n    verify(mockCommand, times(1)).setValue(argumentCaptor.capture())\n    Assert.assertEquals(testDate,  argumentCaptor.value.dateString)\n}
\n

Mocking Dependencies

\n

For us to verify command’s function is being called, we need to mock it.

\n
@Mock\nlateinit var mockCommand : SingleLiveEvent<Command>
\n

We want to override the provideCommand() to get it to return mockCommand, so we need to mock our Injector as well. This mockProvider is passed into our ViewModel, see line 5.

\n
@Mock\nlateinit var mockProvider: DependencyProvider\n...\nwhenever(mockProvider.getCommmand()).thenReturn(mockCommand)
\n

All these mocks will be initialised when the following function is called.

\n
MockitoAnnotations.initMocks(this)
\n

There, we have bent the dependencies to our will, we can move on now.

\n

Verifying and Asserting

\n

Line 19. We can verify whether or not setValue is being called by specifying any(). This means we do not really care about the value of the parameter that is passed into the setValue function.

\n
verify(mockCommand, times(1)).setValue(any())
\n

So to check that it is not called,

\n
verify(mockCommand, times(0)).setValue(any())
\n

However, we ARE concerned that the correct value is being used for setValue(). Mockito’s ArgumentCaptor class do that.

\n

They allow you to capture the variable that is being passed as an argument, for the function that you are verifying.

\n
verify(mockCommand, times(1)).setValue(argumentCaptor.capture())\nAssert.assertEquals(testDate, argumentCaptor.value.dateString)
\n

After capturing, we can then perform simple assertions on the captured value.

\n

Summary

\n

Kotlin’s sealed class can be used effectively to send events with parameters to View classes, from ViewModels.

\n

These sealed classes are wrapped with SingleLiveEvent live data classes, so Views can create observers to observe changes in value.

\n

We can use Mockito’s ArgumentCaptors to capture what is being used to set these live data, thereby verifying the correctness of the function.

\n

Original post by Boon Keat at here.

","htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"A "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"SingleLiveEvent"}]},{"type":"text","value":" class is an observable live data that can be used to send events from ViewModel to View in Android MVVM-styled designs."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"a","properties":{"href":"https://medium.com/@trionkidnapper/issuing-commands-from-a-viewmodel-using-kotlin-sealed-classes-f1bbab7d4979"},"children":[{"type":"text","value":"This link"}]},{"type":"text","value":" describes using Kotlin’s sealed data class with a "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"SingleLiveEvent"}]},{"type":"text","value":" to create such a mechanism."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"I used that in one of my projects and ended up with a ViewModel that looks like this:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h4","properties":{},"children":[{"type":"text","value":"ViewModel Class"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"kotlin"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-kotlin"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-kotlin"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"val"}]},{"type":"text","value":" command"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" SingleLiveEvent"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":"Command"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" dependencyProvider"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"getCommmand"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"// This value will be set by other business logic"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"var"}]},{"type":"text","value":" todayDate "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" String"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"?"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"null"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"fun"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"handleButtonClick"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n todayDate"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"?"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"let"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n command"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"value "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Command"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"LaunchNextActivity"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"it"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h4","properties":{},"children":[{"type":"text","value":"Command Sealed Class"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"kotlin"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-kotlin"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-kotlin"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"sealed"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" Command "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"LaunchNextActivity"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"val"}]},{"type":"text","value":" dateString "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" String"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"Command"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"How does it work?"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"A user event will trigger this "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"handleButtonClick()"}]},{"type":"text","value":" in my ViewModel class."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"It must then instruct a View to launch NextActivity using a variable "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"todayDate"}]},{"type":"text","value":"."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"The "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"todayDate"}]},{"type":"text","value":" value is set by some other UseCase class."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"I am using a simple Kotlin object class to provide dependencies, "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"SingleLiveEvent"}]},{"type":"text","value":" type class being one of them."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"kotlin"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-kotlin"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-kotlin"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"interface"}]},{"type":"text","value":" DependencyProvider "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"fun"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"getCommmand"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" SingleLiveEvent"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":"Command"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"object"}]},{"type":"text","value":" Injector "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" DependencyProvider "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"override"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"fun"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"getCommmand"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" SingleLiveEvent"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":"Command"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"SingleLiveEvent"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"Writing a Unit Test"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"When I am writing unit test, I often find myself stuck with the question, “What to check?” I usually got out by thinking inwardly and selfishly. What is the single concern for this function?"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"So in this case, I am not concerned with who is observing this command event. But I am concerned about:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"command"}]},{"type":"text","value":"’s value being set with "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"todayDate"}]},{"type":"text","value":", if "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"todayDate"}]},{"type":"text","value":" is not null."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"command"}]},{"type":"text","value":"’s "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"setValue"}]},{"type":"text","value":" is not called when "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"todayDate"}]},{"type":"text","value":" is null."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Let us address the first concern, which is to be able to verify that "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"command"}]},{"type":"text","value":"’s "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"setValue"}]},{"type":"text","value":" is being called."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"kotlin"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-kotlin"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-kotlin"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","annotation","builtin"]},"children":[{"type":"text","value":"@Mock"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lateinit"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"var"}]},{"type":"text","value":" mockProvider"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" DependencyProvider\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","annotation","builtin"]},"children":[{"type":"text","value":"@Mock"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lateinit"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"var"}]},{"type":"text","value":" mockCommand "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" SingleLiveEvent"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":"Command"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","annotation","builtin"]},"children":[{"type":"text","value":"@Before"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"fun"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"setUp"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n MockitoAnnotations"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"initMocks"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"this"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"whenever"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mockProvider"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"getCommmand"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"thenReturn"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mockCommand"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n viewModel "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"MyViewModel"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mockProvider"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","annotation","builtin"]},"children":[{"type":"text","value":"@Test"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"fun"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"handleButtonClick_whenTodayDateNotNull"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"val"}]},{"type":"text","value":" testDate "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"2018-07-22\""}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"//Pretend here that some UseCase sets todayDate as testDate"}]},{"type":"text","value":"\n viewModel"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"todayDate "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" testDate\n viewModel"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"handleButtonClick"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"val"}]},{"type":"text","value":" argumentCaptor "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" ArgumentCaptor"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":"Command"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"LaunchNextActivity"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" \n ArgumentCaptor"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"forClass"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Command"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"LaunchNextActivity"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"::"}]},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"java"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n \n "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"verify"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mockCommand"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"times"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"setValue"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"argumentCaptor"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"capture"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n Assert"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"assertEquals"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"testDate"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" argumentCaptor"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"value"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"dateString"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"Mocking Dependencies"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"For us to verify "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"command"}]},{"type":"text","value":"’s function is being called, we need to mock it."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"kotlin"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-kotlin"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-kotlin"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","annotation","builtin"]},"children":[{"type":"text","value":"@Mock"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lateinit"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"var"}]},{"type":"text","value":" mockCommand "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" SingleLiveEvent"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":"Command"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"We want to override the "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"provideCommand()"}]},{"type":"text","value":" to get it to return "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"mockCommand"}]},{"type":"text","value":", so we need to mock our Injector as well. This "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"mockProvider"}]},{"type":"text","value":" is passed into our ViewModel, see line 5."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"kotlin"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-kotlin"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-kotlin"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","annotation","builtin"]},"children":[{"type":"text","value":"@Mock"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lateinit"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"var"}]},{"type":"text","value":" mockProvider"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" DependencyProvider\n"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":".."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"whenever"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mockProvider"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"getCommmand"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"thenReturn"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mockCommand"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"All these mocks will be initialised when the following function is called."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"kotlin"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-kotlin"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-kotlin"]},"children":[{"type":"text","value":"MockitoAnnotations"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"initMocks"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"this"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"There, we have bent the dependencies to our will, we can move on now."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"Verifying and Asserting"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Line 19. We can verify whether or not "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"setValue"}]},{"type":"text","value":" is being called by specifying "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"any()"}]},{"type":"text","value":". This means we do not really care about the value of the parameter that is passed into the "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"setValue"}]},{"type":"text","value":" function."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"kotlin"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-kotlin"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-kotlin"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"verify"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mockCommand"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"times"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"setValue"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"any"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"So to check that it is not called,"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"kotlin"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-kotlin"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-kotlin"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"verify"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mockCommand"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"times"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"setValue"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"any"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"However, we ARE concerned that the correct value is being used for "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"setValue()"}]},{"type":"text","value":". Mockito’s ArgumentCaptor class do that."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"They allow you to capture the variable that is being passed as an argument, for the function that you are verifying."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"kotlin"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-kotlin"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-kotlin"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"verify"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mockCommand"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"times"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"setValue"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"argumentCaptor"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"capture"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nAssert"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"assertEquals"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"testDate"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" argumentCaptor"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"value"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"dateString"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"After capturing, we can then perform simple assertions on the captured value."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"Summary"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kotlin’s sealed class can be used effectively to send events with parameters to View classes, from ViewModels."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"These sealed classes are wrapped with "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"SingleLiveEvent"}]},{"type":"text","value":" live data classes, so Views can create observers to observe changes in value."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"We can use Mockito’s ArgumentCaptors to capture what is being used to set these live data, thereby verifying the correctness of the function."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Original post by Boon Keat at "},{"type":"element","tagName":"a","properties":{"href":"https://medium.com/@bkteoz/using-mockitos-argumentcaptor-on-singleliveevent-8c1aa1fadfbd"},"children":[{"type":"text","value":"here"}]},{"type":"text","value":"."}]}]}],"data":{"quirksMode":false}},"excerpt":"A class is an observable live data that can be used to send events from ViewModel to View in Android MVVM-styled designs.This link…","timeToRead":4,"frontmatter":{"title":"Using Mockito's ArgumentCaptor on SingleLiveEvent","userDate":"10 October 2018","date":"2018-10-10T17:21:00.000Z","tags":["Android","Testing","Tutorial"],"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAgADBf/EABcBAAMBAAAAAAAAAAAAAAAAAAABAgP/2gAMAwEAAhADEAAAAU+M2Gxqz//EABkQAQEAAwEAAAAAAAAAAAAAAAIBAAMEEf/aAAgBAQABBQLQIl0GiQ3wqzHsSmf/xAAWEQEBAQAAAAAAAAAAAAAAAAARAAH/2gAIAQMBAT8BwJv/xAAWEQEBAQAAAAAAAAAAAAAAAAAAESH/2gAIAQIBAT8B1H//xAAcEAACAgIDAAAAAAAAAAAAAAAAASFBAxARQlL/2gAIAQEABj8CycrsNrzZRBOv/8QAHBABAAEEAwAAAAAAAAAAAAAAAQAQESFhMZGh/9oACAEBAAE/Ic7lodhS47RAT1OVOdwQJbbp/9oADAMBAAIAAwAAABBwH//EABcRAQADAAAAAAAAAAAAAAAAAAABETH/2gAIAQMBAT8Q1Ss//8QAFhEAAwAAAAAAAAAAAAAAAAAAARAh/9oACAECAQE/EDSf/8QAGxABAQADAQEBAAAAAAAAAAAAAREAITFRQXH/2gAIAQEAAT8QnlojNn4/MQFk9hRx777jIQnJxujdmMrgpzi1i1uf/9k=","aspectRatio":1.5005359056806002,"src":"/static/7c9ee95dd61b5588277447a33ccd293c/3dc2b/code-sunshine.jpg","srcSet":"/static/7c9ee95dd61b5588277447a33ccd293c/f8f18/code-sunshine.jpg 930w,\n/static/7c9ee95dd61b5588277447a33ccd293c/3dc2b/code-sunshine.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAADQElEQVQ4y5VUW0tUURSeX9BDhFZQ1Nx0lCAqI+o1KMiHoqjIesisXiLSQOhiRUWUdKEwKqKHtNIyJLuY0UWS0lBKM8mcrEadcnIc58zlzMyZvc/+WjNnRs+xIWjDd9a+fudba6+1TaAmhEDaCqESONItOZewCUitgK8JIu7TxrQXqbV0M00lSzd1LAgRiU5u/3oAaJ0NQcC7RYC/LXWOJz6ThHoVyX74GynpRKTuLZjTo815SNWzbIjuEsD7EqJjHUT7KoNnBoVpZer3G+DN+eBNNvD2Egh5BCLqAW9ZCf7YDBF0agTjXbRnAbkezESYikPIBfYgH+y+BawhD6x+LtjDAsJSxOutiN+zgPechWAyeNs+sNZiXagyEKq+Xig1dii386DcyiU4oFRbodwk1CT6dq1fnQv2vJiUj6cIVYNKk55dadyC6PnpiF3LRfRqziSu2Ak0d9mC2I0C6JtQVYNSk+Evsg9K035EKs2InLUhci6HrD0F6ldaEbmwEKz7HrjrHamUpqg0pM1kyrD3dxE+Ykb4mB3ho2nYaI5shQXhg3MRPmyGfGY5+OCHlFKuv+UUKY8nLR/8iFCZBaH9VoKN+glr11BK41KyZTkI7poBuaook8vCcFvypRIEts1EYLcdgRILAjttkLbOhlQ0C4EdiXEOrTlozxyEjhQaLsY0Nbjq7yE67IC00Qxps5VAZOvJxeNbET61HdKG+fCvyYK/MBv+1TMQa66ZcDkjIf/los02OmSBf62DDs2DtGkxVZCWxKy/G5HrZ+gHe6G8eWqoeWPp6SpGPl0O74JpGFuSBR/ZaHWVdiiuxTjW0o/QxeY0laEEDZeiksoEJYvTjTXeQfRkOeSG2mQ+CJ0XzOVBvGtgwk09x4TLqhCGhP1EKTaeXsO/21+PA1e1iVfOMRx94iT048SjPuyp68GL3l+Aux/MMwTuHqAS9UClOKveEaijbkpu+e/SYynC2x1uZB16gWXn2zA8JqO2043d9X2AxwnF/R3scwf4QE+SlH/rBet6TS/Q+NRLERPuDoyGUUHqVlxox6svXri8Mtp+kO+RAFQ5RCk1nCRQRwbpdZI0KNHMj4M+hr0/g8YY/UcM/wD4fYcC4gOWgAAAAABJRU5ErkJggg==","width":400,"height":400,"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png","srcSet":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png 1x,\n/static/7fa6bee9d2080bd021828c70f67a4720/fca9c/sphtech.png 1.5x"}}]}}}},"relatedPosts":{"totalCount":2,"edges":[{"node":{"id":"b29c15f7-9c98-53b0-a0cc-d9c54502b32a","timeToRead":3,"excerpt":"TL;DR Does asking users for feedback and ratings help in your app? Yes!When I joined Singapore Press Holdings in late 2015, most of the apps…","frontmatter":{"title":"How to get your mobile app users to give you ratings and feedback!"},"fields":{"slug":"/get-your-app-users-to-give-feedback/"}}},{"node":{"id":"12eeed0a-39f3-5439-83c9-9a5c79531c30","timeToRead":4,"excerpt":"A class is an observable live data that can be used to send events from ViewModel to View in Android MVVM-styled designs.This link…","frontmatter":{"title":"Using Mockito's ArgumentCaptor on SingleLiveEvent"},"fields":{"slug":"/using-mockitos-argumentcaptor/"}}}]}},"pageContext":{"isCreatedByStatefulCreatePages":false,"slug":"/using-mockitos-argumentcaptor/","prev":{"excerpt":"TL;DR Does asking users for feedback and ratings help in your app? Yes!When I joined Singapore Press Holdings in late 2015, most of the apps…","timeToRead":3,"frontmatter":{"title":"How to get your mobile app users to give you ratings and feedback!","tags":["Android"],"date":"2018-10-07T23:10:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"aspectRatio":2.074786324786325,"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAIAAAA7N+mxAAAACXBIWXMAAAsSAAALEgHS3X78AAABo0lEQVQoz2WRWW/TQBSF/c954kcgJErFA+ob8NBKhCVSaSsEArElJG3tZqkdjz2JZ+zZN+5MWoHEkT26tu935txx5pOcs7D4dAcfqGTHNxcvr8cv8ouPm5kzxqWvUsphGJzbQz7TWncdUUoj1HDOA8gHqfC8ev6rGq26dcso9IQkxhjA4V5Z8qNCYkKxMTaxwfWVRz9jZZzTVps7GEjghVI2JgkZvLLOaM2s0w7Sg4F3itJ+uVJaq3tZaxPcS6X+7lyjGmMshNTa7PtgMMDA6e5RKfAG0zYKN3V19Hnx4Hj26EOeQSsBUQJF+EdwdvsRQGjQiHLS7VqM2waNp7cH5/m7Ocogj4txwRoSG2h9Nh+flRMolIZtIYZkQgyCxyHgMsp7u7eNsA2euTiSSevDT4dPJ6+3QnFtwn/yKYwBCn6VNa7sFmf5qOPbTVd2TCxWj78WTw5/HJwUb98vT0eL0+/t9M3y/KQYf6m+HU1eTdFvqeOxZcqYpr3hXbHZrWtSlttbMeSKXqohJ/11Sy5rcrXaXlUkr/Cs7YtmN8X9mpt4QH8Ad7k0jshkD1kAAAAASUVORK5CYII=","sizes":"(max-width: 971px) 100vw, 971px","src":"/static/4d42232e07032296408b0a75d8f9815e/a83d1/zaobao-app-chart1.png","srcSet":"/static/4d42232e07032296408b0a75d8f9815e/4c9af/zaobao-app-chart1.png 930w,\n/static/4d42232e07032296408b0a75d8f9815e/a83d1/zaobao-app-chart1.png 971w"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/b4a08/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/get-your-app-users-to-give-feedback/"}},"next":{"excerpt":"Containerization has been one of the most talk about topics in the digital world. It enabled a whole new paradigm shift in getting software…","timeToRead":2,"frontmatter":{"title":"Docker workshop in SPH","tags":["Docker"],"date":"2018-11-27T11:06:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"aspectRatio":1.3333333333333333,"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAQBAgMF/8QAFgEBAQEAAAAAAAAAAAAAAAAAAQAC/9oADAMBAAIQAxAAAAHSOfXC0Lkf/8QAGBABAAMBAAAAAAAAAAAAAAAAAgABEhH/2gAIAQEAAQUCOLjJ5m4moTbOan//xAAWEQEBAQAAAAAAAAAAAAAAAAAAARL/2gAIAQMBAT8BZr//xAAXEQEAAwAAAAAAAAAAAAAAAAAAARIh/9oACAECAQE/AcWh/8QAGxAAAgIDAQAAAAAAAAAAAAAAAAERIQIiMkH/2gAIAQEABj8Ci5Nc0zpFPwtwdM//xAAbEAEBAQADAQEAAAAAAAAAAAABEQAhMUFx4f/aAAgBAQABPyEl3QNMM0vR81rOLjQlC9jIEfoufyN//9oADAMBAAIAAwAAABCAL//EABgRAAIDAAAAAAAAAAAAAAAAAAABESFh/9oACAEDAQE/EIbpGh//xAAYEQACAwAAAAAAAAAAAAAAAAAAAREhYf/aAAgBAgEBPxCUVmJ//8QAGxABAQACAwEAAAAAAAAAAAAAAREAITFBUWH/2gAIAQEAAT8QbJCQCVvU+YydZkj3BMNVBNOVRsBAXfyZuoUFFzxTBMS8DH//2Q==","sizes":"(max-width: 1400px) 100vw, 1400px","src":"/static/67c833d51f70a35acd4074e27a1b9a26/3dc2b/IMG_9175-1.jpg","srcSet":"/static/67c833d51f70a35acd4074e27a1b9a26/f8f18/IMG_9175-1.jpg 930w,\n/static/67c833d51f70a35acd4074e27a1b9a26/3dc2b/IMG_9175-1.jpg 1400w"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/b4a08/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/docker-workshop-in-sph/"}},"primaryTag":"Android"}}} \ No newline at end of file +{"componentChunkName":"component---src-templates-post-tsx","path":"/using-mockitos-argumentcaptor/","webpackCompilationHash":"4d127609ee78b8f0aee7","result":{"data":{"logo":{"childImageSharp":{"fixed":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsSAAALEgHS3X78AAABFUlEQVQY023PvUrDUBTA8ZuCtoMoOLQ4dWhN14x2kEKXFkGoohQ/QBexOHRycAidKkgHHRq69APRoTjFJYODIA6+gSBYfYMmfYLE/5VT6NALP845NyeHc9UoCHZRQvonCLKKE4ZhAXYURTsYoE9dIy5iCzfUJnEdV+RF4iu6ikFH2EPxazzOcJmg4Rnn5C8ysIEOHqTe5/sT3qXOwYOtRr5/wLAqzpCTDXu4p2ETtyjgGJ/cX+se8jeU9fa4RBt5vWENpjzdkoGPcGg4RQsbOMEFmnBRRwVDHEK/yFXfvr/CoPjvZLKcdByDyzWGeajigzorGy0oOeRJiUtITe/pX1XzDk3buIMltSFR/zTtic3060X+8z8PsEUt8G3LVQAAAABJRU5ErkJggg==","width":400,"height":128,"src":"/static/2b5eaa0de166a8b5faebad4955c2200c/647de/ghost-logo.png","srcSet":"/static/2b5eaa0de166a8b5faebad4955c2200c/647de/ghost-logo.png 1x"}}},"markdownRemark":{"html":"

A SingleLiveEvent class is an observable live data that can be used to send events from ViewModel to View in Android MVVM-styled designs.

\n

This link describes using Kotlin’s sealed data class with a SingleLiveEvent to create such a mechanism.

\n

I used that in one of my projects and ended up with a ViewModel that looks like this:

\n

ViewModel Class

\n
val command: SingleLiveEvent<Command> = dependencyProvider.getCommmand()\n\n// This value will be set by other business logic\nvar todayDate : String? = null\n\nfun handleButtonClick(){\n   todayDate?.let {\n      command.value = Command.LaunchNextActivity(it)\n   }\n}
\n

Command Sealed Class

\n
sealed class Command {\n    class LaunchNextActivity(val dateString : String) : Command()\n}
\n

How does it work?

\n

A user event will trigger this handleButtonClick() in my ViewModel class.

\n

It must then instruct a View to launch NextActivity using a variable todayDate.

\n

The todayDate value is set by some other UseCase class.

\n

I am using a simple Kotlin object class to provide dependencies, SingleLiveEvent<Command> type class being one of them.

\n
interface DependencyProvider {\n    fun getCommmand(): SingleLiveEvent<Command>\n}\n\nobject Injector : DependencyProvider {\n    override fun getCommmand(): SingleLiveEvent<Command> {\n        return SingleLiveEvent()\n    }\n}
\n

Writing a Unit Test

\n

When I am writing unit test, I often find myself stuck with the question, “What to check?” I usually got out by thinking inwardly and selfishly. What is the single concern for this function?

\n

So in this case, I am not concerned with who is observing this command event. But I am concerned about:

\n
    \n
  • command’s value being set with todayDate, if todayDate is not null.
  • \n
  • command’s setValue is not called when todayDate is null.
  • \n
\n

Let us address the first concern, which is to be able to verify that command’s setValue is being called.

\n
@Mock\nlateinit var mockProvider: DependencyProvider\n\n@Mock\nlateinit var mockCommand : SingleLiveEvent<Command>\n\n@Before\nfun setUp() {\n    MockitoAnnotations.initMocks(this)\n    whenever(mockProvider.getCommmand()).thenReturn(mockCommand)\n    viewModel = MyViewModel(mockProvider)\n}\n\n@Test\nfun handleButtonClick_whenTodayDateNotNull() {\n    val testDate = \"2018-07-22\"\n\n    //Pretend here that some UseCase sets todayDate as testDate\n    viewModel.todayDate = testDate\n    viewModel.handleButtonClick()\n\n    val argumentCaptor : ArgumentCaptor<Command.LaunchNextActivity> = \n            ArgumentCaptor.forClass(Command.LaunchNextActivity::class.java)\n  \n    verify(mockCommand, times(1)).setValue(argumentCaptor.capture())\n    Assert.assertEquals(testDate,  argumentCaptor.value.dateString)\n}
\n

Mocking Dependencies

\n

For us to verify command’s function is being called, we need to mock it.

\n
@Mock\nlateinit var mockCommand : SingleLiveEvent<Command>
\n

We want to override the provideCommand() to get it to return mockCommand, so we need to mock our Injector as well. This mockProvider is passed into our ViewModel, see line 5.

\n
@Mock\nlateinit var mockProvider: DependencyProvider\n...\nwhenever(mockProvider.getCommmand()).thenReturn(mockCommand)
\n

All these mocks will be initialised when the following function is called.

\n
MockitoAnnotations.initMocks(this)
\n

There, we have bent the dependencies to our will, we can move on now.

\n

Verifying and Asserting

\n

Line 19. We can verify whether or not setValue is being called by specifying any(). This means we do not really care about the value of the parameter that is passed into the setValue function.

\n
verify(mockCommand, times(1)).setValue(any())
\n

So to check that it is not called,

\n
verify(mockCommand, times(0)).setValue(any())
\n

However, we ARE concerned that the correct value is being used for setValue(). Mockito’s ArgumentCaptor class do that.

\n

They allow you to capture the variable that is being passed as an argument, for the function that you are verifying.

\n
verify(mockCommand, times(1)).setValue(argumentCaptor.capture())\nAssert.assertEquals(testDate, argumentCaptor.value.dateString)
\n

After capturing, we can then perform simple assertions on the captured value.

\n

Summary

\n

Kotlin’s sealed class can be used effectively to send events with parameters to View classes, from ViewModels.

\n

These sealed classes are wrapped with SingleLiveEvent live data classes, so Views can create observers to observe changes in value.

\n

We can use Mockito’s ArgumentCaptors to capture what is being used to set these live data, thereby verifying the correctness of the function.

\n

Original post by Boon Keat at here.

","htmlAst":{"type":"root","children":[{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"A "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"SingleLiveEvent"}]},{"type":"text","value":" class is an observable live data that can be used to send events from ViewModel to View in Android MVVM-styled designs."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"a","properties":{"href":"https://medium.com/@trionkidnapper/issuing-commands-from-a-viewmodel-using-kotlin-sealed-classes-f1bbab7d4979"},"children":[{"type":"text","value":"This link"}]},{"type":"text","value":" describes using Kotlin’s sealed data class with a "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"SingleLiveEvent"}]},{"type":"text","value":" to create such a mechanism."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"I used that in one of my projects and ended up with a ViewModel that looks like this:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h4","properties":{},"children":[{"type":"text","value":"ViewModel Class"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"kotlin"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-kotlin"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-kotlin"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"val"}]},{"type":"text","value":" command"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" SingleLiveEvent"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":"Command"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" dependencyProvider"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"getCommmand"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"// This value will be set by other business logic"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"var"}]},{"type":"text","value":" todayDate "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" String"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"?"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"null"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"fun"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"handleButtonClick"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n todayDate"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"?"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"let"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n command"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"value "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Command"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"LaunchNextActivity"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"it"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h4","properties":{},"children":[{"type":"text","value":"Command Sealed Class"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"kotlin"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-kotlin"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-kotlin"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"sealed"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" Command "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"LaunchNextActivity"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"val"}]},{"type":"text","value":" dateString "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" String"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"Command"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"How does it work?"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"A user event will trigger this "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"handleButtonClick()"}]},{"type":"text","value":" in my ViewModel class."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"It must then instruct a View to launch NextActivity using a variable "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"todayDate"}]},{"type":"text","value":"."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"The "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"todayDate"}]},{"type":"text","value":" value is set by some other UseCase class."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"I am using a simple Kotlin object class to provide dependencies, "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"SingleLiveEvent"}]},{"type":"text","value":" type class being one of them."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"kotlin"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-kotlin"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-kotlin"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"interface"}]},{"type":"text","value":" DependencyProvider "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"fun"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"getCommmand"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" SingleLiveEvent"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":"Command"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"object"}]},{"type":"text","value":" Injector "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" DependencyProvider "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"override"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"fun"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"getCommmand"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" SingleLiveEvent"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":"Command"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"SingleLiveEvent"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"Writing a Unit Test"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"When I am writing unit test, I often find myself stuck with the question, “What to check?” I usually got out by thinking inwardly and selfishly. What is the single concern for this function?"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"So in this case, I am not concerned with who is observing this command event. But I am concerned about:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"command"}]},{"type":"text","value":"’s value being set with "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"todayDate"}]},{"type":"text","value":", if "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"todayDate"}]},{"type":"text","value":" is not null."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"command"}]},{"type":"text","value":"’s "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"setValue"}]},{"type":"text","value":" is not called when "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"todayDate"}]},{"type":"text","value":" is null."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Let us address the first concern, which is to be able to verify that "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"command"}]},{"type":"text","value":"’s "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"setValue"}]},{"type":"text","value":" is being called."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"kotlin"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-kotlin"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-kotlin"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","annotation","builtin"]},"children":[{"type":"text","value":"@Mock"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lateinit"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"var"}]},{"type":"text","value":" mockProvider"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" DependencyProvider\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","annotation","builtin"]},"children":[{"type":"text","value":"@Mock"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lateinit"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"var"}]},{"type":"text","value":" mockCommand "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" SingleLiveEvent"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":"Command"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","annotation","builtin"]},"children":[{"type":"text","value":"@Before"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"fun"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"setUp"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n MockitoAnnotations"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"initMocks"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"this"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"whenever"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mockProvider"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"getCommmand"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"thenReturn"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mockCommand"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n viewModel "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"MyViewModel"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mockProvider"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","annotation","builtin"]},"children":[{"type":"text","value":"@Test"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"fun"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"handleButtonClick_whenTodayDateNotNull"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"val"}]},{"type":"text","value":" testDate "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"2018-07-22\""}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"//Pretend here that some UseCase sets todayDate as testDate"}]},{"type":"text","value":"\n viewModel"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"todayDate "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" testDate\n viewModel"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"handleButtonClick"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"val"}]},{"type":"text","value":" argumentCaptor "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" ArgumentCaptor"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":"Command"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"LaunchNextActivity"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" \n ArgumentCaptor"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"forClass"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Command"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"LaunchNextActivity"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"::"}]},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"class"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"java"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n \n "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"verify"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mockCommand"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"times"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"setValue"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"argumentCaptor"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"capture"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n Assert"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"assertEquals"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"testDate"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" argumentCaptor"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"value"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"dateString"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"Mocking Dependencies"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"For us to verify "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"command"}]},{"type":"text","value":"’s function is being called, we need to mock it."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"kotlin"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-kotlin"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-kotlin"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","annotation","builtin"]},"children":[{"type":"text","value":"@Mock"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lateinit"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"var"}]},{"type":"text","value":" mockCommand "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" SingleLiveEvent"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":"Command"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"We want to override the "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"provideCommand()"}]},{"type":"text","value":" to get it to return "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"mockCommand"}]},{"type":"text","value":", so we need to mock our Injector as well. This "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"mockProvider"}]},{"type":"text","value":" is passed into our ViewModel, see line 5."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"kotlin"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-kotlin"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-kotlin"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","annotation","builtin"]},"children":[{"type":"text","value":"@Mock"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"lateinit"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"var"}]},{"type":"text","value":" mockProvider"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" DependencyProvider\n"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":".."}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"whenever"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mockProvider"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"getCommmand"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"thenReturn"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mockCommand"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"All these mocks will be initialised when the following function is called."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"kotlin"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-kotlin"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-kotlin"]},"children":[{"type":"text","value":"MockitoAnnotations"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"initMocks"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"this"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"There, we have bent the dependencies to our will, we can move on now."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"Verifying and Asserting"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Line 19. We can verify whether or not "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"setValue"}]},{"type":"text","value":" is being called by specifying "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"any()"}]},{"type":"text","value":". This means we do not really care about the value of the parameter that is passed into the "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"setValue"}]},{"type":"text","value":" function."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"kotlin"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-kotlin"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-kotlin"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"verify"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mockCommand"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"times"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"setValue"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"any"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"So to check that it is not called,"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"kotlin"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-kotlin"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-kotlin"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"verify"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mockCommand"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"times"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"setValue"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"any"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"However, we ARE concerned that the correct value is being used for "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"setValue()"}]},{"type":"text","value":". Mockito’s ArgumentCaptor class do that."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"They allow you to capture the variable that is being passed as an argument, for the function that you are verifying."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"kotlin"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-kotlin"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-kotlin"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"verify"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"mockCommand"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"times"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"setValue"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"argumentCaptor"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"capture"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nAssert"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"assertEquals"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"testDate"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" argumentCaptor"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"value"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"dateString"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"After capturing, we can then perform simple assertions on the captured value."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{},"children":[{"type":"text","value":"Summary"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Kotlin’s sealed class can be used effectively to send events with parameters to View classes, from ViewModels."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"These sealed classes are wrapped with "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"SingleLiveEvent"}]},{"type":"text","value":" live data classes, so Views can create observers to observe changes in value."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"We can use Mockito’s ArgumentCaptors to capture what is being used to set these live data, thereby verifying the correctness of the function."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Original post by Boon Keat at "},{"type":"element","tagName":"a","properties":{"href":"https://medium.com/@bkteoz/using-mockitos-argumentcaptor-on-singleliveevent-8c1aa1fadfbd"},"children":[{"type":"text","value":"here"}]},{"type":"text","value":"."}]}]}],"data":{"quirksMode":false}},"excerpt":"A class is an observable live data that can be used to send events from ViewModel to View in Android MVVM-styled designs.This link…","timeToRead":4,"frontmatter":{"title":"Using Mockito's ArgumentCaptor on SingleLiveEvent","userDate":"10 October 2018","date":"2018-10-10T17:21:00.000Z","tags":["Android","Testing","Tutorial"],"image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAgADBf/EABcBAAMBAAAAAAAAAAAAAAAAAAABAgP/2gAMAwEAAhADEAAAAU+M2Gxqz//EABkQAQEAAwEAAAAAAAAAAAAAAAIBAAMEEf/aAAgBAQABBQLQIl0GiQ3wqzHsSmf/xAAWEQEBAQAAAAAAAAAAAAAAAAARAAH/2gAIAQMBAT8BwJv/xAAWEQEBAQAAAAAAAAAAAAAAAAAAESH/2gAIAQIBAT8B1H//xAAcEAACAgIDAAAAAAAAAAAAAAAAASFBAxARQlL/2gAIAQEABj8CycrsNrzZRBOv/8QAHBABAAEEAwAAAAAAAAAAAAAAAQAQESFhMZGh/9oACAEBAAE/Ic7lodhS47RAT1OVOdwQJbbp/9oADAMBAAIAAwAAABBwH//EABcRAQADAAAAAAAAAAAAAAAAAAABETH/2gAIAQMBAT8Q1Ss//8QAFhEAAwAAAAAAAAAAAAAAAAAAARAh/9oACAECAQE/EDSf/8QAGxABAQADAQEBAAAAAAAAAAAAAREAITFRQXH/2gAIAQEAAT8QnlojNn4/MQFk9hRx777jIQnJxujdmMrgpzi1i1uf/9k=","aspectRatio":1.5005359056806002,"src":"/static/7c9ee95dd61b5588277447a33ccd293c/3dc2b/code-sunshine.jpg","srcSet":"/static/7c9ee95dd61b5588277447a33ccd293c/f8f18/code-sunshine.jpg 930w,\n/static/7c9ee95dd61b5588277447a33ccd293c/3dc2b/code-sunshine.jpg 1400w","sizes":"(max-width: 1400px) 100vw, 1400px"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"__typename":"ImageSharp","fixed":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAADQElEQVQ4y5VUW0tUURSeX9BDhFZQ1Nx0lCAqI+o1KMiHoqjIesisXiLSQOhiRUWUdKEwKqKHtNIyJLuY0UWS0lBKM8mcrEadcnIc58zlzMyZvc/+WjNnRs+xIWjDd9a+fudba6+1TaAmhEDaCqESONItOZewCUitgK8JIu7TxrQXqbV0M00lSzd1LAgRiU5u/3oAaJ0NQcC7RYC/LXWOJz6ThHoVyX74GynpRKTuLZjTo815SNWzbIjuEsD7EqJjHUT7KoNnBoVpZer3G+DN+eBNNvD2Egh5BCLqAW9ZCf7YDBF0agTjXbRnAbkezESYikPIBfYgH+y+BawhD6x+LtjDAsJSxOutiN+zgPechWAyeNs+sNZiXagyEKq+Xig1dii386DcyiU4oFRbodwk1CT6dq1fnQv2vJiUj6cIVYNKk55dadyC6PnpiF3LRfRqziSu2Ak0d9mC2I0C6JtQVYNSk+Evsg9K035EKs2InLUhci6HrD0F6ldaEbmwEKz7HrjrHamUpqg0pM1kyrD3dxE+Ykb4mB3ho2nYaI5shQXhg3MRPmyGfGY5+OCHlFKuv+UUKY8nLR/8iFCZBaH9VoKN+glr11BK41KyZTkI7poBuaook8vCcFvypRIEts1EYLcdgRILAjttkLbOhlQ0C4EdiXEOrTlozxyEjhQaLsY0Nbjq7yE67IC00Qxps5VAZOvJxeNbET61HdKG+fCvyYK/MBv+1TMQa66ZcDkjIf/los02OmSBf62DDs2DtGkxVZCWxKy/G5HrZ+gHe6G8eWqoeWPp6SpGPl0O74JpGFuSBR/ZaHWVdiiuxTjW0o/QxeY0laEEDZeiksoEJYvTjTXeQfRkOeSG2mQ+CJ0XzOVBvGtgwk09x4TLqhCGhP1EKTaeXsO/21+PA1e1iVfOMRx94iT048SjPuyp68GL3l+Aux/MMwTuHqAS9UClOKveEaijbkpu+e/SYynC2x1uZB16gWXn2zA8JqO2043d9X2AxwnF/R3scwf4QE+SlH/rBet6TS/Q+NRLERPuDoyGUUHqVlxox6svXri8Mtp+kO+RAFQ5RCk1nCRQRwbpdZI0KNHMj4M+hr0/g8YY/UcM/wD4fYcC4gOWgAAAAABJRU5ErkJggg==","width":400,"height":400,"src":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png","srcSet":"/static/7fa6bee9d2080bd021828c70f67a4720/4e842/sphtech.png 1x,\n/static/7fa6bee9d2080bd021828c70f67a4720/fca9c/sphtech.png 1.5x"}}]}}}},"relatedPosts":{"totalCount":2,"edges":[{"node":{"id":"b29c15f7-9c98-53b0-a0cc-d9c54502b32a","timeToRead":3,"excerpt":"TL;DR Does asking users for feedback and ratings help in your app? Yes!When I joined Singapore Press Holdings in late 2015, most of the apps…","frontmatter":{"title":"How to get your mobile app users to give you ratings and feedback!"},"fields":{"slug":"/get-your-app-users-to-give-feedback/"}}},{"node":{"id":"12eeed0a-39f3-5439-83c9-9a5c79531c30","timeToRead":4,"excerpt":"A class is an observable live data that can be used to send events from ViewModel to View in Android MVVM-styled designs.This link…","frontmatter":{"title":"Using Mockito's ArgumentCaptor on SingleLiveEvent"},"fields":{"slug":"/using-mockitos-argumentcaptor/"}}}]}},"pageContext":{"isCreatedByStatefulCreatePages":false,"slug":"/using-mockitos-argumentcaptor/","prev":{"excerpt":"TL;DR Does asking users for feedback and ratings help in your app? Yes!When I joined Singapore Press Holdings in late 2015, most of the apps…","timeToRead":3,"frontmatter":{"title":"How to get your mobile app users to give you ratings and feedback!","tags":["Android"],"date":"2018-10-07T23:10:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"aspectRatio":2.074786324786325,"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAIAAAA7N+mxAAAACXBIWXMAAAsSAAALEgHS3X78AAABo0lEQVQoz2WRWW/TQBSF/c954kcgJErFA+ob8NBKhCVSaSsEArElJG3tZqkdjz2JZ+zZN+5MWoHEkT26tu935txx5pOcs7D4dAcfqGTHNxcvr8cv8ouPm5kzxqWvUsphGJzbQz7TWncdUUoj1HDOA8gHqfC8ev6rGq26dcso9IQkxhjA4V5Z8qNCYkKxMTaxwfWVRz9jZZzTVps7GEjghVI2JgkZvLLOaM2s0w7Sg4F3itJ+uVJaq3tZaxPcS6X+7lyjGmMshNTa7PtgMMDA6e5RKfAG0zYKN3V19Hnx4Hj26EOeQSsBUQJF+EdwdvsRQGjQiHLS7VqM2waNp7cH5/m7Ocogj4txwRoSG2h9Nh+flRMolIZtIYZkQgyCxyHgMsp7u7eNsA2euTiSSevDT4dPJ6+3QnFtwn/yKYwBCn6VNa7sFmf5qOPbTVd2TCxWj78WTw5/HJwUb98vT0eL0+/t9M3y/KQYf6m+HU1eTdFvqeOxZcqYpr3hXbHZrWtSlttbMeSKXqohJ/11Sy5rcrXaXlUkr/Cs7YtmN8X9mpt4QH8Ad7k0jshkD1kAAAAASUVORK5CYII=","sizes":"(max-width: 971px) 100vw, 971px","src":"/static/4d42232e07032296408b0a75d8f9815e/a83d1/zaobao-app-chart1.png","srcSet":"/static/4d42232e07032296408b0a75d8f9815e/4c9af/zaobao-app-chart1.png 930w,\n/static/4d42232e07032296408b0a75d8f9815e/a83d1/zaobao-app-chart1.png 971w"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/b4a08/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/get-your-app-users-to-give-feedback/"}},"next":{"excerpt":"Containerization has been one of the most talk about topics in the digital world. It enabled a whole new paradigm shift in getting software…","timeToRead":2,"frontmatter":{"title":"Docker workshop in SPH","tags":["Docker"],"date":"2018-11-27T11:06:00.000Z","draft":null,"image":{"childImageSharp":{"fluid":{"aspectRatio":1.3333333333333333,"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAQBAgMF/8QAFgEBAQEAAAAAAAAAAAAAAAAAAQAC/9oADAMBAAIQAxAAAAHSOfXC0Lkf/8QAGBABAAMBAAAAAAAAAAAAAAAAAgABEhH/2gAIAQEAAQUCOLjJ5m4moTbOan//xAAWEQEBAQAAAAAAAAAAAAAAAAAAARL/2gAIAQMBAT8BZr//xAAXEQEAAwAAAAAAAAAAAAAAAAAAARIh/9oACAECAQE/AcWh/8QAGxAAAgIDAQAAAAAAAAAAAAAAAAERIQIiMkH/2gAIAQEABj8Ci5Nc0zpFPwtwdM//xAAbEAEBAQADAQEAAAAAAAAAAAABEQAhMUFx4f/aAAgBAQABPyEl3QNMM0vR81rOLjQlC9jIEfoufyN//9oADAMBAAIAAwAAABCAL//EABgRAAIDAAAAAAAAAAAAAAAAAAABESFh/9oACAEDAQE/EIbpGh//xAAYEQACAwAAAAAAAAAAAAAAAAAAAREhYf/aAAgBAgEBPxCUVmJ//8QAGxABAQACAwEAAAAAAAAAAAAAAREAITFBUWH/2gAIAQEAAT8QbJCQCVvU+YydZkj3BMNVBNOVRsBAXfyZuoUFFzxTBMS8DH//2Q==","sizes":"(max-width: 1400px) 100vw, 1400px","src":"/static/67c833d51f70a35acd4074e27a1b9a26/3dc2b/IMG_9175-1.jpg","srcSet":"/static/67c833d51f70a35acd4074e27a1b9a26/f8f18/IMG_9175-1.jpg 930w,\n/static/67c833d51f70a35acd4074e27a1b9a26/3dc2b/IMG_9175-1.jpg 1400w"}}},"author":{"id":"SPHTech","bio":null,"avatar":{"children":[{"fixed":{"src":"/static/7fa6bee9d2080bd021828c70f67a4720/b4a08/sphtech.png"}}]}}},"fields":{"layout":"post","slug":"/docker-workshop-in-sph/"}},"primaryTag":"Android"}}} \ No newline at end of file diff --git a/page-data/video-review-carousell-level-up/page-data.json b/page-data/video-review-carousell-level-up/page-data.json index df5a17a..5109ad6 100644 --- a/page-data/video-review-carousell-level-up/page-data.json +++ b/page-data/video-review-carousell-level-up/page-data.json @@ -1 +1 @@ -{"componentChunkName":"component---src-templates-post-tsx","path":"/video-review-carousell-level-up/","webpackCompilationHash":"e6542130e6dfe73197bb","result":{"data":{"logo":{"childImageSharp":{"fixed":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsSAAALEgHS3X78AAABFUlEQVQY023PvUrDUBTA8ZuCtoMoOLQ4dWhN14x2kEKXFkGoohQ/QBexOHRycAidKkgHHRq69APRoTjFJYODIA6+gSBYfYMmfYLE/5VT6NALP845NyeHc9UoCHZRQvonCLKKE4ZhAXYURTsYoE9dIy5iCzfUJnEdV+RF4iu6ikFH2EPxazzOcJmg4Rnn5C8ysIEOHqTe5/sT3qXOwYOtRr5/wLAqzpCTDXu4p2ETtyjgGJ/cX+se8jeU9fa4RBt5vWENpjzdkoGPcGg4RQsbOMEFmnBRRwVDHEK/yFXfvr/CoPjvZLKcdByDyzWGeajigzorGy0oOeRJiUtITe/pX1XzDk3buIMltSFR/zTtic3060X+8z8PsEUt8G3LVQAAAABJRU5ErkJggg==","width":400,"height":128,"src":"/static/2b5eaa0de166a8b5faebad4955c2200c/647de/ghost-logo.png","srcSet":"/static/2b5eaa0de166a8b5faebad4955c2200c/647de/ghost-logo.png 1x"}}},"markdownRemark":{"html":"

Hi all! It has been a while since some of us have gone for the Scrum training by Mr Stuart, building balloon animal zoos to learn what is Scrum, and how to operate in a Scrum team. While I personally find the concepts he delivered enriching, some of his answers to our bread-and-butter issues seemed slightly aloof and less than motivating (for example, “some companies spend years doing Agile but still could not get it right”). Nevertheless, I believe being Agile is still the right way to go.

\n\n \n \n \n \n

However, after watching this video, the 2nd part of a 4-part series, my mind is leaping with joy, exclaiming “Yes, yes! This is the way! We should do something like that!” Below is a summary of the salient points, and my thoughts as well.

\n

Using the Gherkin language to write User Stories

\n

We have heard, that when the Product Owner generates requirements for the sprint, it is better to write user stories so as to paint a clearer and more concrete picture of what is the desired (and accepted) outcome of the requirements. However, the technique of writing user stories remains slightly vague and uncertain. In this video (from the 19:00 mark), the presenter introduced the Gherkin language, a formalised structure of writing user stories, so formalised that it can be automatically translated into programming test scripts, and tested on the final application to validate if the application has met the user story’s requirements. As an engineer, this automated human language processing/testing is thrilling!

\n

\n \n \n \n \n \n \n
A 3 line user story
\n

\n

\n \n \n \n \n \n \n
A 3 line user story
\n

\n

\n \n \n \n \n \n \n
Mr Fowler mimicking Uncle Bob.
\n

\n

He reasoned that for non technical people such as business owners, they have their set of problems to address and targets to meet. When they look at software as a product, they would view the customer facing features and the underlying software quality as items that are “tradable”. Taking 3 main points — Pleasant user interface, Few defects, Good modular architecture — as example, it would be common for business owners to draw the line and separate Good modular architecture from the other two.

\n

\n \n \n \n \n \n \n
The 2 chart lines for Design Stamina Hypothesis.
\n

\n

Software projects which took care to set up a good design architecture may have relatively lesser features at the beginning of the project. However, because it was built with proper workflows and steady foundations, it would quickly catch up and surpass the growth rate of the former project steadily.

\n

He gave another analogy of how software development can be viewed as a bank account with existing debts. When each new feature is built on to the software, one can choose either to incur more debt on top of this principal amount, or pay off a portion of it: that choice depends on the quality of the code that implemented the feature.

\n

\n \n \n \n \n \n \n
The Technical Debt Quadrant.
\n

\n

There would also be people who are totally unaware of software development best practices and the technical debt they are incurring, hence reckless but inadvertent in nature, as they do not know what they not know. What would be more upsetting, would be people who are aware of their debt, but wilfully choose not to do anything about it, essentially being deliberately reckless about the matter.

\n

One can only get away from the consequences of such wilful stubbornness, when the term of the project is short-lived — short enough before the Design Payoff Line intersects with the project’s velocity curve. This may apply to one-off campaign-related short projects, which one does not need to worry about maintenance.

\n

\n \n \n \n \n \n \n
Mr Fowler mimicking Uncle Bob.
\n

\n

He reasoned that for non technical people such as business owners, they have their set of problems to address and targets to meet. When they look at software as a product, they would view the customer facing features and the underlying software quality as items that are “tradable”. Taking 3 main points — Pleasant user interface, Few defects, Good modular architecture — as example, it would be common for business owners to draw the line and separate Good modular architecture from the other two.

\n

\n \n \n \n \n \n \n
The 2 chart lines for Design Stamina Hypothesis.
\n

\n

Software projects which took care to set up a good design architecture may have relatively lesser features at the beginning of the project. However, because it was built with proper workflows and steady foundations, it would quickly catch up and surpass the growth rate of the former project steadily.

\n

He gave another analogy of how software development can be viewed as a bank account with existing debts. When each new feature is built on to the software, one can choose either to incur more debt on top of this principal amount, or pay off a portion of it: that choice depends on the quality of the code that implemented the feature.

\n

\n \n \n \n \n \n \n
The Technical Debt Quadrant.
\n

\n

There would also be people who are totally unaware of software development best practices and the technical debt they are incurring, hence reckless but inadvertent in nature, as they do not know what they not know. What would be more upsetting, would be people who are aware of their debt, but wilfully choose not to do anything about it, essentially being deliberately reckless about the matter.

\n

One can only get away from the consequences of such wilful stubbornness, when the term of the project is short-lived — short enough before the Design Payoff Line intersects with the project’s velocity curve. This may apply to one-off campaign-related short projects, which one does not need to worry about maintenance.

\n

\n \n \n

Revitalizing our engineering - Engineering 2.0

Review

XConf Review - Economics of Software Quality

Mr Martin Fowler was one of the founding members of the Agile Manifesto, author of many books including my favourite Refactoring (1st…

  • SPHTech
    SPHTech
4 min read
\ No newline at end of file diff --git a/rss.xml b/rss.xml index 50a95d6..4da7f89 100644 --- a/rss.xml +++ b/rss.xml @@ -1,4 +1,4 @@ -<![CDATA[SPHTech Blog]]>https://sphtech.github.ioRSS for NodeThu, 11 Jul 2019 04:51:14 GMT<![CDATA[XConf Review - Economics of Software Quality]]>https://sphtech.github.io/xconf-economics-of-software-quality/https://sphtech.github.io/xconf-economics-of-software-quality/Mon, 29 Apr 2019 12:46:00 GMT<p>Mr Martin Fowler was one of the founding members of the Agile Manifesto, author of many books including my favourite Refactoring (1st edition was written in Java, and the latest edition in Javascript), and a great speaker at many conferences. I learned a lot from watching his talks at the previous GOTO conferences. Hence, when I found out that he is coming to Singapore to speak at the first Singapore’s XConf, I immediately signed up for the tickets.</p> +<![CDATA[SPHTech Blog]]>https://sphtech.github.ioRSS for NodeSat, 14 Mar 2020 06:07:39 GMT<![CDATA[XConf Review - Economics of Software Quality]]>https://sphtech.github.io/xconf-economics-of-software-quality/https://sphtech.github.io/xconf-economics-of-software-quality/Mon, 29 Apr 2019 12:46:00 GMT<p>Mr Martin Fowler was one of the founding members of the Agile Manifesto, author of many books including my favourite Refactoring (1st edition was written in Java, and the latest edition in Javascript), and a great speaker at many conferences. I learned a lot from watching his talks at the previous GOTO conferences. Hence, when I found out that he is coming to Singapore to speak at the first Singapore’s XConf, I immediately signed up for the tickets.</p> <p><figure class="gatsby-resp-image-figure" style=""> <a class="gatsby-resp-image-link" diff --git a/tags/android/index.html b/tags/android/index.html index 3b23042..9fa3740 100644 --- a/tags/android/index.html +++ b/tags/android/index.html @@ -13,9 +13,9 @@ } -

Android

A collection of 2 posts

Using Mockito's ArgumentCaptor on SingleLiveEvent cover image
Android

How to get your mobile app users to give you ratings and feedback!

TL;DR Does asking users for feedback and ratings help in your app? Yes!When I joined Singapore Press Holdings in late 2015, most of the apps…

  • SPHTech
    SPHTech
3 min read
\ No newline at end of file diff --git a/tags/docker/index.html b/tags/docker/index.html index fcac50c..8c49ce7 100644 --- a/tags/docker/index.html +++ b/tags/docker/index.html @@ -13,7 +13,7 @@ } -

Docker

A collection of 1 post

Docker workshop in SPH cover image
Docker

Docker workshop in SPH

Containerization has been one of the most talk about topics in the digital world. It enabled a whole new paradigm shift in getting software…

  • SPHTech
    SPHTech
2 min read
\ No newline at end of file diff --git a/tags/meetup/index.html b/tags/meetup/index.html index c6b14fc..6b5fded 100644 --- a/tags/meetup/index.html +++ b/tags/meetup/index.html @@ -13,7 +13,7 @@ } -

Meetup

A collection of 4 posts

Towards a Privacy Aware Smart Nation cover image
Review

Video Review - Carousell Level-Up: Applying Scrum for Better Delivery

Hi all! It has been a while since some of us have gone for the Scrum training by Mr Stuart, building balloon animal zoos to learn what is…

  • SPHTech
    SPHTech
3 min read
\ No newline at end of file diff --git a/tags/review/index.html b/tags/review/index.html index 52438c8..6ba7960 100644 --- a/tags/review/index.html +++ b/tags/review/index.html @@ -13,7 +13,7 @@ } -

Review

A collection of 3 posts

XConf Review - Economics of Software Quality cover image
Review

Video Review - Carousell Level-Up: Applying Scrum for Better Delivery

Hi all! It has been a while since some of us have gone for the Scrum training by Mr Stuart, building balloon animal zoos to learn what is…

  • SPHTech
    SPHTech
3 min read
\ No newline at end of file diff --git a/tags/reviews/index.html b/tags/reviews/index.html index b24e8ce..6fa1475 100644 --- a/tags/reviews/index.html +++ b/tags/reviews/index.html @@ -13,7 +13,7 @@ } -

Reviews

A collection of 1 post

Developers Gym by Thoughtworks - 14 July cover image
Meetup

Developers Gym by Thoughtworks - 14 July

This was the second Developers Gym session organized by Thoughtworks, of which we were honoured to play host to. The coding dojo, formulated…

  • SPHTech
    SPHTech
2 min read
\ No newline at end of file diff --git a/tags/testing/index.html b/tags/testing/index.html index 05782c0..2194791 100644 --- a/tags/testing/index.html +++ b/tags/testing/index.html @@ -13,10 +13,10 @@ } -

Testing

A collection of 2 posts

The developer's role in a successful implementation of the test automation cover image
Android

Using Mockito's ArgumentCaptor on SingleLiveEvent

A class is an observable live data that can be used to send events from ViewModel to View in Android MVVM-styled designs.This link…

  • SPHTech
    SPHTech
4 min read
\ No newline at end of file diff --git a/tags/tutorial/index.html b/tags/tutorial/index.html index 0f766ea..32289d2 100644 --- a/tags/tutorial/index.html +++ b/tags/tutorial/index.html @@ -13,7 +13,7 @@ } -

Tutorial

A collection of 1 post

Using Mockito's ArgumentCaptor on SingleLiveEvent cover image
Android

Using Mockito's ArgumentCaptor on SingleLiveEvent

A class is an observable live data that can be used to send events from ViewModel to View in Android MVVM-styled designs.This link…

  • SPHTech
    SPHTech
4 min read
\ No newline at end of file diff --git a/towards-a-privacy-aware-smart-nation/index.html b/towards-a-privacy-aware-smart-nation/index.html index ce1af8d..52be7bc 100644 --- a/towards-a-privacy-aware-smart-nation/index.html +++ b/towards-a-privacy-aware-smart-nation/index.html @@ -13,10 +13,10 @@ } -
/Meetup

Towards a Privacy Aware Smart Nation

Testing

The developer's role in a successful implementation of the test automation

Rod Michael, director of global market access strategy and channels at Rockwell Automation, famously said, “If you automate a mess, you get…

  • SPHTech
    SPHTech
3 min read
\ No newline at end of file diff --git a/updates-to-govtech-agile-practices/index.html b/updates-to-govtech-agile-practices/index.html index c3fd820..ad472f4 100644 --- a/updates-to-govtech-agile-practices/index.html +++ b/updates-to-govtech-agile-practices/index.html @@ -13,7 +13,7 @@ } -
/Meetup

Updates to Govtech Agile Practices by Steven Koh - 2 July

Meetup

Developers Gym by Thoughtworks - 14 July

This was the second Developers Gym session organized by Thoughtworks, of which we were honoured to play host to. The coding dojo, formulated…

  • SPHTech
    SPHTech
2 min read
\ No newline at end of file diff --git a/using-mockitos-argumentcaptor/index.html b/using-mockitos-argumentcaptor/index.html index 9f8c91d..cdd1bf4 100644 --- a/using-mockitos-argumentcaptor/index.html +++ b/using-mockitos-argumentcaptor/index.html @@ -13,7 +13,7 @@ } -
/Android

Using Mockito's ArgumentCaptor on SingleLiveEvent

Docker

Docker workshop in SPH

Containerization has been one of the most talk about topics in the digital world. It enabled a whole new paradigm shift in getting software…

  • SPHTech
    SPHTech
2 min read
\ No newline at end of file diff --git a/video-review-carousell-level-up/index.html b/video-review-carousell-level-up/index.html index 0287376..34a1b14 100644 --- a/video-review-carousell-level-up/index.html +++ b/video-review-carousell-level-up/index.html @@ -13,7 +13,7 @@ } -
/Review

Video Review - Carousell Level-Up: Applying Scrum for Better Delivery

Hi all! It has been a while since some of us have gone for the Scrum training by Mr Stuart, building balloon animal zoos to learn what is Scrum, and how to operate in a Scrum team. While I personally find the concepts he delivered enriching, some of his answers to our bread-and-butter issues seemed slightly aloof and less than motivating (for example, “some companies spend years doing Agile but still could not get it right”). Nevertheless, I believe being Agile is still the right way to go.

+
/Review

Video Review - Carousell Level-Up: Applying Scrum for Better Delivery

Hi all! It has been a while since some of us have gone for the Scrum training by Mr Stuart, building balloon animal zoos to learn what is Scrum, and how to operate in a Scrum team. While I personally find the concepts he delivered enriching, some of his answers to our bread-and-butter issues seemed slightly aloof and less than motivating (for example, “some companies spend years doing Agile but still could not get it right”). Nevertheless, I believe being Agile is still the right way to go.

@@ -45,4 +45,4 @@

“Have the movie played out in your mind”

Another captivating concept raised by the presenter, is that for the Product Owner to steer the direction of the product, he/she should have envisioned how the end product is going to look and feel like — in the presenter’s analogy, the director having the whole movie played out in his mind before entering the studio to direct the shoot.

I agree with the presenter almost whole-heartedly, except that when we put matters into context, the Product Owner is required to please the needs of the stakeholders/funders and not just the end users. From time to time, the stakeholders can be vague in terms of what they want, expecting the Product Owner to make sense of the fuzziness and deliver the desired. Hence I feel, everyone — not just the scrum team, but also the stakeholders — can take a tip or two from the process of writing Gherkin user stories, to better communicate their needs, goals and plans to fellow colleagues. Help our Product Owners, and we can grow our products together!

In any case, this is only the 2nd parter of a 4-part series. If you have time on Thursdays, do go attend the talk and ask questions!

SPHTech

SPHTech

Read more posts by this author.

Read More
\ No newline at end of file +/static/9bea42284114acb5ba9e14a5fe42867c/3dc2b/INMANews-ArtificialIntelligence-1800.jpg 1400w" src="/static/9bea42284114acb5ba9e14a5fe42867c/3dc2b/INMANews-ArtificialIntelligence-1800.jpg" alt="AI in News Media cover image" style="position:absolute;top:0;left:0;opacity:1;width:100%;height:100%;object-fit:cover;object-position:center"/>

AI in News Media

IntroductionNews media companies like Singapore Press Holdings (SPH) continue to be faced with rapidly accelerating technology innovation…

  • SPHTech
    SPHTech
3 min read
\ No newline at end of file diff --git a/webpack-runtime-cd17ebf3c9cfbf128ad8.js b/webpack-runtime-8cc2fdfbbb1d7fe20dec.js similarity index 93% rename from webpack-runtime-cd17ebf3c9cfbf128ad8.js rename to webpack-runtime-8cc2fdfbbb1d7fe20dec.js index d35af11..21b9683 100644 --- a/webpack-runtime-cd17ebf3c9cfbf128ad8.js +++ b/webpack-runtime-8cc2fdfbbb1d7fe20dec.js @@ -1,2 +1,2 @@ -!function(e){function t(t){for(var r,a,u=t[0],f=t[1],s=t[2],p=0,l=[];p
Review

XConf Review - Economics of Software Quality

Revitalizing our engineering - Engineering 2.0

We developed a News Tablet application for the Samsung Knox recently, and we are able to institute the various good engineering practices…

  • SPHTech
    SPHTech
6 min read
\ No newline at end of file