tag:blogger.com,1999:blog-27632945877537278902024-03-27T01:44:20.547-04:00S.D. ToolsRandomized blog around Software Development and it's place in my life (may include drink recipes).
<br><br>
<i>It's hard to beat a person who never gives up.
<br>~ Babe Ruth
</i>Cory Wheelerhttp://www.blogger.com/profile/03128866105022882666noreply@blogger.comBlogger31125tag:blogger.com,1999:blog-2763294587753727890.post-82416994407440571832020-06-17T09:04:00.001-04:002020-06-17T09:29:54.245-04:00 The Cost of Hidden Wires<div>In working on the <a href="https://getcalm.io/" target="_blank">Calm</a> codebase one of the first things I did was wire in <a href="https://wallabyjs.com/" target="_blank">Wallaby.js</a> because, well... it's amazing, and I absolutely love it. Having been in a mix of C# and JavaScript, Wallaby gives me the immediate feedback I find most useful in my TDD cycle. I do have a small love affair with the test runner, but... I will be using it as an example of how I used in a manner that gave me issues once I moved Calm into CI. I don't hold Wallaby responsible for it, I just hit a snag that needed to be addressed.</div><div><br /></div><div>I've long held the belief that starting a project comes with it a special set of skills that I admittedly continue personal growth within. Wiring a project together to fit the needs of the overall longevity of it caries a set of unknowns sometimes that may or may not be obvious to you in the moment. And often that wiring is hidden away where you're unlikely to bump into it or have a need to go seek it out. Here is my simple example.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2a64z0_Z9qgq1KU5HwhwHz3VHOgVXkwWkTWmCNrDZNO97aUVDq79GQUwDofIadmx-iXQhKFSSQUC97HkRUXAke5HcjXuwDuYCZSogJ-N4deoBsPRn-5g_FA04ordeibPq6DrDJZgpRyY/s1308/hidden.wires.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="880" data-original-width="1308" height="336" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2a64z0_Z9qgq1KU5HwhwHz3VHOgVXkwWkTWmCNrDZNO97aUVDq79GQUwDofIadmx-iXQhKFSSQUC97HkRUXAke5HcjXuwDuYCZSogJ-N4deoBsPRn-5g_FA04ordeibPq6DrDJZgpRyY/w500-h336/hidden.wires.png" width="500" /></a></div><div><br /></div><div><br /></div><div>There is a small cost in time and a little bit of re-work that I had to pay in detangling some hidden wires in my specs. Wallaby provides a setup function that I had been leaning on until now. It was taking care of wiring some dependancies that each of my spec's needed... like hooking up chai and sinon, and it looked something like this:</div><div><br /></div><div><pre style="text-align: left;"><pre style="background-color: white; font-family: "jetbrains mono"; font-size: 9.8pt;"><pre style="font-family: "jetbrains mono"; font-size: 9.8pt;"><span style="color: green; font-weight: bold;">'use strict'</span>;<br /><br />module.<span style="font-style: italic;">exports </span>= <span style="color: navy; font-weight: bold;">function </span>() {<br /> <span style="color: navy; font-weight: bold;">return </span>{<br /> <span style="color: #660e7a; font-weight: bold;">name</span>: <span style="color: green; font-weight: bold;">'Calm'</span>,<br /><br /> ...<br /> <span style="color: #7a7a43;">setup</span>: <span style="color: navy; font-weight: bold;">function</span>() {<br /> <span style="color: #660e7a; font-weight: bold;">chai</span>.<span style="color: #660e7a; font-weight: bold;">should</span>();<br /> <span style="color: navy; font-weight: bold;">var </span><span style="color: #660e7a; font-weight: bold;">sinonChai </span>= require(<span style="color: green; font-weight: bold;">'sinon-chai'</span>);<br /> <span style="color: #660e7a; font-weight: bold;">chai</span>.<span style="color: #660e7a; font-weight: bold;">use</span>(<span style="color: #660e7a; font-weight: bold;">sinonChai</span>);<br /> <span style="color: #660e7a; font-weight: bold;">global</span>.<span style="color: #660e7a; font-weight: bold;">sinon </span>= require(<span style="color: green; font-weight: bold;">'sinon'</span>);<br /> <span style="color: #660e7a; font-weight: bold;">global</span>.<span style="color: #7a7a43;">next </span>= <span style="color: navy; font-weight: bold;">function</span>() {};<br /> },<br /><span style="color: blue;">...<br /></span><span style="color: blue;"> </span>};<br />};</pre></pre></pre></div><div>Having this configuration and wiring in the <a href="https://wallabyjs.com/docs/config/overview.html" target="_blank">Wallaby configuration file</a> meant that I did not have to import those into every test file I created, which was great! That's the point of hidden wires... they are out of your way and do some special sauce to make you more productive. Once I spun up a test file, I could get on with the work that I truly cared about... my tests, without having to pull in that setup every time. I had even setup up my package.json to tell you that you could not run the specs from the command line if you ran "npm run test"... you would get the message:</div><div><br /></div><div></div><div><pre style="text-align: left;"><font color="#24292e" face="-apple-system, system-ui, Segoe UI, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji"><span style="background-color: white; font-size: 14px;">"scripts": {<br /></span></font><font color="#24292e" face="-apple-system, system-ui, Segoe UI, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji"><span style="background-color: white; font-size: 14px;"><span style="white-space: pre;"> </span>"test": "echo \"Error: use Wallaby to run tests from within your favorite Wallaby configured IDE\"",<br /></span></font><font color="#24292e" face="-apple-system, system-ui, Segoe UI, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji"><span style="background-color: white; font-size: 14px;"><span style="white-space: pre;"> </span>"start": "node app.js"<br /></span></font><font color="#24292e" face="-apple-system, system-ui, Segoe UI, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji"><span style="background-color: white; font-size: 14px;">}</span></font></pre></div><div><font color="#24292e" face="-apple-system, system-ui, Segoe UI, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji"><span style="background-color: white; font-size: 14px;"><br /></span></font></div><div>I naturally hit a wall the second I began wiring up Continuous Integration in <a href="https://circleci.com/" target="_blank">Circle Ci</a>. Up to this moment, I hadn't had a need to run the tests from the command line. Remember, I'm still very early in the lifetime of this project, so I don't have a ton of code... it's still just basically a holding page with a few experiments in it that I've done along the way:</div><div><br /></div><div><br /></div><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/AVvXsEg8ZOD1ClEGKVSm3Uht87BvYVEkkPrDr3qGyLBufK8vcqHUAASU1HxzVAggWcSLJNnmGn0R5FNxDnHDf43iy3AszkTqXfVN6tErUJF_Rx-RGEDbHShGtvz3bf2FM9Vo8vCyyMxGmr1ZywE/s1300/calm.png" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="708" data-original-width="1300" height="273" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8ZOD1ClEGKVSm3Uht87BvYVEkkPrDr3qGyLBufK8vcqHUAASU1HxzVAggWcSLJNnmGn0R5FNxDnHDf43iy3AszkTqXfVN6tErUJF_Rx-RGEDbHShGtvz3bf2FM9Vo8vCyyMxGmr1ZywE/w500-h273/calm.png" width="500" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;"><br /></td></tr></tbody></table><br />This issue could have been addressed in several ways, some involving more complexity than others, and I'm still deciding what I want to do long term. My immediate desire was to get specs running in CI... and CI deploying the application, that was it. And I was looking for the smallest commitment I could make in getting that there from a codebase perspective because I knew I would have my hands full enough understanding the CircleCI ecosphere.<br /><div><br /></div><div>In the short term, I've chosen to write a function containing all of the same configuration, moving it out of the Wallaby configuration to somewhere that can be exercised when specs are run from the command line, like this... testHarness.js is then imported into each spec file:</div><div><br /></div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgW5w_TWPaFxqiMnandOJRU4JuysvC6Lyhp5yL2-HrdtVoebGeYtpn6kJwe6iXkv_0hWsFjcZ_zlwjFc25YwGK3gY5YG6dLuFMsCAdq5fRhQjbpVOk3bbXuuXZOAMH4lgHA3SdPYJ79Y-I/s882/testharness.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="578" data-original-width="882" height="329" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgW5w_TWPaFxqiMnandOJRU4JuysvC6Lyhp5yL2-HrdtVoebGeYtpn6kJwe6iXkv_0hWsFjcZ_zlwjFc25YwGK3gY5YG6dLuFMsCAdq5fRhQjbpVOk3bbXuuXZOAMH4lgHA3SdPYJ79Y-I/w500-h329/testharness.png" width="500" /></a></div><div><br /></div><div><br /></div><div><br /></div><div>This may not be where things live long term, or maybe they are... the project still has a long way to go. This was a good first step though towards getting all the specs to run in CircleCi and deployments going out when things merge into the primary branch. As for the npm configuration to to run on the command line... it's now a punt to mocha :).</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_ca4fZlvhCYs7xvWnrI_88kp-vyRka16xQ9aCyMzPBFURijP1oIlbJYK9t-ofSinmPjmao1ZxUWodKPX5IJ2FmCBc-GGYJNO2tktNqHzbXmzis64mKTTAi7Zrt77C_k7kaAal4hWh6Co/s2300/Screen+Shot+2020-06-17+at+8.30.32+AM.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="476" data-original-width="2300" height="130" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_ca4fZlvhCYs7xvWnrI_88kp-vyRka16xQ9aCyMzPBFURijP1oIlbJYK9t-ofSinmPjmao1ZxUWodKPX5IJ2FmCBc-GGYJNO2tktNqHzbXmzis64mKTTAi7Zrt77C_k7kaAal4hWh6Co/w625-h130/Screen+Shot+2020-06-17+at+8.30.32+AM.png" width="625" /></a></div><div><br /></div><div><br /></div><div>I haven't lost anything in my usage of Wallaby and CI works... a win win. My point in all of this is that the hidden wiring of pieces of our system often give us some efficiency or clarity in some other part of the system. The system is more scannable when reading the codebase, reducing some level of cognitive load along the way which is for sure valuable. Anytime I can reduce the amount of stuff I have to think about is typically a great thing. It can however come out of hiding as the system evolves though, and we need to be prepared for those types of moments. In my case it was a straightforward enough fix to make progress.</div><div><br /></div><div><br /></div>Cory Wheelerhttp://www.blogger.com/profile/03128866105022882666noreply@blogger.com0tag:blogger.com,1999:blog-2763294587753727890.post-86992596626333167602020-06-03T07:11:00.000-04:002020-06-03T07:11:42.910-04:00Leaning on The Pomodoro Lately<div><br /></div><div>It's funny how accidentally we discover things sometimes... a lot of the time. I think it would be interesting to have a catalog of things I've discovered on purpose, and things that I've discovered by total accident. I suppose that's simultaneously one of the best things about the very nature of the web (accidental discovery) and one of the the worst things (my quest for "accidental discovery" can be a complete timesink). </div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-kfqvZq3RWOWKWbxqTjrMzr3Qm5vHPGSZmHteBwfOD7kz8QdHGRLPsBriLTWhCymPHvI8GOY6pfSpjRtRW5rw6Z-Ff-NqXdaK5c_i-RxwMZn2cGtnCECbcFZvufV1K-3tpBP0HithzIc/" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="480" data-original-width="800" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-kfqvZq3RWOWKWbxqTjrMzr3Qm5vHPGSZmHteBwfOD7kz8QdHGRLPsBriLTWhCymPHvI8GOY6pfSpjRtRW5rw6Z-Ff-NqXdaK5c_i-RxwMZn2cGtnCECbcFZvufV1K-3tpBP0HithzIc/w400-h240/james.till.jpg" width="400" /></a></div><div><br /></div><div>I remember sitting in my cubical at my first programming job at TRX in Atlanta, GA, scouring the web for an answer to something (probably how to formulate some regex to scrape data off of a passenger name record), when I stumbled on an article about something called the <a href="https://en.wikipedia.org/wiki/Pomodoro_Technique" target="_blank">Pomodoro Technique</a> of all things. I remember reading the article and thinking to myself, "What a novel idea... sounds interesting... I think I'll give it a try sometime." In it's most basic form the Pomodoro Technique is a method for managing your time developed by <a href="https://francescocirillo.com" target="_blank">Francesco Cirillo</a> (when he was a college student) where you:</div><div><ul style="text-align: left;"><ul><ul><ol><li>Pick something that must be done.</li><li>Set a timer for 25 minutes.</li><li>Work on the task.</li><li>End work when the timer rings.</li><li>Take a 5 minute break.</li><li>Repeat 2-5 until your task is complete.</li></ol></ul></ul></ul>I think at the time, I toyed around with working on a few things using Pomodoros... but the technique didn't immediatly stick for me. I don't think I was serious enough about it, even if I had seen some benefit out of using it for a few things. </div><div><br /></div><div>Flash forward several years... I'm at a new job with a great group of developers that I learned a lot from at <a href="http://versionone.com" target="_blank">VersionOne</a>. They had a deeply-seated tradition of pair programming, which was new to me at the time. One of the things that we all loved to experience when pairing was a sense of getting through the things we needed to get done with a sense of flow in getting through them. To that end, a couple devs liked working via a Pomodoro Timer. </div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEPCBjyQ_rRtVqtZGqfkcNt4cdVWUrw12irymdSLPbpvNpgwqDdFOuDmXuUVuxVNpDe1SPirMoLrl9R9BmOA7oKW_oK3so_635yH1jMUch8LXoTlfIAGYeKQvCSsGDcLpziZeRolXquWY/" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="983" data-original-width="960" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEPCBjyQ_rRtVqtZGqfkcNt4cdVWUrw12irymdSLPbpvNpgwqDdFOuDmXuUVuxVNpDe1SPirMoLrl9R9BmOA7oKW_oK3so_635yH1jMUch8LXoTlfIAGYeKQvCSsGDcLpziZeRolXquWY/w313-h320/timer.jpg" width="313" /></a></div><div></div><div><br /></div><div>Kept with us during the 25 minutes was a sheet of paper to record anything that was important to come back to and take care of, but not germane to the task we had at hand. These two practices I have kept with me and have used on and off ever since I learned them. Sometimes I have been more disciplined about the timer, and other times not as much. I have always... always... kept the habit of a small piece of paper to record things on to come back to. As humans, we're not built to keep track of more than about 4 things at any given time. The little piece of paper is the external brain that frees me to be more creative. More on that in another blog post.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtxj_PEeihVWhs97Gm0NnUpzkPMA9ewilXEfMnezP8kJkXWO8CadBUYALOm3A5TdlA1dyjc_x5uKgnIIN1ljnov8bUaD4nlGKh499UwHArKkvtI5iWhY7hJ88uus80HqnUpZwOOy7a-Lg/" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="1201" data-original-width="1201" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtxj_PEeihVWhs97Gm0NnUpzkPMA9ewilXEfMnezP8kJkXWO8CadBUYALOm3A5TdlA1dyjc_x5uKgnIIN1ljnov8bUaD4nlGKh499UwHArKkvtI5iWhY7hJ88uus80HqnUpZwOOy7a-Lg/s320/notepad.jpg" /></a></div><div></div><div><br /></div><div>Flash forward a few more years and here we all find ourselves wrapped up in the hands of a COVID-19 based pandemic, and for those of us fortunate enough... working from home full time. Many of us also found ourselves as poor substitutes for the amazing teachers that our kids had in school. Here we were, overnight seemingly, tossed into a world where we were expected to be as productive as we had ever been at work... and also be immediately available for our kids when they needed help for something related to school... or any other creative thing that came to their minds. </div><div><br /></div><div></div><div>Time management and retaining a sense of flow in my work life became an immediate challenge. My kids needed help understanding some of their assignments, and I was their substitute teacher. My employer required me to be continually making progress on all things work related. How was I going to get through this without making my kids feel guilty for asking for help? How was I going to claim the time required to make meaningful progress at work? Hellooooo to tha Pomodoro!!</div><div><br /></div><div>I've rediscovered my disciplined relationship with the Pomodoro Technique. There were several days where at the end of the day I was asking myself why had I not completed anything. It was in part the nature of the work that I was working on, and in part needing to be the awesome dad/substitute teacher my kids needed me to be. I've been using the Pomodoro Technique as I always have, really no different other than I don't really pair at my current employer. I'm just using it much more regularly lately than I had been over the past year or so. It's helped me with letting my kids know when they can snag me to ask questions they have needed help with. And it's helped me with staying focused and on task to get through the day to day coding work that I do. The family get's me for little windows of time, and I get a state of flow through my day. It's honestly been a godsend.</div><div><br /></div><div>All of that having been said, my hope is to start utilizing some of the aspects of the technique that I haven't been using. If I'm successful in pulling them in, I'll check back here and share how it has affected my work. If you've not ever tried the technique, I encourage you to give it a shot. I think you'll be surprised at how helpful and useful it can be.</div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div>Cory Wheelerhttp://www.blogger.com/profile/03128866105022882666noreply@blogger.com0tag:blogger.com,1999:blog-2763294587753727890.post-5487507609152352992020-05-20T23:34:00.002-04:002020-05-21T09:45:54.239-04:00Sometimes... you take a detour<div class="separator" style="clear: both; text-align: center;">
<a href="https://upload.wikimedia.org/wikipedia/commons/thumb/9/9d/Singapore_Road_Signs_-_Temporary_Sign_-_Pedestrian_Detour.svg/1200px-Singapore_Road_Signs_-_Temporary_Sign_-_Pedestrian_Detour.svg.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="800" data-original-width="600" height="200" src="https://upload.wikimedia.org/wikipedia/commons/thumb/9/9d/Singapore_Road_Signs_-_Temporary_Sign_-_Pedestrian_Detour.svg/1200px-Singapore_Road_Signs_-_Temporary_Sign_-_Pedestrian_Detour.svg.png" width="149" /></a></div>
<br />
<br />
To say it's been a while since I've touched my side project (<a href="https://getcalm.io/" target="_blank">Calm</a>) would be a complete misrepresentation of how long it's actually been. As you can see from my last post back in... um.... <b>2018</b>... it's been a little bit longer than "a while". But, that's cool, life happens and I'm back at it, and that feels good š.<br />
<br />
Since I've started picking back up the pieces and hints that I left myself, I've been somewhat confused by the highly technical notes that I left behind. Current me is trying hard to remember the context of some of these notes that past me left!! Nonetheless, I'm making some progress. One string of the yarnball that I started to pull on was beginning to use an environment file for some of the application level configuration (a tenet of <a href="https://12factor.net/config" target="_blank">The Twelve-Factor App</a>). If you're unaware of the principals behind what is described at The Twelve-Factor App, I encourage you to give their site a read. As for configuration for your app, they require a strict separation of the config from the code. Things like port numbers, database connection strings, and 3rd party api tokens.<br />
<br />
That's all well and fine! I did hit a little bit of a snag with my unit tests gaining the appropriate load of my environment variables when running my tests through Wallaby.js though. I took a dependency on the 'dotenv-flow' npm package into my app.js file, and wrote a test that ensured it was being used and that the port I was expecting was also being used where I anticipated it should be.<br />
<br />
Perhaps not the most useful of tests I know, but sometimes I push things to the dogmatic edge just to see if I can, and to experience what challenges there are in doing so. Lo and behold, an unexpected challenge presented itself. My port was continually getting reported as <i>undefined</i>, regardless of what I tried. When I ran the app on it's own via 'npm run start', the port was console.log'ed as expected. I was not as lucky from within my test suite though. I was having a hard time finding an answer, and my google foo... for whatever reason... was failing me.<br />
<br />
That was until I stumbled on <a href="https://github.com/wallabyjs/public/issues/1016" target="_blank">this issue in the Wallaby.js repo</a>. The Wallaby configuration file needed to load the .env file in order to make it's contents available to my testing context apparently... like this:<br />
<br />
<pre>'use strict';
require('dotenv-flow').config();
module.exports = function () {
return {
name: 'Calm',
files: [
{pattern: 'src/**/*.js'},
{pattern: 'app.js'},
//list helpers for tests last, per wallaby's suggestion
{pattern: 'testHelpers/*.js', instrument: false}
],
tests: [
{pattern: 'test/**/*-spec.js'}
],
env: {
type: 'node',
runner: 'node'
},
testFramework: 'mocha',
setup: function() {
chai.should();
var sinonChai = require('sinon-chai');
chai.use(sinonChai);
global.sinon = require('sinon');
global.next = function() {};
},
lowCoverageThreshold: 99
};
};
</pre>
<br />
Now, does my use of a .env file completely satisfy the advice given the the author(s) of The Twelve-Factor App philosophy? No, I don't believe it does. However, it is a good first step that is better than having these types of things hard coded into the application itself. I suppose the next extension of their advice would be to have CI set the environment variables on the server itself that the code is deployed to. I'll tackle that one on some other dogmatic day, lol. Did my dogmatic requirement for this project having at least 99% code coverage force me to learn something new today? It did, and that's worth the effort to me.<br />
<br />
<br />Cory Wheelerhttp://www.blogger.com/profile/03128866105022882666noreply@blogger.com0tag:blogger.com,1999:blog-2763294587753727890.post-81714019322092788842018-09-09T23:04:00.000-04:002018-09-10T10:15:33.856-04:00Using 'host' while Bootstrapping CalmI've been in the process of bootstrapping <a href="http://getcalm.io/" target="_blank">Calm</a> (a new app I'm building out as part of my side hustle). Every time I set up a new project from scratch, I'm reminded of those things that I do only very rarely. Setting up the VM, nginx, ssh, firewalls... all of these are things I do rarely in comparison to the day to day development work that I do.<br />
<br />
I'm always pleased to find a new small utility or tool along the way. Today I found the <code>host</code>
command for verifying that the dns servers that I'm hitting from my house have the updated name servers I just adjusted with my domain registrar. It's an alternative to <code>nslookup</code>, and gives some really useful information.<br />
<br />
For my needs, the following did the trick<br />
<br />
<pre><code>host -t NS getcalm.io</code></pre>
<br />
The <code>-t NS</code> piece tells host to query for name servers, which was just the piece I needed. And yes, I was pleased to find that the new name servers had already propagated.<br />
<br />
<samp>getcalm.io name server ns3.digitalocean.com.<br />
getcalm.io name server ns1.digitalocean.com.<br />
getcalm.io name server ns2.digitalocean.com.</samp>Cory Wheelerhttp://www.blogger.com/profile/03128866105022882666noreply@blogger.com0tag:blogger.com,1999:blog-2763294587753727890.post-3211851576028065192017-03-17T13:16:00.000-04:002017-09-21T13:40:06.516-04:00There Is No Such Thing As A Short Term HackOne day during a review of some changes, a new user interaction was introduced that was basically making use of a toggle in the place of a checkbox. This gave rise to the desire to make other parts of the system have one user control for this behavior. It was said that the change in one spot to use a toggle, with other spots still using the old antiquated checkbox, would confuse users. We should instead take time to understand how far the change would need to extend.<br />
<br />
Fast forward a couple of months, one early morning I suggested to a colleague that we create an email group for our team. He said "yeah, but then you have to keep up with it when people come and go, and it becomes a big pain and get's out of date and kind of a hassle" to which I replied something to the effect of "welcome to my world and what it's like to maintain software".<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbekzMsU3BLdUne27UPkL900QePZyNLZdpnZNGTDS-0pgpetSKk7rFH9umxCf579qyHA-HOYYIznGzv7KelKjOEG8_kwJrrjf2a4s4v76APoNWciQdytRkFV-N01sAKDbW88dgkUIz0js/s1600/email_list.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="225" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbekzMsU3BLdUne27UPkL900QePZyNLZdpnZNGTDS-0pgpetSKk7rFH9umxCf579qyHA-HOYYIznGzv7KelKjOEG8_kwJrrjf2a4s4v76APoNWciQdytRkFV-N01sAKDbW88dgkUIz0js/s400/email_list.png" width="400" /></a></div>
<br />
A parallel to both of these is when we collectively as a team say, "Yeah, let's go with the hack for now so we can release...and then later we'll come back and clean it up." What's the commonality? Where is the parallel? All three are a point in time where a decision has to be made about maintenance in one form or another.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgb1KBWaEYNodAN_bIrMko9bX-MktGtW7pulfYVR_nbTfcZVMm-23LA4bj-AFG_t7yDrUcE9fHNUXjrTeoGTBXFZw_lblyqCauMuxiJpO09Vc_GhB1Xsvi1N4uSQ6mwi4Iczqq8Et8XW1w/s1600/hacking_tree.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="256" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgb1KBWaEYNodAN_bIrMko9bX-MktGtW7pulfYVR_nbTfcZVMm-23LA4bj-AFG_t7yDrUcE9fHNUXjrTeoGTBXFZw_lblyqCauMuxiJpO09Vc_GhB1Xsvi1N4uSQ6mwi4Iczqq8Et8XW1w/s400/hacking_tree.jpg" width="400" /></a></div>
<br />
What does a hack look like? It comes in many forms. Oddly placed "if(...)" checks sprinkled around. Ever growing indentation levels in a method, indicating harder and harder to understand logic to get you down into those inner most levels. Duplicated identical switch statements hiding classes that are waiting to be born. Code smells sprinkled here and there, and... and... and everywhere.<br />
<br />
This business decision of a "short term hack" leaves a bunch of garbage laying around in the code. As a team, we may have great intentions of "coming back to clean it up". But the reality is, that rarely happens... and when it does, it can be the exceptional case. Look, I get it. There is often not any perceived value of coming back to take care of it. But I as a user of that code, have to deal with that. And so do the poor schlubs that I work with that bump into that hack and are left scratching their heads.<br />
<br />
It's confusing on several orders of magnitude larger than someone having to handle grocking a checkbox vs. a toggle, or to maintain an email list. Over time, more and more of these "compromises" cause the code to become more and more brittle. It becomes harder and harder to change. Harder and harder to understand. To reason about. The compromise is on the side of the code. The health of the artifact that should be an enabler of speed... of our ability to pivot late in the release cycle... rather than a drag on our speed, becomes more and more un-healthy.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlJH-AXR2ck2utwcuU_8cvCnKUYHBoYR-TZ0YZdYXxKRXMDd9PSlUrwqK-UgJBU0MH29Ektq_MofFQokONEVMOp94Q6kWGbT6RYpXlS0_teeRg7so2GCVR1n-3rB4xYZfTjn6v-WzG1cA/s1600/confused.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="266" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlJH-AXR2ck2utwcuU_8cvCnKUYHBoYR-TZ0YZdYXxKRXMDd9PSlUrwqK-UgJBU0MH29Ektq_MofFQokONEVMOp94Q6kWGbT6RYpXlS0_teeRg7so2GCVR1n-3rB4xYZfTjn6v-WzG1cA/s400/confused.jpg" width="400" /></a></div>
<br />
When things begin to take longer and longer to deliver, do we ever look at one another as a team and say "well, this is because we have made some "compromising" decisions along the way that have affected the code adversely and now we're feeling it". I think that's often not the case. Sometimes it is, don't get me wrong. Sometimes we do recall those compromises. And sometimes we take the time to inject some health back into our code artifact.<br />
<br />
But, more often is the case that we have lost all context from those far off historical decisions, and now we just feel the pain. Whether it be from too much time passing, or because people that came to the initial "compromise for a short term hack" are no longer around working on the code / on the project / with the company. Or maybe they are still around, but they are not the one staring that compromise in the face at the moment, you are...you're the poor schlub I mentioned above. And there is no way for you to recapture that intimate moment of the past where yes we were able to deliver back then... but now... now you have a story on your Kanban board that's taking forever to make it out of the "Developing" column. So the "compromise" has come back and is staring the larger company straight in the face, specifically you... your product owner... your team. And there you stand as a developer with a cracked egg all over your face. Given enough complaining room and frustration and you might just start to sound like a crotchety wind bag full of hot air about how difficult the code base is. Product owners don't care to hear about the difficulties of the code... they would much rather hear that your story is complete and your ready to take on more work.<br />
<br />
Being honest about what it takes to keep a code base healthy is not an easy thing. It's soo necessary though. Be a professional. Do the right thing by the code, and keep lines of communication open between you and your team about what your doing and how it's coming. No, you can't fix the whole system in the course of one story. But yes, you can chew on a mouthful of it. Always making small improvements, and biting off some larger ones along the way can breath new life back into the code asset as well as your team.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUyBk1dp52JTxhT-wUpzzeET7blmg1S-jFJ_TTTzkd19fHetMAuQUeNiFbW4FOH6Mdx6Sf3tXK7qx8wb8MID-eek5WmSdtIfZsyg0ej-DHksp4bNOQwnF3W4BTDWbfTyzea1hEo2H02Fc/s1600/honest.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUyBk1dp52JTxhT-wUpzzeET7blmg1S-jFJ_TTTzkd19fHetMAuQUeNiFbW4FOH6Mdx6Sf3tXK7qx8wb8MID-eek5WmSdtIfZsyg0ej-DHksp4bNOQwnF3W4BTDWbfTyzea1hEo2H02Fc/s400/honest.jpg" width="398" /></a></div>
<br />
Fight like hell to keep them out. Don't offer them up as an option. But (and I do mean but), if you do have add in a "short term hack" in order to deliver (let's all be honest here... it happens... delivery has to happen, it's what keeps the lights on), insist at the very least that a story is created to come back and address the hack. Leave some artifact as a conversation piece to come back to. And make sure that story has plenty of detail around it, capturing as much of the moment as possible to get you back into the context of when the "compromise for the hack" was made. And then fight like hell to play that story as soon as possible.<br />
<br />
Short term hacks become long term hacks that harm code agility. Even more, they become longer term problems as you design more and more of your system around them... making additional compromises... predicated on the far off and often forgotten past compromises that the company as a whole made. Keep the code agile, and your company will be too.Cory Wheelerhttp://www.blogger.com/profile/03128866105022882666noreply@blogger.com0tag:blogger.com,1999:blog-2763294587753727890.post-40707584540056952642016-05-17T13:15:00.000-04:002016-05-17T13:15:11.310-04:00Eventually Crappy People Show Up, and I'm Flattered<a href="http://shoptotrot.com/" target="_blank">ShopToTrot</a> has been out for a little more than a year now. We've gotten enough users for me to say that there is enough interest to keep going, and that feels really really killer. Like anything that attracts people online, some people that come through can be, well Crappy. There, I said it. By Crappy I mean that they have no intention of using the system as it was intended. They are there just to cause trouble.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfnHyHxG3AeOlMpremJH97nyMrQlaTBca3M-0IsnsTyuTR8zC-ZDmvlHQ_G6dQ7H4tQclyUR2L3GYD661OvyQMDOrrtxQk54dbPmzfINuxul0G5TXUJy5kuqgSmz58GQzAYd_Gd_P3LNY/s1600/Screen+Shot+2016-04-02+at+10.36.47+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="202" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfnHyHxG3AeOlMpremJH97nyMrQlaTBca3M-0IsnsTyuTR8zC-ZDmvlHQ_G6dQ7H4tQclyUR2L3GYD661OvyQMDOrrtxQk54dbPmzfINuxul0G5TXUJy5kuqgSmz58GQzAYd_Gd_P3LNY/s640/Screen+Shot+2016-04-02+at+10.36.47+AM.png" width="640" /></a></div>
<br />
Well ShopToTrot has received enough attention that we've gotten our first Crappy user that hung out just to put junk ads into the system. This one did have a sense of humor though. He or She at least mocked us a bit by putting in a photo of their "horse" (seen above) that mirrored our stock photo that we use if you don't put any pictures of your horse in (seen below).<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJ8CcuBY41vcpFN-B18roxPd4Mt12VumvsoJnz-dC1Y4mSxMNOK2j0IN-YNGon2RBQaPKlzUg4gnPe5FV6YThAmJSsJ7WVB1JEAhh0sHLxe8P7HhDRG3SlbJrZdUM9i45OD6Z09lbJ4Fc/s1600/Screen+Shot+2016-04-26+at+9.49.09+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="190" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJ8CcuBY41vcpFN-B18roxPd4Mt12VumvsoJnz-dC1Y4mSxMNOK2j0IN-YNGon2RBQaPKlzUg4gnPe5FV6YThAmJSsJ7WVB1JEAhh0sHLxe8P7HhDRG3SlbJrZdUM9i45OD6Z09lbJ4Fc/s640/Screen+Shot+2016-04-26+at+9.49.09+PM.png" width="640" /></a></div>
<br />
For a moment, I was highly irritated. But that shortly gave way to flattery. Someone cared enough to come into our system and stink it up a bit. My point to all of this is simply, enjoy the Crappy people. They can't help themselves, and truly probably need a hug.<br />
<br />
More to the point, they are a signal that you are becoming successful. And... if it weren't for them, you might not harden the system.Cory Wheelerhttp://www.blogger.com/profile/03128866105022882666noreply@blogger.com0tag:blogger.com,1999:blog-2763294587753727890.post-13998965880629647242016-04-27T09:25:00.005-04:002016-04-27T09:33:42.842-04:00My Manager Hat vs. My Worker HatI mentioned <a href="http://sdtools.blogspot.com/2016/02/what-are-your-favorite-podcasts.html" target="_blank">a while back</a> that one of the podcasts that I've been listening to is <a href="http://simpleprogrammer.com/podcasts/" target="_blank">Simple Programmer</a>, by <a href="http://www.amazon.com/John-Sonmez/e/B00RPMRT5U" target="_blank">John Sonmez</a>. He gave some advice to a listener, and I've had it rolling around in my head since I heard it from <a href="http://simpleprogrammer.libsyn.com/simple-programmer-podcast-120-do-i-have-to-be-an-entrepreneur-to-be-successful" target="_blank">Episode 120: Do I Have To Be An Entrepreneur To Be Successful</a>. Just recently I've started to walk in that piece of advice.<br />
<br />
<div class="p1">
I may get some of the particulars incorrect, but the overall gist will be in the spirit of the exchange.</div>
<div class="p2">
<br /></div>
<div class="p1">
John told the guy that to make progress in his extra goals, he needed to have the ability to wear two hats. As I remember them, they were:</div>
<div class="p1">
</div>
<ol>
<li>A Manager Hat </li>
<li>A Worker Hat (I lovingly call this one the Doer or Executor Hat so if you see me use those alternate forms youāll know to what personality Iām referring to). </li>
</ol>
<br />
<div class="p2">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_Ih42U_wG46WEy8_sGU9j10-w2_qqwgTH_yMc2pNV5DIWhtjon7QbIB5gGsGPFd0GqF2uVz-BZrbpugOJ7hzkLsP8EnMc0PXn1wW9XFSHytxfXBImJlpf3hiFF8_HQKpRHqFx5solTjY/s1600/jdrockefeller.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="428" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_Ih42U_wG46WEy8_sGU9j10-w2_qqwgTH_yMc2pNV5DIWhtjon7QbIB5gGsGPFd0GqF2uVz-BZrbpugOJ7hzkLsP8EnMc0PXn1wW9XFSHytxfXBImJlpf3hiFF8_HQKpRHqFx5solTjY/s640/jdrockefeller.jpg" width="640" /></a></div>
<div class="p1">
<br /></div>
<div class="p2">
<br /></div>
<div class="p1">
<b>The Manager Hat:</b><br />
<br /></div>
<div class="p1">
This is the hat that you wear when you're deciding what should be accomplished by your Worker. So effectively, what he was saying is that you need to take some time to plan out your week. Be deliberate about setting goals for what would get accomplished during that week so you can keep sight of them. I've chosen Sunday night at 9:30 for this hat to adorn my head.</div>
<div class="p2">
<br /></div>
<div class="p1">
<include a="" biltmore="" building="" house="" maybe="" of="" picture="" the="" worker="" workers=""></include></div>
<div class="p2">
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7O4TZVf8qZgRP8dT2WLlPAL2JnvIuO_waIbV7-CZ3F3lprABQF_kY6nq4BZ6iu_AHRVpIZ_OpPGHwnaArWxAKvEAJCFY61euDvwzX9utPomkycz8JjC3eLw0fIGxsY5uzqvFeIQSWxUQ/s1600/Kansas_coal_miner.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="512" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7O4TZVf8qZgRP8dT2WLlPAL2JnvIuO_waIbV7-CZ3F3lprABQF_kY6nq4BZ6iu_AHRVpIZ_OpPGHwnaArWxAKvEAJCFY61euDvwzX9utPomkycz8JjC3eLw0fIGxsY5uzqvFeIQSWxUQ/s640/Kansas_coal_miner.jpg" width="640" /></a></div>
<br />
<br /></div>
<div class="p1">
<b>The Worker Hat:</b><br />
<b><br /></b></div>
<div class="p1">
The other hat he mentioned you needed to pick up is a Worker Hat (or a Doer Hat). This is the hat you put on once the Manager Hat comes off. You wear this hat for the rest of the week. Once this hat comes on you simply execute the plan unquestioningly. You donāt deviate from it, you just simply do what your Manager has planned for your Doer.</div>
<div class="p2">
<br /></div>
<div class="p1">
Once you get through the week, wash, rinse, and repeat for the following week.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXXV4b4kBwNelNbU6WeWyPRzoTFE545Mqs8ddmWAvxO60hxdTanPEHW6Eoxizn8ST8DAMrLSZYN_sX9H01h2OgsHPChckvXuKi2giht1zh6_zuioSksAOuGz91wIEfJiEeZWP21gRc1Pw/s1600/climbing.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="424" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXXV4b4kBwNelNbU6WeWyPRzoTFE545Mqs8ddmWAvxO60hxdTanPEHW6Eoxizn8ST8DAMrLSZYN_sX9H01h2OgsHPChckvXuKi2giht1zh6_zuioSksAOuGz91wIEfJiEeZWP21gRc1Pw/s640/climbing.jpg" width="640" /></a></div>
<br /></div>
<div class="p2">
<br /></div>
<div class="p1">
<b>In Practice (as I have experienced it thus far):</b></div>
<div class="p2">
<br /></div>
<div class="p1">
As I have tried to operate in this, Iāve discovered that my Manager always has unrealistic expectations of what my Worker can accomplish. Big surprise right? Thatās often the case in the real world, outside of this little dual personality experiment that Iām doing. So what does that really mean you may ask. Well, for me itās meant that what my Manager has scheduled for a particular day might not be what my Worker has been able to accomplish for that day. And there isnāt anything scheduled for this thing that my Worker hasnāt finished on the next day coming up.<br />
<br />
Sooooo, my Worker had to negotiate with my Manager. The Worker had to tell the Manager, āHey dude, Iām not done. I havenāt been slacking, itās just that itās taking me longerā¦ or life has happened and inserted itself in the middle of your pre-scheduled routine, thus disrupting the schedule." If youāre anything like me, youāre trying to accomplish these things in the midst of working at your day job, raising a family, and potentially working on these things with other people. Any one of those three things tend to try and get in the middle of your Worker accomplishing what your Manager has laid out. It happens, weāre human, and plans may need to change.</div>
<div class="p2">
<br /></div>
<div class="p1">
So how have my Manager and Worker adjusted expectations of what will get accomplished. Well, the Worker starts out the week working diligently on those things scheduled by the Manager. And if the Worker isnāt able to complete a day's tasks, then the unfinished task/s get pushed to the next day by the Worker, and the things that were scheduled for the next day get pushed accordingly through the week. The Manager has placed a bucket at the end of the week to catch anything that gets pushed completely out of the week, and things are pulled from that bucket for scheduling the next week.<br />
<br />
This way, the Worker has some sense of continuity and doesnāt get disgruntled with not having completed anything at the end of the week, but has spent it thrashing about trying to accomplish everything (when that might not be possible). Itās important for progress and the Workerās feelings and sense of accomplishment to complete things and get them behind him. If the schedule needs to be adjusted then so be it, the Manager needs to compromise.</div>
<div class="p2">
<br /></div>
<div class="p1">
This has made the things that I've been trying to accomplish more concrete. And by "more concrete" I mean that there are very real time slots for work to slip into, and expectations on myself that those things scheduled (and only those things scheduled) should be completed.<br />
<br />
Life is going to happen. Your plans <b>will</b> get disrupted. You need to be able to <b>adjust</b>, and in the adjustment not loose <b>focus</b> on what your goals are.<br />
<br /></div>
<div class="p2">
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBb8NvjR11cz06goO1zvSKj_qHseqWOmf40D9u6HPrfxYhC6A7F-dHyXgHwHbossj8v96i93BU3M84gBDSQIPXwt1hfnTavdvefVtcgwUFMuajJAcumJi3B3aRO4sZpYRNCYKL3NpQQ1A/s1600/Sherlock.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="426" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBb8NvjR11cz06goO1zvSKj_qHseqWOmf40D9u6HPrfxYhC6A7F-dHyXgHwHbossj8v96i93BU3M84gBDSQIPXwt1hfnTavdvefVtcgwUFMuajJAcumJi3B3aRO4sZpYRNCYKL3NpQQ1A/s640/Sherlock.jpg" width="640" /></a></div>
<br />
<br />
In the closing, figuring out the balance between your Manager Hat and your Worker Hat can be Detective work for a while. But in the end you can find some happy medium and hopefully some cadence as to how much youāll be able to accomplish in your upcoming week.</div>
Cory Wheelerhttp://www.blogger.com/profile/03128866105022882666noreply@blogger.com0tag:blogger.com,1999:blog-2763294587753727890.post-24508210465651561312016-03-30T09:48:00.000-04:002016-03-30T09:48:13.666-04:00When you inflate the balloon, can you do it in the form of a kitten?<div class="separator" style="clear: both; text-align: center;">
<iframe width="320" height="266" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/BKorP55Aqvg/0.jpg" src="https://www.youtube.com/embed/BKorP55Aqvg?feature=player_embedded" frameborder="0" allowfullscreen></iframe></div>
<br />Cory Wheelerhttp://www.blogger.com/profile/03128866105022882666noreply@blogger.com0tag:blogger.com,1999:blog-2763294587753727890.post-62001604326620323402016-02-29T06:35:00.000-05:002017-09-21T13:40:24.527-04:00Lunchtime at The MoviesWell, not exactly at the movies (although that would be nice). I've started doing something at work to try and socialize and spark discussion on either technical things or the process of building software types of things. It's a divergence from the occasional post stand-up video showing off some insane accomplishment someone does in a car, or on a motorcycle, or skateboard, or bicycle. It's a bit more serious than that, and for good reason.<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDFkyLsj-e2kQPw1quBUzEaZMu04iniUoT-6DFVuXq3WL3co8Y3Pcn4PyQ6fgTjpwOYdHLQyXYKgpCDTbdz_2DG6w9JDItCB_pBHZuT4rJl3W52qFrMMKDVISjRHztVjA78gjJvZEKVnw/s1600/california-hollywood-sign.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="420" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDFkyLsj-e2kQPw1quBUzEaZMu04iniUoT-6DFVuXq3WL3co8Y3Pcn4PyQ6fgTjpwOYdHLQyXYKgpCDTbdz_2DG6w9JDItCB_pBHZuT4rJl3W52qFrMMKDVISjRHztVjA78gjJvZEKVnw/s640/california-hollywood-sign.jpg" width="640" /></a></div>
<br />
<br />
One of the great things about working with a team of good people (and by good I mean you care about producing useful stuff and helping out your fellow <a href="https://www.youtube.com/watch?v=hOlG5t2z3wI" target="_blank">humanzies</a>) is that everyone has been exposed to different things, have differing bases <a href="http://dictionary.reference.com/browse/basis" target="_blank">[bey-seez]</a> of knowledge, and hold their own ideas about technology and the world. You may find out about them either through pairing with folks, coming together as a larger team to solve a problem, over coffee, or on a team outing.<br />
<br />
Another avenue is over lunch while watching a video. We live in a time where content is being put out at an unheard of pace. Conferences will often put out either some or all of their material after the conference for absolutely free (truly a service to fellow <a href="https://www.youtube.com/watch?v=hOlG5t2z3wI" target="_blank">humanzies</a> at large, looking at you <a href="http://www.thestrangeloop.com/" target="_blank">StrangeLoop</a>... thank you). This gives us commoners a chance to gain access to well thought out technical discussions about all kinds of things that we normally would never have access to unless we work for employers that find value in sending us to some conferences (and most employers unfortunately do not do so), or we take the initiative and foot the load ourselves.<br />
<br />
Having an area to watch things like this is extremely helpful, and I don't mean everyone crowding into one of your fellow colleagues cubicles and squinting to watch it on their tiny laptop monitor. I mean a proper spot with a <a href="http://education.smarttech.com/en/products/6000-series?_ga=1.30057724.2145607864.1456744340" target="_blank">nice large screen</a> and <a href="http://www.lovesac.com/sacs/learn.html?gclid=CLqLmO3tnMsCFUg8gQoduQgCWA" target="_blank">comfortable seating</a> to relax, eat lunch, enjoy one another's company, and learn.<br />
<br />
Lunchtime at the movies, for me, aids in spreading some of the thoughts and things that I may be interested in out to my larger team. I've pulled together some of the places that I look to for snagging a video from below. If you tend to watch vids of stuff from the chatterboxes in our industry, where do you cull them from? I'm not looking for <a href="https://www.pluralsight.com/" target="_blank">Pluralsight</a> or <a href="https://www.udemy.com/" target="_blank">Udemy</a> types of courses, but more conference or meetup/usergroup types of things.<br />
<ul>
<li><a href="https://www.youtube.com/playlist?list=PLcGKfGEEONaCIl5eU53uPBnRJ9rbIH32R" target="_blank">StrangeLoop vids</a><br />
<ul></ul>
</li>
<li><a href="https://www.youtube.com/playlist?list=PL055Epbe6d5YhDchEvY3O4nIuSLYyrx7K" target="_blank">OSCON vids</a></li>
<li><a href="http://www.infoq.com/" target="_blank">InfoQ vids</a></li>
<li><a href="https://skillsmatter.com/" target="_blank">Skills Matter</a></li>
<li><a href="https://www.youtube.com/user/GoogleDevelopers/videos" target="_blank">Google Developer Vids</a></li>
<li><a href="https://github.com/lucasviola/awesome-tech-videos" target="_blank">Awesome Tech Videos</a></li>
</ul>
Cory Wheelerhttp://www.blogger.com/profile/03128866105022882666noreply@blogger.com0tag:blogger.com,1999:blog-2763294587753727890.post-15823810169021309212016-02-21T22:27:00.000-05:002016-02-21T22:45:26.428-05:00What are your favorite podcasts?Being a husband to my wonderful wife, father of 2 amazing kids, employee of an <a href="http://www.versionone.com/" target="_blank">awesome company</a>, creator of things (like <a href="http://shoptotrot.com/" target="_blank">ShopToTrot</a>), someone who is trying to blog more, create more, do more, yada... yada... yada, time can be scarce. One of the tools that I use to keep in touch with what's what in technology land is podcasts.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOSQiyx6AkhUkPGiiBo1rdhEwax9NUgmbffX0R16fYRWTzihUdUyyFevt3TwsLFiiL9TfHuxR3Xx-Idae0alEh2ywUK2zk95IBAEGdZOvc7vHnGcNLn-fkAq4yXF0224C6Wm1GJd7Dmkk/s1600/jodyfoster.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOSQiyx6AkhUkPGiiBo1rdhEwax9NUgmbffX0R16fYRWTzihUdUyyFevt3TwsLFiiL9TfHuxR3Xx-Idae0alEh2ywUK2zk95IBAEGdZOvc7vHnGcNLn-fkAq4yXF0224C6Wm1GJd7Dmkk/s400/jodyfoster.jpg" width="400" /></a></div>
<br />
I usually sneak in a listen on my way into work after I've dropped off my little munchkins at school, which typically amounts to 15 to 20 minutes of geekery. While I typically don't make it through an entire podcast in one sitting, as most run about an hour, I get enough of a fix on my morning drive to keep tuning in the next day. It's just enough to give me something to think about either actively or on one of my many background threads that like to solve things subconsciously for me.<br />
<br />
Is there always a direct benefit to my daily grind... no. But it does keep me abreast of techno land in a way that nothing else can. I don't always have time to sit down and read deeply about a subject, and this helps to gain a deeper than surface level understanding on some topics.<br />
<br />
Here's what I've been listening to lately:<br />
<br />
<a href="http://www.se-radio.net/" target="_blank">SE-Radio</a> - This is one that I hit for what I call bigger fish I guess. It's where I'm more likely to run across someone like Linda Rising, someone chatting about CAP theorem, or a good hearted discussion about the GOF 20 years after the initial publication of their book.<reason why=""></reason><br />
<br />
<a href="https://changelog.com/" target="_blank">The Changelog</a> - This is where I go to get my open source fix and things that might be more on "the edge".<reason why=""></reason><br />
<br />
<a href="http://simpleprogrammer.com/podcasts/" target="_blank">Simple Programmer</a> - This is where I hit for good advice on moving my career forward and personal development (and in all honesty I relate to the guy).<br />
<br />
I did a search for "github podcast" and <a href="https://github.com/guipdutra/awesome-geek-podcasts" target="_blank">this awesome list</a> turned up from Guilherme Dutra (thanks dude, it's a part of the <a href="https://github.com/sindresorhus/awesome" target="_blank">awesome list of lists</a>). It contains quite a bit and perhaps you can discover something new there.<br />
<br />
I've recently started using <a href="https://overcast.fm/" target="_blank">Overcast</a> to manage and listen to my podcasts, I recommend it. One of the reasons I made the hop was I wanted something that helped in controlling what podcasts actually got pulled down to my phone vs. allow me to stream. Overcast will let you set how long to hold onto a podcast before deleting it... you can always go back and grab it again if you need it. If you decide to use it, be kind and drop the folks that make it a few bucks... nothing in life is free.<br />
<br />
This isn't necessarily my complete list or my historical list, but it is the list that's comprised my last 6 months or so. I'm interested to know, if you listen to podcasts, regardless of if they are technology related or not, what are they? Everything I listen to isn't necessarily technology related (although lately they have been), and I would love to know what your tuning in to and why you are tuning in.Cory Wheelerhttp://www.blogger.com/profile/03128866105022882666noreply@blogger.com3tag:blogger.com,1999:blog-2763294587753727890.post-14741705927746584392016-02-14T22:38:00.000-05:002016-04-12T17:01:33.180-04:00One Class Per FileI've been using C# as one of my primary languages for the past 6 years where I currently work. Prior to that I was working with Java. One of the immediate differences that I noticed was that it was not uncommon to have multiple public classes in a source file. C# allows it, so why not.<br />
<br />
Coming from a Java background I was used to one public class per file, where the filename needed to match the public classname in the file, and for me... I preferred it that way. I felt that it helped to organize the code. Some may say, having multiple classes in a file can aid in readability/discoverability/understandability/insert-an-ability<insert-an-ability>. All true, they can. It can also be harmful in each of those respects as well... all depends. </insert-an-ability><br />
<br />
This week I've discovered a new reason why I prefer one class per file. Changes to classes are more traceable if a class has it's own file. Huhhh?<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrNO2-9k_Qm515StYLUZXfXbXtl2BCW2NUT18R58tZGWGI2Z0T7zQivWLW9H-mYBOedMiEcuJEB5-FxL1nx88gBnN1EzqqFQJcEcDsYsBNard4QMKUSRWBuT4_uz63OtogzqeRcMIxvT8/s1600/class.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="345" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrNO2-9k_Qm515StYLUZXfXbXtl2BCW2NUT18R58tZGWGI2Z0T7zQivWLW9H-mYBOedMiEcuJEB5-FxL1nx88gBnN1EzqqFQJcEcDsYsBNard4QMKUSRWBuT4_uz63OtogzqeRcMIxvT8/s640/class.jpeg" width="640" /></a></div>
<br />
<br />
The reasoning goes like this. If I start out and have a couple of small public classes in a file, then tracking changes doesn't seem too difficult. The problem comes in when the classes grow. Your file will becomes larger and larger, and when you look at the file, there might all of a sudden be too many concepts in the file for you to keep track of. This can especially be the case where you can have a file named a name that has nothing to do with any of the classes inside of it (poor form imo, but to each his own). Some of the classes in the file may be related to the filename, but if sloppiness has crept in (not unheard of) then other classes may not be as closely related to that filename. Different concepts and abstractions may have crept into the file, and you may not realize it for a while. Yuck.<br />
<br />
Then one day your in the file and your like, ZOMG, this file is too large and has too many concepts in it, I have to tease it apart. And so you do. You become the boy scout and you tease classes out of it, putting them in their respective files with the respective filenames and namespaces. And when you do this, your original file can in the worst case be empty (remember, the filename doesn't have to match any of the classes, and you just teased all of the classes out). And so you delete it. No problemo dude. And then you commit it and push it up to the remote (because your working in git).<br />
<br />
And now, well now all of the history that you had in commit messages is gone for every class that was in the original file. It's not like renaming a file in git. You can always use the `--follow` flag on the current file you have to retrieve the full commit history for that file.<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code>git log --follow path/to/filename </code></pre>
<br />
Unless your a good tracker, chances are you're not going to re-discover where those commit messages went for the deleted file. Perhaps you'll never need to. I hope so.<br />
<br />
Commit messages are a blessing for both me and my fellow developers because they are in some part a diary of what we were thinking about when we made changes. I've been getting more and more accustomed to making rather large commit messages lately. I'm recording more of the thoughts that I had around the design choices I've used, and perhaps even recording patterns I used in the commit.<br />
<br />
The history of changes to a class is important to me. Maybe I've found some religion on this issue, and most probably, I'm going to be more prudent on keeping... one public class per file come Monday.<br />
<br />
References:<br />
<a href="http://blogs.msdn.com/b/brada/archive/2005/01/26/361363.aspx" target="_blank">Brad Abrams - Design Guidelines, Managed code and the .NET Framework</a><br />
- Source files should contain only one public type, although multiple internal classes are allowedCory Wheelerhttp://www.blogger.com/profile/03128866105022882666noreply@blogger.com0tag:blogger.com,1999:blog-2763294587753727890.post-63508581274531410512015-11-20T19:42:00.000-05:002016-02-07T07:42:10.847-05:00Monday Night RitualsMonday nights for me have a ritual on them now. I say now, but in reality they have had a ritual on them for several years now. Several years seems about the right amount of time to actually claim something as a ritual I suppose. It's for sure past the 66 days it takes to formulate a new behavior.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<img border="0" src="http://www.sf.edu/blasts/alumni_newsletters/august2012/images/img-feat-night1.jpg" height="424" width="640" /></div>
<br />
Anyways, the ritual is I meet up online at 10PM Eastern / 7PM Pacific time with a good friend of mine, Dan Gilkerson, and discuss "stuff". Mostly we chat about side projects we are working on, but it can range widely depending on what we've been involving ourselves with and who else is on the call. How do I lay out what this "stuff" is. A list would probably work best.<br />
<br />
<ol>
<li>Helpful patterns to use in <a href="http://meteor.com/" target="_blank">meteor.js</a>.</li>
<li>What's a good name for our latest project idea (<a href="https://www.namecheckr.com/" target="_blank">namecheckr</a> is a fantastic tool to check name availability for this).</li>
<li>Here's an idea similar to one we've had, and look someone has built a project around it.</li>
<li>What's the latest thing Dan has learned in his latest hobby.</li>
<li>What <a href="https://www.kickstarter.com/" target="_blank">Kickstarter</a> has peaked our interest lately.</li>
<li>What's the next thing for XYZ side project we are tackling.</li>
<li>... A plethora of other things </li>
</ol>
The Monday night meeting started out of a desire to make getting together and working on extra projects routine. Not only routine for us, but also routine for those around us. Being a married father of two, it can be hard to fit things in that don't revolve around the family. A routine Monday night meeting has helped in that endeavor. It's not that I don't love my family with all of my heart and enjoy spending time with them, I do.<br />
<div>
<br /></div>
<div>
Meeting later in the evening for me has helped with fitting things together. By 10:00PM we've gone to whatever after school activities are up for the day (soccer/dance/t-ball/kungfu), we've eaten, completed all homework, hung out, taken baths, and gotten the little angles that are my children down for bed. It gives me a good hour to decompress after the kiddos go down to sleep. My rule is to try to be done with the meeting by 11:00PM or 11:30PM at the latest so that I can still get a relatively good nights sleep.</div>
<div>
<br /></div>
<div>
I bring this up to say this. That if there is a side project that you intend to do, outside and beyond what you do in your day job, start with one simple ritual. Our Monday Night ritual is one of a series of rituals that I've put in place to try to make it to that next lilypad in the pond of life for getting some successful side projects flowing. You may ask, are they successful? Is anyone using them? Yes, some are. Not huge successes yet, but enough success to be able to watch people use the systems, which gives us feedback for what's next.</div>
Cory Wheelerhttp://www.blogger.com/profile/03128866105022882666noreply@blogger.com0tag:blogger.com,1999:blog-2763294587753727890.post-81355987159066711852015-06-01T11:53:00.001-04:002016-02-14T22:51:45.520-05:00The Grapefruit BuckI have had the pleasure of discovering The Grapefruit Buck, my drink of choice when I need a serious break from the code. Give it a try, it helps to brink clarity to the world ;)<br />
<br />
<ul>
<li><span style="font-family: "arial"; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">A generous portion of ice</span></li>
<li><span id="docs-internal-guid-515e4001-afd0-4549-8bd1-794d0d538d04"><span style="font-family: "arial"; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">2 shots Absolute Ruby Red Vodka</span></span></li>
<li><span style="font-family: "arial"; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><span id="docs-internal-guid-515e4001-afd0-e531-95f6-8442d6099d87">Ā½ shot St. Germain's Elderflower liqueur</span></span></li>
<li><span style="font-family: "arial"; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><span id="docs-internal-guid-515e4001-afd1-6816-33d9-9fe31ed3cdfe">a splash Campari Bitters</span></span></li>
<li><span style="font-family: "arial"; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><span id="docs-internal-guid-515e4001-afd1-8ec3-3c12-f601db0af480">a splash Lime Juice</span></span></li>
<li><span style="font-family: "arial"; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">fill the rest with </span><span id="docs-internal-guid-515e4001-afd1-d63f-b086-8097aabb727b"><span style="font-family: "arial"; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Ginger Beer</span></span></li>
<li><span style="font-family: "arial"; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><span id="docs-internal-guid-515e4001-afd2-7725-da5c-2f199a4ed1ca">drop a slice of grapefruit on top</span></span></li>
</ul>
<span style="font-family: "arial";"><span style="font-size: 15px; white-space: pre-wrap;">Shake it all up and enjoy!</span></span><br />
<span style="font-family: "arial";"><span style="font-size: 15px; white-space: pre-wrap;"><br /></span></span>
<span style="font-family: "arial";"><span style="font-size: 15px; white-space: pre-wrap;"><br /></span></span>Cory Wheelerhttp://www.blogger.com/profile/03128866105022882666noreply@blogger.com0tag:blogger.com,1999:blog-2763294587753727890.post-54202056901093941552014-12-11T13:31:00.000-05:002014-12-11T13:31:15.851-05:00The long raceFinishing a side project takes a tremendous amount of persistence, even if the tooling you use provides a lot for you. Keep going, just keep going, is what I have to routinely say to myself. It's hard though, and requires a lot of deep breaths on my part.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://cdn.images.express.co.uk/img/dynamic/1/285x214/315995_1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://cdn.images.express.co.uk/img/dynamic/1/285x214/315995_1.jpg" /></a></div>
Cory Wheelerhttp://www.blogger.com/profile/03128866105022882666noreply@blogger.com0tag:blogger.com,1999:blog-2763294587753727890.post-39704180456906561362014-02-07T16:48:00.000-05:002014-02-07T16:48:40.611-05:00Cyclomatic Complexity AnalyzerThis week at <a href="http://versionone.com/about-us/" target="_blank">VersionOne</a> was HackWeek, a luxury that I love. There were a lot of great ideas and great demo's as usual. While working on my project I came across a tool that I ended up using that did just what I needed. It's a Cyclomatic Complexity Analyzer called <a href="https://github.com/jonasblunck/ccm" target="_blank">CCM</a> written by <a href="https://github.com/jonasblunck" target="_blank">Jonas Blunck</a>.<div>
<br /></div>
<div>
What attracted me to it? You can point it at a directory, and it will grab all the files in that directory and run it's <a href="http://en.wikipedia.org/wiki/Cyclomatic_complexity" target="_blank">Cyclomatic Complexity</a> algorithm against it, reporting out the complexity for each executable unit, read method in my case. I needed it for C#, but it also runs against C/C++, JavaScript and TypeScript. If you're looking for something dead simple to use and won't get in your way I recommend checking it out. Thank you Jonas.</div>
Cory Wheelerhttp://www.blogger.com/profile/03128866105022882666noreply@blogger.com1tag:blogger.com,1999:blog-2763294587753727890.post-8927416339237295522013-12-10T13:22:00.000-05:002013-12-10T13:45:31.828-05:00Git: What happens when the remote goes away?I have found myself working on several different after hours projects over the past few years. There are times when a project lies dormant for quite a while. And when you go back to pick up the pieces for a dormant project you might not remember where everything was/is. In my case, I forgot where the project was actually being hosted. Meaning, was it still on <a href="https://github.com/">GitHub</a>, or had it been moved over to <a href="https://bitbucket.org/">Bitbucket</a>? Or was it neither place. There had been a migration that had happened over to Bitbucket as they allowed the cost of housing the remote to stay, well... free.<br />
<br />
I started looking at my local machine and finally found where I had tucked away the code. But when I tried to ask git where it was pointing to I got an error:<br />
<div>
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code>git remote show origin
ERROR: Repository not found.
fatal: The remote end hung up unexpectedly
</code></pre>
</div>
<br />
Ooops, that didn't work out. My curiosity was peaked though. Surely there was a way to get at this information even though the remote might not be there any longer. And there is. You can ask your gitconfig for it:<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code>git config --get remote.origin.url
git@github.com:sware/duoness.git
</code></pre>
<br />
This is telling git to get the url of the remote's origin repository out of the local configuration information.<br />
<br />
What is duoness you may ask? It stands for "Do Unto Others-ness". It hopes to be a record of people either having done a random act of kindness or having received a random act of kindness. Time will tell if it makes it out to production.Cory Wheelerhttp://www.blogger.com/profile/03128866105022882666noreply@blogger.com0tag:blogger.com,1999:blog-2763294587753727890.post-57741967360951909032011-11-15T22:41:00.000-05:002011-11-15T22:41:56.053-05:00Setting Up GHUnit in XCode 4If you're looking for a hand held step by step walk through in getting GHUnit set up and configured in XCode 4, then you really need to watch <a href="http://youtu.be/zk2PXso_WHQ">this video</a> put up by <a href="http://blog.xebia.com/author/rvanloghem/">Robert van Loghem</a> from <a href="http://www.xebia.com/">Xebia</a>. It does an excellent job at conveying exactly what you need to do, and where you need to go to grab additional external resources to get things up and running. <br />
<br />
<br />
If you pop open GHUnitIOSTestMain.m, you'll notice a commented out section right at the top of the main method that lists some environment variables that can be useful and helpful in debugging. One that isn't listed though is GHUNIT_AUTORUN. Setting this to a value of YES will cause your tests to run automatically whenever you run them in the simulator, or if you choose, on your device. In XCode 4 you can set environment variables for a target by going to Product --> Edit Scheme... Selecting that should open up a view like the following, which is where you can add this setting. Make sure you're setting it for the application that has your tests in it.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4AA03g8MB2mjTgGat_GMAUiNgqwUyy7JquynRpZ4jXP87dY4hMIVrsBRbRvmyeQ9Ae53rtrv3FndsaESh-Ck_X8FCx2FqmRDidRk5ZyehFZvejaUQbprgUNHXeMD2NR2TEwCK3BbBZmQ/s1600/ghunit_autorun.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="190" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4AA03g8MB2mjTgGat_GMAUiNgqwUyy7JquynRpZ4jXP87dY4hMIVrsBRbRvmyeQ9Ae53rtrv3FndsaESh-Ck_X8FCx2FqmRDidRk5ZyehFZvejaUQbprgUNHXeMD2NR2TEwCK3BbBZmQ/s320/ghunit_autorun.png" width="320" /></a></div><br />
<br />
<br />
It saves the step of hitting the "run" button in the UI, which is nice.<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrasOGzb8FLRDni1I7TiFKmvRNwUyWKLyqOaKbrRaX3AF0TNJrsTrOs991p_z2vnEHuVzM1zbPE4Ki6fRV8H9rLUtPggBg8fI5Dst8Opn3zSNx-Noen3qIZBvHaX8E0Dv5Mk_zEvwB0-U/s1600/ghunit_runbutton.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrasOGzb8FLRDni1I7TiFKmvRNwUyWKLyqOaKbrRaX3AF0TNJrsTrOs991p_z2vnEHuVzM1zbPE4Ki6fRV8H9rLUtPggBg8fI5Dst8Opn3zSNx-Noen3qIZBvHaX8E0Dv5Mk_zEvwB0-U/s1600/ghunit_runbutton.png" /></a></div><br />
I found that useful little bit on <a href="http://www.vimeo.com/album/1472322">Brett Schuchert's video series</a> about doing TDD in iOS (specifically the one titled "Integer RPN Calculator: Setting Up The Environment"). I recommend giving the series a watch as he has some good information in it, and you get to see how he works. The series is based in XCode 3 so what you see won't exactly match up with what you see in XCode 4, but the more familiar you become with the environment the more adept you'll be a tracking things down.Cory Wheelerhttp://www.blogger.com/profile/03128866105022882666noreply@blogger.com0tag:blogger.com,1999:blog-2763294587753727890.post-43050202560451468972011-04-25T13:57:00.000-04:002011-04-25T13:57:11.294-04:00Get DrunkThank you <a href="http://laribee.com/">Dave</a> for passing this one along.<br />
<br />
<a href="http://24.media.tumblr.com/tumblr_lk185pfTwp1qz7lxdo1_500.jpg"><img src="http://24.media.tumblr.com/tumblr_lk185pfTwp1qz7lxdo1_500.jpg" height="404px" width="390px"/></a>Cory Wheelerhttp://www.blogger.com/profile/03128866105022882666noreply@blogger.com0tag:blogger.com,1999:blog-2763294587753727890.post-7106068334367657252011-01-19T13:02:00.013-05:002011-01-19T23:46:02.108-05:00ConcentrationMost of the work we do (in software) requires uninterrupted concentration. Here are some thoughts on why being in the office is often more distracting than not from Jason Fried. I think he makes some interesting observations... have a watch. While your at it, take a trip over to <a href="http://boycottameetingday.com/">Boycott A Meeting Day</a>.<br /><br /><object width="406" height="286"><param name="movie" value="http://video.ted.com/assets/player/swf/EmbedPlayer.swf"></param><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always"/><param name="wmode" value="transparent"></param><param name="bgColor" value="#ffffff"></param> <param name="flashvars" value="vu=http://video.ted.com/talks/dynamic/JasonFried_2010X-medium.flv&su=http://images.ted.com/images/ted/tedindex/embed-posters/JasonFried-2010X.embed_thumbnail.jpg&vw=432&vh=240&ap=0&ti=1014&introDuration=15330&adDuration=4000&postAdDuration=830&adKeys=talk=jason_fried_why_work_doesn_t_happen_at_work;year=2010;theme=a_taste_of_tedx;theme=new_on_ted_com;theme=not_business_as_usual;event=TEDxMidwest;&preAdTag=tconf.ted/embed;tile=1;sz=512x288;" /><embed src="http://video.ted.com/assets/player/swf/EmbedPlayer.swf" pluginspace="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" wmode="transparent" bgColor="#ffffff" width="406" height="286" allowFullScreen="true" allowScriptAccess="always" flashvars="vu=http://video.ted.com/talks/dynamic/JasonFried_2010X-medium.flv&su=http://images.ted.com/images/ted/tedindex/embed-posters/JasonFried-2010X.embed_thumbnail.jpg&vw=432&vh=240&ap=0&ti=1014&introDuration=15330&adDuration=4000&postAdDuration=830&adKeys=talk=jason_fried_why_work_doesn_t_happen_at_work;year=2010;theme=a_taste_of_tedx;theme=new_on_ted_com;theme=not_business_as_usual;event=TEDxMidwest;"></embed></object><br /><br />One of the things Jason points out that may help is using more passive means of communication such as email and IM to help to alleviate the constant interruption that can happen in our daily work life. I tend to agree with him with the exception of this observation... and that is this doesn't work if you are in an organization whose culture believes that email and IM trumps whatever else you are doing. But it definitely depends on the culture of your organization. In an organization that has a culture where IM and email trumps all else, you're going to have a hard time getting <strong>anything</strong> done in my opinion let alone blocking out time to concentrate on a problem.Cory Wheelerhttp://www.blogger.com/profile/03128866105022882666noreply@blogger.com0tag:blogger.com,1999:blog-2763294587753727890.post-38636152196695936762010-12-08T12:44:00.004-05:002010-12-08T12:58:27.734-05:00EvolutionHaven't really posted anything here in quite a while. Life has a way of sweeping by me, and that's how I've felt for a bit here. For whatever reason, just haven't had the time or energy to post... but we're trying to change that. I keep hoping for the 34 hour day to happen. I'll stop holding my breath, and start to use my lunch hour for more than eating lunch.<br /><br />This has by large been sparked by my team at work choosing to read through <a href="http://pragprog.com/titles/btlang/seven-languages-in-seven-weeks">Seven Languages in Seven Weeks by Bruce A. Tate</a>. I feel extremely fortunate to work with a super smart group a guys that are eager to learn and extend themselves by reading a book like this. In short... to evolve. Evolving is something that's been occurring in several of life's corners for me this year... something that can feel like a hammer on one day and like an intoxicating Long Island Iced Tea on others. Point being, to continue to evolve. And that is what I hope and am sure that reading Tate's book will do for me.<br /><br />As such, I hope to convey some of my thoughts and insights on the languages we go through. No doubt, it will be fun.Cory Wheelerhttp://www.blogger.com/profile/03128866105022882666noreply@blogger.com0tag:blogger.com,1999:blog-2763294587753727890.post-77613253939781113422010-03-09T15:04:00.003-05:002010-03-09T15:11:51.016-05:00Frustrating IIHere is a re-post of something I'd had up before, slightly annotated to include more information.<br /><br />I've had the unfortunate experience of dealing with code generation tools on several different projects, and my abhorrence of them continues to grow.<br /><br />The problems with code generation tools for a Software Developer - iReport and Websphere Portlet Factory.<br /><br />1. You click things, you don't write code. I went into software development because I enjoy writing code, not because I find enjoyment in clicking buttons. My heart has been broken every time I've had to deal with one of these tools.<br /><br />2. Provide you no visibility into the code. You're entirely blind from a code perspective, and have no real way to distinguish if things are not connected up correctly.<br /><br />3. Provide no debugging or step through ability during runtime.<br /><br />4. Rare, in my experience, to find one that provides code completion. And if it has, it's been spotty when it did work.<br /><br />5. There is absolutely no way to test them in any meaningful way via any kind of unit test.<br /><br />6. If you have to use one, read the book. You have no knowledge of how it's supposed to work without a reference.<br /><br />7. There is often very little, if any, contextual help within the tool for tasks that you're trying to accomplish. This lends itself to googleing for your answer, and good luck to find someone that's posted anything of value for the scenario you are faced with. Chances are, you won't find it.<br /><br />8. Oftentimes, the ability to control the same properties of objects or control items are found in different places. Or, labels to set properties across different controls or objects are named the same and appear to control the same thing but in actuality they do not. This makes it very confusing trying to figure out what exactly you are doing.<br /><br />9. When making a change, a simple textual change, to a control or element... that change doesn't always get applied. And there is no rhyme or reason as to why. Sometimes simply closing the thing you are trying to change and re-oppening that same item will allow your change to take. Sometimes changing the same field but in a different spot (as noted in item #7 above) will work. Sometimes not. It's often hit or miss.<br /><br />10. Refactoring items is typically a manual process that is error prone and fraught with manual-ness (my new word). It becomes very difficult to change items that have dependencies between them. I've not seen this automated well, if at all.<br /><br />11. You will waste an inordinate amount of time on things that work one second and don't the next, and then do again even though all you did is regenerate the code a couple of times during your troubleshooting.<br /><br />12. Sometimes items that get created via the tool will just simply behave erratically, no matter how much you tinker with it to get it to stop doing so. What I mean by this is that I've seen these types of tools implement some type of behavior that I have not told it to do. They just seem to do their own thing. And this newly unwanted behavior screws up what you are trying to accomplish. The unfortunate answer is often scrap the widget/report/whatever you are trying to create and start over. The art is knowing when to scrap it and when to keep banging on it. My hope is that I never use these tools long enough to become that artistic with them. The unfortunate thing is this is one of the most frustrating pieces of these things.Cory Wheelerhttp://www.blogger.com/profile/03128866105022882666noreply@blogger.com2tag:blogger.com,1999:blog-2763294587753727890.post-31720878781340207212010-02-17T08:58:00.003-05:002010-02-17T09:13:31.867-05:00Never Blog When You're MadI read the other day on Kent Beck's <a href="http://www.threeriversinstitute.org/blog/">blog</a> some wise advice that he was both simultaneously giving and breaking at the same time. <br /><br />Even though I had read this wise advice, I too did not follow it. The advice was to <a href="http://www.threeriversinstitute.org/blog/?p=466">never blog when you're mad</a>. It was never anything that I had thought about, but upon seeing it in writing it made perfect sense. Why? It just looks bad. You'll say things in the heat of the moment that you'll regret. And you just don't want the whole world to see your temper tantrum do you?<br /><br />Why did I not follow this advice that I had not even one day earlier stumbled upon? Because I was mad of course. And I wanted to express that... to get it out of me... so that I no longer held onto it. But after having my minor rant exposed on the web for a short duration of time... his advice kept ringing over and over in my head. "Never blog when you're mad... never blog when you're mad... never blog when you're mad...". <br /><br />And now that post is digital trash... I deleted it. There are more constructive things to write about or do. Such as this... passing on the advice... never blog when you're mad. Lesson learned.Cory Wheelerhttp://www.blogger.com/profile/03128866105022882666noreply@blogger.com2tag:blogger.com,1999:blog-2763294587753727890.post-1541142917739353752010-02-11T09:11:00.003-05:002010-02-11T09:14:51.551-05:00A Shoutout to the Agile ManifestoJust pausing for a moment to recognize the anniversary of the <a href="http://agilemanifesto.org/history.html">Agile Manifesto</a>.Cory Wheelerhttp://www.blogger.com/profile/03128866105022882666noreply@blogger.com0tag:blogger.com,1999:blog-2763294587753727890.post-4539062574136971162010-01-30T21:37:00.004-05:002010-01-31T00:23:31.663-05:00Apple Kudos Long OverdueI bought an <a href="http://www.apple.com/iphone/">iPhone</a> probably about a year and a half ago. Like any other iPhone owner that you askā¦ I love it. Tough to bump into someone that doesnāt love their iPhone. Iām not making any huge revelation when I point out that they absolutely did change the game in the mobile telco space when they came out with this phone.<br /><br />The revolutionary revelation that I have experienced, and want to point out to others, is the level of customer service that Apple has provided to me. This past November, my iPhone out of the blue decided that it would no longer connect up to any Wi-Fi access point. Not at home, not at work, not at Starbucksā¦ not anywhere. For me this was incredibly disappointing as that is my primary method of choice to pull down podcasts, which I love to listen to. Iāve come to love listening to The Java Posse and the Clarke Howard Show on my way to and fro work (along with a litany of other podcasts that I fit in here and there). Granted, you can pull down podcasts via iTunes and drag them onto your phone, but itās just several more steps to go through that I wish I did not have to. And besides that, I didnāt fork over hard earned cash for mobile equipment that would fail within a year, forcing me to sit back down at a desktop to use all of the functionality of my mobile device.<br /><br />After Googleing the issue and trying several suggestions to fix itā¦ I decided I had to make a trek to my local Apple Store to visit the āGenius Barā. For no real reason that I can point to, Iāve always felt that Appleās labeling their in-store tech support as the āGenius Barā rather pompous and pretentious. Iād never experienced any of these āGeniusesā before so who was I to judge if they were pretentious or notā¦ maybe they all really are geniuses. Just has a pretentious feel to it to me. Anyways, off I go to the <a href="http://maps.google.com/maps?f=q&source=s_q&hl=en&geocode=&q=lenox+mall+atlanta,+ga&sll=37.0625,-95.677068&sspn=30.185946,79.013672&ie=UTF8&hq=lenox+mall+atlanta,+ga&hnear=Lenox+Square,+Atlanta,+GA+30326&ll=33.855947,-84.361439&spn=0.030863,0.077162&z=14&iwloc=A&cid=12677712402609046750">Lenox Mall Apple Store</a> after setting a reservation with one of the techās (Note: a <a href="http://www.apple.com/retail/geniusbar/">reservation</a> is necessary, so make sure to set one at apple.com prior to heading off to the store).<br /><br />After taking my seat and explaining my dilemma to the technician assigned to me he ran some diagnostics on my phone. All came back to indicate that there was an issue with the phone. And after several resetās to the phone, the conclusion was that there was no helping this phone of mine. It was just simply not going to authenticate onto any Wi-Fi access points. And of course, this issue is very rare he saidā¦ I was just lucky enough to experience the problem. Then the rub came... sort of. After looking up the information in their system via the serial number of the phone, the tech informed me that my phone was 20 days outside of its warranty timeframe. A big resounding Charlie Brown-ish āAaaaUuuuuuGggggHhhhhhā rang through my brain as these words came out of his mouth. How could this beā¦ Why Meā¦ @#*&$*@(!!! As I mentally rolled around in self pityā¦ I almost didnāt catch the next sentence out of his mouth, which was āBut, they do give us <span style="font-style:italic;">some </span>discretion over cases that we get. Iām going to give you a new phone and call it a day.ā After hearing this, I almost kissed the guy. YESā¦ THERE IS A GOD. Kindness and being human have not been abolished from the American corporate vocabulary. I looked him straight in the eye and said āYouāve just won a customer for life. What is your bossās name? I would love to press in on him to give you a raise.ā<br /><br />I am pleased to reportā¦ I didnāt experience any pompous and pretentious geniuses at the āGenius Barāā¦ just some really nice people doing a really good job. Taking care of their customer.Cory Wheelerhttp://www.blogger.com/profile/03128866105022882666noreply@blogger.com0tag:blogger.com,1999:blog-2763294587753727890.post-67319232280303298602009-11-18T14:40:00.005-05:002009-11-18T15:47:16.878-05:00Oracle's Documentation SiteIf anyone has any insight into why Oracle's documentation site is so slow, I am seeking understanding and am open to ideas.Cory Wheelerhttp://www.blogger.com/profile/03128866105022882666noreply@blogger.com0