<?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:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>Mindshare Strategy</title><link>http://mindsharestrategy.com</link><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/MindshareMarketing" /><description>Keep track of the latest ideas and suggestions for developing your brand and successfully marketing it to your perfect customer!</description><language>en-US</language><lastBuildDate>Thu, 09 Feb 2012 16:53:00 PST</lastBuildDate><generator>http://wordpress.org/?v=3.4-alpha-19854</generator><sy:updatePeriod xmlns:sy="http://purl.org/rss/1.0/modules/syndication/">hourly</sy:updatePeriod><sy:updateFrequency xmlns:sy="http://purl.org/rss/1.0/modules/syndication/">1</sy:updateFrequency><xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/MindshareMarketing" /><feedburner:info uri="mindsharemarketing" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://mindsharestrategy.com/?pushpress=hub" /><creativeCommons:license>http://creativecommons.org/licenses/by-nc-nd/2.0/</creativeCommons:license><image><link>http://creativecommons.org/licenses/by-nc-nd/2.0/</link><url>http://creativecommons.org/images/public/somerights20.gif</url><title>Some Rights Reserved</title></image><xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" /><meta xmlns="http://pipes.yahoo.com" name="pipes" content="noprocess" /><feedburner:emailServiceId>MindshareMarketing</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2FMindshareMarketing" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FMindshareMarketing" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2FMindshareMarketing" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/MindshareMarketing" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FMindshareMarketing" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FMindshareMarketing" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FMindshareMarketing" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:browserFriendly>Keep track of the latest ideas on how to develop your brand and successfully market it to your perfect customer. Subscribe today!</feedburner:browserFriendly><item><title>Data versus Meaning</title><link>http://feedproxy.google.com/~r/MindshareMarketing/~3/IW-HG--kHjQ/</link><category>Development</category><category>Focus</category><category>data</category><category>poetry</category><category>writing</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Eric</dc:creator><pubDate>Wed, 08 Feb 2012 13:00:37 PST</pubDate><guid isPermaLink="false">http://mindsharestrategy.com/?p=3959</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>At a conference last week, I was subjected to all kinds of talks on data, data integrity, data storage, data <em>in the cloud</em>, and data-centered design patterns.  One speaker summed things up perfectly:</p>
<blockquote><p>If you make the center of your world <em>data</em>, then everything else becomes easy.</p></blockquote>
<p>This got me thinking.  From a computer-centric viewpoint it all makes sense.  Our machines are built specifically to store data, crunch data, and present that data to the user.</p>
<p>But I don&#8217;t <em>just</em> work with computers.  I also <a href="http://www.librarything.com/profile/EricMann">read a lot</a>.  And I <a href="http://prosepainting.com">write a lot</a>.  And I <a href="http://jumping-duck.com">publish books</a>.  And even in the computer world I spend <a href="http://profiles.wordpress.org/users/ericmann/profile/public/">a great deal of time working on WordPress</a> &#8211; a tool used primarily for writing.</p>
<p>From the <em>media</em>-centric viewpoint, this argument stops making sense.  The most important piece of this blog, for example, is the content.  And that content is stored, essentially, as blobs in the database.  The <em>data</em> on my server consists of titles, keywords, post dates, views, comments, and other meta information that adds little value to the content itself.</p>
<p>This meta doesn&#8217;t provide any <em>meaning</em> to the data/content it&#8217;s meant to represent.  And that, is a huge failure on our part as developers.<span id="more-3959"></span></p>
<h2>Carlos</h2>
<p>My freshman year in college, I took Poetry 101.  It was a great class, filled with roundtable discussions, interesting reading assignments, and daily tear-your-work-apart sessions intended to help us become better writers.</p>
<p>One of the best poets in our class was an older student named Carlos.  He and I shared a couple of classes, actually, so we got to know one another&#8217;s work fairly well.  He was a huge Shakespeare fan, but avoided allusions to the Bard&#8217;s work in his own. He thought it was too cliche.</p>
<p>His final poem for the class was particularly interesting.  It was an artistic rant against the <em>rules</em> of writing.  It called out the authors of the various writing guides we&#8217;d studied and criticized their narrow views of art.</p>
<p>One of these authors was named Mary Oliver &#8211; I checked, I still have her book on the mechanics of poetry.</p>
<p>In Carlos&#8217;poem, he lays out great arguments both for and against using Shakespeare references in modern poetry &#8211; and slams Oliver pretty hard for how she claimed <em>all</em> poems were somehow a reference to Shakespeare.  At the closing of that stanza, it almost looked like Carlos made a mistake.</p>
<p>On a single line he wrote: &#8220;Marry Oliver.&#8221;</p>
<p>Then went on to give up on respecting outside opinions and went on to his next artistic target.</p>
<p>Most of the class &#8211; including the professor &#8211; missed the reference.  &#8221;<a href="http://www.nosweatshakespeare.com/shakespeare-dictionary/">Marry</a>&#8221; was an often used curse in Shakespeare&#8217;s writing.  Using it as part of Oliver&#8217;s name was a sideways jab at her, and quite artistic in a sense.  Berating someone for overusing Shakespearean references <em>using</em> a Shakespearean reference.</p>
<p>But if you didn&#8217;t know Carlos, you would have seen a typo.  I guarantee that I took away a completely different reading of that poem than the rest of the class because I understood the context from which it was written.<br />
<img class="alignright size-medium wp-image-3961" style="border-style: initial; border-color: initial;" title="Data Cloud" src="http://mindsharestrategy.com/files/2012/02/4406466341_9bb8a6e314-237x300.jpg" alt="" width="237" height="300" /></p>
<h2>Context</h2>
<p>How do you store this kind of data about a story?  With a typical WordPress/Tumblr/MovableType/etc website, you&#8217;d put the poem in as a content string, Carlos in as the author, and 2002 as the year of publication.  You might throw in a few keywords &#8211; Shakespeare, Mary Oliver, art critique.  You might even tag it with the name of the class and professor.</p>
<p>Where is the context stored?</p>
<p>Where is Carlos&#8217;backstory?</p>
<p>So much of the poem&#8217;s meaning was not actually in the poem itself, but in the story of the author who penned it and the circumstances surrounding its writing.  None of that can be categorized as meta information in a data-centric database, though.</p>
<h2>The Problem</h2>
<p>I can&#8217;t say I have a solution to this problem.  At least, not yet.  But I can characterize the problem fairly well at this point.</p>
<p>Every story is made of discrete parts.  A logical idea would be to split it up into its relative parts &#8211; each sentence then becomes a piece of data.  But sentences alone are not sufficient vehicles to convey meaning.  For example, look at the sentence &#8220;Jesus wept.&#8221;  Now look at these two possible contexts:</p>
<blockquote><p>When Mary reached the place where Jesus was and saw him, she fell at his feet and said, &#8220;Lord, if you had been here, my brother would not have died.&#8221;</p>
<p>When Jesus saw her weeping, and the Jews who had come along with her also weeping, he was deeply moved in spirit and troubled. &#8220;Where have you laid him?&#8221; he asked.</p>
<p>&#8220;Come and see, Lord,&#8221; they replied.</p>
<p><strong>Jesus wept.</strong></p></blockquote>
<p>Compare that with this:</p>
<blockquote><p>Jesus Torez was an energetic child. He loved to ride his bike around the neighborhood and play make believe in the alleyways down the street from his school.</p>
<p>One day, Jesus found the door open to the abandon building he liked to think of as his &#8220;Intergalactic Headquarters.&#8221;  He didn&#8217;t even hesitate when the idea occurred that it would be more fun <em>indoors</em> that outside.</p>
<p>He crept inside and surveyed the rundown plank flooring.  There was a light on upstairs, so Jesus tiptoed in that direction to investigate.</p>
<p>Just as he shifted his weight to the first step, the plank broke and dropped him through the floor into the basement.</p>
<p>His leg was broken.  <strong>Jesus wept.</strong></p></blockquote>
<p>Different contexts, different characters, different stories.  In one, you&#8217;re dealing with Christ and the phrase &#8220;Jesus wept&#8221; brings up questions of his humanity, his relationship to the deceased in the story, and how these events fit in with the rest of his story.  In the other, you&#8217;re dealing with a young boy in an awkward &#8211; albeit self-induced &#8211; horrific situation.  The phrase &#8220;Jesus wept&#8221; conveys a different kind of pain, and possibly even some panic.</p>
<p>You can&#8217;t separate stories into mere sentences and work with those building blocks as discrete items &#8211; in isolation a sentence means <em>nothing</em>.</p>
<p>A story is, at best, compared to a woven cloth.  Hundreds and thousands of discrete threads are woven together to create a large picture.  It might be a tapestry, a mono-color sheet on a bed, or even a random smattering of color in a carpet block.  In each case, the cloth is greater than the sum of its parts.</p>
<p>And a story is greater than the collection of sentences that comprise it.</p>
<p>The problem is that it can&#8217;t be properly understood as <em>just </em>a story.</p>
<p>Data structures today give us one world or another &#8211; either a story is one, monolithic data element or it&#8217;s a set of discrete, related, but independent data points.  I say it&#8217;s more, and current data structures fail to properly catalog stories, articles, news feeds, blog posts, and the like.</p>
<p>Distilling any piece of art into the data we catalog today robs us of its <em>meaning</em>.  I think we should take this as a challenge and see if we can do better.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/pZk_flLXgVY8jBcthN1tRRLle2o/0/da"><img src="http://feedads.g.doubleclick.net/~a/pZk_flLXgVY8jBcthN1tRRLle2o/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/pZk_flLXgVY8jBcthN1tRRLle2o/1/da"><img src="http://feedads.g.doubleclick.net/~a/pZk_flLXgVY8jBcthN1tRRLle2o/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/MindshareMarketing?a=IW-HG--kHjQ:rHuvLY6FZkg:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/MindshareMarketing?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MindshareMarketing?a=IW-HG--kHjQ:rHuvLY6FZkg:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/MindshareMarketing?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MindshareMarketing?a=IW-HG--kHjQ:rHuvLY6FZkg:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/MindshareMarketing?i=IW-HG--kHjQ:rHuvLY6FZkg:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/MindshareMarketing/~4/IW-HG--kHjQ" height="1" width="1"/>]]></content:encoded><description>At a conference last week, I was subjected to all kinds of talks on data, data integrity, data storage, data in the cloud, and data-centered design patterns.  One speaker summed things up perfectly: If you make the center of your world data, then everything else becomes easy. This got me thinking.  From a computer-centric viewpoint it all&amp;#8230;&lt;br /&gt;&lt;span class="more-link-wrapper"&gt;&lt;a href="http://mindsharestrategy.com/2012/data-versus-meaning/" class="more-link"&gt;Read More&lt;/a&gt;&lt;/span&gt;</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://mindsharestrategy.com/2012/data-versus-meaning/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><feedburner:origLink>http://mindsharestrategy.com/2012/data-versus-meaning/</feedburner:origLink></item><item><title>Domains, Registrars, and DNS … oh my!</title><link>http://feedproxy.google.com/~r/MindshareMarketing/~3/hEQSYSo1rmo/</link><category>Development</category><category>Focus</category><category>1and1</category><category>hosting</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Eric</dc:creator><pubDate>Fri, 13 Jan 2012 12:35:34 PST</pubDate><guid isPermaLink="false">http://mindsharestrategy.com/?p=3953</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>About a year ago, I bought a short url so I didn&#8217;t have to use <a href="http://tinyurl.com">tinyurl.com</a> or <a href="http://bit.ly">bit.ly</a> on Twitter.  It&#8217;s a .me address, and at the time the best/cheapest .me registrar was GoDaddy.</p>
<p>I don&#8217;t host sites there, but I registered the domain there anyway.  Then I immediately pointed the domain at my old shared hosting account over on 1and1.</p>
<p>Things worked perfectly!</p>
<p>After a few weeks, I decided to add an email at this short url.  But I didn&#8217;t want to use 1and1&#8242;s email system, so I set up Google Apps for the domain and pointed my MX records at Google.</p>
<p>Again, things worked perfectly!</p>
<p>Then &#8230; two weeks ago I started getting inundated with spam.  <em>Lots</em> of spam.  I got about a hundred or so &#8220;Out of office&#8221; emails an hour from a mailing list in Russia.</p>
<p>All in response to an email that seemingly originated from my address.</p>
<p>Turns out, some spammer was using my email address in the &#8220;from&#8221; field of their messages.  As a result, I got all of the &#8220;unsubscribe&#8221; and &#8220;out of office&#8221; responses.</p>
<p>One system even blacklisted my email address as a known spammer.  I didn&#8217;t find out until several angry client phone calls &#8211; <em>why haven&#8217;t you sent us the code we paid for?!</em></p>
<h2>Simple Solution</h2>
<p>Google recommends setting up authentication for your email to prevent this.  It&#8217;s actually pretty easy.  Just add a TXT record to your DNS with some encrypted strings that Google knows.  Then email recipients can verify that messages <em>appearing</em> to be from you are <em>actually</em> from you.</p>
<p>Well, simple if you don&#8217;t use 1and1.</p>
<p>You see, shared hosting accounts with 1and1 use a very basic DNS system.  You can use their name servers, or remote name servers.  You can use their MX records or set your own MX records.</p>
<p>But you <em>can&#8217;t</em> add a TXT record.</p>
<h2>Migrating</h2>
<p>I was one of the many who jumped ship when GoDaddy announced their (shortlived) support of SOPA.  I quickly moved my email domain (and several other domains) over to Namecheap.</p>
<p>But to keep things simple, I had left the DNS in place &#8211; still pointing at 1and1.</p>
<p>To add a TXT record, I moved my DNS registration to Namecheap for my .me domain as well.  I figured it would be easy enough:</p>
<ul>
<li>Keep the domain registered with Namecheap</li>
<li>Register the DNS with Namecheap</li>
<li>Set the TXT record I needed for authenticated email</li>
<li>Set an A record to point back at my 1and1 hosting account</li>
</ul>
<p>And sure enough it worked!  The spammy emails stopped.  My sites still worked.  Everything was happy.</p>
<p>Until I got the email &#8230;</p>
<h2>The Problem</h2>
<blockquote><p>We at 1&amp;1 Internet have noticed that you have changed the name server of your eam.me domain. Your new settings are:</p>
<p>DNS1: dns3.registrar-servers.com<br />
DNS2: dns2.registrar-servers.com<br />
DNS3: dns5.registrar-servers.com<br />
DNS4: dns4.registrar-servers.com</p>
<p>Because of these new settings, your website hosted with 1&amp;1 Internet can no longer be reached via the eam.me domain. The e-mail addresses included in your Developer Package, if any, have also been disabled.</p>
<p>If you still intend to keep using our services, you can enter the following name servers with your registrar by February 23, 2012 at 11:46:00 PM and continue using our services as usual.</p>
<p>DNS1: ns51.1and1.com<br />
DNS2: ns52.1and1.com</p>
<p>If by February 23, 2012 at 11:46:00 PM you have not registered with our name servers, we will remove the eam.me domain from our systems. If you want to use your domain with your 1&amp;1 Package after February 23, 2012 at 11:46:00 PM, you can specify this configuration on the Control Panel once more and enter the name servers specified there with your registrar.</p></blockquote>
<p>Yeah &#8230; this doesn&#8217;t work for me.  The applications (namely <a href="http://yourls.org/">YOURLS</a>) are still running on my shared hosting system over at 1and1.  But I need the DNS running through Namecheap so I can keep the TXT entry available for email authentication.</p>
<p>I tried one workaround &#8211; setting a CNAME record for the domain to point to my 1and1 account &#8211; but this ate my MX and TXT records as well.</p>
<p>At the moment (assuming no one offers a better alternative) it looks like I&#8217;ll just need to move my applications to a different system entirely.  That is <em>not</em> an optimal solution &#8230; and this entire c****** f*** has me wanting to dump 1and1 altogether.</p>
<h2>Update</h2>
<p>I emailed 1and1 a potential workaround that I found in their own knowledge base.  Essentially, it recommends setting the external domain, pointing it at an external DNS system, then pointing the external DNS system back at 1and1.</p>
<p>My email was along the lines of &#8220;I found a solution posted on your site, had you directed me here in the first place, it would have saved us all a lot of time.&#8221;</p>
<p>They responded &#8230; by directing me to the <em>exact same link</em>:</p>
<blockquote><p>Dear Eric Mann, (Customer ID: XXXXXXXX)</p>
<p>Thank you for contacting us.</p>
<p>We advise you to use the method on the link below.</p>
<p>How do I use my own name server for a 1&amp;1 domain?</p>
<p><a href="http://faq.1and1.com/domains/domain_admin/dns_settings/18.html">http://faq.1and1.com/domains/domain_admin/dns_settings/18.html</a></p>
<p>The technical subdomain for your account is sxxxxxxxxx.onlinehome.us</p>
<p>If you have any further questions please do not hesitate to contact us.</p>
<p>&gt; For the record, I have found a way to make this work. According to your<br />
&gt; own knowledge base, it *is* possible to host a site with your system while<br />
&gt; the domain and DNS is registered elsewhere:<br />
&gt;<br />
&gt; <a href="http://faq.1and1.com/domains/domain_admin/dns_settings/18.html">http://faq.1and1.com/domains/domain_admin/dns_settings/18.html</a></p></blockquote>
<p>I&#8217;m not sure why &#8230; but this irritates me even more than the original fiasco.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/xWo-R3_OWVrg6hE7_PMU1iyN3NA/0/da"><img src="http://feedads.g.doubleclick.net/~a/xWo-R3_OWVrg6hE7_PMU1iyN3NA/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/xWo-R3_OWVrg6hE7_PMU1iyN3NA/1/da"><img src="http://feedads.g.doubleclick.net/~a/xWo-R3_OWVrg6hE7_PMU1iyN3NA/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/MindshareMarketing?a=hEQSYSo1rmo:5Tpd61Dple4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/MindshareMarketing?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MindshareMarketing?a=hEQSYSo1rmo:5Tpd61Dple4:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/MindshareMarketing?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MindshareMarketing?a=hEQSYSo1rmo:5Tpd61Dple4:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/MindshareMarketing?i=hEQSYSo1rmo:5Tpd61Dple4:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/MindshareMarketing/~4/hEQSYSo1rmo" height="1" width="1"/>]]></content:encoded><description>About a year ago, I bought a short url so I didn&amp;#8217;t have to use tinyurl.com or bit.ly on Twitter.  It&amp;#8217;s a .me address, and at the time the best/cheapest .me registrar was GoDaddy. I don&amp;#8217;t host sites there, but I registered the domain there anyway.  Then I immediately pointed the domain at my old&amp;#8230;&lt;br /&gt;&lt;span class="more-link-wrapper"&gt;&lt;a href="http://mindsharestrategy.com/2012/domains-registrars-and-dns-oh-my/" class="more-link"&gt;Read More&lt;/a&gt;&lt;/span&gt;</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://mindsharestrategy.com/2012/domains-registrars-and-dns-oh-my/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><feedburner:origLink>http://mindsharestrategy.com/2012/domains-registrars-and-dns-oh-my/</feedburner:origLink></item><item><title>Post Supplements – A Concept</title><link>http://feedproxy.google.com/~r/MindshareMarketing/~3/cF-lCMChvDw/</link><category>Development</category><category>Focus</category><category>development</category><category>features</category><category>wordpress</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Eric</dc:creator><pubDate>Thu, 22 Dec 2011 19:37:00 PST</pubDate><guid isPermaLink="false">http://mindsharestrategy.com/?p=3928</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>A few months ago, WordPress UX Lead Jane Wells posted <a href="http://core.trac.wordpress.org/ticket/18561" target="_blank">a request to WordPress&#8217;Trac</a> ticketing system.  The idea was to find a better way to insert &#8220;stuff&#8221; below WordPress posts:</p>
<blockquote><p>Inserting the sharing and like rows at the bottom of the post text before the byline/classification metadata seems wrong. It should go below that, so it is closely related to commenting, not part of the content itself. The plugin-generated widget is not &#8220;by&#8221; the post author, after all.</p></blockquote>
<p>I haven&#8217;t used very many social media plugins for exactly this reason.  Nor have I ever used a &#8220;related posts&#8221; plugin.  They always seem to conflict with one another and build up a bunch of unnecessary cruft below my content.</p>
<p>So for the past few months, I&#8217;ve been thinking about different ways to handle this.<span id="more-3928"></span></p>
<div id="attachment_3933" class="wp-caption alignright" style="width: 310px"><a href="http://mindsharestrategy.com/files/2011/12/art-of-manliness.jpg"><img class="size-medium wp-image-3933" title="The Art of Manliness" src="http://mindsharestrategy.com/files/2011/12/art-of-manliness-300x296.jpg" alt="" width="300" height="296" /></a><p class="wp-caption-text">The Art of Manliness adds an author box, a Facebook &quot;like&quot; button, a related content gallery, and a subscription feature to the bottom of each post.</p></div>
<h2>Template Parts</h2>
<p>My first idea was to just use a template region within a WordPress theme.</p>
<p>Each individual theme would call some variety of <code class="codecolorer text default"><span class="text">get_template_part()</span></code> to set up whatever region is being used.</p>
<p>Plugins would then provide content for these templated regions.  So <code class="codecolorer text default"><span class="text">get_template_part('social_media')</span></code> and <code class="codecolorer text default"><span class="text">get_template_part('related')</span></code>, for example.</p>
<p>The problem with this, though, is one of <em>standards</em>.  What template regions will be supported?  How will new ones be developed?  After the battle over post formats, this isn&#8217;t a particular standard I want to battle.</p>
<h2>Post Intents</h2>
<p>Another developer suggested modelling  system after the emerging <a href="http://webintents.org/" target="_blank">Web Intents</a> standard.</p>
<p>Basically, a new function would be added to WordPress to output various registered post intents &#8211; share this, &#8220;like&#8221; this, subscribe to updates, etc.</p>
<p>Individual plugins would then register these intents and their various actions, but leave it to the theme to style the presentation.</p>
<p>I was entirely sold on this idea.  Well, until a long Twitter conversation with <a href="https://twitter.com/#!/helenhousandi" target="_blank">Helen Hou-Sandi</a>:</p>
<!-- tweet id : 149542531368095744 --><style type='text/css'>#bbpBox_149542531368095744 a { text-decoration:none; color:#d66b00; }#bbpBox_149542531368095744 a:hover { text-decoration:underline; }</style><div id='bbpBox_149542531368095744' class='bbpBox' style='padding:20px; margin:5px 0; background-color:#ffffff; background-image:url(http://a1.twimg.com/profile_background_images/73603989/hyhprint.png); background-repeat:no-repeat'><div style='background:#fff; padding:10px; margin:0; min-height:48px; color:#2e1b08; -moz-border-radius:5px; -webkit-border-radius:5px;'><span style='width:100%; font-size:18px; line-height:22px;'>@<a href="http://twitter.com/intent/user?screen_name=EricMann" class="twitter-action">EricMann</a> Thinking in CMS-land, I could see using that template tag for a lead form, or a gallery, or something not sharing.</span><div class='bbp-actions' style='font-size:12px; width:100%; padding:5px 0; margin:0 0 10px 0; border-bottom:1px solid #e6e6e6;'><img align='middle' src='http://mindsharestrategy.com/wp-content/plugins/twitter-blackbird-pie//images/bird.png' /><a title='tweeted on December 21, 2011 9:31 am' href='http://twitter.com/#!/helenhousandi/status/149542531368095744' target='_blank'>December 21, 2011 9:31 am</a> via <a href="http://itunes.apple.com/us/app/twitter/id409789998?mt=12" rel="nofollow" target="blank">Twitter for Mac</a><a href='https://twitter.com/intent/tweet?in_reply_to=149542531368095744' class='bbp-action bbp-reply-action' title='Reply'><span><em style='margin-left: 1em;'></em><strong>Reply</strong></span></a><a href='https://twitter.com/intent/retweet?tweet_id=149542531368095744' class='bbp-action bbp-retweet-action' title='Retweet'><span><em style='margin-left: 1em;'></em><strong>Retweet</strong></span></a><a href='https://twitter.com/intent/favorite?tweet_id=149542531368095744' class='bbp-action bbp-favorite-action' title='Favorite'><span><em style='margin-left: 1em;'></em><strong>Favorite</strong></span></a></div><div style='float:left; padding:0; margin:0'><a href='http://twitter.com/intent/user?screen_name=helenhousandi'><img style='width:48px; height:48px; padding-right:7px; border:none; background:none; margin:0' src='http://a2.twimg.com/profile_images/1447247882/flower-earrings_normal.jpg' /></a></div><div style='float:left; padding:0; margin:0'><a style='font-weight:bold' href='http://twitter.com/intent/user?screen_name=helenhousandi'>@helenhousandi</a><div style='margin:0; padding-top:2px'>Helen Hou-Sandi</div></div><div style='clear:both'></div></div></div><!-- end of tweet -->
<p>When you take things like photo galleries, related posts, and actions <em>other</em> than social media integration into account, the concept of post intents no longer makes sense.</p>
<h2>New Action Hooks</h2>
<div id="attachment_3937" class="wp-caption alignright" style="width: 310px"><a href="http://mindsharestrategy.com/files/2011/12/pearsonified.jpg"><img class="size-medium wp-image-3937 " title="Pearsonified" src="http://mindsharestrategy.com/files/2011/12/pearsonified-300x246.jpg" alt="" width="300" height="246" /></a><p class="wp-caption-text">Chris Pearson add a personal &quot;follow me&quot; Twitter link, a &quot;Tweet this&quot; link, and several other action items below his posts.</p></div>
<p>I love having a large number of action hooks to use when I&#8217;m building a theme.  I can move content around, add custom views to my content, manipulate the display.  The sky&#8217;s the limit.</p>
<p>So when several developers suggested that we just add a few action hooks before and after the post content, I was intrigued.</p>
<p>But really, this is what themes are already doing.  And merely adding a few extra action hooks just gives plugin authors the ability to inject their own markup into the flow of your otherwise well-built design.</p>
<p>Considering some of these add-junk-to-the-bottom-of-my-content plugins already break the display, why would they function any different if I gave them a specific hook to tie in to?</p>
<h2>My Proposal &#8211; Post Supplements</h2>
<p>Instead, I have in mind a hybrid of a new action hook and registering a new object: <em>post supplements</em>.</p>
<p>Think about widgets for a second.  There&#8217;s a specific area to display widgets (the sidebar), each widget is registered with WordPress and placed in this area, and a well-coded widget leaves much of its markup to the theme (<code class="codecolorer text default"><span class="text">before_widget</span></code> and <code class="codecolorer text default"><span class="text">after_widget</span></code>).</p>
<p>So think of two things:</p>
<ol>
<li>A new object defined by WordPress: <code class="codecolorer text default"><span class="text">WP_Supplement</span></code></li>
<li>A new action hook/function used by WordPress to output registered supplements in the theme</li>
</ol>
<p>The theme can register supplements (one for sharing, one for related posts, one for a photo gallery, one for an about-the-author box, etc).  Various plugins can also register supplements.</p>
<p>Then, <em>just like with widgets</em>, these supplements can be added to the theme.</p>
<p>Widgets use <code class="codecolorer text default"><span class="text">add_action( 'widgets_init', create_function( '', 'register_widget(&quot;Foo_Widget&quot;);' ) );</span></code></p>
<p>Supplements could use <code class="codecolorer text default"><span class="text">add_action( 'supplements_init', create_function( '', 'register_supplement(&quot;Foo_Supplement&quot;);' ) );</span></code></p>
<h3>Decisions, Not Options</h3>
<p>I don&#8217;t envision a UI for this feature.  Everything can be handled programatically &#8211; supplements appear on screen in the order in which they were added to the system.  Likewise, they can be unregistered the same way.</p>
<p>This keeps the WP interface lean and mean, but still gives us a more efficient way to add content to a post <em>in exactly the place the theme designer intends:</em> <code class="codecolorer text default"><span class="text">do_action( 'post_supplements' )</span></code> or <code class="codecolorer text default"><span class="text">wp_post_supplements()</span></code>.</p>
<p>The theme designer would be in complete control of the position of these elements, what styling (if any) separates them from the content of the post, and what styling (if any) distinguishes them from one another.</p>
<p>This would be non-trivial to build, so before I dig in to the code I want to solicit feedback on the idea.</p>
<p>Does this make sense from a usability standpoint?</p>

<p><a href="http://feedads.g.doubleclick.net/~a/fM_KDAg53xFpjmqZKgFLwz2mJRg/0/da"><img src="http://feedads.g.doubleclick.net/~a/fM_KDAg53xFpjmqZKgFLwz2mJRg/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/fM_KDAg53xFpjmqZKgFLwz2mJRg/1/da"><img src="http://feedads.g.doubleclick.net/~a/fM_KDAg53xFpjmqZKgFLwz2mJRg/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/MindshareMarketing?a=cF-lCMChvDw:xkqO-hIxEuk:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/MindshareMarketing?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MindshareMarketing?a=cF-lCMChvDw:xkqO-hIxEuk:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/MindshareMarketing?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MindshareMarketing?a=cF-lCMChvDw:xkqO-hIxEuk:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/MindshareMarketing?i=cF-lCMChvDw:xkqO-hIxEuk:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/MindshareMarketing/~4/cF-lCMChvDw" height="1" width="1"/>]]></content:encoded><description>A few months ago, WordPress UX Lead Jane Wells posted a request to WordPress&amp;#8217;Trac ticketing system.  The idea was to find a better way to insert &amp;#8220;stuff&amp;#8221; below WordPress posts: Inserting the sharing and like rows at the bottom of the post text before the byline/classification metadata seems wrong. It should go below that, so&amp;#8230;&lt;br /&gt;&lt;span class="more-link-wrapper"&gt;&lt;a href="http://mindsharestrategy.com/2011/post-supplements-a-concept/" class="more-link"&gt;Read More&lt;/a&gt;&lt;/span&gt;</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://mindsharestrategy.com/2011/post-supplements-a-concept/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">10</slash:comments><feedburner:origLink>http://mindsharestrategy.com/2011/post-supplements-a-concept/</feedburner:origLink></item><item><title>Apple Patents Multi-tasking</title><link>http://feedproxy.google.com/~r/MindshareMarketing/~3/iTI6CddbQ3o/</link><category>Development</category><category>Focus</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Eric</dc:creator><pubDate>Wed, 21 Dec 2011 10:00:39 PST</pubDate><guid isPermaLink="false">http://mindsharestrategy.com/?p=3924</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>The Apple-vs-Google-vs-EveryoneElseInTheWorld patent battle has gotten beyond ridiculous.</p>
<p>I<a href="http://www.tuaw.com/2011/12/21/apple-patents-using-apps-during-phone-calls/" target="_blank"> just read that Apple&#8217;s latest patent victory</a> is for:</p>
<blockquote><p>A portable electronic device displays, on a touch screen display, a user interface for a phone application during a phone call. In response to detecting activation of a menu icon or menu button, the UI for the phone application is replaced with a menu of application icons, while maintaining the phone call. In response to detecting a finger gesture on a non-telephone service application icon, displaying a user interface for the non-telephone service application while continuing to maintain the phone call, the UI for the non-telephone service application including a switch application icon that is not displayed in the UI when there is no ongoing phone call. In response to detecting a finger gesture on the switch application icon, replacing display of the UI for the non-telephone service application with a respective UI for the phone application while continuing to maintain the phone call.</p></blockquote>
<p>In plain English &#8211; Apple has patented the feature where you can switch to another app on a device while maintaining a phone call.  Considering that the phone system on an iPhone is, itself, an app on the device this means that Apple has laid the foundation for patenting the ability to switch from one app to another without turning either one off.</p>
<p>Haven&#8217;t we been doing this for years already?</p>
<p>Does the fact that one of the apps is a phone app <em>really</em> make this a unique, <a href="http://www.uspto.gov/patents/resources/general_info_concerning_patents.jsp#heading-5" target="_blank">non-obvious</a> invention or innovation?</p>
<p>I would argue <strong>no</strong>.  And even though I am not a lawyer, I stick by that argument.</p>
<p>Nothing in Apple&#8217;s <a href="http://patft.uspto.gov/netacgi/nph-Parser?Sect1=PTO1&amp;Sect2=HITOFF&amp;d=PALL&amp;p=1&amp;u=%2Fnetahtml%2FPTO%2Fsrchnum.htm&amp;r=1&amp;f=G&amp;l=50&amp;s1=8082523.PN.&amp;OS=PN/8082523&amp;RS=PN/8082523" target="_blank">patent application</a> seems to be anything more than an &#8220;ante-in&#8221; offering for any sophisticated electronic device.  The fact that they can now, <em>legally</em>, prevent other software developers from releasing a feature we already have, use, and <em>expect</em> from even entry-level offerings is, in a word, laughable.</p>
<p>My prediction: Apple&#8217;s next patent attempt is for a handheld computer capable of also making phone calls.  Really, that patent would be no less legitimate than the one they were just awarded &#8230;</p>

<p><a href="http://feedads.g.doubleclick.net/~a/Ube3Knc5lcgt0MTju5r6CrRe6qk/0/da"><img src="http://feedads.g.doubleclick.net/~a/Ube3Knc5lcgt0MTju5r6CrRe6qk/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/Ube3Knc5lcgt0MTju5r6CrRe6qk/1/da"><img src="http://feedads.g.doubleclick.net/~a/Ube3Knc5lcgt0MTju5r6CrRe6qk/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/MindshareMarketing?a=iTI6CddbQ3o:RiXRrCZqTa0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/MindshareMarketing?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MindshareMarketing?a=iTI6CddbQ3o:RiXRrCZqTa0:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/MindshareMarketing?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MindshareMarketing?a=iTI6CddbQ3o:RiXRrCZqTa0:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/MindshareMarketing?i=iTI6CddbQ3o:RiXRrCZqTa0:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/MindshareMarketing/~4/iTI6CddbQ3o" height="1" width="1"/>]]></content:encoded><description>The Apple-vs-Google-vs-EveryoneElseInTheWorld patent battle has gotten beyond ridiculous. I just read that Apple&amp;#8217;s latest patent victory is for: A portable electronic device displays, on a touch screen display, a user interface for a phone application during a phone call. In response to detecting activation of a menu icon or menu button, the UI for the&amp;#8230;&lt;br /&gt;&lt;span class="more-link-wrapper"&gt;&lt;a href="http://mindsharestrategy.com/2011/apple-patents-multi-tasking/" class="more-link"&gt;Read More&lt;/a&gt;&lt;/span&gt;</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://mindsharestrategy.com/2011/apple-patents-multi-tasking/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">4</slash:comments><feedburner:origLink>http://mindsharestrategy.com/2011/apple-patents-multi-tasking/</feedburner:origLink></item><item><title>Should Free Software Have Free Support?</title><link>http://feedproxy.google.com/~r/MindshareMarketing/~3/RsM517bQlso/</link><category>Development</category><category>Focus</category><category>wordpress</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Eric</dc:creator><pubDate>Fri, 16 Dec 2011 07:38:10 PST</pubDate><guid isPermaLink="false">http://mindsharestrategy.com/?p=3920</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>I do professional (paid) consulting for WordPress.  But I also write and distribute free plugins and themes for WordPress.  My paid business depends a lot on my reputation on the free side of things.</p>
<p>And that&#8217;s where I face a dilemma.</p>
<p>A lot of people use my free stuff.  And several of them come to me from time to time asking for new features, bug fixes, or just regular &#8220;I can&#8217;t figure this out&#8221; support.  Up &#8217;til now, I&#8217;ve offered that support for free.</p>
<p>And that&#8217;s proven to be a bad idea.</p>
<p>So my question to you, how much is reasonable to charge for ongoing development and support?</p>
<p>Please complete the following survey to share <em>your</em> thoughts on how much (if anything) is reasonable to charge for support, on-going development, and feature requests when it comes to <strong>open source</strong> software. <a class="simple-footnote" title="For the record, I will not stop giving away free software.  I&#8217;m just considering a few different ways I can continue to earn a living while doing it." id="return-note-3920-1" href="#note-3920-1"><sup>1</sup></a></p>
<p style="text-align: center;"><a href="https://docs.google.com/a/eam.me/spreadsheet/viewform?formkey=dFZXZ0NMcFJrRDY0dDRLYl9aaXJQMFE6MQ" target="_blank">Complete the survey through Google Docs</a></p>
<p style="text-align: left;">To say &#8220;thank you&#8221; I&#8217;ll be giving away a handful of Amazon.com gift cards to those who complete the survey.  How many I give away and the exact amount on each card will depend on how many people complete the survey.</p>
<div class="simple-footnotes"><p class="notes">Notes:</p><ol><li id="note-3920-1">For the record, I will not stop giving away free software.  I&#8217;m just considering a few different ways I can continue to earn a living while doing it. <a href="#return-note-3920-1">&#8617;</a></li></ol></div>
<p><a href="http://feedads.g.doubleclick.net/~a/z_6ZocvRyNKziJ8HXCDs4R9h09k/0/da"><img src="http://feedads.g.doubleclick.net/~a/z_6ZocvRyNKziJ8HXCDs4R9h09k/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/z_6ZocvRyNKziJ8HXCDs4R9h09k/1/da"><img src="http://feedads.g.doubleclick.net/~a/z_6ZocvRyNKziJ8HXCDs4R9h09k/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/MindshareMarketing?a=RsM517bQlso:Rdg1J9UXJj4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/MindshareMarketing?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MindshareMarketing?a=RsM517bQlso:Rdg1J9UXJj4:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/MindshareMarketing?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MindshareMarketing?a=RsM517bQlso:Rdg1J9UXJj4:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/MindshareMarketing?i=RsM517bQlso:Rdg1J9UXJj4:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/MindshareMarketing/~4/RsM517bQlso" height="1" width="1"/>]]></content:encoded><description>I do professional (paid) consulting for WordPress.  But I also write and distribute free plugins and themes for WordPress.  My paid business depends a lot on my reputation on the free side of things. And that&amp;#8217;s where I face a dilemma. A lot of people use my free stuff.  And several of them come to&amp;#8230;&lt;br /&gt;&lt;span class="more-link-wrapper"&gt;&lt;a href="http://mindsharestrategy.com/2011/should-free-software-have-free-support/" class="more-link"&gt;Read More&lt;/a&gt;&lt;/span&gt;</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://mindsharestrategy.com/2011/should-free-software-have-free-support/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">10</slash:comments><feedburner:origLink>http://mindsharestrategy.com/2011/should-free-software-have-free-support/</feedburner:origLink></item><item><title>Finally! Microsoft Decides to Auto-Update IE</title><link>http://feedproxy.google.com/~r/MindshareMarketing/~3/cpVndhKf_qQ/</link><category>Development</category><category>Focus</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Eric</dc:creator><pubDate>Thu, 15 Dec 2011 09:21:40 PST</pubDate><guid isPermaLink="false">http://mindsharestrategy.com/?p=3916</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>I&#8217;ve always been a fan of the way Chrome automatically updates itself.  New features come on line as soon as they&#8217;re ready and much of the emerging HTML5 standard <em>just works.</em></p>
<p>Even Firefox has changed their release schedule to push out updates more frequently.  And for those of you who don&#8217;t know, when Firefox ships a new version, they cut off support for older versions.</p>
<p>From a web development standpoint, this is fantastic.  It means you can use cutting-edge technologies as soon as they&#8217;re ready and you don&#8217;t need to worry about supporting clunky, legacy browsers.</p>
<p>Unless you&#8217;re supporting Internet Explorer.</p>
<p>Well, until now.</p>
<p>Microsoft announced today that, starting next year, they will &#8220;automatically upgrade Windows customers to the latest version of Internet Explorer available for their PC.&#8221;</p>
<p>My thoughts on this development?  It&#8217;s about ****ing time!</p>
<blockquote>
<h2>IE to Start Automatic Upgrades across Windows XP, Windows Vista, and Windows 7</h2>
<p>Everyone benefits from an up-to-date browser.</p>
<p>Today we are sharing our plan to automatically upgrade Windows customers to the latest version of Internet Explorer available for their PC. This is an important step in helping to move the Web forward. We will start in January for customers in Australia and Brazil who have turned on automatic updating via Windows Update. Similar to our release of IE9 earlier this year, we will take a measured approach, scaling up over time.</p>
<p>As always, when upgrading from one version of Internet Explorer to the next through Windows Update, the user’s home page, search provider, and default browser remains unchanged.</p>
<p><a title="IE to Start Automatic Upgrades across Windows XP, Windows Vista, and Windows 7" href="http://windowsteamblog.com/ie/b/ie/archive/2011/12/15/ie-to-start-automatic-upgrades-across-windows-xp-windows-vista-and-windows-7.aspx" target="_blank">[Read the rest of Microsoft's announcement on the Windows Team Blog ...]</a></p></blockquote>

<p><a href="http://feedads.g.doubleclick.net/~a/XDVxoafChcPwWZorna2rI892CPE/0/da"><img src="http://feedads.g.doubleclick.net/~a/XDVxoafChcPwWZorna2rI892CPE/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/XDVxoafChcPwWZorna2rI892CPE/1/da"><img src="http://feedads.g.doubleclick.net/~a/XDVxoafChcPwWZorna2rI892CPE/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/MindshareMarketing?a=cpVndhKf_qQ:Q8KG_GskhNo:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/MindshareMarketing?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MindshareMarketing?a=cpVndhKf_qQ:Q8KG_GskhNo:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/MindshareMarketing?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MindshareMarketing?a=cpVndhKf_qQ:Q8KG_GskhNo:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/MindshareMarketing?i=cpVndhKf_qQ:Q8KG_GskhNo:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/MindshareMarketing/~4/cpVndhKf_qQ" height="1" width="1"/>]]></content:encoded><description>I&amp;#8217;ve always been a fan of the way Chrome automatically updates itself.  New features come on line as soon as they&amp;#8217;re ready and much of the emerging HTML5 standard just works. Even Firefox has changed their release schedule to push out updates more frequently.  And for those of you who don&amp;#8217;t know, when Firefox ships&amp;#8230;&lt;br /&gt;&lt;span class="more-link-wrapper"&gt;&lt;a href="http://mindsharestrategy.com/2011/finally-microsoft-auto-updates-ie/" class="more-link"&gt;Read More&lt;/a&gt;&lt;/span&gt;</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://mindsharestrategy.com/2011/finally-microsoft-auto-updates-ie/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><feedburner:origLink>http://mindsharestrategy.com/2011/finally-microsoft-auto-updates-ie/</feedburner:origLink></item><item><title>I’ve Still Got It!</title><link>http://feedproxy.google.com/~r/MindshareMarketing/~3/ltTZdEhZKcU/</link><category>Development</category><category>Focus</category><category>wordpress</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Eric</dc:creator><pubDate>Sat, 10 Dec 2011 09:36:25 PST</pubDate><guid isPermaLink="false">http://mindsharestrategy.com/?p=3912</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>Every now and then, someone asks me whether or not I still have quality WordPress development skills.  I think it&#8217;s a fair question.  After all, I spend the bulk of my time now working with closed-source ASP.Net projects and have little time for my favorite WordPress stuff.</p>
<p>But really, much of what I do in the .Net arena is pretty transferable.  And &#8211; this is me bragging a bit &#8211; I&#8217;m a good developer no matter what language or paradigm I&#8217;m working with.</p>
<p>There&#8217;s been a lot of talk about WordPress 3.3 coming out soon.  And a <em>lot</em> of that talk has been about the number of contributions and contributors to the project.  I&#8217;m proud to say that I&#8217;m in that group &#8211; I&#8217;ve had a patch in every major version of WordPress since version 2.8!</p>
<p>And I want to show that off.<span id="more-3912"></span></p>
<p>You might notice a &#8220;Coding Credibility&#8221; section on my sidebar.  I&#8217;ve got Stack Overflow widgets, Ohloh widgets, Smarterer stats &#8230; but today, I polished off a <em>new</em> addition to that area &#8211; the WP Core Contributions Widget.</p>
<p>I saw a nifty list of contributed core patches on <a href="http://www.helenhousandi.com/wordpress/" target="_blank">another developer&#8217;s site</a>.  I wanted to steal it and throw it up on mine, too!  But apparently she hand-coded the widget for the sidebar.  Effective, but I&#8217;m too lazy for that.  So instead, I sat down and whipped up a plugin to do it for me.</p>
<h2>WP Core Contributions Widget</h2>
<p>This plugin scrapes the WordPress Trac site for any mention of &#8220;<a href="https://core.trac.wordpress.org/search?q=props+ericmann&amp;noquickjump=1&amp;changeset=on" target="_blank">props ericmann</a>&#8221; (or &#8220;props bob&#8221; or &#8220;props coolcoder&#8221; &#8230; whatever your username might be).  It then strips the search results down and extracts a changeset ID, a Trac ticket ID, and a commit message.</p>
<p>The IDs and links to the appropriate changesets/tickets are then displayed in a list in the sidebar.</p>
<h3>Themable Widget</h3>
<p>On top of that, the template for the widget is theme-able!</p>
<p>I&#8217;m using a pattern I adopted from <a href="http://wordpress.mfields.org/" target="_blank">another fantastic WordPress developer</a>.  Basically, there&#8217;s a widget template file bundled with the plugin.  When the widget loads, it first checks to see if you&#8217;ve added <em>your own</em> template to your theme.  If you have, it loads that one.  If you haven&#8217;t, it loads the bundled one.</p>
<p>So if you want to use something other than an HTML unordered list (or if you want to add classes to better style the list), you can do that without hacking the plugin!  It&#8217;s a vast improvement on my previous work.</p>
<h3>Next Steps</h3>
<p>The plugin could still use a bit of work.  I literally wrote it in an hour or two, so there&#8217;s bound to be room for improvement.  Just off the top of my head:</p>
<ol>
<li>The plugin only scrapes the first page of search results.  So if you&#8217;ve written more than 10 patches, it will still only display the latest 10.</li>
<li>The plugin searches for &#8220;props {username,}&#8221; but if your username isn&#8217;t the first in a list of multiple contributors, you won&#8217;t show up.</li>
<li>I&#8217;ve created a .po file, but have yet to translate any of the plugin&#8217;s strings to other languages (seriously, there are 5 &#8230; should be easy).</li>
</ol>
<p>So is it perfect?  Not yet.  But it&#8217;s ready for a public beta test!</p>
<h3>Get The Plugin</h3>
<p>For now (until I&#8217;m ready for a 1.0 version that solves at least the first 2 of the above issues), the plugin <a href="https://github.com/ericmann/WP-Core-Contributions-Widget">will be located on GitHub</a>.</p>
<p>If you&#8217;re a developer, I&#8217;d love if you&#8217;d clone the repository and maybe take a stab at fixing one of the outstanding issues.  Send me a pull request and I&#8217;ll take a look at your work.</p>
<p>If you just want to use and test the plugin, <a href="https://github.com/ericmann/WP-Core-Contributions-Widget/tags">the latest version is bundled for download as a ZIP file</a>.  Just follow the standard manual installation instructions (also outlined in the readme) to get started.</p>
<p>And if you run in to any problems at all, leave me a note here or open an issue on GitHub.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/3sOzlgU6u7bBmLK0Qi9pWXAXCEw/0/da"><img src="http://feedads.g.doubleclick.net/~a/3sOzlgU6u7bBmLK0Qi9pWXAXCEw/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/3sOzlgU6u7bBmLK0Qi9pWXAXCEw/1/da"><img src="http://feedads.g.doubleclick.net/~a/3sOzlgU6u7bBmLK0Qi9pWXAXCEw/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/MindshareMarketing?a=ltTZdEhZKcU:nfixoRCoPn8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/MindshareMarketing?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MindshareMarketing?a=ltTZdEhZKcU:nfixoRCoPn8:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/MindshareMarketing?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MindshareMarketing?a=ltTZdEhZKcU:nfixoRCoPn8:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/MindshareMarketing?i=ltTZdEhZKcU:nfixoRCoPn8:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/MindshareMarketing/~4/ltTZdEhZKcU" height="1" width="1"/>]]></content:encoded><description>Every now and then, someone asks me whether or not I still have quality WordPress development skills.  I think it&amp;#8217;s a fair question.  After all, I spend the bulk of my time now working with closed-source ASP.Net projects and have little time for my favorite WordPress stuff. But really, much of what I do in&amp;#8230;&lt;br /&gt;&lt;span class="more-link-wrapper"&gt;&lt;a href="http://mindsharestrategy.com/2011/ive-still-got-it/" class="more-link"&gt;Read More&lt;/a&gt;&lt;/span&gt;</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://mindsharestrategy.com/2011/ive-still-got-it/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><feedburner:origLink>http://mindsharestrategy.com/2011/ive-still-got-it/</feedburner:origLink></item><item><title>WordPress Portland</title><link>http://feedproxy.google.com/~r/MindshareMarketing/~3/LSNQAEV-NqI/</link><category>Development</category><category>wordpress</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Eric</dc:creator><pubDate>Mon, 28 Nov 2011 18:56:44 PST</pubDate><guid isPermaLink="false">http://mindsharestrategy.com/?p=3910</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>As promised, here is the code for my demo of adding feature pointers to WordPress in version 3.3</p>
<p>And again, <em><strong>please do not use these in distributed plugins/themes</strong></em>. &nbsp;They&#8217;re only slated for Core at the moment, but if you feel that they&#8217;ll help in your custom theme/plugin development with clients, feel free!</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">&lt;?php</span><br />
<span style="color: #666666; font-style: italic;">/*<br />
Plugin Name: WordPress Portland Meetup Pointer Demo<br />
Plugin URI: <br />
Description: Demonstrate feature pointers in WP 3.3<br />
Author: Eric Mann<br />
Version: 1.0<br />
Author URI: http://eamann.com<br />
*/</span><br />
<br />
add_action<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'admin_enqueue_scripts'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'pdxwp_pointers_header'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000000; font-weight: bold;">function</span> pdxwp_pointers_header<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$enqueue</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #000088;">$dismissed</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/explode"><span style="color: #990000;">explode</span></a><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">','</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span>string<span style="color: #009900;">&#41;</span> get_user_meta<span style="color: #009900;">&#40;</span> get_current_user_id<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'dismissed_wp_pointers'</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span> <a href="http://www.php.net/in_array"><span style="color: #990000;">in_array</span></a><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'pdxwp_pointer'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$dismissed</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$enqueue</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; add_action<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'admin_print_footer_scripts'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'pdxwp_pointers_footer'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$enqueue</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// Enqueue pointers</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; wp_enqueue_script<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'wp-pointer'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; wp_enqueue_style<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'wp-pointer'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">function</span> pdxwp_pointers_footer<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$pointer_content</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'&lt;h3&gt;Welcome WordPress Portland!&lt;/h3&gt;'</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$pointer_content</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">'&lt;p&gt;This is an example of an admin pointer.&lt;/p&gt;'</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$pointer_content</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">'&lt;p&gt;You can use it in your &lt;a href=&quot;http://wordpress.org/extend/themes&quot;&gt;themes&lt;/a&gt; '</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$pointer_content</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">'and &lt;a href=&quot;http://wordpress.org/extend/plugins&quot;&gt;plugins&lt;/a&gt;.&lt;/p&gt;'</span><span style="color: #339933;">;</span><br />
<span style="color: #000000; font-weight: bold;">?&gt;</span><br />
&lt;script type=&quot;text/javascript&quot;&gt;<br />
//&lt;![CDATA[<br />
jQuery(document).ready(function($) {<br />
&nbsp; &nbsp; $('#menu-comments').pointer({<br />
&nbsp; &nbsp; &nbsp; &nbsp; content: '<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$pointer_content</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>',<br />
&nbsp; &nbsp; &nbsp; &nbsp; position: {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; edge: 'left',<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; align: 'center'<br />
&nbsp; &nbsp; &nbsp; &nbsp; },<br />
&nbsp; &nbsp; &nbsp; &nbsp; close: function() {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $.post( ajaxurl, {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pointer: 'pdxwp_pointer',<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; action: 'dismiss-wp-pointer'<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; });<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; }).pointer('open');<br />
});<br />
//]]&gt;<br />
&lt;/script&gt;<br />
<span style="color: #000000; font-weight: bold;">&lt;?php</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">?&gt;</span></div></div>

<p><a href="http://feedads.g.doubleclick.net/~a/MGGteRlLCe0KbUtNgJZL7HnJanQ/0/da"><img src="http://feedads.g.doubleclick.net/~a/MGGteRlLCe0KbUtNgJZL7HnJanQ/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/MGGteRlLCe0KbUtNgJZL7HnJanQ/1/da"><img src="http://feedads.g.doubleclick.net/~a/MGGteRlLCe0KbUtNgJZL7HnJanQ/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/MindshareMarketing?a=LSNQAEV-NqI:MLpQeNuiTGE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/MindshareMarketing?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MindshareMarketing?a=LSNQAEV-NqI:MLpQeNuiTGE:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/MindshareMarketing?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MindshareMarketing?a=LSNQAEV-NqI:MLpQeNuiTGE:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/MindshareMarketing?i=LSNQAEV-NqI:MLpQeNuiTGE:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/MindshareMarketing/~4/LSNQAEV-NqI" height="1" width="1"/>]]></content:encoded><description>As promised, here is the code for my demo of adding feature pointers to WordPress in version 3.3 And again, please do not use these in distributed plugins/themes. &amp;#160;They&amp;#8217;re only slated for Core at the moment, but if you feel that they&amp;#8217;ll help in your custom theme/plugin development with clients, feel free! &amp;#60;?php /* Plugin&amp;#8230;&lt;br /&gt;&lt;span class="more-link-wrapper"&gt;&lt;a href="http://mindsharestrategy.com/2011/wordpress-portland/" class="more-link"&gt;Read More&lt;/a&gt;&lt;/span&gt;</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://mindsharestrategy.com/2011/wordpress-portland/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><feedburner:origLink>http://mindsharestrategy.com/2011/wordpress-portland/</feedburner:origLink></item><item><title>Security Vulnerabilities</title><link>http://feedproxy.google.com/~r/MindshareMarketing/~3/apM_bnPh1tU/</link><category>Development</category><category>Focus</category><category>wordpress</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Eric</dc:creator><pubDate>Mon, 21 Nov 2011 20:51:00 PST</pubDate><guid isPermaLink="false">http://mindsharestrategy.com/?p=3893</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>Out of the blue today, a user of one of my plugins contacted me to ask why I was so slow in patching a security vulnerability in my system.</p>
<p>The question came as a complete surprise.</p>
<p>Apparently, back in January, someone discovered a potential security hole in one of my plugins, <a href="http://wordpress.org/extend/plugins/wp-publication-archive/" target="_blank">WP Publication Archive</a>.  The frightening thing about the report, though, was the fact that he never bothered to report the vulnerability to me so I could fix it.  Instead, an open report sat there on his site, and was then picked up by a few other security sites and syndicated across the Internet.</p>
<p>Had this user not contacted me, I would never had known about this issue.  And I can&#8217;t fix something if I don&#8217;t know it&#8217;s broken.</p>
<h2>The Hole</h2>
<p>WP Publication Archive uses a proxy file to load a remote file as an attachment so it can be downloaded by the browser.  Here&#8217;s the entire source of the &#8220;vulnerable&#8221; file:<span id="more-3893"></span></p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span> <a href="http://www.php.net/isset"><span style="color: #990000;">isset</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'file'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; <a href="http://www.php.net/die"><span style="color: #990000;">die</span></a><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #b1b100;">require_once</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'../lib/class.mimetype.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$mime</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> mimetype<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #000088;">$fPath</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'file'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$fType</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$mime</span><span style="color: #339933;">-&gt;</span><a href="http://www.php.net/gettype"><span style="color: #990000;">getType</span></a><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$fPath</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$fName</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/basename"><span style="color: #990000;">basename</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fPath</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #000088;">$origname</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/preg_replace"><span style="color: #990000;">preg_replace</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/_#_#\d*/'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">''</span><span style="color: #339933;">,</span><span style="color: #000088;">$fName</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #000088;">$fContent</span> <span style="color: #339933;">=</span> fetch_content<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$fPath</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
output_content<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$fContent</span><span style="color: #339933;">,</span> <span style="color: #000088;">$origname</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">function</span> fetch_content<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$url</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$ch</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/curl_init"><span style="color: #990000;">curl_init</span></a><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <a href="http://www.php.net/curl_setopt"><span style="color: #990000;">curl_setopt</span></a><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$ch</span><span style="color: #339933;">,</span> CURLOPT_URL<span style="color: #339933;">,</span> <span style="color: #000088;">$url</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <a href="http://www.php.net/curl_setopt"><span style="color: #990000;">curl_setopt</span></a><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$ch</span><span style="color: #339933;">,</span> CURLOPT_HEADER<span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <a href="http://www.php.net/ob_start"><span style="color: #990000;">ob_start</span></a><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <a href="http://www.php.net/curl_exec"><span style="color: #990000;">curl_exec</span></a><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$ch</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <a href="http://www.php.net/curl_close"><span style="color: #990000;">curl_close</span></a><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$ch</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #000088;">$fContent</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/ob_get_contents"><span style="color: #990000;">ob_get_contents</span></a><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <a href="http://www.php.net/ob_end_clean"><span style="color: #990000;">ob_end_clean</span></a><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #b1b100;">return</span> <span style="color: #000088;">$fContent</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">function</span> output_content<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$content</span><span style="color: #339933;">,</span> <span style="color: #000088;">$name</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <a href="http://www.php.net/header"><span style="color: #990000;">header</span></a><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;Expires: Wed, 9 Nov 1983 05:00:00 GMT&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <a href="http://www.php.net/header"><span style="color: #990000;">header</span></a><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;Last-Modified: &quot;</span> <span style="color: #339933;">.</span> <a href="http://www.php.net/gmdate"><span style="color: #990000;">gmdate</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;D, d M Y H:i:s&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot; GMT&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <a href="http://www.php.net/header"><span style="color: #990000;">header</span></a><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;Content-Disposition: attachment; filename=&quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$name</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <a href="http://www.php.net/header"><span style="color: #990000;">header</span></a><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;Content-type: application/octet-stream&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <a href="http://www.php.net/header"><span style="color: #990000;">header</span></a><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;Content-Transfer-Encoding: binary&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$content</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p>In reality, there isn&#8217;t a security hole here.  It was reported that this file would <em>include</em> a remote file, thus opening your site up to the possibility of remotely executing malicious code (along the same vein as the TimThumb exploit from several weeks ago).</p>
<p>But this is not the case.</p>
<p>Nothing is included from the remote file, it only <em>downloads</em> the file from within the browser.  So the worst you could do is intentionally download a malicious file as an attachment.  But it also does open your site up to being used as a remote proxy for files you don&#8217;t want passed through your server.</p>
<p>So needless to say, it <em>did</em> need to be patched.</p>
<p>So I took some time tonight to sit down, fix a couple of other bugs, and add some code to quickly plug that hole.  It&#8217;s not a permanent fix, but does prevent the immediately apparent proxy exploits.  A more elegant patch is already in the works.</p>
<h2>Why I&#8217;m Upset</h2>
<p>But the issue here isn&#8217;t really the seemingly insecure code, or even that I had to spend extra time fixing the code.  It&#8217;s that a vulnerability was detected and, rather than being reported to me, was <a href="http://www.autosectools.com/Advisories/WordPress.WP.Publication.Archive.2.0.1_Local.File.Inclusion_91.html" target="_blank">posted in a public forum</a>.</p>
<p>For those of you who know, the standard process for reporting <em>any</em> potential vulnerability or exploit is to contact the original author and give them a reasonable amount of time to create a patch before disclosing a 0-day hack to the rest of the world.  Developers need a chance to take action to protect their users&#8217;sites.  It&#8217;s common courtesy in just about every developer community in existence.</p>
<p>So I contacted every site that posted information about this security hole, expressed my frustration that they posted it without contacting me, and asked what could be done in the future to prevent this kind of communication breakdown.</p>
<p><a href="http://www.wpsecure.net/2011/01/wp-publication-archive-plugin-file-inclusion/" target="_blank">One of the reporters</a>, who is also a respected member of the WordPress community, got in touch with me immediately.  He was only recycling a notice he&#8217;d seen on another site and didn&#8217;t realize that I hadn&#8217;t been contacted by the original author.</p>
<p>The original reporter, however, was somewhat less useful:</p>
<blockquote><p>[O]ur policy is immediate, full disclosure. We also release a variety of tools to aid in the security testing process. It must be stressed that the burden of writing secure code is that of the developers. We encourage you to learn more about secure programming practices.</p></blockquote>
<p>Am I responsible for writing secure code?  Absolutely.  And I test all of my code to the best of my ability before I release anything.  But just like every other developer on the market, I make the occasional mistake.</p>
<p>Nobody&#8217;s perfect.</p>
<p>Had I been notified about this bug and given time to fix it, I would have.  And in doing so, I would have helped make several sites somewhat more secure.</p>
<h2>The Real Issue</h2>
<p>The real problem here isn&#8217;t the security vulnerability, or even how it was reported.  It&#8217;s how the community as a whole functions.</p>
<p>A few years ago, I discovered a nifty WordPress plugin on Google Code that let you create a file/document archive on your site.  I loved it!  I used it on my sites, on client sites, and talked it up at WordCamp.</p>
<p>Then, in 2007, the original author abandoned the project.</p>
<p>The next version of WordPress introduced changes that broke the plugin.  So I took the time to re-write it, clean up the code, and eventually update it to use Custom Post Types.  I placed my fork of the plugin in the official plugin repository and all was good.</p>
<p>This is how the community <em>is supposed</em> to function.  Developers help one another out.  If one guy can&#8217;t keep going on a project, someone else can step in and take over.  That&#8217;s the beauty of open source.</p>
<p>The problem with the security vulnerability wasn&#8217;t actually with my version of the plugin, but was reported against the pre-fork version hosted on Google Code.  I&#8217;ve been able to verify that the current release doesn&#8217;t suffer from the same issues, and have proactively patched the one issue that might crop up as a result of this report.</p>
<p>Unfortunately, the original reporter didn&#8217;t contact me about the issue, so I couldn&#8217;t clear things up.</p>
<p>And subsequent reporters actually linked the report back to my post-fork version of the plugin, essentially linking the new, secure versions to the old, insecure one.</p>
<p>On the one hand, we have developers going out of their way to help one another.  On the other hand, we have developers sitting on their laurels and mis-reporting information that ends up hurting one another.</p>
<p>The real problem here is one of a massive communication breakdown.</p>
<hr />
<h3>Update</h3>
<p>One of the first re-posters of the security notice has clarified things on his site to explain that the vulnerability is actually present in the old, abandoned pre-fork version of the plugin.</p>
<p>The original poster has re-scanned the updated version and verified that no vulnerabilities were detected in the current release.  His notice remains on the site, though, as it <em>is</em> accurate for the pre-fork version that triggered it in the first place.  However, anyone can contact him directly to verify that the current version is tested to be secure.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/izVcN5XNA8m8Yb6uOL1yodkQMwk/0/da"><img src="http://feedads.g.doubleclick.net/~a/izVcN5XNA8m8Yb6uOL1yodkQMwk/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/izVcN5XNA8m8Yb6uOL1yodkQMwk/1/da"><img src="http://feedads.g.doubleclick.net/~a/izVcN5XNA8m8Yb6uOL1yodkQMwk/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/MindshareMarketing?a=apM_bnPh1tU:AYzXdw93Jms:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/MindshareMarketing?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MindshareMarketing?a=apM_bnPh1tU:AYzXdw93Jms:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/MindshareMarketing?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MindshareMarketing?a=apM_bnPh1tU:AYzXdw93Jms:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/MindshareMarketing?i=apM_bnPh1tU:AYzXdw93Jms:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/MindshareMarketing/~4/apM_bnPh1tU" height="1" width="1"/>]]></content:encoded><description>Out of the blue today, a user of one of my plugins contacted me to ask why I was so slow in patching a security vulnerability in my system. The question came as a complete surprise. Apparently, back in January, someone discovered a potential security hole in one of my plugins, WP Publication Archive.  The&amp;#8230;&lt;br /&gt;&lt;span class="more-link-wrapper"&gt;&lt;a href="http://mindsharestrategy.com/2011/security-vulnerabilities/" class="more-link"&gt;Read More&lt;/a&gt;&lt;/span&gt;</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://mindsharestrategy.com/2011/security-vulnerabilities/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">1</slash:comments><feedburner:origLink>http://mindsharestrategy.com/2011/security-vulnerabilities/</feedburner:origLink></item><item><title>Keeping it Realtime – Day 2</title><link>http://feedproxy.google.com/~r/MindshareMarketing/~3/maehqsEGPMY/</link><category>Development</category><category>Focus</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Eric</dc:creator><pubDate>Tue, 08 Nov 2011 08:16:32 PST</pubDate><guid isPermaLink="false">http://mindsharestrategy.com/?p=3777</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>I will once again be liveblogging the <a href="http://krtconf.com" target="_blank">Keeping it Realtime</a> conference in Portland, Oregon.  If you want to catch up with <a title="Keeping it Realtime" href="http://mindsharestrategy.com/2011/keeping-it-realtime/">yesterday&#8217;s stream</a>, feel free.  Otherwise, stay tuned for more today!</p>
<p>You can also <a href="#comments">leave comments</a> at the bottom of the feed &#8230; <span id="more-3777"></span></p>
<p>&#8212;</p>
<div id="liveblog-entry-3880"><strong>4:56 pm</strong>Next on the schedule is Jack Moffitt on “Imagining the Future of Realtime” at 5:20 …</p>
<div></div>
</div>
<div id="liveblog-entry-3878"><strong>4:55 pm</strong>Is it true?  Do we really have a 25-minute break before the next session?  Time to stretch!</p>
<div></div>
</div>
<div id="liveblog-entry-3877"><strong>4:53 pm</strong>The various frameworks are being built out of very different use cases.  So “real time” is more a family of ideas than it is a singular concept.</p>
<div></div>
</div>
<div id="liveblog-entry-3876"><strong>4:52 pm</strong>Are there any efforts at collaboration between the various frameworks?  Collaboration would help create standardization, but I agree that it might be a mistake.  Don’t start standardizing while you’re still experimenting with new approaches.  Get it all on the table first.</p>
<div></div>
</div>
<div id="liveblog-entry-3875"><strong>4:49 pm</strong>Node inspector lets you step through code running on the server inside a browser using Chrome’s JS debugger.  Awesome tool.</p>
<div></div>
</div>
<div id="liveblog-entry-3874"><strong>4:48 pm</strong>What are you using for debugging? “I’m using Visual Studio” … “I’m using console.log()” … yeah, I can vouch for VS being a far easier way to debug than printing to the log …</p>
<div></div>
</div>
<div id="liveblog-entry-3873"><strong>4:46 pm</strong>Having a context and a stack trace is nice, I agree, but some times they don’t make much sense, either.  I have yet to see a stack trace for a multi-process/asynchronous system that makes sense …</p>
<div></div>
</div>
<div id="liveblog-entry-3872"><strong>4:43 pm</strong>SignalR is all about making “this kind” of programming available to a .Net stack.  It’s too important to not have anything.  I agree 100% and hope to see some <em>options</em> come out in the future.  I like the idea of SignalR so far, but I’d like to see other approaches at addressing the same problem, too.</p>
<div></div>
</div>
<div id="liveblog-entry-3871"><strong>4:42 pm</strong>More realtime frameworks should interface in a polyglot kind of way.  And should add distributed/realtime debugging.</p>
<div></div>
</div>
<div id="liveblog-entry-3870"><strong>4:39 pm</strong>What is the biggest problem that your framework does <em>not</em> solve?  This is a very good question when people like me are trying to choose a framework to start with.</p>
<div></div>
</div>
<div id="liveblog-entry-3869"><strong>4:38 pm</strong>What technologies inspired your frameworks? Ruby programming … Jarvis from Iron Man …</p>
<div></div>
</div>
<div id="liveblog-entry-3868"><strong>4:36 pm</strong>Using middleware to cancel DDoS attacks … like someone running an RPC command from the browser console a million times …</p>
<div></div>
</div>
<div id="liveblog-entry-3867"><strong>4:33 pm</strong>What is your framework’s security model?  ”None.”  That’s been the question no one’s asked yet this conference.  I know everyone’s focused on building the API right now, but “security’s not a big deal” is<strong><em>not</em></strong> a good answer.  Security should be one of the first concerns, not an after-the-fact addition.</p>
<div></div>
</div>
<div id="liveblog-entry-3866"><strong>4:29 pm</strong>We <em>should</em> be benchmarking the user experience.  That’s all that matters.  +1</p>
<div></div>
</div>
<div id="liveblog-entry-3865"><strong>4:27 pm</strong>One thing that unites all of the guys using this realtime “stuff” right now is the use of Redis.  That’s true based on what I’ve seen so far … and I’ll be learning Redis over the next few days and weeks to make sure I’m ready for it!</p>
<div></div>
</div>
<div id="liveblog-entry-3864"><strong>4:26 pm</strong>A lot of the realtime standards/frameworks are still in their infancy.  This tells me far more about the industry as a whole than most of the other conversations.  Really, if you use any one of these frameworks you’ll need to be somewhat risk tolerant, because the API and standard will probably change tomorrow.  So use it, but be ready and willing to change and evolve your code and implementation as the system grows and matures.</p>
<div></div>
</div>
<div id="liveblog-entry-3863"><strong>4:24 pm</strong>We might see more of an <em>organic</em> standards practice with regards to realtime.  This is similar to the way jQuery’s DOM selector pattern has influenced the modern web …</p>
<div></div>
</div>
<div id="liveblog-entry-3862"><strong>4:22 pm</strong>Should there be a standard way of “doing realtime?”  I can’t speak for the panelists, but I don’t think there should be.  The potential use cases are still being developed, so creating and sticking to a standard now would be a bit limiting.</p>
<div></div>
</div>
<div id="liveblog-entry-3861"><strong>4:17 pm</strong>Out of all of them, I’m the most excited about SignalR … if you haven’t heard of it, it’s freaking awesome!</p>
<div></div>
</div>
<div id="liveblog-entry-3860"><strong>4:17 pm</strong>We’re discussing: SocketStream, Flowtype/NowJS, SignalR, dNode, hook.io, and Derby/Racer.</p>
<div></div>
</div>
<div id="liveblog-entry-3859"><strong>4:15 pm</strong>I once again have Internet access … but it may or may not last.  In any case, we’re now starting the panel comparing various realtime frameworks.</p>
<div></div>
</div>
<div id="liveblog-entry-3857"><strong>1:47 pm</strong>Watching so many command line demos has me really wanting a Mac or a Linux box … I’m installing Cygwin for now …</p>
<div></div>
</div>
<div id="liveblog-entry-3856"><strong>1:39 pm</strong>Message queues can be implemented in MongoDB, but you have to poll … so it’s not a good solution.  Redis has Pub/Sub, PostgreSQL has listen/notify.  RabbitMQ and ZeroMQ are MQ’s … right?</p>
<div></div>
</div>
<div id="liveblog-entry-3855"><strong>1:33 pm</strong>Making scalability more fun, less painful …</p>
<div></div>
</div>
<div id="liveblog-entry-3854"><strong>1:32 pm</strong>Next we get a “turbocharged toolkit for realtime in the Cloud” … yay for practical takeaways!</p>
<div></div>
</div>
<div id="liveblog-entry-3853"><strong>1:30 pm</strong>Sorry, I missed the last half of that chat.  My office website crashed and I’ve spent the last few minutes debugging in terminal server …</p>
<div></div>
</div>
<div id="liveblog-entry-3852"><strong>1:07 pm</strong>The browser doesn’t care which Node instance is handling things on the back end.  It gets all of its data through one pipe.  So don’t use one Node instance to handle two different data sources – like a chat feed and a Twitter feed.</p>
<div></div>
</div>
<div id="liveblog-entry-3851"><strong>1:05 pm</strong>Does anyone here think that JavaScript is <em>not</em> fun?  Yeah … rhetorical question, but really … not fair to single out someone who dislikes your favorite system just because you have a microphone.</p>
<div></div>
</div>
<div id="liveblog-entry-3850"><strong>1:04 pm</strong>You can exploit Node as a message service on the back end with a bunch of different workers.</p>
<div></div>
</div>
<div id="liveblog-entry-3849"><strong>12:59 pm</strong>Don’t re-invent the wheel.  Leverage the frameworks and systems that have already been built.</p>
<div></div>
</div>
<div id="liveblog-entry-3848"><strong>12:53 pm</strong>You can’t just push TCP traffic out to the Internet, you need a gateway to transport it.  This is where Node and similar systems come in – they act as the gateway.</p>
<div></div>
</div>
<div id="liveblog-entry-3847"><strong>12:49 pm</strong>HTTP is wasteful.  Large headers for overhead, high latency with polling and new connections.  These aren’t issues with websockets.</p>
<div></div>
</div>
<div id="liveblog-entry-3846"><strong>12:46 pm</strong>We’re all in agreement, websockets are the way to go!  The original system was designed for document pages … i.e. Mosaic.</p>
<div></div>
</div>
<div id="liveblog-entry-3845"><strong>12:45 pm</strong>Next presentation by Axel Kratel.</p>
<div></div>
</div>
<div id="liveblog-entry-3843"><strong>11:53 am</strong>Time for lunch! Let’s hope it’s a tastier fare than the carb-fest that was our breakfast … bread + french toast + oatmeal + cold cereal … we need some protein!</p>
<div></div>
</div>
<div id="liveblog-entry-3842"><strong>11:50 am</strong>Why sticky sessions over pluggable persistence?  Because it’s meant to work with different development frameworks and languages.  You might do one thing if you’re using Redis and Node, you might do something else with a different system.  Specific decisions have been made in order to keep SockJS “polyglot.”</p>
<div></div>
</div>
<div id="liveblog-entry-3841"><strong>11:46 am</strong>Some of the complexity in this system is rooted in the fact that the browser is untrusted.  That’s an issue that comes up time and time again … and I have yet to see a reliable solution that doesn’t include just forcing more of the processing to the server side.</p>
<div></div>
</div>
<div id="liveblog-entry-3840"><strong>11:41 am</strong>Google App Engine, PubNub, and Pusher are all trying to do the same thing … providing a messaging API that’s simple to use.  But they’re all very complex under the hood.</p>
<div></div>
</div>
<div id="liveblog-entry-3839"><strong>11:39 am</strong>SockJS is <em>only</em> a transport layer.  If you want higher-level message abstractions, you should build them yourself.</p>
<div></div>
</div>
<div id="liveblog-entry-3838"><strong>11:37 am</strong>If your server can handle sockets, but doesn’t have a SockJS library for it, you can deploy SockJS as a proxy … that’s interesting, but I don’t see the need.  Sounds like adding complexity for complexity’s sake …</p>
<div></div>
</div>
<div id="liveblog-entry-3837"><strong>11:34 am</strong>SockJS requires an asynchronous stack to work properly.  This makes perfect sense and speaks to a lot of the problems I had implementing websockets with Apache a few months ago.</p>
<div></div>
</div>
<div id="liveblog-entry-3836"><strong>11:33 am</strong>Most importantly, there is no Flash fallback … just native JavaScript.  <em>This</em> is the best part of SockJS, in my opinion.</p>
<div></div>
</div>
<div id="liveblog-entry-3835"><strong>11:32 am</strong>SockJS gives you abstractions that <em>look</em> like websockets but can use different underlying transports if needed.  It makes it easy to begin using websockets without needing to worry about the different implementations of the spec.</p>
<div></div>
</div>
<div id="liveblog-entry-3834"><strong>11:30 am</strong>Chrome treats websockets as a binary thing and tries to push a lot of data through.  Firefox treats them like HTTP because they look like HTTP.  This makes using proxies difficult.</p>
<div></div>
</div>
<div id="liveblog-entry-3833"><strong>11:28 am</strong>If you want to sum up SockJS in one sentence, you could call it a Socket.IO clone.  I guess that answers my question about the differences between the libraries …</p>
<div></div>
</div>
<div id="liveblog-entry-3832"><strong>11:27 am</strong>Ooh, he’s giving away t-shirts for audience participation.  You can never have enough dev-related t-shirts.</p>
<div></div>
</div>
<div id="liveblog-entry-3831"><strong>11:27 am</strong>“WebSocket emulation kept simple, stupid.”</p>
<div></div>
</div>
<div id="liveblog-entry-3830"><strong>11:25 am</strong>Next up is Marek Majkowski talking about SockJS.  Hopefully this will explain how SockJS is different than Socket.IO (aside from some obvious differences in implementation that we discussed over breakfast).</p>
<div></div>
</div>
<div id="liveblog-entry-3829"><strong>11:25 am</strong>Why didn’t they use websockets for the messages?  Because they needed to support multiple browsers and devices that don’t support websockets.  So instead they used a standard HTTP POST to send the data and long polling to update the vote tallies.</p>
<div></div>
</div>
<div id="liveblog-entry-3828"><strong>11:21 am</strong>And that’s the third person who’s alleged that this is a Node-centered conference.  Maybe we just need more asynchronous, event-driven, open-source servers …</p>
<div></div>
</div>
<div id="liveblog-entry-3827"><strong>11:20 am</strong>Is the underlying technology Node.JS since this is the Node.JS conference?  No … they’re using C.</p>
<div></div>
</div>
<div id="liveblog-entry-3826"><strong>11:17 am</strong>How does data replication occur for multiple servers? As long as they’re all connected, they’ll all receive the message.  They’re basically all talking to one another all the time and sharing updates.</p>
<div></div>
</div>
<div id="liveblog-entry-3825"><strong>11:13 am</strong>10-15 languages and 10-15 frameworks … definitely a rich system.</p>
<div></div>
</div>
<div id="liveblog-entry-3824"><strong>11:12 am</strong>Spike allowed people to vote once every 5 seconds.  So apparently there is a bit of state information transferred in that massively distributed system.  They managed to handle 10s of thousands of concurrent users, too!</p>
<div></div>
</div>
<div id="liveblog-entry-3823"><strong>11:09 am</strong>Drumo is a realtime app on the web that’s similar to Quora.</p>
<div></div>
</div>
<div id="liveblog-entry-3822"><strong>11:07 am</strong>PubNub is “one step closer to the Singularity …”  This is an idea that came up yesterday and, oddly enough, the exact topic of the story I’m writing for <a href="http://nanowrimo.org/en/participants/eamann" target="_blank">NaNoWriMo</a>.</p>
<div></div>
</div>
<div id="liveblog-entry-3821"><strong>11:05 am</strong>Doing this kind of project required a new type of architecture.  You can’t just take an existing LAMP stack application and add some realtime functionality to it.</p>
<div></div>
</div>
<div id="liveblog-entry-3820"><strong>11:02 am</strong>Once again, Redis comes up as an efficient, quick data store … I will be adding Redis to my stack within the next few weeks …</p>
<div></div>
</div>
<div id="liveblog-entry-3819"><strong>11:01 am</strong>Votes came out at a rate of 350 votes/second and updated aggregate totals across all devices at a rate of 10 times/second.</p>
<div></div>
</div>
<div id="liveblog-entry-3818"><strong>11:01 am</strong>After 80k votes, there was only a 100-vote difference between zombies and vampires.  I’m less impressed with that stat as I am with the fact that they collected all of those votes in real time in less than a 5 minute period …</p>
<div></div>
</div>
<div id="liveblog-entry-3817"><strong>10:59 am</strong>Ten times per second every device connected to the site updated the voting results.  Everyone saw realtime data <em>in real time</em>.  Awesome!</p>
<div></div>
</div>
<div id="liveblog-entry-3816"><strong>10:58 am</strong>(The Internet is a bit spotty today, so if I lose you, I apologize in advance.)</p>
<div></div>
</div>
<div id="liveblog-entry-3815"><strong>10:57 am</strong>Real-time voting with SpikeTV using The Deadliest Warrier as an example.  I <em>love</em> that show!</p>
<div></div>
</div>
<div id="liveblog-entry-3814"><strong>10:28 am</strong>Had to step out for a minute, what’d I miss?</p>
<div></div>
</div>
<div id="liveblog-entry-3813"><strong>10:22 am</strong>OK, that was cool.  Sending a message from ZeroMQ on the server side with python over a socket to NullMQ in the browser.  Great to have the demo pay off.</p>
<div></div>
</div>
<div id="liveblog-entry-3812"><strong>10:21 am</strong>One of the slower live code demonstration sessions of the conference … the ones using prepared code seemed to go a bit smoother.</p>
<div></div>
</div>
<div id="liveblog-entry-3811"><strong>10:16 am</strong>Creating a request socket in one browser session and a listener in the other.  Nifty.</p>
<div></div>
</div>
<div id="liveblog-entry-3810"><strong>10:15 am</strong>Another real-time demo of realtime.  Awesome!</p>
<div></div>
</div>
<div id="liveblog-entry-3809"><strong>10:14 am</strong>Hmm … apparently our table just lost power.  Could be a bad sign …</p>
<div></div>
</div>
<div id="liveblog-entry-3808"><strong>10:11 am</strong>STOMP is a simple protocol for PubSub connections. It looks a lot like HTTP, there are verbs, a header, and a body.  It’s simple and human-readable.</p>
<div></div>
</div>
<div id="liveblog-entry-3807"><strong>10:09 am</strong>NullMQ is meant to be an implementation of ZeroMQ for the browser.  It’s designed to extend features and the ZeroMQ API to the client-server nature of the web.</p>
<div></div>
</div>
<div id="liveblog-entry-3806"><strong>10:08 am</strong>ZeroMQ isn’t in the browser … so there are some limitations to what you can do.  You’d have to write a plugin/extension to get it into the browser.</p>
<div></div>
</div>
<div id="liveblog-entry-3805"><strong>10:07 am</strong>I think I could integrate a Twilio-style realtime phone call support feature into my company’s client portal … add another idea to the never-ending to-do list I’ve created this week …</p>
<div></div>
</div>
<div id="liveblog-entry-3804"><strong>10:05 am</strong>Twilio has a product for making and receiving calls through the Internet using JavaScript.  Now that’s just cool!</p>
<div></div>
</div>
<div id="liveblog-entry-3803"><strong>10:04 am</strong>The Paranoid Pirate Pattern?  Interesting development nomenclature …</p>
<div></div>
</div>
<div id="liveblog-entry-3802"><strong>9:59 am</strong>ZeroMQ isn’t a server or a protocol, it’s a library that presents a socket-like messaging API over a variety of transports.</p>
<div></div>
</div>
<div id="liveblog-entry-3801"><strong>9:58 am</strong>The context for this involves <a href="http://www.zeromq.org/" target="_blank">ZeroMQ</a>, which is a transport layer I’ve never really heard of.  But from the docs, it acts as a concurrency framework.  Maybe this answers one of my earlier questions …</p>
<div></div>
</div>
<div id="liveblog-entry-3800"><strong>9:56 am</strong>NullMQ is so new, it started 3 weeks ago.  I love new tech!</p>
<div></div>
</div>
<div id="liveblog-entry-3799"><strong>9:55 am</strong>And now Jeff Lindsay will talk about NullMQ.</p>
<div></div>
</div>
<div id="liveblog-entry-3798"><strong>9:53 am</strong>Node is at version 0.6 but is getting pretty stable.  If you want to build a business on it, you might want to wait for 1.0.</p>
<div></div>
</div>
<div id="liveblog-entry-3797"><strong>9:47 am</strong>A one-line HTTP server in Node can proxy a request.  Awesome.  I need to start using Node.  Looking forward to the Node/IIS discussion later today!</p>
<div></div>
</div>
<div id="liveblog-entry-3796"><strong>9:45 am</strong>“clientRespsonse” … someone didn’t proofread their slides.  This is why I don’t use code in my presentations …</p>
<div></div>
</div>
<div id="liveblog-entry-3794"><strong>9:40 am</strong>I’ve never heard anyone pronounce “url” as a word before.  We all usually just spell it out.  Took me a second to figure out what he was talking about.</p>
<div></div>
</div>
<div id="liveblog-entry-3792"><strong>9:36 am</strong>“We need to steal the right ideas, not the popular ideas.”</p>
<div></div>
</div>
<div id="liveblog-entry-3791"><strong>9:33 am</strong>If anyone in the world who wants to edit a specific Yammer page goes to the same Node process, it<em>does</em> make the application code easier.  But that kind of centralized computing comes with its own problems.  There’s a reason AWS and Google’s cloud are so popular …</p>
<div></div>
</div>
<div id="liveblog-entry-3790"><strong>9:31 am</strong>One of the reasons dNode is great is because you don’t have to send all of your state arguments with the RPC request, you just leave them in the closure.</p>
<div></div>
</div>
<div id="liveblog-entry-3789"><strong>9:29 am</strong>PHP, Python, and Ruby all suck at concurrency.  So this makes me wonder if there’s a language/framework that excels at it …</p>
<div></div>
</div>
<div id="liveblog-entry-3788"><strong>9:28 am</strong>“Node.JS is starting to dominate this space.”  That’s seemed very obvious from this conference.  One of the guys I talked to today even suggested changing the conference to ‘Keeping Node Realtime’ based on the number of speakers referencing the project …</p>
<div></div>
</div>
<div id="liveblog-entry-3787"><strong>9:25 am</strong>“You might want to talk to Facebook if you want to talk to somebody’s mom …”</p>
<div></div>
</div>
<div id="liveblog-entry-3786"><strong>9:23 am</strong>Another Rails presentation … I <em>really</em> need to learn Ruby …</p>
<div></div>
</div>
<div id="liveblog-entry-3785"><strong>9:22 am</strong>“The consumer is never the content creator.”  At least not until Web 2.0 changed the way the web worked …</p>
<div></div>
</div>
<div id="liveblog-entry-3784"><strong>9:22 am</strong>So far I’m seeing a lot of logical progressions in how the server side of things changed – static pages to static pages served by Apache to database parsed by PHP and served by Apache.  But we never really changed the <em>browser</em> and are still stuck in the stone age when it comes to consuming the information stored in the DB.</p>
<div></div>
</div>
<div id="liveblog-entry-3783"><strong>9:20 am</strong>The problem in the old days was getting really old browsers to use these static web pages … and in many circles, that’s still the problem.</p>
<div></div>
</div>
<div id="liveblog-entry-3782"><strong>9:16 am</strong>Getting started with the introduction talk by Mikeal Rogers.</p>
<div></div>
</div>
<div id="liveblog-entry-3781"><strong>8:41 am</strong>Everyone here seems to use Rails for just about everything.  Methinks it’s time to learn Ruby …</p>
<div></div>
</div>
<div id="liveblog-entry-3780"><strong>8:21 am</strong>Good morning from the breakfast table!</div>

<p><a href="http://feedads.g.doubleclick.net/~a/Zhst_7_cB94Dfq82txRIU3XWHVY/0/da"><img src="http://feedads.g.doubleclick.net/~a/Zhst_7_cB94Dfq82txRIU3XWHVY/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/Zhst_7_cB94Dfq82txRIU3XWHVY/1/da"><img src="http://feedads.g.doubleclick.net/~a/Zhst_7_cB94Dfq82txRIU3XWHVY/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/MindshareMarketing?a=maehqsEGPMY:FdotzB1J1j8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/MindshareMarketing?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MindshareMarketing?a=maehqsEGPMY:FdotzB1J1j8:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/MindshareMarketing?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MindshareMarketing?a=maehqsEGPMY:FdotzB1J1j8:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/MindshareMarketing?i=maehqsEGPMY:FdotzB1J1j8:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/MindshareMarketing/~4/maehqsEGPMY" height="1" width="1"/>]]></content:encoded><description>I will once again be liveblogging the Keeping it Realtime conference in Portland, Oregon.  If you want to catch up with yesterday&amp;#8217;s stream, feel free.  Otherwise, stay tuned for more today! You can also leave comments at the bottom of the feed &amp;#8230; &amp;#8212; 4:56 pmNext on the schedule is Jack Moffitt on “Imagining the&amp;#8230;&lt;br /&gt;&lt;span class="more-link-wrapper"&gt;&lt;a href="http://mindsharestrategy.com/2011/keeping-it-realtime-day-2/" class="more-link"&gt;Read More&lt;/a&gt;&lt;/span&gt;</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://mindsharestrategy.com/2011/keeping-it-realtime-day-2/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">4</slash:comments><feedburner:origLink>http://mindsharestrategy.com/2011/keeping-it-realtime-day-2/</feedburner:origLink></item></channel></rss>

