<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Code &#8211; Mike Industries</title>
	<atom:link href="https://mikeindustries.com/blog/archive/category/code/feed" rel="self" type="application/rss+xml" />
	<link>https://mikeindustries.com/blog</link>
	<description>A running commentary of occasionally interesting things — from Mike Davidson.</description>
	<lastBuildDate>Tue, 29 Dec 2020 19:41:13 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.3</generator>
	<item>
		<title>Upgrading Mint for use with PHP 7+</title>
		<link>https://mikeindustries.com/blog/archive/2020/12/upgrading-mint-for-use-with-php-7</link>
					<comments>https://mikeindustries.com/blog/archive/2020/12/upgrading-mint-for-use-with-php-7#comments</comments>
		
		<dc:creator><![CDATA[Mike D.]]></dc:creator>
		<pubDate>Mon, 28 Dec 2020 19:36:10 +0000</pubDate>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Original]]></category>
		<category><![CDATA[rgb-155-163-76]]></category>
		<guid isPermaLink="false">https://mikeindustries.com/blog/?p=29425</guid>

					<description><![CDATA[This is a very niche post, but I&#8217;m posting it mainly to help people who might be searching Google for the solution to this problem: if you have been using Shaun Inman&#8217;s Mint for self-hosted website stats, you may have noticed that it no long works in PHP 7 and above. When I noticed it [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>This is a <em>very</em> niche post, but I&#8217;m posting it mainly to help people who might be searching Google for the solution to this problem: if you have been using Shaun Inman&#8217;s <a href="https://haveamint.com">Mint</a> for self-hosted website stats, you may have noticed that it no long works in PHP 7 and above.</p>
<p>When I noticed it broke, I spent several hours trying to figure out why and to fix it as quickly and easily as possible. Essentially, there are two reasons why it doesn&#8217;t work anymore:</p>
<ol>
<li>PHP 7 no longer lets you use <code>"=&"</code> to <a href="https://www.php.net/manual/en/migration70.incompatible.php">&#8220;assign a new object by reference&#8221;</a>. I don&#8217;t even really know what this means, but I do know you can solve it simply by removing the <code>&</code>. There is only one place you need to do this in Mint&#8217;s code and that is on line 3409 of <code>/mint/app/lib/mint.php</code> where it says <code>$DOM =& new SI_Dom($xml);</code>. This problem was infuriating because it just makes the whole app fail silently, without throwing a single error. I spent a half a day deleting random code just to identify the culprit.</li>
<li>The MySQL API has been deprecated in PHP 7 and Mint uses it for all of its database work. You&#8217;re supposed to rewrite all of your queries to use the new <code>mysqli</code> or <code>PDO_MySQL</code> APIs, but after a few hours of trying to do this, I realized my PHP skills were not up to the task and I opted for an easier solution instead. There&#8217;s a <a href="https://github.com/e-sites/php-mysql-mysqli-wrapper">wrapper</a> you can just include with your Mint install that translates all of the functions on the fly for you. This method is generally &#8220;not recommended&#8221; by people who actually know what they&#8217;re doing, but for a quick fix, it worked perfectly for me. If someone wants to patch Mint correctly, I will gladly post a pointer to it here. Anyway, all you have to do is download that file, upload it to <code>/mint/app/</code> (next to <code>path.php</code>), call it something like <code>mysql_bridge.php</code> and then add this line right above the first <code>include</code> statement in <code>/mint/index.php</code>: <code>include(MINT_ROOT.'app/mysql_bridge.php');</code></li>
</ol>
<p>Voila! You&#8217;re done. The whole procedure should take only a few minutes.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mikeindustries.com/blog/archive/2020/12/upgrading-mint-for-use-with-php-7/feed</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Shipping vs. Learning</title>
		<link>https://mikeindustries.com/blog/archive/2016/09/shipping-vs-learning</link>
					<comments>https://mikeindustries.com/blog/archive/2016/09/shipping-vs-learning#comments</comments>
		
		<dc:creator><![CDATA[Mike D.]]></dc:creator>
		<pubDate>Thu, 08 Sep 2016 16:39:27 +0000</pubDate>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Original]]></category>
		<category><![CDATA[Technology]]></category>
		<guid isPermaLink="false">https://mikeindustries.com/blog/?p=28356</guid>

					<description><![CDATA[&#8220;What did you ship last quarter?&#8221; &#8220;When is this going to ship?&#8221; &#8220;Real artists ship.&#8221; The verb &#8220;ship&#8221; has a long history in the software development world and before that, the physical world. In the physical world, it originally meant &#8220;to transport something on a vessel&#8221;, and in the software world, it meant &#8220;to press a tape/disk/CD [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>&#8220;What did you ship last quarter?&#8221;</p>
<p>&#8220;When is this going to ship?&#8221;</p>
<p>&#8220;Real artists ship.&#8221;</p>
<p>The verb &#8220;ship&#8221; has a long history in the software development world and before that, the physical world. In the physical world, it originally meant &#8220;to transport something on a vessel&#8221;, and in the software world, it meant &#8220;to press a tape/disk/CD and send it out to consumers&#8221;. Since then, it has come to simply mean &#8220;release&#8221;, and even then, usually not in any sort of <em>final form</em>.</p>
<p>Everyone inside tech companies loves shipping. It&#8217;s the culmination of a lot of hard work and creativity from designers, engineers, PMs, researchers, and any number of other people, and when it&#8217;s good it puts a dent in the universe. It is no wonder then that so much of the machinery of tech organizations is centered around shipping.</p>
<p>But should it be? Especially given how much shipping itself has changed in the last couple of decades?</p>
<p><span id="more-28356"></span></p>
<p>Here is a non-exhaustive list of problems that can occur when everything is oriented around shipping:</p>
<ul>
<li>Teams ship inferior or non-impactful things in order to say they shipped something</li>
<li>Team A ships more than Team B and thus appears more competent, even though Team B&#8217;s mission is more difficult or process more rigorous</li>
<li>Teams ship things that teach their company nothing</li>
<li>Teams manipulate (or very liberally analyze) data in order to justify shipping</li>
<li>Teams aren&#8217;t given enough runway to do great work because of the constant pressure to ship ASAP</li>
<li>Team members are given (or not given) raises, promotions, or other praise because of how often (or seldom) they ship</li>
</ul>
<p>Whenever I talk to design leaders from other organizations, I&#8217;m struck by how similar everyone&#8217;s challenges are. Over coffee with my friend <a href="http://capwatkins.com">Cap Watkins</a> — Buzzfeed&#8217;s Head of Design — we talked about if there was a better way to measure progress than shipping.</p>
<p><em>Learning</em> as a prime objective was what kept coming up. Organizations that <em>learn</em> the quickest seem the most likely to succeed over the long haul. This is not an original thought, for sure, but most companies don&#8217;t seem to have operationalized it formally.</p>
<p>Maybe shipping is actually just a subset of learning, or at the very least, in service of it. Put differently, shipping can be a great way to learn, but it&#8217;s not the only way, and it&#8217;s not always the best way. If all of that is true, how might we re-orient the development process around learning?</p>
<p>A provocative approach would be to prioritize <em>learning</em> as the most important <strong>regular deliverable</strong> of engineering/product/design teams. Let&#8217;s say you are a manager, executive, or anyone else interested in a particular product within a company. Here is the sort of progress report you are probably used to seeing from whoever is leading the team building the thing:</p>
<blockquote><p><strong>SEPTEMBER</strong></p>
<ul>
<li>Launched movie recommendations</li>
<li>Hired 2 engineers</li>
<li>Fixed 30 bugs</li>
<li>Went into beta with collaborative filtering</li>
<li>Drafted product plan for internationalization</li>
</ul>
</blockquote>
<p>When written more with more structure, they can take the form of OKRs (Objectives &amp; Key Results) or KPIs (Key Performance Indicators).</p>
<p>While useful in showing that the team isn&#8217;t sitting on their hands, it doesn&#8217;t really hold anyone accountable for what good all of that is doing for the organization. What caused the team to launch movie recommendations and what will that mean for the business? What will 2 more engineers accomplish? What is the impact of the bugs fixed? What do we hope to learn from the collaborative filtering beta and how will we know we should even launch it? What have we learned about internationalization in terms of how much bigger it will make our business or how much of an effort it will be?</p>
<p>A list like the one above is at best a tactical inventory, but at worst a veil that masks how little actual learning may be occurring. In other words, it may make you look like you&#8217;re moving forward (good!) at the expense of ignoring how little of a difference you are making (bad!). What if, instead of delivering something like that every week, month, or quarter, you delivered something more like this:</p>
<blockquote><p><strong>SEPTEMBER</strong></p>
<ul>
<li><strong>What we learned:</strong> Removing steps from our onboarding experience did not reduce user confusion. Instead, clearing up language such that users felt they were making progress resulted in the greatest gains (link to more details here).</li>
<li><strong>Cost to learn:</strong> One researcher, one prototyper, one week of calendar time, and $2000 in participant fees.</li>
<li><strong>Plan to proceed:</strong> Productionize new language within one month.</li>
<li><strong>What&#8217;s needed to proceed:</strong> Some internationalization help&#8230; we&#8217;ll outsource this.</li>
</ul>
<p>&nbsp;</p>
<ul>
<li><strong>What we learned:</strong> We have entire tab in our app — Theaters — that only 1% of our users regularly use. Additionally, we have another feature — Friends — buried under a sub-menu, that almost half of our users use regularly. We aren&#8217;t sure what the effects would be if replace Theaters with Friends, but it seems like the right thing to do.</li>
<li><strong>Cost to learn:</strong> One PM, from one day of digging through data.</li>
<li><strong>Plan to proceed:</strong> Run an experiment swapping in a Friends tab in place of the Theaters tab and see what effect it has on metrics.</li>
<li><strong>What&#8217;s needed to proceed:</strong> We have no dedicated data scientist in our group. Would be great to have one, but short of that, if we could just get a day per week of someone&#8217;s time, we&#8217;d take that.</li>
</ul>
<p>&nbsp;</p>
<ul>
<li><strong>What we learned:</strong> Our projects take at least 30% longer than they should because of an outdated build process that has too many dependencies. In addition to the cost in extra time spent, we have also lost engineers and designers due to this frustration.</li>
<li><strong>Cost to learn:</strong> We&#8217;ve been paying this cost in slow development and high attrition for at least two years.</li>
<li><strong>Plan to proceed:</strong> We just dedicated two weeks of an engineer&#8217;s time to investigate the issues and what it would take to fix. Our hope is to stack rank what&#8217;s easiest and most valuable to fix and then attack the list aggressively.</li>
<li><strong>What&#8217;s needed to proceed:</strong> We need air cover from executive leadership for probably about a month while we get this fixed. Meaning, we need to pause our current product work and not have to answer questions about why. This is important work, leverageable by the entire organization.</li>
</ul>
</blockquote>
<p><strong>What we learned</strong> is really the key deliverable, and something potentially interesting to many people across the company. <strong>Cost to learn</strong> is a chance to optimize for and highlight efficiency, as spending a year of engineering time carries much greater opportunity costs than running some efficient, qualitative testing. <strong>Plan to proceed</strong> lets people know the outcome of the learning and how it affects the way forward. And finally, <strong>what&#8217;s needed to proceed</strong> spells out what a manager, executive, or anyone outside the core team can do to help.</p>
<p>This is a rough sketch and could use plenty of iteration and refinement, but one thing I like about it is that <em>while there are plenty of legitimate and illegitimate excuses for not shipping, there is really no excuse for not learning</em>. In other words, a team could spend an entire quarter (or much longer) shipping absolutely nothing, even though they are doing all the right things. However, if a team is not learning quickly and regularly, they are almost certainly doing something wrong.</p>
<p>I also like that a re-orientation around learning gets people thinking in an entirely different way.</p>
<p><em>&#8220;What&#8217;s the minimum we can ship with?&#8221;</em> becomes <em>&#8220;How might we learn X most quickly?&#8221;</em></p>
<p><em>&#8220;What do we want to release next quarter?&#8221;</em> becomes <em>&#8220;What is most important for us to learn about our product next quarter?&#8221;</em></p>
<p><em>&#8220;How can we ship more often?&#8221;</em> becomes <em>&#8220;How can we increase the pace of our own learning?&#8221;</em></p>
<p>None of this means you won&#8217;t also have to ask questions about shipping, but shipping simply becomes another way to learn&#8230; alongside research, prototyping, and many other methods. It&#8217;s still what you ultimately want to get to, but it&#8217;s more a by-product of the methodical learning you hold yourself and all teams within the company accountable for every week, month, or quarter.</p>
<p>Some of today&#8217;s companies who learn and evolve the quickest have surely already operationalized some of this sort of thinking, even if informally or by accident. If you&#8217;re reading this and you&#8217;re thinking to yourself &#8220;we already do all of that!&#8221;, then that is fantastic (and I would love to hear more about your process in the comments)! If, however, this sort of re-orientation sounds refreshing to you, start talking about it with your team and see what steps you can take to try it out on a project or two. I&#8217;m curious to hear what works best for everyone.</p>
<p><em>(This post also <a href="https://medium.mikeindustries.com/shipping-vs-learning-f242b6f4bb7f">available on Medium</a>.)</em></p>
]]></content:encoded>
					
					<wfw:commentRss>https://mikeindustries.com/blog/archive/2016/09/shipping-vs-learning/feed</wfw:commentRss>
			<slash:comments>8</slash:comments>
		
		
			</item>
		<item>
		<title>Reboot!</title>
		<link>https://mikeindustries.com/blog/archive/2016/05/reboot</link>
					<comments>https://mikeindustries.com/blog/archive/2016/05/reboot#comments</comments>
		
		<dc:creator><![CDATA[Mike D.]]></dc:creator>
		<pubDate>Mon, 02 May 2016 02:09:54 +0000</pubDate>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Original]]></category>
		<guid isPermaLink="false">https://mikeindustries.com/blog/?p=27623</guid>

					<description><![CDATA[It&#8217;s been 7 years since I last redesigned Mike Industries, and it feels like even longer. The old design still holds up considering the largely desktop audience it was designed for, but since it&#8217;s May 1st Reboot Day, and I&#8217;ve had some time on my hands since leaving Twitter, I thought I&#8217;d release a shiny [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>It&#8217;s been 7 years since I last redesigned Mike Industries, and it feels like even longer. The old design still holds up considering the largely desktop audience it was designed for, but since it&#8217;s <a href="http://www.may1reboot.com">May 1st Reboot Day</a>, and I&#8217;ve had some time on my hands since leaving Twitter, I thought I&#8217;d release a shiny new version today.</p>
<p>Say hello to Mike Industries, Version 3.</p>
<p>What is wrong with the old Version 2, you ask? Well:</p>
<ul>
<li>It&#8217;s not responsive.</li>
<li>It ingests and displays all of my Tweets and saved Tumblr links, which seems like overkill now.</li>
<li>Because of all the peripheral stuff being displayed, WordPress isn&#8217;t able to assemble the page very quickly and browsers are also slow to render it.</li>
<li>It doesn&#8217;t take advantage of any of the great HTML, CSS, and related advancements that have developed in the last few years.</li>
<li>It was just time for a change, and I felt like getting back into pixels and code again.</li>
</ul>
<p>While I&#8217;ve spent the last few months putting this together, it only occupied a day or two of time per week. Lots of fits and starts, including periods of frustration and reflection where I&#8217;ve asked myself &#8220;Why am I not just moving everything to <a href="http://medium.com">Medium</a>?&#8221;</p>
<p><span id="more-27623"></span></p>
<p>The answer to the Medium question is two-fold, for me:</p>
<ol>
<li>As someone who designs things for a living, there is a certain amount of professional pride in creating one&#8217;s own presence on the internet. It&#8217;s kind of like if an architect didn&#8217;t design their own house. Almost every non-architect — which is 99% of the world — should live in a house designed by someone who knows what they are doing, but if you have the skills, why not use them?</li>
<li>In working through all of the various issues that come with designing a modern, responsive site, I gained a whole new appreciation for how well-built Medium really is. I mean, I knew it was well-built before, but it really is the highest-quality solution for most people out there. Aside from the exquisite craftsmanship, the network effects that now occur around well-written articles on Medium rival and sometimes exceed those experienced during the Blogging Days of Yore. For this reason, I going to — at least initially — cross-post articles on both Mike Industries and <a href="http://medium.mikeindustries.com">medium.mikeindustries.com</a>, which is a sub-domain on the Medium platform. Coincidentally, I have also owned meatium.com for a long time, so if I ever start up a food blog for carnivores, I might host Meatium on Medium.</li>
</ol>
<p>This site, when active, has always been a bubbling cauldron of experimental hacks and concepts, and I&#8217;m happy to say that version 3.0 continues this tradition. The site is still a work-in-progress, but below is the philosophy behind it, as well as a host of implementation tidbits.</p>
<h3>First Principles</h3>
<p>In the past, I&#8217;ve taken a certain amount of pride in some of the bells and whistles around this site. The landmark feature of Mikeindustries 1 was a header displaying a background image of the view outside my apartment window, updated every few minutes. The site also had a font selector in the sidebar which allowed you to customize the typeface throughout the site. Back in 2003, that was kind of cool&#8230; to me at least. Mikeindustries 2 was all about <a href="https://mikeindustries.com/sifr">sIFR</a> and separate columns for articles, links, and Tweets.</p>
<figure><img fetchpriority="high" decoding="async" src="/blog/images/inline/mi1.jpg" alt="Mike Industries, Version 1" width="1516" height="1254" class="alignnone size-full wp-image-27629" srcset="/blog/images/inline/mi1.jpg 1516w, /blog/images/inline/mi1-300x248.jpg 300w, /blog/images/inline/mi1-768x635.jpg 768w, /blog/images/inline/mi1-1024x847.jpg 1024w" sizes="(max-width: 1516px) 100vw, 1516px" /><figcaption>Version 1 (circa 2003)</figcaption></figure>
<figure><img decoding="async" src="/blog/images/inline/mi2.jpg" alt="Mike Industries, Version 2" width="1956" height="1577" class="alignnone size-full wp-image-27628" srcset="/blog/images/inline/mi2.jpg 1956w, /blog/images/inline/mi2-300x242.jpg 300w, /blog/images/inline/mi2-768x619.jpg 768w, /blog/images/inline/mi2-1024x826.jpg 1024w" sizes="(max-width: 1956px) 100vw, 1956px" /><figcaption>Version 2 (circa 2009)</figcaption></figure>
<p>I started off Mikeindustries 3 with the opposite approach: what is the bare minimum I need? When an article is displayed, do I need any elements at all besides the text itself? If I get draconian here, can I do the whole thing as one template to rule them all? If I put everything someone might want to know about me into a single About page, do I even need persistent navigation?</p>
<p>And perhaps the most confounding question of all: what about my design work? While part of me really wants to keep it all online and easily accessible, the other part of me recognizes how dated all digital work gets and wonders if it&#8217;s worth it at all. The most recent version of my portfolio is also in Flash, so clearly a straight porting wasn&#8217;t going to happen.</p>
<p>In the end, I decided to take a down-to-the-studs approach, launch the foundation on May 1st, and then slowly add things back in if and when necessary. At this point in my career, design leadership is a bigger part of my skillset than hands-on design, so I imagine any sort of portfolio I might put together in the future would serve a different purpose than it did 7 years ago.</p>
<h3>Content</h3>
<p>I settled on three types of content for the new site: What I&#8217;m Writing, What I&#8217;m Reading, About Me. The first is made up of original blog posts authored in WordPress. The second is a running list of articles I&#8217;ve faved in Instapaper. While I read of lot of things on the internet and Tweet out links to many of them, I&#8217;ve found that my Instapaper faves represent all of the best long-form stuff I&#8217;ve come across, and that is really all I want to publish here. So&#8230; the main Mike Industries stream is now comprised of What I&#8217;m Writing and What I&#8217;m Reading. If you want to dig into either separately, there&#8217;s navigation for that. The third type of content is a simple About Me page for people who are interested in contacting me or finding me on other networks.</p>
<h3>WordPress</h3>
<p>Hoooooooboyyyy. Where to start on WordPress. I love WordPress, I am so glad it exists, and I&#8217;m happy to host my stuff on it, BUT, it is an absolute bear for someone with my particular skills inventory. If you have no skills at all, you just pick a theme, do all of your customizations in the GUI, and be happy with what you get for free. If you are a PHP wizard who has worked on dozens of custom WordPress installations, you just build everything from scratch, hack when you need to hack, and know where all the bodies are buried. For someone like me, however, who knows HTML and CSS very well but is only a <a href="https://en.wikipedia.org/wiki/Script_kiddie">script kiddie</a> with PHP and WordPress functions, the task of building any sort of site is daunting.</p>
<p>Here&#8217;s generally how my progression went:</p>
<p><strong>Step 0</strong>: Spend a week or two in Sketch coming up with a great design that fits my objectives and makes me happy. No problem.</p>
<p><strong>Step 1</strong>: Begin coding from scratch. The HTML and CSS part go well, but when I get to the task of snapping it into WordPress templates, I realize there is so much WordPress functionality that already exists that I am not getting for free if I don&#8217;t use a existing WordPress theme.</p>
<p><strong>Step 2</strong>: Begin looking for an existing theme that remotely resembles my design. Realize there is none. I probably wasted an entire week on this.</p>
<p><strong>Step 3</strong>: Take the one that seems closest anyway and then crack it open to see how it&#8217;s coded. HOLY SHIT FUCK THAT THERE IS NO WAY I AM USING THIS RAT&#8217;S NEST SPUN FROM GARBAGE.</p>
<p><strong>Step 4</strong>: Look for another theme that is as simple as possible and just gets me to a reasonable baseline. I wasted another week or two on this as every theme I looked at still included things I didn&#8217;t need or want. Maybe I am misjudging, but even the standard &#8220;twentyfifteen&#8221; theme that comes with WordPress seemed like overkill.</p>
<p>That&#8217;s when I realized why I was having such a hard go at it: most themes are built for non-technical people so they can make customizations in the WordPress GUI, and thus, contain a ton of extra code to make this possible. While that is noble, it&#8217;s not for me.</p>
<p>This is one of the many points when I almost threw my hands up and just moved to Medium.</p>
<p>The last thing I tried ended up being the right approach for me: take the simplest built-in theme (which I believed was probably twentyfifteen), keep all of the template files, but strip them down to nothing except a few bare-bones functions that I know I needed.</p>
<p>Using an almost blank set of templates, I was able to get Mike Industries 3 90% working within a week or two. But, as <a href="https://en.wikipedia.org/wiki/Ninety-ninety_rule">the saying</a> goes &#8220;the first 90 percent of the code accounts for the first 90 percent of the development time. The remaining 10 percent of the code accounts for the other 90 percent of the development time.&#8221;</p>
<p>That last 90% would be spent on some nasty CSS layout bugs but also some really cool stuff, outlined below.</p>
<h3>Elasticity</h3>
<p>No one would build a website these days without crafting it to adjust nicely across a wide range of screen sizes. Down in the coal mines, we call this Responsive Design, as most people reading this blog already know. I&#8217;m calling this section Elasticity though, because the solution I settled on feels more elastic than anything else. The last time I redesigned this site, there was no such thing as &#8220;vh&#8221; and &#8220;vw&#8221; units. Now there are, and they are amazing! Most type blocks, as well as some div heights and widths are now specified as a percentage of the viewport width (vw) or viewport height (vh). For instance, on desktop, you&#8217;ll notice that the large image goes about 70% down the screen, allowing for a preview of the first article. Also, if you stretch your browser window horizontally, you&#8217;ll notice that the type resizes with it. There are also upper and lower limits for type so things don&#8217;t get too cray-cray. I&#8217;m really digging this method of sizing. As for the traditional concept of responsiveness, I only used one breakpoint; you either get the one-column mobile/tablet layout or the two column desktop layout. Seems more than adequate, especially considering I&#8217;m also doing some other things like limiting paragraph line-length, which maximize readability at certain screen sizes.</p>
<h3>Typography</h3>
<p>As I mentioned, type sizing is dynamic, which is cool, and I decided to stick to a system face, Avenir on Apple devices, Roboto on Android devices, and Helvetica/sans on everything else. This is an area where I may switch to a webfont eventually, but I really hate it when sites go blank for a few seconds as they load their fonts. Even with sIFR, we never recommended people use it for large bodies of text. I find Avenir looks pretty sharp here actually.</p>
<p>As has been my practice in the past, I don&#8217;t use grids — baseline or otherwise. Grids are sort of like the equivalent of weighing your ingredients when you bake. They are the &#8220;correct&#8221; thing to do and they ensure a certain level of precision, but they aren&#8217;t always necessary, depending on your experience and your goals. Furthermore, unlike in baking, if you got an element wrong, you can fine-tune it at any time. (I should also note here that I&#8217;ve been doing a lot of baking lately and I absolutely weigh my ingredients, for now.)</p>
<h3>Imagery and color</h3>
<p>Imagery and color are where things got really fun in this project. I initially built a lot more than what I&#8217;m launching but then ended up commenting a lot of it out for now, because I&#8217;m not sure I need or want a user navigable gallery of photos as part of the core experience. Not until I think it through a little more, at least.</p>
<p>My primary goal for imagery on Mike Industries 3 was to build a system which allowed me to keep things fresh with minimal effort. In thinking what the dead-simplest flow would be for featuring new images, I actually settled on email! If I could just email any photo on any device at any time to a secret email address and that would publish it to the site, that would be fantastic. Luckily, there is a WordPress plug-in called <a href="http://postieplugin.com">Postie</a> which facilitates this sort of thing. I tried to stay away from plug-ins entirely, but this one only hits the publishing side and not the rendering side, so it seemed like a great choice. The next step was figuring out how to integrate it such that its output could be used as a randomized series of background images in the header. I&#8217;m not completely settled on this format yet, but I essentially have it listen for new images sent to an email address and then publish each as a post with a special tag. Then, in PHP on the rendering side, I have WP loop through these posts, create an array of image URLs, titles, and dates (from EXIF data), and then display one randomly when you hit the front page and a few other pages. If an individual post has a &#8220;featured image&#8221; attached to it, I use that image instead. I&#8217;d post the PHP, but that would expose me for the hack that I am. Pay no attention to the code behind the curtain!</p>
<p>Alright, so, big beautiful images all over the site with minimal effort to keep fresh! What could go wrong? Well, the downside is that big beautiful images are also big in load time. For people with giant retina monitors and good connections, I love serving up a crystal clear phatty, but for more constrained environments — especially mobile — that 800k file would be much better off at 50k or so.</p>
<p>There are SO many ways of dealing with adaptive image sizes these days, but most of them left me unimpressed. Even <tt><a href="https://css-tricks.com/responsive-images-youre-just-changing-resolutions-use-srcset/">srcset</a></tt>, which is an emerging standard, feels wrong to me. I&#8217;ve never liked the idea of hardcoding image sizes in HTML and <tt>srcset</tt> makes this even worse. To me, the ideal long-term solution has the client send some screen resolution info to the server and the server dynamically decides what image to send. Luckily for me, someone already wrote something like this a few years ago: <a href="https://mattwilcox.net">Matt Wilcox</a>&#8216;s <a href="http://adaptive-images.com">Adaptive Images</a>. For some reason, it&#8217;s gone largely unsupported and dormant since then, but I found it to work perfectly for my purposes. The mechanism is simple:</p>
<ol>
<li>All requests for images get intercepted by PHP.</li>
<li>PHP reads a cookie with the user&#8217;s viewport resolution information.</li>
<li>PHP then checks to see of a version of that image at the appropriate resolution breakpoint has already been cached. If so, it serves it.</li>
<li>If there is no cached file at the right resolution yet, or if the cached file is stale, PHP creates one and then serves it.</li>
</ol>
<p>Super simple and works with very little configuration or retrofitting of existing imagery. This was important to me as I&#8217;m not about to sign up for going through 10 years of <tt>HTML IMG</tt> code and changing a bunch of shit.</p>
<p>Alright, so now that all of our images are adaptive in file size and resolution, we&#8217;re done, right? Turns out, not exactly. Even on fast connections, there is still an annoying lag before a large image loads and renders. Because the rest of the layout renders instantly, I had a giant placeholder space to figure out what to do with. Once again there are SO many ideas for what to do in this situation. You can read a good run-down of <a href="https://jmperezperez.com/medium-image-progressive-loading-placeholder/">a bunch of them here</a>. Not surprisingly, Medium&#8217;s is probably the best implementation. Since I&#8217;m trying to keep things as simple as possible and not use javascript except where absolutely necessary, I came up with my own serviceable solution.</p>
<p>Using the aforementioned Adaptive Images PHP script as a baseline, I added a couple of lines to it that save out a tiny, 10-pixel wide version of every image as well as the chosen adaptive size. Then, I load that tiny image as a background-image of a div behind the main photo div and stretch it to fit the entire dimensions of the div. The effect looks amazing in Chrome and slightly less good in Safari, due to surprising differences in how they interpolate images. As a result, the tiny sub-1k file loads instantly, showing you an interesting gradient mesh that approximates the full image, and then the full-image quickly fades in when it is loaded (accomplished with the css <tt>transition</tt> property).</p>
<p>For the icing on the cake, I wanted to set the color scheme of the page (type, sidebar color, etc) to match the dominant color in the photo. The first time I saw this done, it was in <a href="http://mezzoblue.com/archives/2008/06/10/design_notes/">Dave Shea&#8217;s last Mezzoblue redesign</a> a lonnnnnnnng time ago, but the color was set manually. I&#8217;m too lazy for that, so I began looking for ways to find dominant colors programmatically. A lot of people have tried different methods to do this and most of them don&#8217;t work very well. The one I found that worked the best and was easiest to implement is called <a href="http://lokeshdhakar.com/projects/color-thief/">Color Thief</a>. Unfortunately it&#8217;s javascript-based, but in this case, I&#8217;m cool with that, because if I was going to do it server-side, I would want to build something that only did the calculation once and stored it. In fact, let me just call timeout and describe how this entire set of things <em>should</em> work in WordPress, in case someone knows how to build it:</p>
<ol>
<li>Photo is uploaded into WordPress.</li>
<li>WordPress stores tiny-resolution file for the gradient mesh version.</li>
<li>WordPress performs dominant-color and perhaps even dominant-palette calculation a la Color Thief and stores it as attachment metadata.</li>
<li>All of this is just magically available in PHP.</li>
</ol>
<p>So, since none of that exists yet — to my knowledge, at least — I&#8217;m just using ColorThief.js for now, which is why you see the color palette fade into prominence in concert with the high resolution imagery. I&#8217;m looking forward to streamlining this when someone builds something like what is described above. Is that you? I think that should be you!</p>
<h3>Final Retrofits</h3>
<p>Throughout this entire redesign, I was worried about how all of my legacy articles would look. Clearly there are going to be some weirdly formatted older posts that contain some experimental stuff, but what about the 99% of posts that use a pretty standard mix of (non-responsive) text and inline imagery? Turns out, one style rule pretty much fixed everything: <tt>img {max-width: 100%; height: auto}</tt>. That one rule kept all my images from sliding off into the gutter on smaller screens and made the site look like it&#8217;s been responsive for years. Magic.</p>
<h3>One Last Thing: Blog Comments!</h3>
<p>I got most of the way through this redesign thinking I would just keep comments turned off and hide all of the tens of thousands of great comments that readers have written over the last couple of decades&#8230; because who does blog comments anymore??? But then I got to thinking, <em>I miss comments</em>, and I never really had much of a comment spam or trolling problem on here before&#8230; so COMMENTS ARE BACK BABY. What&#8217;s old is new again. YOLO.</p>
<p>&#8230; and with that, I&#8217;m happy to ring in Mike Industries Version 3. It&#8217;s great to be back.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mikeindustries.com/blog/archive/2016/05/reboot/feed</wfw:commentRss>
			<slash:comments>26</slash:comments>
		
		
			</item>
		<item>
		<title>⇗ On Being A Senior Engineer</title>
		<link>https://mikeindustries.com/blog/archive/2016/05/on-being-a-senior-engineer</link>
					<comments>https://mikeindustries.com/blog/archive/2016/05/on-being-a-senior-engineer#respond</comments>
		
		<dc:creator><![CDATA[Mike D.]]></dc:creator>
		<pubDate>Mon, 02 May 2016 02:04:59 +0000</pubDate>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Links]]></category>
		<category><![CDATA[Instapaper]]></category>
		<guid isPermaLink="false">https://mikeindustries.com/blog/?p=27544</guid>

					<description><![CDATA[On Being A Senior Engineer I think that there’s a lot of institutional knowledge in our field, especially about what makes for a productive engineer. But while there are a good deal of books in the management field about “expert” roles and responsibilities of non-technical individual contributors, I don’t see too many modern books or [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><a href="http://www.kitchensoap.com/2012/10/25/on-being-a-senior-engineer/">On Being A Senior Engineer</a></p>
<blockquote><p>I think that there’s a lot of institutional knowledge in our field, especially about what makes for a productive engineer. But while there are a good deal of books in the management field about “expert” roles and responsibilities of non-technical individual contributors, I don’t see too many modern books or posts that might shed light directly on what makes for a good senior engineer.</p></blockquote>
]]></content:encoded>
					
					<wfw:commentRss>https://mikeindustries.com/blog/archive/2016/05/on-being-a-senior-engineer/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Make Your Twitter Stream More Interesting with the Stellar Tweetbot</title>
		<link>https://mikeindustries.com/blog/archive/2012/07/make-your-twitter-stream-more-interesting-with-the-stellar-tweetbot</link>
					<comments>https://mikeindustries.com/blog/archive/2012/07/make-your-twitter-stream-more-interesting-with-the-stellar-tweetbot#comments</comments>
		
		<dc:creator><![CDATA[Mike D.]]></dc:creator>
		<pubDate>Mon, 16 Jul 2012 06:33:53 +0000</pubDate>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Original]]></category>
		<category><![CDATA[Technology]]></category>
		<guid isPermaLink="false">https://mikeindustries.com/blog/?p=14345</guid>

					<description><![CDATA[If you&#8217;re like me, you&#8217;re both particular about who you follow on Twitter and perpetually in search of more entertainment in your feed. The problem with following everyone who belches out a random good tweet is that you then have ten more ho-dum tweets a day from them in your feed. The disincentive to follow [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>If you&#8217;re like me, you&#8217;re both particular about who you follow on Twitter and perpetually in search of more entertainment in your feed. The problem with following everyone who <a href="https://twitter.com/TacoBell/status/193433530477461504" target="_blank">belches out a random good tweet</a> is that you then have ten more ho-dum tweets a day from them in your feed. The disincentive to follow people on Twitter has never been higher than it is now, despite the fact that the service hosts more great content than it ever has.</p>
<p>I have a few ideas for fixing this problem, but one of them came to me a few months ago as I was using <a href="http://kottke.org" target="_blank">Jason Kottke&#8217;s</a> excellent <a href="http://stellar.io" target="_blank">Stellar.io</a> service (pronounced &#8220;Ste-LAH-ree-oh&#8221; by everyone except Jason). Stellar.io is a fantastic web-based service that lets you follow interesting people and receive a feed of all the tweets, Flickr images, YouTube videos, and other content they have faved on other services.  In Twitter terms, imagine a feed that doesn&#8217;t contain your friends&#8217; tweets, but rather the tweets that your friends have faved. In other words, one degree of separation away from your current Twitter stream.</p>
<p>Stellar is a great way to assemble this sort of feed, but if you&#8217;re like me, you&#8217;d rather see its output merged into your existing Twitter stream. To put it differently, when I open up my Twitter client, I want to see tweets from the few people I follow (as I do currently) <strong>and</strong> tweets from people I <strong>don&#8217;t</strong> follow which have been marked as favorites from people I <strong>do</strong> follow. Have I lost you yet?</p>
<p>To create this experience, I wrote a PHP script I call <a href="http://mikeindustries.github.com/Stellar-Tweetbot/" target="_blank">Stellar Tweetbot</a> which runs every 5 minutes via a cronjob that checks my Stellar account for new faved tweets, and then retweets any new tweets to my zombie Twitter account <a href="http://twitter.com/mike_stellar" target="_blank">@mike_stellar</a>. Then, I follow @mike_stellar from my normal Twitter account <a href="http://twitter.com/mikeindustries" target="_blank">@mikeindustries</a> and I magically have a more interesting Twitter stream.</p>
<p>To see what sorts of things now appear in my Twitter feed, without having to follow any new people, peep the image below (or just follow <a href="http://twitter.com/mike_stellar" target="_blank">@mike_stellar</a>):</p>
<p><img decoding="async" src="/blog/images/inline/stellar.gif" alt="" title="" width="450" height="298" class="border" /></p>
<p>The first tweet is <a href="http://twitter.com/robdelaney" target="_blank">Rob Delaney</a> making sure a can of Pepsi gets home safe. I don&#8217;t follow Rob so I would have normally missed this tweet. However, since I follow some people who faved it, I now see it in my Twitter stream.</p>
<p>The second tweet is to a really interesting article tweeted by <a href="https://twitter.com/robpegoraro/" target="_blank">Rob Pegoraro</a>. I don&#8217;t follow Rob, but I do follow the person who faved it: <a href="https://twitter.com/tcarmody" target="_blank">Tim Carmody</a> (not to be confused with <a href="https://twitter.com/tomcarmony/" target="_blank">Tom Carmony</a>, who I also follow, but let&#8217;s not even get into that).</p>
<p>The third tweet is by the funniest person on Twitter, <a href="https://twitter.com/kenjennings/" target="_blank">Ken Jennings</a>. Since I already follow him, I won&#8217;t see this as a dupe in my feed. Magic.</p>
<p>So that&#8217;s it. The <a href="http://mikeindustries.github.com/Stellar-Tweetbot/" target="_blank">Stellar Tweetbot</a>. I&#8217;ve opened sourced it on GitHub, and it&#8217;s the ugliest designer-written PHP code you&#8217;ve likely ever seen, but it works, yo! If you&#8217;re one of those propeller heads who writes much better PHP, feel free to rewrite it, and merge it into the GitHub Branch Repository Chamber Fork Commitment Thingamajigger.</p>
<p>Otherwise, feel free to do what I do and just use it. It will make your Twitter feed more interesting.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mikeindustries.com/blog/archive/2012/07/make-your-twitter-stream-more-interesting-with-the-stellar-tweetbot/feed</wfw:commentRss>
			<slash:comments>8</slash:comments>
		
		
			</item>
		<item>
		<title>How to Permanently Prevent OS X 10.7 Lion from ever Re-Opening Apps After a Restart</title>
		<link>https://mikeindustries.com/blog/archive/2012/03/how-to-permanently-prevent-os-x-10-7-lion-from-ever-re-opening-apps-after-a-restart</link>
					<comments>https://mikeindustries.com/blog/archive/2012/03/how-to-permanently-prevent-os-x-10-7-lion-from-ever-re-opening-apps-after-a-restart#comments</comments>
		
		<dc:creator><![CDATA[Mike D.]]></dc:creator>
		<pubDate>Thu, 08 Mar 2012 18:38:00 +0000</pubDate>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Miscellany]]></category>
		<category><![CDATA[Original]]></category>
		<category><![CDATA[Technology]]></category>
		<guid isPermaLink="false">https://mikeindustries.com/blog/?p=12849</guid>

					<description><![CDATA[While the latest version of Mac OS X, Lion, is generally wonderful, there is one &#8220;feature&#8221; that annoys thousands of people to no end: whenever your machine is restarted, every single application you happen to have open at the time is also relaunched and restored to the state it was in before you restarted. If [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" decoding="async" src="/blog/images/inline/restart.jpg" alt="" title="" width="450" height="243" class="border" /></p>
<p>While the latest version of Mac OS X, Lion, is generally wonderful, there is one &#8220;feature&#8221; that annoys thousands of people to no end: whenever your machine is restarted, every single application you happen to have open at the time is also relaunched and restored to the state it was in before you restarted. If you restart manually via the &#8220;Restart&#8230;&#8221; menu item, there is a checkbox you can uncheck which is supposed to shut off this behavior but it doesn&#8217;t always work. Additionally, if your computer restarts for any other reason &#8212; e.g. a power failure or a crash &#8212; you don&#8217;t even have the option of <em>trying</em> to prevent this behavior.</p>
<p>The downside of the behavior is obvious: it increases the time it takes to start up your machine into a steady state and it re-opens apps you may not be using anymore.</p>
<p>If you want to prevent this behavior entirely, there is now a foolproof, fully reversible way to do it. Simply:</p>
<ol>
<li>Quit all of your apps.</li>
<li>Navigate to here: <code>~/Library/Preferences/ByHost/com.apple.loginwindow.*.plist</code> (whereby * is a bunch of characters)</li>
<li>Click the file, do a <code>File > Get Info</code> (or command-I if you&#8217;re a pro), and lock it using the <code>Locked</code> checkbox.</li>
</ol>
<p>Voila. You&#8217;ve now prevented Lion from saving what apps and windows are open. To reverse this setting, simply unlock the file!</p>
<p>Another helpful hint as well: Lion, by default, hides your <code>~/Library/</code> folder. To make it visible again without showing all of your other invisible files, simply open up Terminal and type:</p>
<p><code>chflags nohidden ~/Library/</code></p>
]]></content:encoded>
					
					<wfw:commentRss>https://mikeindustries.com/blog/archive/2012/03/how-to-permanently-prevent-os-x-10-7-lion-from-ever-re-opening-apps-after-a-restart/feed</wfw:commentRss>
			<slash:comments>21</slash:comments>
		
		
			</item>
		<item>
		<title>Never Be Another</title>
		<link>https://mikeindustries.com/blog/archive/2011/10/never-be-another</link>
					<comments>https://mikeindustries.com/blog/archive/2011/10/never-be-another#comments</comments>
		
		<dc:creator><![CDATA[Mike D.]]></dc:creator>
		<pubDate>Fri, 07 Oct 2011 03:22:21 +0000</pubDate>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Miscellany]]></category>
		<category><![CDATA[Original]]></category>
		<category><![CDATA[Technology]]></category>
		<guid isPermaLink="false">https://mikeindustries.com/blog/?p=10678</guid>

					<description><![CDATA[When someone dies, the phrase &#8220;there will never be another&#8221; gets used quite frequently. It&#8217;s one of those phrases that is both always true and yet almost always not true. It&#8217;s true that, yes, no other person will ever be exactly like any other person, but it&#8217;s usually false in the compliment it&#8217;s actually trying [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" decoding="async" src="/blog/images/inline/stevejobs.jpg" alt="" width="450" height="410" class="" /></p>
<p>When someone dies, the phrase &#8220;there will never be another&#8221; gets used quite frequently. It&#8217;s one of those phrases that is both always true and yet almost always not true. It&#8217;s true that, yes, no other person will ever be exactly like any other person, but it&#8217;s usually false in the compliment it&#8217;s actually trying to pay.</p>
<p>In almost every case, when a public figure dies, there are plenty of his or her contemporaries ready to fill the void. A great guitarist died? Well we at least have hundreds of other world class guitarists to listen to. A basketball star died? Luckily we have plenty of those too.</p>
<p>The truth of the matter is that even best of the best in most fields, at any given time, is only a little better than the rest.</p>
<p>Counterexamples to this seem to happen only a handful of times per century. The number of times we lose someone whose impact was so dramatic and whose substitute seems so unfathomable is vanishingly small.</p>
<p>We lost that person yesterday in Steve Jobs, and we are only beginning to feel the impact of his absence.</p>
<p>What gets lost in all of these Steve Jobs tributes you read online is just how dark things were for personal technology only ten years ago. People forget that until the iPhone came out, &#8220;The Apple Way&#8221; was still largely on the sidelines. Windows PCs were unavoidable. Cell phones were unapproachable. There were even a few years around the turn of the century when many websites didn&#8217;t even work on Macs because developers only coded to PC Internet Explorer &#8220;standards&#8221; (airiest of air quotes there, of course).</p>
<p>It was just dark as hell out there; especially for those of us who wanted so badly for the story to end differently. The lesson that idealism and attention to detail could lose out to &#8220;good enough and a little cheaper&#8221; was not something we wanted to learn.</p>
<p>The long, but impeccably planned, turnaround that Steve Jobs has led over the last 14 years is impressive for thousands of reasons. None is more astounding to me than this one though: he was quite literally the one person on the face of the earth capable of pulling it off.</p>
<p>One. Out of 6,800,000,000 people.</p>
<p>He wasn&#8217;t just the best choice. He was the only choice. And that&#8217;s why we&#8217;ll miss him so much.</p>
<p>When people die after suffering from prolonged illness or pain, my thoughts are almost always positive. Death is not something I fear, and when it&#8217;s ultimately the relief method for someone&#8217;s pain and suffering, I feel happy for their newfound peace. I felt this way when Kurt Cobain died, for instance.</p>
<p>With Steve Jobs, however, I don&#8217;t get the feeling death was any sort of relief at all. Yes he was obviously at peace with the concept, as he expressed beautifully in his <a href="http://www.youtube.com/watch?v=D1R-jKKp3NA" target="_blank">Stanford commencement speech</a>, but SJ put the pedal to the metal until his final breath.</p>
<p>What would you do if you knew you had a short time to live? Most of us would quit our jobs. Many of us would travel. Some of us would relax and keep our stress levels down. What did Steve do? He hit the gas. He released the iPhone, unveiled the iPad, and led Apple to its current and still unfathomable status as the most valuable company in the world.</p>
<p>Just as incredibly, he was able to lift his body out of Apple without also removing his soul; on a day when many once feared AAPL stock would dive precipitously, it&#8217;s comfortably unchanged from the day before.</p>
<p>He had his flaws and he may not be the greatest person to ever live, but no one has ever left this world more on top than Steve Jobs has just left it.</p>
<p>Thanks for everything.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mikeindustries.com/blog/archive/2011/10/never-be-another/feed</wfw:commentRss>
			<slash:comments>14</slash:comments>
		
		
			</item>
		<item>
		<title>Cognition Comments Considered Harmful</title>
		<link>https://mikeindustries.com/blog/archive/2010/10/cognition-comments-considered-harmful</link>
					<comments>https://mikeindustries.com/blog/archive/2010/10/cognition-comments-considered-harmful#comments</comments>
		
		<dc:creator><![CDATA[Mike D.]]></dc:creator>
		<pubDate>Mon, 11 Oct 2010 06:42:33 +0000</pubDate>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Original]]></category>
		<category><![CDATA[Technology]]></category>
		<guid isPermaLink="false">https://mikeindustries.com/blog/?p=5554</guid>

					<description><![CDATA[I was looking forward to writing a post this weekend about Happy Cog&#8217;s new commenting system on their otherwise excellent new blog, but the sage minds at Full Stop interactive beat me to it. You should read Nate&#8217;s whole post. It&#8217;s spot-on. It&#8217;s interesting to me that Happy Cog is trying to eliminate the negative [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>I was looking forward to writing a post this weekend about Happy Cog&#8217;s <a href="http://cognition.happycog.com/article/is-this-thing-on" target="_blank">new commenting system</a> on their otherwise excellent new blog, but the sage minds at Full Stop interactive beat me to it. <a href="http://www.fullstopinteractive.com/blog/2010/10/in-defense-of-comments/" target="_blank">You should read Nate&#8217;s whole post</a>. It&#8217;s spot-on.</p>
<p>It&#8217;s interesting to me that Happy Cog is trying to eliminate the negative things associated with commenting by encouraging brevity, while for several years, the secret sauce I&#8217;ve cooked up to prevent comment spam has involved just the opposite: measuring the amount of time you spend typing and only entering your comment into the database if you spend more than a few seconds on it. It works like a charm and eliminates 99.9% of comment spam before it even gets in the front door.</p>
<p>In my opinion, what Happy Cog has created is useful. Let&#8217;s just not confuse it with a commenting system for a blog.</p>
<p>It doesn&#8217;t encourage community, it doesn&#8217;t encourage conversation, and for the most part, it&#8217;s not accretive in any way. What it does do is create a lot of linkbacks to your blog on Twitter. Is this valuable? Sure. But is it as valuable as free-flowing, insightful, conversations which elevate ordinary posts into conversation pieces?</p>
<p>Not for me it&#8217;s not.</p>
<p>For all the great things about Twitter &#8212; and there are many &#8212; one of the worst things about it is that it&#8217;s making us lazy ambassadors of our thoughts. Why spend an hour on a blog post when we can tweet out our main thesis in ten seconds? Why allow conversations on our blogs when we can just hear the first 140 characters of our readers&#8217; opinions?</p>
<p>We know short attention spans are bad for our intellectual development. We should be creating solutions that fight against this threat&#8230; not feed into it.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mikeindustries.com/blog/archive/2010/10/cognition-comments-considered-harmful/feed</wfw:commentRss>
			<slash:comments>16</slash:comments>
		
		
			</item>
		<item>
		<title>Another Nail in the Pageview Coffin</title>
		<link>https://mikeindustries.com/blog/archive/2010/06/another-nail-in-the-pageview-coffin</link>
					<comments>https://mikeindustries.com/blog/archive/2010/06/another-nail-in-the-pageview-coffin#comments</comments>
		
		<dc:creator><![CDATA[Mike D.]]></dc:creator>
		<pubDate>Mon, 28 Jun 2010 23:08:34 +0000</pubDate>
				<category><![CDATA[Advertising]]></category>
		<category><![CDATA[Business]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Original]]></category>
		<category><![CDATA[Technology]]></category>
		<guid isPermaLink="false">https://mikeindustries.com/blog/?p=4887</guid>

					<description><![CDATA[This weekend, msnbc.com launched a sweeping redesign of the most important part of their site: the story page. The result is something unlike anything any other major news site is offering and is a bold step in a direction no competitor has gone down (yet): the elimination of pageviews as a primary metric. For many [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>This weekend, msnbc.com launched a <a href="http://www.msnbc.msn.com/id/37643077" target="_blank">sweeping redesign</a> of the most important part of their site: the story page.  The result is something unlike anything any other major news site is offering and is a bold step in a direction no competitor has gone down (yet): the elimination of pageviews as a primary metric.</p>
<p><img loading="lazy" decoding="async" src="/blog/images/inline/newmsnbc.jpg" alt="" width="450" height="440" /></p>
<p>For many years, I&#8217;ve <a href="https://mikeindustries.com/blog/archive/2007/04/pagination-is-evil">railed against tricks like pagination</a> and &#8220;jump pages&#8221; as a means to goose pageviews. Honest people in the industry will tell you these are simply acceptable tricks to bump revenue a bit, while disingenuous or uninformed people will use &#8220;readability&#8221; as an excuse to make users click ten times to read ten parts of a single story.  For this latest redesign, msnbc.com has decided to de-emphasize page views entirely and present stories in a manner that maximizes <em>enjoyment</em> and as a result, <em>total time on site</em>.</p>
<p>What do I mean by this?</p>
<p>Think of how a typical user session works on most news sites these days.  A user loads an article (1 pageview), pops open a slideshow (1 pageview), flips through 30 slides of an HTML-based slideshow (30 pageviews).  That&#8217;s 32 pageviews and a lot of extraneous downloading and page refreshing.</p>
<p>On new msnbc.com story pages, the above sequence would register one pageview: the initial one.  The rest of the interactions occur within the page itself.  Can msnbc.com serve ad impressions against in-page interactions? Sure, and that&#8217;s key to the strategy, but as a user, your experience is much smoother, and as an advertiser, <em>the impressions you purchase are almost guaranteed to come across human eyes</em> since your ads are only loaded upon user interaction.</p>
<p>This is the first time (to my knowledge) this sort of model has been deployed on a major media site with over a billion pageviews a month, and it has the potential to change the entire industry if it works.  It&#8217;s also a big risk, as most advertisers are not used to thinking of inventory this way.  We like big risks with big payoffs though and we feel that when you take care of the user and the advertiser at the same time, you&#8217;re probably onto something.</p>
<p>Ad model aside, there are also tons of other interesting things about the new msnbc.com story pages:</p>
<ul>
<li>Every form of storytelling (text, video, audio, slideshows, discussion, voting, and more) is now available right within each story page itself.</li>
<li>The top navigation (nicknamed &#8220;the upscroll&#8221;) contains all basic elements when a page loads but if you scroll the page upward past its initial position, you get more interesting stories to read. It&#8217;s a great way of presenting a content-packed header without sacrificing screen real estate.</li>
<li>A social bar at the bottom of the screen, powered by Newsvine, which lets you easier share content via Newsvine, Facebook, Twitter, and other services.</li>
<li>An &#8220;annotated scrollbar&#8221; down the right side of the screen capable of teleporting you to any section of the page you desire.</li>
<li>Bigger, easier to read text. Goodbye Arial, once and for all!</li>
</ul>
<p>To be clear, the msnbc.com team is very proud of what&#8217;s been launched so far, but is under no illusions that things are perfect yet.  Everyone involved in creating these new story pages is monitoring reaction closely and ready to modify anything that needs improvement.  Since we have plenty of thoughtful design and development voices here on Mike Industries, I&#8217;d love to open this thread up for some reactions.  What is working for you, and what, if anything, would you change?  The team is listening.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mikeindustries.com/blog/archive/2010/06/another-nail-in-the-pageview-coffin/feed</wfw:commentRss>
			<slash:comments>33</slash:comments>
		
		
			</item>
		<item>
		<title>Better E-Commerce Design using the Luhn Algorithm?</title>
		<link>https://mikeindustries.com/blog/archive/2010/02/better-e-commerice-design-using-the-luhn-algorithm</link>
					<comments>https://mikeindustries.com/blog/archive/2010/02/better-e-commerice-design-using-the-luhn-algorithm#comments</comments>
		
		<dc:creator><![CDATA[Mike D.]]></dc:creator>
		<pubDate>Wed, 24 Feb 2010 06:32:00 +0000</pubDate>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Original]]></category>
		<guid isPermaLink="false">https://mikeindustries.com/blog/?p=4148</guid>

					<description><![CDATA[I finally put in my pre-order for SimpleScott&#8217;s Designing Obama book a few minutes ago. I wanted to buy it earlier but never overcame the inertia until I got a chance to have beers with Scott and then listen to him speak at the excellent Webstock conference in New Zealand last week (by the way, [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" decoding="async" src="/blog/images/inline/designingobama.jpg" alt="" width="171" height="250" class="rightinline" />I finally put in my pre-order for <a href="http://www.designing-obama.com/products/designing-obama" target="_blank">SimpleScott&#8217;s Designing Obama book</a> a few minutes ago. I wanted to buy it earlier but never overcame the inertia until I got a chance to have beers with <a href="http://simplescott.com" target="_blank">Scott</a> and then listen to him speak at the excellent <a href="http://www.webstock.org.nz/" target="_blank">Webstock conference</a> in New Zealand last week (by the way, thanks to <a href="http://www.subtraction.com" target="_blank">Khoi Vinh</a> for asking me to step in for him as a <a href="http://www.flickr.com/photos/webstock06/4380748159/in/set-72157623366859689/" target="_blank">speaker</a>). Can I also just say that Webstock is the best designed conference I&#8217;ve ever seen?</p>
<p>Scott&#8217;s a great designer, obviously, but hearing about the care that&#8217;s going into just the <em>production</em> of the book is going to make this piece of art a must-have. I may even order two and keep one suspended in formaldehyde.</p>
<p>While ordering the book, one part of the process stuck out to me as something I&#8217;d never seen before, even having ordered probably a thousand items online in the past: when I typed in my credit card number, a green checkmark showed up immediately after the last digit was entered. My immediate suspicion was that they were counting digits and gave me a check to indicate I had typed in enough of them, but again, having never seen that before, my interest was piqued. I tried deleting the last digit and replacing it with a 1, then a 2, then a 3, and so on.  Only when I typed the actual digit from the credit card did I get the green checkmark again.</p>
<p>Further investigation revealed that no server calls were being made, which means this was some sort client-side algorithm that verified credit card patterns. <em>Iiiiiiiiiinteresting!</em>. Even more investigation revealed that this was the work of something I&#8217;d never heard of: <a href="http://en.wikipedia.org/wiki/Luhn_algorithm" target="_blank">The Luhn Algorithm</a>.</p>
<p>The Luhn Algorithm is a formula which can be run in javascript, PHP, and most other programming languages that uses some mathematical rules to determine if a credit card number is likely to be valid. Apparently, credit card companies issue numbers according to this algorithm, and if a number doesn&#8217;t fit it, it&#8217;s definitely not valid.  Before you say to yourself &#8220;wow, that&#8217;s some neat, new technology I can use!&#8221;, note that <em>the Luhn Algorithm has been around since 1954!</em></p>
<p>Although using this algorithm in your own projects is clearly not a necessity, I see a couple of potential advantages and a couple of potential disadvantages:</p>
<h3>Advantages</h3>
<ul>
<li>Instant UI feedback is a great tool to help users correct errors</li>
<li>The checkmark is a nice bit of instant emotional validation to make sure users complete the process</li>
</ul>
<h3>Disadvantages</h3>
<ul>
<li>Is there a guarantee that every card will always follow this pattern? What happens if one or many stop following it?</li>
<li>Since it&#8217;s an unusual experience, does it add a bit of suspicion in some users? Would a less technical user assume their number was being broadcast across the internet more times than necessary?</li>
</ul>
<p>I&#8217;m curious to see if this catches on as a trend.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mikeindustries.com/blog/archive/2010/02/better-e-commerice-design-using-the-luhn-algorithm/feed</wfw:commentRss>
			<slash:comments>13</slash:comments>
		
		
			</item>
		<item>
		<title>Idea: &#8220;Record This&#8221; Bookmarklet</title>
		<link>https://mikeindustries.com/blog/archive/2009/12/idea-record-this-bookmarklet</link>
					<comments>https://mikeindustries.com/blog/archive/2009/12/idea-record-this-bookmarklet#comments</comments>
		
		<dc:creator><![CDATA[Mike D.]]></dc:creator>
		<pubDate>Sat, 26 Dec 2009 19:23:28 +0000</pubDate>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Original]]></category>
		<category><![CDATA[Technology]]></category>
		<guid isPermaLink="false">https://mikeindustries.com/blog/?p=3912</guid>

					<description><![CDATA[Lately I&#8217;ve been intrigued by situations in which the amount of effort required to complete a task is not overwhelming but it is enough to prevent the task from getting done. The latest example, from a couple of weeks ago, was wine journaling. Sure it only takes a few minutes to pull out a laptop, [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Lately I&#8217;ve been intrigued by situations in which the amount of effort required to complete a task is not overwhelming but it is enough to prevent the task from getting done. The latest example, from a couple of weeks ago, was <a href="https://mikeindustries.com/blog/archive/2009/12/iphone-app-idea-winesnap" target="_blank">wine journaling</a>. Sure it only takes a few minutes to pull out a laptop, log into your wine-dot-whatever account and structure a proper review, but unless a few minutes becomes a few seconds, I&#8217;m out&#8230; and so are thousands of other people.</p>
<p><em>Minertia</em> is what I might call it&#8230; short for a &#8220;minimal level of inertia&#8221;.</p>
<p>Many companies have succeeded primarily because their products overcome <em>minertia</em>. Twitter is a good example of this. There were millions of people with (purportedly entertaining) thoughts, but none of these thoughts were worth spending more than 30 seconds to publish. Twitter provided a way to turn these idle thoughts into legitimate published communication with 30 seconds of effort, and BAM, they are the hottest company on the internet.</p>
<p>On to more pedestrian matters though: recording stuff on TV.</p>
<p>I&#8217;ll use Tivo as an example because that&#8217;s what I have, but this could apply to any DVR, Apple TV, Boxee, etc etc:</p>
<p>Here is how I decide to add a show to the repertoire of things my Tivo records automatically:</p>
<ol>
<li>Read about a new show somewhere online.</li>
<li>Hear or read about it again somewhere else.</li>
<li>Read about how good it is <em>again</em> and finally decide to do something about it.</li>
<li>If I&#8217;m home, turn on the TV, navigate somewhat laboriously through on-screen menus and search for the show in order to set up automatic recording.  If I&#8217;m away, go to Tivo.com and use their totally crappy search feature, try to find the program, and if that is even successful, set up automatic recording.</li>
</ol>
<p>As you can see, this sometimes equates to several minutes of work (I&#8217;ve spent over 15 minutes trying to do this on my iPhone). Again, we&#8217;re not talking about a huge time investment here, but it&#8217;s enough to require steps 1-3 whereas with a little <em>minertia</em> reduction, people might be willing to record shows the first time they hear about them.</p>
<p>What got me thinking about this was an <a href="http://www.mediaite.com/online/5qq-rex-sorgatz/" target="_blank">interview with Rex</a> I read yesterday. In it, he mentions <em>Modern Family</em> as the best show on TV right now (I say it&#8217;s <em>Dexter</em> or <em>Million Dollar Listing</em>, but whatever). Thankfully, Rex&#8217;s interview was about the third time I&#8217;d heard this so I bucked up and did step 4. But here&#8217;s how much easier it could be:</p>
<ol>
<li>Read article on web which contains the name of a TV show.</li>
<li>Click a bookmarklet to query Tivo, and Tivo spiders the page, highlighting all TV shows it recognizes.</li>
<li>Click on the show you want, confirm with a little ajaxed-in dialog box, and a command gets sent to your Tivo to create a Season Pass for the show.</li>
</ol>
<p>The effort would thusly be reduced to under 10 seconds.</p>
<p>As with the wine example, I fully expect someone to leave a comment pointing me to something that &#8220;kinda sorta&#8221; does this, but not in as optimal of a manner as I described above. Anybody know of something that does this? Or better yet, anyone work at Tivo and want to build this? :)</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mikeindustries.com/blog/archive/2009/12/idea-record-this-bookmarklet/feed</wfw:commentRss>
			<slash:comments>9</slash:comments>
		
		
			</item>
		<item>
		<title>Newsvine is looking for a web developer</title>
		<link>https://mikeindustries.com/blog/archive/2009/07/newsvine-is-looking-for-a-web-developer</link>
					<comments>https://mikeindustries.com/blog/archive/2009/07/newsvine-is-looking-for-a-web-developer#comments</comments>
		
		<dc:creator><![CDATA[Mike D.]]></dc:creator>
		<pubDate>Wed, 01 Jul 2009 17:47:35 +0000</pubDate>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Original]]></category>
		<guid isPermaLink="false">https://mikeindustries.com/blog/?p=3593</guid>

					<description><![CDATA[There&#8217;s no better place to be during an economic downturn than a solid, profitable company with a long track record of success. Come to think of it, there&#8217;s no better place to be during an economic boom than that sort of place either. Msnbc.com, proud parent of Newsvine, is just that sort of place. The [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>There&#8217;s no better place to be during an economic downturn than a solid, profitable company with a long track record of success.  Come to think of it, there&#8217;s no better place to be during an economic boom than that sort of place either.  Msnbc.com, proud parent of Newsvine, is just that sort of place.  The most visited news site in the United States for the past 12 months and running, msnbc.com is hitting on all cylinders and is expanding the Newsvine team by one talented web developer.</p>
<p>As co-founder and CEO of Newsvine, I can tell you that this is a great place to work and retains the best aspects of a startup atmosphere while inheriting the equally great aspects of working for an established media organization like msnbc.com.  If you&#8217;re interested in joining the crew, please read the job description below and send your stuff to <a href="mailto:msnbcjobs@msnbc.com">msnbcjobs@msnbc.com</a>. One caveat, however: We are specifically looking for someone who is passionate about writing code.  Javascript, PHP, HTML, etc.  This is not a design position and the only UI work involved will be on the implementation side, from a coding perspective.</p>
<h3>Job description</h3>
<p>The Newsvine Team is looking for an experienced, self-motivated, and passionate front-end developer to join us in building products and services on the Newsvine platform. Your primary responsibility will be to design and develop site features and functionality in a multi-tier web environment using PHP, CSS, JavaScript, and the YUI JavaScript library. Additional responsibilities include daily site support and maintenance. The ideal candidate is able to work on small teams under tight deadlines with little supervision. A computer science degree or equivalent is a plus, but experience, skill, and attention to detail are more important.</p>
<p>The ideal candidate will have a strong command of the following knowledge areas:</p>
<ul>
<li>X/HTML, CSS, DOM, and JavaScript</li>
<li>PHP or similar scripting language</li>
<li>Mastery of web standards and cross-browser compatibility</li>
</ul>
<p>Preferable Job Qualifications:</p>
<ul>
<li>Experience working on large-scale, high-availability web sites</li>
<li>Successful industry experience using latest DHTML and ajax technologies</li>
<li>Experience with SQL and relational database implementations serving as the backend to production web applications</li>
<li>Experience with, or an interest in, working with the YUI JavaScript library</li>
<li>Familiarity with Subversion a plus</li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://mikeindustries.com/blog/archive/2009/07/newsvine-is-looking-for-a-web-developer/feed</wfw:commentRss>
			<slash:comments>15</slash:comments>
		
		
			</item>
		<item>
		<title>Examining Typekit</title>
		<link>https://mikeindustries.com/blog/archive/2009/05/examining-typekit</link>
					<comments>https://mikeindustries.com/blog/archive/2009/05/examining-typekit#comments</comments>
		
		<dc:creator><![CDATA[Mike D.]]></dc:creator>
		<pubDate>Sun, 31 May 2009 20:41:37 +0000</pubDate>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Original]]></category>
		<category><![CDATA[Technology]]></category>
		<guid isPermaLink="false">https://mikeindustries.com/blog/?p=3510</guid>

					<description><![CDATA[Last week brought word of a promising new type solution for the web called Typekit. Created by Jeff Veen and the smart folks at Small Batch, Typekit aims to solve the problem of custom typography on the web once and for all. Unlike sIFR, Cufon, and several other stopgaps before it, Typekit does not attempt [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Last week brought word of a promising new type solution for the web called <a href="http://blog.typekit.com/2009/05/27/introducing-typekit/" target="_blank">Typekit</a>. Created by <a href="http://www.veen.com/jeff/" target="_blank">Jeff Veen</a> and the smart folks at <a href="http://www.smallbatchinc.com" target="_blank">Small Batch</a>, Typekit aims to solve the problem of custom typography on the web once and for all.  Unlike <a href="https://mikeindustries.com/sifr/">sIFR</a>, <a href="http://wiki.github.com/sorccu/cufon/about" target="_blank">Cufon</a>, and several other stopgaps before it, Typekit does not attempt to hack around the problem, but to solve it in a permanent way, which is exciting.</p>
<p>As a co-inventor of sIFR, I&#8217;ve been getting a lot of emails this week asking what I think of this new effort. In evaluating its promise, it&#8217;s important to examine the following characteristics, in order of importance: compatibility, functionality, legality, ease of use, and hackiness.</p>
<h3>Compatibility</h3>
<p>Compatibility is the most important aspect of any new web technology. If your shiny new method only works in 10% of web browsers, it&#8217;s nothing more than a proof-of-concept. It is this reality check that keeps me from getting excited about W3C meetings, Internet Explorer extensions, or anything else that doesn&#8217;t apply all browsers in the here and now&#8230; or at least the right around the corner.</p>
<p>Compatibility was also what pushed sIFR over the top in terms of popularity, working in over 90% of all systems and falling back gracefully in most others. It also came out at a time, 2004, when there wasn&#8217;t a whole lot of tolerance for leaving certain browsers behind or having things look ideal in a few browsers and not so ideal in others.</p>
<p>Typekit appears to be doing ok on the compatibility front, targeting current versions of Safari, Chrome, and Opera natively, the next version of Firefox (3.1) natively, and all versions of Internet Explorer via a &#8220;backup&#8221; EOT solution.  Here&#8217;s what the <a href="http://marketshare.hitslink.com/browser-market-share.aspx?qprid=0" target="_blank">browser share landscape</a> looks like today:</p>
<ul>
<li>Works in:
<ul>
<li>Internet Explorer: 66.1%</li>
<li>Safari: 8.21%</li>
<li>Chrome: 1.42%</li>
<li>Opera: 0.68%</li>
<li>Firefox 3.1 or greater: 0.18%</li>
</ul>
</li>
<li>Doesn&#8217;t work in:
<ul>
<li>Firefox 3.0 or lower: 22.3%</li>
<li>Miscellaneous other browsers: 1.11%</li>
</ul>
</li>
</ul>
<p>So you can see right off the bat that Typekit will work in just over 76% of browsers. Not quite as high as some of the methods that came before it, but it&#8217;s extremely important to recognize that the one group that&#8217;s keeping Typekit from almost universal compatibility is Firefox. I have no evidence to support this, but I imagine that Firefox users are among the quickest to upgrade, which would seem to suggest that this compatibility gap could be closed relatively quickly. Data shows that <a href="http://marketshare.hitslink.com/browser-market-share.aspx?qprid=2" target="_blank">Firefox 3 is already used by 11 times more people than Firefox 2</a>, and considering it was released just short of a year ago, this sort of upgrade pattern is encouraging.</p>
<p>Given the above data, combined with how often Firefox seems to annoy me these days with upgrade notices, I expect Firefox 3.1 or greater to be the dominant Firefox version in use one year from now, thus pushing Typekit&#8217;s compatibility percentage into the upper 90s fairly soon.</p>
<p>It&#8217;s also important to praise what Small Batch has done here on the compatibility front: their killer concept was involving type foundries in web-only licensing and propagating the font files through the standards-complaint @font-face CSS declaration, but they realized their solution would be academic if it didn&#8217;t work in Internet Explorer, so they made sure their backup implementation using EOT files took care of all IE users.  The lack of this sort of practical thinking is what keeps a lot of great ideas from gaining traction on the web.</p>
<p>I also think that designers these days, self included, are a lot more amenable to things looking great on &#8220;most systems&#8221; as long as they at least work reasonably on other systems (as long as they look great on the particular system the designer uses).  This is a bit of designer bias, of course, but it also represents an increasing desire in the design and development community to <a href="http://forabeautifulweb.com/blog/about/universal_internet_explorer_6_css/" target="_blank">leave the old web behind</a>. I still remember how much crap I took at ESPN from <a href="http://www.webstandards.org" target="_blank">validatorians</a> when we decided to leave Netscape 4 &#8212; with its 1% marketshare &#8212; behind. Now it&#8217;s all the rage&#8230; and I love it!</p>
<h3>Functionality</h3>
<p>By all accounts, Typekit will be more functional than any method that came before it. This is quite obviously because it uses a browser&#8217;s native font rendering technology. There are some concerns about reliability gaps stemming from downloading fonts off third-party servers, but I believe this fear will prove unfounded. Additionally, I imagine both the @font-face and EOT versions of fonts will come in larger files than sIFR font files (because usually you only embed a subset of characters in a sIFR font file) but with broadband penetration being what it is today, this too will prove immaterial. Additionally, even though sIFR font files may be smaller, the noticeable delay in rendering them probably more than makes up the difference.</p>
<h3>Legality</h3>
<p>I put legality in the middle of the pack and not at the top because, to my knowledge, there haven&#8217;t been any serious legal dust-ups over the use of technologies like sIFR and Cufon. So far, the burden has been on designers to buy the fonts they use before embedding them using sIFR or Cufon, but at the same time, there&#8217;s been no clear blessing or condemnation of this practice by foundries or type designers.</p>
<p>The nice thing about Typekit is that it specifically involves foundries and type designers in the process of licensing their fonts for use on the web. When you use Typekit, you <em>know with certainty</em> that what you&#8217;re doing has the direct blessing of the people who created and/or marketed the typeface you&#8217;re using.  This is a nice piece-of-mind upgrade as well as a way of further compensating type designers for giving us <a href="http://informationarchitects.jp/the-web-is-all-about-typography-period/" target="_blank">the building blocks of web design</a>.</p>
<h3>Ease of use</h3>
<p>Typekit promises to be easier to implement than either sIFR, Cufon, or any other font replacement technology. I guess we won&#8217;t know until we start using it, but it would shock me if it took more than a few minutes to implement, including licensing the font you want to use. sIFR&#8217;s second most common complaint other than &#8220;it uses Flash and Flash kills puppies&#8221; is that it&#8217;s a bit difficult to implement. Typekit&#8217;s improvement on this front will be more than welcome.</p>
<h3>Hackiness</h3>
<p>First let me say something I&#8217;ve said many times before: the entire world wide web is a hack. Get over it. Secondly, however, any technologies or methods &#8212; <em>that work</em> &#8212; which serve to dehackify it a bit are welcome. Typekit certainly dehackifies custom typography on the web by leaps and bounds.  It was the solution we all knew would come eventually when we created sIFR as a stopgap five years ago.  Just about the only things hacky about it are that it falls back to EOT (which, as discussed earlier, is great) and that it uses Javascript to handle the licensing nuts and bolts (meh, big deal).</p>
<h3>Conclusion</h3>
<p>Typekit is likely the best thing to happen to web design since the re-emergence of browser competitiveness. It will be embraced quickly and fervently when it is released this summer, and its creators should be loudly applauded for <em>doing it</em> instead of just talking about it. There are too many talkers in the world and not enough doers. The team at Small Batch has done an excellent job of taking a problem that a lot of people like to talk about and solving it in a practical, equitable way.  It&#8217;s a welcome solution to a real issue and a significant step towards a leaner, Veener web.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mikeindustries.com/blog/archive/2009/05/examining-typekit/feed</wfw:commentRss>
			<slash:comments>35</slash:comments>
		
		
			</item>
		<item>
		<title>The Sorry State of WYSIWYG Web Editors</title>
		<link>https://mikeindustries.com/blog/archive/2009/04/the-sorry-state-of-wysiwyg-web-editors</link>
					<comments>https://mikeindustries.com/blog/archive/2009/04/the-sorry-state-of-wysiwyg-web-editors#comments</comments>
		
		<dc:creator><![CDATA[Mike D.]]></dc:creator>
		<pubDate>Tue, 28 Apr 2009 01:57:40 +0000</pubDate>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Original]]></category>
		<category><![CDATA[Technology]]></category>
		<guid isPermaLink="false">https://mikeindustries.com/blog/?p=3452</guid>

					<description><![CDATA[We got into a heated discussion in the office about WYSIWYG web editors today. While heated discussions are nothing new to us, neither side even being happy with their own argument was. When people are arguing over things they don&#8217;t even believe in, there can be no positive outcome. My side was as follows: All [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>We got into a heated discussion in the office about WYSIWYG web editors today. While heated discussions are nothing new to us, neither side even being happy with their own argument was. When people are arguing over things they don&#8217;t even believe in, there can be no positive outcome.</p>
<p>My side was as follows: All web editors &#8212; including <a href="http://tinymce.moxiecode.com/" target="_blank">TinyMCE</a>, <a href="http://developer.yahoo.com/yui/editor/" target="_blank">YUI</a>, and <a href="http://www.fckeditor.net/" target="_blank">FCKEditor</a> &#8212; are broken in different ways, and the only software I&#8217;ve seen which can satisfactorily desuckify one of them is WordPress. Because of that, we should deconstruct what WordPress has done to TinyMCE and apply the same duct tape to our own editor on Newsvine (we use TinyMCE currently, but are in the process of moving to YUI).</p>
<p>Our development staff&#8217;s side was as follows: All web editors &#8212; including TinyMCE, YUI, and FCKEditor &#8212; are broken in different ways, and because of the crazy amount of ridiculous cleaning, converting, regexing, transforming, and other shenanigans WordPress has to do to their editor just to get it to the state it&#8217;s in right now, it&#8217;s not worth spending the time to recreate such a mess, only to have it remain imperfect and possibly break in upcoming browser releases.</p>
<p>There are several things wrong with each editor but the particular problem we are trying to solve is that when you&#8217;re in HTML mode, you can&#8217;t create paragraphs just by putting double newlines between them. Some people say that because you&#8217;re in HTML mode, you shouldn&#8217;t expect an editor to do this for you, but I&#8217;ve been using blog software for six or seven years and that is the behavior I &#8212; and I believe most others &#8212; are accustomed to, so I couldn&#8217;t imagine releasing something without it. As mentioned above, the WordPress team has craftily hacked this functionality into their WYSIWYG system, but other platforms like Typepad have not.</p>
<p>I could go on and on for another hour about details, but after going through all of the WYSIWYG editor machinations we&#8217;ve gone through, I&#8217;m left wondering why the web development world still hasn&#8217;t figured this out yet. We can write an <a href="http://gmail.com" target="_blank">entire e-mail application</a>, a <a href="http://www.editgrid.com" target="_blank">replacement for Excel</a>, and <a href="http://www.chromeexperiments.com/" target="_blank">whatever the hell these things are</a>, but we can&#8217;t replicate <a href="http://www.mac512.com/macwebpages/macwrite.htm" target="blank">a toolset we&#8217;ve had in MacWrite since 1984</a>?</p>
<p>Think of how much has happened in the last 25 years, and we haven&#8217;t been able to nail that.</p>
<p><img loading="lazy" decoding="async" src="/blog/images/inline/tiny_mce.gif" alt="" width="450" height="144" /></p>
<p class="caption">TinyMCE circa 2009: Millions and millions crrrrrrrrazy features. Doesn&#8217;t work satisfactorily.</p>
<p><img loading="lazy" decoding="async" src="/blog/images/inline/word.gif" alt="" width="450" height="163" /></p>
<p class="caption">Microsoft Word circa 1991: Just enough features. Works plenty fine for most people.</p>
<p>I know hard-core coders like to hand-code html even when writing web comments (self included), but 90% of the world would rather not be bothered with that. What&#8217;s it going to take for this problem to go away?  If you&#8217;re involved in WYSIWYG editor development, I&#8217;d love to know.  Is it the disappearance of old browsers?  Is it something that should be Flash-based?  Is it just that no one&#8217;s really worked full-time on the problem yet?  Why isn&#8217;t WordPress&#8217;s crazy hackery built into TinyMCE in the first place?  So many questions&#8230;</p>
<p>So far, the one effort I&#8217;ve noticed that seems to take the cleanest possible approach is the <a href="http://www.wymeditor.org/" target="_blank">WYSIWYM Editor</a>. What-You-See-Is-What-You-Mean essentially translates to &#8220;the HTML code associated with what users type will semantically match what they intend&#8221;.  Meaning, if I type two blocks of text separated by a double newline, I get two properly <code>&lt;p&gt;</code>d paragraphs out of that&#8230; not just a blob of text separated by <code>&lt;br&gt;</code> tags. Or if I bold some text, I get <code>&lt;strong&gt;</code> tags instead of other ridiculousness.</p>
<p>Sadly, the WYSIWYM Editor seems to have been in development since 2006 and is only at 0.5b, but happily, there appears to be a healthy flurry of activity around it lately. I really don&#8217;t mean to disparage the hard work that&#8217;s gone into all of these imperfect WYSIWYG editors in the past, and I do realize that browsers are the core culprits here, but it&#8217;s 2009 already and I&#8217;d prefer a solution to this longstanding <em>real-world</em> problem over almost anything promised in HTML 5, CSS 3, or any of the other specs we&#8217;ve been eagering awaiting for the last several years.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mikeindustries.com/blog/archive/2009/04/the-sorry-state-of-wysiwyg-web-editors/feed</wfw:commentRss>
			<slash:comments>78</slash:comments>
		
		
			</item>
		<item>
		<title>Presto Chango</title>
		<link>https://mikeindustries.com/blog/archive/2009/02/presto-chango</link>
					<comments>https://mikeindustries.com/blog/archive/2009/02/presto-chango#comments</comments>
		
		<dc:creator><![CDATA[Mike D.]]></dc:creator>
		<pubDate>Thu, 05 Feb 2009 04:54:41 +0000</pubDate>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Original]]></category>
		<category><![CDATA[Technology]]></category>
		<guid isPermaLink="false">https://mikeindustries.com/blog/?p=2341</guid>

					<description><![CDATA[After almost five years of running Mike Industries, it&#8217;s time for a change! The fact that I made it this long without redesigning is either a testament to the majestic timelessness of the original design or my general uncomfortableness in doing &#8220;self identity&#8221; work. Since we know there is no such thing as timelessness on [&#8230;]]]></description>
										<content:encoded><![CDATA[<div style="position: absolute; background-image: url(/blog/images/inline/tophat.jpg); left: -45px; top: -3px; width: 349px; height: 371px; background-repeat: no-repeat;"><span></span></div>
<div style="z-index: 10; padding-top: 0px; position: relative">
<div style="height: 17px; width: 125px; float: left; clear: left;"><span></span></div>
<div style="height: 17px; width: 160px; float: left; clear: left;"><span></span></div>
<div style="height: 17px; width: 195px; float: left; clear: left;"><span></span></div>
<div style="height: 17px; width: 230px; float: left; clear: left;"><span></span></div>
<div style="height: 17px; width: 265px; float: left; clear: left;"><span></span></div>
<div style="height: 17px; width: 300px; float: left; clear: left;"><span></span></div>
<div style="height: 17px; width: 305px; float: left; clear: left;"><span></span></div>
<div style="height: 17px; width: 315px; float: left; clear: left;"><span></span></div>
<div style="height: 17px; width: 325px; float: left; clear: left;"><span></span></div>
<div style="height: 17px; width: 335px; float: left; clear: left;"><span></span></div>
<div style="height: 17px; width: 335px; float: left; clear: left;"><span></span></div>
<div style="height: 17px; width: 335px; float: left; clear: left;"><span></span></div>
<div style="height: 17px; width: 325px; float: left; clear: left;"><span></span></div>
<div style="height: 17px; width: 310px; float: left; clear: left;"><span></span></div>
<div style="height: 17px; width: 305px; float: left; clear: left;"><span></span></div>
<div style="height: 17px; width: 219px; float: left; clear: left;"><span></span></div>
<div style="height: 17px; width: 194px; float: left; clear: left;"><span></span></div>
<div style="height: 17px; width: 179px; float: left; clear: left;"><span></span></div>
<div style="height: 17px; width: 176px; float: left; clear: left;"><span></span></div>
<div style="height: 17px; width: 178px; float: left; clear: left;"><span></span></div>
<div style="height: 17px; width: 178px; float: left; clear: left;"><span></span></div>
<div style="height: 17px; width: 178px; float: left; clear: left;"><span></span></div>
<p>After almost five years of running Mike Industries, it&#8217;s time for a change!  The fact that I made it this long without redesigning is either a testament to the majestic timelessness of the original design or my general uncomfortableness in doing &#8220;self identity&#8221; work. Since we know there is no such thing as timelessness on the web, we can therefore assume it&#8217;s the latter.</p>
<p>This redesign had five objectives, in order of importance:</p>
<ol>
<li>Make shared items such as found links, video, and photography more a part of the overall content presentation. I still write original posts 1-3 times a month, but it&#8217;s nice to keep things fresh in-between as well.</li>
<li>Refresh things visually with a wider layout, new typography, and a fuller footer, among other elements.</li>
<li>Modernize and completely rewrite the code that was brought over when I <a href="https://mikeindustries.com/blog/archive/2008/03/mike-industries-now-powered-by-wordpress">switched from Movable Type to WordPress a year ago</a>.</li>
<li>Offer more feed customization, including full-text RSS.</li>
<li>Don&#8217;t break old pages with the new design.</li>
</ol>
<p>&#8230; and away we go:</p>
<h3>Bringing multi-source aggregation into the fold</h3>
<p>It&#8217;s easy to take posts from other places like <a href="http://delicious.com/mikeindustries" target="_blank">Delicious</a>, <a href="http://tumblelog.mikeindustries.com" target="_blank">Tumblr</a>, and <a href="http://twitter.com/mikeindustries" target="_blank">Twitter</a> and display them in various places around your blog.  It&#8217;s a bit harder to ingest those same posts into your blog&#8217;s publishing system and then output them as actual native blog posts that people can comment on.  And finally, it&#8217;s <em>incredibly hard</em> to do the second thing in a way that&#8217;s flexible enough to display many different types of content in many different contexts.</p>
<p>Getting to the first stage would have been easy via a few lines of javascript, and in fact, I already got there with the previous design, embedding my Delicious links in the Mike Industries sidebar.</p>
<p>In trying to make it to the second stage, I tried several different &#8220;aggregation&#8221; plug-ins for WordPress, but eventually settled on a wonderful little creation called <a href="http://projects.radgeek.com/feedwordpress/" target="_blank">FeedWordPress</a>, by the one they call &#8220;Rad Geek&#8221;.  After installing the FeedWordPress plug-in, you simply give it some feeds to suck in, tell it how to categorize and tag items from each feed, and then let WordPress templates do the rest.</p>
<p>I was originally going to move over all of my link-saving from Delicious to Tumblr because I love Tumblr&#8217;s posting interface, but since my Tumblr account got hacked within a couple weeks of opening it, I decided to only use the Tumblr account to post fun stuff like videos. My initial reflex was to move all &#8220;collecting&#8221; to one platform, but since everything is getting pulled directly into the main blog anyway, I&#8217;ve convinced myself that the use of multiple platforms is actually a strength.  I&#8217;m essentially pulling my Tumblr and Delicious feeds into the &#8220;Shared&#8221; column and my Twitter feed into the &#8220;Overshared&#8221; column.</p>
<p>I am unconvinced that Twitter will be a permanent part of this blog, since I still don&#8217;t enjoy either publishing or reading many tweets, but I&#8217;m giving it a try to see if it sticks. Twitter&#8217;s rising popularity continues to amaze me to the point where I&#8217;m almost ready to officially consider myself &#8220;too old&#8221;. On the one hand, I totally understand it because it&#8217;s so easy.  But on the other hand, I totally despise it because it enables such laziness and extravagance of expression.  Anyway, that&#8217;s a conversation for another blog post.</p>
<p>The single hardest part of the entire redesign was writing a script that ensured no items in the Shared column would render wider than the column itself.  Since there will be plenty of YouTube video tags in there, it was essential to resize them all as the column renders, but not permanently in the database, so that they can render at full size when viewed from the permalink pages.  I am no <a href="http://www.shauninman.com" target="_blank">Wolf</a> with regular expressions, but after hours and hours of hackerations, I came up with this:</p>

<textarea style="width: 450px; height: 300px">

function shrinkContent ($matches) {
	// SET WHICH $matches PARAMETER APPLIES TO HEIGHT AND WHICH TO WIDTH
	if (preg_match('/(\<[^\>]+?(width=([\'|"|0-9]+))[^\>]+?(height=([\'|"|0-9]+)).*?\>)/',$matches[1])) {
		$widthspot = 3;
		$heightspot = 5;
	} else {
		$widthspot = 5;
		$heightspot = 3;
	}
	// CHOOSE A MAX WIDTH
	$maxwidth = 240;
	// INTEGERIZE WIDTH
	$width = (int)preg_replace('/[^0-9]+/','',$matches[$widthspot]);
	// IF WIDTH IS MORE THAN OUR LIMIT PERFORM THE TRANSFORMATION
	if ($maxwidth/$width < 1) {
		$height = (int)preg_replace('/[^0-9]+/','',$matches[$heightspot]);
		$height = round(($height*$maxwidth)/$width);
		$width = $maxwidth;
		$pattern = '/width=([\'|"|0-9]+)/';
		$widthstring = 'width="'.$width.'"';
		$resizedtag = preg_replace($pattern,$widthstring,$matches[1]);
		$pattern = '/height=([\'|"|0-9]+)/';
		$heightstring = 'height="'.$height.'"';
		$resizedtag = preg_replace($pattern,$heightstring,$resizedtag);
		return $resizedtag;
	// ELSE LEAVE IT ALONE
	} else {
		return $matches[1];
	}
}

function scale_image_240($matches) {
	$p = $matches[3];
	$mw=240;
	$mh=1000;
    if(list($w,$h) = @getimagesize($p)) {
    foreach(array('w','h') as $v) { $m = "m{$v}";
        if(${$v} > ${$m} && ${$m}) { $o = ($v == 'w') ? 'h' : 'w';
        $r = ${$m} / ${$v}; ${$v} = ${$m}; ${$o} = ceil(${$o} * $r); } }
    return("<img src='{$p}' alt='' width='{$w}' height='{$h}' />"); }
}

// START WITH YOUR HTML
$contents = $yourhtml;

// LOOK FOR TAGS WHERE WIDTH IS BEFORE HEIGHT AND REPLACE
$pattern = '/(\<[^\>]+?(width=([\'|"|0-9]+))[^\>]+?(height=([\'|"|0-9]+)).*?\>)/';
$contents = preg_replace_callback($pattern, 'shrinkContent', $contents);

// LOOK FOR TAGS WHERE HEIGHT IS BEFORE WIDTH AND REPLACE
$pattern = '/(\<[^\>]+?(height=([\'|"|0-9]+))[^\>]+?(width=([\'|"|0-9]+)).*?\>)/';
$contents = preg_replace_callback($pattern, 'shrinkContent', $contents);

// LOOK FOR EMPTY IMG TAGS
$pattern = '/(\<img[^\>|^width=]+?(src="([^"]+?)")[^\>|width=]+?\>)/';
$contents = preg_replace_callback($pattern, 'scale_image_240', $contents);
						
// VOMIT OUT NEW CODE WHERE NOTHING IS MORE THAN 240 PIXELS WIDE
echo $contents;

</textarea>

<p>I cribbed part of the short scale_image_240 function, but the rest was from scratch.  Beforehand, I searched for quite some time on Google for a function to do exactly this and couldn&#8217;t find it, so hopefully this post will help some future searchers in their own quests to resize content.</p>
<p>Even though running these computations when the sidebars render isn&#8217;t too computationally ferocious, I went ahead and &#8220;widgetized&#8221; my sidebar in WordPress as well, so I could make use of the excellent <a href="http://wordpress.org/extend/plugins/wp-widget-cache/" target="_blank">WP Widget Cache plug-in</a>.  WP Widget Cache writes your entire sidebar out to disk so that it can be served up quickly and statically.</p>
<p>Ok, now that the geekiest part of the redesign has been explained, on to hopefully more interesting matters&#8230;</p>
<h3>Separation of different content types</h3>
<p>As much as I love what <a href="http://www.stopdesign.com" target="_blank">Doug</a> and <a href="http://www.mezzoblue.com" target="_blank">Dave</a> have done with their superb redesigns, I just don&#8217;t like displaying original posts and peripheral content in the same column.  I may not be the most prolific original post writer, but when I write an article, I want it front and center, and not pushed down by links or other distractions. With this redesign, the flow is simple: the most important stuff is on the left, the semi-interesting stuff is to the right of that, and the barely-interesting stuff is to the right of that.  Size also flows according.  The wide column is important, the medium column is semi-interesting, and the narrow column is barely-interesting.</p>
<h3>Typography</h3>
<p><a href="https://mikeindustries.com/sifr/">sIFR</a> lives on in the new Mike Industries &#8212; of course &#8212; in the form of Trade Gothic Condensed. While I don&#8217;t think sIFR should be used in every project (we don&#8217;t use it on <a href="http://www.newsvine.com" target="_blank">Newsvine</a>), I still find it an invaluable method to really shine up blog design. The first version of Mike Industries used Agency Condensed rendered with sIFR 2, while the new version uses the aforementioned Trade Gothic (a <a href="http://www.jasonsantamaria.com" target="_blank">Stan</a> favorite) and sIFR 3.</p>
<p>By the way, I don&#8217;t usually like to call fellow developers out, but I will say this about <a href="http://novemberborn.net/sifr3" target="_blank">sIFR 3</a>: it&#8217;s beautiful and it&#8217;s been ready for at least a year, in my opinion, and yet it&#8217;s not officially &#8220;released&#8221; yet. I find this highly unfortunate. When you&#8217;re developing software for the web, <em>it&#8217;s never going to be perfect</em>. As long as your software generally works and isn&#8217;t causing any damage, <em>release it</em>.  The entire web is a beta.  The entire web is a hack. It always will be. Don&#8217;t fight it. If you&#8217;re on <a href="http://novemberborn.net/sifr3/r436" target="_blank">Release Candidate 436</a>, that&#8217;s a sign you may need to let go a little.</p>
<p>Aside from the Trade Gothic, Mike Industries now uses Helvetica Neue for body copy and downwind headers. I am certainly no devotee of Helvetica, like 90% of the people in <a href="http://www.helveticafilm.com/" target="_blank">the film</a> are, but with anti-aliasing so much improved in the last decade, it does make for some good readability these days. Plus, I just needed to get off the Lucida Grande/Verdana bandwagon for awhile at least.</p>
<h3>Grids, shmids</h3>
<p>I feel like <a href="http://www.thegridsystem.org/" target="_blank">grids</a> are the new web standards. What I mean is that they are a potentially useful tool to achieve a noble means, but they aren&#8217;t the second coming of the messiah. If grids help you do great work, then by all means learn them, love them, and live them. But if you&#8217;re perfectly happy eyeing layouts as a drunken painter eyes a canvas, then eye away. I&#8217;m no painter, but I&#8217;m plenty happy creating layouts without the use of grids or any sort of sizing heuristics.  I don&#8217;t make sure my main column is sized according to a golden-ratio and I don&#8217;t make sure every line of type lines up vertically with every other.</p>
<p>I just do what feels right&#8230; and that&#8217;s plenty good enough for me.  You should do the same, whether or not that involves the use of grids.</p>
<h3>Feeds revisited and reloaded</h3>
<p>Due to popular demand, I am now pushing out full text RSS feeds. I would still rather not publish these because of content theft and other reasons, but in the end, my reticence should not trump the will of my subscribers. I&#8217;ll try it out and unless I notice widespread plagiarism on spam blogs, full-text feeds will probably continue.</p>
<p>Also, after running <a href="https://mikeindustries.com/blog/archive/2008/12/what-should-go-in-a-default-rss-feed">this poll</a> about a month ago, I&#8217;ve decided to include original and shared items in the default RSS feed (the one you&#8217;re probably already subscribed to). According to the poll results, most people want to see interesting links and other stuff in the main feed, so that was the justification.  If, however, you find the shared items superfluous, <em>please</em> switch over to the <a href="https://mikeindustries.com/blog/archive/category/original">Articles Only</a> feed. I hate the idea of anyone unsubscribing entirely because the main feed is now updated too often.</p>
<p>One thing I can&#8217;t seem to figure out is how to correctly enable the &#8220;all&#8221; feed in WordPress.  For all of you WordPress gurus out there, I basically applied a filter to my existing &#8220;/blog/feed&#8221; feed to remove the Overshared/Twitter categories.  It is as follows:</p>
<p><code><br />
function exclude_category($query) {<br />
	if ( $query->is_feed ) {<br />
		$query->set('cat', '-473,-281');<br />
	}<br />
return $query;<br />
}</p>
<p>add_filter('pre_get_posts', 'exclude_category');<br />
</code></p>
<p>That correctly takes the stuff out of the &#8220;main&#8221; feed, but I need to provide another feed with everything in it.  Something like maybe &#8220;/blog/feed?all&#8221;.  I figured I should be able to just modify the line above to:</p>
<p><code><br />
	if ( $query->is_feed &! $query->query_vars['all'] ) {<br />
</code></p>
<p>&#8230; and it should work.  It doesn&#8217;t.  If anyone has any ideas, I&#8217;d love some help on that one (or another way to do it entirely).</p>
<h3>Big footers are in</h3>
<p>My footer now contains a lot of what was previously in my sidebar and more.  I&#8217;m not sure how I feel about this yet.  On the one hand, I like big, informative footers.  But on the other hand, I don&#8217;t like burying such potentially important stuff so low on the page.  If I end up getting rid of the Overshared column, some of the footer content may end up replacing it.</p>
<h3>Backwards compatibility</h3>
<p>Originally, I wanted to find a way to <a href="https://mikeindustries.com/blog/archive/2008/11/lazyweb-request-date-based-theme-switcher-for-wordpress">keep old blog posts in the old theme and style new blog posts with the new theme</a>. I like this idea because it preserves the context in which posts were originally written and it also doesn&#8217;t break <a href="https://mikeindustries.com/blog/archive/2005/05/ipod-giveaway-2" target="_blank">heavily designed posts like this one</a>. In the end though, I was able to keep my main content area the same size as my old one, so the new theme really didn&#8217;t break any entries, so I have &#8212; for now &#8212; decided to move everything to the new theme.  This decision is definitely subject to change though as I really don&#8217;t want to be tied to a 450 pixel wide white column for the rest of my life.</p>
<h3>So anyway&#8230;</h3>
<p>So anyway, that&#8217;s it. I&#8217;m pretty excited to get this rolled out, but at the same time there are still details that need some shining and bugs that need squashing.  If you see any, give me a holler in the comments.  Thanks!</p>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://mikeindustries.com/blog/archive/2009/02/presto-chango/feed</wfw:commentRss>
			<slash:comments>45</slash:comments>
		
		
			</item>
	</channel>
</rss>
