<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Fuzzy Tolerance</title>
	
	<link>http://fuzzytolerance.info</link>
	<description>Beware all enterprises that require new clothes.</description>
	<lastBuildDate>Thu, 17 May 2012 18:36:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/FuzzyTolerance" /><feedburner:info uri="fuzzytolerance" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Make Smarter – CSS Positioning, Google Maps API + Chrome Dev Tools, Inventing on Principle, and Management Fads</title>
		<link>http://feedproxy.google.com/~r/FuzzyTolerance/~3/2UXX1s6kCPw/</link>
		<comments>http://fuzzytolerance.info/make-smarter-css-positioning-google-maps-api-chrome-dev-tools-inventing-on-principle-and-management-fads/#comments</comments>
		<pubDate>Thu, 17 May 2012 18:32:29 +0000</pubDate>
		<dc:creator>Fuzzy</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://fuzzytolerance.info/?p=2093</guid>
		<description><![CDATA[Guess who forgot to do a Make Smarter last month? THIS GUY! Nobody tooted me complaining, but I can sense&#160;<a href="http://fuzzytolerance.info/make-smarter-css-positioning-google-maps-api-chrome-dev-tools-inventing-on-principle-and-management-fads/" class="read-more">...continue reading &#8594;</a>]]></description>
			<content:encoded><![CDATA[<p><div class="wp-caption alignleft" style="width: 266px"><img alt="" src="https://lh3.googleusercontent.com/-TcW2mjt1FHw/T7VBVtSn13I/AAAAAAAAC80/fbH68bU7mu0/s800/debsy--c-3po-tux-star-wars-1937.png" width="256" height="256" /><p class="wp-caption-text">...as if millions of voices suddenly cried out in terror and were suddenly silenced.</p></div>Guess who forgot to do a Make Smarter last month? THIS GUY! Nobody tooted me complaining, but I can sense the subconscious angst.</p>
<p>First up in this month&#8217;s Make Smarter is Chris Coyier&#8217;s <a href="http://css-tricks.com/video-screencasts/110-quick-overview-of-css-position-values/">Quick Overview of CSS Position Values</a>. It is the most straight-forward explanation of CSS positioning I&#8217;ve seen, and if I had to pick the one place where most people struggle with CSS, it&#8217;s positioning.</p>
<div style="text-align: center; clear: both;">
<iframe width="560" height="315" src="http://www.youtube.com/embed/gKvxlYCzJXw" frameborder="0" allowfullscreen></iframe>
</div>
<p>Next up this month is a quick tutorial by Brendan Kenny on The Google Maps API and the Chrome DevTools. The Chrome Dev tools have really matured over time. I very rarely find myself jumping into Firefox/Firebug these days.</p>
<div style="text-align: center">
<iframe width="640" height="480" src="http://www.youtube.com/embed/nb4gvrNrDWw" frameborder="0" allowfullscreen></iframe>
</div>
<p>Bret Victor has a really interesting talk on <a href="http://vimeo.com/36579366">Inventing on Principle</a>. His core principle is that <em>creative people need an immediate connection with what they&#8217;re doing</em>. The talk was so good there have already been some projects started to implement his vision.</p>
<div style="text-align: center">
<iframe src="http://player.vimeo.com/video/36579366?byline=0" width="500" height="281" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>
</div>
<p>And finally, check out this 2010 article on CBS Money Watch (oh the places I&#8217;ll surf) called <a href="http://www.cbsnews.com/8301-505183_162-28552307-10391735/the-8-stupidest-management-fads-of-all-time/">The 8 Stupidest Management Fads of All Time</a>. The page is so old (in Internet years) it has some formatting problems, but I laughed the whole way through it. We still do some of that stuff. I guess I shouldn&#8217;t be surprised: <a href="http://www.forbes.com/sites/stevedenning/2012/03/06/could-government-invent-a-130mph-driverless-car/">How to Make Government Innovative Again</a>&#8216;s #4 reason why government isn&#8217;t agile is <em>the public sector is afflicted by management fads</em>.  </p>

<p><a href="http://feedads.g.doubleclick.net/~a/s2Hao2EiO-JPWc8VoUAxgwSGEg8/0/da"><img src="http://feedads.g.doubleclick.net/~a/s2Hao2EiO-JPWc8VoUAxgwSGEg8/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/s2Hao2EiO-JPWc8VoUAxgwSGEg8/1/da"><img src="http://feedads.g.doubleclick.net/~a/s2Hao2EiO-JPWc8VoUAxgwSGEg8/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/FuzzyTolerance/~4/2UXX1s6kCPw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://fuzzytolerance.info/make-smarter-css-positioning-google-maps-api-chrome-dev-tools-inventing-on-principle-and-management-fads/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://fuzzytolerance.info/make-smarter-css-positioning-google-maps-api-chrome-dev-tools-inventing-on-principle-and-management-fads/</feedburner:origLink></item>
		<item>
		<title>Getting SublimeLinter Running on Windows</title>
		<link>http://feedproxy.google.com/~r/FuzzyTolerance/~3/jrCweravU_s/</link>
		<comments>http://fuzzytolerance.info/getting-sublimelinter-running-on-windows/#comments</comments>
		<pubDate>Tue, 15 May 2012 14:47:41 +0000</pubDate>
		<dc:creator>Fuzzy</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://fuzzytolerance.info/?p=2090</guid>
		<description><![CDATA[Sublime Text 2 has managed to wrest me away from Komodo Edit, my code buddy of choice for a long&#160;<a href="http://fuzzytolerance.info/getting-sublimelinter-running-on-windows/" class="read-more">...continue reading &#8594;</a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.sublimetext.com/">Sublime Text 2</a> has managed to wrest me away from <a href="http://www.activestate.com/komodo-edit">Komodo Edit</a>, my code buddy of choice for a long time. I like Sublime Text 2 so much that I dropped $60 (gasp!) on it, and I haven&#8217;t dropped money on an editor in ages.  It&#8217;s a fast, beautiful editor, and the plugin ecosystem is very robust.</p>
<p>One of my must-have plugins is <a href="https://github.com/Kronuz/SublimeLinter">SublimeLinter</a>, which highlights lines of code the linter deems to contain (potential) errors, highlights things like TODO lines, and other goodies. It relies on node.js for a number of the base linters (JavaScript and CSS in particular). This seems to just work under Linux, but it just doesn&#8217;t under Windows. To get it up and running:</p>
<ul>
<li>Install <a href="http://nodejs.org/">node.js</a>. Which, by the way, is pretty darn awesome in its own right.</li>
<li>Open up Sublime Text, and close all open files.</li>
<li>Head to Preferences-&gt;Package Settings-&gt;SublimeLinter-&gt;Settings &#8211; User (it will be empty if you haven&#8217;t messed with it before), and insert the following:</li>
</ul>
<pre class="brush: jscript; title: ; notranslate">
{

  &quot;sublimelinter_executable_map&quot;:
    {
        &quot;javascript&quot;:&quot;C:/Program Files (x86)/nodejs/node.exe&quot;,
        &quot;css&quot;:&quot;C:/Program Files (x86)/nodejs/node.exe&quot;
    }

}
</pre>
<ul>
<li>This is also where you&#8217;d put paths to, say, php for linting. Make sure you get the path to node correct &#8211; this is the default location on a Windows 7 install. Save the file, close the file, and restart Sublime Text.</li>
<li>Marvel at how bad your code is.</li>
</ul>
<p>You can tweak down the linting options in your settings file. The default CSS linting rules in particular are set to kill. The default JS linting rules aren&#8217;t so bad.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/7xNd2hAkKE4S07TUhohrOpIwgJE/0/da"><img src="http://feedads.g.doubleclick.net/~a/7xNd2hAkKE4S07TUhohrOpIwgJE/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/7xNd2hAkKE4S07TUhohrOpIwgJE/1/da"><img src="http://feedads.g.doubleclick.net/~a/7xNd2hAkKE4S07TUhohrOpIwgJE/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/FuzzyTolerance/~4/jrCweravU_s" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://fuzzytolerance.info/getting-sublimelinter-running-on-windows/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://fuzzytolerance.info/getting-sublimelinter-running-on-windows/</feedburner:origLink></item>
		<item>
		<title>The Pitfalls of Consensus</title>
		<link>http://feedproxy.google.com/~r/FuzzyTolerance/~3/u-dSKOk75rg/</link>
		<comments>http://fuzzytolerance.info/the-pitfalls-of-consensus/#comments</comments>
		<pubDate>Fri, 11 May 2012 13:07:14 +0000</pubDate>
		<dc:creator>Fuzzy</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://fuzzytolerance.info/?p=2083</guid>
		<description><![CDATA[Sometimes Google Reader (feed aggregator) goes through my subscription list (mostly other feed aggregators) and flings something at me I&#160;<a href="http://fuzzytolerance.info/the-pitfalls-of-consensus/" class="read-more">...continue reading &#8594;</a>]]></description>
			<content:encoded><![CDATA[<p>Sometimes Google Reader (feed aggregator) goes through my subscription list (mostly other feed aggregators) and flings something at me I wouldn&#8217;t normally look at. The other day it sent me to Forbes to look at <a href="http://www.forbes.com/sites/jessicahagy/2012/02/28/the-six-enemies-of-greatness-and-happiness/">The Six Enemies of Greatness (and Happiness)</a>. This quote stuck in my head:</p>
<blockquote><p>Nothing destroys a good idea faster than a mandatory consensus. The lowest common denominator is never a high standard.</p></blockquote>
<p>Have you ever been in one of those committees where everybody in the room had veto power over everything? I know you government types have. Governments operate more like a collection of (occasionally warring) city-states than a traditional top-down organization. This mode of operation has advantages and disadvantages. Hello, disadvantage.</p>
<div class="wp-caption aligncenter" style="width: 360px"><img src="https://lh4.googleusercontent.com/-oAXDNpSlTsg/T6wQTt_R6sI/AAAAAAAAC6E/Ayme0dSRQ8w/s800/2737550549_504907d915.jpg" alt="" width="350" height="285" /><p class="wp-caption-text">If you ever wondered <em>how did our web site for the City of Bupkiss get this awful?</em>, this is it.</p></div>
<p>This comes about for the same reason you get multi-layered committees who are only referred to by their acronyms &#8211; risk aversion. In risk-averse organizations, the actual or perceived penalties of risk are greater than the rewards. Mandatory consensus mitigates risk by spreading responsibility to as wide an area as possible, because saying that everybody is responsible is another way of saying that nobody is responsible. </p>
<p>This came up because I recently managed to rescue a project from the pitfalls of consensus. How does one with the social skills of a turnip (hi!) manage the kind of subtle manipulations required to navigate that kind of environment? Beats me. It mostly involved waiting patiently with my trap shut. I finally got somebody to voice what was on my mind and pounced, declared it manifest brilliance, and ran with it like the dickens before anybody knew what hit them. </p>
<p>Mandatory consensus isn&#8217;t a rule problem or a strategy problem where you would form another committee (probably referred to by an acronym) to create more paper to attach as appedix F on your strategic plan which, by the way, nobody but you has read. This is a culture problem, and <a href="http://opensource.com/business/12/2/culture-eats-strategy">culture eats strategy</a>. If it is something you plan on fixing, that is where you have to start. </p>

<p><a href="http://feedads.g.doubleclick.net/~a/w5OoSLP958z1ZoTAjs5yzQ0F4_A/0/da"><img src="http://feedads.g.doubleclick.net/~a/w5OoSLP958z1ZoTAjs5yzQ0F4_A/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/w5OoSLP958z1ZoTAjs5yzQ0F4_A/1/da"><img src="http://feedads.g.doubleclick.net/~a/w5OoSLP958z1ZoTAjs5yzQ0F4_A/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/FuzzyTolerance/~4/u-dSKOk75rg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://fuzzytolerance.info/the-pitfalls-of-consensus/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://fuzzytolerance.info/the-pitfalls-of-consensus/</feedburner:origLink></item>
		<item>
		<title>Feats of Memory Anyone Can Do</title>
		<link>http://feedproxy.google.com/~r/FuzzyTolerance/~3/RDzzk7qatJQ/</link>
		<comments>http://fuzzytolerance.info/feats-of-memory-anyone-can-do/#comments</comments>
		<pubDate>Fri, 11 May 2012 12:28:23 +0000</pubDate>
		<dc:creator>Fuzzy</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://fuzzytolerance.info/?p=2086</guid>
		<description><![CDATA[I&#8217;ll pass this off as topical because the word spatial was bandied about once, but it&#8217;s really just a fascinating&#160;<a href="http://fuzzytolerance.info/feats-of-memory-anyone-can-do/" class="read-more">...continue reading &#8594;</a>]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ll pass this off as topical because the word spatial was bandied about once, but it&#8217;s really just a fascinating TED talk by Joshua Foer about memory.</p>
<div style="text-align: center">
<object width="526" height="374"><param name="movie" value="http://video.ted.com/assets/player/swf/EmbedPlayer.swf"></param><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always"/><param name="wmode" value="transparent"></param><param name="bgColor" value="#ffffff"></param><param name="flashvars" value="vu=http://video.ted.com/talk/stream/2012/Blank/JoshuaFoer_2012-320k.mp4&#038;su=http://images.ted.com/images/ted/tedindex/embed-posters/JoshuaFoer_2012-embed.jpg&#038;vw=512&#038;vh=288&#038;ap=0&#038;ti=1443&#038;lang=&#038;introDuration=15330&#038;adDuration=4000&#038;postAdDuration=830&#038;adKeys=talk=joshua_foer_feats_of_memory_anyone_can_do;year=2012;theme=how_the_mind_works;theme=numbers_at_play;theme=ted_under_30;event=TED2012;tag=brain;tag=culture;tag=memory;tag=neuroscience;tag=science;&#038;preAdTag=tconf.ted/embed;tile=1;sz=512x288;" /><embed src="http://video.ted.com/assets/player/swf/EmbedPlayer.swf" pluginspace="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" wmode="transparent" bgColor="#ffffff" width="526" height="374" allowFullScreen="true" allowScriptAccess="always" flashvars="vu=http://video.ted.com/talk/stream/2012/Blank/JoshuaFoer_2012-320k.mp4&#038;su=http://images.ted.com/images/ted/tedindex/embed-posters/JoshuaFoer_2012-embed.jpg&#038;vw=512&#038;vh=288&#038;ap=0&#038;ti=1443&#038;lang=&#038;introDuration=15330&#038;adDuration=4000&#038;postAdDuration=830&#038;adKeys=talk=joshua_foer_feats_of_memory_anyone_can_do;year=2012;theme=how_the_mind_works;theme=numbers_at_play;theme=ted_under_30;event=TED2012;tag=brain;tag=culture;tag=memory;tag=neuroscience;tag=science;&#038;preAdTag=tconf.ted/embed;tile=1;sz=512x288;"></embed></object>
</div>

<p><a href="http://feedads.g.doubleclick.net/~a/LZOEg2nylRS1g6XFx4WPS5WJyv0/0/da"><img src="http://feedads.g.doubleclick.net/~a/LZOEg2nylRS1g6XFx4WPS5WJyv0/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/LZOEg2nylRS1g6XFx4WPS5WJyv0/1/da"><img src="http://feedads.g.doubleclick.net/~a/LZOEg2nylRS1g6XFx4WPS5WJyv0/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/FuzzyTolerance/~4/RDzzk7qatJQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://fuzzytolerance.info/feats-of-memory-anyone-can-do/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://fuzzytolerance.info/feats-of-memory-anyone-can-do/</feedburner:origLink></item>
		<item>
		<title>Screencast #12 – TileMill Part 2</title>
		<link>http://feedproxy.google.com/~r/FuzzyTolerance/~3/_b0eBrYv3zg/</link>
		<comments>http://fuzzytolerance.info/screencast-12-tilemill-part-2/#comments</comments>
		<pubDate>Fri, 27 Apr 2012 17:19:43 +0000</pubDate>
		<dc:creator>Fuzzy</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://fuzzytolerance.info/?p=2081</guid>
		<description><![CDATA[Part 2 of using TileMill. We&#8217;ll make some decent street renderings (based on DC Maps), use SVG markers, show raster&#160;<a href="http://fuzzytolerance.info/screencast-12-tilemill-part-2/" class="read-more">...continue reading &#8594;</a>]]></description>
			<content:encoded><![CDATA[<p>Part 2 of using TileMill. We&#8217;ll make some decent street renderings (based on DC Maps), use SVG markers, show raster imagery, and hack TileMill to do 2.5D buildings based on a field value.</p>
<div style="text-align: center">
<iframe width="640" height="360" src="http://www.youtube-nocookie.com/embed/kidHKHWOS6Q" frameborder="0" allowfullscreen></iframe>
</div>
<p>Main Styles</p>
<pre class="brush: css; title: ; notranslate">
Map {
  background-color: #fff;
}

#buildings {
  [zoom &gt; 14] {
  line-color:#594;
  line-width:0.5;
  polygon-fill: #ccc;
    polygon-opacity: 1;
    }
  [zoom &gt;=16] {
    building-height:  &quot;[HEIGHT] * .75&quot;;
    building-fill: #ccc;
    building-fill-opacity: 0.6;
  }
}

#trees {
  [zoom = 16] {
  marker-width:2;
  marker-fill: #6FBF4D;
  marker-opacity: 0.8;
  marker-line-color: #40821F;
  marker-allow-overlap: true;
  }
  [zoom &gt; 16] {
    point-file: url(images/tree.svg);
    point-transform:&quot;scale(0.15)&quot;;
  }
  [zoom = 18] {
      point-transform: &quot;scale(0.3)&quot;;
  }
}

#relief {
  raster-opacity:1;
}

#hillshade {
  [zoom &lt; 16] {
    raster-opacity: 0.5
    }
}

#slopeshade {
  [zoom &lt; 16] {
  raster-opacity: 0.10;
    }
}
</pre>
<p>Road Style</p>
<pre class="brush: css; title: ; notranslate">
@motorway: #F8D6E0; /* #90BFE0 */
@trunk: #FFFABB;
@primary: @trunk;

@road: #bbb;
@secondary: @road;
@track: @road;

@font_reg: &quot;Ubuntu Regular&quot;,&quot;Arial Regular&quot;,&quot;DejaVu Sans Book&quot;;

/* ---- ROAD COLORS ---- */

/*.highway.line { line-color: #f00; } /* debug */

.highway[stylegroup='HIGHWAY'] {
  .line[zoom&gt;=7]  {
    line-color:spin(darken(@motorway,36),-10);
    line-cap:round;
    line-join:round;
  }
  .fill[zoom&gt;=10] {
    line-color:@motorway;
    line-cap:round;
    line-join:round;
  }
}

.highway[stylegroup='RAMP'] {
  .line[zoom&gt;=7]  {
    line-color:spin(darken(@motorway,36),-10);
    line-cap:round;
    line-join:round;
  }
  .fill[zoom&gt;=12] {
    line-color:@motorway;
    line-cap:round;
    line-join:round;
  }
}

.highway[stylegroup='PRIMARY']{
  .line[zoom&gt;=7] {
    line-color:spin(darken(@primary,36),-10);
    line-cap:round;
    line-join:round;
  }
  .fill[zoom&gt;=12] {
    line-color:@primary;
    line-cap:round;
    line-join:round;
  }
}

  .highway[stylegroup='SECONDARY'] {
  .line[zoom&gt;=10] {
    line-color:@road;
    line-cap:round;
    line-join:round;
  }
  .fill[zoom&gt;=15] {
    line-color:#fff;
    line-cap:round;
    line-join:round;
  }
}

/* ---- ROAD WIDTHS ---- */

.highway[zoom=13] {
  .line[stylegroup='HIGHWAY']      { line-width: 2.0 + 2; }
  .fill[stylegroup='HIGHWAY']      { line-width: 2.0; }
  .line[stylegroup='PRIMARY']       { line-width: 1.2 + 2; }
  .fill[stylegroup='PRIMARY']       { line-width: 1.2; }
  .line[stylegroup='RAMP'] { line-width: 1.0 + 2; }
  .fill[stylegroup='RAMP'] { line-width: 1.0; }
  .line[stylegroup='SECONDARY'] { line-width: 1.0; }
}

.highway[zoom=14] {
  .line[stylegroup='HIGHWAY']      { line-width: 4 + 2; }
  .fill[stylegroup='HIGHWAY']      { line-width: 4; }
  .line[stylegroup='PRIMARY']       { line-width: 2 + 2; }
  .fill[stylegroup='PRIMARY']       { line-width: 2; }
  .line[stylegroup='RAMP'] { line-width: 1.4 + 2; }
  .fill[stylegroup='RAMP'] { line-width: 1.4; }
  .line[stylegroup='SECONDARY'] { line-width: 1.0; }
}

.highway[zoom=15] {
  .line[stylegroup='HIGHWAY']      { line-width: 6 + 2; }
  .fill[stylegroup='HIGHWAY']      { line-width: 6; }
  .line[stylegroup='PRIMARY']       { line-width: 4 + 2; }
  .fill[stylegroup='PRIMARY']       { line-width: 4; }
  .line[stylegroup='RAMP'] { line-width: 2 + 2; }
  .fill[stylegroup='RAMP'] { line-width: 2; }
  .line[stylegroup='SECONDARY']  { line-width: 4 + 2; }
  .fill[stylegroup='SECONDARY']  { line-width: 4; }
}

.highway[zoom=16] {
  .line[stylegroup='HIGHWAY']      { line-width: 9 + 3; }
  .fill[stylegroup='HIGHWAY']      { line-width: 9; }
  .line[stylegroup='PRIMARY']       { line-width: 7 + 2; }
  .fill[stylegroup='PRIMARY']       { line-width: 7; }
  .line[stylegroup='RAMP'] { line-width: 3 + 2.5; }
  .fill[stylegroup='RAMP'] { line-width: 3; }
  .line[stylegroup='SECONDARY'] { line-width: 6 + 2; }
  .fill[stylegroup='SECONDARY']  { line-width: 6; }
}

.highway[zoom&gt;=17] {
  .line[stylegroup='HIGHWAY']      { line-width: 13 + 3; }
  .fill[stylegroup='HIGHWAY']      { line-width: 13; }
  .line[stylegroup='PRIMARY']       { line-width: 9 + 2; }
  .fill[stylegroup='PRIMARY']       { line-width: 9; }
  .line[stylegroup='RAMP'] { line-width: 4 + 2.5; }
  .fill[stylegroup='RAMP'] { line-width: 4; }
  .line[stylegroup='SECONDARY'] { line-width: 8 + 2; }
  .fill[stylegroup='SECONDARY'] { line-width: 8; }
}

/* ---- ONE WAY ARROWS ---- */

.highway.fill::oneway_arrow[zoom&gt;15][oneway &gt; 0] {
  marker-type:arrow;
  marker-width:1;
  marker-line-width:1;
  marker-line-opacity:0.5;
  marker-line-color:#fff;
  marker-spacing: 200;
  marker-fill:spin(darken(@motorway,50),-10);
  marker-opacity:0.8;
}

/* ---- HIGHWAY ---- */

.highway-labels {
  text-face-name:@font_reg;
  text-halo-radius:1;
  text-placement:line;
  text-name:&quot;''&quot;;
  text-min-distance: 500;
  [stylegroup='HIGHWAY'][zoom&gt;=12] {
    text-name:&quot;[wholestnam]&quot;;
    text-halo-fill:lighten(@motorway,8);
    [zoom&gt;=13] { text-size:11; }
    [zoom&gt;=15] { text-size:12; }
  }
  [stylegroup=&quot;PRIMARY&quot;][zoom&gt;=13] {
    text-name:&quot;[wholestnam]&quot;;
    text-fill:spin(darken(@primary,70),-15);
    text-halo-fill:lighten(@primary,8);
    [zoom&gt;=15] { text-size:11; }
  }
  [stylegroup='SECONDARY'][zoom&gt;=16] {
    text-name:&quot;[wholestnam]&quot;;
    text-fill:#444;
    text-halo-fill:#fff;
  }
}
</pre>
<h3>Resources</h3>
<ul>
<li><a href="http://mapbox.com/tilemill/docs/guides/terrain-data/">Working With Terrain Data</a></li>
<li><a href="http://linfiniti.com/2010/12/a-workflow-for-creating-beautiful-relief-shaded-dems-using-gdal/">A workflow for creating beautiful relief shaded dems using GDAL</a></li>
</ul>

<p><a href="http://feedads.g.doubleclick.net/~a/z_gPJhHmWYNgI-DO4D7ikPVAIZM/0/da"><img src="http://feedads.g.doubleclick.net/~a/z_gPJhHmWYNgI-DO4D7ikPVAIZM/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/z_gPJhHmWYNgI-DO4D7ikPVAIZM/1/da"><img src="http://feedads.g.doubleclick.net/~a/z_gPJhHmWYNgI-DO4D7ikPVAIZM/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/FuzzyTolerance/~4/_b0eBrYv3zg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://fuzzytolerance.info/screencast-12-tilemill-part-2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://fuzzytolerance.info/screencast-12-tilemill-part-2/</feedburner:origLink></item>
		<item>
		<title>Crowd Sourcing House Photos</title>
		<link>http://feedproxy.google.com/~r/FuzzyTolerance/~3/huOK2R63BD4/</link>
		<comments>http://fuzzytolerance.info/crowd-sourcing-house-photos/#comments</comments>
		<pubDate>Fri, 20 Apr 2012 20:13:53 +0000</pubDate>
		<dc:creator>Fuzzy</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://fuzzytolerance.info/?p=2071</guid>
		<description><![CDATA[Our house photos have us in a bit of a pickle. We ran out of money to keep up with&#160;<a href="http://fuzzytolerance.info/crowd-sourcing-house-photos/" class="read-more">...continue reading &#8594;</a>]]></description>
			<content:encoded><![CDATA[<p>Our house photos have us in a bit of a pickle. We ran out of money to keep up with them, and the appraisers, who at one time were going to update photos in the field, found that all things considered, they&#8217;d rather be appraising. Can&#8217;t say I blame them.</p>
<p>So we have a small crowd angry that their photos are old. But we also have an enormous crowd that would skin us alive if the photos went away. So&#8230;here&#8217;s my plan.</p>
<ul>
<li>Mark the photos we have with the date when we display them, something we should have been doing anyway. The photos will still be out there, keeping our hides intact.</li>
<li>Let people upload their own photo. That should placate the <em>I repainted my house and it doesn&#8217;t show in my photo</em> crowd.</li>
<li>Release an API for the photos. After all, if people are providing data updates, people should get the data (I&#8217;m looking at you Google).</li>
</ul>
<p>First things first &#8211; a file upload/processing piece. This afternoon-killing bit of code was so unexpectedly unpleasant I wanted to share it. You&#8217;ll need the gd and sqlite/pdo extensions enabled for PHP.</p>
<div class="wp-caption aligncenter" style="width: 422px"><img alt="" src="https://lh3.googleusercontent.com/-IBBYEOtOt64/T5HDHMxtLlI/AAAAAAAAC0c/6z744R_M2YM/s800/upload.png" width="412" height="355" /><p class="wp-caption-text">OUCH OUCH OUHC OUCH OUCH</p></div>
<pre class="brush: php; title: ; notranslate">
&lt;?php

  // validate email address
  function isValidEmail($email){
    return preg_match(&quot;^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$^&quot;, $email);
  }
  // validate attribution
  function isThere($attribution) {
    return strlen(trim($attribution)) &gt; 0;
  }
  // validate image type
  function isImageType(){
    if ((($_FILES[&quot;file&quot;][&quot;type&quot;] == &quot;image/jpeg&quot;)
      || ($_FILES[&quot;file&quot;][&quot;type&quot;] == &quot;image/jpg&quot;)
      || ($_FILES[&quot;file&quot;][&quot;type&quot;] == &quot;image/gif&quot;)
      || ($_FILES[&quot;file&quot;][&quot;type&quot;] == &quot;image/png&quot;))) {
        return true;
    }
    else return false;
  }
  // check image size
  function isImageSize(){
    return $_FILES[&quot;file&quot;][&quot;size&quot;] &lt; 2000000 ;
  }
  // replace file name extension
  function replace_extension($filename, $new_extension) {
    return preg_replace('/\..+$/', '.' . $new_extension, $filename);
  }

 /**
 * Remove spaces and special characters from file names. Swiped this from Drupal.
 */
  function sanitize_filename($name) {
    $special_chars = array (&quot;#&quot;,&quot;$&quot;,&quot;%&quot;,&quot;^&quot;,&quot;&amp;&quot;,&quot;*&quot;,&quot;!&quot;,&quot;~&quot;,&quot;‘&quot;,&quot;\&quot;&quot;,&quot;’&quot;,&quot;'&quot;,&quot;=&quot;,&quot;?&quot;,&quot;/&quot;,&quot;[&quot;,&quot;]&quot;,&quot;(&quot;,&quot;)&quot;,&quot;|&quot;,&quot;&lt;&quot;,&quot;&gt;&quot;,&quot;;&quot;,&quot;\\&quot;,&quot;,&quot;,&quot;.&quot;);
    $name = preg_replace(&quot;/^[.]*/&quot;,&quot;&quot;,$name); // remove leading dots
    $name = preg_replace(&quot;/[.]*$/&quot;,&quot;&quot;,$name); // remove trailing dots

    $lastdotpos=strrpos($name, &quot;.&quot;); // save last dot position

    $name = str_replace($special_chars, &quot;&quot;, $name);  // remove special characters

    $name = str_replace(' ','_',$name); // replace spaces with _

    $afterdot = &quot;&quot;;
    if ($lastdotpos !== false) { // Split into name and extension, if any.
      if ($lastdotpos &lt; (strlen($name) - 1))
          $afterdot = substr($name, $lastdotpos);

      $extensionlen = strlen($afterdot);

      if ($lastdotpos &lt; (50 - $extensionlen) )
          $beforedot = substr($name, 0, $lastdotpos);
      else
          $beforedot = substr($name, 0, (50 - $extensionlen));
    }
    else   // no extension
     $beforedot = substr($name,0,50);

    if ($afterdot)
      $name = $beforedot . &quot;.&quot; . $afterdot;
    else
      $name = $beforedot;

    return $name;
  }

  // Holder of ye oh crap information
  $message = &quot;&quot;;

  // form was submitted
  if ($_POST['xsubmit'] == 'y') {

    // run data checks
    if (!isValidEmail($_POST[&quot;email&quot;])) $message .= &quot;Invalid email address.&lt;br /&gt;&quot;;
    if (!isThere($_POST[&quot;attribution&quot;])) $message .= &quot;Attribution required.&lt;br /&gt;&quot;;
    if (!isset($_POST[&quot;license&quot;])) $message .= &quot;You must agree to the terms and conditions.&lt;br /&gt;&quot;;
    if (!isImageType()) $message .= &quot;Image must be GIF, PNG, or JPG/JPEG.&lt;br /&gt;&quot;;
    if (!isImageSize()) $message .= &quot;Image must be less than 2MB in size.&lt;br /&gt;&quot;;

    // run file upload if everything checked out OK
    // the uploaded photo is shrunk/expanded to 600px wide
    // and written out as date + filename.jpg
    if (strlen($message) == 0 ) {
      try {
        // width of the uploaded image
        $newwidth = 600;

        // Set save directory and file name
        $directory = &quot;photos/&quot;;
        $target = time().'-'.sanitize_filename($_FILES['file']['name']);

        // Write image to server

        $ext = end(explode(&quot;.&quot;,strtolower(trim($_FILES[&quot;file&quot;][&quot;name&quot;]))));

        // Check is valid extension.
        if($ext == &quot;jpg&quot; || $ext == &quot;jpeg&quot;){
          $image = imagecreatefromjpeg($_FILES[&quot;file&quot;][&quot;tmp_name&quot;]);
        }
        else if($ext == &quot;gif&quot;){
          $image = imagecreatefromgif($_FILES[&quot;file&quot;][&quot;tmp_name&quot;]);
        }
        else if($ext == &quot;png&quot;){
          $image = imagecreatefrompng($_FILES[&quot;file&quot;][&quot;tmp_name&quot;]);
        }

        list($width,$height)=getimagesize($_FILES['file']['tmp_name']);
        $newheight=($height/$width)*$newwidth;
        $tmp=imagecreatetruecolor($newwidth,$newheight);

        imagecopyresampled($tmp,$image,0,0,0,0,$newwidth,$newheight,$width,$height);

        if(!imagejpeg($tmp,$directory . replace_extension($target, &quot;jpg&quot;), 80)){
          $message =  &quot;Gah! Something broke. Please try again later.&quot;;
        }
      }
      catch(Exception $e) {
        $message = &quot;Gah! Something broke. Please try again later.&quot;;
      }

      /**
      * Upload data to sqlite
      */
      try
        {
          //open the database
          $db = new PDO('sqlite:house_photos.db');

          //insert some data...
          $stm = $db-&gt;prepare(&quot;INSERT INTO house_photos (pid, name, email, filename, upload_date) &quot; .
            &quot; VALUES (:pid, :name, :email, :filename, strftime('%s','now') );&quot;);
          $stm-&gt;bindParam(':pid', $_POST[&quot;pid&quot;], PDO::PARAM_STR, 8);
          $stm-&gt;bindParam(':name', $_POST[&quot;attribution&quot;], PDO::PARAM_STR, 100);
          $stm-&gt;bindParam(':email', $_POST[&quot;email&quot;], PDO::PARAM_STR, 60);
          $stm-&gt;bindParam(':filename', replace_extension($target, &quot;jpg&quot;), PDO::PARAM_STR, 60);

          $count = $stm-&gt;execute();

          // close the database connection
          $db = NULL;
        }
        catch(PDOException $e)
        {
          //print 'Exception : '.$e-&gt;getMessage();
          $message = &quot;Gah! Something broke. Please try again later.&quot;;
        }

    }
  }
?&gt;

  &lt;div role=&quot;main&quot;&gt;
    &lt;!-- show form on initial load or if there's a problem with a previous post --&gt;
    &lt;?php if (strlen($message) &gt; 0 || !isset($_POST['xsubmit'])) { ?&gt;
      &lt;form action=&quot;index.php&quot; method=&quot;post&quot; enctype=&quot;multipart/form-data&quot;&gt;
        &lt;input type=&quot;hidden&quot; name=&quot;xsubmit&quot; value=&quot;y&quot;/&gt;
        &lt;input type=&quot;hidden&quot; name=&quot;pid&quot; value=&quot;&lt;? echo $_GET[&quot;pid&quot;] ?&gt;&quot;/&gt;
        &lt;input type=&quot;file&quot; name=&quot;file&quot; id=&quot;file&quot; required /&gt; &lt;br /&gt;
        &lt;div class=&quot;details&quot;&gt;File must be GIF, PNG, or JPEG/JPG and 2MB in size or less.&lt;/div&gt;
        &lt;input type=&quot;email&quot; name=&quot;email&quot; id=&quot;email&quot; placeholder=&quot;you@place.org&quot; required /&gt;&lt;label for=&quot;location&quot;&gt; Email Address&lt;/label&gt;&lt;br /&gt;
        &lt;input type=&quot;text&quot; name=&quot;attribution&quot; id=&quot;attribution&quot; placeholder=&quot;Name or Company&quot; required /&gt;&lt;label for=&quot;location&quot; title=&quot;name, company, etc.&quot;&gt; Attribution&lt;/label&gt;&lt;br /&gt;
        &lt;p class=&quot;details&quot;&gt;
          &lt;strong&gt;The Fine Print&lt;/strong&gt;&lt;br /&gt;
          By submitting this photo, you agree that you own the copyright on the photo—you photographed it yourself,
          it is a work for hire, or the copyright was transferred to you via written statement
          or operation of law (e.g., inheritance). You also agreet to allow the photo to be
          freely copied and modified by anyone, including third parties not affiliated with
          Mecklenburg County Government, for any purpose.
        &lt;/p&gt;
        &lt;input type=&quot;checkbox&quot; name=&quot;license&quot; id=&quot;license&quot; value=&quot;license&quot; required /&gt;&lt;label for=&quot;license&quot;&gt;&lt;strong&gt;I agree&lt;/strong&gt; with these terms and conditions.&lt;/label&gt;
        &lt;br /&gt;
        &lt;input type=&quot;submit&quot; name=&quot;submit&quot; value=&quot;Upload&quot; /&gt;
        &lt;?php if (strlen($message) &gt; 0) { ?&gt;
          &lt;p class=&quot;warning&quot;&gt;&lt;? echo $message ?&gt;&lt;/p&gt;
        &lt;?php } ?&gt;
      &lt;/form&gt;

    &lt;!-- show thank you message if everything loaded successfully --&gt;
    &lt;?php } else { ?&gt;
      &lt;h2&gt;You're Super!&lt;/h2&gt;
      &lt;p&gt;You just helped add data all of our citizens can use and enjoy. Thanks!&lt;/p&gt;
      &lt;p&gt;Your photo should be available within the next few days. We'll let you know when it's ready.&lt;/p&gt;
    &lt;?php } ?&gt;
  &lt;/div&gt;
</pre>
<p>I&#8217;m don&#8217;t know if I&#8217;m off my game today or what, but a little upload process/database write shouldn&#8217;t have hurt this bad. I exclaimed <em>balls!</em> so loud at one point my 5 year old showed up at my office door with his soccer ball. Here&#8217;s what&#8217;s going on, starting from the bottom and working our way back up.</p>
<p>If you&#8217;ve seen PHP, nothing in the HTML part will be unfamiliar. Basically you get a form when you get there, the form again with some red text if you botched something, and a thank you message if everything went well. The image disclaimer is more or less from Wikipedia.</p>
<p>Back to the top and the real meat of things. The functions at the top are all about data validation. Are all of the fields there, is the email address a real looking address, is the file <2MB and gif/png/jpg, etc. I'm doing some HTML5 form validation as well, but you should always check data inputs at the client and the server. The only thing interesting here is the sanitize_filename function, which I swiped from Drupal. This is so file names with odd characters and spaces don't get written that way to disk. </p>
<p>If the form has been posted and the data all checks out, we're going to process the image and drop it on the server. </p>
<pre class="brush: php; title: ; notranslate">
$newwidth = 600;

// Set save directory and file name
$directory = &quot;photos/&quot;;
$target = time().&#8217;-&#8217;.sanitize_filename($_FILES['file']['name']);

// Write image to server
$ext = end(explode(&quot;.&quot;,strtolower(trim($_FILES[&quot;file&quot;][&quot;name&quot;]))));

// Check is valid extension.
if($ext == &quot;jpg&quot; || $ext == &quot;jpeg&quot;){
   $image = imagecreatefromjpeg($_FILES[&quot;file&quot;][&quot;tmp_name&quot;]);
}
else if($ext == &quot;gif&quot;){
   $image = imagecreatefromgif($_FILES[&quot;file&quot;][&quot;tmp_name&quot;]);
}
else if($ext == &quot;png&quot;){
   $image = imagecreatefrompng($_FILES[&quot;file&quot;][&quot;tmp_name&quot;]);
}

list($width,$height)=getimagesize($_FILES['file']['tmp_name']);
$newheight=($height/$width)*$newwidth;
$tmp=imagecreatetruecolor($newwidth,$newheight);

imagecopyresampled($tmp,$image,0,0,0,0,$newwidth,$newheight,$width,$height);

if(!imagejpeg($tmp,$directory . replace_extension($target, &quot;jpg&quot;), 80)){
   $message =  &quot;Gah! Something broke. Please try again later.&quot;;
}
</pre>
<p>I'm making some executive decisions here. I'm going to store the images as JPG's with 80% quality and I'm going to resize incoming images (proportionally) to a width of 600px. I want some consistency for apps, and I also don't want to store some yoyo's 8MP house photos. We just got a quote for 1TB of SAN space for $30k. The whole "storage is cheap" thing hasn't hit Mecklenburg County yet. So what I'm doing is getting the size of the original image, making a new image with gd, and resampling the uploaded image to the new size. Then I write it out with a time stamp so I don't get file collisions. </p>
<p>Next I need a database entry to store some information and a pointer to the file. I decided to use SQlite, as I think this crowd isn't going to be too big. I've been moving toward escalating data to something like Postgres when it needs to rather than starting things there. </p>
<pre class="brush: php; title: ; notranslate">
//open the database
$db = new PDO('sqlite:house_photos.db');

//insert some data...
$stm = $db-&gt;prepare(&quot;INSERT INTO house_photos (pid, name, email, filename, upload_date) &quot; .
      &quot; VALUES (:pid, :name, :email, :filename, strftime('%s','now') );&quot;);
$stm-&gt;bindParam(':pid', $_POST[&quot;pid&quot;], PDO::PARAM_STR, 8);
$stm-&gt;bindParam(':name', $_POST[&quot;attribution&quot;], PDO::PARAM_STR, 100);
$stm-&gt;bindParam(':email', $_POST[&quot;email&quot;], PDO::PARAM_STR, 60);
$stm-&gt;bindParam(':filename', replace_extension($target, &quot;jpg&quot;), PDO::PARAM_STR, 60);

$count = $stm-&gt;execute();

// close the database connection
$db = NULL;
</pre>
<p>The SQLite table looks like this:</p>
<pre class="brush: sql; title: ; notranslate">
CREATE TABLE house_photos (
    &quot;pid&quot; TEXT NOT NULL,
    &quot;name&quot; TEXT NOT NULL,
    &quot;email&quot; TEXT NOT NULL,
    &quot;filename&quot; TEXT NOT NULL,
    &quot;approved&quot; INTEGER NOT NULL DEFAULT (0),
    &quot;upload_date&quot; INTEGER
)
</pre>
<p>This is pretty straight forward with PDO, with one exception. After much swearing, it turns out you can't write to a SQLite database unless the apache process has write permissions to both the SQLite file <em>and the folder the SQLite file is sitting in</em>. This isn't as bad as it sounds, as you're making a filesystem connection - you can (and should) move your SQLite database out of any HTTP shares entirely. But beyond that, it is straight-forward PDO with bound parameters so the script kiddies don't eat my lunch. With PDO I could move the whole thing to PostgreSQL just by changing the connection string (I think). </p>
<p>Man, that sucked. I allocated an hour for that, and it ate part of my morning and nearly all of my afternoon. But now I have a simple file uploader ready to go. Apps can pull it up in a jQuery UI dialog or whatever, passing it the subject PID when they call it. Next up: a little python script to periodically check for photos not yet approved in the table (I'll have to <del datetime="2012-04-20T19:27:48+00:00">reroute the inevitable porn images to a different folder</del> delete the inevitable porn images), a way to complain about an image, and a web API so people can get to it. But that can wait until next week. I'm taking my ball and going home.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/o_ZZXJrTgiqEdV_yq5rUDTWtkl4/0/da"><img src="http://feedads.g.doubleclick.net/~a/o_ZZXJrTgiqEdV_yq5rUDTWtkl4/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/o_ZZXJrTgiqEdV_yq5rUDTWtkl4/1/da"><img src="http://feedads.g.doubleclick.net/~a/o_ZZXJrTgiqEdV_yq5rUDTWtkl4/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/FuzzyTolerance/~4/huOK2R63BD4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://fuzzytolerance.info/crowd-sourcing-house-photos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://fuzzytolerance.info/crowd-sourcing-house-photos/</feedburner:origLink></item>
		<item>
		<title>Simple Shapes With CSS</title>
		<link>http://feedproxy.google.com/~r/FuzzyTolerance/~3/AmgoB48M8q0/</link>
		<comments>http://fuzzytolerance.info/simple-shapes-with-css/#comments</comments>
		<pubDate>Sun, 15 Apr 2012 18:45:40 +0000</pubDate>
		<dc:creator>Fuzzy</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://fuzzytolerance.info/?p=2050</guid>
		<description><![CDATA[After deciding to do some simple side-floating previous and next links on ye olde blog, I thought a quick post&#160;<a href="http://fuzzytolerance.info/simple-shapes-with-css/" class="read-more">...continue reading &#8594;</a>]]></description>
			<content:encoded><![CDATA[<p>After deciding to do some simple side-floating previous and next links on ye olde blog, I thought a quick post on creating a few simple shapes with CSS was in order.</p>
<p>Those triangles on the side are not images. They are DIV&#8217;s with a little CSS. <em>(Edit: not anymore. Already switched them to unicode triangles. The rest of this tutorial is still good though.)</em> Let&#8217;s take a look at making 4 basic shapes with CSS &#8211; rectangles, triangles, circles, and ovals.</p>
<p><img alt="" src="https://lh5.googleusercontent.com/-69iGYRsUb60/T4sVRyQWmtI/AAAAAAAACy4/VFTrV4To8gg/s800/shapes.png" class="aligncenter" width="581" height="112" /></p>
<p>Here&#8217;s our HTML:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;div id=&quot;rectangle&quot;&gt;&lt;/div&gt;
&lt;div id=&quot;circle&quot;&gt;&lt;/div&gt;
&lt;div id=&quot;oval&quot;&gt;&lt;/div&gt;
&lt;div id=&quot;triangle&quot;&gt;&lt;/div&gt;​
</pre>
<p>First I&#8217;ll insult your intelligence with a rectangle.</p>
<pre class="brush: css; title: ; notranslate">
#rectangle {
 width: 100px;
 height: 100px;
 background: #ccc;
}
</pre>
<p>Sorry. Had to do it.</p>
<p>Next, check out a triangle. Thing of it like a gigantic 3d border corner. You can move the left/right/top/bottom around to change the orientation of the triangle.</p>
<pre class="brush: css; title: ; notranslate">
#triangle {
    width: 0;
    height: 0;
    border-left: 75px solid transparent;
    border-right: 75px solid transparent;
    border-bottom: 75px solid green;
}
</pre>
<p>Now for the circle stuff. Note we&#8217;re using border-radius to create circular shapes. If you give a toss about people on oldIE, you will need to have a fall-back image unless you are just apple-polishing. Equal width and height creates a circle; uneven width and height creates an oval.</p>
<pre class="brush: css; title: ; notranslate">
#circle {
    width: 100px;
    height: 100px;
    border-radius: 50%;
    background: yellow;
}
#oval {
    width: 150px;
    height: 100px;
    border-radius: 50%;
    background: blue;
}
</pre>
<p>You can <a href="http://jsfiddle.net/YwaNu/2/">jsFiddle with these shapes</a> to try different settings.</p>
<p>This is a quick and handy technique to make some basic shapes without busting out Inkscape, and in lieu of an image it decreases page load time and bandwidth. In a few years time we will all scrap stuff like this for SVG, but for now it is a handy technique to put in your trick bag.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/E4MR-V9pWR-Nj8jWNXQu-S_o_sc/0/da"><img src="http://feedads.g.doubleclick.net/~a/E4MR-V9pWR-Nj8jWNXQu-S_o_sc/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/E4MR-V9pWR-Nj8jWNXQu-S_o_sc/1/da"><img src="http://feedads.g.doubleclick.net/~a/E4MR-V9pWR-Nj8jWNXQu-S_o_sc/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/FuzzyTolerance/~4/AmgoB48M8q0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://fuzzytolerance.info/simple-shapes-with-css/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://fuzzytolerance.info/simple-shapes-with-css/</feedburner:origLink></item>
		<item>
		<title>XKCD – Lakes and Oceans</title>
		<link>http://feedproxy.google.com/~r/FuzzyTolerance/~3/sLPHy4F2Ba8/</link>
		<comments>http://fuzzytolerance.info/xkcd-lakes-and-oceans/#comments</comments>
		<pubDate>Mon, 09 Apr 2012 13:02:22 +0000</pubDate>
		<dc:creator>Fuzzy</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://fuzzytolerance.info/?p=2048</guid>
		<description />
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://xkcd.com/1040/"><img class="aligncenter" src="http://imgs.xkcd.com/comics/lakes_and_oceans.png" alt="" width="740" height="493" /></a></p>

<p><a href="http://feedads.g.doubleclick.net/~a/n5XG93bD4JuWlb0nKZ9hAeIIKpE/0/da"><img src="http://feedads.g.doubleclick.net/~a/n5XG93bD4JuWlb0nKZ9hAeIIKpE/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/n5XG93bD4JuWlb0nKZ9hAeIIKpE/1/da"><img src="http://feedads.g.doubleclick.net/~a/n5XG93bD4JuWlb0nKZ9hAeIIKpE/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/FuzzyTolerance/~4/sLPHy4F2Ba8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://fuzzytolerance.info/xkcd-lakes-and-oceans/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://fuzzytolerance.info/xkcd-lakes-and-oceans/</feedburner:origLink></item>
		<item>
		<title>Brainstorming Sucks</title>
		<link>http://feedproxy.google.com/~r/FuzzyTolerance/~3/vKEZvenpyJ8/</link>
		<comments>http://fuzzytolerance.info/brainstorming-sucks/#comments</comments>
		<pubDate>Mon, 09 Apr 2012 03:44:29 +0000</pubDate>
		<dc:creator>Fuzzy</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://fuzzytolerance.info/?p=2038</guid>
		<description><![CDATA[We&#8217;ll get everybody together in a room. I mean everybody! The brains will be so close together they will practically&#160;<a href="http://fuzzytolerance.info/brainstorming-sucks/" class="read-more">...continue reading &#8594;</a>]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter" src="https://lh6.googleusercontent.com/-uCt1hcbX0RM/T4JVOzqYIwI/AAAAAAAACwg/L9R16isTNuU/s800/2007-07-13-brainstorming.gif" alt="" width="450" height="317" /></p>
<blockquote>
<p style="text-align: left;">We&#8217;ll get everybody together in a room. I mean everybody! The brains will be so close together they will practically be touching. Ideas will fly and ricochet off those domes like ping pong balls on amphedamines! It&#8217;ll be like <a href="http://www.imdb.com/title/tt0177971/">The Perfect Storm</a> for brains. A&#8230;brainstorm!<br />
&#8211; Imbecile</p>
</blockquote>
<p>No. No. No no no no no. No.</p>
<h3>&lt;rant&gt;</h3>
<p>The worst thing human beings can collectively engage in is a meeting to wordsmith a document. If you see people doing that, bar the conference room door and set the building on fire. But go just a little ways down the road from that and you&#8217;ll run into the second worse thing human beings can collectively engage in &#8211; the <a href="http://en.wikipedia.org/wiki/Brainstorming">brainstorming</a> session.</p>
<p><img class="alignleft" src="https://lh3.googleusercontent.com/-W6f9fxSmWS8/T4JXclNGP5I/AAAAAAAACwo/BMjoMiuVZf0/s800/you-suck-shirt.png" alt="" width="250" height="244" />The most pernicious aspect of the brainstorming session is that the person calling a brainstorming session thinks it&#8217;s a great idea. It&#8217;s a terrible idea. It&#8217;s a worse idea than re-releasing Titanic in 3D.</p>
<p>The brainstorming concept is generally attributed to an advertising executive from the 1950&#8242;s named Alex Osborn. Through the kind of rigorous scientific experimentation ad execs are famous for, Osborn concluded that people working in groups following a few brainstorming guidelines come up with twice as many ideas as people working alone. Brainstorming soon spread across organizations around the globe. Ad execs must have been held in higher esteem in the 1950&#8242;s.</p>
<p>Since then a great many studies on brainstorming have been conducted. Check out brainstorming on Wikipedia or Richard Wiseman&#8217;s <a href="http://www.amazon.com/59-Seconds-Change-Minute-Vintage/dp/0307474860/ref=tmm_pap_title_0?ie=UTF8&amp;qid=1333939597&amp;sr=8-1">59 Seconds</a> for a host of citations, but to summarize study after study after study:</p>
<ul>
<li>People in brainstorming sessions come up with <strong><em>fewer</em></strong> ideas than people do on their own.</li>
<li>People in brainstorming sessions come up with <strong><em>lower quality</em></strong> ideas than people do on their own.</li>
</ul>
<p>There are a number of different reasons why this happens. People think less clearly in groups. There&#8217;s social loafing, there&#8217;s  diffused responsibility. Group think tends to lead to less creative ideas (and worse decisions). But the point is this: brainstorming sucks really, really hard.</p>
<p>Want someone to come up with more and better ideas? Buy her or him a plant and stick it on their desk. Seriously. That&#8217;s been scientifically shown to work better, and a good smelling plant can clear out a lot of nerdfunk.</p>
<h3>&lt;/rant&gt;</h3>

<p><a href="http://feedads.g.doubleclick.net/~a/R3q1-fn6TPnio0luQpj1bDeDj1w/0/da"><img src="http://feedads.g.doubleclick.net/~a/R3q1-fn6TPnio0luQpj1bDeDj1w/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/R3q1-fn6TPnio0luQpj1bDeDj1w/1/da"><img src="http://feedads.g.doubleclick.net/~a/R3q1-fn6TPnio0luQpj1bDeDj1w/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/FuzzyTolerance/~4/vKEZvenpyJ8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://fuzzytolerance.info/brainstorming-sucks/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://fuzzytolerance.info/brainstorming-sucks/</feedburner:origLink></item>
		<item>
		<title>This Map Will Blow You Away</title>
		<link>http://feedproxy.google.com/~r/FuzzyTolerance/~3/Z0c22bkw0SI/</link>
		<comments>http://fuzzytolerance.info/this-map-will-blow-you-away/#comments</comments>
		<pubDate>Sun, 01 Apr 2012 12:55:18 +0000</pubDate>
		<dc:creator>Fuzzy</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://fuzzytolerance.info/?p=2036</guid>
		<description><![CDATA[Ha! See what I did there?! Wind Map You will need a non-crap web browser. If you don&#8217;t know what&#160;<a href="http://fuzzytolerance.info/this-map-will-blow-you-away/" class="read-more">...continue reading &#8594;</a>]]></description>
			<content:encoded><![CDATA[<p>Ha! See what I did there?!</p>
<p><a href="http://hint.fm/wind/">Wind Map</a></p>
<p>You will need a non-crap web browser. If you don&#8217;t know what I&#8217;m referring to there, odds are you will need to download something.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/D1PrDYCB80s21DEsN6eNdTNRRC0/0/da"><img src="http://feedads.g.doubleclick.net/~a/D1PrDYCB80s21DEsN6eNdTNRRC0/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/D1PrDYCB80s21DEsN6eNdTNRRC0/1/da"><img src="http://feedads.g.doubleclick.net/~a/D1PrDYCB80s21DEsN6eNdTNRRC0/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/FuzzyTolerance/~4/Z0c22bkw0SI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://fuzzytolerance.info/this-map-will-blow-you-away/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://fuzzytolerance.info/this-map-will-blow-you-away/</feedburner:origLink></item>
	</channel>
</rss><!-- This Quick Cache file was built for (  fuzzytolerance.info/feed/ ) in 0.48742 seconds, on May 17th, 2012 at 6:43 pm UTC. --><!-- This Quick Cache file will automatically expire ( and be re-built automatically ) on May 17th, 2012 at 7:43 pm UTC --><!-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --><!-- Quick Cache Is Fully Functional :-) ... A Quick Cache file was just served for (  fuzzytolerance.info/feed/ ) in 0.00170 seconds, on May 17th, 2012 at 7:35 pm UTC. -->

