<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0"><channel><title>Sean Coates is available for work</title><link>https://seancoates.com/blogs</link><description/><item><title>Orval in Dorval</title><link>https://seancoates.com/blogs/orval-in-dorval</link><guid>https://seancoates.com/blogs/orval-in-dorval</guid><pubDate>Thu, 16 Oct 2025 17:41:22 -0400</pubDate><description>&lt;p&gt;Short note on here to point at another project I&amp;rsquo;ve just published:&lt;/p&gt;
&lt;h3 id="orval-in-dorval-2024"&gt;
&lt;a href="https://orval.info/2024"&gt;Orval in Dorval 2024&lt;/a&gt;
&lt;/h3&gt;
&lt;img src="https://files.scoat.es/YeAJCsZcop.png" alt="empty bottles of 14 years and some strays from the tasting"/&gt;
&lt;p&gt;I&amp;rsquo;ve been collecting a case of Orval (the Belgian Trappist beer) every year since 2010. In 2024, eight of us got together at my place to taste my 14 year vertical. (I have 16 years now.)&lt;/p&gt;
&lt;p&gt;I made us all take notes. The linked site is the data output from that night, and it might be the biggest trove of Orval tasting information on the whole web. (There are some photos, too.)&lt;/p&gt;</description></item><item><title>Studioworks</title><link>https://seancoates.com/blogs/studioworks</link><guid>https://seancoates.com/blogs/studioworks</guid><pubDate>Thu, 09 Oct 2025 10:30:00 -0400</pubDate><description>&lt;p&gt;Yesterday, we launched &lt;a href="https://studioworks.app"&gt;Studioworks&lt;/a&gt;, the platform that I (and &lt;a href="https://nicksloan.com"&gt;Nick&lt;/a&gt;, and &lt;a href="https://shiflett.org/"&gt;Chris&lt;/a&gt;, and &lt;a href="https://jessicahische.is"&gt;Jessica&lt;/a&gt;) have been working on all year.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s a lot more to what Studioworks &lt;em&gt;will&lt;/em&gt; be, but for right now, it&amp;rsquo;s primarily a platform that lets creative people send really nice invoices in the easiest way we could manage. Our early (&amp;ldquo;founding member&amp;rdquo;) beta users seem to love it, and I&amp;rsquo;m really proud of what we&amp;rsquo;ve built.&lt;/p&gt;
&lt;p&gt;I intend to write more about some of the technology we&amp;rsquo;re using, but &lt;a href="https://nicksloan.com/posts/swift-for-the-web/"&gt;Nick already shared&lt;/a&gt; some of this; you should definitely read that if you haven&amp;rsquo;t.&lt;/p&gt;</description></item><item><title>Vendor Security</title><link>https://seancoates.com/blogs/vendor-security</link><guid>https://seancoates.com/blogs/vendor-security</guid><pubDate>Mon, 13 May 2024 10:00:00 -0400</pubDate><description>&lt;p&gt;A few weeks ago I had to have a conversation with a vendor about credentials. Despite some push back from our side, they insisted that their Bearer Token style authentication key for HTTP requests was safe from MitM + Replay attacks. The token was to be used from a user&amp;rsquo;s device (their phone). They claimed it must be safe because the API access that uses this token is protected by HTTPS/TLS/SSL. In short: yes it&amp;rsquo;s protected from external snooping, but &lt;a href="https://prezi.com/iqwzy66rn3uo/inspect-https-with-your-own-man-in-the-middle-non-attacks/"&gt;it&amp;rsquo;s not safe&lt;/a&gt; unless you fully trust all of your users and their devices, which you should not. (aside: that talk was from 2015? that&amp;rsquo;s surprising).&lt;/p&gt;</description></item><item><title>Matter and Privacy</title><link>https://seancoates.com/blogs/matter-and-privacy</link><guid>https://seancoates.com/blogs/matter-and-privacy</guid><pubDate>Thu, 28 Mar 2024 12:30:00 -0400</pubDate><description>&lt;blockquote&gt;
As of October 1, 2024, I've stepped away from my role as VP of Technology at Matter. This means that I can no longer personally vouch for the privacy aspects of the app.&lt;br /&gt;
&lt;br /&gt;
&lt;/blockquote&gt;
&lt;p&gt;When I was still working at &lt;a href="https://faculty.com/"&gt;Faculty&lt;/a&gt;, we took on a new client that was not yet named &lt;a href="https://matter.xyz/"&gt;Matter&lt;/a&gt;. We eventually transitioned from an agency-client relationship to a startup relationship, where I became the VP of Technology. This is what I&amp;rsquo;ve been doing for the past two-ish years.&lt;/p&gt;</description></item><item><title>Exists is the enemy of good</title><link>https://seancoates.com/blogs/exists-is-the-enemy-of-good</link><guid>https://seancoates.com/blogs/exists-is-the-enemy-of-good</guid><pubDate>Tue, 13 Feb 2024 10:15:00 -0400</pubDate><description>&lt;p&gt;We&amp;rsquo;ve all heard the adage &amp;ldquo;&lt;em&gt;perfect is the enemy of good.&lt;/em&gt;&amp;rdquo; I take this to mean: if you only accept &lt;em&gt;perfect&lt;/em&gt;, you might miss a &lt;em&gt;good-enough&lt;/em&gt; solution. I still try to strive for perfect, but have learned to accept that &lt;em&gt;good&lt;/em&gt; might be sometimes enough.&lt;/p&gt;
&lt;p&gt;However, I&amp;rsquo;ve been saying something to friends and colleagues—for probably a decade now—that is closely related: &lt;em&gt;exists is the enemy of good&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;This idea is pretty simple, in principle: sometimes we miss a &lt;em&gt;good-enough&lt;/em&gt; solution because a &lt;em&gt;not-quite-good-enough&lt;/em&gt; solution is already out there and in use.&lt;/p&gt;</description></item><item><title>A Secret Career Code</title><link>https://seancoates.com/blogs/a-secret-career-code</link><guid>https://seancoates.com/blogs/a-secret-career-code</guid><pubDate>Sat, 01 Apr 2023 11:15:00 -0400</pubDate><description>&lt;h3 id="or-how-25-years-ago-i-went-viral-and-met-king-prince-charles"&gt;
or: How, 25 years ago, I went viral and met King (Prince) Charles
&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Someone&lt;/em&gt; has been paying me to work on technology stuff for over 20 years, now. And there’s &lt;em&gt;one weird trick&lt;/em&gt; that I’ve learned that I think it’s worth passing on.&lt;/p&gt;
&lt;p&gt;This isn’t really a &lt;a href="https://scoat.es/@sean/110109335198764391"&gt;secret code&lt;/a&gt; (and the &lt;em&gt;one weird trick&lt;/em&gt; bit is a joke, of course), but it was so non-obvious to me in my early career, and it’s so valuable to me in my mid career that I wanted to share it—and also tell the story about &lt;em&gt;going viral&lt;/em&gt; before anyone would have ever called it &lt;em&gt;going viral&lt;/em&gt;.&lt;/p&gt;</description></item><item><title>Modified Microphone</title><link>https://seancoates.com/blogs/modified-microphone</link><guid>https://seancoates.com/blogs/modified-microphone</guid><pubDate>Fri, 18 Feb 2022 10:00:00 -0500</pubDate><description>&lt;p&gt;I&amp;rsquo;ve owned a &lt;a href="https://www.bluemic.com/en-ca/products/yeti/"&gt;Blue Yeti microphone&lt;/a&gt; for a little over five years, now. It&amp;rsquo;s a pretty decent microphone for video calls, and I really like that it has its own audio interface for (pass-through) earphones, and a dedicated hardware mute feature. I&amp;rsquo;ve used it on probably 1500 calls, with only one complaint: the mute button makes noise.&lt;/p&gt;
&lt;p&gt;For most of that five years, my colleagues could usually tell when I wanted into the conversation because the mute button has a satisfying ka-chunk tactile feedback that—unfortunately—transfers vibration into the thing to which it is attached, and that thing is a highly-sensitive vibration transducing machine… a microphone!&lt;/p&gt;</description></item><item><title>A USB Mystery</title><link>https://seancoates.com/blogs/a-usb-mystery</link><guid>https://seancoates.com/blogs/a-usb-mystery</guid><pubDate>Tue, 25 Jan 2022 09:30:00 -0500</pubDate><description>&lt;blockquote&gt;
&lt;p&gt;TL;DR: got some hardware that didn&amp;rsquo;t have a driver I could use. Dived into some packet captures, learned some USB, wrote some code.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;I&amp;rsquo;ve been &lt;a href="https://twitter.com/coates/status/1483887251151065088"&gt;on a mini quest&lt;/a&gt; to &lt;a href="https://seancoates.com/blogs/internet-optional-things"&gt;instrument&lt;/a&gt; a bunch of real-life things, lately.&lt;/p&gt;
&lt;p&gt;One thing that&amp;rsquo;s been on my mind is &amp;ldquo;noise&amp;rdquo; around my house. So, after a very &lt;a href="http://www.swblabs.com/article/pi-soundmeter"&gt;small amount of research&lt;/a&gt;, I bought a &lt;a href="https://www.amazon.ca/Professional-Backlight-Accuracy-Measuring-30dB-130dB/dp/B01MZ0IUGY/"&gt;cheap USB Sound Pressure Level (&amp;ldquo;SPL&amp;rdquo;) meter&lt;/a&gt;. (I accidentally bought the nearly-same model that was USB-&lt;em&gt;powered&lt;/em&gt; only (it had no actual USB connection), before returning it for this one, so be careful if you happen to find yourself on this path.) Why not use a regular microphone attached to a regular sound device? Calibration.&lt;/p&gt;</description></item><item><title>IoT: Internet-Optional Things</title><link>https://seancoates.com/blogs/internet-optional-things</link><guid>https://seancoates.com/blogs/internet-optional-things</guid><pubDate>Mon, 04 Jan 2021 10:15:00 -0500</pubDate><description>&lt;p&gt;I both love and &lt;a href="https://twitter.com/internetofshit"&gt;hate&lt;/a&gt; the idea of &amp;ldquo;smart&amp;rdquo; devices in my home. It&amp;rsquo;s tough to balance the convenience of being able to turn lights on and off automatically, and adjust thermostats with my phone, with the risk that all of my devices are &lt;a href="https://www.ckd3.com/blog/2019/6/6/attack-of-the-light-bulbs"&gt;doing&lt;/a&gt; &lt;a href="https://www.bbc.com/news/technology-25780908"&gt;evil&lt;/a&gt; &lt;a href="https://en.wikipedia.org/wiki/Mirai_(malware)"&gt;things&lt;/a&gt; to my fellow Internet citizens. But, I think I&amp;rsquo;ve landed on a compromise that works.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve had Internet-connected devices for a long time now. I&amp;rsquo;ve even &lt;a href="https://www.uchobby.com/index.php/2007/10/08/arduino-beer-thermostat/"&gt;built devices&lt;/a&gt; that can go online. At some point a year or two ago, I realized that I could &lt;em&gt;do better&lt;/em&gt; than what I had. Here&amp;rsquo;s a loose list of requirements I made up for my own &amp;ldquo;&lt;abbr title="Internet of Things"&gt;IoT&lt;/abbr&gt;&amp;rdquo; setup at home:&lt;/p&gt;</description></item><item><title>Did it now</title><link>https://seancoates.com/blogs/did-it-now</link><guid>https://seancoates.com/blogs/did-it-now</guid><pubDate>Sun, 03 Jan 2021 13:00:00 -0500</pubDate><description>&lt;blockquote&gt;
&lt;p&gt;I originally wrote this one to &lt;a href="https://www.reddit.com/r/MaliciousCompliance/comments/jyxyjx/did_it_now/"&gt;publish on Reddit&lt;/a&gt;, but also didn&amp;rsquo;t want to lose it.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Many many years ago, I worked at a company in Canada that ran some financial services.&lt;/p&gt;
&lt;p&gt;The owner was the kind of guy who drove race cars on weekends, and on weekdays would come into the programmers&amp;rsquo; room to complain that our fingers weren&amp;rsquo;t typing fast enough.&lt;/p&gt;
&lt;p&gt;On a particularly panicky day, one of the web servers in the pool that served our app became unresponsive. We had these servers hosted in a managed rack at a hosting provider offsite. After several hours of trying to bring it back, our hosting partner admitted defeat and declared that they couldn&amp;rsquo;t revive &lt;code&gt;WEB02&lt;/code&gt;. It had a hardware failure of some sort. We only had a few servers back then, and they were named according to their roles in our infrastructure: &lt;code&gt;WEB01&lt;/code&gt;, &lt;code&gt;WEB02&lt;/code&gt;, &lt;code&gt;CRON01&lt;/code&gt;, &lt;code&gt;DB03&lt;/code&gt;, etc.&lt;/p&gt;</description></item><item><title>Cache-Forever Assets</title><link>https://seancoates.com/blogs/cache-forever-assets</link><guid>https://seancoates.com/blogs/cache-forever-assets</guid><pubDate>Sun, 03 Jan 2021 10:00:00 -0500</pubDate><description>&lt;blockquote&gt;
&lt;p&gt;I originally &lt;a href="https://calendar.perfplanet.com/2020/cache-forever-assets/"&gt;wrote this to help Stoyan out with Web Performance Calendar&lt;/a&gt;; republishing here.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;A long time ago, we had a client with a performance problem. Their entire web app was slow. The situation with this client&amp;rsquo;s app was a bit tricky; this client was a team within a very large company, and often—in my experience, anyway—large companies mean that there are a lot of different people/teams who exert control over deployed apps and there&amp;rsquo;s a lot of bureaucracy in order to get anything done.&lt;/p&gt;</description></item><item><title>How I helped fix Canadaʼs COVID Alert app</title><link>https://seancoates.com/blogs/how-i-helped-fix-canadas-covid-alert-app</link><guid>https://seancoates.com/blogs/how-i-helped-fix-canadas-covid-alert-app</guid><pubDate>Mon, 24 Aug 2020 12:00:00 -0400</pubDate><description>&lt;p&gt;&lt;a href="https://pm.gc.ca/en/news/news-releases/2020/07/31/new-mobile-app-help-notify-canadians-potential-covid-19-exposure-now"&gt;On July 31st&lt;/a&gt;, Canada&amp;rsquo;s &lt;a href="https://www.canada.ca/en/public-health/services/diseases/coronavirus-disease-covid-19/covid-alert.html"&gt;COVID Alert&lt;/a&gt; app was made available for general use, though it does not have support for actually &lt;em&gt;reporting&lt;/em&gt; a diagnosis in most provinces, yet.&lt;/p&gt;
&lt;p&gt;In Quebec, we can run the tracing part of the app, and if diagnosis codes become available here, the app can retroactively report contact. It uses the tracing mechanism that &lt;a href="https://covid19.apple.com/contacttracing"&gt;Google and Apple created together&lt;/a&gt;, and in my opinion—at least for now—Canadians should be running this thing to help us all deal with COVID-19. I won&amp;rsquo;t run it forever, but for now, it seems to me that the benefits outweigh the &amp;ldquo;government can track me&amp;rdquo; fear (it&amp;rsquo;s not actually tracking you; it doesn&amp;rsquo;t even know who you are), and it&amp;rsquo;s enabled on my phone.&lt;/p&gt;</description></item><item><title>New Site (same as old site)</title><link>https://seancoates.com/blogs/new-site-same-as-old-site</link><guid>https://seancoates.com/blogs/new-site-same-as-old-site</guid><pubDate>Thu, 20 Aug 2020 23:00:00 -0400</pubDate><description>&lt;p&gt;You&amp;rsquo;re looking at the new &lt;a href="https://seancoates.com/"&gt;seancoates.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;ldquo;I&amp;rsquo;m going to pay attention to my blog&amp;rdquo;&lt;/em&gt; posts on blogs are… &lt;em&gt;passé&lt;/em&gt;, but…&lt;/p&gt;
&lt;p&gt;I moved this site to a static site generator a few years ago when I had to move some server stuff around, and had let it decay. I spent most of the past week of evenings and weekend updating to what you see now.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s still built on &lt;a href="https://getnikola.com/"&gt;Nikola&lt;/a&gt;, but now the current version.&lt;/p&gt;</description></item><item><title>Faculty</title><link>https://seancoates.com/blogs/faculty</link><guid>https://seancoates.com/blogs/faculty</guid><pubDate>Mon, 22 Jan 2018 11:30:00 -0500</pubDate><description>&lt;p&gt;Officially, as of the start of the year, I&amp;rsquo;ve joined &lt;a href="https://faculty.com/"&gt;Faculty&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Faculty is not just new to me, but something altogether new. It&amp;rsquo;s also something that feels older than it is. The familiar, experienced kind of &lt;em&gt;old&lt;/em&gt;. The good kind. The kind I like.&lt;/p&gt;
&lt;p&gt;It was founded by my good friend and long-term colleague &lt;a href="http://shiflett.org/"&gt;Chris Shiflett&lt;/a&gt;, whom I&amp;rsquo;m very happy to be working with, directly, again.&lt;/p&gt;
&lt;p&gt;People often ask us how long we&amp;rsquo;ve worked together, and the best answer I can come up with is &amp;ldquo;around 15 years&amp;rdquo;—nearly all of the mature part of my career. Since the early 2000s, Chris and I have attended and spoken at conferences together, he wrote a column for PHP Architect under my watch as the Editor-in-Chief, I worked on Chris&amp;rsquo;s team at OmniTI, we ran &lt;a href="http://webadvent.org/"&gt;Web Advent&lt;/a&gt; together, and we worked collaboratively at Fictive Kin.&lt;/p&gt;</description></item><item><title>Shortbread</title><link>https://seancoates.com/blogs/shortbread</link><guid>https://seancoates.com/blogs/shortbread</guid><pubDate>Fri, 01 Dec 2017 12:00:00 -0500</pubDate><description>&lt;p&gt;December 1st. Shortbread season begins today.&lt;/p&gt;
&lt;p&gt;(Here&amp;rsquo;s something a little different for long-time blog readers.)&lt;/p&gt;
&lt;p&gt;Four years ago, in December, I made dozens and dozens of batches of shortbread, slowly tweaking my recipe, batch after batch. By Christmas, that year, I had what I consider (everyone&amp;rsquo;s tastes are different) the perfect ratio of flour/butter/sugar/salt, and exactly the right texture: dense, crisp, substantial, and short—not fluffy and light like whipped/cornstarch shortbread, and not crumbly like Walkers.&lt;/p&gt;</description></item><item><title>API Gateway timeout workaround</title><link>https://seancoates.com/blogs/api-gateway-timeout-workaround</link><guid>https://seancoates.com/blogs/api-gateway-timeout-workaround</guid><pubDate>Fri, 22 Sep 2017 10:00:00 -0400</pubDate><description>&lt;p&gt;The last of the four (see &lt;a href="https://seancoates.com/blogs/api-gateway-limitations"&gt;previous&lt;/a&gt; &lt;a href="https://seancoates.com/blogs/lambda-payload-size-workaround"&gt;posts&lt;/a&gt;) big API Gateway limitations is the &lt;a href="http://docs.aws.amazon.com/apigateway/latest/developerguide/limits.html"&gt;30 second integration timeout&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This means that API Gateway will give up on trying to serve your request to the client after 30 seconds—even though Lambda has a &lt;a href="http://docs.aws.amazon.com/lambda/latest/dg/limits.html"&gt;300 second limit&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In my opinion, this is a reasonable limit. No one wants to be waiting around for an API for more than 30 seconds. And if something takes longer than 30s to render, it should probably be batched. &amp;ldquo;Render this for me, and I&amp;rsquo;ll come back for it later. Thanks for the token. I&amp;rsquo;ll use this to retrieve the results.&amp;rdquo;&lt;/p&gt;</description></item><item><title>API Gateway Limitations</title><link>https://seancoates.com/blogs/api-gateway-limitations</link><guid>https://seancoates.com/blogs/api-gateway-limitations</guid><pubDate>Thu, 21 Sep 2017 10:00:00 -0400</pubDate><description>&lt;p&gt;As I&amp;rsquo;ve mentioned a &lt;a href="https://seancoates.com/blogs/zappa/"&gt;couple&lt;/a&gt; &lt;a href="https://seancoates.com/blogs/zappa-and-lambci/"&gt;times&lt;/a&gt; in the past, I&amp;rsquo;ve been working with &lt;a href="https://aws.amazon.com/lambda/"&gt;Lambda&lt;/a&gt; and &lt;a href="https://aws.amazon.com/api-gateway/"&gt;API Gateway&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re using it to host/deploy a big app for a big client, as well as some of the ancillary tooling to support the app (such as testing/builds, scheduling, batch jobs, notifications, authentication services, etc.).&lt;/p&gt;
&lt;p&gt;For the most part, I love it. It&amp;rsquo;s helped evaporate the most boring—and often most difficult—parts of deploying highly-available apps.&lt;/p&gt;
&lt;p&gt;But it&amp;rsquo;s not all sunshine and rainbows. Once the necessary allowances are made for a new architecture (things like: if we have concurrency of 10,000, a runaway process&amp;rsquo;s consequences are amplified, database connection pools are easily exhausted, there&amp;rsquo;s no simple way to use static IP addresses), there are 4 main problems that I&amp;rsquo;ve encountered with serving an app on Lambda and API Gateway.&lt;/p&gt;</description></item><item><title>Lambda payload size workaround</title><link>https://seancoates.com/blogs/lambda-payload-size-workaround</link><guid>https://seancoates.com/blogs/lambda-payload-size-workaround</guid><pubDate>Thu, 21 Sep 2017 10:00:00 -0400</pubDate><description>&lt;p&gt;&lt;a href="https://seancoates.com/blogs/api-gateway-limitations"&gt;Another&lt;/a&gt; of the AWS Lambda + API Gateway limitations is in the size of the response body we can return.&lt;/p&gt;
&lt;p&gt;AWS states that the full &lt;a href="http://docs.aws.amazon.com/apigateway/latest/developerguide/limits.html"&gt;payload size for API Gateway&lt;/a&gt; is 10 MB, and the &lt;a href="http://docs.aws.amazon.com/lambda/latest/dg/limits.html"&gt;request body payload size&lt;/a&gt; is 6 MB in Lambda.&lt;/p&gt;
&lt;p&gt;In practice, I&amp;rsquo;ve found this number to be significantly lower than 6 MB, but perhaps I&amp;rsquo;m just calculating incorrectly.&lt;/p&gt;
&lt;p&gt;Using a &lt;a href="http://flask.pocoo.org/"&gt;Flask&lt;/a&gt; route like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@app.route&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;/giant&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;giant&lt;/span&gt;():
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; payload &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;x&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; int(request&lt;span style="color:#f92672"&gt;.&lt;/span&gt;args&lt;span style="color:#f92672"&gt;.&lt;/span&gt;get(&lt;span style="color:#e6db74"&gt;&amp;#39;size&amp;#39;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;1024&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1024&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;6&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; payload
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;…and calling it with &lt;a href="https://curl.haxx.se/"&gt;curl&lt;/a&gt;, I get the following cutoff:&lt;/p&gt;</description></item><item><title>Zappa</title><link>https://seancoates.com/blogs/zappa</link><guid>https://seancoates.com/blogs/zappa</guid><pubDate>Tue, 25 Apr 2017 16:00:00 -0400</pubDate><description>&lt;p&gt;For the past few months, I&amp;rsquo;ve been focused primarily on a Python project that we&amp;rsquo;re deploying without any servers.&lt;/p&gt;
&lt;p&gt;Well, of course that&amp;rsquo;s not really true, but we&amp;rsquo;re deploying it without any &lt;em&gt;permanent&lt;/em&gt; servers.&lt;/p&gt;
&lt;p&gt;The idea of &amp;ldquo;serverless&amp;rdquo; architecture isn&amp;rsquo;t brand new, anymore, but running serverless applications on the &lt;a href="https://aws.amazon.com/"&gt;AWS infrastructure&lt;/a&gt;—which I&amp;rsquo;ve become very familiar with over the past few years—&lt;em&gt;is&lt;/em&gt; still a pretty new concept.&lt;/p&gt;
&lt;p&gt;AWS &lt;a href="https://aws.amazon.com/lambda/"&gt;Lambda&lt;/a&gt; has been around for a few years, now. It&amp;rsquo;s a platform that allows you to run arbitary code, in response to &lt;em&gt;events&lt;/em&gt;, and &lt;a href="https://aws.amazon.com/lambda/pricing/"&gt;pay only for gigabyte-seconds of RAM time&lt;/a&gt;. This means that someone else (Amazon) manages the servers, networking, storage, etc.&lt;/p&gt;</description></item><item><title>DST pain</title><link>https://seancoates.com/blogs/dst-pain</link><guid>https://seancoates.com/blogs/dst-pain</guid><pubDate>Sat, 11 Mar 2017 10:00:00 -0500</pubDate><description>&lt;p&gt;Tonight, in Montreal (and many other North American cities), we change from Standard Time to Daylight Time.&lt;/p&gt;
&lt;p&gt;I know we programmers complain about date/time math relentlessly, but I thought it was worth sharing this real-life problem that someone asked me about on Reddit this weekend:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It sounds like this is a serious problem that has effected [sic] you on more than one occasion. Story?&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;The simplest complicated scenario is: let&amp;rsquo;s say we have a call scheduled between our team on the east coast of North America and a colleague in the UK at 10AM Montreal time.&lt;/p&gt;</description></item><item><title>Vermont</title><link>https://seancoates.com/blogs/vermont</link><guid>https://seancoates.com/blogs/vermont</guid><pubDate>Wed, 15 Feb 2017 10:30:00 -0500</pubDate><description>&lt;p&gt;I get asked, from time to time, what things I would recommend when visiting Vermont. Here&amp;rsquo;s my list. I&amp;rsquo;ll update it as I learn about new gems.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.google.com/maps/place/Hill+Farmstead+Brewery/@44.6068317,-72.2653128,17z/data=!3m1!4b1!4m5!3m4!1s0x4cb5cee910e16d85:0xf2264cf9c9b3dd65!8m2!3d44.6068317!4d-72.2631241"&gt;Hill Farmstead Brewery&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.google.com/maps/place/Parker+Pie+Company/@44.7287139,-72.2294377,17z/data=!3m1!4b1!4m5!3m4!1s0x4cb5d0ca4170e643:0xaac9b7aa8f415058!8m2!3d44.7287139!4d-72.227249"&gt;Parker Pie&lt;/a&gt; (near HF) for pizza / bottles; they have a great tap list&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.google.com/maps/place/Willey's+True+Value+Hardware/@43.7231964,-73.8653614,8z/data=!4m8!1m2!2m1!1swilly's+store+vermont!3m4!1s0x4cb5c921315706eb:0x27340cff8a17bb71!8m2!3d44.575684!4d-72.295477"&gt;Willy&amp;rsquo;s Store&lt;/a&gt; in Greensboro for HF bottles and Jasper Hill cheeses (Moses Sleeper, Cabot Clothbound, Alpha Tolman, Harbison, … )&lt;/li&gt;
&lt;li&gt;There&amp;rsquo;s a roadside pie shop right outside of &lt;a href="https://www.google.com/maps/place/Elmore+State+Park/@44.5444633,-72.5299498,17z/data=!3m1!4b1!4m5!3m4!1s0x4cb5bf9e5f9f869f:0x972d27a131722020!8m2!3d44.5444633!4d-72.5277611"&gt;Elmore State Park&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.google.com/maps/place/Lost+Nation+Brewing/@44.569989,-72.6054745,17z/data=!3m1!4b1!4m5!3m4!1s0x4cb5ec4a7a21a371:0x33209c1c6fa0541c!8m2!3d44.569989!4d-72.6032858"&gt;Lost Nation&lt;/a&gt; brewery in Morristown (lunch, taps)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.google.com/maps/place/The+Alchemist+Stowe/@44.4762604,-72.7188258,17z/data=!3m1!4b1!4m5!3m4!1s0x4cb59f310599cf73:0xbdaa541e28667677!8m2!3d44.4762604!4d-72.7166371"&gt;The Alchemist&lt;/a&gt; in Stowe (the new place)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.google.com/maps/place/Doc+Ponds/@44.4695005,-72.6896244,17z/data=!3m1!4b1!4m5!3m4!1s0x4cb596f87babd2e7:0xcde675583221319a!8m2!3d44.4695005!4d-72.6874357"&gt;Doc Ponds&lt;/a&gt; in Stowe for eats + good taps + good bottles&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.google.com/maps/place/The+Bench/@44.4720291,-72.6902646,17z/data=!3m1!4b1!4m5!3m4!1s0x4cb596f7847bf4e7:0xe8b2e52169bb8c3a!8m2!3d44.4720291!4d-72.6880759"&gt;The Bench&lt;/a&gt; in Stowe (same)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.google.com/maps/place/Cabot+Annex+Waterbury/@44.3690649,-72.7313965,17z/data=!3m1!4b1!4m5!3m4!1s0x4cb598f149abe8ff:0x57cf179ef24c19de!8m2!3d44.3690649!4d-72.7292078"&gt;Cabot Annex&lt;/a&gt; between Stowe and Waterbury for almost all of the Cabot cheeses + their other products&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.google.com/maps/place/Ben+%26+Jerry's+Factory/@44.351714,-72.7419217,17z/data=!3m1!4b1!4m5!3m4!1s0x4cb59f340264be0b:0xa8e821f7bc0611b1!8m2!3d44.351714!4d-72.739733"&gt;Ben &amp;amp; Jerry&amp;rsquo;s&lt;/a&gt; &amp;lsquo;cause why not?&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.google.com/maps/place/Prohibition+Pig/@44.3371644,-72.7582884,17z/data=!3m1!4b1!4m5!3m4!1s0x4cb59f19d7cbc555:0x9507f573af0c0d66!8m2!3d44.3371644!4d-72.7560997"&gt;Prohibition Pig&lt;/a&gt; in Waterbury for BBQ + great taps and their own beers&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.google.com/maps/place/Craft+Beer+Cellar/@44.3371644,-72.7582884,17z/data=!4m12!1m6!3m5!1s0x4cb59f19d7cbc555:0x9507f573af0c0d66!2sProhibition+Pig!8m2!3d44.3371644!4d-72.7560997!3m4!1s0x0:0x4c4dc32805af60ce!8m2!3d44.3372704!4d-72.7565309"&gt;Craft Beer Cellar&lt;/a&gt; (bottle shop) next door&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.google.com/maps/place/Blackback+Pub/@44.3371644,-72.7582884,17z/data=!4m12!1m6!3m5!1s0x4cb59f19d7cbc555:0x9507f573af0c0d66!2sProhibition+Pig!8m2!3d44.3371644!4d-72.7560997!3m4!1s0x0:0x1b887fd51bc44453!8m2!3d44.3376804!4d-72.7561748"&gt;Blackback Pub&lt;/a&gt; (dive bar) next door&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.google.com/maps/place/The+Reservoir/@44.3371644,-72.7582884,17z/data=!4m12!1m6!3m5!1s0x4cb59f19d7cbc555:0x9507f573af0c0d66!2sProhibition+Pig!8m2!3d44.3371644!4d-72.7560997!3m4!1s0x0:0x7983524ab70c8dc3!8m2!3d44.3376339!4d-72.7566717"&gt;The Reservoir&lt;/a&gt; (bar) next door&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.google.com/maps/place/Cork+Wine+Bar+%26+Market/@44.3371644,-72.7582884,17z/data=!4m12!1m6!3m5!1s0x4cb59f19d7cbc555:0x9507f573af0c0d66!2sProhibition+Pig!8m2!3d44.3371644!4d-72.7560997!3m4!1s0x0:0x1f3adcf3697531b1!8m2!3d44.3374541!4d-72.7545293"&gt;Cork&lt;/a&gt; often has Sip pours for $4&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.google.com/maps/place/Three+Penny+Taproom/@44.2606812,-72.577299,17z/data=!3m1!4b1!4m5!3m4!1s0x4cb5a7f396aa6331:0x5ab0a413676b75cc!8m2!3d44.2606812!4d-72.5751103"&gt;Three Penny&lt;/a&gt; in Montpelier for great food + taps + bottles&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.google.com/maps/place/Hunger+Mountain+Co-op/@44.2606812,-72.577299,17z/data=!4m5!3m4!1s0x4cb5081d374284a1:0x5337dc320fbbf904!8m2!3d44.253088!4d-72.571646"&gt;Hunger Mountain Coop&lt;/a&gt; in Montpelier for beer + cheese&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.google.com/maps/place/Poorhouse+Pies/@44.5232025,-72.9449934,17z/data=!3m1!4b1!4m5!3m4!1s0x4cb58941b651625f:0xec3c75e778566c9c!8m2!3d44.5232025!4d-72.9428047"&gt;Poorhouse Pies&lt;/a&gt; (self-service pie shop) as often as possible&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.google.com/maps/place/Healthy+Living+Market+and+Cafe/@44.4628118,-73.1820131,17z/data=!3m1!4b1!4m5!3m4!1s0x4cca7a32bd30747d:0xb40326b8e1da7f33!8m2!3d44.4628118!4d-73.1798244"&gt;Healthy Living&lt;/a&gt; near Burlington (another coop; same)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.google.com/maps/place/Trader+Joe's/@44.4628118,-73.1820131,17z/data=!4m12!1m6!3m5!1s0x4cca7a32bd30747d:0xb40326b8e1da7f33!2sHealthy+Living+Market+and+Cafe!8m2!3d44.4628118!4d-73.1798244!3m4!1s0x0:0x3248409e3aba389c!8m2!3d44.4636301!4d-73.1804828"&gt;Trader Joe&amp;rsquo;s&lt;/a&gt; &amp;lsquo;cause why not&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.google.com/maps/place/The+Vermont+Pub+%26+Brewery/@44.477262,-73.2165827,17z/data=!3m1!4b1!4m5!3m4!1s0x4cca7af769f7419d:0xf01f31b2959e1d57!8m2!3d44.477262!4d-73.214394"&gt;Vermont Pub &amp;amp; Brewery&lt;/a&gt; because Greg Noonan was a legend and it&amp;rsquo;s worth visiting from time to time, just don&amp;rsquo;t expect the current level of Vermont beer&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.google.com/maps/place/The+Farmhouse+Tap+%26+Grill/@44.4771242,-73.2155527,17z/data=!3m1!5s0x4cca7af7262900af:0x3529fdaf130c9120!4m12!1m6!3m5!1s0x4cca7af769f7419d:0xf01f31b2959e1d57!2sThe+Vermont+Pub+%26+Brewery!8m2!3d44.477262!4d-73.214394!3m4!1s0x0:0x61940ab7695123d9!8m2!3d44.4783668!4d-73.213295"&gt;Farmhouse Tap &amp;amp; Grill&lt;/a&gt; in Burlington for good food, good taps, good bottles. Usually HF + Lawson&amp;rsquo;s and often tap takeovers for interesting stuff&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.google.com/maps/place/Zero+Gravity+Brewpub+at+American+Flatbread/@44.4771242,-73.2155527,17z/data=!4m12!1m6!3m5!1s0x4cca7af769f7419d:0xf01f31b2959e1d57!2sThe+Vermont+Pub+%26+Brewery!8m2!3d44.477262!4d-73.214394!3m4!1s0x0:0x509d1fe2c1398ec!8m2!3d44.4765391!4d-73.2142793"&gt;American Flatbread&lt;/a&gt; (food + taps, also Zero Gravity brewing)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.google.com/maps/place/Foam+Brewers/@44.4791379,-73.2221856,17z/data=!3m1!4b1!4m5!3m4!1s0x4cca7af037c21691:0xe1cbdbe52021ef94!8m2!3d44.4791379!4d-73.2199969"&gt;Foam Brewers&lt;/a&gt; near the water in Burlington&lt;/li&gt;
&lt;li&gt;…&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>DNS for VMs</title><link>https://seancoates.com/blogs/dns-for-vms</link><guid>https://seancoates.com/blogs/dns-for-vms</guid><pubDate>Tue, 06 Sep 2016 09:00:00 -0400</pubDate><description>&lt;p&gt;&lt;a href="https://seancoates.com/blogs/vagrant-bootstrapping/"&gt;Previously&lt;/a&gt; we talked about using Vagrant at &lt;a href="https://fictivekin.com/"&gt;Fictive Kin&lt;/a&gt; and how we typically have many Virtual Machines (VMs) on the go at once.&lt;/p&gt;
&lt;p&gt;Addressing each of these VMs with a real hostname was proving to be difficult. We couldn’t just use the IP addresses of the machines because they’re unreasonably hard to remember, and other problems like browser cookies don’t work properly.&lt;/p&gt;
&lt;p&gt;In the past, I’ve managed this by editing my local &lt;code&gt;/etc/hosts&lt;/code&gt; file (or the Windows equivalent, &lt;a href="https://support.rackspace.com/how-to/modify-your-hosts-file/"&gt;whatever that’s called now&lt;/a&gt;). Turns out this wasn’t ideal. If my hosts don’t sync up with my colleagues’ hosts, stuff (usually cookies) can go wrong, for example. Plus, &lt;a href="http://seancoates.com/blogs/vagrant-why/"&gt;I strongly believe in setting up an environment that can be managed remotely&lt;/a&gt; (when possible) so less-technical members of our team don’t find themselves toiling under the burden of managing an obscurely-formatted text file deep within the parts of their operating systems that they — in all fairness — &lt;em&gt;shouldn’t&lt;/em&gt; touch. Oh, and you also can’t do wildcards there.&lt;/p&gt;</description></item><item><title>SSH: jump servers, MFA, Salt, and advanced configuration</title><link>https://seancoates.com/blogs/ssh-jump</link><guid>https://seancoates.com/blogs/ssh-jump</guid><pubDate>Tue, 30 Aug 2016 08:00:00 -0400</pubDate><description>&lt;p&gt;Let’s take a short break from our &lt;a href="https://seancoates.com/blogs/vagrant-why"&gt;discussion&lt;/a&gt; of &lt;a href="https://seancoates.com/blogs/vagrant-bootstrapping"&gt;Vagrant&lt;/a&gt; to talk about how we use SSH in production at &lt;a href="https://fictivekin.com/"&gt;Fictive Kin&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Recently, I went on a working vacation to visit my family in New Brunswick (think: east of the eastern time zone in Canada). While there, I needed to log in to a few servers to check on a few processes. I’ve done this in past years, and am frequently away from my sort-of-static home IP address. Usually, this required wrangling of &lt;a href="https://aws.amazon.com/"&gt;AWS&lt;/a&gt; EC2 &lt;a href="http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_SecurityGroups.html"&gt;Security Groups&lt;/a&gt; to temporarily allow access from my tethered connection (whose IP changes at least a few times a day), but not this time. This time things were different.&lt;/p&gt;</description></item><item><title>Vagrant: Bootstrapping</title><link>https://seancoates.com/blogs/vagrant-bootstrapping</link><guid>https://seancoates.com/blogs/vagrant-bootstrapping</guid><pubDate>Mon, 22 Aug 2016 08:00:00 -0400</pubDate><description>&lt;p&gt;In a &lt;a href="https://seancoates.com/blogs/vagrant-why"&gt;previous post&lt;/a&gt;, we talked about &lt;em&gt;why&lt;/em&gt; we use virtual machines, and Vagrant, at &lt;a href="https://fictivekin.com/"&gt;Fictive Kin&lt;/a&gt;. Now let’s get to &lt;em&gt;how&lt;/em&gt; we do it.&lt;/p&gt;
&lt;p&gt;If you’re familiar with Virtual Machine based development environments that are set up through a configuration management (we use &lt;a href="http://saltstack.com/"&gt;Salt&lt;/a&gt;, but you could use something different like &lt;a href="http://ansible.com/"&gt;Ansible&lt;/a&gt;, &lt;a href="http://puppetlabs.com/"&gt;Puppet&lt;/a&gt;, &lt;a href="http://chef.io/"&gt;Chef&lt;/a&gt;, etc.), this probably won’t seem all that new to you, but there are a few things that we do — possibly uniquely — that might help with your systems.&lt;/p&gt;</description></item><item><title>Vagrant: Why?</title><link>https://seancoates.com/blogs/vagrant-why</link><guid>https://seancoates.com/blogs/vagrant-why</guid><pubDate>Mon, 15 Aug 2016 08:00:00 -0400</pubDate><description>&lt;p&gt;In a &lt;a href="http://seancoates.com/blogs/revitalization-project"&gt;previous post&lt;/a&gt;, I mentioned that we — at &lt;a href="https://fictivekin.com/"&gt;Fictive Kin&lt;/a&gt; — over the past several years have managed to build a development environment that works pretty well, and that I’m proud of.&lt;/p&gt;
&lt;p&gt;When (&lt;em&gt;if&lt;/em&gt;) everything is working properly, we can get a new team member — even one with little technical knowledge (though indeed a small amount &lt;em&gt;is&lt;/em&gt; required) — up and running on a development environment within a few minutes.&lt;/p&gt;</description></item><item><title>Revitalization Project</title><link>https://seancoates.com/blogs/revitalization-project</link><guid>https://seancoates.com/blogs/revitalization-project</guid><pubDate>Mon, 08 Aug 2016 08:00:00 -0400</pubDate><description>&lt;p&gt;It’s been over three years since I’ve posted anything new to my blog. This saddens me. I miss writing.&lt;/p&gt;
&lt;p&gt;This is my own fault, of course, and there are reasons for my absence…&lt;/p&gt;
&lt;p&gt;Part of it is shifting interests and altered career focus. I’m still working with &lt;a href="https://fictivekin.com/"&gt;Fictive Kin&lt;/a&gt;, but these days I’m doing almost no PHP, and I spend my days (and sometimes nights) with operations/systems administration. We’re doing really interesting stuff, and that occasionally leads down fun roads. For example, I’ve found time to write this while on my way to Korea to help lead a performance workshop. (I wrote this in May, but am only posting in August. So it goes.)&lt;/p&gt;</description></item><item><title>Affirmative Wager</title><link>https://seancoates.com/blogs/affirmative-wager</link><guid>https://seancoates.com/blogs/affirmative-wager</guid><pubDate>Wed, 06 Mar 2013 18:50:43 UTC</pubDate><description>&lt;p&gt;There&amp;#8217;s a very risky&amp;#8201;&amp;#8212;&amp;#8201;but important&amp;#8201;&amp;#8212;&amp;#8201;conversation that takes place in our community from time to time. It&amp;#8217;s about gender and sexism. To be honest, I&amp;#8217;m scared to write about this for fear that something I say might be twisted into a derogatory opinion that is not representative of the way I actually think and feel.&lt;/p&gt;
&lt;p&gt;I put this on Twitter, a while back:&lt;/p&gt;
&lt;div class="twitter-tweet"&gt;&lt;div class="tweet-text"&gt;&lt;a href="http://twitter.com/coates/statuses/5747359279"&gt;&lt;img src="https://files.scoat.es/coates.jpg" class="tweet-image"&gt;&lt;/a&gt;&lt;p&gt;&lt;a class="twitter-author" href="http://twitter.com/coates/status/305129578618298368"&gt;coates&lt;/a&gt;I am constantly terrified that&amp;#8201;&amp;#8212;&amp;#8201;as a (caucasian) male&amp;#8201;&amp;#8212;&amp;#8201;I will accidentally say something that is misinterpreted as sexism in our community.&lt;/div&gt;&lt;/div&gt;&lt;!-- /TWEET --&gt;
&lt;p&gt;That said, I &lt;em&gt;do&lt;/em&gt; have something to say, and I haven&amp;#8217;t heard anyone else make this point, so I suppose I should step up and say it.&lt;/p&gt;</description></item><item><title>Web developer</title><link>https://seancoates.com/blogs/web-developer</link><guid>https://seancoates.com/blogs/web-developer</guid><pubDate>Mon, 29 Oct 2012 15:23:31 UTC</pubDate><description>&lt;p&gt;Over the weekend, I saw a discussion on Twitter about a particular developer who is worried about his future as PHP becomes less the &lt;em&gt;de facto&lt;/em&gt; platform for all web development, and he moves to other technologies. (These are my words, and my interpretation, not his.)&lt;/p&gt;
&lt;p&gt;This got me thinking about how I&amp;#8217;ve recently gone through a similar change in how I think about my own career, and how I was in a similar place for a long time.&lt;/p&gt;</description></item><item><title>MongoDB Elections</title><link>https://seancoates.com/blogs/mongodb-elections</link><guid>https://seancoates.com/blogs/mongodb-elections</guid><pubDate>Fri, 26 Oct 2012 14:27:10 UTC</pubDate><description>&lt;p&gt;On Monday of this week, Amazon&amp;#8217;s &lt;a href="http://aws.amazon.com/ec2/"&gt;EC2&lt;/a&gt; service &lt;a href="http://files.seancoates.com/blog/aws-fail-2012-oct-22.png"&gt;suffered a major outage&lt;/a&gt;, which they call &amp;#8220;performance issues&amp;#8221;, which we all know is &lt;a href="https://twitter.com/Pinboard/status/260471972541108224"&gt;simply not true&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This is not a post about how Amazon has failed us. Everyone goes down. &lt;a href="http://fictivekin.com/"&gt;We&lt;/a&gt; use AWS because it&amp;#8217;s flexible, and we need the flexibility. This is a post about how &lt;a href="https://gimmebar.com/"&gt;Gimme Bar&lt;/a&gt; went down due to this outage, despite our intentions of making &lt;em&gt;everything&lt;/em&gt; resilient to these types of failures. It is a post about how I accidentally misconfigured our &lt;a href="http://mongodb.org/"&gt;MongoDB&lt;/a&gt; &lt;a href="http://www.mongodb.org/display/DOCS/Replica+Sets"&gt;Replica Set&lt;/a&gt; (&amp;#8220;RS&amp;#8221;).&lt;/p&gt;</description></item><item><title>Berliner Weiße</title><link>https://seancoates.com/blogs/berliner-weisse</link><guid>https://seancoates.com/blogs/berliner-weisse</guid><pubDate>Wed, 20 Jun 2012 23:19:50 UTC</pubDate><description>&lt;p&gt;I think this is the first piece I&amp;#8217;ve written on my blog that is tagged only &amp;#8220;beer&amp;#8221;; apologies to my readers who don&amp;#8217;t care about such things (&lt;del&gt;there are feeds for PHP and Web as well, if you&amp;#8217;d prefer to avoid the occasional post on beer geekery&lt;/del&gt;).&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.flickr.com/photos/scoates/5690297550/in/set-72157626594186210"&gt;&lt;img src="https://farm6.staticflickr.com/5222/5690297550_384e771c7f_b.jpg" title="In the glass" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I love a good berliner wei&amp;#223;e beer. For those of you that haven&amp;#8217;t had the pleasure of enjoying a glass, it&amp;#8217;s a very light and refreshing, sour and acidic, low alcohol beer. It&amp;#8217;s as acidic as lemonade, and low enough in alcohol that the Germans even occasionally refer to it as &lt;a href="http://www.berliner-kindl.de/"&gt;children&amp;#8217;s beer&lt;/a&gt;.
&lt;p&gt;I&amp;#8217;ve found a few examples in bottles (while travelling), but it&amp;#8217;s very rare that I find a good berliner wei&amp;#223;e on tap, and even more rare that the one on tap is pouring properly (they&amp;#8217;re usually under-carbonated, &lt;em&gt;really&lt;/em&gt; yeasty, and they pour all foamy). I prefer mine straight (&amp;#8220;&lt;em&gt;ohne schuss&lt;/em&gt;&amp;#8221;), but they&amp;#8217;re traditionally (at least for some values of &lt;em&gt;traditional&lt;/em&gt;) consumed &lt;em&gt;mit schuss&lt;/em&gt;&amp;#8201;&amp;#8212;&amp;#8201;that is, with either raspberry (&amp;#8220;&lt;em&gt;himbeersirup&lt;/em&gt;&amp;#8221;) or woodruff (&amp;#8220;&lt;em&gt;waldmeistersirup&lt;/em&gt;&amp;#8221;) syrups to balance the lactic, yogurty sourness of the berliner wei&amp;#223;e base with sweet fruity flavours. If you like sour, I highly recommend you try it all three ways, if you&amp;#8217;re ever given the chance.&lt;/p&gt;</description></item><item><title>Deploy on push (from GitHub)</title><link>https://seancoates.com/blogs/deploy-on-push-from-github</link><guid>https://seancoates.com/blogs/deploy-on-push-from-github</guid><pubDate>Mon, 04 Jun 2012 14:34:55 UTC</pubDate><description>&lt;p&gt;&lt;a href="http://jenkins-ci.org/"&gt;Continuous&lt;/a&gt; &lt;a href="http://travis-ci.org/"&gt;deployment&lt;/a&gt; is &lt;a href="http://about.travis-ci.org/blog/first_class_php_support_on_travis_ci/"&gt;all&lt;/a&gt; &lt;a href="http://www.slideshare.net/brianlmoon/continuous-deployment-13061492"&gt;the&lt;/a&gt; &lt;a href="http://www.avc.com/a_vc/2011/02/continuous-deployment.html"&gt;rage&lt;/a&gt; right now, and I applaud the use of systems that automate a task that &lt;em&gt;seems&lt;/em&gt; way easier than it &lt;em&gt;is&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;That said, sometimes you need something simple and straightforward: a hook that easily deploys a few pages, or a small application, all without often-complicated set up (&lt;a href="http://www.youtube.com/watch?v=SP_9zH9Q44o"&gt;come on&lt;/a&gt;, this &lt;em&gt;is&lt;/em&gt; a PHP-focused site, mostly).&lt;/p&gt;
&lt;p&gt;Sometimes, you just need to deploy code when it&amp;#8217;s ready. You don&amp;#8217;t need a build; you don&amp;#8217;t need to run tests&amp;#8201;&amp;#8212;&amp;#8201;you just need to push code to a server. If you use &lt;a href="http://git-scm.com/"&gt;git&lt;/a&gt; and &lt;a href="https://github.com/"&gt;GitHub&lt;/a&gt; (and I think you &lt;em&gt;should&lt;/em&gt; be using GitHub), you can easily deploy on push. &lt;a href="http://shiflett.org/"&gt;We&lt;/a&gt; use a setup like this for &lt;a href="http://phpadvent.org/"&gt;PHP Advent&lt;/a&gt;, for example (it&amp;#8217;s a very simple app), and we also &lt;a href="https://github.com/scoates/phpcon-web/blob/master/_hooks/github.php"&gt;used this approach&lt;/a&gt; to allow easy deployment of the &lt;a href="http://phpcon.org/"&gt;PHP Community Conference&lt;/a&gt; site (on &lt;a href="http://servergrove.com/"&gt;Server Grove&lt;/a&gt;), last year.&lt;/p&gt;</description></item><item><title>Lexentity</title><link>https://seancoates.com/blogs/lexentity</link><guid>https://seancoates.com/blogs/lexentity</guid><pubDate>Tue, 29 May 2012 12:09:33 UTC</pubDate><description>&lt;p&gt;A very long time ago (three and a half years ago), I wrote a little utility to help &lt;a href="http://shiflett.org/"&gt;us&lt;/a&gt; with the &lt;a href="http://phpadvent.org/2008"&gt;2008 edition&lt;/a&gt; of &lt;a href="http://phpadvent.org/"&gt;PHP Advent&lt;/a&gt;. The utility is called &lt;a href="https://github.com/scoates/lexentity"&gt;Lexentity&lt;/a&gt;, and my recent blogging uptake made me realize that I&amp;#8217;ve never actually written about it on here, so here it is (mostly borrowed from the README).&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Let's face it--this sentence is much "uglier" than the one below it.&lt;br /&gt;
Let’s face it–this sentence is much “prettier” than the one above it.&lt;/p&gt;</description></item><item><title>Use `env`</title><link>https://seancoates.com/blogs/use-env</link><guid>https://seancoates.com/blogs/use-env</guid><pubDate>Mon, 21 May 2012 14:28:32 UTC</pubDate><description>&lt;p&gt;&lt;a href="http://fictivekin.com/"&gt;We&lt;/a&gt; use quite a few technologies to build our products, but &lt;a href="https://gimmebar.com/"&gt;Gimme Bar&lt;/a&gt; is still primarily a PHP app.&lt;/p&gt;
&lt;p&gt;To support these apps, we have a number of command-line scripts that handle maintenance tasks, cron jobs, data migration jobs, data processing workers, etc.&lt;/p&gt;
&lt;p&gt;These scripts often run PHP in Gimme Bar land, and we make extensive use of the &lt;a href="http://en.wikipedia.org/wiki/Shebang_%28Unix%29"&gt;shebang&lt;/a&gt; syntax that uses common Unix practice of putting &lt;code&gt;#!/path/to/interpreter&lt;/code&gt; at the beginning of our command-line code. Clearly, this is nothing special—lots of people do exactly this same thing with PHP scripts.&lt;/p&gt;</description></item><item><title>PHP as a templating language</title><link>https://seancoates.com/blogs/php-as-a-templating-language</link><guid>https://seancoates.com/blogs/php-as-a-templating-language</guid><pubDate>Mon, 14 May 2012 14:59:46 UTC</pubDate><description>&lt;p&gt;There&amp;#8217;s been quite a bit of talk, recently, in PHP-land about templates and the ramifications of enforcing &amp;#8220;pure&amp;#8221; PHP scripts by &lt;a href="https://wiki.php.net/rfc/phpp"&gt;preventing scripts from entering HTML mode&lt;/a&gt;. I&amp;#8217;m not quite sure how I feel about this RFC, but it got me thinking about the whole idea of using PHP for templating in modern web apps.&lt;/p&gt;
&lt;p&gt;For many years, I was a supporter of using PHP as a templating language to render HTML. However, I really don&amp;#8217;t buy into the idea of adding an additional abstraction layer on top of PHP, such as &lt;a href="http://smarty.php.net/"&gt;Smarty&lt;/a&gt; (and many others). In the past year or so, I&amp;#8217;ve come to the realization that even PHP itself is no longer ideally suited to function as the templating engine of current web applications&amp;#8201;&amp;#8212;&amp;#8201;at least not as the primary templating engine for such apps.&lt;/p&gt;</description></item><item><title>Natural Load Testing</title><link>https://seancoates.com/blogs/natural-load-testing</link><guid>https://seancoates.com/blogs/natural-load-testing</guid><pubDate>Mon, 07 May 2012 14:51:19 UTC</pubDate><description>&lt;p&gt;My friend &lt;a href="http://preinheimer.com/"&gt;Paul Reinheimer&lt;/a&gt; has put together an excellent product/service that is probably of use to many of you.&lt;/p&gt;
&lt;p&gt;The product is called &lt;a href="https://load.wondernetwork.com/beta/"&gt;Natural Load Testing&lt;/a&gt;, and it harnesses some of the machinery that powers the also-excellent &lt;a href="https://wonderproxy.com/"&gt;wonderproxy&lt;/a&gt; and its extremely useful &lt;a href="https://wonderproxy.com/signup/vpn"&gt;VPN service&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The gist is that once you've been granted an account (they're in private beta right now, but &lt;a href="https://load.wondernetwork.com/beta/please/"&gt;tell them I sent you&lt;/a&gt;, and if you're not a horrible person such as a spammer, scammer, or promoter of online timesuck virtual farming, you'll probably get in—just kidding about that farming clause… sort of), you can record real, practical test suites within the simple confines of your browser, and then you can use those recorded actions to generate huge amounts of test traffic to your application.&lt;/p&gt;</description></item><item><title>Ideas of March</title><link>https://seancoates.com/blogs/ideas-of-march-1</link><guid>https://seancoates.com/blogs/ideas-of-march-1</guid><pubDate>Thu, 15 Mar 2012 13:49:29 UTC</pubDate><description>&lt;p&gt;A year ago, I posted about &lt;a href="https://seancoates.com/blogs/ideas-of-march"&gt;Ideas of March&lt;/a&gt;, which &lt;a href="http://shiflett.org/blog/2011/mar/ideas-of-march"&gt;Chris&lt;/a&gt; got rolling.&lt;/p&gt;
&lt;p&gt;In it, I pledged to blog more.&lt;/p&gt;
&lt;p&gt;Today, I am not so proud to say that I have mostly failed to do so. If I had to come up with a reason, I'd have to say that, personally, 2011 turned out a whole lot different than I was expecting, back then—and not in a good way.&lt;/p&gt;
&lt;p&gt;Over the last year, however, I did post a few things that I think were interesting, and worth of a re-read (at risk of making this post into a &lt;a href="http://en.wikipedia.org/wiki/Clip_show"&gt;clip show&lt;/a&gt;):&lt;/p&gt;</description></item><item><title>HTTP 1.0 and the Connection header</title><link>https://seancoates.com/blogs/http-1-and-the-connection-header</link><guid>https://seancoates.com/blogs/http-1-and-the-connection-header</guid><pubDate>Tue, 27 Dec 2011 15:02:53 UTC</pubDate><description>&lt;p&gt;I have a long backlog of things to write about. One of those things is &lt;a href="https://www.varnish-cache.org/"&gt;Varnish&lt;/a&gt; (more on that in a future post). So, over these Christmas holidays, while intentionally taking a break from &lt;a href="https://gimmebar.com/"&gt;real work&lt;/a&gt;, I decided to finally do some of the research required before I can &lt;em&gt;really&lt;/em&gt; write about how Varnish is going to make your web apps much faster.&lt;/p&gt;
&lt;p&gt;To get some actual numbers, I broke out the &lt;a href="http://httpd.apache.org/docs/2.0/programs/ab.html"&gt;Apache Benchmarking utility&lt;/a&gt; (&lt;code&gt;ab&lt;/code&gt;), and decided to let it loose on my site (100 requests, 10 requests concurrently):&lt;/p&gt;</description></item><item><title>Aficionadoʼs Curse / Pessimistic Optimism</title><link>https://seancoates.com/blogs/aficionados-curse-pessimistic-optimism</link><guid>https://seancoates.com/blogs/aficionados-curse-pessimistic-optimism</guid><pubDate>Wed, 19 Oct 2011 03:22:53 UTC</pubDate><description>&lt;p&gt;As I've mentioned in previous posts, I like
&lt;a href="https://seancoates.com/brews"&gt;beer&lt;/a&gt;.
I mean, I &lt;em&gt;really&lt;/em&gt; like it. I've tasted many
&lt;a href="http://www.flickr.com/photos/scoates/4976281015/in/set-72157623869315740/"&gt;unique&lt;/a&gt;,
&lt;a href="http://www.flickr.com/photos/scoates/4579413071/"&gt;special&lt;/a&gt;,
&lt;a href="http://www.flickr.com/photos/scoates/4976668253/in/set-72157623869315740/"&gt;rare&lt;/a&gt;,
and extremely
&lt;a href="http://www.flickr.com/photos/scoates/4976668097/in/set-72157623869315740/"&gt;old&lt;/a&gt;
beers. I even have &lt;a href="http://bjcp.org/"&gt;Beer Judging&lt;/a&gt; credentials. I
would go as far as to say that I'm a "beer aficionado." I find the idea of a
cheap, poorly-made beer (especially when there are superior alternatives on
hand) to be almost repulsive.&lt;/p&gt;
&lt;p&gt;I know
&lt;a href="http://en.wikipedia.org/wiki/Aficionado"&gt;aficionados&lt;/a&gt;
in other fields: wine, vodka, scotch, cheese, movies, music,
specific genres of music, woodworking, home electronics, office design, and
even one guy I might consider a dog food aficionado.&lt;/p&gt;</description></item><item><title>Webshell</title><link>https://seancoates.com/blogs/webshell</link><guid>https://seancoates.com/blogs/webshell</guid><pubDate>Mon, 09 May 2011 12:24:53 UTC</pubDate><description>&lt;blockquote&gt;&lt;p&gt;&lt;a href="http://github.com/fictivekin/webshell"&gt;Webshell&lt;/a&gt;
is a console-based, JavaScripty web client utility that is great for
consuming, debugging and interacting with APIs.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;I use &lt;a href="http://getfirefox.com"&gt;Firefox&lt;/a&gt; as my primary browser.
The main reason I've been faithful to Mozilla is my set of add-ons. I use
Firebug regularly, and I'm not sure
what I'd do without
&lt;a href="https://addons.mozilla.org/en-us/firefox/addon/jsonovich/"&gt;JSONovich&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Last year, as I built &lt;a href="https://gimmebar.com/"&gt;Gimme Bar&lt;/a&gt;'s
internal API, I found myself using &lt;a href="http://curl.haxx.se/"&gt;curl&lt;/a&gt;,
extensively, and occasionally
&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/poster/"&gt;Poster&lt;/a&gt;,
to test and debug my code.&lt;/p&gt;</description></item><item><title>Gimme Bar on MongoDB</title><link>https://seancoates.com/blogs/gimme-bar-on-mongodb</link><guid>https://seancoates.com/blogs/gimme-bar-on-mongodb</guid><pubDate>Tue, 03 May 2011 12:40:02 UTC</pubDate><description>&lt;p&gt;I'm happy to report that &lt;a href="https://gimmebar.com/"&gt;Gimme Bar&lt;/a&gt;
has been running very well on &lt;a href="http://mongodb.org"&gt;MongoDB&lt;/a&gt;
since early February of this year. I previously posted on some of the
&lt;a href="http://seancoates.com/blogs/gimme-bar-no-longer-on-couchdb"&gt;reasons we decided to move off of CouchDB&lt;/a&gt;.
If you haven't read that, please consider it a prerequisite for the
consumption of this post.&lt;/p&gt;
&lt;p&gt;Late last year, I knew that we had no choice but to get off of CouchDB.
I was dreading the port. The dread was two-fold. I dreaded learning a new
database software, its client interface, administration techniques, and
general domain-knowledge, but I also dreaded taking time away from progress
on Gimme Bar to do something that I knew would help us in the long term,
but was hard to justify from a "product" standpoint.&lt;/p&gt;</description></item><item><title>Gimme Bar no longer on CouchDB</title><link>https://seancoates.com/blogs/gimme-bar-no-longer-on-couchdb</link><guid>https://seancoates.com/blogs/gimme-bar-no-longer-on-couchdb</guid><pubDate>Mon, 02 May 2011 16:04:38 UTC</pubDate><description>&lt;p&gt;As mentioned in a
&lt;a href="http://seancoates.com/blogs/gimme-bar-one-year-old"&gt;previous post&lt;/a&gt;,
we started building &lt;a href="https://gimmebar.com/"&gt;Gimme Bar&lt;/a&gt; a little
over a year ago. We did a lot of things right, but we also did some things
wrong.&lt;/p&gt;
&lt;p&gt;Since—in those early days—I was the only developer, and since most of my
professional development experience is in PHP, that choice was obvious.
I also started building the API
&lt;a href="http://phpadvent.org/2010/first-class-apis-by-helgi-%C3%9Eormar-%C3%9Eorbj%C3%B6rnsson"&gt;before the front-end&lt;/a&gt;.
I chose a really simple routing model for the back-end, and got to work,
sans framework. Our back-end code is still really lean (for the most part),
and I'm still (mostly (-: ) proud of it.&lt;/p&gt;</description></item><item><title>PHP Community Conference</title><link>https://seancoates.com/blogs/php-community-conference</link><guid>https://seancoates.com/blogs/php-community-conference</guid><pubDate>Thu, 24 Mar 2011 14:50:19 UTC</pubDate><description>&lt;p&gt;I was once told that "the only reason you're successful is that you were at
the right place at the right time." Other than the word "only"
in that declaration, the accuser was mostly right. The reason I'm
[moderately] successful is that I was at the right place at the right time.
The subtlety in the second statement is in the &lt;em&gt;reason&lt;/em&gt; I was at the
right place at the magical time.&lt;/p&gt;</description></item><item><title>Ideas of March</title><link>https://seancoates.com/blogs/ideas-of-march</link><guid>https://seancoates.com/blogs/ideas-of-march</guid><pubDate>Tue, 15 Mar 2011 13:09:14 UTC</pubDate><description>&lt;p&gt;Around two weeks ago, &lt;a href="http://shiflett.org/"&gt;Chris&lt;/a&gt; wrote a blog
post that I responded to, and I was reminded of some of the great conversations
that helped build our community. Many of these took place on the blogs of the
&lt;a href="http://en.wikipedia.org/wiki/2000s"&gt;aughts&lt;/a&gt;.&lt;/p&gt;
&lt;!-- TWEET --&gt;&lt;div class="twitter-tweet"&gt;&lt;div class="tweet-text"&gt;&lt;a href="http://twitter.com/coates/statuses/42256558784131072"&gt;&lt;img src="https://files.scoat.es/coates.jpg" class="tweet-image"&gt;&lt;/a&gt;&lt;p&gt;&lt;a class="twitter-author" href="http://twitter.com/coates/statuses/42256558784131072"&gt;coates&lt;/a&gt;We, the web community, used to have great conversations on blogs. Here's a chance again: &lt;a href="http://j.mp/JSandURLs"&gt;http://j.mp/JSandURLs&lt;/a&gt; (Bonus: more than 140 chars.)&lt;/div&gt;&lt;/div&gt;&lt;!-- /TWEET --&gt;
&lt;p&gt;&lt;a href="http://shiflett.org/blog/2011/mar/ideas-of-march"&gt;Like Chris&lt;/a&gt;,
I think we've lost a bit of that. I've seen what feels like hundreds of
conversations fly by on Twitter, 140 characters at a time: incomplete thoughts
crammed into a package that's simply too small for detailed and deep
expression. Don't get me wrong—a stream like Twitter (or maybe
&lt;a href="https://twitter.com/#!/twitterapi/status/46304795866312704"&gt;not Twitter itself&lt;/a&gt;) is valuable for quick thoughts and light conversation, but we often need more than that.&lt;/p&gt;</description></item><item><title>Gimme Bar: One Year Old</title><link>https://seancoates.com/blogs/gimme-bar-one-year-old</link><guid>https://seancoates.com/blogs/gimme-bar-one-year-old</guid><pubDate>Wed, 19 Jan 2011 21:59:35 UTC</pubDate><description>&lt;p&gt;Exactly one year ago, today, &lt;a href="https://gimmebar.com/"&gt;Gimme Bar&lt;/a&gt;
was born.&lt;/p&gt;
&lt;p&gt;Gimme Bar has been the focus of my work for that entire time, and I haven't
blogged about it
(&lt;a href="https://seancoates.com/blogs/brooklyn-beta"&gt;much&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Ironically (sort of), I've been far too busy working &lt;em&gt;on&lt;/em&gt; Gimme Bar to
do much writing &lt;em&gt;about&lt;/em&gt; Gimme Bar, but I thought it fitting to take a
couple minutes to write a few words about it today.&lt;/p&gt;
&lt;p&gt;The &lt;em&gt;elevator pitch&lt;/em&gt; for the project goes something like this: Gimme
Bar is a personal utility to help you capture and collect interesting things you
find in your day-to-day use of the Web.&lt;/p&gt;</description></item><item><title>Post-Advent 2010</title><link>https://seancoates.com/blogs/post-advent-2010</link><guid>https://seancoates.com/blogs/post-advent-2010</guid><pubDate>Sat, 25 Dec 2010 18:29:27 UTC</pubDate><description>&lt;p&gt;As I write this on Christmas Eve, &lt;a href="http://shiflett.org/"&gt;Chris&lt;/a&gt;
is putting the finishing touches on
&lt;a href="http://phpadvent.org/2010"&gt;PHP Advent 2010&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A brief search of my site indicates that I haven't actually blogged about
PHP Advent since 2007, when I was lucky enough to write the first article. That
first year, Chris put the
&lt;a href="http://shiflett.org/blog/2007/dec"&gt;advent articles&lt;/a&gt;
up on his blog (and we &lt;em&gt;do&lt;/em&gt;
intend to copy them over to phpadvent.org, eventually). Sensing that Chris had
entirely too much work to do, curating, and since we were
&lt;a href="http://omniti.com/was"&gt;working together&lt;/a&gt; by the time the season
came around in 2008, I offered to help with editing and curation—I did, after
all know the pain/joy of putting together
&lt;a href="http://phparch.com/"&gt;a magazine&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Remote pbcopy</title><link>https://seancoates.com/blogs/remote-pbcopy</link><guid>https://seancoates.com/blogs/remote-pbcopy</guid><pubDate>Tue, 30 Nov 2010 15:38:03 UTC</pubDate><description>&lt;p&gt;I use the command line a lot. I'm sure many of you do, too.&lt;/p&gt;
&lt;p&gt;I find myself often piping things between processes:&lt;/p&gt;
&lt;pre class="highlight none"&gt;
$ cat seancoates.com-access_log \
&amp;gt; | awk {'print $1'} \
&amp;gt; | sort \
&amp;gt; | uniq \
&amp;gt; | wc -l
627
$ # unique IPs
&lt;/pre&gt;
&lt;p&gt;One particularly useful tool on my Mac is the &lt;code&gt;pbcopy&lt;/code&gt; utility,
which takes standard input and puts it on the &lt;em&gt;p&lt;/em&gt;aste&lt;em&gt;b&lt;/em&gt;oard
(this is known as the "clipboard" on some other systems). Its sister
application, &lt;code&gt;pbpaste&lt;/code&gt; is also useful (it outputs your pasteboard to
standard output when your pasteboard contains data that can be represented in
some sort of text form—if you have image data copied, for example,
&lt;code&gt;pbpaste&lt;/code&gt; yields no output).&lt;/p&gt;</description></item><item><title>Brooklyn Beta</title><link>https://seancoates.com/blogs/brooklyn-beta</link><guid>https://seancoates.com/blogs/brooklyn-beta</guid><pubDate>Wed, 27 Oct 2010 16:45:46 UTC</pubDate><description>&lt;p&gt;Last week, many of the Web's most influential developers and designers
converged on a seemingly unremarkable
&lt;a href="http://theinvisibledog.org/"&gt;art space&lt;/a&gt; (née factory for novelty
invisible dog leashes) in Brooklyn for the first of what I hope will become
a long-standing conference tradition:
&lt;a href="http://brooklynbeta.org/"&gt;Brooklyn Beta&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.flickr.com/photos/scoates/5111948445/" title="Brooklyn Beta"&gt;&lt;img src="http://farm5.static.flickr.com/4131/5111948445_6177ac9205.jpg" width="500" height="333" alt="Brooklyn Beta" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Despite having personally helped organize several other conferences in
the past, Brooklyn Beta has easily earned a spot at the top of my list of
favourite events in my career.&lt;/p&gt;</description></item><item><title>Arbitrary Incrementer in PHP</title><link>https://seancoates.com/blogs/arbitrary-incrementer-in-php</link><guid>https://seancoates.com/blogs/arbitrary-incrementer-in-php</guid><pubDate>Thu, 05 Aug 2010 14:23:49 UTC</pubDate><description>&lt;p&gt;On several recent occasions I had a need for an incrementer that
uses an arbitrary character set and I thought I'd share my code with you.&lt;/p&gt;
&lt;p&gt;I've used this code in the
&lt;a href="http://files.seancoates.com/gplvirus.phps"&gt;GPL Virus&lt;/a&gt;
that I wrote to poke fun at the
&lt;a href="http://www.google.com/search?q=wordpress+gpl+thesis"&gt;Wordpress/Thesis/GPL debacle&lt;/a&gt;,
as well as in some
&lt;a href="http://github.com/scoates/jsbin"&gt;clean up&lt;/a&gt; I'm doing for the
extremely useful &lt;a href="http://jsbin.com"&gt;JS Bin&lt;/a&gt; project.&lt;/p&gt;
&lt;p&gt;The most important application, however, was in creating a URL shortening system for
the as-yet-unannounced startup project that I'm working on.&lt;/p&gt;</description></item><item><title>Beer Alchemy Integration</title><link>https://seancoates.com/blogs/beer-alchemy-integration</link><guid>https://seancoates.com/blogs/beer-alchemy-integration</guid><pubDate>Tue, 27 Jul 2010 16:14:11 UTC</pubDate><description>&lt;p&gt;&lt;em&gt;Note from future Sean: this is certainly dead code 10 years later; leaving here for reference in case it's somehow useful.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;As I mentioned in my &lt;a href="https://seancoates.com/blogs/a-new-seancoatescom"&gt;previous post&lt;/a&gt;, my &lt;a href="https://seancoates.com/brews"&gt;beer recipes&lt;/a&gt; are now online.&lt;/p&gt;
&lt;p&gt;I've had several people ask me how this is done, so I think a post is in order.&lt;/p&gt;
&lt;p&gt;While it's &lt;a href="http://howotobrew.com/"&gt;entirely possible&lt;/a&gt; to brew beer at home without any fancy gadgets, there are several tools I use (such as my refractometer) that make the process easier, more controlled, or both. Brewing software is one of the few instruments that I'm not sure I'd want to brew without. I use a Mac, primarily, so &lt;a href="http://www.kentplacesoftware.com/products/BeerAlchemy.html"&gt;Beer Alchemy&lt;/a&gt; (BA) is the obvious choice for recipe formulation, calculation, and logging.&lt;/p&gt;</description></item><item><title>A new seancoates.com</title><link>https://seancoates.com/blogs/a-new-seancoatescom</link><guid>https://seancoates.com/blogs/a-new-seancoatescom</guid><pubDate>Tue, 20 Jul 2010 14:56:42 UTC</pubDate><description>&lt;p&gt;
Over the past few weeks, my &lt;a href="http://fictivekin.com/"&gt;business&lt;/a&gt;
partner &lt;a href="http://fictivecameron.com/"&gt;Cameron&lt;/a&gt; and I have spent
evenings, late nights, and weekends (at least partially) working on a
much-improved seancoates.com.
&lt;/p&gt;
&lt;p&gt;&lt;img title="Old seancoates.com" src="http://files.seancoates.com/seancoates.com-old.png"/&gt;&lt;/p&gt;
&lt;p&gt;&lt;img title="New seancoates.com" src="http://files.seancoates.com/seancoates.com-new.png"/&gt;&lt;/p&gt;
&lt;p&gt;
If you&amp;#8217;re reading this via my feed, or through a syndication outlet, you probably
hadn&amp;#8217;t noticed.
&lt;/p&gt;
&lt;p&gt;The primary goal of this change was to reduce (hopefully even remove) the
ugliness of my main presence on the Web, and I&amp;#8217;m very happy with the results.&lt;/p&gt;</description></item><item><title>Goodbye, OmniTI</title><link>https://seancoates.com/blogs/goodbye-omniti</link><guid>https://seancoates.com/blogs/goodbye-omniti</guid><pubDate>Thu, 17 Dec 2009 20:08:22 UTC</pubDate><description>&lt;p&gt;Today is my last day at &lt;a href="http://omniti.com/"&gt;OmniTI&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;From an email I just sent out to my soon-to-be-past colleagues:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&amp;#8220;I sincerely wish you continued success as a company, and also as individuals who truly make up a significant portion of the best people in this industry. There are many things that OmniTI does very well, and I won't hesitate to refer business your way when the situation arises.&lt;/p&gt;
&lt;p&gt;This past year and a half (or so) has been a bumpy road, but I'm
absolutely sure I will look back on my time with OmniTI as a net-positive.
Thank you all for supporting me and my team with our sometimes-(absurd
| stupid | obvious | amateur | tough) questions and requests.&amp;#8221;&lt;/p&gt;</description></item><item><title>Horrible Support</title><link>https://seancoates.com/blogs/horrible-support</link><guid>https://seancoates.com/blogs/horrible-support</guid><pubDate>Thu, 26 Nov 2009 03:17:09 UTC</pubDate><description>&lt;p&gt;I fully acknowledge that this is a rant. If you're not into that sort of thing, scroll on by—nothing to see here. I &lt;em&gt;do&lt;/em&gt; have a point at the end of the (long) narrative(s), if you do manage to read the whole thing, though.&lt;/p&gt;
&lt;p&gt;Technical customer service sucks—at least for people who have the slightest clue about the technology they're calling about.&lt;/p&gt;
&lt;h2&gt;Videotron&lt;/h2&gt;
&lt;p&gt;Today, I spent all afternoon (and this evening, and this will carry into tomorrow, maybe Friday) without Internet service. After lunch, I was sitting at my dining room table with the laptop, where I have a clear view of the telephone/hydro/cable pole across the street. This pole services my house. I glanced up and noticed a Videotron (my cable provider) truck, and its driver up in the bucket, doing something to the wires.&lt;/p&gt;</description></item><item><title>UTF: WTF?</title><link>https://seancoates.com/blogs/utf-wtf</link><guid>https://seancoates.com/blogs/utf-wtf</guid><pubDate>Sun, 23 Nov 2008 18:55:34 UTC</pubDate><description>&lt;div class="note"&gt;&lt;p&gt;&lt;em&gt;Note: This article first ran in &lt;a href="http://phparch.com/"&gt;&lt;em&gt;php|architect&lt;/em&gt;&lt;/a&gt; in March 2008, while I still worked at MTA. &lt;a href="http://mtabini.blogspot.com/"&gt;Marco&lt;/a&gt; (the publisher, and my former colleague) has graciously agreed to allow me to republish this in a more public forum. I've wanted to link a few people to it in the past few months and until now that was only possible if they were &lt;em&gt;php|architect&lt;/em&gt; subscribers. That said, if you're into PHP, you really should subscribe to &lt;em&gt;php|a&lt;/em&gt;.&lt;/em&gt;&lt;/p&gt;</description></item><item><title>More Web of Trust Thoughts</title><link>https://seancoates.com/blogs/more-web-of-trust-thoughts</link><guid>https://seancoates.com/blogs/more-web-of-trust-thoughts</guid><pubDate>Fri, 03 Oct 2008 00:36:12 UTC</pubDate><description>&lt;p&gt;A while back, I blogged about &lt;a href="https://seancoates.com/blogs/a-weak-web-of-trust"&gt;trust on the web&lt;/a&gt;, and how there are a lot of assumptions made by content providers that simply don't carry over to end users, or are just a small (but important) step from being good practices.&lt;/p&gt;
&lt;p&gt;Yesterday, at &lt;a href="http://omniti.com/"&gt;$work&lt;/a&gt;, we were talking about something that lead to a discussion on SSL, and how I think that most sites, even if they don't contain sensitive information should be available by https—even if the certificate is self-signed.&lt;/p&gt;</description></item><item><title>Personal Password Policies</title><link>https://seancoates.com/blogs/personal-password-policies</link><guid>https://seancoates.com/blogs/personal-password-policies</guid><pubDate>Mon, 15 Sep 2008 02:59:36 UTC</pubDate><description>&lt;p&gt;As you &lt;a href="http://seancoates.com/moved-my-blog-and-my-job"&gt;may have already heard&lt;/a&gt;, I've recently taken a position at &lt;a href="http://omniti.com"&gt;OmniTI&lt;/a&gt;. Big changes in my life and career usually cause me to review other parts of the same. Recently, I've been considering my personal password policies, and I thought it might be interesting to both share my conclusions, as well as to hear from my 3 remaining readers (after months of an untouched blog) what you think and if you have any of your own policies that I should adopt.&lt;/p&gt;</description></item><item><title>A Weak Web of Trust</title><link>https://seancoates.com/blogs/a-weak-web-of-trust</link><guid>https://seancoates.com/blogs/a-weak-web-of-trust</guid><pubDate>Mon, 15 Sep 2008 02:56:02 UTC</pubDate><description>&lt;p&gt;Every time I'm forced to waste small fractions of my life navigating (and re-navigating) the &lt;a href="http://aircanda.com/"&gt;Air Canada&lt;/a&gt; web site, I run into new points of frustration. For example, this week, I couldn't check pricing on a trip because of a JavaScript error that prevented the multi-city page from allowing me to submit the form.&lt;/p&gt;
&lt;p&gt;Errors (which have since been fixed) aside, I was finally able to complete my reservation, today, and was reminded of an issue of cross-site trust that I suspect will become more and more of a problem, as sites and businesses continue to deepen their level of cooperation. This type of collaboration can be good or bad for end users, and in this case, what seems beneficial is actually extremely problematic.&lt;/p&gt;</description></item><item><title>How to record a podcast on OSX 10.5.2</title><link>https://seancoates.com/blogs/how-to-record-a-podcast-on-osx-10-5-2</link><guid>https://seancoates.com/blogs/how-to-record-a-podcast-on-osx-10-5-2</guid><pubDate>Mon, 15 Sep 2008 02:56:01 UTC</pubDate><description>&lt;p&gt;I'm so frustrated. It seems that every time we sit down to record &lt;a href="http://c7y.phparch.com/c/tag/p3"&gt;the podcast&lt;/a&gt;, lately, it all goes to crap, and I'm sick of recording the same thing over and over again only to have it fail (audio gets garbly; drops samples; garageband crashes; kernel panics; all around nasty stuff).&lt;/p&gt;
&lt;p&gt;It all seems to stem from &lt;a href="http://discussions.apple.com/thread.jspa?threadID=1399773&amp;amp;tstart=0"&gt;Apple seriously screwing up their USB drivers on 10.5.2&lt;/a&gt;. This is definitely the first time I've felt seriously let down by my operating system since switching from Linux (which has its own issues) last May.&lt;/p&gt;</description></item><item><title>PHP Advent Calendar</title><link>https://seancoates.com/blogs/php-advent-calendar</link><guid>https://seancoates.com/blogs/php-advent-calendar</guid><pubDate>Mon, 15 Sep 2008 02:55:59 UTC</pubDate><description>&lt;p&gt;A few days back, &lt;a href="http://shiflett.org/"&gt;Chris Shiflett&lt;/a&gt; sent out an email asking a bunch of members of the PHP community to submit to a project he wants to run this year, the PHP Advent Calendar. I have the honour of providing the &lt;a href="http://shiflett.org/blog/2007/dec/php-advent-calendar-day-1"&gt;first entry&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Thanks to Chris; I think this is a great idea. I'm so happy to be included on the list of potential writers.&lt;/p&gt;
&lt;p&gt;I'd write more, but I'm currently in the middle of nowhere (again) so I can't write more (without waiting for incessantly latent internet), so I'll leave it at that. Enjoy!&lt;/p&gt;</description></item><item><title>We all grow up</title><link>https://seancoates.com/blogs/we-all-grow-up</link><guid>https://seancoates.com/blogs/we-all-grow-up</guid><pubDate>Mon, 15 Sep 2008 02:55:51 UTC</pubDate><description>&lt;p&gt;A friend of mine sent me a message on Facebook, yesterday. "Never thought that I'd see Microsoft and your name together at the same place," she said, referring to posted (and tagged) photos of me at the Microsoft Web Developers Summit 2007.&lt;/p&gt;
&lt;p&gt;"Me either. Long story..." I replied. The story dates back 5 years, when I had conversations with my aforementioned friend's husband–who happened to be a &lt;em&gt;Microsoft guy&lt;/em&gt;, professionally–about the things MS was doing that were hurtful to not only open source, but the software community in general, and ultimately Microsoft's bottom line (if they were willing to look past "next quarter's" earnings projections).&lt;/p&gt;</description></item><item><title>Short Date Formats Suck</title><link>https://seancoates.com/blogs/short-date-formats-suck</link><guid>https://seancoates.com/blogs/short-date-formats-suck</guid><pubDate>Mon, 15 Sep 2008 02:55:46 UTC</pubDate><description>&lt;p&gt;When I'm traveling, I often like to sample beer that's unavailable here in beer-wasteland-Quebec (local microbreweries not withstanding).&lt;/p&gt;
&lt;p&gt;For some reason, I often get asked for ID... especially in near-airport bars and restaurants. I noticed that in Orlando, last year, everyone in every group was carded each time anyone ordered any sort of alcohol. I guess they have a low-tolerance for under age drinking, there, or perhaps their waiters are just well-trained to ask &lt;em&gt;everyone&lt;/em&gt; for ID.&lt;/p&gt;</description></item><item><title>How to [not] get fired</title><link>https://seancoates.com/blogs/how-to-not-get-fired</link><guid>https://seancoates.com/blogs/how-to-not-get-fired</guid><pubDate>Mon, 15 Sep 2008 02:55:45 UTC</pubDate><description>&lt;p&gt;Marco already &lt;a href="http://mtabini.blogspot.com/2007/09/more-technology-more-humiliation.html"&gt;posted on this&lt;/a&gt;, but I thought I'd pitch in our side of the story.&lt;/p&gt;
&lt;p&gt;At php|works, this year (a couple weeks ago), our /fear(some|ful)/ leader was absent. He had some personal stuff that conflicted with the conference's schedule, so he left it in our (&lt;a href="http://preinheimer.com/blog"&gt;Paul&lt;/a&gt;, &lt;a href="http://www.flickr.com/photos/sebastian_bergmann/1436737631/"&gt;Arbi&lt;/a&gt; and myself) mostly-capable hands.&lt;/p&gt;
&lt;p&gt;I think we did a good job, even without him, but to deter him for
deserting us at our [bigger!] spring conference, we came up with an idea...
a good idea (-:&lt;/p&gt;</description></item><item><title>Handling Downtime: Job Well Done</title><link>https://seancoates.com/blogs/handling-downtime-job-well-done</link><guid>https://seancoates.com/blogs/handling-downtime-job-well-done</guid><pubDate>Mon, 15 Sep 2008 02:55:38 UTC</pubDate><description>&lt;p&gt;Yesterday, if you tried to call me (either at work, or at home, or even my mobile), you were probably unable to reach me.&lt;/p&gt;
&lt;p&gt;The telephone (VOIP) wholesaler I use, &lt;a href="http://unlimitel.ca/"&gt;Unlimitel&lt;/a&gt;, was down for around 9 hours. Normally, 9h of downtime would really bother me, but I can honestly say I've never been happier with their service.&lt;/p&gt;
&lt;p&gt;Here are a few reasons why:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;This is the first significant downtime we've had in 2 years (since I started using Unlimitel)&lt;/li&gt;
&lt;li&gt;We pay 1.1¢/min for on-net service (local calls in a number of Canadian cities) and 2¢ for the rest of North America. Low rates for most of the rest of the world, too. $2.50/month for our DIDs. I don't expect completely flawless service for this price.&lt;/li&gt;
&lt;li&gt;Stephan, the president, emailed customers to explain the problem. The first mail was &lt;em&gt;before&lt;/em&gt; we even noticed that calls weren't working.&lt;/li&gt;
&lt;li&gt;The actual cause of the accident was a screwup at Rogers (&lt;strong&gt;NOT&lt;/strong&gt; Unlimitel's fault):
&lt;ul&gt;
&lt;li&gt;A truck accident somehow caused a bundle of fiber at Rogers to be cut. (Initial reports were that the lines were cut by a backhoe.)&lt;/li&gt;
&lt;li&gt;Rogers' redundancy somehow failed. The actual cut was 25KM away from Unlimitel's datacenter.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Throughout the downtime, Stephan kept us well-informed of the situation, relaying ETA data from Rogers whenever possible.&lt;/li&gt;
&lt;li&gt;Unlimitel routed all possible traffic to non-Rogers circuits as soon as possible. (Outbound calls started working, but inbound lines are on Rogers, and Rogers' redundancy failed, as mentioned.)&lt;/li&gt;
&lt;li&gt;The few times that Unlimitel has actually made mistakes, they've kept
us well-informed, and owned up to these mistakes quickly (they implemented
CallerID poorly, a while back, and quickly fixed it, for example).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All told, I'm very happy with them. I can understand why some people
would be upset over ~9h of unplanned downtime, but all things considered,
I think Unlimitel did an excellent job of handling the crisis.&lt;/p&gt;</description></item><item><title>Essential PHP Security</title><link>https://seancoates.com/blogs/essential-php-security</link><guid>https://seancoates.com/blogs/essential-php-security</guid><pubDate>Mon, 15 Sep 2008 02:55:36 UTC</pubDate><description>&lt;p&gt;Quite a while ago, O'Reilly sent me a copy of my friend and colleague, &lt;a href="http://shiflett.org/"&gt;Chris Shiflett&lt;/a&gt;'s book, &lt;a href="http://shiflett.org/books"&gt;Essential PHP Security&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;When I received it, I read through it quickly, and knew it was a good book, but didn't have much else to say about it (lest I join the ranks of the &lt;em&gt;me too!&lt;/em&gt;ers (everyone was saying it's a good book)).&lt;/p&gt;
&lt;p&gt;Today, I was wondering about session ID regeneration. I know it's important, but I was looking for a "best practice," or opinion on an appropriate level of session ID regeneration.&lt;/p&gt;</description></item><item><title>PHP Pie?</title><link>https://seancoates.com/blogs/php-pie</link><guid>https://seancoates.com/blogs/php-pie</guid><pubDate>Mon, 15 Sep 2008 02:55:32 UTC</pubDate><description>&lt;p&gt;I've often had to manipulate large blobs of text—no, make that many files containing large blobs of text.&lt;/p&gt;
&lt;p&gt;Of course, my IDE can usually handle simple search-and-replace operations, I appreciate the simplicity of the command line interface, on most occasions.&lt;/p&gt;
&lt;p&gt;That's one of the reasons I love working in a unixy environment, I think. There's a bunch of utilities that embrace the command line and take simple input and deliver equally simple output. I've employed sed and awk, in the past, and I still use them to perform some very simple parsing. For example, I can often be found doing something like &lt;code&gt;ps auxwww | grep ssh | awk {'print $2'}&lt;/code&gt; to get a list of ssh process IDs, for example.&lt;/p&gt;</description></item><item><title>You can, but you shouldn't</title><link>https://seancoates.com/blogs/you-can-but-you-shouldn-t</link><guid>https://seancoates.com/blogs/you-can-but-you-shouldn-t</guid><pubDate>Mon, 15 Sep 2008 02:55:23 UTC</pubDate><description>&lt;p&gt;"Here's the mascot," he said, leaning over one of my two half-walls, handing me a file of papers, "the production guys will get you the artwork. The jokes are at the back. Call me when it's ready."&lt;/p&gt;
&lt;p&gt;It's early 2000. I'm toiling away in my pseudo-cube in my &lt;a href="http://en.wikipedia.org/wiki/Moncton"&gt;hometown&lt;/a&gt;. I'm a script monkey. My job consists of writing minimal CFML (oh yeah, Coldfusion) wrappers around boring products, like &lt;a href="http://www.entreprisesshippagan.com/"&gt;fish hooks&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Denis, the cube-leaning account manager, had tasked me with a project that was mostly impossible (at the time), but moreover, it was a project that simply &lt;em&gt;shouldn't&lt;/em&gt; have been done.&lt;/p&gt;</description></item><item><title>Security and... Driving? (and Hiring)</title><link>https://seancoates.com/blogs/security-and-driving-and-hiring</link><guid>https://seancoates.com/blogs/security-and-driving-and-hiring</guid><pubDate>Mon, 15 Sep 2008 02:55:19 UTC</pubDate><description>&lt;p&gt;There's been a &lt;a href="http://www.greebo.net/?p=320"&gt;blip&lt;/a&gt; on the PHP blogosphere (think what you will of that word, it's accurate) regarding PHP's "inherent security flaws."&lt;/p&gt;
&lt;p&gt;I guess it's time to toss in my 2c (even though I &lt;em&gt;was&lt;/em&gt; one of the first to reply to &lt;a href="http://shiflett.org/archive/185"&gt;Chris'&lt;/a&gt; post on this). Since I like similes, I propose the following: coding is like driving.&lt;/p&gt;
&lt;p&gt;What? It's pretty simple, if you think about it.&lt;/p&gt;
&lt;p&gt;If you drive, you'll follow. If you don't, but have tried, you'll also follow. If you've never tried it, you should. (-:&lt;/p&gt;</description></item><item><title>($var == TRUE) or (TRUE == $var)?</title><link>https://seancoates.com/blogs/var-true-or-true-var</link><guid>https://seancoates.com/blogs/var-true-or-true-var</guid><pubDate>Mon, 15 Sep 2008 02:55:17 UTC</pubDate><description>&lt;p&gt;Interesting little trick I picked up a while back, been meaning to blog about it.&lt;/p&gt;
&lt;p&gt;Prior to enlightenment, I used to write conditionals something like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ($var &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;SOME_CONSTANT_CONDITION&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// do something
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&amp;hellip; more specifically:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ($var &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TRUE&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// do the true thing
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;That&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;s how I&amp;#39;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;d&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;say&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;it&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;so&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;that&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;s how I wrote it. But is it the best
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;way? I now don&amp;#39;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;t&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;think&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;so&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;When&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;reviewing&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;other&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;peoples&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39; code (often from
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;C programmers), I&amp;#39;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;ve&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;seen&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;backwards&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;conditionals&lt;/span&gt;&lt;span style="color:#f92672"&gt;..&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;something&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;like&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;``&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;`&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;TRUE&lt;/span&gt; &lt;span style="color:#f92672"&gt;==&lt;/span&gt; $var) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// ...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Which just sounds weird. Why would you compare a constant to a variable (you&amp;rsquo;d normally compare a variable to a constant).&lt;/p&gt;</description></item><item><title>mail() replacement -- a better hack</title><link>https://seancoates.com/blogs/mail-replacement-a-better-hack</link><guid>https://seancoates.com/blogs/mail-replacement-a-better-hack</guid><pubDate>Mon, 15 Sep 2008 02:55:10 UTC</pubDate><description>&lt;p&gt;This morning, I read Davey's &lt;a
href="http://pixelated-dreams.com/archives/154-mail-without-sendmail-on-linux-a-hack.html"&gt;post&lt;/a&gt;
about how to compile PHP in a way that allows you ro specify your own mail()
function. This is kind of a cool hack, but I've been using a different
approach for a while, now, that allows much better control. Read on if
you're interested.&lt;/p&gt;
&lt;p&gt;Davey's hack, if you didn't read his post, yet, centers around defining your OWN mail function, after you have instructed PHP not to build the default one.&lt;/p&gt;</description></item><item><title>XSS Woes</title><link>https://seancoates.com/blogs/xss-woes</link><guid>https://seancoates.com/blogs/xss-woes</guid><pubDate>Mon, 15 Sep 2008 02:54:55 UTC</pubDate><description>&lt;p&gt;A predominant PHP developer (whose name I didn't get permission to drop, so I won't, but many of you know who I mean) has been doing a bunch of research related to Cross Site Scripting (XSS), lately. It's really opened opened my eyes to how much I take user input for granted.&lt;/p&gt;
&lt;p&gt;Don't get me wrong. I write by the "never trust users" mantra. The issue, in this case, is something abusable that completely slipped under my radar.&lt;/p&gt;</description></item><item><title>Fun with the tokenizer...</title><link>https://seancoates.com/blogs/fun-with-the-tokenizer</link><guid>https://seancoates.com/blogs/fun-with-the-tokenizer</guid><pubDate>Mon, 15 Sep 2008 02:54:51 UTC</pubDate><description>&lt;p&gt;I was reminded, this past week, of how cool the &lt;a href="http://php.net/tokenizer"&gt;tokenizer&lt;/a&gt; is.&lt;/p&gt;
&lt;p&gt;One of the guys who works in the same office as I do had what seemed to be a simple problem: he had a php file that contained ~50 functions, and wanted to summarize the API without parsing through the file, manually, and cutting out the function declarations.&lt;/p&gt;
&lt;p&gt;We introduced him to &lt;a href="http://www.phpdoc.org/"&gt;in-line phpdoc blocks&lt;/a&gt; (he works (as a Jr.-level PHP developer) in the same office, but for a different company, so he doesn't have to follow our coding standards, but I digress..), but the 50-function library in question didn't have docblocks.&lt;/p&gt;</description></item><item><title/><link>https://seancoates.com/blogs/anova-precision-oven</link><guid>https://seancoates.com/blogs/anova-precision-oven</guid><pubDate>Mon, 01 Jan 0001 00:00:00 UTC</pubDate><description>&lt;p&gt;This post doesn&amp;rsquo;t exactly fit the normal theme of my blog, but over the past few weeks, several people have asked me about this, so I thought it was worth jotting down a few notes.&lt;/p&gt;
&lt;p&gt;In January 2021, after eyeballing the specs and possibilities for the past few months, I splurged and ordered the Anova Precision Oven. I&amp;rsquo;ve owned it for over a year, now, and I use it &lt;em&gt;a lot&lt;/em&gt;. But I wish it was quite a bit better.&lt;/p&gt;</description></item><item><title/><link>https://seancoates.com/blogs/zappa-and-lambci</link><guid>https://seancoates.com/blogs/zappa-and-lambci</guid><pubDate>Mon, 01 Jan 0001 00:00:00 UTC</pubDate><description>&lt;p&gt;In the &lt;a href="https://seancoates.com/blogs/zappa/"&gt;previous post&lt;/a&gt;, we talked about Python serverless architectures on Amazon Web Services with &lt;a href="https://github.com/Miserlou/Zappa"&gt;Zappa&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In addition to the previously-mentioned benefits of being able to concentrate directly on the code of apps we&amp;rsquo;re building, instead of spending effort on running and maintaining servers, we get a few other new tricks. One good example of this is that we can allow our developers to deploy (Zappa calls this &lt;code&gt;update&lt;/code&gt;) to shared &lt;em&gt;dev&lt;/em&gt; and &lt;em&gt;QA&lt;/em&gt; environments, directly, without having to involve anyone from ops (more on this in another post), nor even do we require a build/CI system to push out these types of builds.&lt;/p&gt;</description></item></channel></rss>