<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Neil Loknath</title>
    <description>Software, Apps, and Stuff.</description>
    <link>http://www.nloko.ca/blog/</link>
    <atom:link href="http://www.nloko.ca/blog/feed.xml" rel="self" type="application/rss+xml" />
    
      <item>
        <title>Freeze Dance - Entertain Your Kids, Hands-free</title>
        <description>&lt;p&gt;&lt;img src=&quot;/blog/images/freezedance1200x1200.jpg&quot; alt=&quot;Freeze Dance App Icon&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;freeze-dance-for-ios&quot;&gt;Freeze Dance for iOS&lt;/h2&gt;
&lt;p&gt;Freeze Dance is a simple app for a super, fun game.&lt;/p&gt;

&lt;p&gt;Open the app, press play, and that’s all there is to it. Freeze Dance will begin playing music from your queue in Apple Music. Dance until the music stops. Then, freeze and hold your position until the music plays again. Great game to play with kids and adults of all ages.&lt;/p&gt;

&lt;p&gt;This app was born out of my desire to reduce the small cognitive load required to pause and unpause music while playing this game with my toddler. I know, first world problems, right? But, let’s face it. Every little bit helps when raising a toddler. I found it annoying to have to find the pause/play button every time I wanted to toggle the music playback. It was distracting me to having fun with with my daugher. This app really helps. She loves watching the timer countdown, and even has a blast saying the numbers while she’s dancing.&lt;/p&gt;

&lt;h2 id=&quot;features&quot;&gt;Features&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;Integrates seamlessly with &lt;a href=&quot;https://music.apple.com/&quot;&gt;Apple Music&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Game stops when app is in the background&lt;/li&gt;
  &lt;li&gt;Use &lt;a href=&quot;https://music.apple.com/&quot;&gt;Apple Music&lt;/a&gt; app to update the play queue&lt;/li&gt;
  &lt;li&gt;Light &amp;amp; &lt;a href=&quot;https://www.cnet.com/health/why-you-should-you-use-dark-mode-on-the-iphone/&quot;&gt;Dark mode&lt;/a&gt; compatible&lt;/li&gt;
  &lt;li&gt;Randomizes dance and freeze duration&lt;/li&gt;
  &lt;li&gt;Large, clear countdown timer&lt;/li&gt;
  &lt;li&gt;Keeps screen on so timer is always visible&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;benefits&quot;&gt;Benefits&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;Movement helps develop muscles, coordination, and keep joints flexible.&lt;/li&gt;
  &lt;li&gt;Being able to listen and process sounds while tuning out background noise helps children strengthen their ability to receive, organize and interpret auditory input.&lt;/li&gt;
  &lt;li&gt;The ability to hold a position (static balance) and the ability to maintain balance when moving (dynamic balance) are necessary life skills for everyday activities&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;download&quot;&gt;Download&lt;/h2&gt;
&lt;div class=&quot;clearfix&quot;&gt;
&lt;img src=&quot;/blog/images/freezedance-freeze.png&quot; class=&quot;center col col-5&quot; /&gt;
&lt;div class=&quot;col col-7 p3&quot;&gt;The best part is it's free! &lt;a target=&quot;_blank&quot; href=&quot;https://apple.co/3slFbAD&quot;&gt;Download&lt;/a&gt; it from the App Store today. It'll be ad-free for a limited time.
&lt;a target=&quot;_blank&quot; href=&quot;https://apple.co/3slFbAD&quot;&gt;&lt;img class=&quot;p3&quot; style=&quot;width: 50%;&quot; src=&quot;https://tools.applemediaservices.com/api/badges/download-on-the-app-store/black/en-US?size=250x83&amp;amp;releaseDate=1613779200&amp;amp;h=d0560e1608e5851cb40eda56757173c2&quot; alt=&quot;Download on the App Store&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
</description>
        <pubDate>Fri, 21 Feb 2020 10:25:24 -0500</pubDate>
        <link>http://www.nloko.ca/blog/2020/02/freeze-dance-entertain-kids-handsfree</link>
        <guid isPermaLink="true">http://www.nloko.ca/blog/2020/02/freeze-dance-entertain-kids-handsfree</guid>
      </item>
    
      <item>
        <title>The Best Perk Is A Great Development Culture</title>
        <description>&lt;p&gt;&lt;img src=&quot;/blog/images/work-731198_1280.jpg&quot; alt=&quot;Developer coding&quot; /&gt;&lt;/p&gt;

&lt;p&gt;What makes a great development culture? Free drinks? Free breakfast? Everyday happy hour? Sure, those things are attractive. But, cool perks are par for the course these days. Virtually every startup and their uncle with a round of funding have perks of some sort. So, if perks are ubiquitous, there must be more to a great development culture than perks.&lt;/p&gt;

&lt;p&gt;I’ve been a Developer, a Team Lead, and now a Manager at &lt;a href=&quot;https://achievers.com&quot;&gt;Achievers&lt;/a&gt;. Throughout my career there, I’ve been exposed to many habits and behaviours that have really influenced my own day-to-day happiness and engagement. When writing this piece, I took a step back and really thought about what I’ve valued during my career working &lt;em&gt;as a developer&lt;/em&gt;. From that perspective, I’d like to recommend a few ideas that I believe will help you achieve and maintain a development culture where happy, engaged teams can thrive.&lt;/p&gt;

&lt;h3 id=&quot;why-is-as-important-as-what&quot;&gt;Why Is As Important As What&lt;/h3&gt;
&lt;p&gt;Software developers are problem solvers at heart. Taking a problem, coding up a solution, and seeing it through into production is definitely satisfying. But, what’s even more satisfying is knowing that the solution being implemented is the best one possible.&lt;/p&gt;

&lt;p&gt;Educate your teams about business problems, usability concerns, and feature ideas. &lt;strong&gt;Engage your teams in the brainstorming process&lt;/strong&gt;. Express why a given problem is a problem and why it’s the current priority. Knowing the why can inspire new and better solutions.&lt;/p&gt;

&lt;h3 id=&quot;everyone-is-a-product-owner&quot;&gt;Everyone Is A Product Owner&lt;/h3&gt;
&lt;p&gt;If you’re working in Agile, you probably have a Product Owner for each feature or team. While the Product Owner has their own set of duties and responsibilities, I like to think of the entire team as being product owners because every individual contributes to the delivery of the final product.&lt;/p&gt;

&lt;p&gt;Each person has their own unique set of values enabling them to think in their own unique ways. &lt;strong&gt;Encouraging a sense of ownership in everyone by seeking input from the team&lt;/strong&gt; in all phases of development results in a sincere desire to improve the product, different perspectives, fresh ideas, and improved features.&lt;/p&gt;

&lt;h3 id=&quot;silos-are-for-farmers&quot;&gt;Silos Are For Farmers&lt;/h3&gt;
&lt;p&gt;Frequently, teams are organized by feature or skill set. Either way, this doesn’t mean that the things they own should be the only things they do. Sometimes, a team will require a change to a feature, service, layer, etc. owned by another team. There’s a few choices: delegate the work to the owning team and let them prioritize the work within their current set of priorities (or negotiate new priorities), take on the work yourself, or don’t do the work at all. All of these are viable options. But, the second is one that shouldn’t be overlooked. &lt;strong&gt;Taking on work you don’t normally do is a great way to collaborate, stay challenged, and learn new skills&lt;/strong&gt;. Don’t funnel developers into silos. Give them the freedom to contribute outside of their comfort zone. They will be grateful.&lt;/p&gt;

&lt;h3 id=&quot;trust-your-talent&quot;&gt;Trust Your Talent&lt;/h3&gt;
&lt;p&gt;Software developers are smart people. They’ve been hired for a reason. They’re experts in their domain. Let them be experts and do what they do best. &lt;strong&gt;Smart people need the autonomy to learn, think, question, break things, and put them back together&lt;/strong&gt; until the right solutions present themselves. Very often, if given a little direction and time, they’ll get the job done. Developers — especially developers — don’t particularly enjoy being micromanaged.&lt;/p&gt;

&lt;h3 id=&quot;celebrate-success&quot;&gt;Celebrate Success&lt;/h3&gt;
&lt;p&gt;Software is built by people for people. The end goal should be that the people you’re building your software for will fall in love with it. And, when they do, share those success stories with your development teams. As a developer, &lt;strong&gt;realizing the value the features you’re building are bringing to your customers can be very inspiring&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When you can get software into your customers’ hands as quickly as possible, the results are even better. &lt;a href=&quot;https://medium.com/achievers-tech/continuous-delivery-and-the-iron-triangle-of-software-delivery-be5cccce22c8#.8cfbfo8xf&quot;&gt;Employ Continuous Delivery&lt;/a&gt; (easier said than done, of course) to shrink your feedback cycle and create more opportunities to celebrate success. The benefits from continuous delivery are too great to write about here, but it’s worth mentioning that &lt;strong&gt;seeing the code that you write go live daily is very empowering&lt;/strong&gt;. Moving to continuous delivery has been one of the best experiences of my career.&lt;/p&gt;

&lt;p&gt;Success is an important component, and it’s something that can be realized even before you’ve gone to market with your product or features. &lt;strong&gt;Take the time to allow teams to showcase in progress work&lt;/strong&gt;, so that they can provide visibility to the challenges they’ve faced and overcome. They’ll get a chance to feel that sense of pride everyone feels when showing off a great achievement, and stakeholders will get iterative glimpses into the future value being created.&lt;/p&gt;

&lt;h3 id=&quot;evolve-everything&quot;&gt;Evolve Everything&lt;/h3&gt;
&lt;p&gt;Create an environment where everything is evolving. A product should evolve, but the people building it should evolve with it. Constant learning is key to maintaining a team that feels challenged and grows.&lt;/p&gt;

&lt;p&gt;Many developers enjoy sharing what they’ve learned in their coding journeys. Facilitating sharing by creating opportunities for developer hosted learning sessions whether through meetings, meet-ups, blogs, or presentations allows those developers to shine and grow skills within the team at the same time.&lt;/p&gt;

&lt;p&gt;As the product and people evolve, processes grow stale and need to evolve too. Development processes shouldn’t be set in stone. &lt;strong&gt;Let your teams have input into what doesn’t work&lt;/strong&gt; and work together to improve things.&lt;/p&gt;

&lt;h3 id=&quot;look-beyond-features&quot;&gt;Look Beyond Features&lt;/h3&gt;
&lt;p&gt;You could argue that being innovative through investing in creative solutions while developing features is innovation at its best. And, that argument is a good one. However, you’ll likely find that your developers will want more. I think that’s more than OK, and it’s actually quite healthy. Being part of a team full of developers that want to be creative is a good problem to have. &lt;strong&gt;Give them a creative outlet&lt;/strong&gt;. That could be &lt;a href=&quot;https://www.facebook.com/achieverscommunity/posts/1000099270024104:0&quot;&gt;hackathons&lt;/a&gt;, 20% time, innovation sprints, or something completely different. You could try planning for innovation as part of the normal sprint planning process, for example. This has the benefit of continuing feature and experimental development concurrently instead of punting things down the road.&lt;/p&gt;

&lt;p&gt;Use appropriate tools to facilitate the creative process. We use Slack quite heavily, as it’s a great way to carry on constant communication about new ideas. And, as I mentioned above, no process should be set in stone. It’s a big plus to have the freedom to innovate on your development processes as well.&lt;/p&gt;

&lt;h3 id=&quot;say-thank-you&quot;&gt;Say Thank You&lt;/h3&gt;
&lt;p&gt;Most importantly, say &lt;strong&gt;&lt;em&gt;thank you&lt;/em&gt;&lt;/strong&gt;. Say, &lt;em&gt;great work&lt;/em&gt;. Say, &lt;em&gt;you’re awesome&lt;/em&gt;. Say it and &lt;em&gt;mean it&lt;/em&gt;. Simple.&lt;/p&gt;

&lt;h2 id=&quot;happiness-is-the-best-perk&quot;&gt;Happiness Is The Best Perk&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/blog/images/woman-591576_1280.jpg&quot; alt=&quot;happy woman&quot; /&gt;&lt;/p&gt;

&lt;p&gt;While not an exhaustive list, the above ideas will go a long way to building a culture where developers can not only provide value in many different ways, but &lt;em&gt;feel&lt;/em&gt; they’re providing value as well. Happy teams are teams that can understand why their contributions have an impact. When they can contribute to the entire development process all the way from ideation to delivery, they’ll develop a heightened sense of product ownership, and therefore feel a strong desire to improve things.&lt;/p&gt;

&lt;p&gt;Cultivating good habits in an organization comes much easier when you have the right people on board. Speaking from my own experience, particularly at Achievers, I’m grateful to have been surrounded by great people. Working in an environment with &lt;a href=&quot;https://twitter.com/achieverstech&quot;&gt;this kind of culture&lt;/a&gt; has been very inspiring. Work towards living the behaviours I’ve recommended in your teams, and you’ll be well on your way to a development culture that goes well beyond cool perks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;(Originally &lt;a href=&quot;https://medium.com/@nloko/the-perks-in-a-great-development-culture-e4dd110a9083#.hwr8pngen&quot;&gt;posted&lt;/a&gt; on Medium.com)&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
</description>
        <pubDate>Sun, 26 Jun 2016 11:25:24 -0400</pubDate>
        <link>http://www.nloko.ca/blog/2016/06/the-best-perk-is-a-great-development-culture</link>
        <guid isPermaLink="true">http://www.nloko.ca/blog/2016/06/the-best-perk-is-a-great-development-culture</guid>
      </item>
    
      <item>
        <title>These Thumbs Aren't Made For Scrolling</title>
        <description>&lt;p&gt;Collapsible interfaces are great. &lt;a href=&quot;http://getbootstrap.com/javascript/#collapse&quot;&gt;Bootstrap’s Collapse&lt;/a&gt; element comes to mind. As does &lt;a href=&quot;http://en.m.wikipedia.org/wiki/Mobile_phone&quot;&gt;Wikipedia’s collapsible sections&lt;/a&gt; you get when viewing from a Mobile. They make it simple to compact a lot of information into a small space. They allow you to easily jump around a document giving you the choice of expanding one section at a time so less scrolling is required. But, what happens when you want to make things compact again? What if you’ve expanded something, scrolled through it, and now want to move on to another section? You have to either scroll all the way back to the top or bottom of the section, depending on which direction you want to go. This can really make for some tired thumbs on a mobile device.&lt;/p&gt;

&lt;p&gt;Sure, we could implement one of those &lt;a href=&quot;http://davidwalsh.name/demo/top-of-page-jquery.php&quot;&gt;trendy scroll-to-top&lt;/a&gt; arrows. That at least let’s you work your way up. But, what about the other direction? I think we can do better.&lt;/p&gt;

&lt;p&gt;Below, on the left, you’ll find the usual collapsing section user experience you know and love. On the right, you’ll find the same interface with a subtle improvement.&lt;/p&gt;

&lt;div class=&quot;clearfix&quot;&gt;
  &lt;div class=&quot;sm-col sm-col-6&quot;&gt;
  &lt;h5&gt;Without Improvement&lt;/h5&gt;
  &lt;div style=&quot;overflow:auto;-webkit-overflow-scrolling:touch&quot;&gt;
  &lt;iframe style=&quot;border: 1px solid #ddd;border-radius: 4px;margin: 10px;&quot; height=&quot;480&quot; width=&quot;320&quot; src=&quot;/blog/collapse_demo_before.html&quot; seamless=&quot;&quot;&gt;
  &lt;p&gt;Your browser sucks.&lt;/p&gt;
  &lt;/iframe&gt;
  &lt;/div&gt;
  &lt;/div&gt;
  &lt;div class=&quot;sm-col sm-col-6&quot;&gt;
    &lt;h5&gt;With Improvement (ironically, this may not behave correctly on mobile due to being an iframe)&lt;/h5&gt;
    &lt;div style=&quot;overflow:auto;-webkit-overflow-scrolling:touch&quot;&gt;
    &lt;iframe style=&quot;border: 1px solid #ddd;border-radius: 4px;margin: 10px;&quot; height=&quot;480&quot; width=&quot;320&quot; src=&quot;/blog/collapse_demo_after.html&quot; seamless=&quot;&quot;&gt;
    &lt;p&gt;Your browser sucks.&lt;/p&gt;
    &lt;/iframe&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;You’ll notice that the one of the right let’s you collapse the section you’re browsing even after you’ve zoomed past its title. This lets you move up and down without the thumb workout. The title also shinks a bit to give you that little bit of extra real estate. Pretty nifty, eh?&lt;/p&gt;
</description>
        <pubDate>Sun, 11 Jan 2015 17:01:24 -0500</pubDate>
        <link>http://www.nloko.ca/blog/2015/01/these-thumbs-arent-made-for-scrolling</link>
        <guid isPermaLink="true">http://www.nloko.ca/blog/2015/01/these-thumbs-arent-made-for-scrolling</guid>
      </item>
    
      <item>
        <title>App Sale!</title>
        <description>&lt;p&gt;It’s a post-Christmas, post-Boxing Day (for my fellow Canadians), late to the party, app sale!&lt;/p&gt;

&lt;div class=&quot;clearfix&quot;&gt;
&lt;img src=&quot;/blog/images/gnexus.png&quot; alt=&quot;Ticklebug for Android&quot; width=&quot;30%&quot; style=&quot;float: left;margin:0 20px;&quot; /&gt;
&lt;p&gt;
&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.nloko.android.ticklebug.pro&quot;&gt;Ticklebug Pro&lt;/a&gt; is on sale for 50% off. Get it now for only $1.49! Ticklebug is a super smart and simple Android app that lets you remote control your Windows and Mac computers from the comfort of your mobile device.
&lt;/p&gt;
&lt;/div&gt;

&lt;div class=&quot;mt4 clearfix&quot;&gt;
&lt;iframe width=&quot;70%&quot; height=&quot;300&quot; src=&quot;https://www.youtube.com/embed/0UfeGpUOKe0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; style=&quot;float: right;&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;
Pictures are better than words, and videos are better than pictures. So, take a look and &lt;a href=&quot;http://www.nloko.ca/ticklebug&quot;&gt;see what Ticklebug can do&lt;/a&gt;.
&lt;/p&gt;
&lt;/div&gt;
</description>
        <pubDate>Tue, 14 Jan 2014 20:46:00 -0500</pubDate>
        <link>http://www.nloko.ca/blog/2014/01/app-sale</link>
        <guid isPermaLink="true">http://www.nloko.ca/blog/2014/01/app-sale</guid>
      </item>
    
      <item>
        <title>Hue: Your Color Expert</title>
        <description>&lt;p&gt;Inspired by the flurry of &lt;a href=&quot;https://news.ycombinator.com/item?id=6985700&quot;&gt;I built x apps this year&lt;/a&gt; posts over the holidays, I decided I would make &lt;strong&gt;1&lt;/strong&gt; app in &lt;strong&gt;1&lt;/strong&gt; weekend. I took an idea and ran with it. Pushing myself to get it done in 2 days forced me to keep it focused and cut out unnecessay things.&lt;/p&gt;

&lt;p&gt;I’d like you introduce you to the result of my weekend hackathon, &lt;a href=&quot;https://play.google.com/store/apps/details?id=ca.nloko.hue&quot;&gt;&lt;strong&gt;Hue&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p class=&quot;center&quot;&gt;&lt;img src=&quot;/blog/images/hue_feature.png&quot; alt=&quot;Hue Your Color Expert. Browse endless colors. Create beautiful schemes and palettes&quot; title=&quot;Hue: Your Color Expert&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img width=&quot;200&quot; src=&quot;/blog/images/hue_colors.png&quot; style=&quot;margin:10px;float:left;&quot; /&gt;&lt;strong&gt;Hue&lt;/strong&gt; is an Android app based on a simple premise: it should be easy to browse a large variety of colors and view a large variety of colors that are very likely to go well with a certain color.&lt;/p&gt;

&lt;p class=&quot;clearfix&quot;&gt;&lt;strong&gt;Hue&lt;/strong&gt; gives you you get an endless stream of colors to choose from. Want more colors? just keep scrolling.&lt;/p&gt;

&lt;p&gt;&lt;img width=&quot;200&quot; src=&quot;/blog/images/hue_schemes.png&quot; style=&quot;margin:10px;float:right;&quot; /&gt;&lt;/p&gt;

&lt;p class=&quot;mt4&quot;&gt;Tapping a color presents you with a another stream of different color schemes created algorithmically based on rules of color theory.&lt;/p&gt;

&lt;p&gt;Viewing schemes also lets you tap colors to learn about their &lt;a href=&quot;http://en.wikipedia.org/wiki/Web_colors&quot;&gt;HEX code&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/RGB_color_model&quot;&gt;RGB&lt;/a&gt; &amp;amp; &lt;a href=&quot;http://en.wikipedia.org/wiki/HSL_and_HSV&quot;&gt;HSV&lt;/a&gt; values, and even sample tints, shades, and complement colors.&lt;/p&gt;

&lt;p class=&quot;clearfix&quot;&gt;Beauty is in the eye of the beholder. Thus, &lt;strong&gt;Hue&lt;/strong&gt; tries to present you with a wide selection of schemes combining tints, shades, complements, analogous, and neutral colors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hue&lt;/strong&gt; does a great job. Regardless, nobody is perfect. So, there’s a solution for this problem too. Tapping the &lt;em&gt;Share&lt;/em&gt; button at the bottom of the &lt;em&gt;schemes&lt;/em&gt; view lets you export an HTML page containing all the schemes created for your chosen color. If you’re a designer, developer, or just a tech savvy kind of person, this is great because you can &lt;a href=&quot;https://developers.google.com/chrome-developer-tools/&quot;&gt;use your browser&lt;/a&gt; to further tweak and experiment with colors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hue&lt;/strong&gt; is great for brainstorming color schemes whether you’re painting, redecorating, designing a website, or even planning your wardrobe. It’s available in the Google Play store for &lt;a href=&quot;https://play.google.com/store/apps/details?id=ca.nloko.hue&quot;&gt;only $0.99&lt;/a&gt;.&lt;/p&gt;
</description>
        <pubDate>Wed, 08 Jan 2014 23:13:00 -0500</pubDate>
        <link>http://www.nloko.ca/blog/2014/01/hue-your-color-expert</link>
        <guid isPermaLink="true">http://www.nloko.ca/blog/2014/01/hue-your-color-expert</guid>
      </item>
    
      <item>
        <title>In Private</title>
        <description>&lt;p&gt;This &lt;a href=&quot;https://www.nloko.ca/blog&quot;&gt;blog&lt;/a&gt; and the entire &lt;a href=&quot;https://www.nloko.ca&quot;&gt;site&lt;/a&gt; are now 
only accessible using &lt;a href=&quot;http://en.wikipedia.org/wiki/HTTP_Secure&quot;&gt;HTTPS&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;why&quot;&gt;Why&lt;/h2&gt;
&lt;p&gt;The reasons why I did this are fairly simple:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;I read &lt;a href=&quot;https://www.tbray.org/ongoing/When/201x/2012/12/02/HTTPS&quot;&gt;this&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;And, I completely, 100% agree.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;how&quot;&gt;How&lt;/h2&gt;
&lt;p&gt;I got my SSL certificate from &lt;a href=&quot;http://www.startssl.com/&quot;&gt;StartSSL&lt;/a&gt; for free. They verified that
my site is really run by me in a matter of minutes. I moved my site from &lt;a href=&quot;https://www.nearlyfreespeech.net/&quot;&gt;NearlyFreeSpeech&lt;/a&gt; (nothing against them, as they were nothing but fantastic during the many years my blog was hosted there) to my VPS.
This gave me full control over things and allowed me to configure Apache to use SSL.&lt;/p&gt;

&lt;p&gt;If you try to go to http://www.nloko.ca or http://nloko.ca or http://www.nloko.ca/anywhere you will be redirected to the same URL with
the scheme changed from HTTP to HTTPS.&lt;/p&gt;

&lt;h2 id=&quot;privacy-by-default&quot;&gt;Privacy by Default&lt;/h2&gt;
&lt;p&gt;This has nothing to do with secrecy. It’s about your right to browse content on the Internet in private without anyone else listening in.
If you host a website, I urge you to consider making it private by default.&lt;/p&gt;
</description>
        <pubDate>Mon, 14 Oct 2013 21:45:00 -0400</pubDate>
        <link>http://www.nloko.ca/blog/2013/10/in-private</link>
        <guid isPermaLink="true">http://www.nloko.ca/blog/2013/10/in-private</guid>
      </item>
    
      <item>
        <title>Ticklebug</title>
        <description>&lt;p&gt;I created &lt;a href=&quot;http://ticklebugapp.ca&quot;&gt;Ticklebug&lt;/a&gt; to solve a problem for myself, and I’ve decided to &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.nloko.android.ticklebug&quot;&gt;share it&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Ticklebug was born as result of &lt;a href=&quot;http://lifehacker.com/5667680/ditching-cable-for-the-web-how-much-can-you-save-buying-renting-or-streaming-tv&quot;&gt;saying goodbye to cable subscription fees&lt;/a&gt; in our home.
Bye, bye fees. Bye, bye cablebox. And, Hello, &lt;a href=&quot;http://en.wikipedia.org/wiki/Home_theater_PC&quot;&gt;HTPC&lt;/a&gt;!&lt;/p&gt;

&lt;h2 id=&quot;the-need&quot;&gt;The Need&lt;/h2&gt;

&lt;p&gt;Obviously, I wasn’t going to be walking up to the television set to fiddle around with a keyboard and
mouse everytime I wanted to watch something. That would be way too much exercise for something that’s
really supposed to involve as little exercise as possible. Initially, my solution for this problem was
one of those &lt;a href=&quot;http://www.amazon.com/Multimedia-Keyboard-Trackball-Wireless-GKM561R/dp/B002H0BOBA&quot;&gt;wireless keyboards with an integrated trackball&lt;/a&gt;.
Don’t get me wrong, the combination is pretty awesome. After awhile, though, I noticed that I was playing with
my phone a lot of the time while watching TV. So, I thought it’d be great if I could use my phone as a remote
control!&lt;/p&gt;

&lt;p&gt;I began searching for and trying various Android apps for remote controlling my HTPC. However, I wasn’t
completely happy with any of them. In my ideal remote control app, I wanted the following features:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;A maximum surface, blank canvas that acts like a &lt;strong&gt;touchpad&lt;/strong&gt;, very similar to how laptop touchpads behave.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Mac and Windows&lt;/strong&gt; support, as I use both regularly.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Voice commands&lt;/strong&gt; so I can tell my computer what I want it to do.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Zoom!&lt;/strong&gt; Because, as great as high-def is, sometimes things are just hard to read.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;features&quot;&gt;Features&lt;/h2&gt;

&lt;p&gt;Ticklebug has a &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.nloko.android.ticklebug&quot;&gt;long list of features&lt;/a&gt;,
so I won’t go over everything. What I will do, though, is I’ll go over the above list and tell you a little about how Ticklebug handles each.&lt;/p&gt;

&lt;h3 id=&quot;touchpad&quot;&gt;Touchpad&lt;/h3&gt;

&lt;p&gt;Ticklebug maximizes your mobile device’s screen space keeping it uncluttered at all times. There are a very 
limited number of buttons. To interact, touches, drags, and taps are used liberally. To make Ticklebug super easy to use, the gestures are very familiar:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Drag a finger to move the mouse pointer&lt;/li&gt;
  &lt;li&gt;Drag two fingers to scroll within windows&lt;/li&gt;
  &lt;li&gt;Long-press a finger and drag to move or resize windows&lt;/li&gt;
  &lt;li&gt;Single-tap to left click and double-finger-tap to right click&lt;/li&gt;
  &lt;li&gt;Swipe left or right to navigate back or forward, respectively, when web browsing&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;cross-platform&quot;&gt;Cross-platform&lt;/h3&gt;

&lt;p&gt;I use a Macbook most of the time. But, my HTPC runs Windows 8. I’m a faithful subscriber to &lt;a href=&quot;http://www.netflix.com&quot;&gt;Netflix&lt;/a&gt;,
and running Windows just makes using the service much &lt;a href=&quot;http://www.jeremymorgan.com/tutorials/linux/how-to-netflix-ubuntu-linux/&quot;&gt;easier than using another operating system&lt;/a&gt;.
Thus, I needed Ticklebug to be cross-platform to get the most out of it. As a result, there are &lt;a href=&quot;http://ticklebugapp.ca/downloads&quot;&gt;desktop applications&lt;/a&gt; for both Mac and Windows.&lt;/p&gt;

&lt;h3 id=&quot;voice-commands&quot;&gt;Voice Commands&lt;/h3&gt;

&lt;p&gt;What’s cooler than speaking instructions to your computer? Nothing! So, I gave Ticklebug the smarts to understand a few commands:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Say &lt;em&gt;Google&lt;/em&gt; followed by some search words and your default browser will load with the search terms ready
to go in Google’s search bar.&lt;/li&gt;
  &lt;li&gt;Say &lt;em&gt;Open&lt;/em&gt; followed by some site name and your default browser will load it. For example, say &lt;em&gt;open youtube dot com&lt;/em&gt;,
and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http://youtube.com&lt;/code&gt; wlll load.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And, in the &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.nloko.android.ticklebug.pro&quot;&gt;paid version of Ticklebug&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Say &lt;em&gt;Start&lt;/em&gt; followed by the name of some executable file, and your computer will run it. For example, say &lt;em&gt;start notepad&lt;/em&gt;,
and Notepad will start.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What’s great about the last command is that you can create your own voice commands to do just about anything! For example, on Windows 8,
&lt;a href=&quot;http://www.netflix.com&quot;&gt;Netflix&lt;/a&gt; has some &lt;a href=&quot;http://www.itsjustwhatever.com/2012/10/28/launch-windows-8-metro-apps-from-a-desktop-shortcut-or-command-line&quot;&gt;weird, wild, hidden file name&lt;/a&gt; making it difficult to launch using a voice command.
However, the application will run if you type &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;netflix://&lt;/code&gt; into a browser. We can use this piece of information to create a custom voice command.&lt;/p&gt;

&lt;p&gt;On my computer, I’ve created a &lt;a href=&quot;http://en.wikipedia.org/wiki/Batch_file&quot;&gt;script&lt;/a&gt; named &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;netflix.bat&lt;/code&gt; and saved it in a directory
that’s specified in my &lt;a href=&quot;http://en.wikipedia.org/wiki/PATH_%28variable%29&quot;&gt;PATH environment variable&lt;/a&gt;. The contents look like the following:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;:: Launch Netflix app on Windows 8
cmd /c &quot;start netflix://&quot;
exit 0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now, I can say &lt;em&gt;start Netflix&lt;/em&gt; to launch the app without typing a thing!&lt;/p&gt;

&lt;h3 id=&quot;pinch-to-zoom&quot;&gt;Pinch-to-zoom&lt;/h3&gt;

&lt;p&gt;Again, using Netflix as the example, those little video thunbnails in the Windows 8 app are pretty hard to read most of the time. I really
wanted to be able to zoom in the way you can when using your phone’s web browser. So, in Ticklebug, you can move two
fingers apart to zoom in and move two fingers together to zoom out. And, this gesture can be used within any application, including
the desktop.&lt;/p&gt;

&lt;h2 id=&quot;in-stores-now&quot;&gt;In Stores Now!&lt;/h2&gt;

&lt;p class=&quot;center&quot;&gt;&lt;img src=&quot;/blog/images/gnexus.png&quot; alt=&quot;Ticklebug for Android&quot; width=&quot;400&quot; /&gt;&lt;/p&gt;

&lt;p&gt;If you have an Android device running Android 4.0 or higher, &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.nloko.android.ticklebug&quot;&gt;give Ticklebug a try!&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Mon, 22 Apr 2013 22:57:00 -0400</pubDate>
        <link>http://www.nloko.ca/blog/2013/04/ticklebug-an-android-based-pc-remote</link>
        <guid isPermaLink="true">http://www.nloko.ca/blog/2013/04/ticklebug-an-android-based-pc-remote</guid>
      </item>
    
      <item>
        <title>No Comment</title>
        <description>&lt;p&gt;I was always taught in school to liberally apply comments to my code. For a long time, I
considering this practice a good one. I no longer do, however.&lt;/p&gt;

&lt;p&gt;Before you write me off as a lame-o programmer, to illustrate why I feel this way, let’s walkthrough 
some examples using an old favourite algorithm: merge sort. For the sake of this exercise, though, let’s assume
that merge sort is not a widely known algorithm, so we don’t fall into the &lt;em&gt;it’s merge sort, duh!&lt;/em&gt;
trap.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;mergesort&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;m&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;l&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;r&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:]&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;merge&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mergesort&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mergesort&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;merge&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;li&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;ri&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;m&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;li&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ri&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ri&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]:&lt;/span&gt;
			&lt;span class=&quot;n&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
			&lt;span class=&quot;n&quot;&gt;li&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
			&lt;span class=&quot;n&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ri&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
			&lt;span class=&quot;n&quot;&gt;ri&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;li&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:])&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ri&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:])&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;m&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Here we have a completely correct sorting algorithm coded in one of my favourite languages, &lt;a href=&quot;http://www.python.org/&quot;&gt;Python&lt;/a&gt;. 
In my opinion, though, correct code is not quite good enough. This code could be improved in some ways. 
Let’s assume that liberally adding comments is one of these ways.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;mergesort&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
	&lt;span class=&quot;s&quot;&gt;&quot;&quot;&quot;Returns a sorted list.
	&quot;&quot;&quot;&lt;/span&gt;
	&lt;span class=&quot;c1&quot;&gt;# Base case for recursive algorithm is when
&lt;/span&gt;	&lt;span class=&quot;c1&quot;&gt;# there is 1 or less elements. In either case, we call 
&lt;/span&gt;	&lt;span class=&quot;c1&quot;&gt;# the list sorted.
&lt;/span&gt;	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;
	&lt;span class=&quot;c1&quot;&gt;# Find the middle of the list
&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;m&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;
	&lt;span class=&quot;c1&quot;&gt;# Split the list into halves
&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;l&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;r&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:]&lt;/span&gt;
	&lt;span class=&quot;c1&quot;&gt;# Merge the two sorted halves 
&lt;/span&gt;	&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;merge&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mergesort&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mergesort&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;merge&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
	&lt;span class=&quot;s&quot;&gt;&quot;&quot;&quot;Returns a merged sorted list.
	&quot;&quot;&quot;&lt;/span&gt;
	&lt;span class=&quot;c1&quot;&gt;# Track the positions of the lists starting at index 0
&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;li&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;ri&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;
	&lt;span class=&quot;c1&quot;&gt;# Initialize an empty list to store the final sorted list
&lt;/span&gt;	&lt;span class=&quot;n&quot;&gt;m&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;
	&lt;span class=&quot;c1&quot;&gt;# Loop while both halves still have unprocessed elements
&lt;/span&gt;	&lt;span class=&quot;k&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;li&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ri&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
		&lt;span class=&quot;c1&quot;&gt;# When the left list element is less than the right
&lt;/span&gt;		&lt;span class=&quot;c1&quot;&gt;# list element, we add it to the final sorted list
&lt;/span&gt;		&lt;span class=&quot;c1&quot;&gt;# and increment the position for the left side. Otherwise
&lt;/span&gt;		&lt;span class=&quot;c1&quot;&gt;# we do it for the right side
&lt;/span&gt;		&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ri&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]:&lt;/span&gt;
			&lt;span class=&quot;n&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
			&lt;span class=&quot;n&quot;&gt;li&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
			&lt;span class=&quot;n&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ri&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
			&lt;span class=&quot;n&quot;&gt;ri&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;
	&lt;span class=&quot;c1&quot;&gt;# Since one list has been completely processed, we extend
&lt;/span&gt;	&lt;span class=&quot;c1&quot;&gt;# the final sorted list with the sorted elements remaining in
&lt;/span&gt;	&lt;span class=&quot;c1&quot;&gt;# the other list
&lt;/span&gt;	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;li&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:])&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ri&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:])&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;m&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;My once &lt;em&gt;Intro to Algorithms&lt;/em&gt; professor would really like this version. But, you, however, &lt;em&gt;shouldn’t&lt;/em&gt; like this.
Let me explain.&lt;/p&gt;

&lt;p&gt;Since I’m assuming that merge sort is an unknown algorithm, in an effort to improve readability, I’ve 
added &lt;em&gt;lots&lt;/em&gt; of prologue comments. They basically reiterate &lt;em&gt;what the code is doing.&lt;/em&gt; To me, these types of comments
add too much clutter and may over-complicate something that wasn’t all that complicated to begin with (like in
this case). For a college professor receiving something like this from a student as an assignment, these comments
could be useful, as they could give insight into whether or not a student understands what the code is doing. 
However, in a work setting, it should be a fair assumption that your colleagues can &lt;strong&gt;read the code to figure out 
what the code is doing&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It could be argued, though, that without the prologue comments, the readability is suffering because the variable 
names don’t convey enough about the code. That’s a valid point. So, let’s try something different.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;mergesort&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;unsorted&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
	&lt;span class=&quot;s&quot;&gt;&quot;&quot;&quot;Returns a sorted list. 

	The passed list is recursively halved 
	into sublists until each sublist has one or less elements. Then, 
	the sublists are merged together such that their elements are in order.

	Worst case time complexity is O(n log n).
	Worst case space complexity is O(n).
	&quot;&quot;&quot;&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;unsorted&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;unsorted&lt;/span&gt;
	
	&lt;span class=&quot;n&quot;&gt;middle&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;unsorted&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;left_half&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;unsorted&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;middle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;right_half&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;unsorted&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;middle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:]&lt;/span&gt;
	
	&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;merge&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mergesort&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;left_half&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mergesort&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;right_half&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;merge&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;left&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;right&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
	&lt;span class=&quot;s&quot;&gt;&quot;&quot;&quot;Returns a sorted list as a result of merging 
	two sorted lists.
	&quot;&quot;&quot;&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;left_index&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;right_index&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;merged&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;
	
	&lt;span class=&quot;k&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;left_index&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;left&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;right_index&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;right&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;left&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;left_index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;right&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;right_index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]:&lt;/span&gt;
			&lt;span class=&quot;n&quot;&gt;merged&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;left&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;left_index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
			&lt;span class=&quot;n&quot;&gt;left_index&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
			&lt;span class=&quot;n&quot;&gt;merged&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;right&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;right_index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
			&lt;span class=&quot;n&quot;&gt;right_index&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;
	
	&lt;span class=&quot;n&quot;&gt;left_remaining&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;left_index&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;left&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;left_remaining&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;merged&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;left&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;left_index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:])&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;merged&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;right&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;right_index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:])&lt;/span&gt;
	
	&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;merged&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This version follows the &lt;strong&gt;no comment is the best comment&lt;/strong&gt; approach. The variable names
have been modified (and according to &lt;a href=&quot;http://www.python.org/dev/peps/pep-0008/&quot;&gt;Python style guidelines&lt;/a&gt;)
to convey their purpose making the code self-documenting and rendering all the prologue comments unnecessary.
&lt;strong&gt;The code itself effectively describes &lt;em&gt;what the code is doing&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The function headers have been improved such that callers can discover what the functions do without reading
a single line of code. This is especially important for public interfaces and let’s us use tools like &lt;a href=&quot;http://docs.python.org/2/library/pydoc.html&quot;&gt;pydoc&lt;/a&gt; to easily share code documentation.&lt;/p&gt;

&lt;p&gt;You may be wondering, &lt;em&gt;what’s the big deal? Let’s just refactor and keep the comments too so we can have the 
best of both worlds!&lt;/em&gt;
The problem is that adding unnecessary comments creates another set of things to maintain. It’s even worse when
the code changes and the comments are orphaned. Suppose a colleague comes along and changes the code again based
on comments that incorrectly describe code that no longer exists. Now, things are really a mess. Then, 
your colleague goes on vacation and a bug surfaces related to all these changes and you’re stuck &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git bisect&lt;/code&gt;‘ing 
your way through it all to figure out where things went wrong! So, I’ll state this again very explicity: liberal
code commenting is wasted effort; make your code more self-documenting because &lt;strong&gt;no comment is the 
best comment&lt;/strong&gt;.&lt;/p&gt;
</description>
        <pubDate>Sat, 30 Mar 2013 14:36:00 -0400</pubDate>
        <link>http://www.nloko.ca/blog/2013/03/no-comment</link>
        <guid isPermaLink="true">http://www.nloko.ca/blog/2013/03/no-comment</guid>
      </item>
    
      <item>
        <title>Moxy</title>
        <description>&lt;p&gt;She’s alive. And, her name is Moxy.&lt;/p&gt;

&lt;p&gt;Simply put, Moxy is an &lt;a href=&quot;http://en.wikipedia.org/wiki/Proxy_server&quot;&gt;HTTP proxy&lt;/a&gt; that acts like a regular HTTP proxy, but it also allows you to mock responses, including support for delays and conditional statements.&lt;/p&gt;

&lt;p&gt;Why is this useful? Consider the following use case…&lt;/p&gt;

&lt;p&gt;You’re working on a team of two. You’re responsible for the client code and the other handles the server side. Let’s call the other, Backend Billy. Backend Billy is great most of time. However, lately, he’s been a little &lt;a href=&quot;https://www.facebook.com/&quot;&gt;distracted&lt;/a&gt;, affecting his ability to deliver on the &lt;a href=&quot;http://en.wikipedia.org/wiki/Representational_state_transfer&quot;&gt;RESTful API&lt;/a&gt; that you need to get on with your client side work. Of course, being a good team, you spec out the API beforehand and have an interface to work against. You’ve got a bunch of code written up, but you can’t test real, live network requests because the API service doesn’t exist yet. Moxy can help here.&lt;/p&gt;

&lt;p&gt;Let’s say you’ve spec’d out three endpoints…&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http://api.awesomeapp.com/v1/awesome&lt;/code&gt;
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http://api.awesomeapp.com/v1/awesome/add&lt;/code&gt;
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http://api.awesomeapp.com/v1/awesome/:id&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Using Moxy, you can add the following configuration entries into &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;moxy.conf&lt;/code&gt;…&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;url http://api.awesomeapp.com/v1/awesome/?$
  get 200 awesome.json

url http://api.awesomeapp.com/v1/awesome/add
  get 400 awesome_add_error.json
  post 200 awesome_add.json

url http://api.awesomeapp.com/v1/awesome/?\?id\=.+
  get 400 awesome_id_error.json
  if created: get 200 awesome_id.json
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now, with Moxy up and running and your system configured to use her as an HTTP proxy, you can happily test your client code as if the backend is fully implemented, even though Backend Billy is still dilly dallying.&lt;/p&gt;

&lt;p&gt;Notice the line that reads &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;if created: get 200 awesome_thing.html&lt;/code&gt;. It’s a conditional statement with a condition called &lt;em&gt;created&lt;/em&gt;. This allows the success response to be delayed until necessary. You can see and manipulate all conditions by browsing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http://localhost:9889/config/conditions&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Additionally, let’s say you’ve added some nifty error handling logic when the &lt;em&gt;add&lt;/em&gt; request takes longer than 10 seconds. To test, you can modify &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;moxy.conf&lt;/code&gt; as follows…&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;url http://api.awesomeapp.com/v1/awesome/add
  if delay: delay 13000
  get 400 awesome_add_error.json
  post 200 awesome_add.json
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This tells Moxy to delay the response for 13 seconds if the &lt;em&gt;delay&lt;/em&gt; condition evaluates to true.&lt;/p&gt;

&lt;p&gt;And, if none of that interests you and you just want Billy to get back to work, you could sneak on to his computer and configure Moxy with something like…&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;url ^.+\.facebook\.com
  get 301
  header Location http://awesomeapp.com/api/documentation
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Moxy is written in &lt;a href=&quot;http://www.python.org/&quot;&gt;Python&lt;/a&gt;, open source, and available on &lt;a href=&quot;https://github.com/nloko/moxy&quot;&gt;Github&lt;/a&gt;.&lt;/p&gt;
</description>
        <pubDate>Mon, 11 Feb 2013 21:23:02 -0500</pubDate>
        <link>http://www.nloko.ca/blog/2013/02/moxy</link>
        <guid isPermaLink="true">http://www.nloko.ca/blog/2013/02/moxy</guid>
      </item>
    
      <item>
        <title>SyncMyPix 0.2</title>
        <description>&lt;p&gt;Remember &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.nloko.android.syncmypix&amp;amp;hl=en&quot;&gt;SyncMyPix&lt;/a&gt;?!?&lt;/p&gt;

&lt;p&gt;I do…vaguely. I’ve been putting off integrating some fine work from contributors, and I figured that &lt;strong&gt;it’s been long enough!&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I’ve finally gotten around to merging in their work creating version &lt;strong&gt;0.2&lt;/strong&gt;. Here’s a quick summary of what’s gone into this release:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Update contributors in &lt;a href=&quot;https://github.com/nloko/SyncMyPix/blob/master/README.md&quot;&gt;README&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Remove read log permission&lt;/li&gt;
  &lt;li&gt;Default to high quality photo setting and remove setting&lt;/li&gt;
  &lt;li&gt;Fix problem with photos not getting cached to SD card&lt;/li&gt;
  &lt;li&gt;Improve Greek name matching (&lt;a href=&quot;https://github.com/nloko/SyncMyPix/commit/3dc398db80e7aea938c9c604f6f7af5a14c577f7&quot;&gt;thanks Diomidis Spinellis&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Fix name matching when names contain Turkish characters (&lt;a href=&quot;https://github.com/nloko/SyncMyPix/commit/4c8a0084c6388da52ccbcd71216a12b15e1a30c5&quot;&gt;thanks Deadknight&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;ICS fixes (crop view, etc.)&lt;/li&gt;
  &lt;li&gt;Use Facebook Connect SDK instead of homegrown API library&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&lt;em&gt;Attempt&lt;/em&gt;&lt;/strong&gt; to get highest resolution photos possible from Facebook&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those last 3 are also &lt;a href=&quot;https://github.com/nloko/SyncMyPix/commit/151a96098b43f2e19216ceb6d88ea2e407a383b0&quot;&gt;thanks to Deadknight&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Unfortunately, I haven’t had any time to work on SyncMyPix, hence the delay with getting out a release with all these improvements. I’ve been quite busy with work and other projects. So busy, in fact, that I’m calling this my last release of SyncMyPix. I haven’t tested this enough to feel comfortable releasing it through the market (&lt;em&gt;I actually did publish it, but later removed it&lt;/em&gt;). But, I didn’t want that to stop me from sharing this, so the &lt;a href=&quot;https://github.com/nloko/SyncMyPix/downloads&quot;&gt;downloads&lt;/a&gt; are available from Github. I’m going to be &lt;strong&gt;removing SyncMyPix from the store a week from today&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I’m glad it’s been useful to a lot of people, but I’ve got to move on to other things. I’ll continue to host the source code on &lt;a href=&quot;https://github.com/nloko/SyncMyPix&quot;&gt;Github&lt;/a&gt;, as I’d love to see someone take the app and improve on it, as it seems there are still people that are interested. So, please, feel free to &lt;a href=&quot;https://github.com/nloko/SyncMyPix/fork&quot;&gt;fork&lt;/a&gt; it and make it your own!&lt;/p&gt;
</description>
        <pubDate>Sat, 20 Oct 2012 04:01:37 -0400</pubDate>
        <link>http://www.nloko.ca/blog/2012/10/syncmypix-0-2</link>
        <guid isPermaLink="true">http://www.nloko.ca/blog/2012/10/syncmypix-0-2</guid>
      </item>
    
  </channel>
</rss>
