tag:blogger.com,1999:blog-32832252442637091412024-03-12T16:36:32.556-07:00Salesforce Ninja: An Elite Blog about Salesforce.comA blog about Cloud Computing, Social Media, Mobile Innovation, Customer Relationship management, Force.com, Salesforce.com
Siddhesh Kabehttp://www.blogger.com/profile/05949517024873104589noreply@blogger.comBlogger107125tag:blogger.com,1999:blog-3283225244263709141.post-77153882934628606732023-11-28T07:08:00.000-08:002023-11-28T07:40:11.086-08:00When nothing else works- Kobayashi Maru<p style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #0e101a; margin-bottom: 0pt; margin-top: 0pt;"></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEGOlEZWJa6FnqI5zxfx55CkjhkwFM73ou0Xeg6AJ2_GImCoarQvf0nfI0GnZVLYbr23CyOrzBgxLn1LJQJxHtIP2Vp3sECeaVX-BU0ra5DbM6h5x8Cq_U3f31toE2qyZ0hDW-zQKkjvSUCzdPsUPQ2DIiLjADfljD7VIqvySn-vgyi24F7L4Z5IOYUx4/s5472/StockSnap_NQQ2PJW1JM.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="3648" data-original-width="5472" height="426" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEGOlEZWJa6FnqI5zxfx55CkjhkwFM73ou0Xeg6AJ2_GImCoarQvf0nfI0GnZVLYbr23CyOrzBgxLn1LJQJxHtIP2Vp3sECeaVX-BU0ra5DbM6h5x8Cq_U3f31toE2qyZ0hDW-zQKkjvSUCzdPsUPQ2DIiLjADfljD7VIqvySn-vgyi24F7L4Z5IOYUx4/w640-h426/StockSnap_NQQ2PJW1JM.jpg" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Photo by <a href="https://stocksnap.io/author/1949" rel="nofollow" target="_blank">Startup Stock Photos</a> on <a href="http://Stocksnap.io">Stocksnap.io</a></td></tr></tbody></table><span data-preserver-spaces="true" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; margin-bottom: 0pt; margin-top: 0pt;"><br /></span><p></p><p style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #0e101a; margin-bottom: 0pt; margin-top: 0pt;"><span data-preserver-spaces="true" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; margin-bottom: 0pt; margin-top: 0pt;">The environment was tense and nerve-wracking. Freshly dry-cleaned suit, neatly creased pants and lightly gelled hair, everything I could prepare for a new job was engineered for perfection. I even had a brand new ball pen with a brand of the technology I was here to consult about. The funny thing about the pen last evening: I travelled one and a half hours on the sweaty London Tube, battling my fear of bed bugs. As I said, I had everything engineered to perfection.</span></p><p style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #0e101a; margin-bottom: 0pt; margin-top: 0pt;"><br /></p><p style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #0e101a; margin-bottom: 0pt; margin-top: 0pt;"><span data-preserver-spaces="true" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; margin-bottom: 0pt; margin-top: 0pt;">I was eager to impress my clients with my skills, but also aware that I could quickly end up in the doghouse. I approached the challenge with the same confidence level as a penguin in a tuxedo - not exactly built for success, but willing to waddle forward anyway.</span></p><p style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #0e101a; margin-bottom: 0pt; margin-top: 0pt;"><br /></p><p style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #0e101a; margin-bottom: 0pt; margin-top: 0pt;"><span data-preserver-spaces="true" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; margin-bottom: 0pt; margin-top: 0pt;">I was the 21st team member; the last twenty filled multiple positions across the development spectrum. The project template was nothing new; Someone sold the idea of twenty people at different levels to the client. They bought it. </span>There was just one problem - no solid requirements or plan. A vague idea that all the lines of business had to go live together.</p><p style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #0e101a; margin-bottom: 0pt; margin-top: 0pt;"><br /></p><p style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #0e101a; margin-bottom: 0pt; margin-top: 0pt;"><span data-preserver-spaces="true" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; margin-bottom: 0pt; margin-top: 0pt;">This situation is not new. </span></p><p style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #0e101a; margin-bottom: 0pt; margin-top: 0pt;"><br /></p><p style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #0e101a; margin-bottom: 0pt; margin-top: 0pt;"><span data-preserver-spaces="true" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; margin-bottom: 0pt; margin-top: 0pt;">We have often landed in a position like this, where the client has a sliver of an idea; they have paid Salesforce billing but need to figure out where to begin. A Solution Architect is only as good of a help as the requirement provided for the project. There is only a solution if there are requirements.</span></p><p style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #0e101a; margin-bottom: 0pt; margin-top: 0pt;"><br /></p><p style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #0e101a; margin-bottom: 0pt; margin-top: 0pt;"><span data-preserver-spaces="true" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; margin-bottom: 0pt; margin-top: 0pt;">It is a no-win situation- a Kobayashi Maru.</span></p><p style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #0e101a; margin-bottom: 0pt; margin-top: 0pt;"><br /></p><p style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #0e101a; margin-bottom: 0pt; margin-top: 0pt;"><span data-preserver-spaces="true" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; margin-bottom: 0pt; margin-top: 0pt;">The Kobayashi Maru is a Star Trek training exercise designed to test Star-fleet Academy cadets' character in a no-win scenario. The test is famously unbeatable and is designed to evaluate how cadets handle a situation without a clear solution.</span></p><p style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #0e101a; margin-bottom: 0pt; margin-top: 0pt;"><br /></p><p style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #0e101a; margin-bottom: 0pt; margin-top: 0pt;"><span data-preserver-spaces="true" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; margin-bottom: 0pt; margin-top: 0pt;">Captain Kirk famously beat Kobayashi Maru by reprogramming the simulation and winning the no-win situation.</span></p><p style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #0e101a; margin-bottom: 0pt; margin-top: 0pt;"><br /></p><p style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #0e101a; margin-bottom: 0pt; margin-top: 0pt;"><span data-preserver-spaces="true" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; margin-bottom: 0pt; margin-top: 0pt;">And there is a lesson here. When there are no requirements but a vague idea of a project, there is a need to bring the concept of a minimum viable product. </span></p><p style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #0e101a; margin-bottom: 0pt; margin-top: 0pt;"><br /></p><p style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #0e101a; margin-bottom: 0pt; margin-top: 0pt;"><span data-preserver-spaces="true" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; margin-bottom: 0pt; margin-top: 0pt;">A minimum viable product is a basic version of a product with enough features to satisfy early customers and gather feedback for future development. This vital process allows clients to validate their vague ideas, reduce development costs, and make informed decisions on what features to prioritise. With an MVP, we can test the waters before investing heavily in development. </span></p><p style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #0e101a; margin-bottom: 0pt; margin-top: 0pt;"><br /></p><p style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #0e101a; margin-bottom: 0pt; margin-top: 0pt;"><span data-preserver-spaces="true" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; margin-bottom: 0pt; margin-top: 0pt;">More importantly, we can get a team of twenty-one moving in a direction. Planning an MVP is a small portion in the grand scheme of things, but it's a start. The stakeholders get something solid in their hands; they have a system to feel and explore, bringing out the picture even more clearly. The ever-daunting task becomes bearable, manageable and achievable. </span></p><p style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #0e101a; margin-bottom: 0pt; margin-top: 0pt;"><br /></p><p style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #0e101a; margin-bottom: 0pt; margin-top: 0pt;"><span data-preserver-spaces="true" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; margin-bottom: 0pt; margin-top: 0pt;">Suddenly, we see the end goal in sight. </span></p><p style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #0e101a; margin-bottom: 0pt; margin-top: 0pt;"><br /></p><p style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #0e101a; margin-bottom: 0pt; margin-top: 0pt;"><span data-preserver-spaces="true" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; margin-bottom: 0pt; margin-top: 0pt;">So, have you ever found yourself in a Kobayashi Maru situation before? How did you handle it? Let me know in the comments below!</span></p><p style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #0e101a; margin-bottom: 0pt; margin-top: 0pt;"><br /></p><p style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #0e101a; margin-bottom: 0pt; margin-top: 0pt;"><strong style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; margin-bottom: 0pt; margin-top: 0pt;">TL;DR</strong></p><p style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #0e101a; margin-bottom: 0pt; margin-top: 0pt;"><span data-preserver-spaces="true" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; margin-bottom: 0pt; margin-top: 0pt;">- When I was starting a new job as a Tech Architect, the project had no solid requirements or plan, just a vague idea.</span></p><p style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #0e101a; margin-bottom: 0pt; margin-top: 0pt;"><span data-preserver-spaces="true" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; margin-bottom: 0pt; margin-top: 0pt;">- We created a minimum viable product scope to validate vague ideas, reduce development costs, and make informed decisions on what features to prioritise.</span></p><p style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #0e101a; margin-bottom: 0pt; margin-top: 0pt;"><span data-preserver-spaces="true" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; margin-bottom: 0pt; margin-top: 0pt;">- Planning an MVP is a small portion in the grand scheme of things, but it's a start.</span></p><p style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #0e101a; margin-bottom: 0pt; margin-top: 0pt;"><span data-preserver-spaces="true" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; margin-bottom: 0pt; margin-top: 0pt;">- The stakeholders get something solid in their hands, making the ever-daunting task bearable, manageable, and achievable.</span></p>Siddhesh Kabehttp://www.blogger.com/profile/05949517024873104589noreply@blogger.com0tag:blogger.com,1999:blog-3283225244263709141.post-71198627896076812752023-06-30T07:42:00.003-07:002023-06-30T07:42:45.094-07:00An algorithm to make the perfect coffee<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFS3dlJksMd4ctgmUsebW3mdTa8lnzpJdU5uNlCzJaURDF6NHxX8TxY8WPXWz95B_bJ-KmBxJ1TTojt361m3IKJrXaWQ8Fk4t53owJaNtL8cWP1TQCzHR1Tfezn7PUAkrdQnPIojEYkZQsMV_KPxU5yiS1vXn7ZLCd3yoSqbNJaTSgTGXSDW9iQJ0LhwU/s5760/StockSnap_ZCW5B7GXFY%20(1).jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="Photo by Malidate Van on StockSnap" border="0" data-original-height="3840" data-original-width="5760" height="314" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFS3dlJksMd4ctgmUsebW3mdTa8lnzpJdU5uNlCzJaURDF6NHxX8TxY8WPXWz95B_bJ-KmBxJ1TTojt361m3IKJrXaWQ8Fk4t53owJaNtL8cWP1TQCzHR1Tfezn7PUAkrdQnPIojEYkZQsMV_KPxU5yiS1vXn7ZLCd3yoSqbNJaTSgTGXSDW9iQJ0LhwU/w472-h314/StockSnap_ZCW5B7GXFY%20(1).jpg" title="Photo by Malidate Van on StockSnap" width="472" /></a></div><br /><p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 0px 0px 1.6rem; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space-collapse: preserve;"><span style="font-size: var(--font-size-large);">The warm aroma of freshly brewed coffee fills the air, and as I take my first sip, I can't help but feel a sense of calm wash over me. The world outside is still and quiet, as if it's holding its breath, waiting for the hustle and bustle of the week to begin. You take a moment to reflect on the past week and set intentions for the weekend ahead while enjoying your coffee. It's a small yet meaningful ritual that sets the tone for the rest of your day. It's Friday after all.</span></p><p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space-collapse: preserve;">A fellow developer had recently commented, "Why do I need to know about maps and sets? Flows will do most of the job for us..."</p><p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space-collapse: preserve;">Why must we study programming fundamentals when we have a very powerful platform like salesforce focused on less or no code? And that is where the sip of beautiful coffee mingled on the tongue, and an answer came to the fore. We get so many good coffee machines in the market, then why do we need to learn how to make filter coffee? </p><p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space-collapse: preserve;">We get amazing pod machines, professional coffee machines and even traditional press machines, so why do we still need to understand the basics of making coffee?</p><p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space-collapse: preserve;">Just like how you need a proper structure to make a good cup of coffee, developers need to use proper data structures to manage and organize data in Salesforce effectively. In other words, Salesforce platform, flows are like the tools and equipment that help you make a perfect cup of coffee. You will get a tool to effectively replace one part of the coffee making process, but that should only aid your journey in making coffee.</p><p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space-collapse: preserve;">And tools will break-down or wear out, what will remain is your knowledge. And that is why we keep the bare-bones as is. And that is why, even if Salesforce provides us with a nice shiny tool to build our processes, to model data, knowing the data structures is as much essential as knowing the tool itself.</p><p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space-collapse: preserve;">Knowing that an array starts from zero is as much essential as knowing you can call a flow from another flow. If the goal is to make the system as efficient as we can, we have to use all the tools we have. And sometimes, we only get boiling water for our coffee.</p><p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space-collapse: preserve;">And since I did write about the algorithm for making the perfect coffee, here it follows.</p><ol style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space-collapse: preserve;"><li style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; counter-increment: list-0 1; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-size: var(--artdeco-reset-base-font-size-hundred-percent); list-style-type: inherit; margin: 0.8rem 0px 0.8rem 3.2rem; padding-left: 0px; padding-right: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">Boil water in a kettle or on a stove.</li><li style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; counter-increment: list-0 1; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-size: var(--artdeco-reset-base-font-size-hundred-percent); list-style-type: inherit; margin: 0.8rem 0px 0.8rem 3.2rem; padding-left: 0px; padding-right: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">Grind coffee beans.</li><li style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; counter-increment: list-0 1; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-size: var(--artdeco-reset-base-font-size-hundred-percent); list-style-type: inherit; margin: 0.8rem 0px 0.8rem 3.2rem; padding-left: 0px; padding-right: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">Put a coffee filter or cheesecloth into a funnel or strainer and set it over your coffee mug or carafe.</li><li style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; counter-increment: list-0 1; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-size: var(--artdeco-reset-base-font-size-hundred-percent); list-style-type: inherit; margin: 0.8rem 0px 0.8rem 3.2rem; padding-left: 0px; padding-right: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">Put the ground coffee into the filter.</li><li style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; counter-increment: list-0 1; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-size: var(--artdeco-reset-base-font-size-hundred-percent); list-style-type: inherit; margin: 0.8rem 0px 0.8rem 3.2rem; padding-left: 0px; padding-right: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">Slowly pour the hot water over the coffee grounds in the filter.</li><li style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; counter-increment: list-0 1; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-size: var(--artdeco-reset-base-font-size-hundred-percent); list-style-type: inherit; margin: 0.8rem 0px 0.8rem 3.2rem; padding-left: 0px; padding-right: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">Let the coffee steep for 3-5 minutes.</li><li style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; counter-increment: list-0 1; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-size: var(--artdeco-reset-base-font-size-hundred-percent); list-style-type: inherit; margin: 0.8rem 0px 0.8rem 3.2rem; padding-left: 0px; padding-right: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">Remove the filter or cheesecloth from the funnel or strainer, and discard the used grounds.</li><li style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; counter-increment: list-0 1; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-size: var(--artdeco-reset-base-font-size-hundred-percent); list-style-type: inherit; margin: 0.8rem 0px 0.8rem 3.2rem; padding-left: 0px; padding-right: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">Give your coffee a quick stir, add any desired milk or sweetener, and enjoy!</li></ol><p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space-collapse: preserve;">This is a bare-bone of making a coffee.</p><p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space-collapse: preserve;">Happy Friday.</p>Siddhesh Kabehttp://www.blogger.com/profile/05949517024873104589noreply@blogger.com0tag:blogger.com,1999:blog-3283225244263709141.post-2773852696508059792023-03-03T15:06:00.005-08:002023-03-03T15:06:59.970-08:00What I learned from automating my house during the pandemic<p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 0px 0px 1.6rem; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space: pre-wrap;">An empty mind is an engineer's workshop. That saying is as old as time. Two things happened simultaneously in 2020 - The Pandemic hit, causing many jobs in IT to move from working from the office to working from home. We were expecting a baby and therefore had to take additional precautions, which meant a complete disconnect from human civilization, barring the occasional video calls.</p><p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space: pre-wrap;">The second thing during this period was moving into a brand-new flat. As you scour through manuals from Ikea, you start understanding the patterns. You can see which manual is copy pasted from other manuals; you can empathize with the manual-making team and how overworked they are to churn out new assembly guides for every new piece of furniture in the market.</p><p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space: pre-wrap;">That was when I looked at the house carefully and asked a pertinent question, why in the 22nd century, do we need switches? The light control is a stone-age activity; you move from your position, drop what you are doing, reach this non-descript mechanical plastic breaker circuit, and hit it with a click, causing the course to complete, and electricity passes through. Humans came to the moon in 1969; we have Voyager about to go to the outer edges of the solar system. Humans now can launch not one or two but 104 satellites in orbit with the mathematical precision in mm, so why on earn should I drop my cup of frothy coffee, rise and walk to the small plastic thingy on the wall to get more light in the room?</p><p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space: pre-wrap;">So I went complete hardware mode and picked up intelligent devices. </p><ol style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space: pre-wrap;"><li style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; counter-increment: list-0 1; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-size: var(--artdeco-reset-base-font-size-hundred-percent); list-style-type: inherit; margin: 0.8rem 0px 0.8rem 3.2rem; padding-left: 0px; padding-right: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">For GU10 Spotlights, I used the INNR multi-coloured bulbs for living areas connected with Hue Bridge.</li><li style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; counter-increment: list-0 1; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-size: var(--artdeco-reset-base-font-size-hundred-percent); list-style-type: inherit; margin: 0.8rem 0px 0.8rem 3.2rem; padding-left: 0px; padding-right: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">For the Screw Bulbs, I used TP-Link TAPO Yellow bulbs for the bedroom.</li><li style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; counter-increment: list-0 1; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-size: var(--artdeco-reset-base-font-size-hundred-percent); list-style-type: inherit; margin: 0.8rem 0px 0.8rem 3.2rem; padding-left: 0px; padding-right: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">For the smart blinds, I used Louvolite electronic blinds that can be configured and used the Louvolite hub.</li><li style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; counter-increment: list-0 1; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-size: var(--artdeco-reset-base-font-size-hundred-percent); list-style-type: inherit; margin: 0.8rem 0px 0.8rem 3.2rem; padding-left: 0px; padding-right: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">I have a Cubo AI camera for the nursery with motion sensing that detects when the baby moves closer to the edge of his cot.</li><li style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; counter-increment: list-0 1; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-size: var(--artdeco-reset-base-font-size-hundred-percent); list-style-type: inherit; margin: 0.8rem 0px 0.8rem 3.2rem; padding-left: 0px; padding-right: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">Everyone has a robotic hoover in the house, but if you haven't, I recommend you get one. For the robotic hoover, I have used the Ecovacs Deebot 920 for automatic cleaning and mopping the house.</li><li style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; counter-increment: list-0 1; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-size: var(--artdeco-reset-base-font-size-hundred-percent); list-style-type: inherit; margin: 0.8rem 0px 0.8rem 3.2rem; padding-left: 0px; padding-right: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">For orchestration, I had Alexa Echo for ages, but I decided to upgrade to Alexa Show, which is wall-mounted for the new house. Having Alexa Show, which is mounted on the wall, gave a sense of a control panel for the whole place when we did not want to use the voice command.</li></ol><p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space: pre-wrap;">Here are some of the most comical takeaways I experienced along the way:</p><p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space: pre-wrap;"><span style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; font-size: var(--artdeco-reset-base-font-size-hundred-percent); font-weight: var(--artdeco-reset-typography-font-weight-bold); margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">Compatibility is Key (But Not Always Easy):</span> I quickly learned that compatibility is crucial for a smooth-running smart home. But, when I thought I had everything set up perfectly, one of my devices would suddenly go rogue and refuse to play nice with the others. It was like trying to herd cats, but with technology.</p><p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space: pre-wrap;"><span style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; font-size: var(--artdeco-reset-base-font-size-hundred-percent); font-weight: var(--artdeco-reset-typography-font-weight-bold); margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">The Joy of Voice Integration (or the Lack Thereof):</span> Integrating my smart lights and blinds with Alexa was much fun - when it worked. But, when Alexa refused to listen to me or misheard my commands, it was like talking to a stubborn child who wouldn't listen.</p><p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space: pre-wrap;"><span style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; font-size: var(--artdeco-reset-base-font-size-hundred-percent); font-weight: var(--artdeco-reset-typography-font-weight-bold); margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">Scheduling and Automation:</span> Setting up schedules and automation for my smart lights and blinds was a real hoot. I felt like a mad scientist, coming up with elaborate plans to outsmart my devices. Of course, they usually didn't follow my commands, but it was still a good laugh.</p><p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space: pre-wrap;"><span style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; font-size: var(--artdeco-reset-base-font-size-hundred-percent); font-weight: var(--artdeco-reset-typography-font-weight-bold); margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">Debugging and Troubleshooting:</span> This was where the real fun began. Debugging and troubleshooting my smart lights and blinds was like trying to solve a mystery, complete with red herrings and false leads. As a result, I learned to be creative in my troubleshooting methods, like shaking the device, shouting at it, or even trying to bribe it with treats (kidding, of course).</p><p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space: pre-wrap;">In conclusion, automating the lights and blinds in my home was a hilarious adventure filled with laughs, frustration, and much learning. </p><p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space: pre-wrap;">And as I write this article, I can ask Alexa to turn on my living room lights or close the blinds without moving an inch from my seat; that gives a sense of power.</p><p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space: pre-wrap;">P.s. Many of my devices happened before Matter protocol came into being. Therefore, my devices were already orchestrated before 'matter', and consequently, it didn't affect me.</p>Siddhesh Kabehttp://www.blogger.com/profile/05949517024873104589noreply@blogger.com0tag:blogger.com,1999:blog-3283225244263709141.post-14045709991244391532023-02-20T15:42:00.000-08:002023-02-20T15:42:03.577-08:00Salesforce Microservices Architecture using Platform Events<p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 0px 0px 1.6rem; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space: pre-wrap;">In Microservices architecture, we break down large monolithic applications into small, independent services that are developed and deployed independently. Each service is focused on a specific business function and can be scaled and updated separately.</p><p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space: pre-wrap;">Event-driven microservices architecture is a pattern based on asynchronous communication between microservices. The microservices communicate with each other by emitting and consuming events.</p><p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space: pre-wrap;"><span style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; font-size: var(--artdeco-reset-base-font-size-hundred-percent); margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><b>Example</b></span></p><p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space: pre-wrap;">Consider a simple object model below:</p><figure class="slate-resizable-image-embed slate-image-embed__resize-full-width" contenteditable="false" data-imgsrc="data:image/png;base64,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6+s5/fTT+e1vf5va/qMf/YhPfepTHHLIIX2+0/RzDmRfOBy2aBK0iIiMQv0FIGe4Q2ATJkxIBZTe+zdu3Mj48eMBL0QkA0fy2Egkkr5eVapN+jXT2+zcuZOGhob0oR3AC0G7du1KHdfS0sL06dP7/RwVFRUYYzL2ua6bGnJKP669vZ1gMEg4HMZxHKZOnZpx3OzZs9m2bVvquPb2dioqKjKuGQqFcg5nnX/++SxdupStW7fy17/+lRdffJErrrgi53eeTa59VVVVQw1AIiIiI1rOIbBYLGZisVifHYP5oT3llFO45ZZbiMfjfXqK7rvvPo499ljA691JHp/0+OOPc+CBB6a2R6PRjACSbHPAAQdgrWXKlCmsW7eO3bt3Z9Tz5ptvpoIWQHd3dypI5foc1dXVfW7THz9+PLFYjE2bNqWOa2tro729nVDIWxnCdfvcOEckEiEWi6WuF41G6f29VldXp+b59HbSSScxYcIEfv3rX/PjH/+Y888/nylTpmR8xqGG1MrKSsPg5gClDh/CMSIiIiUjZw8QePNqkobyQ/ulL32JV199lc997nOpib8dHR1861vf4vHHH+eiiy7CWkssFktdKxqNcsstt3Dfffdx5plnps4bi8VIPp062eb+++/nrLPOAuCII45g6tSpXHnllamnLL/44ov893//N42NjamaXNcl2/ym9M8xceLE1LBVU1MT8XicyZMnM27cuNRwlLWWxYsXAxAMBlPhZ+vWrRnnXL9+ffodV1hr2b59e87rLVmyJCMwOo7Deeedx+23386TTz7JF7/4xSH/e/Tel6hLc4BERGTUybWqdydAV1dXaj5NNrl+ZJP7Zs2axfXXX89VV13FH//4R2bMmMHatWtpa2vju9/9LnPmzEn1hixatIiqqirWrVtHc3Mzhx12GJdccglARptIJJLR5uKLLwbAGMMNN9zAJz/5SZYtW8akSZNYuXIlhx56KOedd16q1u7ubrq6uvr9HMcffzzf/va3efzxx9m1axdvvPEG4XCY+fPnc/3117NixQrWrFnDAQcc4H2JaQHovffe4/jjj0+dc82aNUycODF17lAo1Oehh8cddxzf+c53aGpqYvfu3axevTpj+O+CCy7g5ptv5uyzz2bfffftN9z09+/RW3V1tcPghsCSE5XigzhGRESk5PTbA9Te3p5152B6HxYtWsS9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jUYtDL3H45FHHuHBBx9k8eLFvPPOOyxZsoSXXnqJu+++m+XLl/O73/0u1f4nP/kJN998M6+++iqnnXYakyZN4txzzyU5D2np0qXMmzePqVOncuqpp/LWW29lBCBrLUuWLOHUU0+loaGBo48+mv/5n/9J1XLbbbdx66238tprrzF//nymTp3KP/zDPzCQeU65tmf7/MuWLeNjH/sY++23H/Pnz+fdd98d8PfV3zU7OjoM0Ja1OBERkWEwfhdQYn7W0NBw0VtvvdWnm2WgIeH8889nwoQJ3HLLLX3aLly4kFgsxt133w3ApZdeyvbt21m/fj0f+MAHaG9v5+GHH+bVV1/l7bffZsGCBYTDYQ455BDeeOMNIpEI4XCYl19+GYAlS5ZwwQUXEA6HmTt3LmvXrmXbtm08+uijHHfccSxcuDB1/mOPPZaOjg4eeeQRVq5cybRp0/LSW/PSSy9x9tlnE41Gqa2tZffu3TQ2NnL//fcP69zW2mSNPwCuA6JADHATLxERkSHTEFimAT8JOtcP+SuvvMKdd96Ztf1ZZ53FjTfemNq2Z88eXn/9df785z8zbtw4AFavXs20adNYsGABxx57LL/4xS+or6/nvffe46STTqK6ujp1/Ne//nWOOuoo7rvvPiZOnIjrulxwwQX8/ve/57jjjkud/9lnn804/z777JO3YbDvfOc7HHTQQdx77700NDTw4IMP8v3vf3/Y5+7o6Ejua8/aQEREZBgUgDJ1R6PRVK/YUALBjh07UmGjd9spU6bQ0tKS2r5nzx4WLFiQ0f7QQw/ljTfe4I033uCll16ivr4egGnTprFo0SJ+85vfALBmzRreffddHn74YSoqKrjtttu4++67Wbt2LSeffHLq/J/4xCdS57fWcuihhw7q8/S3ffv27fz5z3/mmWeeoaGhAWst5513Hg0NDXs9z97O3d6eyj1taB6QiIjkmQJQpu7u7m4znKGhCRMmsGrVKg455JA+7Tdt2sT48eNT21taWpg+fXqfc6xbt46JEyey//77Z2zfZ599UnOA1q1bx/jx41m8eDGPPfYYkUiEc845h1tvvZVjjz223/MP5vP0t/3111+noaGBWbNmZez74Ac/OOjz997W1paa+qM5QCIikncKQJm60nuAkgbzQ37KKadw8803s2DBAgKBQMa+++67LxVOALq6ulK3tacLhUJ0dnYSj8cznvvT1dVFKBTCWovrumzbtg1rLXfddRfz5s0jFAplfpgc589V+2AD0e7duwt2R1laAEp2BakXSERE8kZ3gWWKxuPxVA/QUO5guvzyy3nttddYuHAhra2tgDec861vfYvHH3+ciy66KNXedV26urr6nGfmzJm0tLTw85//PLWtubmZ3/3ud6mQc+SRRxIMBrn88suZP39+avs777yTCkbZzj+Y5/Pk2p48x7hx49i4cSN/+MMfMranhZe9XjPX9l5DYCIiInmlHqBM3dZaotFon94UGFhImD17Ntdffz1XXXUVf/zjH9lvv/1Yt24dbW1tfPe732XOnDmp9t3d3XR2dvY5z4wZMzjppJO44oorePDBB6mqquKll15i165dnHTSSQBMnDiRz33uc8yfP5/DDjuMhoYGNmzYwKpVq7jwwgu5+eabiUajqfMX4rk9Rx99NJMnT+azn/0sM2bMYMqUKWzduhXHcfjTn/40rHNn6QFKNct6sIiIyCAoAGXqBi+Y9A5Ag/kxX7hwIZMnT+amm27i7bffZtasWVx55ZWcddZZGe1nzJjBAQcckPUct956K1/96ldZunQpdXV1nHHGGRx88MEZw07/8i//Qn19PXfddRevv/46EydO5KMf/SgLFy4EYL/99mPmzJkFG6YKh8P8+te/5rrrruMvf/kL77zzDgAnnnjisK+Z1gPUmvUgERGRYdBzgDJ9Gfjxe++9x9ixY4HyfcpyKWzvr+1DDz3EV77yFYBjgDfwngMUT7zUCyQiIsOiHqBM3eBNHi7XELJy5UoeeeSRrPuTVq1aRX19feoOsmwcx+HTn/50v3eZDXZ7+ra0HqB2FHhERCTPFIAypQJQb6XWQzLU7f/7v//LzTffnLXdYB166KFMmzZtyLX0tz3HJGgFIRERyQsFoEzdANFoNLVhpAwZDXT7Nddcw9VXX10StfS3vZ9J0CIiIsOmAJQpNQkaSm/4qhSuWaxa2tvbMcZErbWxrA1FRESGQQEoUxfkngOkcFK8Wtrb23EcpyMej2dtLyIiMhwKQJkyeoCSRmsI8bOWxBwgDX+JiEhBKABl2usQWL62j4QQ4mctiTlAyYVQky8REZG8UADKlApApRIUSjGcFGN7e3s71tqWrA1FRESGSQEoU8GGwPK1fbTU0tbWZl3X1TpgIiJSEApAmbogMwCN5hDiZy2tra0WLYQqIiIFogCUqd8hMFA4KVYtbW1tFk2CFhGRAlEAylTQJ0GPtBDiZy2Ju8Ba0eRnEREpAAWgTEV9EnSphxA/a+no6IDMHiAFIRERyRsFoEwOeD/ApRYIRlstnZ2dDj0ByPZ6FxERGRYFoEyHA8yZM6fPjtEYQvyqpauri3g8buh5DpCIiEheKQBlOspxHHvYYYeZ9I1+B4LRVkuOleBTh2Q9kYiIyCAoAGU6cubMmW5VVVUARncI8bOWtJXgWwEX9CRoERHJLwWgNIFA4NijjjoqoBDiby1pPUDJu8A0B0hERPJKAajHuHg8PrW+vp61a9cSDoeprq6murqaYDD71zQaw0khtu/evRvXdWlpaSEajbJ69erkLvUAiYhIQZi9Nxk1GoEl2XYYY6ipqYlXVlYSDocZM2YMlZWVTnV1tampqaGiooLa2lqqqqoIh8PU19cTDoepqqqitraWiooKampqiEQiVFRUpPaHw2Hq6upwHCfjen4Hou7ubjo6Oujo6KCrq4vW1lbi8TjNzc24rsuePXuIxWK0tbVltO3u7s5oG4/HU6GmtbU13tnZSUdHh+3o6DDRaJT29nbHdd3+/jc4H3gKiKMgJCIieaQA1KMBOAQYD1QDdUANUJn4cxUQBuoT25LbK4wxNcaYWqDCdd3qwV44EAjYqqqqeHpAikQigaqqKlNXV0dFRQWRSISamhrC4TA1NTVUVVWl2ia1t7dnhJA9e/YQj8dpbW2lu7ub9vZ2Ojs76erqoqWlJd7d3W0TocY2Nzc78Xicjo6OwFC/QGNMtzGmE2i31kattXuAGNACRPEmNXfiLTnSmtiX3ia5vQ3oAP4C7MQLP8kAJCIiMmwKQH1V4D0PKJB4N/R8T+nfV3/fXQQvLI1JvFfiBacwXriqTVynJtE2GaZSwcoYUxUIBKqNMXXW2rC1ttp13Spr7aACijEm7jhORyKYdOGFi2gsFtuF17PSgvcAyHayh5P0Nh2Jdl2JbTGgGS/c9H5q80D+nP53S0/IcbO81PsjIiJ5owDUVxDve0kPP72/p/6+t719p9n25zom23UdMnukxqbtb8MLI814oWHPXs6VTX8BJVe7bG36Cz39Hd87CFkUfkREJM8UgPrKFnwGE1qyGUooGuq+wYSpbPoLOr3/PpjAk2t7tuPctL8r/IiISN4pAPU12OGuwbQZyrHFDE+w95AynDaDOUa3vouISMEoAPVvuN9PPr7ffPY0DaTt3gLHYHp3htpOoUdERApKAag0FOLfId/nHGwoUYgREZGSpQA0eg21B0hERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERESksIzfBYiIiAzFP/7qV4H91+36grF8Gag1lm5reM4a53vGuk/h/cZ1A1FrzE9vunrh95PHXn3DHZuBMBDvOaO9/sZrPv9DgMXX/2yi60Q3AMtuvGbRh9KO2574owHGATsSf99z4zWLDtjbeRP7DeACFngqEHe/f/03vrA622f85xvvvMhYe9mN1yz6CMBVN906xXGDm4w1p96weOGSxDlvAbPVWPOoNe5/A7OBF4ED+6s1WY/rmNP/7Z8Xvpz2GZeAvefGaz5/X9967njAWPvejdd8/qrktmu+f/utYGI3LF70f6699tpgR+XUaFe4Yux/XnHJ7rRzrjbW/ZI1zgPGsuWGaxb+HcbYtM94r7HmkhsWL7wnW02F4BTy5CIiIoUyc+3u/3Bce14sGDjtxmsWNXSF2w42lqeMtUcAuI756I3XLJoejMU+Yqz90tU33H52+vGuY06+8ZpFE3peXkjx9sU+CeZh4MirbrrjgOT2ZNtYkNkAVZ2bpiS2HTCQ86bVNTUeqDrIWPuneMB5+prv//TobJ/RmmgT8IErfvjDKoBAPHAysBHsSWnNTgaW3LD4cy8G4u4FwI4br1l03EBqHSxrYl8Fc/HVN9x+BMDi628/3hpzRmVX7BsDPwfuP990p/dvYa0x1l5pDVkDYCEpAImIyIjjhRK7MBC3F/771y5bD/Af//f/dtyweNFdN16z8IH0tv/6zcvfA7sKTMPAr2AvNtb+FPi949p/ymvxCT+46p/ablj8+duNtf9mjXtjtjb/9s+XbwbeDEUjHwSwhpOB6xPvfP1ffzoZmFbVuXF5IWrMUc83wdzx5R//OBwPmDvBfPHaay9vHeg5rLH/aizfArj6xjvOAlYYy/pC1ZxLsNgXFBERGa5AnKOsYd2/fvMLG/bW9qqb7jgKlyONjX8xfbvj2iVX33BHLPl3a7jhpqsX/efX/u2nc4m7U98+YOwTM9fuDIP5MdZemxyy2Ztc583V3hrzB+Bfcp/RNBnLKUATmBO6K9r+T0V39T9/7d/urXZj7SeBeebaa6+N5T5+cPUCY4F7crW/8f+3bz+hcRZhHMd/M2/SbKoUo0VUPITqqR69iIRCqQiFCraURVGJoGajUJBg9323RVyksu8mh0IOJm8CevJiCr0I/m/6B2lOUgQ9tBICUhBRq2CzaeI7j4c0urbZNKYJEvh+Ti8z8848854e3mcm7hsrD46/sHW245ykb+pJ38f/bcVoSsp/Ozw4tk/Bys6iXnN5y++zUUiAAACbjjnnJFvxHKsPdjJOszYFbZfcnrTy2nRzf/DuieXOmUR5eFFyH04Ui3lfln3SdUXbDg+N7xqSzqwmtlbzthLlwfLIr5RcfSa5t8v18QddCD8fHxhoJLXRc1E+12PO7TanL1a71mriXTwDtALnzNdGDpnzX0e5f6q569udO23H9JVlXzPnQtPzMR/sA0mTaeXl7+M0u50trAklMADApuODLkh6+I2hkXtbjQne7e+c63pI0nnJnl/NvNVqtU3Sc5IdTGrZzN2/6pKkdh+sd30iv1keuSclnW3VP7/lj7OSPSKFpyWdXmz1p66XwXZHud1WArQWC+3+B0nasnD5l+b2iWIxl3S1MDd31w2vbA/e/f23bjAuTUo644O9s+HBtkACBADYdGpH+i6a04m2P92JpPbuDkk6NDzckdRG++N07JmlcdVqcV7Sfkk95Xr21q3mbRTu22tOP9WT0gNppdSdVkrdwbtdkg5Wq9nW9dxDtfp+oVwffUlysWSVVuOODww0JE05UyyF04ut+SlnVpR0Z+1I/3frGdc6OBm8P3o9mVScjr1iTvMz3V0zzYPqSenZ/zN2SmAAgE2p0Xmt946rHW+aiz6K02ybZiVz9pU5V3X2T0WpnpR+P3psZO9Cuz8fp9mP9aSUSZIPNhmn2b+uq0vucR/0XvM6Q+W+C3GaXWoU7ICkm66G32i5eZtvgvlgn8ZpFhqaN2duMsrDnlbX4Jc4s8/NuZ7CtcKUJKWVV2fiNDNn+nJpTFIbfzRfvAZ/T5xmU/Wk9NitYt0IPiy8Hnz78Gzn/dNxmnnJLgbv900Ui/lqS13LfMMD9aS/5V8yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADW6C/zA1jBRTrR9QAAAABJRU5ErkJggg==" style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; clear: both; color: rgba(0, 0, 0, 0.9); cursor: text; display: var(--artdeco-reset-base-display-block); font-family: Helvetica, Arial, sans-serif; font-size: 13px; margin: var(--artdeco-reset-base-margin-zero); padding: var(--artdeco-reset-base-padding-zero); position: relative; text-align: center; transition: margin 223ms ease 0s; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space: pre-wrap;"><ul class="slate-image-embed__toolbar" data-slate-ignore="true" style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; color: var(--color-text); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-size: var(--font-size-large); height: 48px; left: 0px; line-height: 1.75; margin: 0px; opacity: 0; padding: 0px 0px 8px; position: absolute; top: 0px; transition: all 332ms ease-in 0s; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); width: 720px;"><li style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; display: inline-block; font-size: var(--artdeco-reset-base-font-size-hundred-percent); list-style-type: inherit; margin: 0px 4px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><button aria-label="Align to the left" class="slate-image-embed-button slate-image-embed-button__resize-left artdeco-button artdeco-button--circle artdeco-button--muted artdeco-button--secondary" data-slate-ignore="true" style="align-items: center; background-attachment: initial; background-clip: initial; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border-color: initial; border-radius: var(--corner-radius-full) !important; border-style: none; border-width: initial; box-shadow: inset 0 0 0 1px var(--color-border); cursor: pointer; display: inline-flex; font-family: inherit; font-size: 1.6rem; font-weight: 600; height: 4rem; justify-content: center; line-height: 2rem; margin-bottom: 0px; max-width: 480px; min-height: 3.2rem; min-width: auto; overflow: hidden; padding: 0px !important; touch-action: manipulation; transition-duration: 167ms; transition-property: background-color, box-shadow, color; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); vertical-align: middle; width: 4rem;"><li-icon aria-hidden="true" size="large" style="box-sizing: border-box; display: inline-block; overflow: hidden; position: relative;" type="content-align-left"><svg class="mercado-match" data-supported-dps="24x24" fill="currentColor" focusable="false" height="24" viewbox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M21 3v2H3V3zm-6 6h6V7h-6zm0 4h6v-2h-6zm0 4h6v-2h-6zM3 21h18v-2H3zM13 7H3v10h10z"></path></svg></li-icon></button></li><li style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; display: inline-block; font-size: var(--artdeco-reset-base-font-size-hundred-percent); list-style-type: inherit; margin: 0px 4px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><button aria-label="Align in the middle" class="slate-image-embed-button slate-image-embed-button__resize-middle artdeco-button artdeco-button--circle artdeco-button--muted artdeco-button--secondary" data-slate-ignore="true" style="align-items: center; background-attachment: initial; background-clip: initial; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border-color: initial; border-radius: var(--corner-radius-full) !important; border-style: none; border-width: initial; box-shadow: inset 0 0 0 1px var(--color-border); cursor: pointer; display: inline-flex; font-family: inherit; font-size: 1.6rem; font-weight: 600; height: 4rem; justify-content: center; line-height: 2rem; margin-bottom: 0px; max-width: 480px; min-height: 3.2rem; min-width: auto; overflow: hidden; padding: 0px !important; touch-action: manipulation; transition-duration: 167ms; transition-property: background-color, box-shadow, color; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); vertical-align: middle; width: 4rem;"><li-icon aria-hidden="true" size="large" style="box-sizing: border-box; display: inline-block; overflow: hidden; position: relative;" type="content-align-center"><svg class="mercado-match" data-supported-dps="24x24" fill="currentColor" focusable="false" height="24" viewbox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M21 3v2H3V3zM3 21h18v-2H3zM7 7v10h10V7z"></path></svg></li-icon></button></li><li style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; display: inline-block; font-size: var(--artdeco-reset-base-font-size-hundred-percent); list-style-type: inherit; margin: 0px 4px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><button aria-label="Resize to full width" aria-pressed="true" class="slate-image-embed-button slate-image-embed-button__resize-full-width artdeco-button artdeco-button--circle artdeco-button--muted slate-image-embed-button__active" data-slate-ignore="true" style="align-items: center; background-attachment: initial; background-clip: initial; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border-color: initial; border-radius: var(--corner-radius-full) !important; border-style: none; border-width: initial; cursor: pointer; display: inline-flex; font-family: inherit; font-size: 1.6rem; font-weight: 600; height: 4rem; justify-content: center; line-height: 2rem; margin-bottom: 0px; max-width: 480px; min-height: 3.2rem; min-width: auto; overflow: hidden; padding: 0px !important; touch-action: manipulation; transition-duration: 167ms; transition-property: background-color, box-shadow, color; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); vertical-align: middle; width: 4rem;"><li-icon aria-hidden="true" size="large" style="box-sizing: border-box; display: inline-block; overflow: hidden; position: relative;" type="content-full-width"><svg class="mercado-match" data-supported-dps="24x24" fill="currentColor" focusable="false" height="24" viewbox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M21 3v2H3V3zM3 21h18v-2H3zm0-4h18V7H3z"></path></svg></li-icon></button></li><li style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; display: inline-block; font-size: var(--artdeco-reset-base-font-size-hundred-percent); list-style-type: inherit; margin: 0px 4px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><button aria-label="Align to the right" class="slate-image-embed-button slate-image-embed-button__resize-right artdeco-button artdeco-button--circle artdeco-button--muted artdeco-button--secondary" data-slate-ignore="true" style="align-items: center; background-attachment: initial; background-clip: initial; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border-color: initial; border-radius: var(--corner-radius-full) !important; border-style: none; border-width: initial; box-shadow: inset 0 0 0 1px var(--color-border); cursor: pointer; display: inline-flex; font-family: inherit; font-size: 1.6rem; font-weight: 600; height: 4rem; justify-content: center; line-height: 2rem; margin-bottom: 0px; max-width: 480px; min-height: 3.2rem; min-width: auto; overflow: hidden; padding: 0px !important; touch-action: manipulation; transition-duration: 167ms; transition-property: background-color, box-shadow, color; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); vertical-align: middle; width: 4rem;"><li-icon aria-hidden="true" size="large" style="box-sizing: border-box; display: inline-block; overflow: hidden; position: relative;" type="content-align-right"><svg class="mercado-match" data-supported-dps="24x24" fill="currentColor" focusable="false" height="24" viewbox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M21 3v2H3V3zM9 7H3v2h6zm0 4H3v2h6zm0 4H3v2h6zm-6 6h18v-2H3zm8-4h10V7H11z"></path></svg></li-icon></button></li></ul><button aria-label="Add a link to the embedded image" class="slate-image-embed__link-button artdeco-button artdeco-button--circle artdeco-button--muted artdeco-button--secondary" data-slate-ignore="true" style="align-items: center; background-attachment: initial; background-clip: initial; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border-color: initial; border-radius: var(--corner-radius-full) !important; border-style: none; border-width: initial; box-shadow: inset 0 0 0 1px var(--color-border); cursor: pointer; display: inline-flex; font-family: inherit; font-size: 1.6rem; font-weight: 600; height: 4rem; justify-content: center; line-height: 2rem; margin-bottom: 0px; max-width: 480px; min-height: 3.2rem; min-width: auto; opacity: 0; overflow: hidden; padding: 0px !important; position: absolute; right: 0px; top: 0px; touch-action: manipulation; transition: all 332ms ease-in 0s; vertical-align: middle; width: 4rem; z-index: 0;"><li-icon aria-hidden="true" size="large" style="box-sizing: border-box; display: inline-block; overflow: hidden; position: relative;" type="link"><svg class="mercado-match" data-supported-dps="24x24" fill="currentColor" focusable="false" height="24" viewbox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M19.83 4.17a4 4 0 00-5.66 0l-2 2A4 4 0 0011 9a4 4 0 00.56 2l-.54.54a4 4 0 00-4.85.63l-2 2a4 4 0 005.66 5.66l2-2A4 4 0 0013 15a4 4 0 00-.56-2l.54-.54a4 4 0 004.85-.63l2-2a4 4 0 000-5.66zM11 15a2 2 0 01-.59 1.41l-2 2a2 2 0 11-3-2.6l.22-.22 2-2A2 2 0 019 13a2.24 2.24 0 01.51.07l-1.22 1.22a1 1 0 000 1.41 1 1 0 001.41 0l1.22-1.22A2.24 2.24 0 0111 15zm7.41-6.59l-2 2A2 2 0 0115 11a2.24 2.24 0 01-.51-.07l1.22-1.22A1 1 0 0016 9a1 1 0 00-.29-.7A1 1 0 0015 8a1 1 0 00-.7.29l-1.23 1.22A2.24 2.24 0 0113 9a2 2 0 01.59-1.41l2-2a2 2 0 013 2.6z"></path></svg></li-icon></button><button aria-label="Add alt text to image" class="slate-image-embed__desc-button artdeco-button artdeco-button--muted artdeco-button--1 align-items-center" data-slate-ignore="true" style="align-items: center !important; background-attachment: initial; background-clip: initial; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border-color: initial; border-radius: var(--corner-radius-large) !important; border-style: none; border-width: initial; cursor: pointer; display: inline-flex; font-family: inherit; font-size: 1.4rem; font-weight: 600; height: 2.4rem; justify-content: center; line-height: 2rem; margin-bottom: 0px; max-width: 480px; min-height: 2.4rem; min-width: 0px; overflow: hidden; padding: 0px 0.8rem; position: absolute; right: 0.8rem; top: 0.8rem; touch-action: manipulation; transition-duration: 167ms; transition-property: background-color, box-shadow, color; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); vertical-align: middle;"><li-icon aria-hidden="true" class="mr1" size="small" style="box-sizing: border-box; display: inline-block; margin-right: 4px !important; overflow: hidden; position: relative;" type="pencil"><svg class="mercado-match" data-supported-dps="16x16" fill="currentColor" focusable="false" height="16" viewbox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M14.13 1.86a3 3 0 00-4.17 0l-7 7L1 15l6.19-2 6.94-7a3 3 0 000-4.16zm-8.36 9.71l-1.35-1.34L9.64 5 11 6.35z"></path></svg></li-icon><span class="t-sans" style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; font-family: var(--artdeco-typography-sans); font-size: var(--artdeco-reset-base-font-size-hundred-percent); margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">Add alt text</span></button><img alt="No alt text provided for this image" class="slate-image-embed__resize-full-width" data-media-urn="urn:li:digitalmediaAsset:D4E12AQHMv-tV7vGSKQ" src="data:image/png;base64,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6+s5/fTT+e1vf5va/qMf/YhPfepTHHLIIX2+0/RzDmRfOBy2aBK0iIiMQv0FIGe4Q2ATJkxIBZTe+zdu3Mj48eMBL0QkA0fy2Egkkr5eVapN+jXT2+zcuZOGhob0oR3AC0G7du1KHdfS0sL06dP7/RwVFRUYYzL2ua6bGnJKP669vZ1gMEg4HMZxHKZOnZpx3OzZs9m2bVvquPb2dioqKjKuGQqFcg5nnX/++SxdupStW7fy17/+lRdffJErrrgi53eeTa59VVVVQw1AIiIiI1rOIbBYLGZisVifHYP5oT3llFO45ZZbiMfjfXqK7rvvPo499ljA691JHp/0+OOPc+CBB6a2R6PRjACSbHPAAQdgrWXKlCmsW7eO3bt3Z9Tz5ptvpoIWQHd3dypI5foc1dXVfW7THz9+PLFYjE2bNqWOa2tro729nVDIWxnCdfvcOEckEiEWi6WuF41G6f29VldXp+b59HbSSScxYcIEfv3rX/PjH/+Y888/nylTpmR8xqGG1MrKSsPg5gClDh/CMSIiIiUjZw8QePNqkobyQ/ulL32JV199lc997nOpib8dHR1861vf4vHHH+eiiy7CWkssFktdKxqNcsstt3Dfffdx5plnps4bi8VIPp062eb+++/nrLPOAuCII45g6tSpXHnllamnLL/44ov893//N42NjamaXNcl2/ym9M8xceLE1LBVU1MT8XicyZMnM27cuNRwlLWWxYsXAxAMBlPhZ+vWrRnnXL9+ffodV1hr2b59e87rLVmyJCMwOo7Deeedx+23386TTz7JF7/4xSH/e/Tel6hLc4BERGTUybWqdydAV1dXaj5NNrl+ZJP7Zs2axfXXX89VV13FH//4R2bMmMHatWtpa2vju9/9LnPmzEn1hixatIiqqirWrVtHc3Mzhx12GJdccglARptIJJLR5uKLLwbAGMMNN9zAJz/5SZYtW8akSZNYuXIlhx56KOedd16q1u7ubrq6uvr9HMcffzzf/va3efzxx9m1axdvvPEG4XCY+fPnc/3117NixQrWrFnDAQcc4H2JaQHovffe4/jjj0+dc82aNUycODF17lAo1Oehh8cddxzf+c53aGpqYvfu3axevTpj+O+CCy7g5ptv5uyzz2bfffftN9z09+/RW3V1tcPghsCSE5XigzhGRESk5PTbA9Te3p5152B6HxYtWsS9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jUYtDL3H45FHHuHBBx9k8eLFvPPOOyxZsoSXXnqJu+++m+XLl/O73/0u1f4nP/kJN998M6+++iqnnXYakyZN4txzzyU5D2np0qXMmzePqVOncuqpp/LWW29lBCBrLUuWLOHUU0+loaGBo48+mv/5n/9J1XLbbbdx66238tprrzF//nymTp3KP/zDPzCQeU65tmf7/MuWLeNjH/sY++23H/Pnz+fdd98d8PfV3zU7OjoM0Ja1OBERkWEwfhdQYn7W0NBw0VtvvdWnm2WgIeH8889nwoQJ3HLLLX3aLly4kFgsxt133w3ApZdeyvbt21m/fj0f+MAHaG9v5+GHH+bVV1/l7bffZsGCBYTDYQ455BDeeOMNIpEI4XCYl19+GYAlS5ZwwQUXEA6HmTt3LmvXrmXbtm08+uijHHfccSxcuDB1/mOPPZaOjg4eeeQRVq5cybRp0/LSW/PSSy9x9tlnE41Gqa2tZffu3TQ2NnL//fcP69zW2mSNPwCuA6JADHATLxERkSHTEFimAT8JOtcP+SuvvMKdd96Ztf1ZZ53FjTfemNq2Z88eXn/9df785z8zbtw4AFavXs20adNYsGABxx57LL/4xS+or6/nvffe46STTqK6ujp1/Ne//nWOOuoo7rvvPiZOnIjrulxwwQX8/ve/57jjjkud/9lnn804/z777JO3YbDvfOc7HHTQQdx77700NDTw4IMP8v3vf3/Y5+7o6Ejua8/aQEREZBgUgDJ1R6PRVK/YUALBjh07UmGjd9spU6bQ0tKS2r5nzx4WLFiQ0f7QQw/ljTfe4I033uCll16ivr4egGnTprFo0SJ+85vfALBmzRreffddHn74YSoqKrjtttu4++67Wbt2LSeffHLq/J/4xCdS57fWcuihhw7q8/S3ffv27fz5z3/mmWeeoaGhAWst5513Hg0NDXs9z97O3d6eyj1taB6QiIjkmQJQpu7u7m4znKGhCRMmsGrVKg455JA+7Tdt2sT48eNT21taWpg+fXqfc6xbt46JEyey//77Z2zfZ599UnOA1q1bx/jx41m8eDGPPfYYkUiEc845h1tvvZVjjz223/MP5vP0t/3111+noaGBWbNmZez74Ac/OOjz997W1paa+qM5QCIikncKQJm60nuAkgbzQ37KKadw8803s2DBAgKBQMa+++67LxVOALq6ulK3tacLhUJ0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yrHFDE+w95AynDaDOUa3vouISMEoAPVvuN9PPr7ffPY0DaTt3gLHYHp3htpOoUdERApKAag0FOLfId/nHGwoUYgREZGSpQA0eg21B0hERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERESksIzfBYiIiAzFP/7qV4H91+36grF8Gag1lm5reM4a53vGuk/h/cZ1A1FrzE9vunrh95PHXn3DHZuBMBDvOaO9/sZrPv9DgMXX/2yi60Q3AMtuvGbRh9KO2574owHGATsSf99z4zWLDtjbeRP7DeACFngqEHe/f/03vrA622f85xvvvMhYe9mN1yz6CMBVN906xXGDm4w1p96weOGSxDlvAbPVWPOoNe5/A7OBF4ED+6s1WY/rmNP/7Z8Xvpz2GZeAvefGaz5/X9967njAWPvejdd8/qrktmu+f/utYGI3LF70f6699tpgR+XUaFe4Yux/XnHJ7rRzrjbW/ZI1zgPGsuWGaxb+HcbYtM94r7HmkhsWL7wnW02F4BTy5CIiIoUyc+3u/3Bce14sGDjtxmsWNXSF2w42lqeMtUcAuI756I3XLJoejMU+Yqz90tU33H52+vGuY06+8ZpFE3peXkjx9sU+CeZh4MirbrrjgOT2ZNtYkNkAVZ2bpiS2HTCQ86bVNTUeqDrIWPuneMB5+prv//TobJ/RmmgT8IErfvjDKoBAPHAysBHsSWnNTgaW3LD4cy8G4u4FwI4br1l03EBqHSxrYl8Fc/HVN9x+BMDi628/3hpzRmVX7BsDPwfuP990p/dvYa0x1l5pDVkDYCEpAImIyIjjhRK7MBC3F/771y5bD/Af//f/dtyweNFdN16z8IH0tv/6zcvfA7sKTMPAr2AvNtb+FPi949p/ymvxCT+46p/ablj8+duNtf9mjXtjtjb/9s+XbwbeDEUjHwSwhpOB6xPvfP1ffzoZmFbVuXF5IWrMUc83wdzx5R//OBwPmDvBfPHaay9vHeg5rLH/aizfArj6xjvOAlYYy/pC1ZxLsNgXFBERGa5AnKOsYd2/fvMLG/bW9qqb7jgKlyONjX8xfbvj2iVX33BHLPl3a7jhpqsX/efX/u2nc4m7U98+YOwTM9fuDIP5MdZemxyy2Ztc583V3hrzB+Bfcp/RNBnLKUATmBO6K9r+T0V39T9/7d/urXZj7SeBeebaa6+N5T5+cPUCY4F7crW/8f+3bz+hcRZhHMd/M2/SbKoUo0VUPITqqR69iIRCqQiFCraURVGJoGajUJBg9323RVyksu8mh0IOJm8CevJiCr0I/m/6B2lOUgQ9tBICUhBRq2CzaeI7j4c0urbZNKYJEvh+Ti8z8848854e3mcm7hsrD46/sHW245ykb+pJ38f/bcVoSsp/Ozw4tk/Bys6iXnN5y++zUUiAAACbjjnnJFvxHKsPdjJOszYFbZfcnrTy2nRzf/DuieXOmUR5eFFyH04Ui3lfln3SdUXbDg+N7xqSzqwmtlbzthLlwfLIr5RcfSa5t8v18QddCD8fHxhoJLXRc1E+12PO7TanL1a71mriXTwDtALnzNdGDpnzX0e5f6q569udO23H9JVlXzPnQtPzMR/sA0mTaeXl7+M0u50trAklMADApuODLkh6+I2hkXtbjQne7e+c63pI0nnJnl/NvNVqtU3Sc5IdTGrZzN2/6pKkdh+sd30iv1keuSclnW3VP7/lj7OSPSKFpyWdXmz1p66XwXZHud1WArQWC+3+B0nasnD5l+b2iWIxl3S1MDd31w2vbA/e/f23bjAuTUo644O9s+HBtkACBADYdGpH+i6a04m2P92JpPbuDkk6NDzckdRG++N07JmlcdVqcV7Sfkk95Xr21q3mbRTu22tOP9WT0gNppdSdVkrdwbtdkg5Wq9nW9dxDtfp+oVwffUlysWSVVuOODww0JE05UyyF04ut+SlnVpR0Z+1I/3frGdc6OBm8P3o9mVScjr1iTvMz3V0zzYPqSenZ/zN2SmAAgE2p0Xmt946rHW+aiz6K02ybZiVz9pU5V3X2T0WpnpR+P3psZO9Cuz8fp9mP9aSUSZIPNhmn2b+uq0vucR/0XvM6Q+W+C3GaXWoU7ICkm66G32i5eZtvgvlgn8ZpFhqaN2duMsrDnlbX4Jc4s8/NuZ7CtcKUJKWVV2fiNDNn+nJpTFIbfzRfvAZ/T5xmU/Wk9NitYt0IPiy8Hnz78Gzn/dNxmnnJLgbv900Ui/lqS13LfMMD9aS/5V8yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADW6C/zA1jBRTrR9QAAAABJRU5ErkJggg==" style="background: var(--artdeco-reset-base-background-transparent); border-radius: 0px; border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; color: var(--color-text); display: inline-block; font-size: var(--artdeco-reset-base-font-size-hundred-percent); height: auto; margin: 0px auto; max-width: 720px; outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); transition: outline 223ms ease 0s, width 223ms ease 0s; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); width: 720px;" /><figcaption contenteditable="true" data-placeholder="Add caption for image (optional)" spellcheck="false" style="align-items: center; background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; color: var(--color-text-low-emphasis); display: flex; font-size: var(--font-size-small); justify-content: center; margin-top: 1.6rem; padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline); width: 720px;" tabindex="0">Simple object model</figcaption></figure><p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space: pre-wrap;"><br style="box-sizing: border-box;" /></p><p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space: pre-wrap;"><span style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; font-size: var(--artdeco-reset-base-font-size-hundred-percent); margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><b>Benefits of Event-Driven Microservices</b></span></p><p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space: pre-wrap;">An event-driven microservices architecture provides several benefits over traditional architectures. Some of these benefits include:</p><p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space: pre-wrap;"><span style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; font-size: var(--artdeco-reset-base-font-size-hundred-percent); margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><b>Loosely coupled:</b></span> Event-driven microservices architecture allows services to be loosely coupled, meaning each service can operate independently without knowing about the other services.</p><p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space: pre-wrap;"><span style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; font-size: var(--artdeco-reset-base-font-size-hundred-percent); margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><b>Scalability:</b></span> Event-driven microservices architecture enables services to be scaled independently, which allows organizations to scale specific services according to their demand.</p><p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space: pre-wrap;"><span style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; font-size: var(--artdeco-reset-base-font-size-hundred-percent); margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><b>Fault-tolerance:</b></span> Event-driven microservices architecture enables microservices to handle failures gracefully, which makes the system more fault-tolerant.</p><p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space: pre-wrap;"><span style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; font-size: var(--artdeco-reset-base-font-size-hundred-percent); margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><b>Flexibility:</b></span> Event-driven microservices architecture enables services to be easily modified and updated without affecting other services.</p><p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space: pre-wrap;"><span style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; font-size: var(--artdeco-reset-base-font-size-hundred-percent); margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><b>Event-Driven Architecture on Salesforce</b></span></p><p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space: pre-wrap;">Salesforce provides a robust event-driven architecture enabling developers to build highly scalable, fault-tolerant, loosely coupled microservices. Salesforce uses the Salesforce Event Bus to manage the events between services.</p><p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space: pre-wrap;"><span style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; font-size: var(--artdeco-reset-base-font-size-hundred-percent); font-weight: var(--artdeco-reset-typography-font-weight-bold); margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">The Salesforce Event Bus provides the following capabilities:</span></p><p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space: pre-wrap;"><span style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; font-size: var(--artdeco-reset-base-font-size-hundred-percent); margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><b>Publish/Subscribe Model:</b></span> The Salesforce Event Bus provides a publish/subscribe model that allows services to publish and subscribe to events. This model ensures that services are loosely coupled and can operate independently.</p><p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space: pre-wrap;"><span style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; font-size: var(--artdeco-reset-base-font-size-hundred-percent); margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><b>Asynchronous Communication:</b></span> The Salesforce Event Bus provides asynchronous communication between services, which enables the system to handle large volumes of events without affecting performance.</p><p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space: pre-wrap;"><span style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; font-size: var(--artdeco-reset-base-font-size-hundred-percent); margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><b>Replay Capability:</b></span> The Salesforce Event Bus provides a replay capability, which allows services to replay events that have been missed due to failures or downtime.</p><p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space: pre-wrap;">Here's an example of how we can use event-driven microservices to update a Salesforce account:</p><figure class="slate-resizable-image-embed slate-image-embed__resize-full-width" contenteditable="false" data-imgsrc="data:image/png;base64,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" style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; clear: both; color: rgba(0, 0, 0, 0.9); cursor: text; display: var(--artdeco-reset-base-display-block); font-family: Helvetica, Arial, sans-serif; font-size: 13px; margin: var(--artdeco-reset-base-margin-zero); padding: var(--artdeco-reset-base-padding-zero); position: relative; text-align: center; transition: margin 223ms ease 0s; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space: pre-wrap;"><ul class="slate-image-embed__toolbar" data-slate-ignore="true" style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; color: var(--color-text); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-size: var(--font-size-large); height: 48px; left: 0px; line-height: 1.75; margin: 0px; opacity: 0; padding: 0px 0px 8px; position: absolute; top: 0px; transition: all 332ms ease-in 0s; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); width: 720px;"><li style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; display: inline-block; font-size: var(--artdeco-reset-base-font-size-hundred-percent); list-style-type: inherit; margin: 0px 4px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><button aria-label="Align to the left" class="slate-image-embed-button slate-image-embed-button__resize-left artdeco-button artdeco-button--circle artdeco-button--muted artdeco-button--secondary" data-slate-ignore="true" style="align-items: center; background-attachment: initial; background-clip: initial; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border-color: initial; border-radius: var(--corner-radius-full) !important; border-style: none; border-width: initial; box-shadow: inset 0 0 0 1px var(--color-border); cursor: pointer; display: inline-flex; font-family: inherit; font-size: 1.6rem; font-weight: 600; height: 4rem; justify-content: center; line-height: 2rem; margin-bottom: 0px; max-width: 480px; min-height: 3.2rem; min-width: auto; overflow: hidden; padding: 0px !important; touch-action: manipulation; transition-duration: 167ms; transition-property: background-color, box-shadow, color; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); vertical-align: middle; width: 4rem;"><li-icon aria-hidden="true" size="large" style="box-sizing: border-box; display: inline-block; overflow: hidden; position: relative;" type="content-align-left"><svg class="mercado-match" data-supported-dps="24x24" fill="currentColor" focusable="false" height="24" viewbox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M21 3v2H3V3zm-6 6h6V7h-6zm0 4h6v-2h-6zm0 4h6v-2h-6zM3 21h18v-2H3zM13 7H3v10h10z"></path></svg></li-icon></button></li><li style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; display: inline-block; font-size: var(--artdeco-reset-base-font-size-hundred-percent); list-style-type: inherit; margin: 0px 4px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><button aria-label="Align in the middle" class="slate-image-embed-button slate-image-embed-button__resize-middle artdeco-button artdeco-button--circle artdeco-button--muted artdeco-button--secondary" data-slate-ignore="true" style="align-items: center; background-attachment: initial; background-clip: initial; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border-color: initial; border-radius: var(--corner-radius-full) !important; border-style: none; border-width: initial; box-shadow: inset 0 0 0 1px var(--color-border); cursor: pointer; display: inline-flex; font-family: inherit; font-size: 1.6rem; font-weight: 600; height: 4rem; justify-content: center; line-height: 2rem; margin-bottom: 0px; max-width: 480px; min-height: 3.2rem; min-width: auto; overflow: hidden; padding: 0px !important; touch-action: manipulation; transition-duration: 167ms; transition-property: background-color, box-shadow, color; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); vertical-align: middle; width: 4rem;"><li-icon aria-hidden="true" size="large" style="box-sizing: border-box; display: inline-block; overflow: hidden; position: relative;" type="content-align-center"><svg class="mercado-match" data-supported-dps="24x24" fill="currentColor" focusable="false" height="24" viewbox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M21 3v2H3V3zM3 21h18v-2H3zM7 7v10h10V7z"></path></svg></li-icon></button></li><li style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; display: inline-block; font-size: var(--artdeco-reset-base-font-size-hundred-percent); list-style-type: inherit; margin: 0px 4px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><button aria-label="Resize to full width" aria-pressed="true" class="slate-image-embed-button slate-image-embed-button__resize-full-width artdeco-button artdeco-button--circle artdeco-button--muted slate-image-embed-button__active" data-slate-ignore="true" style="align-items: center; background-attachment: initial; background-clip: initial; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border-color: initial; border-radius: var(--corner-radius-full) !important; border-style: none; border-width: initial; cursor: pointer; display: inline-flex; font-family: inherit; font-size: 1.6rem; font-weight: 600; height: 4rem; justify-content: center; line-height: 2rem; margin-bottom: 0px; max-width: 480px; min-height: 3.2rem; min-width: auto; overflow: hidden; padding: 0px !important; touch-action: manipulation; transition-duration: 167ms; transition-property: background-color, box-shadow, color; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); vertical-align: middle; width: 4rem;"><li-icon aria-hidden="true" size="large" style="box-sizing: border-box; display: inline-block; overflow: hidden; position: relative;" type="content-full-width"><svg class="mercado-match" data-supported-dps="24x24" fill="currentColor" focusable="false" height="24" viewbox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M21 3v2H3V3zM3 21h18v-2H3zm0-4h18V7H3z"></path></svg></li-icon></button></li><li style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; display: inline-block; font-size: var(--artdeco-reset-base-font-size-hundred-percent); list-style-type: inherit; margin: 0px 4px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><button aria-label="Align to the right" class="slate-image-embed-button slate-image-embed-button__resize-right artdeco-button artdeco-button--circle artdeco-button--muted artdeco-button--secondary" data-slate-ignore="true" style="align-items: center; background-attachment: initial; background-clip: initial; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border-color: initial; border-radius: var(--corner-radius-full) !important; border-style: none; border-width: initial; box-shadow: inset 0 0 0 1px var(--color-border); cursor: pointer; display: inline-flex; font-family: inherit; font-size: 1.6rem; font-weight: 600; height: 4rem; justify-content: center; line-height: 2rem; margin-bottom: 0px; max-width: 480px; min-height: 3.2rem; min-width: auto; overflow: hidden; padding: 0px !important; touch-action: manipulation; transition-duration: 167ms; transition-property: background-color, box-shadow, color; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); vertical-align: middle; width: 4rem;"><li-icon aria-hidden="true" size="large" style="box-sizing: border-box; display: inline-block; overflow: hidden; position: relative;" type="content-align-right"><svg class="mercado-match" data-supported-dps="24x24" fill="currentColor" focusable="false" height="24" viewbox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M21 3v2H3V3zM9 7H3v2h6zm0 4H3v2h6zm0 4H3v2h6zm-6 6h18v-2H3zm8-4h10V7H11z"></path></svg></li-icon></button></li></ul><button aria-label="Add a link to the embedded image" class="slate-image-embed__link-button artdeco-button artdeco-button--circle artdeco-button--muted artdeco-button--secondary" data-slate-ignore="true" style="align-items: center; background-attachment: initial; background-clip: initial; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border-color: initial; border-radius: var(--corner-radius-full) !important; border-style: none; border-width: initial; box-shadow: inset 0 0 0 1px var(--color-border); cursor: pointer; display: inline-flex; font-family: inherit; font-size: 1.6rem; font-weight: 600; height: 4rem; justify-content: center; line-height: 2rem; margin-bottom: 0px; max-width: 480px; min-height: 3.2rem; min-width: auto; opacity: 0; overflow: hidden; padding: 0px !important; position: absolute; right: 0px; top: 0px; touch-action: manipulation; transition: all 332ms ease-in 0s; vertical-align: middle; width: 4rem; z-index: 0;"><li-icon aria-hidden="true" size="large" style="box-sizing: border-box; display: inline-block; overflow: hidden; position: relative;" type="link"><svg class="mercado-match" data-supported-dps="24x24" fill="currentColor" focusable="false" height="24" viewbox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M19.83 4.17a4 4 0 00-5.66 0l-2 2A4 4 0 0011 9a4 4 0 00.56 2l-.54.54a4 4 0 00-4.85.63l-2 2a4 4 0 005.66 5.66l2-2A4 4 0 0013 15a4 4 0 00-.56-2l.54-.54a4 4 0 004.85-.63l2-2a4 4 0 000-5.66zM11 15a2 2 0 01-.59 1.41l-2 2a2 2 0 11-3-2.6l.22-.22 2-2A2 2 0 019 13a2.24 2.24 0 01.51.07l-1.22 1.22a1 1 0 000 1.41 1 1 0 001.41 0l1.22-1.22A2.24 2.24 0 0111 15zm7.41-6.59l-2 2A2 2 0 0115 11a2.24 2.24 0 01-.51-.07l1.22-1.22A1 1 0 0016 9a1 1 0 00-.29-.7A1 1 0 0015 8a1 1 0 00-.7.29l-1.23 1.22A2.24 2.24 0 0113 9a2 2 0 01.59-1.41l2-2a2 2 0 013 2.6z"></path></svg></li-icon></button><button aria-label="Add alt text to image" class="slate-image-embed__desc-button artdeco-button artdeco-button--muted artdeco-button--1 align-items-center" data-slate-ignore="true" style="align-items: center !important; background-attachment: initial; background-clip: initial; background-image: none; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border-color: initial; border-radius: var(--corner-radius-large) !important; border-style: none; border-width: initial; cursor: pointer; display: inline-flex; font-family: inherit; font-size: 1.4rem; font-weight: 600; height: 2.4rem; justify-content: center; line-height: 2rem; margin-bottom: 0px; max-width: 480px; min-height: 2.4rem; min-width: 0px; overflow: hidden; padding: 0px 0.8rem; position: absolute; right: 0.8rem; top: 0.8rem; touch-action: manipulation; transition-duration: 167ms; transition-property: background-color, box-shadow, color; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); vertical-align: middle;"><li-icon aria-hidden="true" class="mr1" size="small" style="box-sizing: border-box; display: inline-block; margin-right: 4px !important; overflow: hidden; position: relative;" type="pencil"><svg class="mercado-match" data-supported-dps="16x16" fill="currentColor" focusable="false" height="16" viewbox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M14.13 1.86a3 3 0 00-4.17 0l-7 7L1 15l6.19-2 6.94-7a3 3 0 000-4.16zm-8.36 9.71l-1.35-1.34L9.64 5 11 6.35z"></path></svg></li-icon><span class="t-sans" style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; font-family: var(--artdeco-typography-sans); font-size: var(--artdeco-reset-base-font-size-hundred-percent); margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">Add alt text</span></button><img alt="No alt text provided for this image" class="slate-image-embed__resize-full-width" data-media-urn="urn:li:digitalmediaAsset:D4E12AQHAp7vROHzKmQ" src="data:image/png;base64,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" style="background: var(--artdeco-reset-base-background-transparent); border-radius: 0px; border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; color: var(--color-text); display: inline-block; font-size: var(--artdeco-reset-base-font-size-hundred-percent); height: auto; margin: 0px auto; max-width: 720px; outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); transition: outline 223ms ease 0s, width 223ms ease 0s; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); width: 720px;" /><figcaption contenteditable="true" data-placeholder="Add caption for image (optional)" spellcheck="false" style="align-items: center; background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; color: var(--color-text-low-emphasis); display: flex; font-size: var(--font-size-small); justify-content: center; margin-top: 1.6rem; padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline); width: 720px;" tabindex="0">Activity diagram for Event-Driven Architecture</figcaption></figure><p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space: pre-wrap;">Imagine we have a Salesforce System with a custom order management solution. When the order is created, we want to update any customer information that is processed with the order.</p><p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space: pre-wrap;">In a traditional model, we must update the account on Create of an order. We can do so by creating a trigger, a rest update or a flow. But if the update fails, the result will always fail the entire transaction.</p><p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space: pre-wrap;">However, in an EVENTful service, we create two microservices, one that handles account information and another that handles orders. When a new order is created, the order service can emit an "order created" event that includes the Account information. Customer Microservice can then subscribe to this event and update the account information with the new order details.</p><p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space: pre-wrap;">This way, the two microservices are loosely coupled and can operate independently. The customer service doesn't need to know about the order service, and the order service doesn't need to know about the customer service. Instead, they communicate through events, which makes the system more scalable, fault-tolerant, and flexible.</p><p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space: pre-wrap;">In the future, if we get any more information from the order service to update in another object, we only have a create a new microservice to pick up relevant information. </p><p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space: pre-wrap;"><span style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; font-size: var(--artdeco-reset-base-font-size-hundred-percent); margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><b>Conclusion</b></span></p><p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: border-box; color: rgba(0, 0, 0, 0.9); counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; cursor: text; font-family: Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: 0px; vertical-align: var(--artdeco-reset-base-vertical-align-baseline); white-space: pre-wrap;">Event-driven microservices architecture is a powerful pattern that enables organizations to build highly scalable, fault-tolerant, loosely coupled systems.</p>Siddhesh Kabehttp://www.blogger.com/profile/05949517024873104589noreply@blogger.com1tag:blogger.com,1999:blog-3283225244263709141.post-32808192920262613752023-01-31T16:18:00.004-08:002023-01-31T16:24:42.468-08:00Let's settle the debate between Custom Metadata, Custom Objects and Custom Settings<p class="reader-text-block__paragraph" style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><br /></p><p class="reader-text-block__paragraph" style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">This is a common scenario in any design meeting. First, you have the one person who recommends using Custom Metadata for something that clearly should be a Custom Object. But custom metadata can be deployed using the release pipeline, and it's easy. Why do we create too many custom objects? Knowing the purpose behind these features is essential to use them effectively.</p><p class="reader-text-block__paragraph" style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">Let's start with custom settings. These bad boys are like the steroids of your application, allowing you to store information such as default values, external service endpoints, or other data that needs to be accessed at warp speed. Thanks to custom settings being cached in memory, they're always ready to go when needed. Plus, they can be accessed by Apex classes, Visualforce pages, and formula fields, making them the perfect tool for storing data that needs to be accessed quickly.</p><p class="reader-text-block__paragraph" style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">Next up, custom metadata types. These are like the blueprints of your application, allowing you to control your application based on its value. Custom metadata is perfect for storing information that needs to be accessed by Apex classes, Visualforce pages, formula fields and validation rules. Still, it's meant to keep only a small amount of data. Think of it as the blueprint of your application, giving you a clear and organized structure for your data. One of the biggest arguments for this is that it can be moved as metadata during deployment in SFDX, but we have to understand that choosing a feature is not a decision made to make the life of a tech team easy but better for the system.</p><p class="reader-text-block__paragraph" style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">Finally, we have custom objects. These are the powerhouses of your application, allowing you to store data specific to your organization. They're great for storing information such as customers, products, or other data that must be kept in Salesforce. Custom objects can be accessed by Apex classes, Visualforce pages, and formula fields, and they can also be used to create custom tabs, reports, and dashboards. They're the perfect tool for storing large amounts of data and giving your application the structure and power it needs to knock the socks off of your users.</p><p class="reader-text-block__paragraph" style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: var(--font-size-large); line-height: 1.75; margin: 1.6rem 0px; padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">In short, custom settings are your steroids, custom metadata is your blueprint, and custom objects are your powerhouses. Understanding when to use each one will help you create better Salesforce applications. What do you think?</p>Siddhesh Kabehttp://www.blogger.com/profile/05949517024873104589noreply@blogger.com0tag:blogger.com,1999:blog-3283225244263709141.post-5351522973609905852022-02-11T02:27:00.004-08:002022-02-11T02:27:50.883-08:00The tale of two biryani<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEiRWRBQM_9XPKIiO1hy3ePqx_2QqoG4wdbslUyhazKsfBBdot---ybg-WATUWhgliwXwUUkfx4lYuvZlYnZCIKwFh37t3_uoVnqXBMtpojf7Hm205Kyku-hZzt6wZ03K5c3jwZGRzEHmujwB7HE1FrbUblhapogo4ZGl9cAYtJdZ4-cNpgp6cMrek2q=s960" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="Biryani image by Pixabay" border="0" data-original-height="720" data-original-width="960" height="480" src="https://blogger.googleusercontent.com/img/a/AVvXsEiRWRBQM_9XPKIiO1hy3ePqx_2QqoG4wdbslUyhazKsfBBdot---ybg-WATUWhgliwXwUUkfx4lYuvZlYnZCIKwFh37t3_uoVnqXBMtpojf7Hm205Kyku-hZzt6wZ03K5c3jwZGRzEHmujwB7HE1FrbUblhapogo4ZGl9cAYtJdZ4-cNpgp6cMrek2q=w640-h480" title="Biryani image by Pixabay" width="640" /></a></div><p class="reader-text-block__paragraph" style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: "Source Serif Pro", serif; font-size: var(--font-size-large); line-height: 3.2rem; margin: 3.2rem 0px; padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><span style="font-size: var(--font-size-large);">Before we begin, let us address the elephant in the room - what is a Biryani? Those who have not yet faced globalisation at the scale the world is moving on. Biryani is a dish in which succulent pieces of meat are cooked to perfection sandwiched between multiple layers of rice that is lightly spiced with thirty-six different spices. Those who have had the pleasure of meeting me (before March 2020) know that I have this persistent dream of having all types of biryanis in the world.</span></p><p class="reader-text-block__paragraph" style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: "Source Serif Pro", serif; font-size: var(--font-size-large); line-height: 3.2rem; margin: 3.2rem 0px; padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><span style="font-size: var(--font-size-large);">But this is not a food post. This is a post about observation and the value of change management in business. I had a favourite biryani shop on my way home from work. I had to ration my travel to make sure I do not eat there every day. The chef had a knack for making Biryani. However, he had no business acumen. He decided to keep his shop low-key, he offered no credit/debit card facility.</span></p><p class="reader-text-block__paragraph" style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: "Source Serif Pro", serif; font-size: var(--font-size-large); line-height: 3.2rem; margin: 3.2rem 0px; padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">He only offered Biryani, and he was good at it. There were queues outside his shop that blocked the entire pavement, to the annoyance of the travellers. Needless to say, he was popular.</p><p class="reader-text-block__paragraph" style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: "Source Serif Pro", serif; font-size: var(--font-size-large); line-height: 3.2rem; margin: 3.2rem 0px; padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">His sous chef started a completing Biryani shop in 2019 in the same area. He was a good chef but he was not the best. His entire marketing strategy was to jump on the tailwind of the original Biryani restaurant. He upgraded the infrastructure, offered credit/debit card payments. He negotiated with food delivery agents. Still, there was no business, nothing compared to the original biryani shop.</p><p class="reader-text-block__paragraph" style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: "Source Serif Pro", serif; font-size: var(--font-size-large); line-height: 3.2rem; margin: 3.2rem 0px; padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">And then everything changes. Someone tried to eat a bat or a pangolin or there was a freak accident in a lab somewhere. But Covid hit the world, faster than Sterling runs with the ball towards the goal post. And as lockdown shut the places and people crawled back into enclosed spaces, the original biryani shop started feeling the brunt.</p><p class="reader-text-block__paragraph" style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: "Source Serif Pro", serif; font-size: var(--font-size-large); line-height: 3.2rem; margin: 3.2rem 0px; padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">The new Biryani shop already had the habit of deliveries, his revenue model changed, it was a very short trip for him to prep for the pandemic. I could now order biryani from the comfort of my house. No need to stay in the queue, no need to carry loose change to give in the shop. And by the time the original biryani shop caught up, it was already too late.</p><p class="reader-text-block__paragraph" style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: "Source Serif Pro", serif; font-size: var(--font-size-large); line-height: 3.2rem; margin: 3.2rem 0px; padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">Few of the regular customers had changed their palette and moved to the new biryani shop. And as I gobbled on the succulent meat, I could not help but wonder. Having one good thing about your business is not enough in modern times. The one thing that you are good at is the icing on top. The cake is a robust infrastructure that is hazards and pandemic proof.</p><p class="reader-text-block__paragraph" style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: "Source Serif Pro", serif; font-size: var(--font-size-large); line-height: 3.2rem; margin: 3.2rem 0px; padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">Now, a pandemic is a once-in-a-life event, and you cannot prepare for such a calamity. But using the tools that support your business process will open your business to better avenues. Falling behind the technical curve because you are unfamiliar is not an excuse. We live in an exceeding post-pandemic world.</p><p class="reader-text-block__paragraph" style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: "Source Serif Pro", serif; font-size: var(--font-size-large); line-height: 3.2rem; margin: 3.2rem 0px; padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">If the pandemic has been hard on your business, you have fallen behind on the technology curve. Like it or not technology is now penetrating our life deeper than the needle of COVID vaccines enter. People are wearing devices on their bodies, we have come a long way from that lone telephone kept in the corner of our houses. Sixty years ago we used to carry a cheque book in our pocket, now we carry the entire bank in them.</p><p class="reader-text-block__paragraph" style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: "Source Serif Pro", serif; font-size: var(--font-size-large); line-height: 3.2rem; margin: 3.2rem 0px; padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><span style="font-size: var(--font-size-large);">It is time to reinvent your business for the modern world. Because in this world, doing one thing is not enough. You need the technological backbone behind your talent, else like the first biryani shop, you end up losing to the next big thing!</span></p><p class="reader-text-block__paragraph" style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: "Source Serif Pro", serif; font-size: var(--font-size-large); line-height: 3.2rem; margin: 3.2rem 0px; padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">What do you think?</p><div class="separator" style="clear: both;"></div>Siddhesh Kabehttp://www.blogger.com/profile/05949517024873104589noreply@blogger.com0tag:blogger.com,1999:blog-3283225244263709141.post-46963798710466823482021-11-18T09:23:00.001-08:002022-02-11T02:28:07.587-08:00A monologue on decluttering your mind<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/-iWqmDsRAMKk/YZaMZSUFgEI/AAAAAAABHT0/xWD-ZXogvEE0Syp7dr915DsG2-8fjs3QACLcBGAsYHQ/s1079/1626194865442.jpeg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="720" data-original-width="1079" height="427" src="https://1.bp.blogspot.com/-iWqmDsRAMKk/YZaMZSUFgEI/AAAAAAABHT0/xWD-ZXogvEE0Syp7dr915DsG2-8fjs3QACLcBGAsYHQ/w640-h427/1626194865442.jpeg" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;"><span style="background-color: white; color: rgba(0, 0, 0, 0.6); font-family: -apple-system, system-ui, "system-ui", "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: 12px;">Photo by Burst on StockSnap</span></td></tr></tbody></table><p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: "Source Serif Pro", serif; font-size: var(--font-size-large); line-height: 3.2rem; margin: 3.2rem 0px; padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">The year 2021 saw me moving into a brand new apartment. The excitement of starting over a new chapter ushered in the uncertainty of where to put few things that were part of the daily driver.</p><p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: "Source Serif Pro", serif; font-size: var(--font-size-large); line-height: 3.2rem; margin: 3.2rem 0px; padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><span style="font-size: var(--font-size-large);">E.g., I had a 5 pounds coffee table that I had got from Ikea. The coffee table had become part of my life for seven years. I kept my feet up on it when tired, I had dinner on it when glued to the television. The table was part of 15% of my living life to date.</span></p><p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: "Source Serif Pro", serif; font-size: var(--font-size-large); line-height: 3.2rem; margin: 3.2rem 0px; padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><span style="font-size: var(--font-size-large);">And yet when I actually brought it over to the new house, I suddenly found it out of style. Suddenly, it was tacky, bright red and it was unimaginative. My partner was already gunning for it since the day she stepped foot into the house. Like any government in a functioning democracy, the table lost its vote of confidence in the house. We had to give it away.</span></p><div class="slate-resizable-image-embed slate-image-embed__resize-middle" style="background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; clear: both; color: rgba(0, 0, 0, 0.9); font-family: "Source Serif Pro", serif; font-size: var(--font-size-large); line-height: 3.2rem; margin: 3.2rem 0px; padding: var(--artdeco-reset-base-padding-zero); position: relative; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);"><img alt="Red coffee table" data-li-src="https://media-exp1.licdn.com/dms/image/C5612AQHEQU0Kiw9kDw/article-inline_image-shrink_1000_1488/0/1626182464029?e=1642636800&v=beta&t=fh8sLvE7Haim1ni_Nlt17hRhWTx13W-s1G4PUugkdfQ" data-media-urn="" src="https://media-exp1.licdn.com/dms/image/C5612AQHEQU0Kiw9kDw/article-inline_image-shrink_1000_1488/0/1626182464029?e=1642636800&v=beta&t=fh8sLvE7Haim1ni_Nlt17hRhWTx13W-s1G4PUugkdfQ" style="background: var(--artdeco-reset-base-background-transparent); border-radius: var(--corner-radius-medium); border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: var(--color-text); display: block; font-size: var(--artdeco-reset-base-font-size-hundred-percent); height: auto; margin-left: auto; margin-right: auto; max-width: 432px; outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);" /></div><p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: "Source Serif Pro", serif; font-size: var(--font-size-large); line-height: 3.2rem; margin: 3.2rem 0px; padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">And that brings me to another incident that happened at work. When designing a solution for a customer, we came across the problem of <span style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; font-size: var(--artdeco-reset-base-font-size-hundred-percent); font-weight: var(--artdeco-reset-typography-font-weight-bold); margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">cloning the opportunity</span>. This is not a new problem to solve. Many customers have asked for the ability to automatically clone their records. The countless users who have send their goodwill in the universe for the ability of a simple button interface that will clone their record, thus improving speed of operation and thus adaptability.</p><p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: "Source Serif Pro", serif; font-size: var(--font-size-large); line-height: 3.2rem; margin: 3.2rem 0px; padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">Therefore it was second nature to suggest what was done for many times before, write an apex class to perform a deep clone. The words were out of my mouth even before I could think about it. Who likes to reinvent the wheel now?</p><p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: "Source Serif Pro", serif; font-size: var(--font-size-large); line-height: 3.2rem; margin: 3.2rem 0px; padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">And here lies the problem, like my red coffee table, the solution for cloning the record using apex is now absolute. In this new lightning fast and flowing world, the ability to clone has <a href="https://admin.salesforce.com/blog/2020/duplicate-a-record-with-lightning-flow-in-spring-20" rel="nofollow noopener" style="background-color: var(--artdeco-reset-link-background-color-transparent); border: var(--artdeco-reset-link-border-zero); box-sizing: inherit; font-size: var(--artdeco-reset-base-font-size-hundred-percent); font-weight: 600; margin: var(--artdeco-reset-base-margin-zero); overflow-wrap: break-word; padding: var(--artdeco-reset-base-padding-zero); text-decoration: var(--artdeco-reset-link-text-decoration-none); touch-action: manipulation; vertical-align: var(--artdeco-reset-base-vertical-align-baseline);" target="_blank">gone declaritive</a>. More than once, had I stumbled upon a blog that described how to write a flow to clone a record.</p><p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: "Source Serif Pro", serif; font-size: var(--font-size-large); line-height: 3.2rem; margin: 3.2rem 0px; padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">B<span style="background: var(--artdeco-reset-base-background-transparent); border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; font-size: var(--artdeco-reset-base-font-size-hundred-percent); margin: var(--artdeco-reset-base-margin-zero); outline: var(--artdeco-reset-base-outline-zero); padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">ut since the mind is full with so much information that sometimes decluttering is the key to efficiently using the mind. Salesforce is an evolving tech and upgrades itself every few months. As new information piles up, it is equality important to unlearn many things we have learned in the past.</span></p><p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: "Source Serif Pro", serif; font-size: var(--font-size-large); line-height: 3.2rem; margin: 3.2rem 0px; padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">Like my coffee table, however, there is no charity that will accept old information. Some information you have to forget to make room for new and better information.</p><p style="--artdeco-reset-typography_getfontsize: 1.6rem; --artdeco-reset-typography_getlineheight: 1.5; background-color: white; border: var(--artdeco-reset-base-border-zero); box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: "Source Serif Pro", serif; font-size: var(--font-size-large); line-height: 3.2rem; margin: 3.2rem 0px; padding: var(--artdeco-reset-base-padding-zero); vertical-align: var(--artdeco-reset-base-vertical-align-baseline);">Don't you think?</p>Siddhesh Kabehttp://www.blogger.com/profile/05949517024873104589noreply@blogger.com0tag:blogger.com,1999:blog-3283225244263709141.post-76503541085973930582019-12-19T01:53:00.000-08:002019-12-21T02:28:07.603-08:00Top four design patterns and algorithm that every Salesforce Developer should know<div dir="ltr" style="text-align: left;" trbidi="on">
A few days ago I was speaking to a developer friend, he was asked about a Singleton design pattern and he had no idea about. He spoke about how we developers never talk about patterns. And that time it hit me, we developers do not talk about design patterns and algorithms. There are many design patterns available off the shelf, they talk in detail about the problems they can solve. However, in my experience, I have come across and used the following<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-YcZz7y3whi0/Xft9exPR_JI/AAAAAAAA3Mk/x2Puxb48Ul8lfNJ194jVlNLpk3NbPOEdACLcBGAsYHQ/s1600/FSVA6VJ2XI.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="612" data-original-width="960" height="408" src="https://1.bp.blogspot.com/-YcZz7y3whi0/Xft9exPR_JI/AAAAAAAA3Mk/x2Puxb48Ul8lfNJ194jVlNLpk3NbPOEdACLcBGAsYHQ/s640/FSVA6VJ2XI.jpg" width="640" /></a></div>
<br />
<br />
<h2 style="text-align: left;">
1. Singleton</h2>
This is one of the most common and important design pattern to be used. When initiating objects, we need to make sure only one instance of the object is initiated. In a multi-tenant system like Salesforce, it becomes imperative that we do not hog more resources than needed<br />
Lets look at an example<br />
<br />
<pre class="prettyprint lang-java">trigger AccountTrigger on Account (before insert, before update) {
for(Account record : Trigger.new){
AccountMasterRecordType rt = new AccountMasterRecordType ();
....
}
}
</pre>
<br />
<pre class="prettyprint lang-java">public class AccountMasterRecordType {
string recordTypeid;
public string AccountMasterRecordType (){
string recordTypeid = Account.sObjectType.getDescribe().getRecordTypeInfosByName().get('Client').getRecordTypeId();
}
}</pre>
<pre></pre>
<pre></pre>
<br />
<br />
When we apply Singleton pattern, the AccountMasterRecordType Handler changes to this,<br />
<br />
<pre class="prettyprint lang-java">public class AccountMasterRecordType {
// private static variable referencing the class
private static AccountMasterRecordType instance = null;
public String recordTypeid{get;private set;} // the id of the record type
// The constructor is private and initializes the id of the record type
private AccountMasterRecordType (){
recordTypeid= Account.sObjectType.getDescribe()
.getRecordTypeInfosByName().get('Client').getRecordTypeId();
}
>
// a static method that returns the instance of the record type
public static AccountMasterRecordType getInstance(){
// lazy load the record type - only initialize if it doesn't already exist
if(instance == null) instance = new AccountMasterRecordType();
return instance;
}
}
</pre>
<br />
In the Singleton framework pattern, we initialise every object only once. Not only do we save precious resources but we can also save DMLs and running into governor limits using the framework. More information about <a href="https://developer.salesforce.com/page/Apex_Design_Patterns#Singleton" target="_blank">singleton</a><br />
<br />
<h2 style="text-align: left;">
2. Decorative</h2>
I have used decorator pattern for ages. One of the most common implementation is when you have to build a visualforce page with checkbox selectors. You have capture or display attributes that are not present on the object, you can use the decorative framework.<br />
<br />
For e.g.,<br />
<br />
<pre class="prettyprint lang-java">public with sharing class WrapperDisplay{
public List<OpportunityDecorator> lstwrapperOpp {get;set;}
public WrapperDisplay(){
lstwrapperOpp = new List<OpportunityDecorator>();
for(opportunity opp : [select Id, Name from opportunity limit 10]){
lstwrapperOpp.add(new wrapper(opp));
}
}
//Wrapper Class Construction
public class OpportunityDecorator{
Boolean Select;
Opportunity opp;
// Wrapper class constructor
public OpportunityDecorator(opportunity opp){
opp=opp;
}
}
}</pre>
<br />
<br />
<h2 style="text-align: left;">
3. iTrigger factory pattern</h2>
<div>
<div style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #1c1e29; margin-bottom: 0pt; margin-top: 0pt;">
<span data-preserver-spaces="true" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; margin-bottom: 0pt; margin-top: 0pt;">This topic is very vast and there are multiple blog posts written on this topic. There is no common trigger pattern but one that is heavily recommended is the iTrigger factory pattern by </span><strong style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; margin-bottom: 0pt; margin-top: 0pt;">Tony Scott.</strong></div>
<div style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #1c1e29; margin-bottom: 0pt; margin-top: 0pt;">
<span data-preserver-spaces="true" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; margin-bottom: 0pt; margin-top: 0pt;">Trigger pattern is essential to normalise your trigger and control the flow of execution. Given any salesforce project, there will be instances of writing a trigger.</span></div>
<div style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #1c1e29; margin-bottom: 0pt; margin-top: 0pt;">
<span data-preserver-spaces="true" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; margin-bottom: 0pt; margin-top: 0pt;"><br />
</span></div>
<div style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #1c1e29; margin-bottom: 0pt; margin-top: 0pt;">
<span data-preserver-spaces="true" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; margin-bottom: 0pt; margin-top: 0pt;">The majority of governor issues will arise in and around writing bad triggers and most of them can be quelled by using a good trigger pattern. You can read the original <a href="https://meltedwires.com/2013/06/05/trigger-pattern-for-tidy-streamlined-bulkified-triggers-revisited/" target="_blank">trigger pattern here</a></span></div>
<div style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #1c1e29; margin-bottom: 0pt; margin-top: 0pt;">
<span data-preserver-spaces="true" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; margin-bottom: 0pt; margin-top: 0pt;"><br />
</span></div>
<div style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #1c1e29; margin-bottom: 0pt; margin-top: 0pt;">
<span data-preserver-spaces="true" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; margin-bottom: 0pt; margin-top: 0pt;"><br />
</span></div>
<div style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #1c1e29; margin-bottom: 0pt; margin-top: 0pt;">
<span data-preserver-spaces="true" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; margin-bottom: 0pt; margin-top: 0pt;"><br />
</span></div>
</div>
<div>
<pre class="prettyprint lang-java">/**
* Interface containing methods Trigger Handlers must implement to enforce best practice
* and bulkification of triggers.
*/
public interface ITrigger
{
/**
* bulkBefore
*
* This method is called prior to execution of a BEFORE trigger. Use this to cache
* any data required into maps prior execution of the trigger.
*/
void bulkBefore();
/**
* bulkAfter
*
* This method is called prior to execution of an AFTER trigger. Use this to cache
* any data required into maps prior execution of the trigger.
*/
void bulkAfter();
/**
* beforeInsert
*
* This method is called iteratively for each record to be inserted during a BEFORE
* trigger. Never execute any SOQL/SOSL etc in this and other iterative methods.
*/
void beforeInsert(SObject so);
/**
* beforeUpdate
*
* This method is called iteratively for each record to be updated during a BEFORE
* trigger.
*/
void beforeUpdate(SObject oldSo, SObject so);
/**
* beforeDelete
*
* This method is called iteratively for each record to be deleted during a BEFORE
* trigger.
*/
void beforeDelete(SObject so);
/**
* afterInsert
*
* This method is called iteratively for each record inserted during an AFTER
* trigger. Always put field validation in the 'After' methods in case another trigger
* has modified any values. The record is 'read only' by this point.
*/
void afterInsert(SObject so);
/**
* afterUpdate
*
* This method is called iteratively for each record updated during an AFTER
* trigger.
*/
void afterUpdate(SObject oldSo, SObject so);
/**
* afterDelete
*
* This method is called iteratively for each record deleted during an AFTER
* trigger.
*/
void afterDelete(SObject so);
/**
* andFinally
*
* This method is called once all records have been processed by the trigger. Use this
* method to accomplish any final operations such as creation or updates of other records.
*/
void andFinally();
}
</pre>
<br /></div>
<div>
<br /></div>
This code is just as an example. Read the original blog post for complete implementation.<br />
<h2 style="text-align: left;">
4. Strategy</h2>
<div>
The iTrigger interface mentioned above brings us, by design, for the Strategy implementation design pattern. The strategy pattern allows us to define a family of algorithms, that can be selected and changed at runtime.</div>
<div>
<br /></div>
<div>
An example for this is,</div>
<div>
<br /></div>
<div>
<pre class="prettyprint lang-java">public interface paymentStrategy{
Boolean pay(double amount);
}
public class creditCardStrategy implements paymentStrategy{
private String name;
private String cardNumber;
private String cvv;
private date dateOfExpiry;
public boolean pay(double amount){
//Credit card interface using apexRest
}
}
public class paypalstrategy implements paymentStrategy{
private string emailid;
public boolean pay(double amount){//paypal interface using apexRest
}
}
</pre>
</div>
<div>
<br /></div>
<br />
Those are the top four patterns you should know about. What are some of the patterns you have used and how? Let me know in the comments below.<br />
<br />
References:<br />
<a href="https://developer.salesforce.com/page/Apex_Design_Patterns_-_Strategy" target="_blank">Apex Design Pattern</a><br />
<a href="https://meltedwires.com/2013/06/05/trigger-pattern-for-tidy-streamlined-bulkified-triggers-revisited/" target="_blank">iTrigger </a></div>
Siddhesh Kabehttp://www.blogger.com/profile/05949517024873104589noreply@blogger.com0tag:blogger.com,1999:blog-3283225244263709141.post-13893184437043565102019-12-05T05:51:00.001-08:002019-12-05T05:51:22.418-08:00Do you know how to write the code that survives the test of time<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: left;">
<span style="background-color: white; color: rgba(0 , 0 , 0 , 0.54); font-family: , "georgia" , "cambria" , "times new roman" , "times" , serif; font-size: 30px; letter-spacing: -0.336px;">“Y</span><span style="background-color: white; color: rgba(0 , 0 , 0 , 0.54); font-family: , "georgia" , "cambria" , "times new roman" , "times" , serif; font-size: 30px; letter-spacing: -0.336px;">ou have to be burning with an idea, or a problem, or a wrong that you want to right. If you’re not passionate enough from the start, you’ll never stick it out.” — Steve Jobs</span></div>
<br />
Just like the paintings of Jackson Pollock, a Salesforce Developer is an abstract concept. Therefore, it is prudent for me to confirm the audience for this post. To put it very simply, if you write code, this is for you. If you do clicks and not code, this article will mean nothing to you.<br />
<br />
With that out of the way, let's dig in. Salesforce is one of the hottest skills on the market and more and more people are moving towards the technology. It is wonderful to see new batch of developers, engineers getting into salesforce. In the last six months, I came across two instances, the first one, they had a lot of redundant code and the system was sluggish, slow and governor limits were flying off the charts. The second one had given up. They spun a brand new environment and we redoing the whole thing.<br />
<br />
Both the instances is not a healthy scope for a project and if you have to reinvest into the whole thing every few years, you are doing something wrong. So if you are a developer who have just started writing code, you should follow this list.<br />
<br />
<h2 style="text-align: left;">
<a href="http://4.bp.blogspot.com/-yr-_C5kxiIs/XekJzuGS8rI/AAAAAAAA3GU/-uKc9xH6ZkMZezmejb9tlxLyG7twiNyHwCK4BGAYYCw/s1600/baa.jpg" imageanchor="1"><img border="0" height="257" src="https://4.bp.blogspot.com/-yr-_C5kxiIs/XekJzuGS8rI/AAAAAAAA3GU/-uKc9xH6ZkMZezmejb9tlxLyG7twiNyHwCK4BGAYYCw/s400/baa.jpg" width="400" /></a></h2>
<h2 style="text-align: left;">
1. Don't create too many relationships</h2>
<div>
The customer wants reports about a primary contact associated with an account. Let me go and quickly create a lookup on account to the contact. DON'T. (very specific example!). The more lookups and master-details you create, the more convoluted your organisation will become. At some point, your objects will be so entangled that finding where the main record (or master record) in Salesforce resides will be a challenge. We live in a multi-tenant architecture, having too many relationships to the same object will completely fork your implementation.<br />
<br />
I'll refer to these blog posts for more information,<br />
<a href="https://www.youtube.com/watch?v=x9KqJcicD1g" target="_blank">The world is flat- design principles for data modeling</a><br />
<br />
<img alt="Image result for triggers in salesforce"" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhmvtCn6_0lJHiSEg-Qba9UxKRnVs2WS5GvtO3oTVbQ5scyIVwtDUQ3Kuc_gmiCb52d_AiGkEZiOGe8cvhLtMjqg0YLTyoHHr3Q5F_KGn4vQ9f8CpLvCzy6cyyk4uurnxG_wViEMSbhZ4/s1600/apex+trigger.png" /></div>
<h2 style="text-align: left;">
2. Don't just write triggers, think!</h2>
Triggers are the original sin on Salesforce. The little bits of code, mostly harmless, that majority of time gives you the too many SOQL, or too many DML or the most coveted, heap space allocation.<br />
If you are going to write the first trigger in your organisation, you have to think about the one after that and the one after that and so on.<br />
Why? Because triggers will always trigger other triggers and those triggers will trigger more triggers. Read that again.<br />
Over the period of time, triggers increase the technical debt and it is useful if you can set up some design principles before-hand.<br />
<a href="https://www.tutorialspoint.com/apex/apex_trigger_design_pattern.htm" target="_blank">There are many trigger design patterns in the community, you can choose one.</a><br />
<br />
<img alt="Image result for code comments funny"" src="https://stephenhaunts.files.wordpress.com/2014/07/comments.png" /><br />
<h2 style="text-align: left;">
3. Your code should have comments</h2>
<div>
This is more worrying trend that I have observed recently. Code that does not have comment is a garbage code. Your code should start with a proper class header, describing why in the godforsaken world have you decided to write the class. What is its purpose and why is it useful.</div>
<div>
Many developers fail to do this, assuming, they will be there if things go wrong. But remember time is not kind to people who do not change. Humans will move on. Code remains. And the next developer that looks at your code that lacked comments will belch at it.</div>
<div>
<br /></div>
<h2 style="text-align: left;">
<a href="http://2.bp.blogspot.com/-WLfJpQhkCiU/XekKo7zfNoI/AAAAAAAA3Gg/37L0p-1NPmc0bWO03fN6YfePREYJEhH0wCK4BGAYYCw/s1600/Flying-a-Jet-For-Dummies-47228.jpg" imageanchor="1"><img border="0" height="247" src="https://2.bp.blogspot.com/-WLfJpQhkCiU/XekKo7zfNoI/AAAAAAAA3Gg/37L0p-1NPmc0bWO03fN6YfePREYJEhH0wCK4BGAYYCw/s400/Flying-a-Jet-For-Dummies-47228.jpg" width="400" /></a></h2>
<h2 style="text-align: left;">
4. Always find time to learn new things</h2>
<div>
Salesforce is a evolving technology. They have conquered the market by evolving faster than their competition. Salesforce keeps adding new things and improving its interface. As a developer, you have to learn them all- the clouds, the configuration. You cannot just stick to the code because that's what you do. There will always be a better way to solve a problem. And you have to learn about it.<br />
<br />
<a href="http://2.bp.blogspot.com/-GbddDI3yxXg/XekLAkP4FjI/AAAAAAAA3Gs/FBYDBvXein88bxTvK07_R1HjHJOqM7lNQCK4BGAYYCw/s1600/f5b82e36cbd61a8e0a4d6c04484d0808.jpg" imageanchor="1"><img border="0" height="320" src="https://2.bp.blogspot.com/-GbddDI3yxXg/XekLAkP4FjI/AAAAAAAA3Gs/FBYDBvXein88bxTvK07_R1HjHJOqM7lNQCK4BGAYYCw/s320/f5b82e36cbd61a8e0a4d6c04484d0808.jpg" width="320" /></a></div>
<h2 style="text-align: left;">
5. Always improve your problem solving skills </h2>
<div>
Good developers stick to what they know. Good engineers solve problems better. A few years ago, we had ajax controls on visualforce. One of them was actionfunction. You declare an action function and you can then call that in any Java code</div>
<div>
<br /></div>
<br />
<pre class="prettyprint lang-xhtml"><!-- Page: -->
<apex:page controller="exampleCon">
<apex:form>
<!-- Define the JavaScript function sayHello-->
<apex:actionFunction name="sayHello" action="{!sayHello}" rerender="out" status="myStatus"/>
</apex:form>
<apex:outputPanel id="out">
<apex:outputText value="Hello "/>
<apex:actionStatus startText="requesting..." id="myStatus">
<apex:facet name="stop">{!username}</apex:facet>
</apex:actionStatus>
</apex:outputPanel>
<!-- Call the sayHello JavaScript function using a script element-->
<script>window.setTimeout(sayHello,2000)</script>
<p><apex:outputText value="Clicked? {!state}" id="showstate" /></p>
<!-- Add the onclick event listener to a panel. When clicked, the panel triggers
the methodOneInJavascript actionFunction with a param -->
<apex:outputPanel onclick="methodOneInJavascript('Yes!')" styleClass="btn">
Click Me
</apex:outputPanel>
<apex:form>
<apex:actionFunction action="{!methodOne}" name="methodOneInJavascript" rerender="showstate">
<apex:param name="firstParam" assignTo="{!state}" value="" />
</apex:actionFunction>
</apex:form>
</apex:page>
</pre>
<br />
<div>
<br /></div>
This method was considered the best method, until visualforce remoting came in picture. Now actionfunction is heavy, submits a form and is not realtime.<br />
<br />
<pre class="prettyprint"><script type="text/javascript">
Visualforce.remoting.timeout = 120000; // Set timeout at page level
function getRemoteAccount() {
var accountName = document.getElementById('acctSearch').value;
// This remoting call will use the page's timeout value
Visualforce.remoting.Manager.invokeAction(
'{!$RemoteAction.AccountRemoter.getAccount}',
accountName,
handleResult
);
}
function handleResult(result, event) { ... }
</script>
</pre>
In Salesforce there are always multiple ways of doing a particular thing. The difference between an ordinary programmer and the engineer is the ability to find the best possible fit. And when you do that your code will scale and survive the test of time.<br />
<h2 style="text-align: left;">
<a href="http://3.bp.blogspot.com/-CoiamaRJHpE/XekLSIP3dPI/AAAAAAAA3G4/QaUCruJtiEMEy_0GL-bNeaATYM5R8hL9gCK4BGAYYCw/s1600/download%2B%25281%2529.jpg" imageanchor="1"><img border="0" height="400" src="https://3.bp.blogspot.com/-CoiamaRJHpE/XekLSIP3dPI/AAAAAAAA3G4/QaUCruJtiEMEy_0GL-bNeaATYM5R8hL9gCK4BGAYYCw/s400/download%2B%25281%2529.jpg" width="285" /></a></h2>
<h2 style="text-align: left;">
6. Be hacker first</h2>
<div>
Hacker is a term that has got a negative connotation. I can hear the hair on the arms of many information security officers raise in goosebumps as you read this. But hear me out. This does mean you try to figure out a way to break the system (or if you do, be nice to tell the system admin how to plug it), or you typing on loud music in some horrible cubic text that they did in swordfish.</div>
<div>
Hacker is someone who is relentless in finding solutions. Don't let technology defeat you. Lightning, Apex. Java or any other language that gets thrown in your path, figure out a way to work with it. Have seen so many developers get defeated with Javascript!</div>
<div>
Don't let that be you.</div>
<div>
<br /></div>
<div>
So there you have, my tips to let your code survive the test of time... What do you think about it? What is your best tip to write the best code ever? </div>
<div>
<br /></div>
<div>
Let me know.</div>
<div>
<br /></div>
<div>
Sforce.Ninja</div>
</div>
Siddhesh Kabehttp://www.blogger.com/profile/05949517024873104589noreply@blogger.com0tag:blogger.com,1999:blog-3283225244263709141.post-29112949352241347492019-11-28T01:44:00.001-08:002024-01-30T03:23:17.696-08:00Chatbots: The future of customer service?<div dir="ltr" style="text-align: left;" trbidi="on">
I have been spending a lot of time trying to remodel and train a chatbot, trying to make it as human as possible.<br />
The model is not without flaws, event though I have collected a lot of intents from Amazon. This was the presentation I gave on the topic at the London DUG.<br />
<br />
And to see the chatbot follow this link:<br />
<br />
<a href="https://awesomesid-developer-edition--builder.um5.force.com/">https://awesomesid-developer-edition--builder.um5.force.com</a><br />
<br />
Note: Order number: 00001- 00011<br />
Scenario: Your order is lost or you have not yet received your order.<br />
<br />
<iframe allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/QKlpYEh-xCQ" width="560"></iframe></div>
Siddhesh Kabehttp://www.blogger.com/profile/05949517024873104589noreply@blogger.com0tag:blogger.com,1999:blog-3283225244263709141.post-1494000097081367122019-11-28T01:40:00.000-08:002024-01-30T03:23:17.694-08:00Video: Top ten tips on how not to ruin Salesforce implementation<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: center;">
<span style="text-align: left;">Another presentation for the London Salesforce Developer Group using mobile app. </span></div>
<div style="text-align: center;">
<span style="text-align: left;"><br /></span></div>
<div style="text-align: center;">
<span style="text-align: left;">When it comes to Salesforce development, we all know what it takes to deliver stuff. Having a certified professional helps you gain a knowledgeable partner but what about the things such as common sense? We all know how to deliver things on client requirements but what about things that are not mentioned by the client. We will be discussing in details things that will enhance the user experience, focus on tips to read your customers mind and have a bit of perspective on the user experience.</span></div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: center;">
<iframe allow="autoplay; encrypted-media" allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/9TNohbCxrgk" width="560"></iframe></div>
</div>
Siddhesh Kabehttp://www.blogger.com/profile/05949517024873104589noreply@blogger.com0tag:blogger.com,1999:blog-3283225244263709141.post-1310591453920210222017-05-17T01:30:00.000-07:002024-01-30T03:23:17.693-08:00Video: Thinking Agile- Presentation<div dir="ltr" style="text-align: left;" trbidi="on">
<blockquote class="tr_bq" style="text-align: left;">
An overview and necessity of the agile methodology, and how it can be leveraged in Software development. A guide for individuals to work as part of an agile team and start thinking about features and less thinking about the product. Delivering a presentation with mobile.</blockquote>
<div style="text-align: left;">
<span style="background-color: black;"><br /></span></div>
<div style="text-align: center;">
<span style="background-color: black;"><iframe allow="autoplay; encrypted-media" allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/LM6Ozm05Tnk" width="560"></iframe></span><br /></div>
</div>
Siddhesh Kabehttp://www.blogger.com/profile/05949517024873104589noreply@blogger.com0tag:blogger.com,1999:blog-3283225244263709141.post-10566230356105047912017-02-15T10:44:00.000-08:002017-02-17T00:26:12.206-08:00Cache me if you can: What you should know before daring to set URL parameter on visualforce<div dir="ltr" style="text-align: left;" trbidi="on">
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://1.bp.blogspot.com/-KYQJrbT-oRs/WKShCTyxERI/AAAAAAAAa2E/-DhL_zfWXk4HPmeyDoSzc691k7hoA0GbACK4B/s1600/StockSnap_OS7A8J0E5C.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="360" src="https://1.bp.blogspot.com/-KYQJrbT-oRs/WKShCTyxERI/AAAAAAAAa2E/-DhL_zfWXk4HPmeyDoSzc691k7hoA0GbACK4B/s640/StockSnap_OS7A8J0E5C.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Photo by John- Mark Kuznietsov http://stocksnap.io </td></tr>
</tbody></table>
<br />
If someone gave me a pence for every time there was an SOQL query in an APEX Class without using Limit or a condition during a code review, I could afford a Lamborgini this month. Sigh. If only. We make it a habit of going digging for data, at the very moment we need it. The crux of this problem happens when you have chain classes which are independent of each other. Each class needs the reference from a single record and we have to query for that record every single time.<br />
<br />
While we don't see it, every SOQL query has a cost to it, and it does not go in my Lamborghini fund, however, it should. In a recent project, we had to construct an Account 360 page that could fetch information from different integration points. The page was also called using a live telephony integration, which could pass the phone number for the account. This required an ability to keep in context the Account that was on call.<br />
<br />
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"><tbody>
<tr><td style="text-align: center;"><a href="http://1.bp.blogspot.com/-_6nPCG88jaE/WKazTx2VIWI/AAAAAAAAa24/n4-y-IZspqgjj_QHni62ZECgHsvKx1OeQCK4B/s1600/Cache%2Bme.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" src="https://1.bp.blogspot.com/-_6nPCG88jaE/WKazTx2VIWI/AAAAAAAAa24/n4-y-IZspqgjj_QHni62ZECgHsvKx1OeQCK4B/s1600/Cache%2Bme.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Platform Cache: Infographic</td></tr>
</tbody></table>
Passing the Account id in URL parameter was a valid option, however, any manipulation of that ID would be flagged as a security risk in the code. Besides querying the same data again and again during a single transaction is annoying. Clever developers (case in point) adopt the use of cookies or pass the reference as an URL parameter (Sidebar: DO NOT PUT STUFF IN URL PARAMETERS). Some people even went into Mordor and went ahead to use Custom Settings as a Cache, which makes no sense as it is as good as wasting the DML.For our problem, we adopted the use of browser cookie to maintain the account information in context.<br />
<br />
It all comes to this- there was no proper way to keep a record in context or on the platform- until now. It was therefore when there was an announcement for Platform Cache, I wept with tears of joy. And also repeated those when I dreamed of removing the set Cookie and get Cookie from my class.<br />
<br />
So Platform Cache API happened. The Platform Cache API lets us store and retrieve data that’s tied to Salesforce sessions or shared across your org. With Platform Cache, Salesforce adds a memory layer to its architecture. We can also control which apps can use the cache and partition it accordingly.<br />
<br />
Here comes a bad news followed by a good one. The developer Org has no space for Cache allocated by default, but the good news is we can ask for a trial version of the same. Have provided the link at the very bottom to request your cache trial.<br />
There are two types of Cache:<br />
<br />
<b>Org Cache:</b><br />
The Org cache stores information that is available org-wide. It could be used instead of Custom Settings and we can save some DML statement.<br />
<br />
<b>Session Cache:</b><br />
This is my personal favorite. Session cache can replace the horrible methods of storing information in cookies and URL parameters. We can use the session cache to store user session information that gets wiped clean every eight hours. It can be used as a cache to store the data used for the whole day.<br />
<br />
Had a chance to brush my hands against the partition, so here is my little playground. Remember, the problem statement I talked about earlier? I had to keep the account information in context as the page kept fetching different information. The architecture for the solution was as follows:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://yuml.me/diagram/plain/activity/(start)-%3E(inbound%20call)-%3E(search%20customer%20with%20phone)-%3E%7Ca%7C,%7Ca%7C-%3E(Call%20mainframe)-%3E(end),%20%7Ca%7C-%3E(call%20MDM)-%3E(end),%7Ca%7C-%3E(get%20quoteStore)-%3E(end).png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="185" src="https://yuml.me/diagram/plain/activity/(start)-%3E(inbound%20call)-%3E(search%20customer%20with%20phone)-%3E%7Ca%7C,%7Ca%7C-%3E(Call%20mainframe)-%3E(end),%20%7Ca%7C-%3E(call%20MDM)-%3E(end),%7Ca%7C-%3E(get%20quoteStore)-%3E(end).png" width="640" /></a></div>
<br />
<br />
Whenever there is a new phone call, I store the customer information in the user's cache.<br />
<code><br />
Cache.OrgPartition custPart=Cache.Org.getPartition('Customer');<br />
Account customer=[select id, Name from Account where phone=:calledID];<br />
custPart.put('Customer', customer);<br />
</code><br />
<br />
<br />
And then, every time I have to fetch the customer or want to find if the customer is on the phone call- all I do is, fetch this information from the partition.<br />
<code><br />
Cache.OrgPartition custPart=Cache.Org.getPartition('Customer');<br />
Account customerOnCall=(Account) custPart.get('customer');<br />
System.debug('Customer on call? = ' + customerOnCall);<br />
</code><br />
<br />
If my consultant is on a phone call, I get the customer information or I get a NULL value. Cache partition is going to solve a lot of transaction level problems. The use of this feature is only limited to our imagination.<br />
<br />
What do you think? Is there a better way of using this?<br />
<br />
<b>Further reading:</b><br />
<ul style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 1.4; list-style-image: initial; list-style-position: initial; margin: 0.5em 0px; padding: 0px 2.5em;">
<li style="border: none; margin: 0px 0px 0.25em; padding: 0px;"><a href="https://developer.salesforce.com/blogs/engineering/2015/05/platform-cache.html" style="color: #6699cc; text-decoration: none;" target="_blank">Josh Kaplan’s blog post introducing the Platform Cache</a>- Salesforce Engineering</li>
<li style="border: none; margin: 0px 0px 0.25em; padding: 0px;"><a href="https://trailhead.salesforce.com/modules/platform_cache" style="color: #6699cc; text-decoration: none;" target="_blank">The Platform Cache Basics Trailhead module</a> - Good one.</li>
<li style="border: none; margin: 0px 0px 0.25em; padding: 0px;"><a href="https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_cache_namespace_overview.htm" style="color: #6699cc; text-decoration: none;" target="_blank">Platform Cache in the Apex Developer’s Guide</a> - Solid</li>
</ul>
</div>
Siddhesh Kabehttp://www.blogger.com/profile/05949517024873104589noreply@blogger.com0tag:blogger.com,1999:blog-3283225244263709141.post-3310027677313409002017-01-11T03:09:00.001-08:002017-01-11T03:13:49.976-08:00Top #5 Things you should know when moving to #LIGHTNING components from Visualforce<div dir="ltr" style="text-align: left;" trbidi="on">
Hello New Year,<br />
<br />
Those of you who have barely made it to the 1st, congrats. 2016 has been officially branded as the worst bringer of bad news and us, you and me, have survived and entered 2017. So once again congrats on making it here.<br />
<br />
Last year, Salesforce shocked everyone by announcing Lightning, a fundamental and drastic change to the very core of salesforce delivery. The message was simple- this was a major transition in the IT services and if they have not already, all the customers would want their CRM on portal devices. When Lightning was announced, it was like relocating the passengers from a completely full Boeing 404, sturdy durable and slow to the superfast Mig 41 that could deliver fast, break the sound barrier and was efficient- only this was mid-air.<br />
<br />
This was a paradigm shift, however, you may want to deny it, and it was fundamentally necessary. But like it or no, the shift happened. And suddenly there was a lot of material out there and every other product that was launched henceforth was labeled Lightning. The good old Visualforce developer that I am, stood behind the crowd in anticipation of what was happening. There were talks, there were webinars, there was stuff happening- and all at lightning speed.<br />
<br />
Therefore, it took a while to sort through the noise, cut to the very basics and understand how Lightning works. That effort is now presented in front of you in form of five bullet points that will help you transition successfully to Lightning.<br />
<br />
And so we begin, the most fundamental tip that will help you understand Lightning is-<br />
<br />
<h2 style="text-align: left;">
1. Don't Panic</h2>
<div>
The classic #1 tip given for the average traveler across the galaxy comes in handy when we begin to understand Lightning. There is a lot of material out there for understanding lightning, ready-made components to be used in your code. Start small. If you are familiar with JavaScript you are already there. If not, start now.</div>
<div>
Let me repeat this for you, JavaScript is the first step in your transition to Lightning. The golden rule to learning a new language is to write the "hello world" code. A simple code that will get the hang of things. Lightning follows the pattern of any Javascript-based programming language, like AngularJS. Familiarity with one is an added advantage, if not, start learning. Once you get a hang of things, it is really fun to work with.<br />
<br />
One way to ease into lightning is to create a basic app fit for your purpose. The Salesforce trailhead gives you a <a href="https://trailhead.salesforce.com/module/lex_dev_lc_basics" target="_blank">good start into the same</a>.</div>
<h2 style="text-align: left;">
2. Adopt M-VC</h2>
<div>
We are programmed to think in an MVC model of programming. We write an apex controller that contains the business logic and queries, the Visualforce page that displays the data. </div>
<div>
A Lightning Component uses the same concept of MVC but here the business logic and display view are written together, while the controller is only used to fetch data. This is the pattern followed by a lightning component. If you have been working on Visualforce/Apex Controllers for a while, it will feel odd initially but once you get a hang of it, building a Lightning component is the best thing you will every do.</div>
<h3 style="text-align: left;">
3. Write Components inside Pages</h3>
<div>
With Visualforce, we have practiced hard to write pages for our solutions. We over-use the PageReference apex code to navigate users through the Visualforce wizards. Lightning brings with the most important aspect missing in visualforce pages, it brings the inheritance to the table.<br />
Think of this as writing only Visualforce components instead of Pages. You can further inherit that component into another specializes component for specific use.<br />
<h2 style="text-align: left;">
4. Everything is in the name</h2>
One of the early mistakes I made was not naming the components in the log. If you have a large number of components on the same page and all of them are interacting at the same time, debugging them becomes the stuff of nightmares if you do not name them properly. Create a name attribute to the component that you create and then use this name in the log messages that are generated in the code. You will thank me later for this tip.<br />
<h2 style="text-align: left;">
5. Javascript is Case Sensitive</h2>
A moment of pause to all those who wasted an entire day to realize the problem was onClick. Yes, Javascript is case sensitive. Therefore, if you have a habit of using <b>CamelCase </b>or <b>Camelcase</b>, make sure you maintain consistency. This stuff of nightmare pops up at an unsuspecting time, have faced it many times when trying to access the obj.fieldname but it should be Obj.Fieldname<br />
<br />
Some resources that will help you ease into Javascript and further into Lightning:<br />
<br />
<a href="http://jstherightway.org/" target="_blank">JS the Right Way</a><br />
<br />
<a href="http://egghead.io/">Egghead.io</a><br />
<br />
<a href="https://trailhead.salesforce.com/trails" target="_blank">Trailhead (Duh uh)!</a><br />
<br />
All the best and as always May the Force Be With you!</div>
</div>
Siddhesh Kabehttp://www.blogger.com/profile/05949517024873104589noreply@blogger.com0tag:blogger.com,1999:blog-3283225244263709141.post-38900023069621500222016-11-23T02:00:00.000-08:002016-11-23T02:41:44.387-08:00The curious case of the custom redirection on Salesforce Console<div dir="ltr" style="text-align: left;" trbidi="on"><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-qIWsnXUgHiM/WDQpENgVcwI/AAAAAAAAaok/4icnNV36Yysl6URyNP_zhzumhXxxB-2ugCLcB/s1600/StockSnap_U7F70KTFT5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="425" src="https://1.bp.blogspot.com/-qIWsnXUgHiM/WDQpENgVcwI/AAAAAAAAaok/4icnNV36Yysl6URyNP_zhzumhXxxB-2ugCLcB/s640/StockSnap_U7F70KTFT5.jpg" width="640" /></a></div><br />
<br />
Every developer worth their salt knows that the easiest way of redirection from a page to another is by using everyone's favorite function<br />
<br />
<pre class="prettyprint linenums"><code> public PageReference redirect() {
PageReference pageRef = page.peskyProblemRedirection;
pageRef.setRedirect(true);
return pageRef;
}</code></pre><br />
And the method is called by adding it to the Action attribute of the CommandButton or link, which works like charm and the user is redirected to the page after completion of the action.<br />
So why am I going back to the basics? Because this way of redirection causes a pesky little problem in using the Service Cloud or Sales Cloud console.<br />
<br />
Let's illustrate the problem, let's say you have a visualforce page as follows:<br />
<br />
<pre class="prettyprint linenums"><apex:page sidebar="false" showHeader="false" controller="myExampleController">
<apex:form >
<apex:pageBlock >
<apex:pageBlockButtons >
<apex:commandButton action="{!Redirect}" value="Next Page"/>
</apex:pageBlockButtons>
</apex:pageBlock>
</apex:form>
</apex:page>
</pre><br />
The controller to this class is as follows:<br />
<br />
<pre class="prettyprint linenums">public with sharing class myExampleController {
public PageReference redirect() {<pre class="prettyprint linenums"><code> PageReference pageRef = page.peskyProblemRedirection;
pageRef.setRedirect(true);
return pageRef;
}</code></pre>}
</pre><br />
This does what it says, you click a button and it takes you to the next page seamlessly.<br />
<br />
<h4 style="text-align: left;">The Problem</h4>But now let's see when this page is added to the Salesforce Console.<br />
Let's run the same code inside the console.<br />
<br />
1. This is our first page<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://3.bp.blogspot.com/-JP0uJi22680/WDQZld4AkYI/AAAAAAAAaoI/dDpQct-lky0hloHuXk7pocRVpg-oD94FQCLcB/s1600/1.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="152" src="https://3.bp.blogspot.com/-JP0uJi22680/WDQZld4AkYI/AAAAAAAAaoI/dDpQct-lky0hloHuXk7pocRVpg-oD94FQCLcB/s320/1.jpg" width="320" /></a></div><div class="separator" style="clear: both; text-align: left;">2. If we take a peek under the hood, we open the link of the tab inside the console and it shows our first page. PeskyProblemPage</div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://3.bp.blogspot.com/-GKNv7GKuIHk/WDQZo3YmhcI/AAAAAAAAaoU/v5P6HSE-MCQ77eGAPLs_awdbjBJj-bSVwCLcB/s1600/2.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://3.bp.blogspot.com/-GKNv7GKuIHk/WDQZo3YmhcI/AAAAAAAAaoU/v5P6HSE-MCQ77eGAPLs_awdbjBJj-bSVwCLcB/s320/2.jpg" width="312" /></a></div><br />
<div class="separator" style="clear: both; text-align: left;">3. Do the thing, click on next page and voila, we are redirected to the next page- as expected.</div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-hQCp66k0Bws/WDQZo71fFhI/AAAAAAAAaoM/xMDhYRPNbd8UWgnYOJNyMPEHIVFfoRRKACLcB/s1600/4.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="100" src="https://1.bp.blogspot.com/-hQCp66k0Bws/WDQZo71fFhI/AAAAAAAAaoM/xMDhYRPNbd8UWgnYOJNyMPEHIVFfoRRKACLcB/s320/4.jpg" width="320" /></a></div><div class="separator" style="clear: both; text-align: left;">4. But here is where the problem starts- if we take a peek under the hood of the second page, we see things are not as they seem. If we click on the link of our second page as shown in annotation number 2 in the figure below, we notice that the link has not changed as shown in annotation number 3</div><div class="separator" style="clear: both; text-align: left;"><br />
</div><div class="separator" style="clear: both; text-align: center;"><a href="https://4.bp.blogspot.com/-Z69y0ItY9wo/WDQZo2G9iRI/AAAAAAAAaoQ/szZfqqSSydwxE8JUBDYglYq6ktju9D_VQCEw/s1600/3.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://4.bp.blogspot.com/-Z69y0ItY9wo/WDQZo2G9iRI/AAAAAAAAaoQ/szZfqqSSydwxE8JUBDYglYq6ktju9D_VQCEw/s320/3.jpg" width="312" /></a></div><div class="separator" style="clear: both; text-align: center;"><br />
</div><div class="separator" style="clear: both; text-align: left;">Why is this a problem? That is because Salesforce does not auto refresh its pages every time and let's say the user refreshes the second page- it reopens the first one because the link still points to the first page. So what works here? The console toolkit, that can be referenced <a href="https://resources.docs.salesforce.com/sfdc/pdf/api_console.pdf" target="_blank">here</a>, tells us that most of the console can be accessed navigated by using a Javascript library.</div><h4 style="clear: both; text-align: left;"><br />
Solution</h4><div class="separator" style="clear: both; text-align: left;">One solution for this issue is the use of Native OpenPrimaryTab method of the Console toolkit API. So we rewrite the page again using the Console Toolkit API, this time, however, we will set the redirection on the page itself.</div><div class="separator" style="clear: both; text-align: left;"><br />
</div><div class="separator" style="clear: both; text-align: left;">So our new Page becomes as follows:</div><pre><code>
<apex:page>
<apex:includeScript value="/support/console/28.0/integration.js" />
<script type="text/javascript">
//Get the enclosing primary tab, if you want to open a new tab, ignore this method
var openPrimaryTab = function openPrimaryTab() {
sforce.console.getEnclosingPrimaryTabId(callOpentab);
}
//Whatever the result, open it in the same tab
var callOpentab = function callOpenSubtab(result) {
sforce.console.openPrimaryTab(result.id,
'/apex/peskyProblemRedirection', true, 'Page two');
};
</script>
<apex:form>
<apex:pageBlock>
<apex:sectionHeader title="Page one" />
<apex:pageBlockButtons>
<apex:commandButton onclick="openPrimaryTab()" value="Next Page" />
</apex:pageBlockButtons>
</apex:pageBlock>
</apex:form>
</apex:page>
</code></pre>As you can see, the magic happens using the onclick function that sets the page redirection on a console. If there is an action to perform before redirection, the same function can be used in oncomplete attribute of the button.<br />
<br />
<h4 style="text-align: left;"><b>Taking this further,</b></h4>This example above gives us the basic idea of how the redirection works on the console. Let's say you need to generate a dynamic page URL based on the data manipulation in the action method. E.g., send accountID to the new page from the tab. This can be achieved by using javascript remoting and calling the apex method in javascript. Take a look at the UNTESTED code below, that can get you started on exploration:<br />
<br />
<pre><code>
<span style="font-family: monospace;"><script type="text/javascript"></span>
<span style="font-family: monospace;"> function getRemoteAccount() {</span>
<span style="font-family: monospace;"> Visualforce.remoting.Manager.invokeAction(</span>
<span style="font-family: monospace;"> '{!$RemoteAction.AccountRemoter.getAccount}',</span>
<span style="font-family: monospace;"> accountName,</span>
<span style="font-family: monospace;"> function(result, event) {</span>
<span style="font-family: monospace;"> if (event.status) {</span>
<span style="font-family: monospace;"> sforce.console.openPrimaryTab(null,</span>
<span style="font-family: monospace;"> '/apex/peskyProblemRedirection?id=' + result.id,</span>
<span style="font-family: monospace;"> true, 'Page two');</span>
<span style="font-family: monospace;">
</span> <span style="font-family: monospace;"> }</span>
<span style="font-family: monospace;"> }, {</span>
<span style="font-family: monospace;"> escape: true</span>
<span style="font-family: monospace;"> }</span>
<span style="font-family: monospace;"> );</span>
<span style="font-family: monospace;"> }</span>
<span style="font-family: monospace;">
</span> <span style="font-family: monospace;"></script></span>
<div>
</div>
</code></pre><br />
The possibilities are only limited by your imagination. Working with the Console in the past couple of years has given a greater sense of many things Salesforce developers usually take for granted. But once you get hang of it, Console is the best product ever made by Salesforce (Yes better than Lightning too!!!)<br />
<br />
Have you encountered this problem before? Do you have any other solution? Share your experience in the comments below</div>Siddhesh Kabehttp://www.blogger.com/profile/05949517024873104589noreply@blogger.com0tag:blogger.com,1999:blog-3283225244263709141.post-20086701661631090292016-11-04T07:58:00.002-07:002016-11-04T07:58:20.436-07:00Four secrets to improve the usability of your visualforce/Lightning pages on Salesforce<div dir="ltr" style="text-align: left;" trbidi="on">
In the immortal words of a certain machine returning back in time, I am back. For now. After procrastinating for over a year and drafting a lot of rants- I am back with a very important coding lesson for you. For now.<br />
<br />
When we are designing a Visualforce page or an app or a lightning component (added that only to trick google) or any web page for that matter, we often tend to wrap up things quickly. Ask anyone on the team, how to design a good User Experience? and the person will immediately throw buzz words like Bootstrap, angular and other useless libraries (did someone squint?)<br />
<br />
Ok, Bootstrap, Angular-Js, and all the libraries are really cool and are useful in designing a fabulous UI. They are helpful in creating responsive pages that will work on all the devices but this post is not about those. Nope. For the purpose of this post, all the external libraries and buzzwords you use to decorate your resume are useless. (Adding Angular JS in your resume for a Salesforce consultant position when you don't know workflows is useless too, just saying). Another comment I receive fairly regularly is that- there are a lot many things you cannot do on salesforce. Which is true but still annoying. While there are a lot many things you cannot do, there are still a lot of things you can still do. One of those things is stop being annoying. Moving on.<br />
<br />
Salesforce is a customer-centric system, as such, a user is at the center of whatever you do. Whenever you design an interface on Salesforce you have to remember that- someone will be paid to use the thing for 8 hours a day. If you design bad user experience, their job will be harder and reduce productivity and usability. And one important trick to remember designing a form is- DO NOT LET USER SCROLL. Make sure your form elements are reachable by tabbing.<br />
<br />
<a href="http://1.bp.blogspot.com/-NHvZUcGHpmw/WByh_W4hwUI/AAAAAAAAanE/43CqeIuccxAgnX9I-TBWyQSE9Rpz5BYiwCK4B/s1600/StockSnap_6TMVSHOKMK.jpg" imageanchor="1"><img border="0" height="480" src="https://1.bp.blogspot.com/-NHvZUcGHpmw/WByh_W4hwUI/AAAAAAAAanE/43CqeIuccxAgnX9I-TBWyQSE9Rpz5BYiwCK4B/s640/StockSnap_6TMVSHOKMK.jpg" width="640" /></a><br />
<br />
So with that out of the way, let us take a look at the four secrets you should know before designing a visualforce page<br />
<br />
<b>1. Separate your data from the background</b><br />
<div dir="ltr" style="text-align: left;" trbidi="on">
This is a tip that was given to me by the director of a college play. You clearly mark the area on the stage where you want the audience to focus their attention.<br />
By default, any web system uses white background and text in black. This form is consistent unless you are on the Dark side or environment-friendly when you will use black background over white text. But don't be google when it comes to displaying complex data on the page. All you need to do is clearly separate the data from the background, you can do that by adding a thin gray background to your text or, as Salesforce does it, place the data between neat equidistant lines. If you are not using sidebar and headers, do include SectionHeader on the page. Make sure you set your data in a way, it is clearly distinguishable from the background.<br />
<br /></div>
<div dir="ltr" style="text-align: left;" trbidi="on">
<br /></div>
<div dir="ltr" style="text-align: left;" trbidi="on">
<b>2. Give visual feedback whenever you are processing information</b><br />
This is visualforce building 101, if you are using a tag from the family of Command and Action (e.g., apex:commandButton, apex:commandLink, apex:actionfunction, apex:actionsupport etc) you HAVE TO use the apex:actionStatus. Don't leave your user guessing if the button press worked or no. There has to be a visual feedback.<br />
You could be extra quirky to indicate what is happening or give an error message. <a href="http://blog.shivanathd.com/2013/05/action-status-is-usually-used-to-show.html">Shiva</a> has a good code for the same, you can use his action status in your code.<br />
<b><br /></b></div>
<div dir="ltr" style="text-align: left;" trbidi="on">
<b>3. Take an extra hour to fix the error messages. Keep them consistent. </b><br />
Salesforce provides different ways to display error messages. Some are field level error messages, others are page level error. When developing a custom page, spend an extra effort to make sure your error messages are consistent. If you have a server-side validation, make sure it is displayed alongside the field instead of the top of the page. Don't make the user scroll the whole page looking for the next error message. Remember, someone will be spending 8 hours looking at the page you are developing. The early they understand where the error messages are displayed, the quicker they will adopt.<br />
<br /></div>
<div dir="ltr" style="text-align: left;" trbidi="on">
<b>4. Place the buttons on the bottom as well as the top of the page.</b><br />
This is a common problem in the majority of the visualforce pages. People will provide multiple sections of a form and them make sure scroll all the way up to press submit. Bad idea. Also if the user wants to just fill the required fields and then submit- which is also ok, don't make them scroll all the way down to look for the submit. Be smart, place your button on top as well as the bottom. Besides, give the user a choice and they feel included in the design.<br />
<br />
So in summary, design user-centric system that they can adopt faster and learn quicker. Most of the Salesforce implementation fail because users do not adopt the system as they should. Make their job easier, not harder. A twenty-year experience sales person should not be bothered to learn a new system just because his job wants him to, instead, design the experience so much friendly that the said person should pick it up on the job quickly.<br />
<br />
Hope that helps in any future design you create. If you have any other tips, share in the comments below.<br />
Ok. Bye. For now.<br />
<br />
And in the mortal words of a immortal machine traveling back in time, I will be back.</div>
</div>
Siddhesh Kabehttp://www.blogger.com/profile/05949517024873104589noreply@blogger.com2tag:blogger.com,1999:blog-3283225244263709141.post-39727097980388571912016-05-23T03:14:00.000-07:002016-05-23T03:14:08.609-07:00This is where you start: Salesforce Platform Handbook<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-aXUuolsBVaI/V0LXbVGPhsI/AAAAAAAAaDM/Od2piEcBYhUONEt5bIOcYxjAkMY8WvmdgCLcB/s1600/bookmockC.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="426" src="https://1.bp.blogspot.com/-aXUuolsBVaI/V0LXbVGPhsI/AAAAAAAAaDM/Od2piEcBYhUONEt5bIOcYxjAkMY8WvmdgCLcB/s640/bookmockC.jpg" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<span style="color: rgba(0, 0, 0, 0.701961); font-family: Georgia, serif; font-size: 18px; line-height: 32px;">One of the early challenges that I faced while learning Salesforce, almost eight years back, is that it was too big of a cookie to eat. It still is. Salesforce Platform is huge- it has many products, integrations, different design patterns, different coding standards and </span><a data-mce-href="https://reidcarlberg.com/" href="https://reidcarlberg.com/" style="color: #8c68cb; font-family: Georgia, serif; font-size: 18px; line-height: 32px; text-decoration: none;" target="_blank">Reid Carlberg</a><span style="color: rgba(0, 0, 0, 0.701961); font-family: Georgia, serif; font-size: 18px; line-height: 32px;"> is always experimenting with something next!!!. On top of that, new developers and admins are walking into the fold with their ideas of coding, the uncertainty of the job and a massive task at hand- learn this new technology that starts with a dot com. The task is daunting. </span><br />
<div style="color: rgba(0, 0, 0, 0.701961); font-family: Georgia, serif; font-size: 18px; line-height: 32px; margin-bottom: 32px;">
Salesforce on its part is very forthcoming to help the community- with its trailhead, online videos, webinars, and certification programs. But too much information in itself is not a very helpful start of a career. At times like these- you sometimes wish, you could take a deep breath, pause, reflect and say - ok this is where I start.</div>
<div style="color: rgba(0, 0, 0, 0.701961); font-family: Georgia, serif; font-size: 18px; line-height: 32px; margin-bottom: 32px;">
That moment is exactly why the new book -<strong> <a data-mce-href="https://www.packtpub.com/virtualization-and-cloud/salesforce-platform-app-builder-certification-handbook" href="https://www.packtpub.com/virtualization-and-cloud/salesforce-platform-app-builder-certification-handbook" style="color: #8c68cb; text-decoration: none;" target="_blank">Salesforce Platform App Builder Certification Handbook</a> </strong>is written for. This is where you start- this book is going to do enough to get you started, your first gear, your first step, your first app. It is going to give you the taste of the whole platter that you have to consume, one bite at a time. This book is for the beginner admins who want to know if Salesforce is more than the keyword, this book is for the beginner developers who want to jump head-first into the platform and this book for the professionals who moved from different technology and have a lot to unlearn before accepting Salesforce.</div>
<div style="color: rgba(0, 0, 0, 0.701961); font-family: Georgia, serif; font-size: 18px; line-height: 32px; margin-bottom: 32px;">
In a way- this book is the second edition of the <strong>Force.com Developer Certification Handbook </strong>that was published in 2012- but since the exam has changed, so has the syllabus and so has the book. Salesforce Platform App Builder Certification Handbook is written in the pattern of the exam and is updated till Spring 16. </div>
<div style="color: rgba(0, 0, 0, 0.701961); font-family: Georgia, serif; font-size: 18px; line-height: 32px; margin-bottom: 32px;">
It will help you to prepare for the platform app builder certification exam. We begin with designing the object model and look at the options for building page layouts. It will guide you through designing the interface while introducing the Lightning Process Builder. Next, we will implement business logic using various point and click features of Force.com. We will learn to manage data and create reports and dashboards. We will then learn to administer the force.com application by configuring the object-level, field-level, and record-level security. These and many other fundamental topics are in place for you to learn. By the end of this book, you will be completely equipped to take the Platform App Builder certification exam.</div>
<div style="color: rgba(0, 0, 0, 0.701961); font-family: Georgia, serif; font-size: 18px; line-height: 32px; margin-bottom: 32px;">
The book is out there <a data-mce-href="https://www.packtpub.com/virtualization-and-cloud/salesforce-platform-app-builder-certification-handbook" href="https://www.packtpub.com/virtualization-and-cloud/salesforce-platform-app-builder-certification-handbook" style="color: #8c68cb; text-decoration: none;" target="_blank">for you to buy. </a></div>
<ul style="color: rgba(0, 0, 0, 0.701961); font-family: Georgia, serif; font-size: 18px; margin-bottom: 15px; margin-left: 0px; margin-right: 0px; padding-left: 35px; padding-right: 0px;">
<li style="line-height: 32px; margin-bottom: 15px; margin-top: 0px;"><a data-mce-href="https://www.packtpub.com/virtualization-and-cloud/salesforce-platform-app-builder-certification-handbook" href="https://www.packtpub.com/virtualization-and-cloud/salesforce-platform-app-builder-certification-handbook" style="color: #8c68cb; text-decoration: none;" target="_blank">Packtpub </a></li>
<li style="line-height: 32px; margin-bottom: 15px; margin-top: 0px;"><a data-mce-href="https://www.amazon.co.uk/Salesforce-Platform-Builder-Certification-Handbook/dp/1785283693/ref=sr_1_2?ie=UTF8&qid=1462198027&sr=8-2&keywords=siddhesh+kabe" href="https://www.amazon.co.uk/Salesforce-Platform-Builder-Certification-Handbook/dp/1785283693/ref=sr_1_2?ie=UTF8&qid=1462198027&sr=8-2&keywords=siddhesh+kabe" style="color: #8c68cb; text-decoration: none;" target="_blank">Amazon.uk</a></li>
<li style="line-height: 32px; margin-bottom: 15px; margin-top: 0px;"><a data-mce-href="http://www.amazon.in/Salesforce-Platform-Builder-Certification-Handbook-ebook/dp/B016WKHQ12/ref=sr_1_2?s=digital-text&ie=UTF8&qid=1462198013&sr=1-2&keywords=siddhesh+kabe" href="http://www.amazon.in/Salesforce-Platform-Builder-Certification-Handbook-ebook/dp/B016WKHQ12/ref=sr_1_2?s=digital-text&ie=UTF8&qid=1462198013&sr=1-2&keywords=siddhesh+kabe" style="color: #8c68cb; text-decoration: none;" target="_blank">Amazon.in</a></li>
<li style="line-height: 32px; margin-bottom: 15px; margin-top: 0px;"><a data-mce-href="http://www.amazon.com/Salesforce-Platform-Builder-Certification-Handbook-ebook/dp/B016WKHQ12/ref=sr_1_1?s=digital-text&ie=UTF8&qid=1462198004&sr=1-1&keywords=siddhesh+kabe" href="http://www.amazon.com/Salesforce-Platform-Builder-Certification-Handbook-ebook/dp/B016WKHQ12/ref=sr_1_1?s=digital-text&ie=UTF8&qid=1462198004&sr=1-1&keywords=siddhesh+kabe" style="color: #8c68cb; text-decoration: none;" target="_blank">Amazon.com</a></li>
</ul>
<div style="color: rgba(0, 0, 0, 0.701961); font-family: Georgia, serif; font-size: 18px; line-height: 32px; margin-bottom: 32px;">
This is where you start. All the best.</div>
</div>
Siddhesh Kabehttp://www.blogger.com/profile/05949517024873104589noreply@blogger.com1tag:blogger.com,1999:blog-3283225244263709141.post-57826911813761009012015-07-23T03:14:00.000-07:002015-07-23T03:14:03.293-07:00Understanding the Internet Revolution<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-Y7e4-_B9edc/VbC-EuoV9SI/AAAAAAAAWT8/909YiPdKfQ0/s1600/AAEAAQAAAAAAAAJ6AAAAJDgxZDg3ODJkLTQwMTgtNGY1MC1hZWY2LWFiOTNlYTEyZGIxNA.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="364" src="http://4.bp.blogspot.com/-Y7e4-_B9edc/VbC-EuoV9SI/AAAAAAAAWT8/909YiPdKfQ0/s640/AAEAAQAAAAAAAAJ6AAAAJDgxZDg3ODJkLTQwMTgtNGY1MC1hZWY2LWFiOTNlYTEyZGIxNA.jpg" width="640" /></a></div>
<div style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; box-sizing: border-box; color: #232629; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; font-stretch: inherit; line-height: 24px; margin-bottom: 30px; outline: 0px; padding: 0px; vertical-align: baseline;">
<br /></div>
<div style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; box-sizing: border-box; color: #232629; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; font-stretch: inherit; line-height: 24px; margin-bottom: 30px; outline: 0px; padding: 0px; vertical-align: baseline;">
Man is a social animal, this was the first lie they ever told you in your history classes. If we look at the human history going back through the dark ages, we understand that man is anything but a social animal.</div>
<div style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; box-sizing: border-box; color: #232629; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; font-stretch: inherit; line-height: 24px; margin-bottom: 30px; outline: 0px; padding: 0px; vertical-align: baseline;">
The agriculture revolution gave control of food in everyone hand and we started building societies, bringing people socially together. But when societies formed it brought all sorts of people together and caused all sorts of conflicts between them. Somewhere in the middle ages, few smart people realized this and decided to kick start a religious revolution. They established common guidelines for communities to work cohesively without stepping on each others foot. But they could not achieve this without control of information. With control comes fear and with fear comes faith. They established Churches, Mosques and Temples and controlled the information to reach heaven.</div>
<div style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; box-sizing: border-box; color: #232629; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; font-stretch: inherit; line-height: 24px; margin-bottom: 30px; outline: 0px; padding: 0px; vertical-align: baseline;">
But the voices of dissident did not merge, not easily, they just were suppressed. A few kings got on to the idea and decided to infuse this religious fever in their governance model. The entire Europe was established on the principle. Now the religious revolution had fear, faith and power to do stuff. The voices of dissident were brutally killed and the fear increased.</div>
<div style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; box-sizing: border-box; color: #232629; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; font-stretch: inherit; line-height: 24px; margin-bottom: 30px; outline: 0px; padding: 0px; vertical-align: baseline;">
As we entered the industrial revolution, fear gripped the nation and so did faith. Together they created a working class that dreamt of a better world. At that time, two teenagers were working on another Book that would rock the world, they were Karl Marx and Friedrich Engels. The book they authored was 'Communist Manifesto' and they formed the labour revolution.</div>
<div style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; box-sizing: border-box; color: #232629; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; font-stretch: inherit; line-height: 24px; margin-bottom: 30px; outline: 0px; padding: 0px; vertical-align: baseline;">
The labour revolution gave power to the voices of dissident that were hiding till that time. The labour revolution and the religious fever gave rise to democratic system. People decided time was for change and a new form of system was brought out. The democratic system was gift wrapped to the citizens as a government of their own. It was a government that majority agreed. They elected representatives and send them in the parliament, not knowing that the game itself was rigged. These elected representatives worked for the greater good but they were part of the old system, were control of information was essential. This new system was using the same old principle of withholding information thus causing fear and faith among the masses. That gave rise of conspiracy theories and the voices of dissident were termed lunatic and unpatriotic. </div>
<div style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; box-sizing: border-box; color: #232629; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; font-stretch: inherit; line-height: 24px; margin-bottom: 30px; outline: 0px; padding: 0px; vertical-align: baseline;">
A young college drop-out was working his way to do something he never expected, this was Bill Gates and he was trying to sell a personal computer. When he introduced the concept of Personal Computing, people laughed at him. Why would anyone need a personal computer? They were happy with computers at universities and workplaces but computers at every home? That was madness.</div>
<div style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; box-sizing: border-box; color: #232629; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; font-stretch: inherit; line-height: 24px; margin-bottom: 30px; outline: 0px; padding: 0px; vertical-align: baseline;">
But that madness ensured. Bill Gates (knowingly or unknowingly) kick-started a computing revolution (Although the credit for computer goes to Alan Turing, I personally believe that the idea of Personal Computer was introduced to the world by Bill Gates). Steve Jobs lost the race in computing but regained his spirit in mobile computing. Between them they brought the power of computing to individual people.</div>
<div style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; box-sizing: border-box; color: #232629; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; font-stretch: inherit; line-height: 24px; margin-bottom: 30px; outline: 0px; padding: 0px; vertical-align: baseline;">
The voices of dissident now had a platform. A free and fair medium that was so vast that no one could control and thus the cloud was born. Internet revolution broke the backbone of traditional institutions that relied of information control. These institution are religious, corporations and even Governments.</div>
<div style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; box-sizing: border-box; color: #232629; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; font-stretch: inherit; line-height: 24px; margin-bottom: 30px; outline: 0px; padding: 0px; vertical-align: baseline;">
The power of internet brought with him the Occupy Protests, WikiLeaks and many more to come. What does this mean for business?</div>
<div style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; box-sizing: border-box; color: #232629; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; font-stretch: inherit; line-height: 24px; margin-bottom: 30px; outline: 0px; padding: 0px; vertical-align: baseline;">
It means we are standing exactly where Matthew McConaughey was standing on the Millers Planet in the movie interstellar. What we are seeing as mountains are waves, big tsunami waves and they are not coming towards us. Like the Millers planet, our world, everything we know is moving towards them. We have already started descending into the next phase in human social revolution.</div>
<div style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; box-sizing: border-box; color: #232629; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; font-stretch: inherit; line-height: 24px; margin-bottom: 30px; outline: 0px; padding: 0px; vertical-align: baseline;">
The information is no longer controllable, the dissident voices are no longer silenced. The problems can no longer be put on back-burner. The governments are running scared, trying to control the internet but this is an illusion. Social Media and Cloud Computing are two by-products of this massive revolution. We are moving away from the traditional computing model. We are moving from the controlled model of dispensing information based on location and time. It can still be achieved and is required for security but that is just an illusion.</div>
<div style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; box-sizing: border-box; color: #232629; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; font-stretch: inherit; line-height: 24px; margin-bottom: 30px; outline: 0px; padding: 0px; vertical-align: baseline;">
If your 'social media' strategy does not include 'listening' to those voices, you are being pulled near that wave. If your corporate strategy does not include social media you are being pulled into that wave. Your employees, your customers and your partners are on social media. They are carrying devices that could leak complaints about you at any given point of time. How far can you control them?</div>
<div style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; box-sizing: border-box; color: #232629; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; font-stretch: inherit; line-height: 24px; margin-bottom: 30px; outline: 0px; padding: 0px; vertical-align: baseline;">
The changes internet revolution is bringing are disruptive. They are here to stay. Anyone who pretends otherwise is still believing the waves are mountains and very far away.</div>
<div style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; box-sizing: border-box; color: #232629; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; font-stretch: inherit; line-height: 24px; margin-bottom: 30px; outline: 0px; padding: 0px; vertical-align: baseline;">
Of-course this article is completely speculative and has no real evidence but we have already seen the changes happening around. We can always pretend that nothing of that sort is happening and go back to our life.</div>
<div style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; box-sizing: border-box; color: #232629; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; font-stretch: inherit; line-height: 24px; margin-bottom: 30px; outline: 0px; padding: 0px; vertical-align: baseline;">
But the world will keep on moving and with it bring a new wave of change. How far we prepare for that change completely depends on us.</div>
<div style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; box-sizing: border-box; color: #232629; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; font-stretch: inherit; line-height: 24px; margin-bottom: 30px; outline: 0px; padding: 0px; vertical-align: baseline;">
Pic: <span class="author-name" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; box-sizing: border-box; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline;"><a class="author" href="https://stocksnap.io/author/4440" rel="nofollow" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; box-sizing: border-box; color: #96999c; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; outline: 0px; padding: 0px; text-decoration: none; vertical-align: baseline;" target="_blank">Luis Llerena</a> </span></div>
<div style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; box-sizing: border-box; color: #232629; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; font-stretch: inherit; line-height: 24px; margin-bottom: 30px; outline: 0px; padding: 0px; vertical-align: baseline;">
<span class="author-name" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; box-sizing: border-box; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline;">Crossposted from <a href="https://www.linkedin.com/pulse/understanding-internet-revolution-siddhesh-kabe?deepLinkCommentId=6029731794935443456&anchorTime=1437600086845&trk=hb_ntf_MEGAPHONE_ARTICLE_COMMENT" target="_blank">Linkedin</a></span></div>
</div>
Siddhesh Kabehttp://www.blogger.com/profile/05949517024873104589noreply@blogger.com0tag:blogger.com,1999:blog-3283225244263709141.post-21563053777642181002015-03-26T16:00:00.000-07:002015-09-24T03:36:29.546-07:00Leaving a Learning Trail<div dir="ltr" style="text-align: left;" trbidi="on">
One of the most worrying aspect of an client engagement is what comes after the successful deployment.<br />
<br />
In one of my previous role, I was asked out of the blue without any prior warning to deploy a large chain-set containing 19 objects, some close to 380 fields, with 9 interlinked-relationships. Along with that I was to cleanse the data from legacy systems that amounted to 6 digits of records. And all this without a proper plan (I was the one who was supposed to come up with a plan for this) and two days prior to my extended vacation for Diwali. And that too when my mom had promised to make my favourite sweets.<br />
<br />
But even on that day, when I prepared the plan on the 14 hour train journey from Delhi to Pune and then successfully deploying the whole package after relishing on the sweets, I was not as worried as I always am when I am told to do a Train the Trainers session at the clients office.<br />
<br />
It is always good to have a train the trainers session and a good company understands that. However when it comes to estimates for a proper train the trainers session presents with difficulty. First, if its an implementation to replace their existing system (or worst with no system in place and moving from the DREADED EXCEL Sheets) a week worth of training is never sufficient. Not to mention the Users knowledge of Salesforce in the first place is very less and then telling them about the brand new system that we have developed for their convenience.<br />
<br />
The point is, the exercise is fruitless which worries me. At the end of the session the customer promises to hire a good admin or if they have an admin, he promises that he will get certified and ask others to get one too. Somewhere down the line, it fails, people get confused using the new system and get back to their DREADED EXCEL sheets. This problem happens with a lot of Foundation customers as well.<br />
<br />
When Salesforce introduced <a href="https://developer.salesforce.com/trailhead" target="_blank">Trailhead </a>I rejoiced, finally, I had something that I could give my customers, end users, new admins that was cheap (free duh), effective and a fun way of learning Salesforce. All I had to do now is go to the train the trainer sessions and verify they have the necessary badges to show us.<br />
<br />
The trailhead website is very neatly organized and is very easy to navigate. If you are new to Salesforce, you could start with the <a href="https://developer.salesforce.com/trailhead/trail/force_com_introduction" target="_blank">basics track</a>. this trail leads through 6 steps of <a href="https://developer.salesforce.com/trailhead/trail/force_com_introduction" target="_blank">Introduction to the platform</a>, <a href="https://developer.salesforce.com/trailhead/force_com_introduction/data_modeling/objects_intro" target="_blank">Data Modelling</a>, <a href="https://developer.salesforce.com/trailhead/force_com_introduction/data_security/data_security_overview" target="_blank">Data Security</a>, <a href="https://developer.salesforce.com/trailhead/force_com_introduction/data_management/data_import" target="_blank">Data management</a>, <a href="https://developer.salesforce.com/trailhead/force_com_introduction/point_click_business_logic/formula_fields" target="_blank">Formula fields</a> and <a href="https://developer.salesforce.com/trailhead/force_com_introduction/customizing_user_interface/ui_nav_buttons_links" target="_blank">UI customization</a>.<br />
<div dir="ltr" style="text-align: left;" trbidi="on">
<br /></div>
<div dir="ltr" style="text-align: left;" trbidi="on">
Not only that but Salesforce has now released amazing trailhead modules from programming track too. There are two programming tracks one for visual app development and another for Programmatic app development. </div>
<div dir="ltr" style="text-align: left;" trbidi="on">
<br /></div>
<div dir="ltr" style="text-align: left;" trbidi="on">
The visual app development track consists in tutorials for process automation, Salesforce 1 basics, Setting up Chatter and how to handle change.</div>
<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
<br /></div>
</div>
Siddhesh Kabehttp://www.blogger.com/profile/05949517024873104589noreply@blogger.com0tag:blogger.com,1999:blog-3283225244263709141.post-37091984107211270242015-03-20T05:04:00.000-07:002016-11-23T02:41:44.382-08:00Code-pattern for Creating Mind-blowing Tabular Reports on Visualforce (With Sample code)<div dir="ltr" style="text-align: left;" trbidi="on">Salesforce.com has a mind-blowing reporting structure but it limits on data that is available on the system. Can we report on Data that is not present in the system?<br />
For e.g., in a time-sheet management system, can we identify the people who have not filled time-sheets for a particular day? Can we report on data that is not present in the system? Can we identify records that are not created?<br />
<br />
There is one thing I have learned working on Force.com platform for last 7 years, there is No No answer in Salesforce. Think a little bit and the answer will reach you. It is somewhat like climbing mount Everest, can you do it? Sure yes, in how many days depends on how fit I am (or how crazy I am)<br />
<br />
Ok that Everest thing came up because someone did ask me that a few weeks back, moving on. Someone did also ask me about creating a report on missing details and I gave it a thought. The short answer is Yes we can, the long answer is we write a Visualforce page, anyone can tell you that. But what I really wanted to do was create a reusable code that I could use for a generic tabular report component.<br />
<br />
The code is fairly simple, the pseudo code for the code is.<br />
1. Generate a set of String for Rows<br />
2. Generate a set of String for Columns<br />
3. Prepare a map with Key as Row+Column and store the data accordingly.<br />
4. Create a Dynamic table on Visualforce.<br />
<br />
<h2>Apex Class for the page</h2><pre class="prettyprint linenums">public with sharing class TabularReportController {
public Set<string> rows{get;set;}
public Set<string> Cols {get;set;}
public Map<string string=""> dataMap {get;set;}
public TabularReportController(){
prepareDataForReport();
}
public string getURLParam(String paramName){
return ApexPages.currentPage().getParameters().get(paramName);
}
//Get the data for the rows
public Map<id ontact=""> getrow(){
return new Map<id ontact="">([Select id, name, Accountid from Contact]);
}
//Get the data for the columns
public Map<id ccount=""> getColumns(){
return new Map<id ccount="">([Select id, name from Account]);
}
//This is where the magic happens
public void prepareDataForReport(){
rows= new Set<string>();
cols= new Set<string>();
dataMap= new Map<string tring="">();
Map<id account=""> columnsData=getColumns();
Map<id ontact=""> rowData= getRow();
//Geronimo
for(Account a: columnsData.values()){
cols.add(a.name);
for(Contact c: rowData.values()){
rows.add(c.name);
String key= a.name+c.name; //Key is the key in which we set the data that we want to display.
//Do some hazy logic here. This is where the key lies, you perfom your calculations and simply prepare the data
//For display
//For this example I am going to check if Contact is related to account
if(c.accountid==a.id){
dataMap.put(key,'Related');
}else{
dataMap.put(key,'Unrelated');
}
}
}
}
}
</id></id></string></string></string></id></id></id></id></string></string></string></pre><br />
<h2>Visualforce page for the code</h2><br />
<pre class="prettyprint linenums"><pre style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBDK8lavBovKIwC6hId4utMpr8m-hLguc3WHj0PMOVcYCyZJjxmDnTtxDoLd5HUh6PcNZgM3OGMLOe_9B8odUdpu_Of9X3S4Hp4cFaOJedwxZRP5tub9egImvbXmPaIGX7357BX4bU7sj1/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"><code style="color:#000000;word-wrap:normal;"> <apex:page controller="TabularReportController" sidebar="false">
<style type="text/css">
.Related {
background-color: #0B610B;
color: #FBF8EF !important;
}
.Unrelated{
background-color: #A4A4A4;
}
</style>
<apex:sectionHeader title="Documents" subtitle="Report"/>
<apex:form >
<apex:pageBlock id="TheTable" title="Are the Accounts and Contact related?">
<table border="0" cellpadding="2" cellspacing="2" style="table-layout:auto" class="list">
<colgroup span="2"></colgroup>
<thead class="">
<tr class=" headerRow">
<th class=" headerRow" scope="col" colspan="1">Contact</th>
<apex:repeat value="{!rows}" var="row">
<th class=" headerRow">{!row}</th>
</apex:repeat>
</tr>
</thead>
<tbody >
<apex:repeat value="{!cols}" var="col">
<tr class="dataRow">
<td class="dataCell" colspan="1" style="white-space:nowrap"><span>{!col}</span></td>
<apex:repeat value="{!rows}" var="row" >
&lt;!-- This is the Key, so to speak, for the entire page. Generating the key on the visualforce page --&gt;
<apex:variable var="key" value="{!col}{!row}"/>
<td class="{!dataMap[key]}">{!dataMap[key]}</td>
</apex:repeat>
</tr>
</apex:repeat>
</tbody>
</table>
</apex:pageBlock>
</apex:form>
</apex:page>
</code></pre></pre></div><br />
You can see the output <a href="http://codesample-developer-edition.eu3.force.com/">of the report here</a><br />
<br />
You can enhance the code using the same structure. Here are couple different thing I tried<br />
<ol><li>Adding a link to the data using wrapper</li>
<li>Model window editing for the data </li>
<li>Adding complex many to many relationships</li>
<li>Plotting records that are not present</li>
</ol><br />
The list can go on.Siddhesh Kabehttp://www.blogger.com/profile/05949517024873104589noreply@blogger.com0tag:blogger.com,1999:blog-3283225244263709141.post-62030608380114794882015-01-26T09:32:00.002-08:002015-01-27T01:36:12.095-08:00Hands on for Salesforce Lighting Connect (External Objects)<div dir="ltr" style="text-align: left;" trbidi="on">
Salesforce External Objects is a new tool that has caught my attention in recent times. Those who spend their day listening to words like REST, SOAP, Integration etc. the following information for you.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-xXxwQvId8tY/VMZ5k0D8_vI/AAAAAAAAVyk/zatVB5wHMRU/s1600/ON%2BSALE%2B(2).jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-xXxwQvId8tY/VMZ5k0D8_vI/AAAAAAAAVyk/zatVB5wHMRU/s1600/ON%2BSALE%2B(2).jpg" height="236" width="640" /></a></div>
<br />
<br />
Salesforce External Objects is nothing but the out-of-box implementation of ODATA architecture. ODATA is a open-source data transfer standard backed up by the <strike>Empire</strike> Microsoft (they are good guys now). Instead of an architecture of sending messages back and forth using HTTP like REST, ODATA focuses on the content of the message over HTTP. ODATA can also be compared with ATOMPUB format (RSS feed format). However ODATA is useful in sending tabular or data over HTTP, that example can also be sorted, searched, filtered and other URI conventions.<br />
<br />
In this second post on Lighting series I am going to delve deep into how Lighting Connect lets you access external data right into Salesforce. If you were living under the rock or in some place with no internet connect,<a href="http://www.sforce.ninja/2014/11/everything-you-wanted-to-know-about.html" target="_blank"> here is the summary</a> of what you need to know about Salesforce Lighting.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/EaZ--qkb7m0tg7p4TxP4whf0r02FMXveHmBDyp9aLTXXpSqPKVqtpPyqPkbH_b9X6yEJVG52hbhw9jWNyp3Qpy4ozNpdiT6kfy26aRCwRbxeYyD5-2VwYEL53RRu0-LVzA" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/EaZ--qkb7m0tg7p4TxP4whf0r02FMXveHmBDyp9aLTXXpSqPKVqtpPyqPkbH_b9X6yEJVG52hbhw9jWNyp3Qpy4ozNpdiT6kfy26aRCwRbxeYyD5-2VwYEL53RRu0-LVzA" height="348" width="640" /></a></div>
<br />
<br />
In this hands-on I am going to pull some real time data into Salesforce.<br />
<br />
<i>Step 1: </i>First thing we need to find out what external databases are available for us to connect to. Salesforce supports ODATA V2 databases. A quick google search brought me to this page that has some live example. (<a href="http://www.odata.org/">http://www.odata.org</a>)<br />
<br />
<i>Step 2: </i>If you go to Services on the site, you will find <a href="http://services.odata.org/V2/(S(readwrite))/OData/OData.svc/" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; box-sizing: border-box; color: #dd4814; font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px; text-decoration: none;">OData (read/write)</a> that is online.<br />
The link opens a URL (<a href="http://services.odata.org/V2/(S(l4iqzxoq5ftoav2fe5qcumtx))/OData/OData.svc/">http://services.odata.org/V2/(S(l4iqzxoq5ftoav2fe5qcumtx))/OData/OData.svc/</a>) hold on to that for now, lets open Salesforce.<br />
<br />
<i>Step 3: </i>As always login to your developer account. (Note: for this tutorial and any tutorial on Lighting, please get a fresh org. As I learned the hard way, an old sandbox did not have this feature in built.)<br />
<br />
<i>Step 4:</i> If all is well, you will find <b>External Data Sources </b>and <b>External Objects</b><br />
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-qOpYGaNzT0c/VMZul0UhwtI/AAAAAAAAVws/zzAPta7BeYk/s1600/External%2BObjects%2B%2B%2Bsalesforce.com%2B%2B%2BDeveloper%2BEdition.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-qOpYGaNzT0c/VMZul0UhwtI/AAAAAAAAVws/zzAPta7BeYk/s1600/External%2BObjects%2B%2B%2Bsalesforce.com%2B%2B%2BDeveloper%2BEdition.png" height="320" width="179" /></a></div>
<b><br /></b>
<i>Step 5:</i> We are going to first add an External Data Source and point it to the <b>OData. </b>Go to <b>External Data Sources -> Click 'New'</b><br />
<b><br /></b>
In the form you can specify the <b>Name</b> and <b>Label. </b>The <b>Type </b>should be <b>Lighting Connect: OData 2.0 </b><br />
<b><br /></b>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-2ePXoyThTGg/VMZvHjiYQkI/AAAAAAAAVxs/PGV0fQhUVPM/s1600/External%2BData%2BSource%2BEdit%2B%2BOData%2B%2B%2Bsalesforce.com%2B%2B%2BDeveloper%2BEdition.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-2ePXoyThTGg/VMZvHjiYQkI/AAAAAAAAVxs/PGV0fQhUVPM/s1600/External%2BData%2BSource%2BEdit%2B%2BOData%2B%2B%2Bsalesforce.com%2B%2B%2BDeveloper%2BEdition.png" height="420" width="640" /></a></div>
<b><br /></b>
<br />
<i>Step 6:</i> Once you select the type, it will have further fields like Server URL. Copy the URL we have in Step 2 above and click <b>Save.</b><br />
<b><br /></b>
<i>Step 7:</i> Once you click <b>Save </b>and all is well you should see a detail page with options to <b>Edit, Validate and Sync </b>and<b> Delete</b><br />
<b><br /></b>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-VE0hCja5X5Y/VMZ2YyTXdII/AAAAAAAAVyA/Wb4v46FY-tE/s1600/External%2BData%2BSource%2B%2BOData%2B%2B%2Bsalesforce.com%2B%2B%2BDeveloper%2BEdition.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" src="http://4.bp.blogspot.com/-VE0hCja5X5Y/VMZ2YyTXdII/AAAAAAAAVyA/Wb4v46FY-tE/s1600/External%2BData%2BSource%2B%2BOData%2B%2B%2Bsalesforce.com%2B%2B%2BDeveloper%2BEdition.png" height="304" width="640" /></a></div>
<br />
<b><br /></b>
<i>Step 8: </i>Click on '<b>Validate and Sync' </b>it will scan the URL and get you all the objects available to Sync with Salesforce. <i>Note:</i> if it does not sync or you get an error, it will be shown in <b>Status </b>field.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-rlSUFRLIQ3c/VMZ2Y3VAkjI/AAAAAAAAVx8/3jhPRU15zPQ/s1600/Validate%2BExternal%2BData%2BSource%2B%2BOData%2B%2B%2Bsalesforce.com%2B%2B%2BDeveloper%2BEdition.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-rlSUFRLIQ3c/VMZ2Y3VAkjI/AAAAAAAAVx8/3jhPRU15zPQ/s1600/Validate%2BExternal%2BData%2BSource%2B%2BOData%2B%2B%2Bsalesforce.com%2B%2B%2BDeveloper%2BEdition.png" height="393" width="640" /></a></div>
<br />
<br />
<i>Step 9:</i> I am going to select <b>Product</b> object to sync. Select your objects and click on <b>Sync</b>. You should see one record in the <b>External Object</b> section.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-qHEj8Yw-CN4/VMZ37gLS71I/AAAAAAAAVyQ/HeXTM0NcsXw/s1600/External%2BObjects%2B%2B%2Bsalesforce.com%2B%2B%2BDeveloper%2BEdition.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-qHEj8Yw-CN4/VMZ37gLS71I/AAAAAAAAVyQ/HeXTM0NcsXw/s1600/External%2BObjects%2B%2B%2Bsalesforce.com%2B%2B%2BDeveloper%2BEdition.png" height="128" width="640" /></a></div>
<br />
<br />
<i>Step 10: </i>Now comes the best part, go to <b>Create-> Tabs</b> and you can find our objects right there in Salesforce object tabs<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-uNjv8COB_2I/VMZ4T1zuSPI/AAAAAAAAVyY/Fay6G9nKMD8/s1600/Products%2B%2B%2Bsalesforce.com%2B%2B%2BDeveloper%2BEdition.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-uNjv8COB_2I/VMZ4T1zuSPI/AAAAAAAAVyY/Fay6G9nKMD8/s1600/Products%2B%2B%2Bsalesforce.com%2B%2B%2BDeveloper%2BEdition.png" height="224" width="640" /></a></div>
<br />
As I have understood in past few days, Lighting is a vast thing. In the next few weeks, Ill be posting one blog about the Lighting Framework. Be sure to subscribe to the blog and if you have any comments, mention in the comments below.<br />
<br />
SforceNinja Out.<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://feeds.feedburner.com/SforceNinja" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" src="http://2.bp.blogspot.com/-fAi6boCECuA/VFKIiMDjrKI/AAAAAAAAQNI/R4TV5fLVu6c/s1600/ninja_rss.png" height="140" width="200" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br /></div>
Siddhesh Kabehttp://www.blogger.com/profile/05949517024873104589noreply@blogger.com0tag:blogger.com,1999:blog-3283225244263709141.post-58297250584926439622015-01-13T01:26:00.000-08:002015-01-13T01:26:31.094-08:00The Monk who sold his Computer for the Cloud<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-3CkcZk2DHlo/VLTib6xyKjI/AAAAAAAAVU8/trWtSuWbYCk/s1600/QUINOA.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-3CkcZk2DHlo/VLTib6xyKjI/AAAAAAAAVU8/trWtSuWbYCk/s1600/QUINOA.png" height="366" width="640" /></a></div>
<div style="background-color: white; border: 0px; box-sizing: border-box; color: #4d4f51; font-family: Helvetica, Arial, sans-serif; font-size: 16px; font-stretch: inherit; line-height: 24px; margin-bottom: 30px; padding: 0px; vertical-align: baseline;">
<br /></div>
The first computer I ever saw in my life was a desktop that my father gifted to me during my second year of computer engineering. The specifications were a 1 GB of RAM, 40 GB HDD, a modest LG monitor, an Intel P5 Dual Core processor and an Inverter (this came separately and since we were in India, a battery inverter was necessary). The installation was so space consuming that we had to invest in a computer table (no other place could accommodate this machine) that had options of keeping CPU and inverter and Printer under the table, a foldable keyboard and mouse holder and a monitor. This was ten years ago and by the standards back then, my father had purchased the best computer in town.<br />
<br />
My father is a perfectionist, and hence he insisted on building a shelf/ library over the table that would complete the look of a decent computer workstation. This was the computer that accompanied me during my engineering days. The endless hours spend over playing with MS Paint, writing hacks in Excel and sending it to friends. I used to write first draft of my stories on the machine, I used to listen to songs for endless hours. Purchase DVDs and listen to them until they are scratch. I had 9 pen drives, with which I used to carry my data to my college.<br />
<br />
The last three smartphones I had support 64GB of memory space. They all had Quad Core processors, were much faster than my computer and could fit in my pocket. The things that I did with my computer, now I do with my phone but I do it without getting chained to the workstation. I play my favorite GTA Vice City, over again on my phone. I left my home town around eight years back and have been travelling since. Carrying a phone with me was much easier than carrying the machine. I remember having 12GB of songs on my Computer. Now, I use the paid service of Gaana.com, the online music station. And you know what? Even while travelling on the cold foreign streets of London, the friendly voice of Arijit Singh accompanies me. My data is safely backed up on cloud servers and not just mobile data. The old college files, the projects reports everything.<br />
<br />
My brother called a few days ago and asked me if he can sell the computer and buy something new. That call provoked this post. I sold the computer and have moved on. <br />
<br />
Because many people asked for it, updating the post with the common task I needed computer for that have been replaced by the cloud.<br />
<br />
<b>1. Editing my Book</b><br />
<br />
Thats the easiest thing anyone can relate to. How do I create documents, the dreaded excel sheets and powerpoint presentation. The common answer would be <b>Google Docs</b> but somehow in past few days, I am not really in Moodle for Google (neither am I switching back to the old nemesis microsoft). I used <b>Zoho Writer</b> to edit my novel online. I preferred their services much better than other online tools.<br />
<br />
<br />
<b>2. Create Graphic for the blogs</b><br />
<br />
Creating graphics is as old as computer itself. And when it comes to creating graphics, no one does it better than Photoshop. Photoshop was hard to replace but two services have given me more joy that anyone ever could. One is <b>Pixlr.com </b>and<b> Canva. </b>Canva helps me layout stuff with text, like the title graphic of the blog while Pixlr.com lets me create and filter images easily.<br />
<br />
<b>3. Creating presentation</b><br />
<br />
When I am not doing anything, I am busy creating presentations. I love those things that move around. You can see some of the things I created on my site showcase. Most of the presentations on the page are created using <b>Prezi.com</b> the online 3D presentation maker. Prezi gives an extra dimension to the presentation and that wow factor helps.<br />
<br />
<b>4. Making Infographics</b><br />
<br />
I have used many corporate tools for making infographics. The best one was obviously illustrator, adobe knows how to do stuff right. But then can I make infographics online? I tried with pixlr but since there was a screen limit with their editor, making a long infographic like the one for cloud computing was a tedious job. Just when I thought, I am losing the challenge, ta da,<b> Cacoo.com</b> came to the rescue. Cacoo has an easy to use interface where you can create beautiful graphics for free. They offer 25 diagrams on the free license which is really cool.<br />
<br />
<b>5. Sharing files and photos</b><br />
<br />
One of the many things you need a computer and those little USB drives is transfer of files. During my college days when I did not have a computer, I used to carry a rewritable CD in my bag and borrow CD writers on my friends computer to burn disc. Things changed and we now have those USB drives. So the real question here was how do I transfer more than a GB of file? Now in real world scenario there are very few things that are more than one GB, however lets say I wanted to transfer a heavy file? And there <b>Dropbox</b> came to rescue. What was more with the camera upload feature, I did not have to do anything. When I took photos, they were safely upload to dropbox and all I had to do was share it with my friend. <br />
<br />
<b>6. Watching Movies</b><br />
<br />
When was the last time you stepped into a DVD store and purchased a nice DVD, picked up a bottle of whiskey and made some pop-corn. If you never did, I highly suggest you do. Anyways, so since this was a post computer world, the best alternative I found online was <b>bigflicks.com</b>. It is a on-demand movie site that streams bollywood movies. It also streams selected english movies. I recently got a subscription for <b>NetFlicks</b> which streams English films and serials.<br />
<br />
<b>7. Listening to Songs</b><br />
<br />
Listening to songs while doing stuff is one of the many things one can do. However, iTunes has already brought those on cloud. Just like movies, listening to songs is also a regional thing. One of the best service I use regularly is <b>Gaana.com</b> It streams not only bollywood but also regional marathi songs. For Internet radio and songs I switch between <b>Spotify </b>and <b>Pandora</b><br />
<br />
<blockquote class="tr_bq">
<span style="background-color: white; color: #333333; font-family: Georgia, serif; font-size: 16px; font-style: italic; line-height: 24px;">I am the monk who sold his computer for the Cloud. Are you?</span></blockquote>
<div style="background-color: white; border: 0px; box-sizing: border-box; color: #4d4f51; font-family: Helvetica, Arial, sans-serif; font-size: 16px; font-stretch: inherit; line-height: 24px; margin-bottom: 30px; padding: 0px; vertical-align: baseline;">
<br />
Image Credits: Flickr (CC Label for Reuse with Modification)</div>
<div style="background-color: white; border: 0px; box-sizing: border-box; color: #4d4f51; font-family: Helvetica, Arial, sans-serif; font-size: 16px; font-stretch: inherit; line-height: 24px; margin-bottom: 30px; padding: 0px; vertical-align: baseline;">
Edited Using: Canva.com</div>
</div>
Siddhesh Kabehttp://www.blogger.com/profile/05949517024873104589noreply@blogger.com0tag:blogger.com,1999:blog-3283225244263709141.post-24948659589438324762014-11-22T00:47:00.000-08:002015-01-26T09:32:45.803-08:00Everything you wanted to know about Salesforce Lighting Connect (External Objects)<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-D0kpMbPaerE/VHBPMI8wwoI/AAAAAAAATBw/dP8ir1X_KBQ/s1600/ON%2BSALE%2B(1).jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-D0kpMbPaerE/VHBPMI8wwoI/AAAAAAAATBw/dP8ir1X_KBQ/s1600/ON%2BSALE%2B(1).jpg" height="236" width="640" /></a></div>
<br />
<br />
The world runs of Data. Having correct data can determine if your business succeeds or fails. Since the emergence of Cloud Computing, Data escaped its normal prison of sitting on servers and became relevant. But the most important aspect about cloud was data was not interchangeable. I.e., It escaped the prison but was trapped in a zoo. In a large organisation if there was a need for using more than one system to manage data, it became a development nightmare. Not to mention maintaining multiple connections and data consistency between two systems, middle-wares (if any) and still keeping it under the governor limits.<br />
<br />
Salesforce Lighting connect lets you overcome this limitation by using the (soon to be) global standard OData protocol. With external objects you can connect to an external data source like SAP or any other database that uses OData protocol or a simple URL. What this means is you can have orders in SAP and customer Data in Salesforce. Both will be connected together and you can use it with very less or no effort.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<span style="font-family: Arial; font-size: 15px; margin-left: 1em; margin-right: 1em; vertical-align: baseline; white-space: pre-wrap;"><img alt="oData - New Page (1).png" height="343px;" src="https://lh3.googleusercontent.com/EaZ--qkb7m0tg7p4TxP4whf0r02FMXveHmBDyp9aLTXXpSqPKVqtpPyqPkbH_b9X6yEJVG52hbhw9jWNyp3Qpy4ozNpdiT6kfy26aRCwRbxeYyD5-2VwYEL53RRu0-LVzA" style="-webkit-transform: rotate(0rad); border: none; transform: rotate(0rad);" width="624px;" /></span></div>
<span id="docs-internal-guid-85ae6898-d6ad-6c72-0bef-b34a8a785da1"></span><br />
<b><br /></b>
<b>What is OData Protocol?</b><br />
OData was first proposed by Microsoft and was released in March 2014 by OASIS (Organisation for the advancement of structured information Standards). In very basic terms OData is the common language in which the web will talk to each other. This is possible even today by using REST API and SOAP but these API are for processing information, having a separate protocol for only Data exchange helps in many ways. First, it is easy, as easy as creating your own object in Salesforce. Second, it is auto-synced between the two system.<br />
<br />
<b>How does Salesforce use this OData?</b><br />
Salesforce has introduced a new concept called External Objects. Earlier we had external ID field that stored ID for external databases. This was very useful when loading Data but with External objects the data will be accessed from the external system and displayed in form of Salesforce. Thus keeping it in Sync. The following diagram illustrates the entire process.<br />
oData diagram<br />
<br />
<br />
<b>What do we need to access external data?</b><br />
Before we learn how to create an external object, let us look at what the external database should provide in order to make this connect happen.<br />
There are two fundamental things we need to access the data. They are<br />
Data should be in open format like oData. <br />
It should be accessible via the internet (i.e., via cloud)<br />
For security, it should support OAuth.<br />
<br />
<b>Do external object support SOQL and SOSL?</b><br />
One of the most obvious feature of external object is ability to search them. We can use the standard SELECT, WHERE, LIMIT and OFFSET clause we are familiar with for SOQL with the external objects. Obviously it is limited to the external data service to provide accurate data.<br />
For SOSL, the external objects support FIND, IN, RETURNING, WHERE, LIMIT and OFFSET clauses.<br />
<br />
<b>Does it support Relationships?</b><br />
Where would we be without relationships? Yes, External objects support a limited type of lookup relationships like Basic Lookup, External Lookup and indirect Lookup.<br />
<br />
<b><i>Lookups:</i></b><br />
The standard lookups that we currently used are extended on the external objects. The lookup to an external object do not support cascade delete or lookup filters.<br />
<br />
<b><i>External Lookups:</i></b><br />
External lookups are created on Standard, Custom or external objects using the External ID field (and not the standard Salesforce ID)<br />
<br />
<i><b>Indirect Lookups </b></i><br />
Indirect lookup are external objects that are child to Standard Salesforce objects using a unique External ID field.<br />
<br />
However, a point to note that child records of external object will load depending on external database and network speed.<br />
<br />
This is everything you need to know about external objects. In the next post we will actually create few objects and show seamless integration between two system. What do you think of lighting connect, have more questions? Post them in comments below.</div>
Siddhesh Kabehttp://www.blogger.com/profile/05949517024873104589noreply@blogger.com0tag:blogger.com,1999:blog-3283225244263709141.post-7406916470146701242014-11-13T14:51:00.001-08:002014-11-13T14:52:31.489-08:00Have you met the Ghost Records of Salesforce?<div dir="ltr" style="text-align: left;" trbidi="on">
This post is very old but it is long overdue. Have you seen the Ghost records in Salesforce? Whenever there is an auto-number field on an Object, it suddenly seems to have gaps in between? For e.g., if you have a auto-number set at 00001 and the next record it creates is 00004. These gaps are sometimes attributed to people who create records and delete.<br />
<br />
<b>Auto-number fields</b><br />
Lets talk a bit about auto-number. Apart from the part that they are cool, they are also very stubborn. An auto-number field resets only once in its lifetime and never turns back. When an auto-number is incremented it does not go back, even if the record is deleted.<br />
<br />
So when you delete a record that has auto-number field on it, it will not decrement it by 1 but instead create the gap.<br />
<br />
<b>Ghost records</b><br />
The real crux of the issue lies when developers write unit classes. Developers always create dummy records for testing. The test execution runs in a separate context than the main Salesforce. These records are not seen in the system or recycle bin but their data remains. Thus auto-number is incremented.<br />
<br />
<b>Solution</b><br />
Like always there is a solution (Since Spring 14 that is. Spring 14 is the ghost buster in this case).<br />
<br />
Go to <b>Setup-> Apex Test Execution-> Option</b><br />
<b><br /></b>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-a9MrhKOJlrY/VGU0QHpW9eI/AAAAAAAAS5g/1G2PsVoeaHk/s1600/Apex%2BTest%2BExecution%2B%2B%2Bsalesforce.com%2B%2B%2BEnterprise%2BEdition.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="247" src="https://3.bp.blogspot.com/-a9MrhKOJlrY/VGU0QHpW9eI/AAAAAAAAS5g/1G2PsVoeaHk/s400/Apex%2BTest%2BExecution%2B%2B%2Bsalesforce.com%2B%2B%2BEnterprise%2BEdition.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Since Spring 14, a new option<b> Independent Auto-number Sequence </b>is available. For some reason it is turned off by default and can be turned on to prevent this. Once it is on, test methods won't affect the auto-number sequence.</div>
<br />
Ideally, there are very few cases when this problem can happen in Production. The only time a unit test is run in the Production is during Deployment from Sandbox. Avoid running Unit test in Production. A proper deployment plan can also prevent redeployment of same classes and this prevent running.<br />
<br />
Seen any ghost records lately? Mention in the comments below.</div>
Siddhesh Kabehttp://www.blogger.com/profile/05949517024873104589noreply@blogger.com0tag:blogger.com,1999:blog-3283225244263709141.post-58795252929472154362014-11-07T07:24:00.000-08:002014-11-07T07:24:02.528-08:00The OnePlus One that I am Proud to Have<div dir="ltr" style="text-align: left;" trbidi="on">
We live in a world where smart phones are produced faster than universe can produce smart people. With the avalanche of smart phones that come your way and almost every week a new smart phone has a 'launch' it is very hard to stay enthusiastic about it for a long time.<br />
I appreciate the Apple Fans in that regard that they wait patiently and enthusiastically for a phone that is two years late in terms of innovation.<br />
As a disclaimer, I am a Samsung fan boy and while the phones may be dismissed as cheap plastic, it hardly matters for me what the phones are made up of as long as I can chat with my wife on Whatsapp and watch the trailer of the avengers movie at the same time. Yes, as buggy or half baked the multi screen maybe I still like the fact that I can do more than one thing on the screen of my S4.<br />
<br />
I started my journey with Galaxy S2, a much awaited and stable version of android that added steroids to mobile computer. When Samsung released the 10.1 tablet, I brought it out because that helped me watch my shows at night. Then it all spiraled upwards till Galaxy S4 when the advance multi-tasking feature grabbed my attention. The pop-out video player added another level of excitement. But then slowly this excitement waned, there was nothing new in S5 save perhaps the water proof feature. That's when this one caught my attention.<br />
<br />
I am talking about the Oneplus one, the self professed flagship killer from a relatively new Chinese manufacturer called Oneplus. Chinese? Did I say, yes and you heard it correctly. OnePlus is a relatively new company that has launched One as the first phone in the market. Why is this phone so special?<br />
<br />
There are a couple of reasons,<br />
<b>One.</b> This phone comes packing with Cyanogen mod CM11, the one ROM that many people install after rooting, bricking the warranty. Cyanogen who made android better than Google themselves is build into the phone as a firmware.<br />
<br />
<b>2. </b>The unique invite system that they have. OnePlus basically isn't available retail and can be purchased only if someone invites you for buying it. So when getting hands on the phone is a difficult task you want it even more.<br />
<br />
It was impulse decision when my friend asked me if I wanted OnePlus invite and I purchased it. How much did it cost? Only 273£ and I ordered it in UK. It didn't burn a hole in my pocket nor put me on the hook for 2 years like the Note 4 I was planning on buying.<br />
<br />
<b>Did I regret it? Not at all</b><br />
<b><br /></b>
It took seven days for the phone to arrive at my office and the first day was exciting. So much that this was dreamforce week and I was more excited about something other than dreamforce that week. Now this post is not about the specifications of OnePlus one, there are plenty of those floating around. But this is about my experiences around them.<br />
<br />
<b>The packing</b><br />
When the phone arrived in the mailbox, I was really excited. The packing was decorative, like a jewelry box.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-_YX9QuJHEok/VFydkiPc2oI/AAAAAAAASuw/BtaY8ku9RhU/s1600/IMG_20141013_111616.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-_YX9QuJHEok/VFydkiPc2oI/AAAAAAAASuw/BtaY8ku9RhU/s1600/IMG_20141013_111616.jpg" height="150" width="200" /></a><a href="http://4.bp.blogspot.com/-KBv9blL1gvo/VFydkkk-6sI/AAAAAAAASuw/jN_7FsqjrsI/s1600/IMG_20141013_111631.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><br /></a></div>
<a href="http://4.bp.blogspot.com/-KBv9blL1gvo/VFydkkk-6sI/AAAAAAAASuw/jN_7FsqjrsI/s1600/IMG_20141013_111631.jpg" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-right: 1em; text-align: center;"><img border="0" src="http://4.bp.blogspot.com/-KBv9blL1gvo/VFydkkk-6sI/AAAAAAAASuw/jN_7FsqjrsI/s1600/IMG_20141013_111631.jpg" height="150" width="200" /></a> <a href="http://1.bp.blogspot.com/-lLoXddTvu4I/VFydkkTAw_I/AAAAAAAASuw/X4QDR9MGGA4/s1600/IMG_20141013_111607.jpg" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-right: 1em; text-align: center;"><img border="0" src="http://1.bp.blogspot.com/-lLoXddTvu4I/VFydkkTAw_I/AAAAAAAASuw/X4QDR9MGGA4/s1600/IMG_20141013_111607.jpg" height="150" width="200" /></a><br />
<a href="http://3.bp.blogspot.com/--GX-RotSOYI/VFydkns5nKI/AAAAAAAASuw/eU6rmcyJBQc/s1600/IMG_20141013_111537.jpg" imageanchor="1" style="clear: left; display: inline !important; margin-bottom: 1em; margin-right: 1em; text-align: center;"><img border="0" src="http://3.bp.blogspot.com/--GX-RotSOYI/VFydkns5nKI/AAAAAAAASuw/eU6rmcyJBQc/s1600/IMG_20141013_111537.jpg" height="200" width="150" /><span style="text-align: left;"> </span></a><a href="http://1.bp.blogspot.com/-0q2SJfst6T8/VFydkhijaWI/AAAAAAAASuw/51_KLBWfyeg/s1600/IMG_20141013_111520.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-0q2SJfst6T8/VFydkhijaWI/AAAAAAAASuw/51_KLBWfyeg/s1600/IMG_20141013_111520.jpg" height="200" width="150" /></a><br />
<br />
<b>The Operating System</b><br />
The operation system is arguably one of the fastest one I have seen. It responds to touch in an instant and is blazing fast. It took me five more minutes to dig into all the customization features on the phone and they were a lot. An overnight spend and I had customized this beast for my use.<br />
Since then, OnePlus has never disappointed.<br />
The only feature I am missing from my S4 is the multi view option that would allow me to chat and watch videos at the same time. Other than those, OnePlus does everything better.<br />
<br />
<b>Camera</b><br />
Perhaps for me Camera is not the very interesting thing to look at. Sure any mp after 8 is good for me but I never got good pictures anyways. During the recent weekend traveling in London, OnePlus camera was praised more than often.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-S-aimVzZCDI/VFZrx6yjosI/AAAAAAAAQcc/j0E_H4_7aB0/s1600/IMG_20141102_120931.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-S-aimVzZCDI/VFZrx6yjosI/AAAAAAAAQcc/j0E_H4_7aB0/s1600/IMG_20141102_120931.jpg" height="200" width="148" /></a></div>
<a href="http://2.bp.blogspot.com/-bv_OQJzbRgM/VFZrx9t4d5I/AAAAAAAAQzQ/-xaeJi61weQ/s1600/IMG_20141102_122339.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" src="http://2.bp.blogspot.com/-bv_OQJzbRgM/VFZrx9t4d5I/AAAAAAAAQzQ/-xaeJi61weQ/s1600/IMG_20141102_122339.jpg" height="148" width="200" /></a><a href="http://3.bp.blogspot.com/-2ery0a_Hy5A/VFZrx_EQEjI/AAAAAAAAQzk/jApzQNYGfS8/s1600/IMG_20141102_122935.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" src="http://3.bp.blogspot.com/-2ery0a_Hy5A/VFZrx_EQEjI/AAAAAAAAQzk/jApzQNYGfS8/s1600/IMG_20141102_122935.jpg" height="148" width="200" /></a><br />
<br />
<a href="http://2.bp.blogspot.com/-UaGaTSQPX2c/VFZrx3Py2EI/AAAAAAAAQ0c/b8xMszZRgFE/s1600/IMG_20141102_123658.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" src="http://2.bp.blogspot.com/-UaGaTSQPX2c/VFZrx3Py2EI/AAAAAAAAQ0c/b8xMszZRgFE/s1600/IMG_20141102_123658.jpg" height="237" width="320" /></a><br />
<br />
These are some of the HD pictures taken with OnePlus during the trip to London.<br />
<br />
<b>The Looks</b><br />
Perhaps for a smart phone, looks don't matter that much as long as it augments your life and helps you multitask, the OnePlus becomes a winner on that front. It looks beautiful with the granite like back cover and its sleek design, I have received more compliments the more I use it.<br />
<br />
So there you have it, there are other features but I don't really care about those. OnePlus has changed the way I look at smart phones in a complete different way.<br />
<br />
Do you own a OnePlus? What are your views mention those in comments below. Just so you know, I don't have any invites to give away.</div>
Siddhesh Kabehttp://www.blogger.com/profile/05949517024873104589noreply@blogger.com0