tag:www.thisoneplace.com,2005:/articlesthisoneplace.com2016-09-25T13:48:08-05:00Nicholas Lindleyme@thisoneplace.comhttps://www.thisoneplace.com/2016/09/25/take-time-after-the-conferenceTake Time after the Conference2016-09-25T13:48:08-05:002016-09-25T13:48:08-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>Last week was <a href="http://www.thestrangeloop.com">Strange Loop</a>; this week was vacation. The original vacation
plan was to get some rest, but Strange Loop is a conference that leaves you
wanting to play. I wanted to play with combinators, and the easiest way to do
that was to play with Haskell, but to really appreciate Haskell I needed to play
with the lambda calculus and the Hindley–Milner type system. And this is just
from two of the talks.</p>
<p>There’s also GraphQL to explore. Is it really better than REST? Giving up URLs
feels weird, but GraphQL also addresses many frustrations. And with five tracks,
videos for the other 80% of the conference still need watched.</p>
<p>Vacation turned into a week of exploration. If you can afford to take a week
(or more!) after a conference, do it. That is your best chance to really dig
into all the new information.</p>
https://www.thisoneplace.com/2016/04/10/now-with-http-2Now with HTTP/22016-04-10T20:11:24-05:002016-04-10T20:11:24-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>Since I have moved off of CDN hosting and onto a VPS and have more control over
the tech stack, I decided to go ahead and set up <a href="https://http2.github.io">HTTP/2</a>. It only took a few
minutes including research and implementation.</p>
<p>I was already running <a href="https://www.nginx.com">NGINX</a> on <a href="https://www.debian.org">Debian</a> with <a href="https://en.wikipedia.org/wiki/Transport_Layer_Security">TLS</a> enabled. NGINX’s
stable branch currently has version 1.8, and we need 1.9, so we have to change
our <code>apt</code> sources from</p>
<div class="highlight"><pre><code class="language-text" data-lang="text"><span></span>deb http://nginx.org/packages/debian/ jessie nginx
deb-src http://nginx.org/packages/debian/ jessie nginx
</code></pre></div>
<p>to</p>
<div class="highlight"><pre><code class="language-text" data-lang="text"><span></span>deb http://nginx.org/packages/mainline/debian/ jessie nginx
deb-src http://nginx.org/packages/mainline/debian/ jessie nginx
</code></pre></div>
<p>Next we look for any TLS listeners—I’m not bothering with non-TLS since it just
redirects to the secure version—and add <code>http2</code>. Here is a truncated example
that leaves out things like certificate and file location configurations.</p>
<div class="highlight"><pre><code class="language-text" data-lang="text"><span></span>server {
listen 443 ssl http2;
server_name www.thisoneplace.com;
}
</code></pre></div>
<p>Restart the server and you’re done. (Reloading might also work, but I restarted
so I can’t say for sure.)</p>
https://www.thisoneplace.com/2015/12/19/now-with-tlsNow with TLS2015-12-19T22:22:08-06:002015-12-19T22:22:08-06:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>I’ve made a few under-the-hood changes to the site and thought you might like a quick update. The biggest change is switching to TLS. In addition to TLS, Web fonts have been removed, hosting is now done from a VPS and not a CDN, and a couple of CSS issues got cleaned up.</p>
<p>The switch to TLS was made because I kept reading that I should. Also, I’ve been thinking about playing around with <a href="http://www.w3.org/TR/service-workers/">Service Workers</a> which require HTTPS. Hopefully your RSS readers don’t get tripped up.</p>
<p>Because I wanted a custom certificate and there don’t seem to be affordable options for secure CDN hosting, I switched to a trusty VPS. Having a dedicated IP means I can be friendlier to older clients that don’t support <a href="https://en.wikipedia.org/wiki/Server_Name_Indication">SNI</a>. It’s actually quite nice running a traditional server again where things like serving up an index file for directories are handled pretty easily out of the box. It will also give me the flexibility in the future if there are dynamic bits I want to add to the site.</p>
<p>I’ve been <a href="/2015/08/09/100-words-day-93.html">thinking about removing Web fonts for a while</a>. The typography does not look as nice, but the site sure feels snappy now. The main page is around 15 kB of HTML and 5 kB of CSS, both uncompressed. With no other changes, I’ve reduced the amount of data transferred by about 95%. Really, rethink those Web fonts. While we’re at it, let’s rethink all of those images and scripts and style sheets.</p>
<p>The last thing I did was set up Codeship to deploy my site automatically. After you’ve hooked up your repository, you’ll need to copy the SSH public key under the project’s general settings into <code>~/.ssh/authorized_keys</code> for the user that will be doing the deploying. Since I’m using Jekyll, the following commands did the trick.</p>
<div class="highlight"><pre><code class="language-sh" data-lang="sh"><span></span><span class="c1"># Setup Commands</span>
bundle install
</code></pre></div><div class="highlight"><pre><code class="language-sh" data-lang="sh"><span></span><span class="c1"># Custom Deployment Script</span>
bundle <span class="nb">exec</span> jekyll build
rsync -avz -e <span class="s2">"ssh"</span> _site/ user@host:path/to/site/
</code></pre></div>
<p>Be careful with the trailing slashes in rsync—they can be tricky.</p>
<p>Finally, if you remember <a href="/2015/06/28/100-words-day-51.html">Day 51</a>, I cleaned up a couple of the quicker CSS issues noted there. Eventually the others will be cleaned up as well.</p>
https://www.thisoneplace.com/2015/09/15/okcjs-lightning-talkOKC.js Lightning Talk2015-09-15T16:11:28-05:002015-09-15T16:11:28-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>Today I gave a <a href="http://okcjs.com/2015/09/15/2015-9-15-lightning-talks-10/">“lightning talk” at OKC.js</a>, Functional Reactive Programming with Highland.js. If the video turned out OK, I’ll post a link when it’s available. For now, you can look at the <a href="https://github.com/nlindley/okcjs-september-2015-lightning-talk">slides, speaker notes, and demos on GitHub</a>.</p>
https://www.thisoneplace.com/2015/09/01/side-businessSide Business2015-09-01T21:04:08-05:002015-09-01T21:04:08-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>I have come up with my next 100 days, and you will not be getting regular updates. The next 100 will not be as easy to measure and will be more challenging from an accountability standpoint.</p>
<p>In short, I will be developing a product for a side business. Each day will be a small step closer to a viable product.</p>
<p>I’ve had an itch to start a side project ever since attending <a href="http://360idev.com">360|iDev</a>, more specifically since attending Charles Perry’s talk, <a href="http://360idev.com/sessions/300-succeeding-slowly-a-practical-guide-to-going-indie/"><cite>Succeeding Slowly: A Practical Guide to Going Indie</cite></a>. But a project isn’t something that will necessarily be viable commercially. A project is figuring out how to use OpenCL or painting a bedroom. I really want a side business.</p>
<p>The need to pursue a side business instead of a project became apparent after listening to audiobooks for two of Charles’s recommendations, <a href="http://amzn.to/1LSPFAa"><cite>Personal MBA</cite></a> and <a href="http://www.startupbook.net"><cite>Start Small, Stay Small</cite></a>.</p>
<p>The tricky part was finding a niche. While not sharing yet which niche that is, I will share one that was ruled out: music education. Actually, make that all of education.</p>
<p>Music education as a market is attractive because it’s a field I know. I know which magazines educators subscribe to, which conferences they attend, and what types of problems I could help solve.</p>
<p>The problem with music education is marketing. With most programs being publicly funded and teachers being paid based on years of experience and not profitability, the value proposition must be much higher to sell to any individual program.</p>
<p>Coming up with a product that is appealing to educators at large is even trickier. Yes, the market is larger, but it’s pretty saturated for products that would be of use across disciplines. The attention of potential customers is also diffused across more magazines, conferences, and Web sites.</p>
<p>The niche I will target is an order of magnitude (or two) smaller than education, but it’s focus is more concentrated. They have real problems I can help solve, and their time is very valuable, so they <em>should</em> be willing to pay for a product that gives back hours each week.</p>
https://www.thisoneplace.com/2015/08/16/100-words-day-100100 Words: Day 1002015-08-16T23:45:50-05:002015-08-16T23:45:50-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>Done! And ready for a break. My expectation was for this project to gradually become easier over the course of 100 days, and it did for the first couple of months. After that it started to feel like work, but I’m glad to have finished.</p>
<p>The plan is to do 100 days of something starting in September. I don’t know what it will be, and I might not announce what it is.</p>
<p>Thanks to <a href="https://adactio.com/journal/8577">Jeremy Keith for the inspriration for this project</a>, and thanks to those who provided feedback. I look forward to the break but will miss the challenge.</p>
https://www.thisoneplace.com/2015/08/15/100-words-day-99100 Words: Day 992015-08-15T18:19:20-05:002015-08-15T18:19:20-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>For the next four days I’ll do my best to get my head out of Web development and into iOS. It will be weird, and I’ll have to do my best not to talk about the Web too much while at 360|iDev.</p>
<p>But first I need to rewrite a little code for work that I forgot to commit before leaving the house. It is my first attempt to integrate <a href="http://hapijs.com/">Hapi</a> with <a href="http://highlandjs.org">Highland</a>, and I would cautiously call it a success. The libraries we use are a mix of streams, promises, and callbacks, and now everything is just a stream.</p>
https://www.thisoneplace.com/2015/08/14/100-words-day-98100 Words: Day 982015-08-14T18:52:35-05:002015-08-14T18:52:35-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>This is mostly a teaser for what will be coming in a week or two, but I have found a JavaScript library that I adore. As you know, <a href="http://www.thisoneplace.com/2015/07/21/100-words-day-74.html">I’ve never been in love with promises</a>, I <a href="http://www.thisoneplace.com/2015/06/23/100-words-day-46.html">like streams</a>, and I’d like to be able to combine the two with a more functional flavor.</p>
<p>This is where <a href="http://highlandjs.org/">Highland.js</a> comes in. You can throw just about anything at it—arrays, generators, streams, promises, iterators, iterables—and it will convert it to a mappable stream. Now we have one interface to deal with synchronous and asynchronous code alike in a more composable manner.</p>
https://www.thisoneplace.com/2015/08/13/100-words-day-97100 Words: Day 972015-08-13T20:19:52-05:002015-08-13T20:19:52-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>Reading through <a href="http://alistapart.com/article/language-of-modular-design"><cite>The Language of Modular Design</cite></a>, there’s really not much to disagree with. Spending time as a team to develop a design language is useful and, if nothing else, helps remove ambiguity.</p>
<p>But whenever I read articles like this, my fear is teams will invent entirely new vocabularies when there are existing ones that are more interoperable. Don’t create a class when an element or well-defined attribute will do. Look at <a href="http://schema.org">schema.org</a> or <a href="http://microformats.org">microformats</a>. Once you’ve exhausted your options, then add <em>a</em> well-considered class and put it at the highest level of your component that makes sense.</p>
https://www.thisoneplace.com/2015/08/12/100-words-day-96100 Words: Day 962015-08-12T21:29:36-05:002015-08-12T21:29:36-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>I agree with Marco Arment’s recent post, <a href="http://www.marco.org/2015/08/11/ad-blocking-ethics"><cite>The Ethics of Modern Web Ad-Blocking</cite></a>, and would like to add to his argument. There is no agreement between the publisher and reader as to <em>how</em> Web content will be consumed. The reader may choose to browse without JavaScript, without images, in a terminal, with a screen-reader, with a refreshable braille display, or any other number of ways. I can choose to hide all <code><h1></code> tags if I want.</p>
<p>But publishers and advertisers, much like developers, crave control. They want to force you to consume their content the way they prescribe.</p>
https://www.thisoneplace.com/2015/08/11/100-words-day-95100 Words: Day 952015-08-11T23:36:56-05:002015-08-11T23:36:56-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>Occasionally I enjoy reading one of the <a href="http://www.w3.org/2001/tag/findings">several findings by the W3C Technical Architecture Group</a>. My favorite to evangelize is <a href="http://www.w3.org/2001/tag/doc/leastPower.html"><cite>The Rule of Least Power</cite></a>.</p>
<p>Tonight I started reading through <a href="http://www.w3.org/2001/tag/doc/promises-guide"><cite>Writing Promise-Using Specifications</cite></a>. When writing API code, I tend to find promises most useful for getting everything set up. After that, I’d rather not wait for a promise to resolve when I could be <a href="http://www.w3.org/2001/tag/doc/promises-guide#streaming-data">streaming data</a> instead.</p>
<p>We have found streaming large amounts of data hasn’t really helped our throughput all that much, but the memory consumption is much better, allowing us to serve more users with smaller machines.</p>
https://www.thisoneplace.com/2015/08/10/100-words-day-94100 Words: Day 942015-08-10T21:59:19-05:002015-08-10T21:59:19-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>Here are my answers to <a href="http://www.sitepoint.com/the-es6-conundrum/#javascript-doesnt-seem-to-cut-it-any-longer">Christian Heilmann’s questions</a>.</p>
<ul>
<li>No.</li>
<li>No.</li>
<li>No.</li>
<li>No.</li>
<li>No.</li>
<li>Not sure.</li>
<li>No.</li>
<li>Don’t know.</li>
<li>Maybe, but I don’t see it immediately.</li>
<li>No.</li>
<li>I hope not.</li>
</ul>
<p>My “no” answers are probably predictable. What I’ve been thinking about recently is how much expressivity the backward-compatibility-breaking syntax changes add. If you come from a strong <abbr title="object-oriented">OO</abbr> background, then the language changes look comforting. If you <a href="http://drboolean.gitbooks.io/mostly-adequate-guide/content/">read even a little about functional programming</a>, then it seems less convincing. Many of the conveniences come from new APIs, such as <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise">Promises</a>, which can be used with feature detection or polyfills.</p>
https://www.thisoneplace.com/2015/08/09/100-words-day-93100 Words: Day 932015-08-09T21:52:19-05:002015-08-09T21:52:19-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>Web fonts are troublesome. On one hand, I like good typography. This site’s typography isn’t the best, but the current design was an excuse to play with a couple of fonts from <a href="http://www.typography.com">Hoefler</a>.</p>
<p>I’m currently serving over 300 kilobytes of fonts for about 14 kilobytes of content. Even after files are cached, on a good network, the fonts add about 100 milliseconds to get a 304.</p>
<p>I tried <a href="https://github.com/filamentgroup/loadCSS">Filament Group’s CSS loader</a>, and performance was great even over a 2G network, but the font switches in the middle of reading. It’s becoming harder to see the value of custom fonts.</p>
https://www.thisoneplace.com/2015/08/08/100-words-day-92100 Words: Day 922015-08-08T21:39:21-05:002015-08-08T21:39:21-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>Remember <a href="http://www.thisoneplace.com/2015/07/17/100-words-day-70.html">three weeks ago when I said the walls would be covered in Pussywillow before work on Monday</a>? That didn’t happen. Who knew patching holes in walls could take three coats of mud with a day between each coat? I didn’t. Three weeks later, it’s finally done and looking much better.</p>
<p>Even though today has been busy, it’s also been pleasant. Writing this post is the first I’ve opened a laptop, and tomorrow should be the same. Some people can code every day, but I find time away refreshing.</p>
<p>I also got to meet Mila, the chihuaua my parents rescued.</p>
https://www.thisoneplace.com/2015/08/07/100-words-day-91100 Words: Day 912015-08-07T23:01:58-05:002015-08-07T23:01:58-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>Today was the interns’ last day, and yesterday they presented the work they had done. Not many outside of the development team had seen what they had been working on and were expecting a couple of pages, not the full-featured product they delivered.</p>
<p>Because energy is a precious commodity in a start-up, there are also things that could have been done better from an organizational perspective. For example, we didn’t get to cover testing. The dream scenario is to have tooling in place before they arrive so the entire project can be test driven.</p>
<p>There’s always next summer.</p>
https://www.thisoneplace.com/2015/08/06/100-words-day-90100 Words: Day 902015-08-06T23:45:45-05:002015-08-06T23:45:45-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>Windows 10 is finally installed in Parallels. What’s the first thing to try? IE Edge. Where is it? I tried searching for “IE Edge,” but nothing came up. After a quick search on the Web, I thought, maybe “Spartan” will find it. Sure enough, it did. “Edge” alone also works, but be sure you’re in the correct search box. And if you don’t know to look for Edge, you’ll likely end up in IE 11.</p>
<p>If I can remember to flip over to Windows on occasion, my intention is to give it a fair shot over the next few weeks.</p>
https://www.thisoneplace.com/2015/08/05/100-words-day-89100 Words: Day 892015-08-05T23:14:01-05:002015-08-05T23:14:01-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>Our interns are about to wrap up their time with us and have a product to show for it. Over the course of the last ten weeks, they have touched six different projects and gained quite a bit of knowledge of the Web.</p>
<p>They have a better grasp on the technologies—HTTP, HTML, CSS, JavaScript. They are also more aware, hopefully, of some of the principles of Web development—principle of least power, never trust the client, progressive enhancement, statelessness.</p>
<p>I will miss having them around. They have been a fun group, and I wish them all the very best.</p>
https://www.thisoneplace.com/2015/08/04/100-words-day-88100 Words: Day 882015-08-04T23:16:23-05:002015-08-04T23:16:23-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>Windows 8.1 is running on my Mac in a virtual machine. I attempted to “reserve my free upgrade” when the program was announced a few months ago. I installed the hundreds of updates, restarted numerous times, never saw the icon in the system tray, and gave up.</p>
<p>Tonight, I try again. The VM had already gone through all the updates and a few more restarts before I found a <a href="https://support.microsoft.com/en-us/kb/3081048">support page with a troubleshooting app</a> that thinks there is an installed update that has never run. Having uninstalled it, it’s time to try one last time before giving up again.</p>
https://www.thisoneplace.com/2015/08/03/100-words-day-87100 Words: Day 872015-08-03T23:24:20-05:002015-08-03T23:24:20-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p><a href="http://www.quirksmode.org/blog/archives/2015/07/stop_pushing_th.html">PPK wrote an article</a>, and today <a href="https://jakearchibald.com/2015/if-we-stand-still-we-go-backwards/">Jake responded</a>, and I agree with them both in broad strokes. I don’t think a moratorium as PPK suggests is a good idea, but the sentiment is understandable. Jake makes some good points, but I tend to disagree that the Web should be able to do everything native can.</p>
<p>In my view, the Web’s main strengths are the hyperlink and its ubiquity, and I question what value many of the proposed standards will bring.</p>
<p>Then I watched <a href="http://christianheilmann.com/2015/08/04/erase-and-rewind-a-talk-about-open-web-enthusiasm-at-open-web-camp/">Christian’s latest talk</a> and realize I’m not alone in my concerns and am still a techno-hippie.</p>
https://www.thisoneplace.com/2015/08/02/100-words-day-86100 Words: Day 862015-08-02T22:45:09-05:002015-08-02T22:45:09-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>I met with <a href="http://joekarl.github.io">Karl</a> this afternoon to start hacking on a software renderer. Truth be told, we mostly talked, and he wrote one <code>#define</code>. My interest in the project is less about the graphics and more about getting better at linear algebra and architecture-specific optimizations.</p>
<p>From a pure programming point of view, I tend to be attracted to the ends of the spectrum. Procedural and object-oriented programming tend to bore me. On one end, the mathematical nature of functional programming is elegant. On the other end, specifying opcodes makes you feel like you’re in control of the machine.</p>
https://www.thisoneplace.com/2015/08/01/100-words-day-85100 Words: Day 852015-08-01T23:49:47-05:002015-08-01T23:49:47-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p><a href="http://www.fivesimplesteps.com">Five Simple Steps</a> has <a href="http://www.fivesimplesteps.com/collections/responsive-day-out">videos available from their Responsive Day Out</a>. The lineup looks good, and the talks are relatively brief. So far I’ve only watched <a href="http://www.fivesimplesteps.com/products/solving-problems-with-selectors"><cite>Solving problems with selectors</cite></a> by <a href="http://www.heydonworks.com">Heydon Pickering</a>. The talk was entertaining and a nice introduction to his way of thinking, but you’ll really get more out of his longer talks, such as <a href="https://vimeo.com/101718785"><cite>Effortless Style</cite></a> or <a href="https://vimeo.com/109912253"><cite>Getting nowhere with CSS best practices</cite></a>.</p>
<p>Having never been a fan of grid systems, I like the way he reclassifies them as “grid prescriptions.” A grid is a great design tool, but let’s not let it dictate our markup.</p>
https://www.thisoneplace.com/2015/07/31/100-words-day-84100 Words: Day 842015-07-31T22:42:43-05:002015-07-31T22:42:43-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>While thinking of what to write, I started, with guilt, scrolling through Facebook having just a bit of battery left.</p>
<p>Recently Facebook has been less about what my friends are doing and more about showing videos. You scroll a video into view and it starts playing, graciously without sound.</p>
<p>This behavior takes a toll. I went from nine percent battery to six in a couple of minutes; that’s 45 minutes down to 30. I’m sure they have stats saying this is the right choice for “engagement” or whatever, but it’s not the right choice for me keeping your tab open.</p>
https://www.thisoneplace.com/2015/07/30/100-words-day-83100 Words: Day 832015-07-30T23:52:21-05:002015-07-30T23:52:21-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>Lately I’ve been helping one of the interns refactor code, and it’s been quite fun (for me, anyway). The exercise isn’t about showing coding prowess, but it’s a good place to try different patterns and see where we can leverage the frameworks and conventions we’ve chosen to bring back into our other projects.</p>
<p>The problem is there are more ideas running through my head of things we could improve. For example, we could use the streams from MongoDB, and we could switch our templates to Dust. We could enhance with service workers in browsers that support it, and we could…</p>
https://www.thisoneplace.com/2015/07/29/100-words-day-82100 Words: Day 822015-07-29T23:39:13-05:002015-07-29T23:39:13-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>I just kicked off a task that will take several hours to complete. If I go to sleep now, it should fail in about five minutes from now. Maybe I should restart the process with an error handler that sends a text message or calls my phone or plays a song whenever something goes wrong. But it can’t be just any song; it must be not only appropriate for the job of fixing whatever broke, but also suitable to my mood. “Rectifier” from <cite>Tron</cite> might be a good fit, so long as I remember my work isn’t nearly as epic.</p>
https://www.thisoneplace.com/2015/07/28/100-words-day-81100 Words: Day 812015-07-28T23:55:58-05:002015-07-28T23:55:58-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>On <a href="http://www.thisoneplace.com/2015/07/09/100-words-day-62.html">Day 62</a> I wrote about the inaccessibility of <a href="https://exaptive.com">Exaptive’s</a> login. Well, they’ve updated their site, and that process is less painful. I might do a deep dive into the overall implementation another night, but I couldn’t resist inspecting the new link to “login/signup.” (Let’s ignore how those each should be two words for now.)</p>
<div class="highlight"><pre><code class="language-html" data-lang="html"><span></span><span class="p"><</span><span class="nt">button</span> <span class="na">onclick</span><span class="o">=</span><span class="s">"window.location.href='login.html'"</span> <span class="na">class</span><span class="o">=</span><span class="s">"btn-group btn-login-top"</span><span class="p">></span>login / signup<span class="p"></</span><span class="nt">button</span><span class="p">></span>
</code></pre></div>
<p>Did I say link? I guess I meant button. And setting the window location with JavaScript? Turns out, there’s already a perfect element that does all this for you: the hyperlink!</p>
https://www.thisoneplace.com/2015/07/27/100-words-day-80100 Words: Day 802015-07-27T23:50:16-05:002015-07-27T23:50:16-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>Tonight I watched Amanda Glossen’s talk, <a href="https://www.youtube.com/watch?v=bKkYcetGWjA"><cite>Nothing is Sacred</cite></a>, about working within constraints, and it made me think of <a href="https://vimeo.com/101718785">Heydon Pickering’s <cite>Effortless Style</cite></a>.</p>
<p>I like to think of HTML as a design constraint. We can use CSS to enforce that constraint by writing selectors that leverage the semantics of our documents.</p>
<p>The most compelling point of Heydon’s work for me is the reliability of using such selectors. If we apply <code>class="btn"</code> to a <code><button></code>, but somebody later changes the element to a <code><span></code>, we have lost the meaning of the element with no visual clue of the side effects.</p>
https://www.thisoneplace.com/2015/07/26/100-words-day-79100 Words: Day 792015-07-26T23:58:10-05:002015-07-26T23:58:10-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>Last Friday we were made aware of an issue where a client’s expectations had not been adequately captured, and we thought we had delivered an appropriate solution.</p>
<p>Since anything not directly related to our domain runs from queues, it was a pretty easy fix. We made the appropriate adjustment, requeued the affected entities, and let it run.</p>
<p>When gathering requirements, it can be easy to overlook the little details. How <em>should</em> the email attachments be named? I know developers don’t always like tools like <a href="https://cucumber.io">Cucumber</a>, but I’ve found it does a nice job of getting everybody on the same page.</p>
https://www.thisoneplace.com/2015/07/25/100-words-day-78100 Words: Day 782015-07-25T23:59:40-05:002015-07-25T23:59:40-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>I finally met some neighbors this weekend and have already forgotten most the names. I’m also trying to forget the twenty dollars I lost yesterday.</p>
<p>Having not played poker in a few years, I stayed in longer than I expected and managed to double up with four sixes.</p>
<p>What I’m not looking forward to is going back and reading last night’s post after wandering back across the street with a few beers in the system. Hopefully my proofreading abilities aren’t too inhibited by an increased BAC.</p>
<p>Now to get back to the daily grind and a regular regimen of water.</p>
https://www.thisoneplace.com/2015/07/24/100-words-day-77100 Words: Day 772015-07-24T23:43:25-05:002015-07-24T23:43:25-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>The PHP was actually a successful endeavor. And unlike JavaScript, it complained about my sloppy semicolon use. The real friction was not the language but everything around the module I was developing.</p>
<p>Whenever it takes 45 minutes to get your local project up to speed, and tens of seconds to minutes for requests to complete, the feedback loop is just too slow to pretend to be productive.</p>
<p>Even with the friction, writing a little PHP was still the best choice. Now we’re able to react to changes as they happen instead of trying to figure them out on a schedule.</p>
https://www.thisoneplace.com/2015/07/23/100-words-day-76100 Words: Day 762015-07-23T21:33:21-05:002015-07-23T21:33:21-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>I’m about to do it. I’m about to write some PHP. Don’t judge me. Trust me, it’s the easiest way forward. And when I’m done, I’ll happily return to the land of Node.</p>
<p>Well, I’ll return, but no guarantee I’ll be happy about it.</p>
<p>But right now it’s time to learn how much of the language I’ve forgotten. Last time I tried writing any PHP was a few months ago, and even common syntax, such as associative arrays, looked foreign. If I’m supposed to remember how to write <code>for</code> loops—or is it <code>foreach</code>?—you may as well forget it.</p>
https://www.thisoneplace.com/2015/07/22/100-words-day-75100 Words: Day 752015-07-22T23:18:49-05:002015-07-22T23:18:49-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>Lately I’ve been snoozing my 100-words alarm more than my morning alarm, which is an accomplishment. I never was an early riser. I was in the afternoon kindergarten class, and in first grade I never woke up before my alarm. In high school the first few minutes of breakfast were usually spent with my head on the dining table trying to squeeze in a bit more sleep before rushing off with my shoes not yet tied to get to my seat with my trumpet just in time for rehearsal. And I’d rather forget the seven o’clock labs in college.</p>
https://www.thisoneplace.com/2015/07/21/100-words-day-74100 Words: Day 742015-07-21T23:57:09-05:002015-07-21T23:57:09-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p><a href="http://drboolean.gitbooks.io/mostly-adequate-guide/">Professor Frisby’s Mostly Adequate Guide to Functional Programming</a> is a great introduction to functional programming using JavaScript. I have some code that I’ve been wanting to refactor for a few months now, and this kind of stuff tempts me to push the “important” work back and play.</p>
<p>Having looked into functional programming in the past, I’ve known the more I learned, the more it would change the way I see all code. Now seeing it applied in JavaScript is even changing my enthusiasm for upcoming features in ES2016. Why use promises instead of futures? Why use decorators over functional composition?</p>
https://www.thisoneplace.com/2015/07/20/100-words-day-73100 Words: Day 732015-07-20T23:36:14-05:002015-07-20T23:36:14-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>A friend of mine is up late pretending to be system administrator because some bozo decided their office should run an in-house mail server, and today an update hosed everything. Let’s say this shop has 15 email accounts, and a hosted plan runs about 50 dollars per user per year. Just today, the loss of billable hours, technical support costs, and system downtime makes 750 dollars a bargain, not to mention the initial investment and ongoing maintenance costs. Unless you’re a special snowflake with totally unique email needs, <em>don’t host your own email.</em></p>
<p>(Confession: I host my own email.)</p>
https://www.thisoneplace.com/2015/07/19/100-words-day-72100 Words: Day 722015-07-19T22:35:49-05:002015-07-19T22:35:49-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>One W3C standard I’m behind on is <a href="http://www.w3.org/TR/eventsource/">Server-Sent Events</a>. It became a recommendation earlier this year and has been supported for years by every major browser except for IE and Opera Mini. It would make me happy to see the <a href="https://status.modern.ie/">status for IE Edge</a> change from “Under Consideration” to “In Development.”</p>
<p>I’d like to see this change because WebSockets has gotten a lot of love, and for good reason, but I feel like it’s used a lot to push updates to a page. If the bidirectional communication isn’t needed, let’s not overcomplicate things and stick with the simpler EventSource.</p>
https://www.thisoneplace.com/2015/07/18/100-words-day-71100 Words: Day 712015-07-18T22:20:23-05:002015-07-18T22:20:23-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>I signed up for the free trial of Showtime, which brings my number of streaming video services up to four. Sling’s 20 dollars a month, HBO’s 15, Showtime’s 11, and Netflix is 8 for a grand total of 54 dollars. This is still cheaper than getting a cable or satellite package with HBO and Showtime, and I would have Netflix either way, so I should really be comparing against 46 dollars.</p>
<p>I haven’t had cable for over a year, and the only content I’ve missed is Showtime and Thunder games. I hardly ever use Sling and am leaning towards canceling.</p>
https://www.thisoneplace.com/2015/07/17/100-words-day-70100 Words: Day 702015-07-17T23:49:42-05:002015-07-17T23:49:42-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>This weekend will be an exhibition of my prowess as a handyman. I’ve already started by installing a new garbage disposal and covering the Earl Grey with primer in favor of Pussywillow. Tomorrow I’ll learn how to patch holes in walls, and the paint will be on the walls before work on Monday.</p>
<p>The only downside is there will be quite a bit of climbing and moving a ladder around, and my Apple Watch gives me no credit for this activity. You think I’m going risk getting spatter on it? I’d rather not try cleaning out the Milanese Loop band.</p>
https://www.thisoneplace.com/2015/07/16/100-words-day-69100 Words: Day 692015-07-16T23:50:33-05:002015-07-16T23:50:33-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>Another great night of <a href="http://nerdbeers.com">Nerd Beers</a> has passed, and there’s much I could write about. Most importantly we got some details worked out around <a href="http://www.backyardjs.org">BackyardJS</a>.</p>
<p>And thanks to <a href="https://twitter.com/charlesroper">Charles</a> for pointing me to <a href="http://blog.cleancoder.com/uncle-bob/2014/06/20/MyLawn.html"><cite>My Lawn</cite></a> by Uncle Bob. I wouldn’t say I’m there yet, but I’d like to think that’s my trajectory. While it’s all worth a read, the sentence that stood out to me was:</p>
<blockquote>
<p>That leader can temper and curb the youthful enthusiasm that leads to premature decisions about frameworks and architectures.</p>
</blockquote>
<p>It seems the default decision today is to use a framework, not whether one’s even needed.</p>
https://www.thisoneplace.com/2015/07/15/100-words-day-68100 Words: Day 682015-07-15T21:51:09-05:002015-07-15T21:51:09-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>Library authors, please assert your expectations early. We spent too much time today trying to track down a bizarre error because we forgot to attach a property to <code>module.exports</code>. Yes, we felt silly after we realized the mistake, but it wouldn’t be too difficult to ensure the callback argument is actually a function.</p>
<p>I know I should submit a pull request, and for this library I probably will. Or better, I’ll see if the intern I was helping (poorly) would rather take it on; the GitHub contributions will be more useful to somebody about to finish up a CS degree.</p>
https://www.thisoneplace.com/2015/07/14/100-words-day-67100 Words: Day 672015-07-14T23:55:36-05:002015-07-14T23:55:36-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>I watched the <a href="https://edgeconf.com/2015-london?v=JQgBb9WeYHI">panel on components and modules</a> from the Edge Conference, and the discussion left me unsettled. The questions from the audience were more pugnacious—thanks thesaurus!—and there are still many questions that haven’t been satisfactorily answered.</p>
<p>What’s the story for server-side rendering? Will we be able to progressively enhance? Should developers be responsible for meeting the <a href="https://github.com/webcomponents/gold-standard/wiki">gold standard</a>?</p>
<p>There was also an attitude that tools could help alleviate some of the audience’s concerns, but a spec that requires tooling to be useful isn’t a very useful spec. An inclusive Web is inclusive for publishers as well as consumers.</p>
https://www.thisoneplace.com/2015/07/13/100-words-day-66100 Words: Day 662015-07-13T23:30:38-05:002015-07-13T23:30:38-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>As I fall asleep tonight (which would have already happened had it not been for these words), I’ll be listening to this <a href="https://edgeconf.com/2015-london">Progressive Enhancment session</a> from the Edge Conference. I’m starting with this one because I already have a good idea of where I stand on this topic and won’t mind falling asleep before it’s over, but I also plan on returning to watch the other panels when I’m a little more attentive since I don’t have as strong of opinions and would like to hear what others have to say.</p>
<p>Also, <a href="https://twitter.com/Ajstegall/status/620810580232790020">AJ has started 100 burpees for 100 days</a>.</p>
https://www.thisoneplace.com/2015/07/12/100-words-day-65100 Words: Day 652015-07-12T21:14:38-05:002015-07-12T21:14:38-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>I like this 100 days project, and I think I’ll do another once this one is wrapped up. The next one will be about learning a new skill or tech, but I haven’t decided which one yet. Maybe I’ll learn Haskell (because “a hundred days of Haskell” has nice alliteration), SVG, Erlang, or Elixir. I might also use the 100 days to catch up on all the new Web tech that’s been coming out. My hesitation with the new Web tech is I don’t think there are that many I’m unfamiliar with, so it would become an exercise in implementation.</p>
https://www.thisoneplace.com/2015/07/11/100-words-day-64100 Words: Day 642015-07-11T20:39:54-05:002015-07-11T20:39:54-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>Today I learned that painting the first wall of a room is kind of fun. The next three walls and cutting in is not as much fun. Also, why did the previous owners have to pick library red? <em>Library red!</em> I might have to put on another coat of primer, but I’ll see how the samples look with just the one.</p>
<p>With that said, I should probably get back to work and finish going around windows and doors and baseboards. And if anybody is super bored next weekend, I will gladly get an extra brush and restock the beer fridge.</p>
https://www.thisoneplace.com/2015/07/10/100-words-day-63100 Words: Day 632015-07-10T23:23:01-05:002015-07-10T23:23:01-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>There are times when a full page refresh really isn’t the best experience. This could be a “like” or “follow” button or any other quick action where you don’t want to leave the main content. (This isn’t an excuse not to use progressive enhancement with these elements.)</p>
<p>Today I noticed another unexpected behavior from what felt like a full page load that was actually handled with JavaScript. I was zoomed in on a link in Safari on iOS, and since the content of the body was replaced, I’m now zoomed to some random piece of the content that just loaded.</p>
https://www.thisoneplace.com/2015/07/09/100-words-day-62100 Words: Day 622015-07-09T23:35:21-05:002015-07-09T23:35:21-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p><a href="https://exaptive.com">Exaptive</a> has an impressively inaccessible login form that</p>
<ul>
<li>is only visible on mouse hover;</li>
<li>isn’t focusable by keyboard;</li>
<li>has submit “buttons” which are links to nothing and contain block elements;</li>
<li>uses a <code>div</code> with text and an image—one that belongs in the stylesheet and has no <code>alt</code> attribute—which can’t receive focus to reveal the form;</li>
<li>uses placeholders instead of labels;</li>
<li>has a contrast ratio between the input field and its content of an embarrassing 1.5:1;</li>
<li>obscures the form with a video if you can keep it open while scrolling down; and</li>
<li>is too wide for smaller devices.</li>
</ul>
https://www.thisoneplace.com/2015/07/08/100-words-day-61100 Words: Day 612015-07-08T23:20:39-05:002015-07-08T23:20:39-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>Dates in MongoDB suck.</p>
<p>If we want to store a future local time, the <code>Date</code> type is insufficient since it’s an offset from the Unix epoch. This is fine for things that have already happened since they are frozen in time, but if we have scheduled something for a particular time on a particular day and the rules change for daylight saving time, we could end up an hour off.</p>
<p>We can store the local date as a string, object, offset, or custom binary representation, but now we’re making up our own types that impact querying, sorting, and developer ergonomics.</p>
https://www.thisoneplace.com/2015/07/07/100-words-day-60100 Words: Day 602015-07-07T19:30:11-05:002015-07-07T19:30:11-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>The interns ran into a problem I haven’t been able to diagnose. On their log-in page in Chrome for iOS, sometimes the CSS doesn’t load. Then, when you press the back button, the styles are missing on that page, too. They already had some cache-busting in place, and I couldn’t find anything wrong in the markup. On top of that, I couldn’t reproduce the problem running the server on my computer. We finally conceded that some users might not see the styles.</p>
<p>Weird browser bug? Possibly. Did <em>we</em> do something wrong? Maybe. Could we still log in? Absolutely.</p>
https://www.thisoneplace.com/2015/07/06/100-words-day-59100 Words: Day 592015-07-06T23:51:56-05:002015-07-06T23:51:56-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>According to the latest <a href="https://vimeo.com/132548196" title="Smashing Conf NYC 2015 Christian Heilman - LIFE ON PLANET FINTLEWOODLEWIX on Vimeo">talk by Christian Heilmann</a>, I’m an old, techno-hippie. And I’m OK with that.</p>
<p>There are plenty of people chasing the latest JavaScript frameworks, and there are too few trumpeting the benefits of progressive enhancement. Accessibility? Who needs it?</p>
<p>If you think of the Web as just another software platform, or if you’re just new to the Web–remember the <a href="https://en.wikipedia.org/wiki/Web_Standards_Project" title="Web Standards Project - Wikipedia, the free encyclopedia">Web Standards Project</a>?—then I would encourage you to slow down a little bit and dig into the history of the Web. Much of what I see today looks like the mistakes I remember from yesterday.</p>
https://www.thisoneplace.com/2015/07/05/100-words-day-58100 Words: Day 582015-07-05T23:38:43-05:002015-07-05T23:38:43-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>I’ve been wanting to write about Web Components for a while, and although my thoughts aren’t fully formed yet, I’m going to throw out a couple of things on my mind and hopefully revisit the topic more fully later.</p>
<p>I fear components will mostly be used for developer convenience over users’ needs, such as accessibility. I imagine few components will meet the 62 items on the <a href="https://github.com/webcomponents/gold-standard/wiki" title="Home · webcomponents/gold-standard Wiki">Gold Standard Checklist</a>, 11 of which are related to accessibility.</p>
<p>Next, it seems like a shiny hammer that developers will find irresistible, giving them another easy way to violate <a href="http://www.w3.org/2001/tag/doc/leastPower.html" title="The Rule of Least Power">The Rule of Least Power</a>.</p>
https://www.thisoneplace.com/2015/07/04/100-words-day-57100 Words: Day 572015-07-04T20:40:21-05:002015-07-04T20:40:21-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>Looking through my analytics today, I saw a familiar name—my friend Eric Sherred has <a href="http://ericsherred.com/2015/07/01/100-words-day-1/" title="Eric Sherred: 100 Words, Day 1">started writing 100 words a day</a>. This is great, and I hope he sticks with it.</p>
<p>I would recommend this exercise to anybody, and it doesn’t have to be writing. If you’re a tennis fan, maybe you want to practice 100 serves a day; if you’re a musician, maybe you could practice a scale 100 times. (Both of these ideas are far worse than 100 words.)</p>
<p>Just find something you want to improve, and do a little bit of that for the next 100 days.</p>
https://www.thisoneplace.com/2015/07/03/100-words-day-56100 Words: Day 562015-07-03T22:52:50-05:002015-07-03T22:52:50-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>My parents, sister, brother-in-law, nephews, and dog—don’t tell Mom he’s not hers—are in town for the Fourth. Simon (the mutt) is a little out of place, but finally tired of trying to get me to go to bed and went ahead on his own. Naturally he took as much of my spot as possible. I just hope he’s tired enough from the travels to not need to pee in the middle of the night. Once I can fall asleep, I tend to stay there until my body has determined it’s rested enough for the next day.</p>
https://www.thisoneplace.com/2015/07/02/100-words-day-55100 Words: Day 552015-07-02T23:29:11-05:002015-07-02T23:29:11-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>I finally started learning Erlang. This all started because I wanted to test a regular expression that most likely gets executed in software written in the language, and I had no idea what I was doing.</p>
<p>Actually, I do know what I was doing. I was copying code from Stack Overflow.</p>
<p>While I’ve always wanted to dive a little deeper into a functional language, I don’t know if it’s something I’ll find myself using very often. But I do see myself using the concepts regardless of language. Also, sometimes it’s just nice to get my mind out of imperative code.</p>
https://www.thisoneplace.com/2015/07/01/100-words-day-54100 Words: Day 542015-07-01T23:20:17-05:002015-07-01T23:20:17-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>I haven’t been frustrated with code in a while, but tonight is reminding me how aggravating a seemingly small bug can be. Why is my function is being called four times instead of three? And why does one of the four calls expect a different signature?</p>
<p>Hopefully it’s one of those bugs that keeps me from getting to bed for a few more minutes and not a few more hours. Since getting away from the computer can help refresh the mind, I’ll start by taking a break. If that doesn’t work, then I’ll seek the help of the <a href="https://xkcd.com/323/" title="xkcd: Ballmer Peak">Ballmer Peak</a>.</p>
https://www.thisoneplace.com/2015/06/30/100-words-day-53100 Words: Day 532015-06-30T23:46:46-05:002015-06-30T23:46:46-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>I’m hoping to review the interns’ code before falling asleep, but it might not happen. Looking through things briefly this afternoon, there are three things I noticed.</p>
<p>First, there’s a tendency to look to loops instead of <a href="https://en.wikipedia.org/wiki/Higher-order_function" title="Higher-order function - Wikipedia, the free encyclopedia">higher-order functions</a>. This is reasonable since the APIs are still unfamiliar and loops are the known tool.</p>
<p>Second, HTML elements are sometimes chosen for their visual appearance and not because of their appropriateness.</p>
<p>Third, labels are often picked because they describe an implementation detail in the current context, not because they make the most sense for the content they hold or describe.</p>
https://www.thisoneplace.com/2015/06/29/100-words-day-52100 Words: Day 522015-06-29T21:57:05-05:002015-06-29T21:57:05-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>We have been using <a href="http://hapijs.com" title="hapi.js">Hapi</a> as a framework for our <a href="https://nodejs.org" title="Node.js">Node</a> apps. Overall I like it, but that doesn’t mean it’s perfect.</p>
<p>In the <a href="http://hapijs.com/api#request-lifecycle" title="8.6.1 API Reference">request lifecycle</a>, any error from validation will respond with <code>400 Bad Request</code>. The problem is loading prerequisites happens much later, and if we’re trying to update a resource that doesn’t exist, we really want <code>404 Not Found</code>.</p>
<p>We can load the entity in the validation function, but even returning a <code>404</code> error object give a <code>400</code> response.</p>
<p>It would also be nice to do some authorization between prerequisites and handlers, but there is no extension point.</p>
https://www.thisoneplace.com/2015/06/28/100-words-day-51100 Words: Day 512015-06-28T21:37:35-05:002015-06-28T21:37:35-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>I glanced through my stylesheets, and they’re pretty close to what <a href="http://www.smashingmagazine.com/2012/06/19/classes-where-were-going-we-dont-need-classes/" title="Classes? Where We're Going, We Don't Need Classes! – Smashing Magazine">Heydon’s suggesting</a>. There are quite a few classes dealing with syntax highlighting, and I think those are fine. Most of the rest is context-sensitive.</p>
<p>The first exception is <code>#content</code> on <code><main></code>. This is clearly unnecessary, so it will be removed. Next is <code>.archive-link</code>, which is the footer of the main section, so it will be changed. <code>.name</code> is part of a <a href="http://microformats.org" title="Microformats">microformat</a>, but it probably makes more sense to style the heading. I have no idea what <code>.small-print</code> is, and I need to think about <code>.byline</code>.</p>
https://www.thisoneplace.com/2015/06/27/100-words-day-50100 Words: Day 502015-06-27T20:16:12-05:002015-06-27T20:16:12-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>I just read through Heydon’s article, <a href="http://www.heydonworks.com/article/the-accessible-current-page-link-conundrum" title="The Accessible Current Page Link Conundrum"><cite>The Accessible Current Page Link Conundrum</cite></a>, and wondered why the current page link is even a problem. Shouldn’t the browser or <abbr title="Assistive Technology">AT</abbr> be able to figure out the link is the same as the current location and announce it as such? Here are some reasons user agents might get confused:</p>
<ul>
<li>The link is actually a form with a button.</li>
<li>The <code>href</code> is transformed by a script.</li>
<li>URLs all look like internal links in <abbr title="Single Page Apps">SPAs</abbr>.</li>
<li>“Links” are not <code>a</code> elements.</li>
</ul>
<p>All of these sound pretty terrible, and your site probably has more serious accessiblity issues.</p>
https://www.thisoneplace.com/2015/06/26/100-words-day-49100 Words: Day 492015-06-26T14:06:26-05:002015-06-26T14:06:26-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>Apparently coffee takes calibration, and I have not found the sweet spot. If I am to continue this experiment, the conditions will have to be more tightly controlled because the consistent trend is staying up into the middle of the night.</p>
<p>During last night’s wakefulness I watched <a href="https://vimeo.com/101718785" title="Heydon Pickering | Effortless Style | CSS Day on Vimeo"><cite>Effortless Style</cite></a> by <a href="http://www.heydonworks.com" title="HeydonWorks | The works, workings and reckonings of Heydon">Heydon Pickering</a> and read his articles <a href="http://alistapart.com/article/axiomatic-css-and-lobotomized-owls" title="Axiomatic CSS and Lobotomized Owls · An A List Apart Article"><cite>Axiomatic CSS and Lobotomized Owls</cite></a> and <a href="http://www.smashingmagazine.com/2013/08/20/semantic-css-with-intelligent-selectors/" title="Semantic CSS With Intelligent Selectors – Smashing Magazine"><cite>Semantic CSS With Intelligent Selectors</cite></a>. His approach to HTML and CSS certainly isn’t fashionable, but I’m much more comfortable producing the most semantic HTML, and leveraging those semantics when writing my selectors—time to revisit this site’s stylesheets.</p>
https://www.thisoneplace.com/2015/06/25/100-words-day-48100 Words: Day 482015-06-25T23:50:03-05:002015-06-25T23:50:03-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>We have decided to outsource image cropping to <a href="http://aws.amazon.com/lambda/" title="AWS Lambda">Lambda</a>. We’ve been using Lambda to resize images into other representations we used elsewhere whenever we would put an object in an <a href="http://aws.amazon.com/s3/" title="AWS | Amazon Simple Storage Service (S3) - Online Cloud Storage for Data & Files">S3</a> bucket. The transition was pretty easy.</p>
<ol>
<li>Move cropping code into its own module.</li>
<li>Create a Lambda function from the module.</li>
<li>Create an <a href="http://aws.amazon.com/sns/" title="AWS Push Notification Service | Amazon SNS">SNS</a> topic.</li>
<li>Subscribe to function to the topic.</li>
<li>Replace original cropping and upload code with a <code>publish</code> to the topic.</li>
</ol>
<p>Doing image manipulation on somebody else’s server complicates knowing when things finish. I’ll write about that once we have a better solution.</p>
https://www.thisoneplace.com/2015/06/24/100-words-day-47100 Words: Day 472015-06-24T22:15:17-05:002015-06-24T22:15:17-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>Today I started <a href="https://en.wikipedia.org/wiki/Pair_programming" title="Pair programming - Wikipedia, the free encyclopedia">pair programming</a> with the interns. The plan is to spend an hour or two with each of them, one per day. In a couple of weeks, we’ll probably do the same thing. Without much time to spare, this exercise requires a little extra time out of my evenings, but it’s worth it.</p>
<p>Since digging into their code a little more, I’ve noticed the big ideas are there, but the design patterns are still a bit green. The key though is to refactor in small enough steps they can understand how their code transforms into a tighter system.</p>
https://www.thisoneplace.com/2015/06/23/100-words-day-46100 Words: Day 462015-06-23T22:20:19-05:002015-06-23T22:20:19-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>I have been wanting to stream results from <a href="https://www.mongodb.org" title="MongoDB">Mongo</a> through <a href="http://hapijs.com" title="hapi.js">Hapi</a> for a while and <a href="https://github.com/nlindley/hapi-mongo-stream" title="nlindley/hapi-mongo-stream">finally got around to it</a> tonight. Since <a href="http://mongodb.github.io/node-mongodb-native/2.0/tutorials/streams/" title="Streams">Mongo’s Node driver streams</a> in <a href="https://nodejs.org/api/stream.html#stream_object_mode" title="Stream Node.js v0.12.5 Manual & Documentation">object mode</a>, I had to write a small implementation of a <a href="https://nodejs.org/api/stream.html#stream_class_stream_transform_1" title="Stream Node.js v0.12.5 Manual & Documentation">transform stream</a> to support Hapi’s <a href="http://hapijs.com/api#reply-interface" title="8.6.1 API Reference"><code>reply</code> interface</a>.</p>
<p>The transform stream implementation simply stringifies each object as it comes in, separates these strings with commas, and wraps the response in square brackets to make it look like an array. Using a response stream means Hapi isn’t going to help us out with the <code>Content-Type</code> header, so we have to set it ourselves.</p>
https://www.thisoneplace.com/2015/06/22/100-words-day-45100 Words: Day 452015-06-22T21:57:14-05:002015-06-22T21:57:14-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>So far the <a href="http://www.ussoccer.com/womens-national-team" title="U.S. Women's National Team #USWNT - U.S. Soccer">Women’s National Team</a> is 3–0 of the games I’ve watched. Now, to be fair, I haven’t really watched much of the games. There’s a certain excitement I detect in the crowd as something is about to happen, and I‘ll quickly glance around at the TV just in time to see a goal.</p>
<p>But the actual game isn’t why I’ve been to <a href="https://twitter.com/skinnyslimsokc" title="SkinnySlimsBricktown (@SkinnySlimsOKC) | Twitter">Skinny Slim’s in Bricktown</a> the last three weeks; I go to have a couple of beers and good conversation. Sure, it’s mostly coworkers, but I couldn’t ask for a better group to hang out with.</p>
https://www.thisoneplace.com/2015/06/21/100-words-day-44100 Words: Day 442015-06-21T19:24:08-05:002015-06-21T19:24:08-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>I have been looking through <a href="http://principles.adactio.com" title="Design Principles">Jeremy Keith’s collection of design principles</a>, and one I’ve tended to obey is the <a href="http://www.w3.org/2001/tag/doc/leastPower.html" title="The Rule of Least Power">Rule of Least Power</a>, even though I didn’t know it had a name. It is also the reason for <a href="http://blog.codinghorror.com/the-principle-of-least-power/" title="The Principle of Least Power">Atwood’s Law</a>.</p>
<p>HTML is the suitable language for most of what’s on the Web, but that is often generated by some other language. If we apply the rule to the templating language, our tendency will be to choose one that provides less power, not more. I look for templating languages that do just enough and aren’t tied to another, more powerful language.</p>
https://www.thisoneplace.com/2015/06/20/100-words-day-43100 Words: Day 432015-06-20T23:31:20-05:002015-06-20T23:31:20-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>If you plan on visiting me in the next several weeks, you’ll have to sleep on a mattress on the floor. If you can wait until September, you’ll be several inches higher off the floor. My bed is moving into the guest room, and a <a href="http://www.copelandfurniture.com/bedroom/beds/astrid-bed-with-1-adjustable-headboard-panel-3008.html" title="Copeland Furniture : Natural Hardwood Furniture from Vermont : Astrid Bed with 1 Adjustable Headboard Panel in Walnut and Dark Chocolate Maple - beds - bedroom">Copeland Astrid</a> bed will be taking its place in my room.</p>
<p>I’ve decided the furnishings in my house can be a little sparse for now. I’d rather buy furniture that I like and will last a lifetime. Also, I can’t afford to buy the stuff I like all at once, and it’s entirely <a href="http://massarch.com/team/isaac-hines/" title="Isaac Hines | Mass Architecture">Isaac’s</a> fault.</p>
https://www.thisoneplace.com/2015/06/19/100-words-day-42100 Words: Day 422015-06-19T23:17:25-05:002015-06-19T23:17:25-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>The weekend has started out nicely with a birthday dinner for my parents at <a href="https://www.facebook.com/pages/White-Dog-Hill/133344753359454" title="White Dog Hill">White Dog Hill</a>. If you find yourself in western Oklahoma, make a reservation; the food is good, and the view is even better.</p>
<p>Tomorrow I’ll be singing <a href="https://www.youtube.com/watch?v=JnsO3BBMjA0" title="Lord's Prayer sung by Denyce Graves - YouTube"><cite>The Lord’s Prayer</cite></a> for a funeral. You never know if a wedding will last, but it’s always rewarding to provide music for the family of the deceased.</p>
<p>And then I have to finish watching the latest season of Shameless. I’ve had one episode left for weeks. I’m not sure what my next television addiction will be—maybe <cite>Penny Dreadful</cite>.</p>
https://www.thisoneplace.com/2015/06/18/100-words-day-41100 Words: Day 412015-06-18T22:57:49-05:002015-06-18T22:57:49-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>I’m a <a href="https://twitter.com/cocoaokc/status/611255984950935552" title="CocoaHeads OKC (@cocoaokc) | Twitter">proud winner</a> of a <a href="http://360idev.com" title="360iDev.com">360|iDev</a> ticket. This gives me two months to dust off my iOS and Mac development skills. Moving outside the world of Web requires a shift in thinking. I have a good idea of what is available and can pick which features to support. I am no longer in the realm of ubiquity.</p>
<p>But it’s not <em>that</em> different from Web. Users may opt to share information or enable access to device features. With a platform such as iOS we’re forced to recognize these possibilities. Why on the Web do we try to ignore them?</p>
https://www.thisoneplace.com/2015/06/17/100-words-day-40100 Words: Day 402015-06-17T23:29:33-05:002015-06-17T23:29:33-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>Today felt extremely productive, but most of the work was the kind that’s both important and difficult to communicate until people see the side effects of not having done it.</p>
<p>These are the tasks that always get bumped because “It hasn’t been a problem yet,” or “We <em>have</em> to have feature <var>x</var> for client <var>y</var>.”</p>
<p>I know of two solutions; maybe you know others. You can either spend more time educating stakeholders, or pad estimates of other tasks with enough time for the under-the-hood work. Given how notorious we are with software estimates, I’d try the first option.</p>
https://www.thisoneplace.com/2015/06/16/100-words-day-39100 Words: Day 392015-06-16T22:20:08-05:002015-06-16T22:20:08-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>Day one of the Great Coffee Experiment had mixed results. I have chosen to start with latte to ease into the coffeeness of coffee. The medium size was seemingly too much because I was wired <em>all</em> day—and half the night.</p>
<p>Day two of the Experiment started with less sleep and a small cup of latte. If I sleep well tonight, it will preliminarily be considered a success. Unfortunately two variables changed today: base amount of rest and caffeine intake. I will need more data points to tease out any correlations.</p>
<p>In other news, I enjoyed <a href="http://www.imdb.com/title/tt0369610/" title="Jurassic World (2015) - IMDb"><cite>Jurassic World</cite></a> last night.</p>
https://www.thisoneplace.com/2015/06/15/100-words-day-38100 Words: Day 382015-06-15T21:17:10-05:002015-06-15T21:17:10-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>I’ve seen a switch flip, and the interns are starting to think about how the HTML relates to the content, which is a nice departure from making everything a <code><div></code> or <code><span></code>. Since HTML5 introduced a number of new semantic elements, it’s not as simple as it used to be, and some of the nuance can take some time to get the hang of.</p>
<p>But these are smart people, and they <em>are</em> asking the right questions. Of all the time spent making a Web site, picking an element is minor. If these young developers can do it, so can you.</p>
https://www.thisoneplace.com/2015/06/14/100-words-day-37100 Words: Day 372015-06-14T21:04:58-05:002015-06-14T21:04:58-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>I’ve decided I need to learn to like coffee. As far as caffeine sources are concerned, soda and energy drinks are too sugary, and tea is too weak. Having acquired tastes for beer and tea, it can’t be that bad, right?</p>
<p>The other option is to try and get going in the morning through improved sleep hygiene, diet, and exercise, but who has time for that? Plus, the <a href="https://en.wikipedia.org/wiki/Caffeine#Side_effects" title="Caffeine - Wikipedia, the free encyclopedia">side effects</a> don’t sound too bad.</p>
<p>I must be careful to not become too fussy about my coffee. With only so many minutes per day, giving very many for caffeine is silly.</p>
https://www.thisoneplace.com/2015/06/13/100-words-day-36100 Words: Day 362015-06-13T18:21:06-05:002015-06-13T18:21:06-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>I just finished reviewing the interns’ code, and most of my comments were about the HTML and CSS. This is the content; this is the product; this has to be right. We can argue about whether a piece of code should live in this class or that service, but those decisions are implementation details we can change later. Our content choices affect users now.</p>
<p>And to be perfectly clear, I would make the same comments about many professional developers’ output. JavaScript gets a lot of love and attention, but HTML and CSS are what give JavaScript its reason to be.</p>
https://www.thisoneplace.com/2015/06/12/100-words-day-35100 Words: Day 352015-06-12T23:31:29-05:002015-06-12T23:31:29-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>My goal this weekend is sleep. My other goal is to review the interns’ code. Considering how swamped the full-timers have been, they have done a great job moving forward with the occasional nudge in the right direction.</p>
<p>The work they are doing at the moment is not sexy, but they are quickly approaching a solid foundation that just works. This foundation will be a usable product ripe for iteration. With minds unburdened by core functionality or browser requirements, they will be able to polish the edges and add some whimsy. And I’ll be able to get some sleep.</p>
https://www.thisoneplace.com/2015/06/11/100-words-day-34100 Words: Day 342015-06-11T22:57:19-05:002015-06-11T22:57:19-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>Testing email in a staging environment has always been scary. Production is easy because it actually sends, and local is easy because it saves to a file. But if we want to see what happens between development and production, and if we want to see how it looks in an email client, then neither of these options works very well.</p>
<p>Until tonight we’d just been <em>really</em> careful about which accounts were used. Now we have a server that accepts any email sent to it and delivers it to one mailbox. No more time bomb ready to explode unsuspecting clients’ inboxes.</p>
https://www.thisoneplace.com/2015/06/10/100-words-day-33100 Words: Day 332015-06-10T23:03:59-05:002015-06-10T23:03:59-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>Today was long. We have been working for several months to build a new system that is more nimble than the company’s old one, but there are always growing pains. Tonight we switched one of our largest clients over, and it really exposed the bottlenecks when making these transitions.</p>
<p>As developers, it’s tempting to push for less customization, but part of what makes us valuable is our flexibility. So if I must choose, I’ll choose a little pain to give our clients a better product, and as we learn more, we will find the patterns to make our lives easier.</p>
https://www.thisoneplace.com/2015/06/09/100-words-day-32100 Words: Day 322015-06-09T23:49:27-05:002015-06-09T23:49:27-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>Reading email on the Apple Watch isn’t all that useful. I have flicked through the messages and deleted ones I knew I didn’t need, and this functionality works fine.</p>
<p>The watch is a very constrained device, both in size and resources, and many senders have made completely different assumptions about where their messages will end up. Marketing messages are giant images, and I am prompted to view them on my phone. Think I’ll be able to click your link?</p>
<p>As with the Web, we shouldn’t assume how our content will be consumed. Provide a plain-text alternative for your readers.</p>
https://www.thisoneplace.com/2015/06/08/100-words-day-31100 Words: Day 312015-06-08T22:45:25-05:002015-06-08T22:45:25-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>I just saw the article <a href="https://developer.apple.com/library/prerelease/mac/documentation/AppleApplications/Conceptual/SafariJSProgTopics/Articles/RespondingtoForceTouchEventsfromJavaScript.html#//apple_ref/doc/uid/TP40016162-SW1" title="Responding to Force Touch Events from JavaScript">Responding to Force Touch Events from JavaScript</a> <a href="https://twitter.com/rauchg/status/608019450663567360" title="Guillermo Rauch on Twitter: JavaScript Force Touch events">come across my Twitter stream</a>. Being such a proprietary technology right now, I haven’t decided whether or not it’s worth implementing yet, but if I were to implement it, I can think of three ways to approach the problem off the top of my head:</p>
<ul>
<li>Go ahead and use it! Screw the users not on the latest beta of OS X!</li>
<li>Browser sniff—gross.</li>
<li><a href="http://perfectionkills.com/detecting-event-support-without-browser-sniffing/" title="Detecting event support without browser sniffing — Perfection Kills">Feature detection of supported events</a>.</li>
</ul>
<p>You can probably guess which approach I would take since feature detection is an important concept of progressive enhancment.</p>
https://www.thisoneplace.com/2015/06/07/100-words-day-30100 Words: Day 302015-06-07T23:57:32-05:002015-06-07T23:57:32-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>If you were to see my small collection of books, and if you were to hear how many of those I have never read, you probably wouldn’t say writing is something I’d enjoy. But I do.</p>
<p>Writing is also a skill I haven’t put much effort into. If I am to improve, I must read more. And since time is scarce, the literature I choose must be consumed deliberately.</p>
<p>With any skill, there are the challenges of knowing what you don’t know and how to select incrementally more demanding tasks. It’s the just-out-of-reach that makes us improve.</p>
https://www.thisoneplace.com/2015/06/06/100-words-day-29100 Words: Day 292015-06-06T16:21:57-05:002015-06-06T16:21:57-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>As it turns out, I was wrong <a href="http://www.thisoneplace.com/2015/06/05/100-words-day-28.html" title="Nicholas Lindley: 100 Words: Day 28">yesterday</a>; Hapi streams the templates just fine. When testing things in curl, the views streamed from Dust never printed until the entire payload was ready, but when streaming strings that looked like HTML, everything was normal. Then I decided to throw in an async script just to see what would happen in browsers.</p>
<p>This is when I got a little confused—the browsers worked fine! As it turns out, Dust likes to minify the output, so there were no line breaks, and curl likes to wait until a line break to show output.</p>
https://www.thisoneplace.com/2015/06/05/100-words-day-28100 Words: Day 282015-06-05T23:04:26-05:002015-06-05T23:04:26-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>Since watching <a href="https://www.youtube.com/watch?v=d5_6yHixpsQ" title="Supercharging page load (100 Days of Google Dev) - YouTube"><cite>Supercharging page load</cite></a> by <a href="http://jakearchibald.com" title="Blog - JakeArchibald.com">Jake Archibald</a>, I’ve been wanting to try streaming <a href="http://www.dustjs.com" title="Dust.js by LinkedIn">Dust templates</a> with <a href="http://hapijs.com" title="hapi.js">Hapi</a>. While conceptually simple, it took a bit of fiddling. I <a href="https://github.com/nlindley/hapi-dust" title="nlindley/hapi-dust">forked</a> a <a href="https://github.com/mikefrey/hapi-dust" title="mikefrey/hapi-dust">plugin</a> and modified it to convert Dust’s streams into proper ones.</p>
<p>Everything is finally in place, and Hapi is serving the streamed templates, but I am still receiving the full response only when the stream closes.</p>
<p>After a variety of test cases, the behavior seems to be somewhere in Hapi and not the Node APIs. I’ll try tracking down the culprit this weekend.</p>
https://www.thisoneplace.com/2015/06/04/100-words-day-27100 Words: Day 272015-06-04T22:12:14-05:002015-06-04T22:12:14-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p><a href="http://www.thisoneplace.com/2015/06/03/100-words-day-26.html" title="Nicholas Lindley: 100 Days: Day 26">Yesterday I mentioned</a> how inexperienced developers can lean on code more than markup. Today I ran across an example of this. To start, we wanted an input for the start date.</p>
<div class="highlight"><pre><code class="language-html" data-lang="html"><span></span><span class="p"><</span><span class="nt">input</span> <span class="na">type</span><span class="o">=</span><span class="s">"date"</span> <span class="na">name</span><span class="o">=</span><span class="s">"start"</span><span class="p">></span>
</code></pre></div>
<p>Next we wanted to set a default if it was not provided.</p>
<div class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span></span><span class="nx">$</span><span class="p">(</span><span class="s1">'[name="start"]'</span><span class="p">).</span><span class="nx">val</span><span class="p">(</span><span class="s1">'2015-06-04'</span><span class="p">);</span>
</code></pre></div>
<p>You may be asking, “Why not add <code>value="2015-06-04"</code> to the <code>input</code> element?” Well, if you don’t know about the <code>value</code> attribute, then the solution isn’t obvious, and a script will seem reasonable. But I would start by asking, “Can HTML already do this?”</p>
https://www.thisoneplace.com/2015/06/03/100-words-day-26100 Words: Day 262015-06-03T23:04:38-05:002015-06-03T23:04:38-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>With the interns’ project in full swing, it’s become clear young (and some experienced) developers have an inclination to use code to solve problems that are better solved with markup. But lessons learned from years of thinking about building on the Web stack are difficult to condense into a couple of hours with any expectation of assimilation.</p>
<p>This led me to start collecting <a href="https://pinboard.in/u:nlindley/t:progressive-enhancement/" title="Pinboard: bookmarks for nlindley tagged 'progressive-enhancement'">some of my favorite articles related to progressive enhancement</a> in one place. My hope is at least a few people will browse the links and start to think from the content out instead of the code in.</p>
https://www.thisoneplace.com/2015/06/02/100-words-day-25100 Words: Day 252015-06-02T21:25:30-05:002015-06-02T21:25:30-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>Today was one of those days. Everything seemed to break, and nothing we launched went quite right. Yes, things should have been tested better, but we were able to recover, and nothing was lost. However, one of the issues was integrating with a third-party API.</p>
<p>Normally an API has two sets of credentials, one for testing and one for production. However, with <em>this</em> API, you have one set of credentials. Once you’re happy you get “certified” to use certain features. Only then do you <em>move</em> to production. That’s right; test credentials go away and you are left with production.</p>
https://www.thisoneplace.com/2015/06/01/100-words-day-24100 Words: Day 242015-06-01T21:33:12-05:002015-06-01T21:33:12-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>My Apple Watch arrived 17 days ago, and I really didn’t know what to expect. The first keynote introducing this little device left me thinking I wouldn’t get one, but the second one piqued my interest. Being an early adopter, I decided to get one to play with.</p>
<p>I really don’t use the fitness features—although it’s still letting me know I don’t exercise enough—but I have noticed my phone stays in my pocket a lot more. It was fun putting my wrist under the scanner to board the airplane, and Apple Pay is still a hit with cashiers.</p>
https://www.thisoneplace.com/2015/05/31/100-words-day-23100 Words: Day 232015-05-31T21:34:48-05:002015-05-31T21:34:48-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>I’ve been seeing a lot about improving performance on the Web lately, which is great, but some of the articles would lead one to believe it should be the <em>primary</em> focus. While performance should be <em>a</em> focus, let’s not expend all of our resources and neglect aspects of design that affect humans, such as accessibility, semantic markup, or URL design.</p>
<p>While many developers enjoy writing maintainable software and tooling, if we focus on developer conveniences above the user and produce, for example, inaccessible content, we have failed. At least this renewed focus on performance <em>is</em> a focus on the user.</p>
https://www.thisoneplace.com/2015/05/30/100-words-day-22100 Words: Day 222015-05-30T21:58:09-05:002015-05-30T21:58:09-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>We have interns starting on Monday, and they will have a project to call their own. I must resist the urge to make all the decisions for them, but it’s also an opportunity to share my values for designing for the Web.</p>
<p>It’s silly to expect students to have much knowledge of the Web’s history or why <a href="http://www.sitepoint.com/javascript-dependency-backlash-myth-busting-progressive-enhancement/" title="The JavaScript-Dependency Backlash: Myth-Busting Progressive Enhancement"><q cite="http://www.sitepoint.com/javascript-dependency-backlash-myth-busting-progressive-enhancement/">Progressive Enhancement remains the best option for solving web development issues,</q></a> but I hope they leave being able to evaluate tradeoffs of various technical decisions and start to form their own guiding principles.</p>
https://www.thisoneplace.com/2015/05/29/100-words-day-21100 Words: Day 212015-05-29T23:12:07-05:002015-05-29T23:12:07-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>If every request to a site receives a fully rendered page, the consumer will always receive the latest representation for a resource. Things get trickier when navigation and rendering are controlled by JavaScript; templates could get stale, URLs could be updated, and we have to inform the client of this.</p>
<p><q>An update is required.</q> <q>Please refresh your browser.</q> <code>TypeError: undefined is not an object</code></p>
<p>When using progressive enhancement, maybe requests could be sent with a header specifying a version. If it matches, continue. Otherwise, fail and do a full refresh. I would enjoying hearing how others have solved this problem.</p>
https://www.thisoneplace.com/2015/05/28/100-words-day-20100 Words: Day 202015-05-28T23:23:33-05:002015-05-28T23:23:33-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>I’ve <a href="https://twitter.com/nlindley/status/597139535705739264">mentioned</a> <a href="http://ponyfoo.com">Pony Foo</a> before but didn’t realize the <a href="http://www.bevacqua.io/about#bio">author</a> is the same as that for <a href="http://taunus.bevacqua.io">Taunus</a>, an “isomorphic” framework focused on progressive enhancement.</p>
<p>First I tried it out with JavaScript disabled, and it works. Then I enabled JavaScript, and it <em>mostly</em> works as expected. Clicking a link goes to a new page, updates the URL, and the back button goes back.</p>
<p>Kind of.</p>
<p>As with many sites that hijack the history, scroll position is lost when you navigate with JavaScript enabled. “Not breaking the back button” is about more than just updating the URL; it’s about not breaking expectations.</p>
https://www.thisoneplace.com/2015/05/27/100-words-day-19100 Words: Day 192015-05-27T19:56:35-05:002015-05-27T19:56:35-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>Observation tells me that many come to the Web with backgrounds in computer science, and there is nothing wrong with this. But observation also tells me many computer science programs don’t teach the Web. As someone who learned HTML and CSS in the 90s before anything procedural, I realize I have a different perspective.</p>
<p>I’ve always thought the tendency to write JavaScript first was merely a reflection of a preference to “program.” But having talked with younger developers just coming out of university, I think it’s just as much having never been taught the strengths inherent to HTML and CSS.</p>
https://www.thisoneplace.com/2015/05/26/100-words-day-18100 Words: Day 182015-05-26T21:05:12-05:002015-05-26T21:05:12-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>The domain for the first, and only, podcast I attempted will be expired by the time my next post is ready. <a href="https://twitter.com/alexdamon" title="Mayor Alex Damon (@AlexDamon) | Twitter">Alex Damon</a> and I would talk about what was going on in <a href="http://en.wikipedia.org/wiki/New_Cordell,_Oklahoma" title="New Cordell, Oklahoma - Wikipedia, the free encyclopedia">Cordell</a>, my hometown, but small-town drama reared its ugly head and we had to put things on hold indefinitely.</p>
<p>Part of me wants to leave the site up forever, and it’s sad to let the domain go, but everything eventually comes to an end—even on the Web.</p>
<p>Except for that <em>one</em> photo.</p>
https://www.thisoneplace.com/2015/05/25/100-words-day-17100 Words: Day 172015-05-25T20:47:54-05:002015-05-25T20:47:54-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>You’ve finally decided to give up your <abbr title="Single-page application">SPA</abbr> and move to a site that uses progressive enhancement, but you’re not sure where to start. Start with the server.</p>
<p>Instead of hitting the API directly, put a server between it and your site. Now you can start mapping remote calls to URLs that make sense for your particular site. Once you’ve decoupled your site’s URLs from the API’s, you can start transforming the content into different representations: HTML for initial page loads and JSON for AJAX requests, for example.</p>
https://www.thisoneplace.com/2015/05/24/100-words-day-16100 Words: Day 162015-05-24T23:13:52-05:002015-05-24T23:13:52-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>And so my vacation comes to a close. Tomorrow will be a day of travels, and the rest of the week will be back to the daily grind. My cousin has offered the diagnosis of “eccentric genius” instead of “ADHD,” and I think I’ll take it.</p>
<p>Even though time with family can make things such as differences in practices in Web development seem trivial, I have also not changed my mind about what those practices should be, so you can expect me to be back to beating on the drum of progressive enhancement, inclusivity, durabability, and fault-tolerance pretty soon.</p>
https://www.thisoneplace.com/2015/05/23/100-words-day-15100 Words: Day 152015-05-23T23:28:50-05:002015-05-23T23:28:50-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>Congratulations to friends Josh and Wendy on their marriage today. I wish I could have been there, but vacation was calling. Tomorrow will be the last day with my aunt, Shirley, and cousin, John, whom we don’t see enough. Hopefully it won’t be so many years before next time.</p>
<p>From the sound of things, we missed quite the <a href="http://cavecreekfestivals.com/fourth-annual-cave-creek-balloon-festival-at-rancho-manana/" title="Cave Creek Balloon Festival – Cave Creek Festivals">balloon festival</a>, but I did enjoy an excellent steak here at <a href="https://www.diamondresorts.com/Rancho-Manana-Resort" title="Rancho Mañana Resort | Diamond Resorts International®">the resort</a> along with another <a href="http://www.fourpeaks.com/beer/mainstays/kilt-lifter/" title="Kilt Lifter® - Four Peaks Brewing Company : Four Peaks Brewing Company">Kilt Lifter</a> and a <a href="http://www.dogfish.com/brews-spirits/the-brews/year-round-brews/90-minute-ipa.htm" title="90 Minute IPA | Dogfish Head Craft Brewed Ales">Dogfish Head 90 Minute IPA</a>. If you find yourself needing a quiet getaway, check out Cave Creek if it’s not too warm.</p>
https://www.thisoneplace.com/2015/05/22/100-words-day-14100 Words: Day 142015-05-22T23:42:39-05:002015-05-22T23:42:39-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>Sorry, guys, but no vacation news today. While there was plenty of interesting conversation with relatives, my mind is on progressive enhancement again. While I might quibble about some of the language used, <a href="http://craigbuckler.com" title="Craig Buckler">Craig Buckler</a> covers <a href="http://www.sitepoint.com/javascript-dependency-backlash-myth-busting-progressive-enhancement/" title="The JavaScript-Dependency Backlash: Myth-Busting Progressive Enhancement">some of the myths</a> of progressive enhancement. But what really captivated me was the headline and the <a href="http://community.sitepoint.com/t/are-we-in-a-scripting-dependency-backlash/175614/41" title="Are we in a scripting-dependency backlash? - The SitePoint Forums">linked forum topic</a> which make me realize I’m not the only one feeling disillusioned by the rash of client-side MVCs.</p>
<p>Yet reading all the articles in the world doesn’t bring the techniques to anybody new. My question is, “How do we become better educators and advocates?”</p>
https://www.thisoneplace.com/2015/05/21/100-words-day-13100 Words: Day 132015-05-21T22:51:03-05:002015-05-21T22:51:03-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>Today we went to the <a href="http://mim.org" title="Musical Instrument Museum">Musical Instrument Museum</a>. While we didn’t see everything, we did make it through most of the countries on the second floor. You walk through the museum with headphones that start playing whenever you’re near a monitor with recordings to accompany the display which really improved the experience.</p>
<p>Things I personally enjoyed seeing were <a href="http://en.wikipedia.org/wiki/Purdue_All-American_Marching_Band" title="Purdue All-American Marching Band - Wikipedia, the free encyclopedia">Purdue’s “Block P”</a> and <a href="http://www.blasttheshow.com" title="Blasttheshow">Blast</a> in the marching band section, <a href="http://ingridjensen.com" title="IngridJensen.com - The Official Site Of Ingrid Jensen">Ingrid Jensen</a> in one of the “Women of Jazz” clips, and a clip of <a href="http://www.vizzutti.com" title="Allen Vizzutti Official Website">Allen Vizzutti</a> in the “Brass Trumpets” section. Also, they seem to like <a href="http://www.arturosandoval.com" title="Arturo Sandoval">Arturo Sandoval</a> more than I do.</p>
https://www.thisoneplace.com/2015/05/20/100-words-day-12100 Words: Day 122015-05-20T23:57:26-05:002015-05-20T23:57:26-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>You’ll get a break for a few days from anything technical since I am vacationing in the Phoenix area. From what I understand, it’s unseasonably cool (still pretty warm), but the evenings are rather perfect for sitting outside with a good beer and old friends.</p>
<p>Fortunately I have a friend in the area from my days at <a href="http://www.purdue.edu" title="Purdue University">Purdue</a> who suggested we meet at <a href="http://www.fourpeaks.com" title="Homepage - Four Peaks Brewing Company : Four Peaks Brewing Company">Four Peaks Brewing Company</a> in Tempe. I had the Kilt Lifter, a Scottish-style ale. It is a solid beer with nothing too disagreeable, and I’d recommend for those of you prefering something more sweet than bitter.</p>
https://www.thisoneplace.com/2015/05/19/100-words-day-11100 Words: Day 112015-05-19T22:07:52-05:002015-05-19T22:07:52-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>Presenting unfamiliar topics can be a way to nudge yourself into sitting down and expanding your skills. Both times I have talked at <a href="http://www.cocoaokc.org" title="Oklahoma City Cocoaheads | OKC iOS and Mac Development">Oklahoma City Cocoaheads</a> have felt underprepared, and tonight I discovered I had recently introduced an app-crashing bug shortly after the talk started. But even when a talk hasn’t gone as planned, the preparation has made topic seem less foreign.</p>
<p>Even if I don’t present again anytime soon, I will start preparing for another talk. Then when the time arises, hopefully it will feel like I am presenting because I am prepared and not preparing to present.</p>
https://www.thisoneplace.com/2015/05/18/100-words-day-10100 Words: Day 102015-05-18T23:54:26-05:002015-05-18T23:54:26-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>Six minutes to spare because I hadn’t set enough reminders to write. A little over 18 hours before I present at <a href="http://www.cocoaokc.org" title="Oklahoma City Cocoaheads | OKC iOS and Mac Development">Oklahoma City Cocoaheads</a>, and I don’t plan on getting much sleep tonight. There’s always the question of whether or not a short nap is possible. I’d really like to sleep for a couple of hours now, but knowing me, that will turn into several hours. But if I can survive tomorrow then I’ll get several days of vacation. The last I remember taking more than a day off work was just about a year ago when I visited Boston.</p>
https://www.thisoneplace.com/2015/05/17/100-words-day-9100 Words: Day 92015-05-17T22:59:37-05:002015-05-17T22:59:37-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>The last couple of days have been more focused on iOS than the Web. While I’ve dabbled with the platform here and there—and unlike “the browser,” this is an <em>actual</em> platform—every time I do it makes me appreciate the depth of knowledge of the Web I’ve acquired over the years. My pace of development in iOS is slower, and the choices seem less obvious right now.</p>
<p>It’s also a nice reminder that what iOS development is to me, Web development is to others. As <a href="http://www.quirksmode.org/blog/archives/2015/05/tools_dont_solv.html" title="Tools don’t solve the web’s problems, they ARE the problem - QuirksBlog">PPK said</a>, <q cite="http://www.quirksmode.org/blog/archives/2015/05/tools_dont_solv.html">Teach the newbies proper web development,</q> but remember to do so patiently.</p>
https://www.thisoneplace.com/2015/05/16/100-words-day-8100 Words: Day 82015-05-16T23:33:06-05:002015-05-16T23:33:06-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p><a href="http://www.quirksmode.org/about/" title="Peter-Paul Koch - mobile platform strategist, consultant, and trainer">PPK</a> wrote <a href="http://www.quirksmode.org/blog/archives/2015/05/tools_dont_solv.html" title="Tools don’t solve the web’s problems, they ARE the problem - QuirksBlog">an article claiming tools are the Web’s problem</a>, and I tend to agree. But what amazes me is how many of the tools create solutions to things that weren’t problems. One of many examples is relying on <a href="http://en.wikipedia.org/wiki/Ajax_(programming)" title="Ajax (programming) - Wikipedia, the free encyclopedia"><abbr title="asynchronous JavaScript and XML">AJAX</abbr></a> and data-binding for form submissions. </p>
<p>If you’d like to provide a progress indicator, try <code>FormData</code>, a <code>progress</code> element, and <code>XMLHttpRequest</code> if the browser supports it. Otherwise just submit a form. If the data needs tranformed into a different representation, that can be done on the server before hitting the API. (<a href="http://alexbilbie.com/2014/11/oauth-and-javascript/" title="OAuth and Single Page JavaScript Web-Apps">You’re not seriously hitting the API directly are you?</a>)</p>
https://www.thisoneplace.com/2015/05/15/100-words-day-7100 Words: Day 72015-05-15T20:23:44-05:002015-05-15T20:23:44-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>Today is the actual and celebrated birthday of two special souls.</p>
<p>The first is Mama Babe, née Ella Babe, who would have been 93. She was the mother of my father and passed away a little over four years ago. Even as dementia took over, she kept her sense of humor until the end.</p>
<figure>
<a href="http://cdn.thisoneplace.com/grandparents.jpg"><img src="http://cdn.thisoneplace.com/grandparents.jpg" /></a>
<figcaption>Mama Babe and Daddy Mack on March 31, 2001.</figcaption>
</figure>
<p>The second is Simon, a mutt that arrived at Dad’s store nearly four years ago at a skinny 11 pounds. He’s the happiest dog and loves anything human.</p>
<figure>
<a href="http://cdn.thisoneplace.com/simon.jpg"><img src="http://cdn.thisoneplace.com/simon-thumb.jpg" /></a>
<figcaption>Simon at my parents’ house, courtesy of <a href="http://www.ajstegall.com" title="AJ Stegall Photography">AJ Stegall</a>.</figcaption>
</figure>
https://www.thisoneplace.com/2015/05/14/100-words-day-6100 Words: Day 62015-05-14T20:32:06-05:002015-05-14T20:32:06-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>This site’s latest visual design was mostly a result of playing with fonts from <a href="http://www.typography.com/cloud/welcome/" title="Welcome to Cloud.typography | Webfonts by Hoefler & Co.">Cloud.typography</a> and flexbox for layout, so cross-browser testing was nonexistent. I don’t know if I’ve ever opened it in a non-WebKit browser.</p>
<p>… Be right back; checking other browsers …</p>
<p>Well, I just learned it doesn’t look right in IE10 and lower, but the content is still accessible. Maybe we shouldn’t be in such a cozy browser as we develop, though. Nearly half of the market doesn’t use a WebKit or Blink rendering engine. Once things are up and running, then switch back and enhance responsibly.</p>
https://www.thisoneplace.com/2015/05/13/100-words-day-5100 Words: Day 52015-05-13T21:06:56-05:002015-05-13T21:06:56-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>I was looking through my traffic this evening and noticed over the last seven days nearly half of my traffic has been from the “unknown mobile” browser. Now, I can only guess, but seeing that most of my visitors are on an iPhone and most are coming from Facebook, it’s likely the in-app browser.</p>
<p>But I don’t know.</p>
<p>And that’s why your <em>content</em> should be available to any browser. Developers like to be fancy and get in the way of allowing visitors to accomplish the core task—usually reading some text or submitting a form—regardless of browser choice.</p>
https://www.thisoneplace.com/2015/05/12/100-words-day-4100 Words: Day 42015-05-12T21:00:55-05:002015-05-12T21:00:55-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>Last night was the first rehearsal with the new band. I thought I was pretty tardy arriving 15 minutes after the scheduled time only to discover I was the second one there; the last person arrived about an hour after the starting time. Contrasting this to the start-up world where there are seemingly endless tasks, all “high priority,” exhibits pretty different concepts of time. The first won’t be rushed, and the second can’t move fast enough. While the pressure of a deadline can be motivating to get things done, it sure is nice not to worry about the clock.</p>
https://www.thisoneplace.com/2015/05/11/100-words-day-3100 Words: Day 32015-05-11T19:08:04-05:002015-05-11T19:08:04-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>Tomorrow is bowling with the crew from <a href="https://www.wegolook.com">WeGoLook</a>, Friday is a <a href="http://www.theymightbegiants.com" title="They Might Be Giants | Installing and servicing melody since 1982">They Might Be Giants</a> concert, and our brass quintet will be playing with the <a href="http://www.clintonokband.com" title="Clinton Bands">Clinton High School band</a> on Sunday. Squeeze in a talk at <a href="http://www.cocoaokc.org" title="Oklahoma City Cocoaheads | OKC iOS and Mac Development">Cocoaheads</a> next Tuesday, and this week is shaping up to be busy.</p>
<p>But first, tonight begins rehearsals with a new group (<a href="http://en.wikipedia.org/wiki/Cumbia" title="Cumbia - Wikipedia, the free encyclopedia">Cumbia</a>, I think). I played with a few members earlier in the year, and it’s a fun style once you get the hang of reading the hand-written lead sheets. Trumpet has served nicely as a diversion from the usual sea of code.</p>
https://www.thisoneplace.com/2015/05/10/100-words-day-2100 Words: Day 22015-05-10T17:21:44-05:002015-05-10T17:21:44-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>I am about halfway through <a href="http://adaptivewebdesign.info" title="Adaptive Web Design: Crafting Rich Experiences with Progressive Enhancement">Adaptive Web Design</a> by <a href="http://www.aaron-gustafson.com" title="Hi, I’m Aaron Gustafson">Aaron Gustafson</a>, a book about <a href="http://alistapart.com/article/understandingprogressiveenhancement" title="Understanding Progressive Enhancement · An A List Apart Article">progressive enhancement</a>. Even being familiar with the concepts, a couple of points caught my attention.</p>
<p>The Web’s experience layers are usually thought of as content, presentation, and behavior which are mapped to HTML, CSS, and JavaScript. Aaron expands this to five layers with text and <a href="http://www.w3.org/WAI/intro/aria.php" title="WAI-ARIA Overview">ARIA</a>. This means you can think of HTML as an enhancement to the text providing additional semantics, and ARIA adds additional semantics in more interactive experiences. Basic HTML can then be enhanced even further with commonly accepted conventions such as microformats.</p>
https://www.thisoneplace.com/2015/05/09/100-words-day-1100 Words: Day 12015-05-09T14:31:36-05:002015-05-09T14:31:36-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>Taking inspiration from <a href="https://adactio.com/journal/tags/100words" title="Adactio: Journal">Jeremy Keith’s 100 Words</a>, I’ve decided to try and do the same—100 words every day for 100 days. My initial inclination was to take shortcuts such as skipping weekends or having 100 be the minimum, but then I read <a href="https://adactio.com/journal/8588" title="Adactio: Journal&mdash;100 words 002">his second</a> post and decided it should be an exact 100 words.</p>
<p>As a reader you can expect to hear quite a bit about progressive enhancement, not breaking the Web, or whatever I’m up to when away from work.</p>
<p>Let’s start the next 100 days with a link to a rant I enjoyed, <a href="http://ponyfoo.com/articles/stop-breaking-the-web" title="Stop Breaking the Web">Stop Breaking the Web</a>.</p>
https://www.thisoneplace.com/2013/09/02/home-screen-cleanup-part-2Home Screen Cleanup, Part 22013-09-02T14:10:00-05:002013-09-02T14:10:00-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>I have switched to only having two home screens on my iPhone, and it seems to work well for me. The first screen has apps that I use most often with no folders, and the second screen is Settings, Newstand, and a bunch of folders. This system is shamelessly borrowed from <a href="http://www.marco.org">Marco Arment</a>, although I don’t try to keep the stock apps or their equivalents in their original locations. Overall, I would say I have to use Spotlight less, but I still find it quicker than scanning for the right icon much of the time. Also, you’ll notice I’ve switched to Verizon.</p>
<p><a href="http://cdn.thisoneplace.com/home-screens-part-2.png"><img src="http://cdn.thisoneplace.com/home-screens-part-2-thumb.png" alt="Screenshot of Current Home Screens"></a></p>
https://www.thisoneplace.com/2013/09/02/jekyll-migrationJekyll Migration2013-09-02T03:11:28-05:002013-09-02T03:11:28-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>This is just a quick note that I have finally made my site static. I am
hosting it on Rackspace Cloud Files, so hopefully things are pretty snappy.
For my RSS subscribers—I’m terribly sorry. This shouldn’t happen again for
many years.</p>
https://www.thisoneplace.com/2013/08/16/extracting-pages-from-secured-pdfsExtracting Pages from Secured PDFs2013-08-16T09:35:44-05:002013-08-16T09:35:44-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>There was a secured PDF we were needing to extract a page from, but we didn’t have the author’s password. Since all of the typical tools seemed unwilling to help (Preview, PDFPenPro, Acrobat Pro), I found a roundabout way of getting a PDF of the single page, although it did require a sheet of paper. And no, I did not print it and scan it back in.</p>
<p>OS X, like many other Unix variants, uses CUPS for printing. There is an option to hold on to the print job files reasonably named <code>PreserveJobFiles</code>, so let’s get this added to our configuration.</p>
<p>While you can do this all from the command line, I found it easier to just enable the web server. In Terminal, type <code>cupsctl WebInterface=yes</code>.</p>
<p>Now point your browser to http://localhost:631 and click on the “Administration” tab. Click the “Edit Configuration File” button, add the line <code>PreserveJobFiles yes</code>, and click the “Save Changes” button.</p>
<p>Now, print to a printer like you normally would specifying whatever print range you need (and you could probably find driver that doesn’t require a physical printer that takes real paper), go to <code>/var/spool/cups</code>, and look for the newest file – you’ll probably have to be root. Copy this file somewhere useful, add a .pdf extension to it, and <code>chown</code> it to your regular user.</p>
<p>Now you have a completely unsecured PDF of just the pages you need, or if you need to correct a typo or two, it’s also editable.</p>
https://www.thisoneplace.com/2013/03/23/my-mail-server-setupMy Mail Server Setup2013-03-23T17:05:05-05:002013-05-30T10:34:51-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>I told <a href="https://alpha.app.net/stephenwashburn">somebody</a> I’d never met in person on <a href="https://join.app.net">App.net</a> that I would send a link of how I had set up my mail server, but there are a couple of things I did differently (though not drastically), and I thought I could document them here. So, for the majority of you that are happy with your email as-is, just ignore this post.</p>
<p>I initially had set up my email by following <a href="http://workaround.org/ispmail/squeeze">this tutorial</a> which seems to be kept up-to-date with each release of <a href="http://www.debian.org">Debian</a>. I know <a href="http://www.ubuntu.com">Ubuntu</a> is the popular kid on the block right now, but I’ve always had better luck with the stability Debian offers for what I do.</p>
<p>My mail server is running on the smallest Cloud Server that <a href="http://www.rackspace.com/">Rackspace</a> offers, which is just fine for the amount of traffic I receive. I also have a <a href="https://github.com/nlindley/mail_manager/commit/f35c47b2545064704c5a086d1cbaa9520636e1f1">very basic management interface</a> that runs on <a href="http://www.heroku.com">Heroku</a>. If you choose to run a web interface on Heroku, you will need to allow database connections from the outside world and set the <code>DATABASE_URL</code> in the config.</p>
<div class="highlight"><pre><code class="language-text" data-lang="text"><span></span>heroku config:set DATABASE_URL=mysql2://mailadmin:passw0rd@173.203.249.123:3306/mailserver
</code></pre></div>
<p>Obviously that’s not my real information.</p>
<p>The first variation from the tutorial was in the database table names. Instead of using <code>virtual_users</code>, <code>virtual_domains</code>, and <code>virtual_aliases</code>, I dropped the <code>virtual_</code> part. This makes it a little friendlier to work with in ActiveRecord. Next, I don’t use the full email address for users’ names, which makes the database queries slightly more complex, but still not bad. I’ve included mine below, but if you are using a different database you might need to make sure case-sensitivity won’t be a problem for you.</p>
<div class="highlight"><pre><code class="language-text" data-lang="text"><span></span># /etc/postfix/mysql-email2email.cf
user = mailuser
password = passw0rd
hosts = 127.0.0.1
dbname = mailserver
query = SELECT CONCAT(u.username, '@', d.name) FROM users AS u LEFT JOIN domains AS d ON u.domain_id = d.id WHERE u.username = SUBSTRING_INDEX('%u', '+', 1) AND d.name = '%d'
</code></pre></div><div class="highlight"><pre><code class="language-text" data-lang="text"><span></span># /etc/postfix/mysql-virtual-alias-maps.cf
user = mailuser
password = passw0rd
hosts = 127.0.0.1
dbname = mailserver
query = SELECT destination FROM aliases AS a LEFT JOIN domains AS d ON a.domain_id = d.id WHERE a.source = '%u' AND d.name = '%d'
</code></pre></div><div class="highlight"><pre><code class="language-text" data-lang="text"><span></span># /etc/postfix/mysql-virtual-mailbox-domains.cf
user = mailuser
password = passw0rd
hosts = 127.0.0.1
dbname = mailserver
query = SELECT 1 FROM domains WHERE name='%s'
</code></pre></div><div class="highlight"><pre><code class="language-text" data-lang="text"><span></span># mysql-virtual-mailbox-maps.cf
user = mailuser
password = passw0rd
hosts = 127.0.0.1
dbname = mailserver
query = SELECT 1 FROM users AS u LEFT JOIN domains AS d ON u.domain_id = d.id WHERE u.username = SUBSTRING_INDEX('%u', '+', 1) AND d.name = '%d'
</code></pre></div>
<p>In that last query, you’ll notice the <code>SUBSTRING_INDEX</code> function, which simply allows you to have email addresses like <code>me+omnifocus@example.com</code>.</p>
<p>I also added a couple of columns for <code>admin</code> and <code>super_admin</code> that allow other people to manage their domains and for me to manage any domain. (This part of the interface could be better, but it gets me by.)</p>
<p>The thing the tutorial leaves out in this version, but <a href="http://workaround.org/ispmail/lenny/server-side-sieve-filtering">had included in the previous version for Lenny</a> is automatically sieving spam into a separate folder. Since I use a variety of clients, I prefer this to be done on the server-side. The only difference I made to the <code>globalsieverc</code> file is filtering into <code>Junk</code> instead of <code>spam</code>, but that’s just personal preference. I don’t remember having to make any other changes from the tutorial version for Lenny.</p>
<p>There have been several times I’ve been tempted to use a hosted service, but I don’t want to give up the ability to quickly and easily add accounts, aliases, multiple domains, change my attachment limit, or completely move to another host. This is one service I have not yet been willing to let out of my control.</p>
https://www.thisoneplace.com/2013/03/02/rapid-web-design-setup-for-windowsRapid Web Design Setup for Windows2013-03-02T16:25:14-06:002013-03-02T16:38:19-06:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>Normally I like to do my development in OS X, but because of a new job I have taken, I have to use Windows. Since we are starting a large redesign, I found this to be the perfect time to get some modern tooling in place, and this is what I have been using to quickly change and view stylesheets.</p>
<h2>Tools</h2>
<ul>
<li><a href="http://www.vim.org/download.php#pc">gVim for Windows</a></li>
<li><a href="https://www.google.com/intl/en/chrome/browser/">Chrome Web Browser</a></li>
<li><a href="http://compass-style.org">Compass</a> (includes <a href="http://sass-lang.com">SASS</a>)</li>
<li><a href="http://livereload.com">LiveReload</a></li>
<li><a href="https://chrome.google.com/webstore/detail/livereload/jnihajbhpnppcggbcgedagnkighmdlei">LiveReload Browser Extension</a></li>
</ul>
<h2>gVim for Windows</h2>
<p>I have been using Vim for years, but any text editor will do. If you’re new to Vim and want to try it out, I recommend starting with vimtutor.</p>
<h2>Chrome Web Browser</h2>
<p>On the Mac I usually just use Safari, but on Windows I go with Chrome. Chrome also has a lot of nice extensions for developers available. Since WebKit is the most common rendering engine on the web today, it’s hard to go wrong developing for a WebKit-based browser first, and then checking/fixing problems in other browsers later.</p>
<h2>Compass</h2>
<p>Now things start to get interesting. Before you can install Compass you’ll need Ruby. Currently Ruby 2.0.0-p0 is the latest release, but since it <em>just</em> came out and I’m not familiar with the changes, I opted for 1.9.3-p392. You can get a Windows installer from the <a href="http://rubyinstaller.org/downloads">RubyInstall for Windows download site</a>. I chose to add the Ruby to my path.</p>
<p>Once Ruby is installed, there will be a new application in your start menu called <code>Start Command Prompt with Ruby</code>. I just searched for “Ruby” and it came up. To install compass, simply run the command <code>gem install compass --no-rdoc --no-ri</code>. The two options aren’t necessary, but it did speed things up quite a bit for me.</p>
<p>Now that compass is installed, <code>cd</code> to your project directory. Now you can create the necessary Compass files. In this example, I put things into an assets directory.</p>
<div class="highlight"><pre><code class="language-text" data-lang="text"><span></span>cd path\to\project
compass create assets
cd assets
compass watch
</code></pre></div>
<p>Since we are working with local files, we will need to modify the HTML lines just a little from what was output from the create command above. Here is a sample HTML index.html file.</p>
<div class="highlight"><pre><code class="language-html" data-lang="html"><span></span><span class="cp"><!DOCTYPE html></span>
<span class="p"><</span><span class="nt">html</span> <span class="na">lang</span><span class="o">=</span><span class="s">"en"</span><span class="p">></span>
<span class="p"><</span><span class="nt">head</span><span class="p">></span>
<span class="p"><</span><span class="nt">meta</span> <span class="na">charset</span><span class="o">=</span><span class="s">"utf-8"</span><span class="p">></span>
<span class="p"><</span><span class="nt">title</span><span class="p">></span>Compass Demo<span class="p"></</span><span class="nt">title</span><span class="p">></span>
<span class="p"><</span><span class="nt">link</span> <span class="na">href</span><span class="o">=</span><span class="s">"assets/stylesheets/screen.css"</span> <span class="na">media</span><span class="o">=</span><span class="s">"screen, projection"</span> <span class="na">rel</span><span class="o">=</span><span class="s">"stylesheet"</span> <span class="na">type</span><span class="o">=</span><span class="s">"text/css"</span> <span class="p">/></span>
<span class="p"><</span><span class="nt">link</span> <span class="na">href</span><span class="o">=</span><span class="s">"assets/stylesheets/print.css"</span> <span class="na">media</span><span class="o">=</span><span class="s">“print”</span> <span class="na">rel</span><span class="o">=</span><span class="s">"stylesheet"</span> <span class="na">type</span><span class="o">=</span><span class="s">"text/css"</span> <span class="p">/></span>
<span class="c"><!--[if IE]></span>
<span class="c"> <link href="assets/stylesheets/screen.css" media="screen, projection" rel="stylesheet" type="text/css" /></span>
<span class="c"> <![endif]--></span>
<span class="p"></</span><span class="nt">head</span><span class="p">></span>
<span class="p"><</span><span class="nt">body</span><span class="p">></span>
<span class="p"><</span><span class="nt">h1</span><span class="p">></span>Hello, Compass!<span class="p"></</span><span class="nt">h1</span><span class="p">></span>
<span class="p"></</span><span class="nt">body</span><span class="p">></span>
<span class="p"></</span><span class="nt">html</span><span class="p">></span>
</code></pre></div>
<p>Whenever you change your .scss or .sass files in the sass directory, you can reload this page and see the changes have already been precompiled for you.</p>
<h2>LiveReload</h2>
<p>But we don’t want to refresh the browser all the time, do we? I didn’t think so. That’s where LiveReload comes in. Currently the most recent version for Windows is 0.7 Alpha. After running the installer, we want to add the assets/stylesheets directory to be watched. Click the plus button to add the directory. While LiveReload claims to be able to automatically compile SASS, etc., the one time I tried it the app crashed, so I gave up. Since we already have Compass watching the stylesheets directory, I just monitor that with LiveReload.</p>
<p>There are two ways to get the changes to automatically appear in the browser. The first is by adding a snippet of JavaScript to your page, but I prefer the browser extensions. The JavaScript snippet is handy when testing mobile browsers (e.g. iPad, iPhone), though.</p>
<h2>LiveReload Browser Extension</h2>
<p>Since I’m using Chrome, I just downloaded the browser extension from the Chrome Web Store. Since we’re testing local files, you’ll need to go to Settings, Extensions, and find the checkbox to allow local URLs.</p>
<p>Now that everything is set up, navigate to your index.html file, click the LiveReload menu icon in Chrome to connect the the LiveReload app, and make a change in screen.scss. Upon save you will see your changes automatically appear in your browser.</p>
https://www.thisoneplace.com/2013/02/18/getting-email-to-omnifocusGetting Email to OmniFocus2013-02-18T15:08:42-06:002013-02-18T16:17:49-06:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>I have really been having good luck using <a href="http://www.omnigroup.com/products/omnifocus/">OmniFocus</a> and <a href="http://www.amazon.com/gp/product/0142000280/ref=as_li_ss_tl?ie=UTF8&camp=1789&creative=390957&creativeASIN=0142000280&linkCode=as2&tag=thisoneplacec-20">Getting Things Done</a><img src="http://www.assoc-amazon.com/e/ir?t=thisoneplacec-20&l=as2&o=1&a=0142000280" width="1" height="1" alt="" style="border:none !important; margin:0px !important;" />
to keep my life in order. One thing I like that OmniFocus provides out of the box is a way to automatically process email sent to a specific address and add it to OmniFocus. I have even provided this address to family and friends so they can automatically add tasks for me to review. Whether or not you want others to have this ability is a different question.</p>
<p>However, sometimes there are emails that I want added to my OmniFocus Inbox that come from other places, and I was not able to find an easy way to do that. I really had few requirements:</p>
<ul>
<li>The subject was used as the task name.</li>
<li>The note contained a link to the original email message.</li>
<li>The message would be moved to my “Archive” folder.</li>
</ul>
<p>I could have chosen to include the contents of the message in the note field, but a link seemed easier because there could be attachments, long signatures, an entire thread, etc. <a href="https://github.com/nlindley/mail-to-omnifocus">My solution</a> was to create a service in Automator that uses a simple AppleScript.</p>
<p>The quickest way to get going is to clone the script into <code>~/Library/Services</code>:</p>
<div class="highlight"><pre><code class="language-bash" data-lang="bash"><span></span>git clone https://github.com/nlindley/mail-to-omnifocus.git ~/Library/Services/Send<span class="se">\ </span>to<span class="se">\ </span>OmniFocus<span class="se">\ </span>and<span class="se">\ </span>Archive.workflow
</code></pre></div>
<p>You can then highlight the messages in Mail that you would like to send to OmniFocus, click on <code>Mail</code> in the top-left of the system menu, go to Services, and click <code>Send to OmniFocus and Archive</code>. Since I don’t like using a mouse much of the time, I created a keyboard shortcut in System Preferences.</p>
<p>The entirety of the AppleScript is below.</p>
<div class="highlight"><pre><code class="language-applescript" data-lang="applescript"><span></span><span class="k">on</span> <span class="nb">run</span> <span class="p">{</span><span class="nv">input</span><span class="p">,</span> <span class="nv">parameters</span><span class="p">}</span>
<span class="k">tell</span> <span class="nb">application</span> <span class="s2">"Mail"</span>
<span class="k">set</span> <span class="nv">theSelection</span> <span class="k">to</span> <span class="nv">selection</span>
<span class="k">set</span> <span class="nv">DestinationFolderName</span> <span class="k">to</span> <span class="s2">"Archive"</span>
<span class="k">repeat</span> <span class="nv">with</span> <span class="nv">theMessage</span> <span class="k">in</span> <span class="nv">theSelection</span>
<span class="k">set</span> <span class="nv">theSubject</span> <span class="k">to</span> <span class="nb">the</span> <span class="nv">subject</span> <span class="k">of</span> <span class="nv">theMessage</span>
<span class="k">set</span> <span class="nv">theURL</span> <span class="k">to</span> <span class="s2">"message://%3c"</span> <span class="o">&</span> <span class="nv">theMessage</span>'s <span class="nv">message</span> <span class="na">id</span> <span class="o">&</span> <span class="s2">"%3e"</span>
<span class="k">tell</span> <span class="nb">application</span> <span class="s2">"OmniFocus"</span> <span class="k">to</span> <span class="k">tell</span> <span class="nv">default</span> <span class="na">document</span>
<span class="nb">make</span> <span class="nb">new</span> <span class="nv">inbox</span> <span class="nv">task</span> <span class="nv">with</span> <span class="na">properties</span> <span class="p">{</span><span class="na">name</span><span class="p">:</span><span class="nv">theSubject</span><span class="p">,</span> <span class="nv">note</span><span class="p">:</span><span class="nv">theURL</span><span class="p">}</span>
<span class="k">end</span> <span class="k">tell</span>
<span class="k">set</span> <span class="nv">theAccount</span> <span class="k">to</span> <span class="nv">account</span> <span class="k">of</span> <span class="nv">mailbox</span> <span class="k">of</span> <span class="nv">theMessage</span>
<span class="k">if</span> <span class="na">name</span> <span class="k">of</span> <span class="nb">every</span> <span class="nv">mailbox</span> <span class="k">of</span> <span class="nv">theAccount</span> <span class="ow">contains</span> <span class="nv">DestinationFolderName</span> <span class="k">then</span>
<span class="k">set</span> <span class="nv">archiveFolder</span> <span class="k">to</span> <span class="nv">mailbox</span> <span class="nv">DestinationFolderName</span> <span class="k">of</span> <span class="nv">theAccount</span>
<span class="nv">move</span> <span class="nv">theMessage</span> <span class="k">to</span> <span class="nv">archiveFolder</span>
<span class="k">end</span> <span class="k">if</span>
<span class="k">end</span> <span class="k">repeat</span>
<span class="k">end</span> <span class="k">tell</span>
<span class="no">return</span> <span class="nv">input</span>
<span class="k">end</span> <span class="nb">run</span>
</code></pre></div>https://www.thisoneplace.com/2013/02/09/strengthsfinder-2-0-resultsStrengthsFinder 2.0 Results2013-02-09T20:53:17-06:002013-02-09T20:59:45-06:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>Per my friend <a href="https://twitter.com/JohnCarmack" title="@JohnCarmack on Twitter">John Carmack</a>’s suggestion, I took the <a href="http://www.amazon.com/gp/product/159562015X/ref=as_li_ss_tl?ie=UTF8&camp=1789&creative=390957&creativeASIN=159562015X&linkCode=as2&tag=thisoneplacec-20">StrengthsFinder 2.0</a><img src="http://www.assoc-amazon.com/e/ir?t=thisoneplacec-20&l=as2&o=1&a=159562015X" width="1" height="1" alt="" style="border:none !important; margin:0px !important;" /> assessment. While I don’t take results such as these or a <a href="http://en.wikipedia.org/wiki/Myers-Briggs_Type_Indicator">Myers-Briggs Type Indicator</a> to be scientific fact, I think they are generally backed by some useful observations.</p>
<p>What I like about this approach is the way it focuses on individuals’ natural talents and seems more positive than dwelling on the deficiencies. It seems if this was a more common approach, we could better specialize and coordinate our efforts in more effective ways.</p>
<p>Of the 34 themes presented, the survey presents your “Top 5” with some suggestions of how to better harness your natural tendencies. My “Top 5” are:</p>
<ul>
<li>Ideation</li>
<li>Analytical</li>
<li>Individualization</li>
<li>Intellection</li>
<li>Deliberate</li>
</ul>
<p>Yes, you do have to buy the book to get access to the online assessment, but it’s not terribly expensive or time-consuming. If you decide to take it, I’d be interested in hearing your results.</p>
https://www.thisoneplace.com/2012/12/06/why-apple-offers-emailWhy Apple Offers Email2012-12-06T20:32:04-06:002012-12-06T20:32:04-06:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>Email always felt like an awkward offering for Apple. I never had the need for a .Mac account, although I did sign up for their MobileMe service for some of the syncing features. Now that iCloud feels like a service that is intended for developers to leverage and users to enjoy, why would they keep email around?</p>
<p>It wasn’t until reading a comment on an article on <a href="http://www.loopinsight.com">The Loop</a> – I can’t remember which one – that it hit me. Novices.</p>
<p>The commenter had mentioned how his grandmother never had emailed or used a computer in any meaningful way for communication before the iPad, and now she sends email all the time. Granted this commenter on The Loop is likely to have enough expertise to set up a GMail account for his grandmother, go to Settings, and enter her credentials, but not everybody in the Apple Store looking for an iPad is going to be relying on a tech-savvy relative. They might rely on a Genius, but what if they just take it home?</p>
<p>This is where the user experience comes in. The wizard you go through as a new user asks you a few questions, one of which is whether or not you have an Apple ID. No? No problem; let’s set one up. Would like to use iCloud? Yes? OK, you’re ready to start sending email.</p>
<p>Now there is no reason to open Safari to look for an email provider, fumble around with settings, or call your nephew. You’re done.</p>
https://www.thisoneplace.com/2012/09/25/apps-on-my-iphone-5-that-still-aren-t-updatedApps on My iPhone 5 That Still Aren’t Updated2012-09-25T14:27:55-05:002013-03-23T20:03:43-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>This is a list of the software I currently have on my iPhone. It is not every program I have ever had, but just the ones that have managed to stick around. As these are updated, I will strike them out. There are a couple of things to note: First, Sparrow will probably never get updated since they were acquired by Google, and, if that’s the case, I will likely switch back to the built-in Mail app. Second, Dragon Dictation was originally on the list, but I removed the app since Siri does a better job for what I do. Finally, of all the apps from Apple, the only one that still does not take advantage of the full screen is the Apple Store.</p>
<p>While I would guess most of these will get updates within the next couple of weeks, I am disappointed some were not ready on the first day, such as Netflix – although given Netflix’s track record, I’m hardly surprised. <s>I wish they would quit dicking around with their iOS apps and outsource its development to a talented iOS shop.</s></p>
<p><strong>Update:</strong> I guess I haven’t used Netflix’s iPhone app in a while, but it has gotten much better, and they managed to ship an update pretty quickly after the release of iOS 6.</p>
<p><strong>Update 2:</strong> It’s been two weeks, and only 10 out of 39 have been updated, so it appears my guess was wrong.</p>
<ul>
<li><s>Atomic Web Browser</s> <em>10/9</em></li>
<li><s>1Password</s> <em>10/1</em></li>
<li>Pastebot</li>
<li>Calcbot</li>
<li><s>Sparrow</s> <em>11/21</em></li>
<li><s>Skype</s> <em>11/13</em></li>
<li>FourTrack</li>
<li><s>5by5 Radio</s> <em>9/26</em></li>
<li><s>TuneIn Radio</s> <em>10/29</em></li>
<li><s>iTablaPro</s> <em>10/31</em></li>
<li>iStroboSoft</li>
<li>Dr. Betotte</li>
<li><s>YouTube</s> <em>12/4</em></li>
<li><s>Dropbox</s> <em>10/22</em></li>
<li><s>Wolfram Alpha</s> <em>10/10</em></li>
<li><s>Amazon</s> <em>9/28</em></li>
<li>MidFirst</li>
<li><s>Hipstamatic</s> <em>10/4</em></li>
<li><s>Instagram</s> <em>9/26</em></li>
<li><s>Snapseed</s> <em>10/10</em></li>
<li><s>Photosynth</s> <em>11/12</em></li>
<li><s>Photoshop Express</s> <em>11/21</em></li>
<li><s>LiveSketch</s> <em>10/8</em></li>
<li><s>Netflix</s> <em>9/27</em></li>
<li><s>DirecTV</s> <em>10/23</em></li>
<li>Dwolla</li>
<li><s>Southwest</s> <em>12/13</em></li>
<li><s>Newegg</s> <em>11/16</em></li>
<li><s>Flixster</s> <em>10/2</em></li>
<li><s>ESPN ScoreCenter</s> <em>12/19</em></li>
<li><s>YouVersion Bible</s> <em>3/11/13</em></li>
<li><s>Bump</s> <em>10/26</em></li>
<li><s>American Airlines</s> <em>10/3</em></li>
<li><s>Momento</s> <em>10/8</em></li>
<li><s>Wikibot</s> <em>10/1</em></li>
<li><s>Apple Store</s> <em>10/5</em></li>
<li><s>eBay</s> <em>11/12</em></li>
<li><s>Rackspace (and it crashes)</s> <em>12/6</em></li>
<li><s>Speed Test</s> <em>3/21/13</em></li>
</ul>
https://www.thisoneplace.com/2012/09/17/my-desktop-as-a-reminderMy Desktop as a Reminder2012-09-17T23:43:30-05:002013-05-30T10:29:03-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>I have a tendency to take on too many projects because they all sound interesting at first – or at least like there might be some money involved. I made this background as a reminder that it’s OK to say “no” to work.</p>
<p><a href="https://cdn.thisoneplace.com/NO.png" title="Click for the full-resolution version"><img src="https://cdn.thisoneplace.com/no-thumb.png" alt="NO Background Thumbnail"></a></p>
https://www.thisoneplace.com/2012/09/11/home-screen-cleanupHome Screen Cleanup2012-09-11T01:21:12-05:002012-12-05T16:52:04-06:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>I was getting tired of all the home screens and folders on my iPhone, so I decided to take a little time and tidy things up. I am down to five screens and only two folders on the last screen to hold all the miscellany. (Technically there are three folders if you count Newsstand.) If you have suggestions of other apps I should try out, please ping me on one of the social networks.</p>
<p><a href="https://cdn.thisoneplace.com/home-screens.png" title="Click for the full-resolution version"><img src="https://cdn.thisoneplace.com/home-screens-thumb.png" alt="Home Screens Thumbnail"></a></p>
https://www.thisoneplace.com/2012/09/03/classical-liberalism-and-intelligenceClassical Liberalism and Intelligence2012-09-03T01:35:25-05:002012-09-03T01:35:25-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<blockquote>
<p>Now we get to a finding that sounds more tendentious than it is: smarter people are more liberal. […]</p>
<p>[…] But the key qualification is that the escalator of reason predicts only that intelligence should be correlated with <em>classical</em> liberalism, which values the autonomy and well-being of individuals over the constraints of tribe, authority, and tradition. Intelligence is expected to correlate with classical liberalism because classical liberalism is itself a consequence of the interchangeability of perspectives that is inherent to reason itself. Intelligence need not correlate with other ideologies that get lumped into contemporary left-of-center political coalitions, such as populism, socialism, political correctness, identity politics, and the Green movement.</p>
</blockquote>
<p>This excerpt is from <a href="http://www.amazon.com/gp/product/0670022950/ref=as_li_ss_tl?ie=UTF8&camp=1789&creative=390957&creativeASIN=0670022950&linkCode=as2&tag=thisoneplacec-20" title="Buy this on Amazon">The Better Angels of Our Nature: Why Violence Has Declined</a> by Steven Pinker (page 662 in the hardcover, if you’re curious). I still have quite a lot left to read, but so far I’m finding it pretty interesting.</p>
<p>This passage also demonstrates why I try to be careful about specifying <em>classical</em> liberal and refer to the modern conception of the term as “left.” Even Pinker is careful to specify what he means the few times it’s mentioned.</p>
https://www.thisoneplace.com/2012/08/31/maths-of-different-mindsMaths of Different Minds2012-08-31T13:40:08-05:002012-08-31T13:40:08-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>I nearly reposted a Facebook article that had one of those pixelated JPEGs (if you’re going to use an image, <em>at least</em> use a PNG) with some text on it which managed to solicit thousands of responses. The reason I wanted to repost it was not because I thought it was clever or witty or fun, but because I couldn’t believe how many people in the comments got the answer wrong. To the best of my memory, the image read:</p>
<blockquote>
<p>6 − 1 × 0 + 2 ÷ 2</p>
<p>ANSWER IT</p>
</blockquote>
<p>One commenter thought this was a trick question, so she was trying to answer “IT” and got a solution of “e”. I still haven’t figured that out, but based on the number of incorrect responses, just evaluating the expression was enough of a challenge with no tricks involved. Now, since this is apparently a challenging question, I will go ahead and tell you the answer is 7. Not 1, not 5, not 3.5, not −1, but 7. Positive 7.</p>
<p>What people forget is order of operations, and this is only part of what bothers me. So, this got me thinking, “What should high school graduates be expected to do?” In my mind they should be able to evaluate simple expressions, solve simple equations for a single variable, deal with fractions – you know, basic math. I do not expect the majority of people to remember how to do trigonometry, solve systems of equations, or understand calculus, but is it too much to expect somebody to be able to solve for 𝒙? Is it too much to evaluate the above expression?</p>
<p>Initially this is what bothered me. If I were to be generous, maybe one person out of five got the correct answer. But what troubled me more is that the commenters didn’t seem bothered by getting the wrong answer. It didn’t appear they read through the previous comments and saw other answers that conflicted. They didn’t seem to notice the comment from the math teacher explaining exactly how to evaluate the expression. They just put their (wrong) answers and went about their lives. Some were even quite sure their incorrect answers were not.</p>
<p>But there was one other comment that really made me realize there are people who think in a way that makes no sense to me; one person answered it in two different ways. This person said if you do it <em>this way</em>, you’ll get <em>this answer</em>, but if you do it <em>that way</em>, you’ll get <em>that answer</em>, as though there were two ways to look at the same problem.</p>
<p>This is math, people! There are not two acceptable ways to evaluate the expression!</p>
<p>Since shortly after starting algebra, I’ve been of the mind that the biggest key to understanding basic algebra is a fundamental understanding of the equals sign, and demonstrations such as this make me wonder how many people don’t actually understand rudimentary mathematics and its language.</p>
https://www.thisoneplace.com/2012/08/21/an-open-letter-to-the-administrators-of-prague-high-schoolAn Open Letter to the Administrators of Prague High School2012-08-21T15:23:25-05:002012-08-21T15:23:25-05:00Nicholas Lindleyhttps://www.thisoneplace.comme@thisoneplace.com<p>Dear administrators,</p>
<p>Stop being petty.</p>
<p>Sincerely,</p>
<p>Nicholas Lindley</p>