Jekyll2020-04-03T06:39:40+00:00/feed.xmlMichael WelburnPersonal website of Michael Welburn, certified and award winning Salesforce Architect & Web Developer.Michael Welburnmwelbu2@gmail.comMigrating Existing Projects to Salesforce DX2017-07-31T22:21:08+00:002017-07-31T22:21:08+00:00/2017/07/31/migrating-existing-projects-to-salesforce-dx<p>I spent some time after <a href="https://developer.salesforce.com/trailheadx">TrailheaDX</a> excited to try converting the existing Salesforce project I work on to the DX platform. There are a plethora of great online references on <a href="https://developer.salesforce.com/platform/dx">Salesforce DX</a>, the next generation of Salesforce developer experience that pushes it closer to parity with a typical development and deployment lifecycle. If you are looking to get started, <a href="http://coenraets.org/">Christophe Coenraets</a> posted a <a href="https://developer.salesforce.com/blogs/developer-relations/2017/07/migrating-existing-projects-salesforce-dx.html">step by step instructional guide on migrating an existing project to Salesforce DX</a> today on the Salesforce Developers Blog. I also found <a href="https://twitter.com/benedwards44">Ben Edwards</a> <a href="https://packagebuilder.herokuapp.com">package.xml builder</a> quite useful for this, which is part of his <a href="http://sftoolkit.co/">Salesforce Toolkit</a> library.</p>
<p>While I don’t want to rehash the steps that Christophe nicely laid out, I did want to provide some assistance to anyone who ran into the same problem I had when trying to execute the steps. At the time I was working on setting up my project, I had been referencing the Salesforce DX Developer Guide Beta to understand the conversion process, outlined <a href="https://developer.salesforce.com/docs/atlas.en-us.sfdx_dev.meta/sfdx_dev/sfdx_dev_ws_config.htm">here</a> and <a href="https://developer.salesforce.com/docs/atlas.en-us.sfdx_dev.meta/sfdx_dev/sfdx_dev_ws_retrieve_pack_xml.htm">here</a>. The issue in my case was that the ZIP file that got pulled down for the conversion process was created as <em>unpackaged.zip</em>, which I then unzipped to the project’s root directory. Since the DX configuration example included /unpackaged as a package directory in the sfdx-project.json file, attempting to run the migration command kept returning a vague error.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ERROR running force:mdapi:convert: Unexpected file found in package directory: /Users/welburn/sfdx/unpackaged/package.xml.
</code></pre></div></div>
<p>In order to remedy this, I needed to either rename my folder of unzipped assets, or remove the reference to /unpackaged as a package directory in the configuration.</p>
<p>Overall, the process seemed much more streamlined that I anticipated (in theory). In practice, converting an existing production-level project to DX is quite an involved process in resolving dependencies, determining which platform features you have enabled in production are and are not supported in the DX configuration (and making manual changes in the interim). However, even testing a subset of the full functionality with scratch orgs left me very excited about a future in Salesforce development that minimizes the haphazard potential of collaboration and staying in sync with others.</p>Michael WelburnIdentifying conflicts with package folders during a Salesforce DX migration.Lightning Components, Integers, & Script-Thrown Exceptions2016-12-06T23:41:06+00:002016-12-06T23:41:06+00:00/2016/12/06/lightning-components-integers-script-thrown-exceptions<p>Working with Lightning Components, I always am prepared to come across cryptic error messages. Over time, you start to get a good idea of the regular mistakes you make that generic very unhelpful system errors and can isolate a few places to look right away – My most frequent error is typing a semicolon instead of a comma building up JSON for server-side calls. Without a compiler for Javascript, simple mistakes tend to be a little harder to debug, and the current Salesforce error messaging is not always helpful.</p>
<p>However, I can across a rather interesting error earlier this week. To simplify the use case, I was working on a component that let the property editor dictate an Integer that would be used to set the LIMIT of a SOQL statement to return Account records. Below are the relevant code snippets:</p>
<p>testAccountList.cmp</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> ...
<aura:attribute name="resultSize" type="Integer" default="5">
...
</code></pre></div></div>
<p>testAccountListController.js</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>doInit : function(component) {
var action = component.get("c.getAccounts");
action.setParams({
resultSize : component.get("v.resultSize")
});
action.setCallback(this, function(response) {
...
});
$A.enqueueAction(action);
}
</code></pre></div></div>
<p>TestAccountListController.cls</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>public class TestAccountListController {
@AuraEnabled
public static List<Account> getAccounts(Integer resultSize) {
query = 'SELECT Id, Name FROM Account';
if (resultSize != null && resultSize > 0) {
query += ' LIMIT ' + resultSize;
}
return Database.query(query);
}
}
</code></pre></div></div>
<p>A pretty straightward example of a Lightning Component calling a <a href="https://developer.salesforce.com/docs/atlas.en-us.lightning.meta/lightning/controllers_server_actions_call.htm">server-side action</a>. Or so I thought.</p>
<p>It turns out, running this in Lightning Experience throws a <strong>Script-Thrown Exception</strong>, and it is the kind that gives no context as to what the actual error is, even in the debug log. I quickly noticed this only occurred when going through the full end-to-end flow; unit tests worked perfectly. After a decent amount of debugging by dumping different test values to the debug log using System.debug, I realized that the error was being thrown during the <strong>resultSize > 0</strong> comparison, and more specifically the error that finally showed up implied that my resultSize Integer was acting as…a String?</p>
<p>Searching on the internet, I came across a <a href="http://salesforce.stackexchange.com/questions/108355/limit-expression-must-be-of-type-integer-error-when-using-apex-variable-in-soq/108423#108423">StackExchange post</a> with confirmation that this is a confirmed bug (unfortunately it looks like it was filed a year ago). Since I needed to complete the work, I had to cast my Integer to an Integer using <a href="https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_methods_system_integer.htm">Integer.valueOf()</a> to get the code to execute correctly (and added a comment to absolve my future self of ridicule).</p>
<p>TestAccountListController.cls</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>public class TestAccountListController {
@AuraEnabled
public static List<Account> getAccounts(Integer resultSize) {
// Salesforce bug with Lightning serializer requires re-casting this value
resultSize = Integer.valueOf(resultSize);
query = 'SELECT Id, Name FROM Account';
if (resultSize != null && resultSize > 0) {
query += ' LIMIT ' + resultSize;
}
return Database.query(query);
}
}
</code></pre></div></div>Michael WelburnDebugging a Lightning Component error when using Integers as server-side parameters.Finding duplicate data with SOQL2016-11-09T23:11:06+00:002016-11-09T23:11:06+00:00/2016/11/09/finding-duplicate-data-with-soql<p>While the use of <a href="https://help.salesforce.com/articleView?id=data_dot_com_clean_implementing.htm">Data.com Clean</a> makes it easier to ensure data quality does not get compromised, there are still times that I need to quickly check to see if I need to merge records together. For those who haven’t needed to do this before, you may not be aware that a SOQL query can do this for you (no need for Excel).</p>
<p>One scenario I recently went through was checking for duplicate Contact records that users may have created prior to an integration pushing the same Contact’s master data into Salesforce. The first thing I checked in this case was for unique email addresses.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>SELECT Email, COUNT(Id) FROM Contact GROUP BY Email HAVING COUNT(Id) > 1
</code></pre></div></div>
<p>This <a href="https://developer.salesforce.com/docs/atlas.en-us.soql_sosl.meta/soql_sosl/sforce_api_calls_soql_select_agg_functions.htm">Aggregate</a> query groups together all of the resulting records by the <strong>GROUP BY</strong> field, in this case Email, and displays the number of Contact records that match that Email. The <strong>HAVING</strong> clause filters out any unique Emails in the system, ensuring that the result set only shows duplicates.</p>
<p>While this query doesn’t give you the Contact Ids, it is a great way to quickly narrow down the faulty data for more specific queries. Similarly, you can check other fields by modifying the <strong>GROUP BY</strong> field and adding that field to the select statement.</p>Michael WelburnEasy to remember query to identify duplicate data in a field.Dreamforce 16 Session Recap2016-10-16T16:49:06+00:002016-10-16T16:49:06+00:00/2016/10/16/dreamforce-16-session-recap<p>I had a great few days at <a href="https://dreamforce.com">Dreamforce</a> 2016 connecting with a large number of internet friends, including the community around the always entertaining <a href="http://www.gooddaysirpodcast.com/">Good Day, Sir!</a> podcast - a must listen for any Salesforce developers. The footprint for developers continues to grow, taking over Moscone West this year, and I can’t wait to get my hands on Salesforce DX next year.</p>
<p>My <a href="/2016/08/23/catch-me-at-dreamforce">session</a> was presented on Tuesday afternoon to a pretty strong crowd in the Lightning Theater, and it helped that everyone had to walk by it to get lunch. Unfortunately, the Theater talks were not recorded, but I did record a screencast of the presentation afterward and <a href="http://bit.ly/MW-DF16Video">uploaded it to Youtube</a> in case you missed it.</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/RfV0H4DqVkc" frameborder="0" allowfullscreen=""></iframe>
<p> </p>
<p>Additionally, there are a number of links and resources (video, powerpoint, source code, etc.) located under <a href="/df16-resources">Dreamforce 16 Resources</a>. I also recorded a quick video on <a href="http://bit.ly/CreateCommunityUsers">how to create Community Users</a>, as that question has come up in the past.</p>
<p>If you have questions about the presentation, feel free to get in touch on <a href="https://twitter.com/michaelwelburn">Twitter</a>.</p>Michael WelburnRecapping my Dreamforce 16 session and providing resources.Catch Me At Dreamforce2016-08-23T12:49:06+00:002016-08-23T12:49:06+00:00/2016/08/23/catch-me-at-dreamforce<p><a href="https://dreamforce.com">Dreamforce</a> 2016 is quickly approaching, and I’m in the process of preparing for a theater session that I’ll be presenting. I’m very excited to have been chosen to speak for the second year in a row.</p>
<p>Over the last few months I’ve spent a lot of time working on Lightning Components for Community Builder as part of <a href="https://7summits.com">7Summits</a> Salesforce offerings, and have come across my fair share of gotchas and best practices. Lightning development is in its infancy, and as such there are a lot of little idiosyncrasies that either are bugs or features that are more restrictive in nature than traditional Visualforce development. The Lightning framework isn’t quite yet up to parity yet, but with Salesforce’s relentless push towards <a href="https://www.salesforce.com/blog/2015/08/future-of-crm-salesforce-lightning.html">Lightning Experience</a> and Community Builder, it is only a matter of time until all developers will need some level of proficiency with it.</p>
<p>That being said, the session I’m presenting is <a href="https://success.salesforce.com/Sessions#/session/a2q3A000000LBSYQA4">Architecting Lightning Components for Community Builder</a>. In particular, I’m going to be focusing on how to enable a developer new to Community Builder to set up a functioning Lightning Component, and the major requirements to ensure you are delivering the appropriate data to the user.</p>
<p>I won’t be focusing on the overall best practices with Lightning Components. Unfortunately there is not enough time for that, and there are sure to be many other sessions with that content.</p>
<p>If you have questions about Lightning Components in Community Builder, feel free to get in touch on <a href="https://twitter.com/michaelwelburn">Twitter</a>.</p>Michael WelburnI'm speaking at Dreamforce 2016 about Lightning Components & Community Builder.Migrating Blog to Jekyll2016-08-14T19:29:06+00:002016-08-14T19:29:06+00:00/2016/08/14/migrating-blog-to-jekyll<p>It has been quite some time since I’ve last posted, but I’m back.</p>
<p>First things first; this site looks very different. I’m in the process of migrating from <a href="https://wordpress.com/">Wordpress</a> to <a href="https://jekyllrb.com/">Jekyll</a> and <a href="https://pages.github.com/">GitHub Pages</a>. The core functionality and content were moved over, but I have have a small list of enhancements (adding a theme, social sharing, etc.) to work on over the next week or two.</p>
<p>I didn’t necessarily have any bad experiences with Wordpress that forced a change. In fact, I had originally chosen Wordpress in an attempt to distance blogging with another code project to tinker with. However, my Wordpress hosting plan’s imminent expiration and my interest in trying a static site generator created an opportunity. Using a <a href="https://wordpress.org/plugins/jekyll-exporter/">Wordpress plugin</a> to handle the content migration and site generation made the process pretty simple, so I decided to go for it..</p>
<p>I am leaning against enabling any sort of comment feature on the site. I’d rather engage in discussion on another platform like <a href="https://twitter.com/michaelwelburn">Twitter</a>, where I am always interested in having a conversation.</p>Michael WelburnIt has been quite some time since I've last posted, but I'm back.What is Salesforce?2016-03-01T19:29:06+00:002016-03-01T19:29:06+00:00/2016/03/01/what-is-salesforce<p>I get this question all the time when people ask me what I do for a living. Anyone in sales (and maybe the tech sector) has usually heard of Salesforce, but most people outside of those industries probably haven’t. I often have to explain:</p>
<ul>
<li>What is Salesforce?</li>
<li>No, I don’t build Salesforce.</li>
<li>How and why I help others customize Salesforce to fit their needs.</li>
</ul>
<p>While there is still a battle to be fought on the latter two points, Salesforce has provided a new trail in <a href="https://developer.salesforce.com/trailhead" target="_blank">Trailhead</a> called <a href="https://developer.salesforce.com/trailhead/trail/salesforce_advantage" target="_blank">Navigate the Salesforce Advantage</a> to explain the company and its core tenants at a high level.</p>
<!--more-->
<p>While I don’t want to reiterate the contents of entire trail here, as it is a pretty quick read, it is broken down into four separate modules. And if you have no idea what Trailhead is, take a look at my <a href="http://michaelwelburn.com/2016/01/24/salesforce-trailhead-not-just-for-beginners/">last post</a>.</p>
<h4 id="salesforce-success-model"><a href="https://developer.salesforce.com/trailhead/module/salesforce_advantange_who_we_are" target="_blank">Salesforce Success Model</a></h4>
<p><img class="aligncenter size-full wp-image-1095" src="http://michaelwelburn.com/wp-content/uploads/2016/03/Screen-Shot-2016-03-01-at-7.56.31-PM.png" alt="Screen Shot 2016-03-01 at 7.56.31 PM" width="561" height="116" srcset="http://michaelwelburn.com/wp-content/uploads/2016/03/Screen-Shot-2016-03-01-at-7.56.31-PM.png 561w, http://michaelwelburn.com/wp-content/uploads/2016/03/Screen-Shot-2016-03-01-at-7.56.31-PM-300x62.png 300w" sizes="(max-width: 561px) 100vw, 561px" /></p>
<p>This module explains the core building blocks of Salesforce as a company. For those who are learning about Salesforce for the first time, consider this the heartwarming story that makes you want to join the ecosystem.</p>
<p>In all seriousness, it is refreshing to see these key foundational elements consistently repeated throughout the company year over year, and that they are more than just a marketing ploy based on the actions that the company has taken over that time.</p>
<h4 id="salesforce-cloud-benefits"><a href="https://developer.salesforce.com/trailhead/module/salesforce_advantange_what_we_do" target="_blank">Salesforce Cloud Benefits</a></h4>
<p><img class="aligncenter size-full wp-image-1096" src="http://michaelwelburn.com/wp-content/uploads/2016/03/Screen-Shot-2016-03-01-at-7.58.14-PM.png" alt="Screen Shot 2016-03-01 at 7.58.14 PM" width="679" height="107" srcset="http://michaelwelburn.com/wp-content/uploads/2016/03/Screen-Shot-2016-03-01-at-7.58.14-PM.png 679w, http://michaelwelburn.com/wp-content/uploads/2016/03/Screen-Shot-2016-03-01-at-7.58.14-PM-300x47.png 300w" sizes="(max-width: 679px) 100vw, 679px" /></p>
<p>This is where the fun begins. It is hard to remember that 15 years ago, cloud computing was in its infancy, and Salesforce was at the forefront of this shift in thinking. The move to the cloud has given the ability for (poor) developers to disrupt entire industries from their bedrooms.</p>
<p>There is a great example in this module that compares Cloud Computing to renting an apartment in a building. I’ll have to copy that one the next time someone asks me to explain it!</p>
<h4 id="salesforce-technology-basics"><a href="https://developer.salesforce.com/trailhead/module/salesforce_advantange_how_we_do_it" target="_blank">Salesforce Technology Basics</a></h4>
<p><img class="aligncenter size-full wp-image-1097" src="http://michaelwelburn.com/wp-content/uploads/2016/03/Screen-Shot-2016-03-01-at-7.58.06-PM.png" alt="Screen Shot 2016-03-01 at 7.58.06 PM" width="701" height="112" srcset="http://michaelwelburn.com/wp-content/uploads/2016/03/Screen-Shot-2016-03-01-at-7.58.06-PM.png 701w, http://michaelwelburn.com/wp-content/uploads/2016/03/Screen-Shot-2016-03-01-at-7.58.06-PM-300x48.png 300w" sizes="(max-width: 701px) 100vw, 701px" /></p>
<p>Building off the previous module, the slightly more tech-savvy audience can get a basic understanding of how this mythical cloud architecture works, and why businesses trust it and can leverage it to accelerate their time-to-market.</p>
<p>In fact, Salesforce has garnered such a reputation for the speed at which you can build applications, sometimes with minimal or no actual coding, that my developer friends often imply that there isn’t any development work to do.</p>
<p>The truth in this case is that Salesforce handles all the infrastructure, servers, security, etc. for you — replacing some of the lower level developer tasks. Personally, that is the stuff that I don’t find as fun as building the business logic and interfaces, so I love that I don’t have to do it.</p>
<p>The speed between creating a brand new instance to writing your first line of code can be measured in minutes. In other words:</p>
<blockquote>
<p>“Salesforce does all the dirty work so I can concentrate on the fun stuff.”</p>
</blockquote>
<h4 id="salesforce-ecosystem"><a href="https://developer.salesforce.com/trailhead/module/salesforce_advantange_ecosystem" target="_blank">Salesforce Ecosystem</a></h4>
<p><img class="aligncenter size-full wp-image-1098" src="http://michaelwelburn.com/wp-content/uploads/2016/03/Screen-Shot-2016-03-01-at-7.57.58-PM.png" alt="Screen Shot 2016-03-01 at 7.57.58 PM" width="713" height="114" srcset="http://michaelwelburn.com/wp-content/uploads/2016/03/Screen-Shot-2016-03-01-at-7.57.58-PM.png 713w, http://michaelwelburn.com/wp-content/uploads/2016/03/Screen-Shot-2016-03-01-at-7.57.58-PM-300x48.png 300w" sizes="(max-width: 713px) 100vw, 713px" /></p>
<p>Lastly, but perhaps the unique aspect of Salesforce, is the ecosystem. I’ve never before seen such a large group of people across skill sets and competencies posting (and replying) to random people across the globe.</p>
<p>The volume of people willing to interact over social media, forums, in user groups, and a variety of other mechanisms seems to be unparalleled in the industry. It makes it very welcoming for anyone to join in, and the ability to assimilate into the ecosystem with those helping hands is definitely has a strong pull for those looking for a new career.</p>Michael WelburnDiving into Salesforce's latest Trailhead module.Salesforce Trailhead: Not Just For Beginners2016-01-24T15:26:37+00:002016-01-24T15:26:37+00:00/2016/01/24/salesforce-trailhead-not-just-for-beginners<p><img class="aligncenter size-large wp-image-1087" src="http://michaelwelburn.com/wp-content/uploads/2016/01/Screen-Shot-2016-01-24-at-3.58.49-PM-1024x568.png" alt="Trailhead" width="765" height="424" srcset="http://michaelwelburn.com/wp-content/uploads/2016/01/Screen-Shot-2016-01-24-at-3.58.49-PM-1024x568.png 1024w, http://michaelwelburn.com/wp-content/uploads/2016/01/Screen-Shot-2016-01-24-at-3.58.49-PM-300x166.png 300w, http://michaelwelburn.com/wp-content/uploads/2016/01/Screen-Shot-2016-01-24-at-3.58.49-PM-768x426.png 768w" sizes="(max-width: 765px) 100vw, 765px" /></p>
<p>One of my <a href="http://michaelwelburn.com/2016/01/02/2016-the-year-of-attainable-goals/">2016 Goals</a> was being <a href="https://developer.salesforce.com/forums/ForumsTrailheadProfile?userId=005F00000043LNOIA2" target="_blank">100% complete</a> with the existing Salesforce Trailhead modules. Less than a month into the year, I’ve knocked out the 20 modules I had left for that goal (at least until any new ones are released). It didn’t hurt that there was an opportunity to pick up some more <a href="http://go.pardot.com/l/27572/2016-01-06/4wy4tn?utm_campaign=newyear-trailhead-sweatshirt&utm_source=social&utm_medium=twitter-salesforcedevs" target="_blank">Salesforce swag</a> at the same time.</p>
<!--more-->
<p>What is <a href="https://developer.salesforce.com/trailhead" target="_blank">Trailhead</a>, you ask? It’s a great way to interactively learn Salesforce – anywhere from the more basic fundamentals of the platform for a brand new Administrator to an Advanced Developer interested in the technical details of the <a href="https://developer.salesforce.com/page/Mobile_SDK" target="_blank">Mobile SDKs</a>. This a direct replacement for anyone previously trying to learn the same content, who had to rely on release notes, documentation, code samples, or any snippets of help from community bloggers.</p>
<p>When Trailhead first came out I dismissed the modules available as only worthwhile for those new to the platform. However, as the content has continued to evolve the level of depth of the modules as well as the increased coverage of the platform functionality started to pique my interest. In November I attended the <a href="http://www.meetup.com/NYC-Salesforce-Developer-Group/" target="_blank">NYC Developer Meetup</a>‘s <a href="http://www.meetup.com/NYC-Salesforce-Developer-Group/events/226140593/" target="_blank">“Hands On Workshop: Building Lightning Components”</a> with <a href="http://coenraets.org/" target="_blank">Christophe Coenraets</a> where we went through one of the Trailhead projects. This really opened my eyes to the value of Trailhead and how quickly I could learn the primary concepts of Lightning Components in an hour compared to combing through the documentation on my own.</p>
<p>At that point I had decided that I would try to start knocking out some modules to see what else was available…and by the end of 2015 I had completed 50 modules. I was refreshing old platform knowledge, learning new things I had been meaning to pick up (all things <a href="https://developer.salesforce.com/lightning" target="_blank">Lightning</a>), and familiarizing myself with content that I wouldn’t normally interact with at my job (Donation Management, Wave, etc.). While some might think that superfluous information you don’t use in your day to day might be unnecessary, it gives you the ability to think about the Salesforce investment your clients (or company) has made from a big picture perspective of what the platform is capable of. There is also something to be said about be hungry to learn, and picking up Trailhead badges is a way to publicly validate that you are willing to put in the extra effort.</p>
<p>My final thoughts about Trailhead? <strong>It’s not just for beginners</strong>. I got a lot out applicable knowledge out of it in an extremely concise manner, and look forward to what’s coming next.</p>Michael WelburnHow a seasoned Salesforce veteran can derive value from Trailhead.2016: The Year of Quantifiable Goals2016-01-02T11:33:26+00:002016-01-02T11:33:26+00:00/2016/01/02/2016-the-year-of-attainable-goals<p>Now that 2015 has come to a close, it is an opportune time to think about my goals for the upcoming year. I did a pretty poor job of creating any sort of accountability for my 2015 goals (not even sure what they were at this point), and found that blogging my <a href="http://michaelwelburn.com/2014/01/01/new-years-resolutions-for-2014/" target="_blank">2014 goals</a> and mid-year <a href="http://michaelwelburn.com/2014/07/24/catching-2014-goals/" target="_blank">retrospective</a> rather useful for that purpose, so here is the 2016 version.</p>
<!--more-->
<p>Because my appetite often ends up setting unrealistic expectations, I decided this year I would create more realistic goals with the “opportunity to exceed”. I’m also going to take a page from a friend on his goal setting, declaring quantifiable numerical values in order to track tangible progress.</p>
<p>I’ve found that when I create these lists, there end up being two main themes:</p>
<ul>
<li>Professional / Career Development</li>
<li>Get off the Computer</li>
</ul>
<h1 id="professional--career-development">Professional / Career Development</h1>
<h2 id="write-24blog-posts">Write 24 Blog Posts</h2>
<p>Kicking off the list with a pretty obvious one. I dropped the ball on posting new content in 2015 after a pretty successful 2013/2014. I’ve got a variety of excuses as to why that was, but there isn’t much that can excuse a posting cadence of “once every 3 months”. Setting the bar at 2 posts a month seems pretty reasonable.</p>
<h2 id="collectall-trailheadbadges">Collect All Trailhead Badges</h2>
<p>Will touch on this a bit more in an upcoming blog post, but as part of maintaining expertise in the Salesforce ecosystem I’ve set a goal to stay current on <a href="https://developer.salesforce.com/trailhead" target="_blank">Trailhead</a> modules. My current job only touches on a subset of the platform, so Trailhead has proven to be a nice way to get some pointed hands-on experience with features I wouldn’t use on a normal project.</p>
<p>I <a href="https://developer.salesforce.com/forums/ForumsTrailheadProfile?userId=005F00000043LNOIA2" target="_blank">already have 51</a> of them already done thanks to a couple weekends in November, so finishing the last 20 shouldn’t be terrible. The overall goal is to end 2016 at 100% completion based on however many new modules come out during the calendar year as well.</p>
<h2 id="certifications">Certifications</h2>
<p>Salesforce rolled out some new certifications during the second half of 2015, and I still need to take (and pass) the <a href="http://www.salesforce.com/campaigns/success-services/developer-certification-in-progress.jsp" target="_blank">Platform Developer I & II Transition Exam</a>.</p>
<p>As a bit more of a stretch, I’ve been eyeing the <a href="http://certification.salesforce.com/pardot" target="_blank">Pardot certifications</a> for a year now, and would like to knock those out in an effort to increase my knowledge of the platform.</p>
<h2 id="present-1-session-at-dreamforce">Present 1 Session at Dreamforce</h2>
<p>Pretty self explanatory; I had a blast last year <a href="http://michaelwelburn.com/2015/10/02/a-belated-dreamforce-2015/" target="_blank">presenting 2 sessions</a> at Dreamforce, and would love to present again this year. Already starting to think about different topics to submit.</p>
<h2 id="contribute-12-pull-requests-to-open-source">Contribute 12 Pull Requests to Open Source</h2>
<p>This one is a bit new for me, as I haven’t made much of an effort in this department in the past besides an ad-hoc bug fix or two. As a way to give back (and keep my skills sharp) I’ve set a goal of submitting 1 pull request a month to any open source project.</p>
<h2 id="ship-some-apps">Ship Some Apps</h2>
<p>Like most people, I come up with useful ideas (usually only useful to myself) for apps all the time. Sometimes I even start working on them. Very infrequently do I finish them before losing interest. This year there are 2 different app types that I want to ship, which is defined by actually listing them on their respective stores:</p>
<p><strong>1 AppExchange App</strong></p>
<p><a href="http://appexchange.salesforce.com/" target="_blank">AppExchange</a> is Salesforce’s version of an App Store. My goal is to create some sort of free app, likely a Lightning Component, and go through the process of deploying it to the store.</p>
<p><strong>1 Ionic (iOS) App</strong></p>
<p>While I don’t have the patience to <a href="http://michaelwelburn.com/2014/08/13/goal-accomplished-incredibly-simple-native-ios-app-app-store/" target="_blank">re-learn the native language(s)</a> for writing iOS apps after more than a year of not touching it, I am interested in leveraging <a href="http://ionicframework.com/" target="_blank">Ionic</a> to build an iOS app in order to learn about that technology.</p>
<h1 id="get-off-the-computer">Get off the Computer</h1>
<h2 id="read-18-books">Read 18 Books</h2>
<p>I was <a href="https://www.goodreads.com/mwelburn" target="_blank">reading</a> at a rather voracious pace through the middle of 2014, but the last 18 months I have read very infrequently. As part of the greater goal to not stare at a computer screen (does E Ink count?), I’m looking to read 18 books in total. I’d like to make at least 6 of the books “work-related”, but giving myself some leeway to just read anything for the other 12.</p>
<h2 id="30-minutes-of-woodworking-3xmonth">30+ minutes of Woodworking (3x/month)</h2>
<p>My primary hobby that isn’t computer-related is woodworking, through a variety of different styles. While I am rather limited living in an apartment with creaky floors at the moment (ruling out the power tools), I do have the tools for whittling and <a href="http://michaelwelburn.com/2014/07/20/relief-carving-apartment/" target="_blank">relief carving</a>.</p>
<p>Last year there was very minimal woodworking; only a few trips to the power tools stored in my parents’ basement for scroll sawing and woodturning. This year my goal is to focus on the hand tools and create a reasonable cadence of spending some dedicated time 3x a month.</p>
<h2 id="exercise-run-3xweek-lift-3xweek">Exercise (Run 3x/week, Lift 3x/week)</h2>
<p>This one went pretty well for 80% of 2015. My wife and I ran the NYC Marathon on November 1, so there was roughly 6-8 months of training that focused on running 4-5 times a week. Of course, once that goal is accomplished…that cadence fell off a bit. In any case, running 3+ miles 3x a week (or equivalent cardio workout) shouldn’t be an issue.</p>
<p>On the other hand, I have always ignored strength training. This will be more annoying to be diligent about, but I’m setting a goal here of 30+ minutes 3x a week.</p>
<h2 id="learn-spanish-30-min-5xweek">Learn Spanish (30+ min 5x/week)</h2>
<p>A recurring theme from my 2014 list. I have what LinkedIn calls elementary proficiency in Spanish based on 4 years in high school, but it is essentially just knowing a good amount of vocabulary without being particularly adept at holding a conversation. While that is good enough to survive in a foreign country, I have a goal of being conversational at some point (which I would define as not having to translate between Spanish and English in my head before talking).</p>
<p>Since the end result is not something I can track quantifiable progress on, instead I’ll shoot for 30+ minutes of practice 5x/week through conversing with my wife or apps like <a href="https://www.duolingo.com/" target="_blank">duolingo</a>.</p>Michael WelburnNow that 2015 has come to a close, it is an opportune time to think about my goals for the upcoming year. I did a pretty poor job of creating any sort of accountability for my 2015 goals (not even sure what they were at this point), and found that blogging my 2014 goals and mid-year retrospective rather useful for that purpose, so here is the 2016 version.How I Migrated Off Meteor’s Free Hosting Plan2015-12-16T07:22:42+00:002015-12-16T07:22:42+00:00/2015/12/16/migrated-off-meteors-free-hosting-plan<p>Over Thanksgiving I put some time into prototyping a small web application that I had been wanting to make for a few years, choosing the technology stack of <a href="https://www.meteor.com/" target="_blank">Meteor</a> & <a href="https://facebook.github.io/react/" target="_blank">React</a> as a way to become more familiar with both. There is a simple todo <a href="https://www.meteor.com/tutorials/react/creating-an-app" target="_blank">tutorial</a> using that stack that served as my baseline, and after completing that a couple days of development got me to a point I could test with some family members to check the site’s usefulness.</p>
<p>Fast forward a few weeks; the <a href="https://www.meteor.com/tutorials/blaze/deploying-your-app" target="_blank">free hosting</a> that Meteor provides (and I had been using) has been running into some <a href="https://forums.meteor.com/t/anybody-else-seeing-mongo-failures-on-meteor-com-hosted-apps/14495/21" target="_blank">hiccups with availability</a>, spurring me into looking to migrate the site onto something more reliable for the time being. Without any real background in Meteor, <a href="https://www.mongodb.org/" target="_blank">MongoDB</a>, or web hosting outside of <a href="https://heroku.com" target="_blank">Heroku</a>, I spent some time trying to identify how to quickly accomplish this task via my preferred way: searching the internet for blog posts.</p>
<p>I found some helpful tutorials which I’ll mention below in hopes of aggregating information into a post that can serve as more of an “end to end” guide that I couldn’t locate myself.</p>
<!--more-->
<p><em>For full disclosure, I was also looking for a way to host the site roughly for free for the rest of the month, but I wanted a reasonable costing solution going forward if I wanted to continue to run the site. That being said, learning something new is always a motivator, so what I chose below isn’t necessarily my recommendation for someone looking for cheap personal SaaS services.</em></p>
<h3 id="finding-a-new-hosting-provider">Finding a New Hosting Provider</h3>
<p>The first thing I ended up doing was taking a look at the hosting providers that support Meteor explicitly, which led me to <a href="https://modulus.io/" target="_blank">Modulus</a> as a step up from Meteor’s free hosting but without the high cost of Meteor’s <a href="https://www.meteor.com/why-meteor/pricing" target="_blank">Galaxy</a> hosting platform.</p>
<p>While doing some Googling, I came across this interesting Medium post called <a href="https://medium.com/@david_sykora/taking-meteor-apps-into-production-with-modulus-compose-and-codeship-54236d7f0cc#.44qa45xtb" target="_blank">Taking Meteor Apps Into Production with Modulus, Compose, and Codeship</a>. I had cross paths with <a href="https://codeship.com" target="_blank">Codeship</a> at an interview a few years ago and thought it was pretty cool, so I figured it would be fun to set up one of their free plans (however unnecessary that was for a 1 person prototype). I wasn’t particularly sold yet on paying for a separate MongoDB host in <a href="https://compose.io/" target="_blank">Compose</a>, but I figured I’d give it a shot for a free month as the administration tools are quite rich.</p>
<p>The Medium post mentioned above did a pretty good job of walking through setting up the services necessary to get the web application up and running, although some of the screenshots and information were outdated (e.g. there is no longer a free Compose plan that I could find). However, between that information and another Modulus tutorial on <a href="http://meteortips.com/deployment-tutorial/modulus/" target="_blank">meteortips.com</a> I was able to stand the site up.</p>
<p>I’d be remiss to not include the official Modulus documentation for setting up a project on their site, which is available <a href="http://help.modulus.io/customer/portal/articles/1647770-using-meteor-with-modulus" target="_blank">here</a>.</p>
<h3 id="migrating-the-existing-database">Migrating the Existing Database</h3>
<p>This part seemed like it would be relatively easy; MongoDB has some commands that allow export and import. I came across this blog post titled <a href="http://blog.daveroma.com/export-meteor-database-to/" target="_blank">Export a MongoDB Database Hosted on Meteor.com to a Different Host</a>, which seemed exactly what I wanted to do, and was a little more helpful to me as a novice than the Compose <a href="https://docs.compose.io/backups/mongodump-mongorestore.html" target="_blank">documentation</a>.</p>
<p>At first I tried to just use the Modulus MongoDB offering for my database, however I experienced issues (probably self-inflicted) trying to restore the data dump to it, receiving the vague “auth failed” response even though my credentials seemed correct. At that point, I decided to actually try out Compose – which worked right away.</p>
<p>I did run into the error referenced in that blog post and had to individually restore collections, however I had an extremely basic model with 2 collections so it wasn’t a big deal.</p>
<h3 id="updating-the-domain-dns-records">Updating the Domain DNS records</h3>
<p>While I was alright with giving out the Meteor free host generated <em>*.meteor.com</em> URL to family as it was pretty easy to remember, Modulus gave me a much more…<em>unique</em> URL for my project. They also allow you to set up a custom <em>*.mod.bz</em> domain in the Administration settings, but that seemed less memorable for my wife, so I went ahead and pointed a domain registered with <a href="https://www.namecheap.com/" target="_blank">Namecheap</a> at it.</p>
<p>This <a href="http://help.modulus.io/customer/portal/articles/1700863-custom-domains" target="_blank">documentation</a> was pretty useful on setting that up (albeit a bit overwhelming for a personal project). The gist of it is that you need to update your Custom Domain on Modulus’ Administration setting for your project with <em>*.yoursitename.com</em> (assuming you are interested in mapping all subdomains and the root to your custom URL).</p>
<p>I went with the lazy (and repeatedly discouraged in the documentation) route of using CNAME instead of A records for my root domain because my attempts to use the A records weren’t taking effect as quickly as I would have liked (either that, or I configured incorrectly). Noting that the documentation’s screenshots are a bit outdated with regards to how Namecheap is set up today, I ended up having to set up a CNAME with a 301 Redirect in the actual Advanced DNS Panel.</p>
<h3 id="summary">Summary</h3>
<p>I haven’t written up anything about Meteor yet, but the concept behind it is very interesting to me as the data between client and server is meant to be kept in sync without having to write (too much) code to push live updates to the browser. As I primarily work on the Salesforce platform the potential for crossover seems rather limited today, but for fun projects the ability to spin up something with so much infrastructure baked in makes creating small “hack” projects a delight.</p>
<p>My use of React was much more limited; conceptually I followed the framework’s paradigms but I barely scratched the surface of its usefulness.</p>
<p><em><strong>Note:</strong> The prototype is a social group sharing site that isn’t built for more than 1 group, hence the lack of link or screenshots. </em></p>Michael WelburnOver Thanksgiving I put some time into prototyping a small web application that I had been wanting to make for a few years, choosing the technology stack of Meteor & React as a way to become more familiar with both. There is a simple todo tutorial using that stack that served as my baseline, and after completing that a couple days of development got me to a point I could test with some family members to check the site’s usefulness.