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

<channel>
	<title>destructuring.net</title>
	<atom:link href="http://www.destructuring.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.destructuring.net</link>
	<description>technology, advertising, and other meaningless pursuits</description>
	<lastBuildDate>Wed, 16 May 2012 15:32:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Chocolate Chip Cookies Perfected</title>
		<link>http://www.destructuring.net/2012/05/16/chocolate-chip-cookies-perfected/</link>
		<comments>http://www.destructuring.net/2012/05/16/chocolate-chip-cookies-perfected/#comments</comments>
		<pubDate>Wed, 16 May 2012 15:27:43 +0000</pubDate>
		<dc:creator>Jonathan</dc:creator>
				<category><![CDATA[Recipes]]></category>

		<guid isPermaLink="false">http://www.destructuring.net/?p=514</guid>
		<description><![CDATA[Perfected Chocolate Chip Cookies Note: this is based on the recipe &#8220;best ever chocolate chip cookies&#8221; &#8211; http://www.dishingthedivine.com/2011/12/06/best-ever-chocolate-chip-cookies/ I found that (amazing) cookie to be too light &#38; rich, and i wanted to devise something heartier &#8212; so I&#8217;d be [...]]]></description>
			<content:encoded><![CDATA[<div class="AWD_like_button "><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.destructuring.net%2F2012%2F05%2F16%2Fchocolate-chip-cookies-perfected%2F&amp;send=false&amp;layout=standard&amp;width=&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=arial&amp;height=40" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:px; height:40px;" allowTransparency="true"></iframe></div><p>Perfected Chocolate Chip Cookies</p>

<p>Note: this is based on the recipe &#8220;best ever chocolate chip cookies&#8221; &#8211; http://www.dishingthedivine.com/2011/12/06/best-ever-chocolate-chip-cookies/</p>

<p>I found that (amazing) cookie to be too light &amp; rich, and i wanted to devise something heartier &#8212; so I&#8217;d be satisfied sooner.</p>

<p>Adding in some whole wheat flour and olive oil gave it a nuttier and deeper taste. Pecans made it just perfect.</p>

<h2>Dry</h2>

<ul>
<li>1 1/3 cups all purpose flour</li>
<li>2/3 cup whole wheat flour</li>
<li>1/2 tsp baking soda</li>
<li>3/4 tsp salt</li>
</ul>

<h2>Wet</h2>

<ul>
<li>3/8 cup ( 3/4 stick) unsalted butter, melted</li>
<li>1/3 cup olive oil</li>
<li>1 cup packed dark brown sugar</li>
<li>1/2 cup white sugar</li>
<li>2 tsp vanilla extract</li>
<li>1 egg</li>
<li>1 egg yolk</li>
</ul>

<h2>MixIn</h2>

<ul>
<li>6oz dark chocolate, cut into chunks (+ the shavings). [ i've used the following: 1/3 of the "Pound Plus 70% dark chocolate" bar from trader joes, or about 6oz of a block of ghirardelli dark chocolate ]</li>
<li>1/2 cup Pecans, smashed or roughly chopped</li>
</ul>

<h2>Yield</h2>

<ul>
<li>12-16 Large Cookies</li>
</ul>

<h2>Instructions</h2>

<ol>
<li>Mix the flours , salt , baking soda.  Set aside.</li>
<li>Mix the sugars and butter just until thoroughly mixed. Add the egg, yolk and vanilla and stir until creamy, like a thin paste or caramel.  Combine with the dry ingredients ( either can be added to the other ); I find loosely folding the sifted ingredients with a spatula works well to get things fairly evenly distributed.  The dough should look dry in parts and wet in others at this point.</li>
<li>Add in the chocolate and pecans. Drop the spatula and get your hands in there &#8211; break the dough apart and fold it on top of itself a few times to ensure an even distribution.  The warmth of your hands and working of the dough will even out the dough very quickly. </li>
<li>The cookies need to be shaped and frozen for at least 30minutes. There are two good techniques I&#8217;ve used:

<ol>
<li>drop the dough onto wax paper in 1/4 cup scoops or rounds. </li>
<li>put all the dough onto a sheet of wax paper and roll it into a large log, cut into portions once frozen</li>
</ol></li>
<li>When you&#8217;re ready to bake, place the frozen dough on a baking sheet ( nonstick or parchment lined ), sprinkle with some salt, and bake the cookies for 8 minutes in a 400° oven, then drop the temp to 350° and bake for another 5-10 minutes &#8212; until the edges just start to turn golden brown.  </li>
</ol>

<p>Important Notes:</p>

<ol>
<li>Freezing the dough does two things: it helps develop flavors and it keeps the inside of the cookie from cooking too fast.  Properly cooked, the outside should be <em>just</em> turning brown and slightly crispy as it cools, while the inside is almost undercooked and a creamy custard.</li>
<li>This dough doesn&#8217;t really spread much &#8211; the shape and size of the dough that goes in the oven is roughly the same shape and size of what comes out.  A quarter cup baking measure is a very good mold for this cookie.  If you go the frozen log route, you&#8217;ll want to make sure that the diameter is roughly the same size as your 1/4 cup measures , and the rounds you cut are fairly thick &#8212; around 1&#8243;. </li>
<li>Starting the oven at 400° and dropping to 350° makes the perfect cookie.  If you&#8217;re busy, you can bake a slightly less perfect cookie by keeping the oven at 400° and baking for 12-13 minutes.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.destructuring.net/2012/05/16/chocolate-chip-cookies-perfected/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What a Product Manager Is and Isn&#8217;t, and Why You Should Probably Stop Trying to Hire One.</title>
		<link>http://www.destructuring.net/2012/03/31/what-a-product-manager-is-and-isnt-and-why-you-should-probably-stop-trying-to-hire-one/</link>
		<comments>http://www.destructuring.net/2012/03/31/what-a-product-manager-is-and-isnt-and-why-you-should-probably-stop-trying-to-hire-one/#comments</comments>
		<pubDate>Sat, 31 Mar 2012 19:45:06 +0000</pubDate>
		<dc:creator>Jonathan</dc:creator>
				<category><![CDATA[Work]]></category>

		<guid isPermaLink="false">http://www.destructuring.net/?p=508</guid>
		<description><![CDATA[I&#8217;ve had a lot of people contact me over the past two years trying to recruit me for a Product Manger role or looking for referrals to qualified candidates. I have a solid network and am well respected in Technology, [...]]]></description>
			<content:encoded><![CDATA[<div class="AWD_like_button "><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.destructuring.net%2F2012%2F03%2F31%2Fwhat-a-product-manager-is-and-isnt-and-why-you-should-probably-stop-trying-to-hire-one%2F&amp;send=false&amp;layout=standard&amp;width=&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=arial&amp;height=40" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:px; height:40px;" allowTransparency="true"></iframe></div><p>I&#8217;ve had a lot of people contact me over the past two years trying to recruit me for a Product Manger role or looking for referrals to qualified candidates.  I have a solid network and am well respected in Technology, Advertising and Publishing circles &#8212; so I&#8217;m used to constant pings by Executives I&#8217;ve consulted with or recruiters I&#8217;ve worked with and am happy to help when I can.</p>

<p>I feel compelled to write a post because out of several dozen inquiries for positions titled with some variation of &#8220;Product Manger&#8221;, only one was actually involved with product management.  The rest?  Sigh&hellip;</p>

<p>There&#8217;s been a huge conflation of terms with regard to &#8220;product management&#8221; in the past few years and it seems to be over-represented in NYC area.  This conflation really needs to stop.  Now.</p>

<p>The role of a Product Manager has a bit of variation in it&#8217;s definition, but it&#8217;s usually something around the lines of &#8220;the person who is ultimately responsible for a product&#8221;.  In a large organization, Product Managers are essentially divisional GMs or &#8216;micro-ceos&#8217;; in smaller ( and tech ) organizations, they tend to be inter-disciplinary people who might report to a &#8220;head of product&#8221; or directly to the CEO.</p>

<p>Generally speaking: Product Managers are highly skilled and highly experienced professionals, often with extensive background across one or more areas, who are tasked with fine-tuning what a &#8216;product&#8217; should be to best achieve business goals.</p>

<p>Most &#8220;Product Managers&#8221; I&#8217;ve known can be categorized like this:</p>

<ul>
<li>Most have 10+ years of professional experience, with very impressive track records; rarely do they have less than 5years experience; </li>
<li>They either have advanced degrees like an MBA, MS, PHD or work-based equivalent, i.e. a C/VP/D level employee who have done some stellar work; </li>
<li>All are experts / authorities in at least one discipline, and can somewhat function in whatever roles they oversee/interact with as they&#8217;ve had over a decade of experience working across them.</li>
</ul>

<p>To give some quick examples:</p>

<ol>
<li><p>I was recently at eConsultancy&#8217;s Digital Cream NYC event, in a room full of 150 people who were mostly Chief Marketing Officers / VPs of Marketing.  If I were a technology company in the advertising space or a publisher looking to sell innovative new ad solutions, I would look into recruiting a Product Manager from the attendee list. This is rather simple &#8211; the person who could best manage my advertising product, would be an expert in advertising.</p></li>
<li><p>Several publications that I know of built out Editorial Product departments staffed with former Senior Editors and Operational Editors.  What better way to deliver on editorial needs than by hiring a seasoned journalist?</p></li>
<li><p>A friend literally wrote the book on a certain technology, and is often called in to advise on different implementations of it &#8212; addressing the costs to scale/iterate, user behaviors, implementations, etc.</p></li>
<li><p>When Facebook buys a startup, their executives staff tend to become Product Managers owning a section of the Facebook experience.</p></li>
</ol>

<p>Some of the things a Product Manager typically does is:</p>

<ul>
<li>Understand and manage the business goals: identify the best business opportunities , create and push products to address them.</li>
<li>Understand the functionality and scope of the product: if it&#8217;s technology, they can code; if it&#8217;s a marketing product, they understand how and why advertising is bought.</li>
<li>Understand the customers: make sure people will want to consume the product</li>
<li>Make decisions and be qualified to make them: balance a mix of Strategic Decisions ( into markets or users ) and Operations ( costs to iterate &#8211; both financially and team morale )</li>
<li>Manage the process : work with P&amp;L sheets, quarterback the scope/design/build/deploy/sales process.</li>
<li>other things I&#8217;m too tired to note. Product Managers are tasked with balancing the goals of the Organization against the needs of multiple types of Consumers and the people/resources to build them.  It&#8217;s a lot of work, but it&#8217;s amazing fun for a lot of us.</li>
</ul>

<p>The scores of &#8220;Product Manager&#8221; positions that are plentiful in NYC right now are nothing like my descriptions above &#8211; they tend to be a hybrid of skills belonging to a Digital Producer ( in the adverting world ) and Project Manager ( in , well any industry ).  They are mostly what I consider entry level – with a target of 3 total years work experience.</p>

<p>These positions tend to be highly administrative , require no expertise or inter-disciplinary skills, and don&#8217;t even have access to seeing budgets &#8212; much less managing them or trying to affect revenue operations.  Sometimes they&#8217;ll include a bit of customer development work, but most often they don&#8217;t.  These positions completely lack a &#8220;Strategy&#8221; component, tending to either be a very entry level position or a mislabling for the most incredibly experienced and talented Project Manager you&#8217;ve ever met.</p>

<p>Almost always these roles become filled by someone who honestly shouldn&#8217;t have that job.  One of my more favorite &#8220;Product Manager&#8221; interactions was with someone who had just assumed the new role as their second-ever job, with their first job being several years as a Customer Service representative.  If the company provided Customer Service, it would have been a really good fit &#8212; but the company provided a very technical service, and their &#8220;Product Manager&#8221; was really functioning more like a mix of an &#8220;Account Manager&#8221; and &#8220;Digital Producer&#8221;, they were visibly out of their element and unable to understand the needs of their clients.</p>

<p>This is really a dis-service to everyone involved.</p>

<ul>
<li>It makes a potential employers look foolish to actual Product Managers , and labeled as a company to avoid.</li>
<li>It skips over a huge pool of extremely talented Digital Producers and Project Managers who would excel at these roles.</li>
<li>It creates a generation of early-career professionals with the title of a Product Manager, but without the relevant experience or skills to back it up.</li>
</ul>

<p>Because &#8220;Product Manager&#8221; is so often a role that an experienced professional transitions into, it&#8217;s not uncommon to see someone with 1-2 years of &#8220;Product Manager&#8221; in their title, but a resume that shows 3 years as a Vice President and 5 years as a Director at a previous employer.  You might even see someone with 3 years of &#8220;Product Manager&#8221; as a title &#8212; but an additional 9 years of &#8220;Digital Producer&#8221; or &#8220;Project Manager&#8221; experience behind them as well.  Plenty of professionals from the Production side transition into Product Management too, once they&#8217;re well versed in their respective industries.</p>

<p>Mindless recruiters ( and certain nameless conglomerates ) of NYC don&#8217;t understand this though.  They just focus on buzz-words: if someone has been in &#8220;product&#8221; for 2 years, they target them as if they&#8217;ve only been a professional for that long.  It&#8217;s all too common for the salary cap of a not-really-a-product-manager position to be 1/4 the targeted recruit&#8217;s current salary.  The compensation package and role should be commensurate with the full scope of someone&#8217;s work &#8212; i.e. 12 years, not 3 years.</p>

<p>So my point is simple &#8211; if you&#8217;re hiring a &#8220;Product Manger&#8221; you should really think at what you expect out of the role.</p>

<ul>
<li>If you&#8217;re really looking for a &#8220;Project Manager&#8221; or &#8220;Digital Producer&#8221; &#8212; which you most likely are &#8212; change your posting and recruit that person.  You&#8217;ll find a great employee and give them a job they really want and care about.  If you manage to get a Product Manager in that role, they&#8217;re going to be miserable and walk out the door.</li>
<li>If you realize that you&#8217;re looking for a role that its both strategic and operational &#8212; and is going to be one of the most important hires for your organization or division, then either hire someone with relevant Product Management experience OR hire a relevant expert to be your &#8220;Product Manager&#8221;.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.destructuring.net/2012/03/31/what-a-product-manager-is-and-isnt-and-why-you-should-probably-stop-trying-to-hire-one/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dreamhost UX Creates Security Flaw</title>
		<link>http://www.destructuring.net/2012/03/23/dreamhost-ux-security-flaw/</link>
		<comments>http://www.destructuring.net/2012/03/23/dreamhost-ux-security-flaw/#comments</comments>
		<pubDate>Fri, 23 Mar 2012 16:03:03 +0000</pubDate>
		<dc:creator>Jonathan</dc:creator>
				<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.destructuring.net/?p=511</guid>
		<description><![CDATA[Last week I found a Security flaw on Dreamhost caused by the User Experience on their control panel. I couldn&#8217;t find a security email, so I posted a message on Twitter. Their Customer Support team reached out and assured me [...]]]></description>
			<content:encoded><![CDATA[<div class="AWD_like_button "><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.destructuring.net%2F2012%2F03%2F23%2Fdreamhost-ux-security-flaw%2F&amp;send=false&amp;layout=standard&amp;width=&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=arial&amp;height=40" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:px; height:40px;" allowTransparency="true"></iframe></div><p>Last week I found a Security flaw on Dreamhost caused by the User Experience on their control panel.  I couldn&#8217;t find a security email, so I posted a message on Twitter.  Their Customer Support team reached out and assured me that an email response would be addressed.  Six days later I&#8217;ve heard nothing from them, so I feel forced to do a public disclosure.</p>

<p>I was hoping that they would do the responsible thing, and immediately fix this issue.</p>

<h2>The issue:</h2>

<p>If you create a Subversion repository, there is a checkbox option to add on a &#8220;Trac&#8221; interface – which is a really great feature, as it can be a pain to set up on their servers yourself (something I&#8217;ve usually done in the past).</p>

<p>The exact details of how the &#8220;one-click&#8221; Trac install works aren&#8217;t noted though, and the integration doesnt &#8220;work as you would probably expect&#8221; from the User Experience path.</p>

<p>If you had previous experience with Trac, and you were to create a &#8220;Private&#8221; SVN repository on Dreamhost – one that limits access to a set of username/passwords – you would probably assume that access to the Trac instance is handled by the same credentials as the SVN instance, as  Trac is tightly integrated into Subversion.</p>

<p>If you had no experience with Trac, you would probably be oblivious to the fact that Trac has it&#8217;s own permissions system, and assume your repository is secured from the option above.</p>

<p>The &#8220;one click&#8221; Trac install from Dreamhost is entirely unsecured &#8211; the immediate result of checking the box to enable Trac on a &#8220;private&#8221; repository, is that you inherently are publicly publishing that repo from within the Trac browser.</p>

<p>For example, if you were to install a private subversion and one-click Trac install onto a domain like this:</p>

<pre><code>my.domain.com/svn
my.domain.com/trac
</code></pre>

<p>The /svn source would be private however it would be publicly available under /trac/browser due to the default one-click install settings.</p>

<p>Here&#8217;s a marked-up screenshot of the page that shows the conflicting options ( also on http://screencast.com/t/A2VQT5gOVkK )</p>

<p><a href="http://www.destructuring.net/wordpress/wp-content/uploads/2012/03/00000002.png"><img src="http://www.destructuring.net/wordpress/wp-content/uploads/2012/03/00000002.png" alt="" title="Dreamhost Subversion &amp; Trac" width="648" height="646" class="alignnone size-full wp-image-512" style="border:2px solid #CFCFCF;"/></a></p>

<p>I totally understand how the team at Dreamhost that implemented the Trac installer would think their approach was a good idea, because in a way it is. A lot of people who are familiar with Trac want to fine-tune the privileges using Trac&#8217;s own very-robust permissions system, deciding who can see the source / file tickets / etc. The problem is that there is absolutely no mention of an alternate permissions system contained within Trac &#8211; or that someone may need to fine-tune the Trac permissions.  People unfamiliar with Trac have NO IDEA that their code is being made public, and those familiar with Trac would not necessarily realize that a fully unsecured setup is being created.  I&#8217;ve been using Trac for over 8 years , and the thought of the default integrations being setup like this is downright silly &#8211; it&#8217;s the last thing I would expect a host to do.</p>

<p>I think it would be totally fine if there is just a &#8220;Warning!&#8221; sign next to the &#8220;enable Trac&#8221; &#8212; with a link to Trac&#8217;s wiki for customization , or instructions ( maybe even a checkbox option ) on how a user can have Trac use the same authorization file as subversion.</p>

<p>But, and this is a huge BUT, people need to be warned that clicking the &#8216;enable Trac&#8217; button will publish code until Trac is configured.  People who are running Trac via an auto-install need to be alerted of this immediately.</p>

<p>This can be a huge security issue depending on what people store in Subversion.  Code put in Subversion repositories tends to contain Third Party Account Credentials ( Amazon AWS Secrets/Keys, Facebook Connect Secrets, Paypal/CreditCard Providers, etc ), SSH Keys for automated code deployment, full database connection information, administrator/account default passwords &#8212; not to mention the exact algorithms used for user account passwords.</p>

<h2>The fix</h2>

<p>If you have a one-click install of Trac tied to Subversion on Dreamhost and you did not manually set up permissions, you need to do the following IMMEDIATELY:</p>

<h3>Secure your Trac installation</h3>

<p>If you want to use Trac&#8217;s own privileges, you should create this .htaccess file in the meantime to disable all access to the /trac directory</p>

<pre><code>deny from all
</code></pre>

<p>Alternately, you can map access your Trac install to the Subversion password file with a .htaccess like this:</p>

<pre><code>AuthType Basic
AuthUserFile /home/##SHELL_ACCOUNT_USER##/svn/##PROJECT_NAME##.passwd
AuthName "##PROJECT_NAME##"
require valid-user
</code></pre>

<h3>Audit your affected code and services.</h3>

<ul>
<li>All Third Party Credentials should be immediately trashed and regenerated.</li>
<li>All SSH Keys should be regenerated</li>
<li>All Database Accounts should be reset.</li>
<li>If you don&#8217;t have a secure password system in place , you need up upgrade</li>
</ul>

<h2>What are the odds of me being affected ?</h2>

<p>Someone would need to figure out where your trac/svn repos are to exploit this.  Unless you&#8217;ve got some great obscurity going on, it&#8217;s pretty easy to guess.  Many people still like to deploy using files served out of Subversion (it was popular with developers 5 years ago before build/deploy tools became the standard) , if that&#8217;s the case and Apache/Nginx aren&#8217;t configured to reject .svn directories &#8212; your repo information is public.</p>

<p>When it comes to security, play it safe.  If your repo was accidentally public for a minute, you should wipe all your credentials.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.destructuring.net/2012/03/23/dreamhost-ux-security-flaw/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>IMPORTANT &#8211; There&#8217;s a bug with Google that may affect the EFF/BoingBoing instructions to remove your web history</title>
		<link>http://www.destructuring.net/2012/02/22/important-theres-a-bug-with-google-that-affects-the-effboingboing-instructions-to-remove-web-history/</link>
		<comments>http://www.destructuring.net/2012/02/22/important-theres-a-bug-with-google-that-affects-the-effboingboing-instructions-to-remove-web-history/#comments</comments>
		<pubDate>Wed, 22 Feb 2012 21:23:54 +0000</pubDate>
		<dc:creator>Jonathan</dc:creator>
				<category><![CDATA[Thoughts]]></category>

		<guid isPermaLink="false">http://www.destructuring.net/?p=506</guid>
		<description><![CDATA[BoingBoing just frontpaged this EFF.org HowTo &#8212; How to Remove Your Google Search History Before Google&#8217;s New Privacy Policy Takes Effect https://www.eff.org/deeplinks/2012/02/how-remove-your-google-search-history-googles-new-privacy-policy-takes-effect http://boingboing.net/2012/02/22/howto-turn-off-googles-searc.html There seems to be a significant bug in Google&#8217;s Systems that may leave you &#8220;unprotected&#8221; if you [...]]]></description>
			<content:encoded><![CDATA[<div class="AWD_like_button "><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.destructuring.net%2F2012%2F02%2F22%2Fimportant-theres-a-bug-with-google-that-affects-the-effboingboing-instructions-to-remove-web-history%2F&amp;send=false&amp;layout=standard&amp;width=&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=arial&amp;height=40" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:px; height:40px;" allowTransparency="true"></iframe></div><p>BoingBoing just frontpaged this EFF.org HowTo &#8212; How to Remove Your Google Search History Before Google&#8217;s New Privacy Policy Takes Effect</p>

<ul>
<li>https://www.eff.org/deeplinks/2012/02/how-remove-your-google-search-history-googles-new-privacy-policy-takes-effect</li>
<li>http://boingboing.net/2012/02/22/howto-turn-off-googles-searc.html</li>
</ul>

<p>There seems to be a significant bug in Google&#8217;s Systems that may leave you &#8220;unprotected&#8221; if you follow the directions.</p>

<p>I had one of the &#8220;earlier&#8221; beta accounts from years ago, where the login was just the &#8216;local part&#8217; of the email address &#8212; e.g. it was &#8220;jvanasco&#8221; not &#8220;jvanasco@gmail.com&#8221;.</p>

<p>When I followed the EFF instructions &#8212; and the Google instructions on their login box to sign in with a full email address &#8212; I got a message about how &#8220;Web History&#8221; is not enabled for &#8220;gmail&#8221;.  It was the same message I saw for turning off a Google Apps email for &#8220;jonathan@ArtWeLove.com&#8221;.  To make sure everything was okay, I double checked the gmail inbox&#8230; and it was the correct inbox.</p>

<p>I logged out as &#8220;jvanasco@gmail.com&#8221; and then logged back in again as &#8220;jvanasco&#8221;.  I ended up at the same inbox, and I was then able to see the &#8220;Web History&#8221; page , which had &#8216;paused&#8217; (read: &#8216;turned off&#8217;) in 2008.</p>

<p>I logged out of gmail, then back in again using both versions of the account name.  I could now view the &#8220;paused&#8221; web history page on both systems &#8212; leading me to think an account update/merger happened.</p>

<p>In any event- if you receive a message that says something like &#8220;This is not enabled for gmail&#8221;, you should log out then log back in as just the &#8220;local_part&#8221;, and not an email address.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.destructuring.net/2012/02/22/important-theres-a-bug-with-google-that-affects-the-effboingboing-instructions-to-remove-web-history/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Want to win? Make it easier, not harder.</title>
		<link>http://www.destructuring.net/2012/02/21/want-to-win-make-it-easier-not-harder/</link>
		<comments>http://www.destructuring.net/2012/02/21/want-to-win-make-it-easier-not-harder/#comments</comments>
		<pubDate>Tue, 21 Feb 2012 04:56:58 +0000</pubDate>
		<dc:creator>Jonathan</dc:creator>
				<category><![CDATA[Advertising]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Thoughts]]></category>
		<category><![CDATA[Work]]></category>

		<guid isPermaLink="false">http://www.destructuring.net/?p=505</guid>
		<description><![CDATA[This is a draft. In March of 2011 I represented Newsweek &#38; The Daily Beast at the Harvard Business School / Committee of Concerned Journalists &#8220;Digital Leaders Summit&#8221;. Just about every major media property sent an executive there, and I [...]]]></description>
			<content:encoded><![CDATA[<div class="AWD_like_button "><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.destructuring.net%2F2012%2F02%2F21%2Fwant-to-win-make-it-easier-not-harder%2F&amp;send=false&amp;layout=standard&amp;width=&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=arial&amp;height=40" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:px; height:40px;" allowTransparency="true"></iframe></div><h2>This is a draft.</h2>

<p>In March of 2011 I represented Newsweek &amp; The Daily Beast at the Harvard Business School / Committee of Concerned Journalists &#8220;Digital Leaders Summit&#8221;. Just about every major media property sent an executive there, and I was privileged enough to represent the NewsBeast.</p>

<p>Over the course of two days, we covered a lot of concerns across the industry &#8211; analyzing who was doing things right , and who was doing things wrong.</p>

<p>On the first day of the summit, we looked at how Amazon was posturing itself for digital book sales &#8211; where their profits were hoping to be , where their losses were expected, and strategies for finding the optimal price structure for digital goods.</p>

<p>Inevitably, the conversation sidetracked to the Apple Ecosystem, which had just announced Subscriptions and their eBooks plan &#8212; consequently being their new competitor.</p>

<p>One of the other 30 or so people in attendance, was Jeffrey Zucker from NBC who went into his famed digital pennies vs. analog dollars diatribe.  He made a compelling, intelligent, and honest argument that captivated the minds and attention of the entire room.  Well, most of the room.</p>

<p>I vehemently disagreed and quickly spoke up to grab control of the floor &#8212; &#8220;apologizing&#8221; from breaking with the conventional view of this subject, and asking people to look at the situation from another point of view.  Yes, it&#8217;s true that Apple standardized prices for digital downloads and set the pricing on their terms.  Yet, it&#8217;s true that Apple allowed for records to be purchased &#8220;in part&#8221; and not as a whole, and yes to a lot of other things.</p>

<p>And yes &#8211; Jeffrey Zucker didn&#8217;t say anything that was &#8220;wrong&#8221; &#8211; everything he said was right.  But simply put, Mr. Zucker and other delegates were only looking at portion of the scenario in play &#8212; and the prevailing wisdom in the room was way off the mark&#8230; by miles.</p>

<p>Apple didn&#8217;t gain dominance in online music because of their pricing system or undercutting retailers &#8212; which everyone believed. Plain and simple, Apple took control of the market because they made it easier and faster for someone to legally buy music than to steal it.  When they first launched &#8212; and still today &#8212; it takes under a minute for someone to find and buy an album or a single in the iTunes store.  Let me repeat that &#8211; under a minute.  Apple&#8217;s servers were relatively fast at the start as well, and the entire album could be downloaded within an hour.</p>

<p>In contrast, to legally purchase a record in the store would take at least two hours &#8212; and at the time they first launched, encoding an album to work on an MP3 player would take another hour.  To download a record at that time would be even longer: services like Napster (then already dead) could take a day to download; torrent systems could take a day; while file upload sites were generally faster, they suffered from another issue that torrentz and other options did as well &#8212; mislabeled and misdirected files.</p>

<p>Quite possibly the only smart thing the Media Industry has ever done to curb piracy is , what I call, the &#8220;I Am Spartacus&#8221; method &#8212; wherein &#8220;crap&#8221; files are mislabeled to look like Top 40 hits.  As an example, in expectation of a new Jay-Z record, internet filesharing sites are flooded with uploads that bear the name of the record , but contain white noise, another record, or an endless barrage of insults ( ok, maybe not the last one&#8230; but they should ).</p>

<p>I pretty much shut the room up at that point, and began a diatribe of my own &#8211; which I&#8217;ll continue here&#8230;</p>

<p>At the conference, Jeffrey Zucker and some other media executives tended to look at the digital economy like this:  If there are 10 million Apple downloads of the Beyonce record or the 2nd Season of &#8220;Friends&#8221;, those represent 10 million diverted sales of a $17.99 CD &#8211; or 10MM diverted sales of a $39.99 dvd.  If Apple were to sell the CD for 9.99 with a 70% cut, they&#8217;re only seeing $7 in revenue for every $17.99 &#8212; 100 million times.  Similarly, if 10MM people are watching Friends for $13.99 (or whatever cost) on AppleTV instead of buying $29.99 box sets, that&#8217;s about $20 lost per viewer &#8212; 10 million times.</p>

<p>To this point, I called bullshit.</p>

<p>Digital goods such as music and movies have incredibly diminished costs for incremental units, and for most of these products they are a secondary market &#8212; records tend to recoup their various costs within the first few months, and movies/tv-shows tend to have been wildly profitable on-TV / in-Theaters.  The music recording costs 17.99 and the DVD 29.99 , not because of fixed costs and a value chain&#8230; but because $2 of plastic, or .02¢ of bandwidth, is believed by someone to be able to command that price.</p>

<p>Going back to our real-life example, 10MM downloads of &#8220;Friends&#8221; for 13.99 doesn&#8217;t equate to 10MM people who would have purchased the DVD for $29.99.  While a percentage of the 10MM may have been willing to purchase the DVDs for the higher price, another &#8212; larger &#8212; percentage would not have.  By lowering the price from 29.99 to 13.99, the potential market had likely changed from 1MM consumers to 10MM.  Our situation is not an &#8220;apples-to-apples&#8221; comparison &#8212; while we&#8217;re generating one third the revenue, we&#8217;re moving ten times as many units and at a significantly lower cost ( no warehousing, mfg, transit, buybacks, etc ).</p>

<p>While hard copies are priced to cover the actual costs associated with manufacturing and distributing the media, digital media is flexibly priced to balance convenience with maximized revenue.</p>

<p>Apple doesn&#8217;t charge .99¢ for a song, or $1.99 for a video because of some nefarious plan to undervalue media &#8212; they came up with those prices because those numbers can generate significant revenue while being an inconsequential purchase.  At .99¢ a song or $9.99 an album, consumer&#8217;s simply don&#8217;t think &#8212; we&#8217;re talking about a dollar for a song, or a ten dollar bill for a record.</p>

<p>Let me rephrase that, we&#8217;re talking about a fucking dollar for a song.  A dollar is a magical number, because while it&#8217;s money, it&#8217;s only a dollar. People lose dollar bills all the time, and rationalize the most ridiculous of purchases away&#8230; because it&#8217;s only a dollar.  You&#8217;ll note that a dollar is not far off from the price of a candy bar, which retailers incidentally realized long ago that &#8220;Hey &#8211; let&#8217;s put candy bars next to the cash registers and keep the prices relatively low, so people make impulse buys and just add it onto their carts&#8221;.</p>

<p>Do you know what happens when you charge a dollar for something?  People just buy it.  At 13.99 &#8211; 17.99 for a cd, people look at that as a significant purchase &#8212; one that competes with food, vacations, their children&#8217;s college savings.  When you charge a dollar a song &#8211; or ten dollars a record &#8211; people don&#8217;t make those comparisons&#8230; they just buy.</p>

<p>And buy, and buy, and buy. Before you know it, people end up buying more goods &#8212; spending more money overall on media than they would have under the old model.  Call me crazy, but I&#8217;d rather sell 2 items with little incremental cost at $9.99 each than 1 item at $13.99 &#8212; or even 1 item at $17.99.</p>

<p>Unfortunately, the current stable of media executives &#8211; for the most part &#8211; just don&#8217;t get this. They think a bunch of lawyers , lobbyists and paying off politicians for sweetheart legislations are the best solution. Maybe that worked 50 years ago, but in this day and age of transparency and immediacy, it doesn&#8217;t.</p>

<p>Today: you need to swallow you pride, realize that people are going to steal, that the &#8216;underground&#8217; will always be ahead of you, and instead of wasting time + money + energy with short-term bandaids which try to  remove piracy ( and need to be replaced every 18months ) &#8212; you should invest your time and resources into making it easier and cheaper to legally consume content. Piracy of goods will <em>always</em> exist, it is an economic and human truth.  You can fight it head-on, but why?</p>

<p>Instead of spending millions of dollars chasing 100% market share that will never happen (and I can&#8217;t stress that enough, it will never happen), you could spend thousands of dollars addressing the least-likely pirates and earn 90% of the market share &#8212; in turn generating billions more in revenue each year.</p>

<p>Until decision makers swallow their pride and admit they simply don&#8217;t understand the economics behind a digital world, media companies are going to constantly and mindlessly waste money. Almost every ( if not EVERY ) attempt at Digital Rights Management by major media companies has been a catastrophe &#8211; with most just being a waste of money, while some have resulted in long term compliance costs.  I can&#8217;t say this strongly enough: nearly the entire industry of Digital Rights Management is a complete failure and not worth addressing.</p>

<p>Today, the media industry is at another crossroads.  Intellectual property rights holders are getting incredibly greedy , and trying to manipulate markets which they clearly don&#8217;t understand.  In the past 12 hours I&#8217;ve learned how streaming rights to Whitney Houston movies were pulled from major digital services after her death to increase DVD sales [ I would have negotiated with digital companies for an incremental 'fad' premium, expecting the hysteria to die down before physical goods could be made ], and read a dead-on comic by The Oatmeal on how it has &#8211; once again &#8211; become easer to steal content than to legally purchase it [ http://theoatmeal.com/comics/game_of_thrones ].</p>

<p>As I write this (Feb 2012) it is faster to steal a high quality MP3 (or FLAC) of record than it is to either: a) rip the physical CD to the digital version or b) download the item from iTunes ( finding/buying is still under a minute ).  Regional release dates for music , movies and TV are unsynchronized (on purpose!) , which ends up in the perverse scenario where people in different regions become incentivized to traffick content to one another &#8212; i.e. a paying subscriber of a premium network in Europe would illegally download an episode when it first airs on the affiliate in the United States, one month before the European date.</p>

<p>Digital economics aren&#8217;t rocket science, they&#8217;re drop-dead simple:</p>

<ol>
<li>If you make things fast and easy to legally purchase, people will purchase it.  </li>
<li>If you make things cheap enough, people will buy them &#8211; without question , concern, or weighing the purchase into their financial plans.</li>
<li>If you make it hard or expensive for people to legally purchase something, they will turn to &#8220;the underground&#8221; and illegal sources.</li>
<li>Piracy will always exist, innovators will always work to defy Digital Rights Management, and as much money as you throw at creating anti-piracy measures&#8230; there will always be a large population of brilliant people working to undermine them.</li>
</ol>

<p>My advice is simple: pick your battles wisely.  If you want to win in digital media, focus on the user experience and maximizing your revenue generating audience.  If your content is good, people will either buy it or steal it &#8211; if your content is bad, they&#8217;re going somewhere else.</p>

<p>I&#8217;m glad to no longer be in publishing.  Maybe I&#8217;ll return one day, but that&#8217;s doubtful. I&#8217;m glad to be back in a digital-only world, working with startups , advertising agencies, and media companies that are focused on building the future&#8230; not trying to save an ancient business model.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.destructuring.net/2012/02/21/want-to-win-make-it-easier-not-harder/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Facebook Product Quirks, Part 1</title>
		<link>http://www.destructuring.net/2012/01/21/facebook-product-quirks-part-1/</link>
		<comments>http://www.destructuring.net/2012/01/21/facebook-product-quirks-part-1/#comments</comments>
		<pubDate>Sat, 21 Jan 2012 16:32:13 +0000</pubDate>
		<dc:creator>Jonathan</dc:creator>
				<category><![CDATA[Social Media]]></category>
		<category><![CDATA[Thoughts]]></category>

		<guid isPermaLink="false">http://www.destructuring.net/?p=499</guid>
		<description><![CDATA[As an Internet Professional who works with both Consumer &#38; B2B Products, I&#8217;ve been keeping a growing list of issues with Facebook. I figured it was worth publicly sharing them &#8212; maybe others have thought this way. Top 5 Product [...]]]></description>
			<content:encoded><![CDATA[<div class="AWD_like_button "><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.destructuring.net%2F2012%2F01%2F21%2Ffacebook-product-quirks-part-1%2F&amp;send=false&amp;layout=standard&amp;width=&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=arial&amp;height=40" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:px; height:40px;" allowTransparency="true"></iframe></div><p>As an Internet Professional who works with both Consumer &amp; B2B Products, I&#8217;ve been keeping a growing list of issues with Facebook.  I figured it was worth publicly sharing them &#8212; maybe others have thought this way.</p>

<h1>Top 5 Product Quirks I Hate About Facebook , Part 1</h1>

<h2>1- Consumer Product : The messages that accompany a &#8220;Friend Request&#8221; are lost once you accept a Friendship</h2>

<p>Let&#8217;s say someone sees your profile, realizes you know each other because of X/Y/Z to be a friend.  Facebook has a great feature that gives them a chance to add a &#8216;qualifying message&#8217; to their FriendRequest&#8230; you know, something like &#8220;Hey, Jonathan! It&#8217;s been years. My phone number is 555-123-4567. Call me!&#8221;</p>

<p>This is a great feature, right?  Absolutely.  There&#8217;s just a little problem though- once you become friends with that person, the message disappears.  Since it&#8217;s not a real &#8220;message&#8221; ( in their world ), it doesn&#8217;t get archived in your message center history.</p>

<p><em><strong>What Facebook should do: if a FriendRequest is accompanied with a message, turn it into a user-to-user message upon Accepting or Rejecting the request.</strong></em></p>

<h2>2- Consumer Product : When sending a FriendRequest to another User , the requesting first User doesn&#8217;t expose their Profile to the requestee</h2>

<p>How many times have you gotten a FriendRequest, thought &#8220;Hmm, how do I know this person?&#8221;, and then clicked their profile ?  I&#8217;d wager a lot.  When you&#8217;re unsure of who someone is, it&#8217;s a normal reaction to check-them-out.</p>

<p>Here&#8217;s the problem &#8211; when Facebook first introduced their privacy settings, they gave users the option to make all ( or portions of ) their profiles &#8220;Friends Only&#8221;.  It&#8217;s a great feature, but there&#8217;s a bit of a caveat &#8212; if this setting is turned on, the recipient of a FriendRequest can&#8217;t see the sender&#8217;s details.  In many cases, the only information shown is a name &amp; photo.</p>

<p>This user interaction is one of the most troubling and annoying to me &#8211; in order to find out exactly WHO sent me a FriendRequest, I need to accept their Friendship.  This isn&#8217;t something that I really want to do &#8212; I don&#8217;t want to expose my activities, contact information, or network to someone that I don&#8217;t necessarily know or trust.</p>

<p>This is what it unfortunately looks like:</p>

<ol>
<li>The Friend Request Pane </li>
</ol>

<p><a href="http://www.destructuring.net/wordpress/wp-content/uploads/2012/01/friendrequest-list.png"><img src="http://www.destructuring.net/wordpress/wp-content/uploads/2012/01/friendrequest-list-164x300.png" alt="Facebook - Friend Request Listing" title="facebook-friendrequest-list" width="164" height="300" class="alignnone size-medium wp-image-501" /></a></p>

<ol>
<li>The requesting person&#8217;s profile.  Who are they?!?!?</li>
</ol>

<p><a href="http://www.destructuring.net/wordpress/wp-content/uploads/2012/01/friendrequest-profile.png"><img src="http://www.destructuring.net/wordpress/wp-content/uploads/2012/01/friendrequest-profile-300x143.png" alt="Facebook - FriendRequest - Profile" title="facebook-friendrequest-profile" width="300" height="143" class="alignnone size-medium wp-image-500" /></a></p>

<p><em><strong>What Facebook should do: ProfilePermissions for &#8220;Friends&#8221; should apply to &#8220;outgoing FriendRequests&#8221;.  There is an implicit intent to have a Friendship and share this information.</strong></em></p>

<h2>3- Consumer Product : Application Permission Dialogs show the name of the Application, not who is responsible for the Application.</h2>

<p>All too often I see an interesting Post / Application and click on it to potentially add it to my own Profile.</p>

<p>Here&#8217;s an example &#8211; this Application promotes the song that was #1 on your birthday.  &#8220;Hey, I want to find that out myself!&#8221;</p>

<p><a href="http://www.destructuring.net/wordpress/wp-content/uploads/2012/01/newsfeed_item.png"><img src="http://www.destructuring.net/wordpress/wp-content/uploads/2012/01/newsfeed_item-300x204.png" alt="Facebook - Application Newsfeed Item" title="facebook-application_newsfeed_item" width="300" height="204" class="alignnone size-medium wp-image-502" /></a></p>

<p>When the Application requests an Authorization from me though, I see that I&#8217;m sharing my information with the App &#8212; which is great.  What I don&#8217;t see, however, is exactly <strong>who</strong> I&#8217;m sharing my information with.</p>

<p>In an era where people get their Facebook accounts hacked, or viral apps pop out of nowhere only to get permissions they later abuse, I&#8217;m worried about who the developers/companies are.  How do I know that &#8220;Some Random Application&#8221; is backed by solid, upstanding people &#8211; and not some foreign hackers that are trying to turn my account into a spamming node or mine it for personal info for identity theft?</p>

<p>Take a look at this screen and think about if you would feel comfortable granting whomever made this access :</p>

<p><a href="http://www.destructuring.net/wordpress/wp-content/uploads/2012/01/auth_dialog.png"><img src="http://www.destructuring.net/wordpress/wp-content/uploads/2012/01/auth_dialog-300x179.png" alt="Facebook - Application Auth Dialog" title="facebook-application_auth_dialog" width="300" height="179" class="alignnone size-medium wp-image-503" /></a></p>

<p><em><strong>What Facebook should do: list the main developer/company/etc on the authorization page.  Facebook makes a huge point about being based on &#8220;real names&#8221; &#8211; even going so far as to quarantine accounts that use &#8216;common&#8217; names instead of legal ones ( if you haven&#8217;t read his tirades, Salman Rushdie wrote some great stuff on his own struggles here).</strong></em></p>

<p>It&#8217;s also worth noting that this was a really awkward App to profile , because finding the install/auth screen was near impossible.</p>

<h2>4- Business Product : Data about the origin of Linked content is nebulous or cryptic &#8211; and worthless for metrics</h2>

<p>Links shared in Facebook aren&#8217;t direct links to content &#8211; they&#8217;re intercepted by a proxy at &#8220;http://facebook.com/l.php&#8221;.  Basically, there&#8217;s a bit of javascript that rewrites an external link on a webpage into an internal link, which is used by Facebook to track performance and display within their own analytics suite.  This is great and fine. &#8220;l.php&#8221; seems to take two parameters: a url encoded version of the destination, and a unique corresponding hash &#8212; which I think is a) just the a digest of the link with a &#8216;site secret&#8217;, and b) exists to ensure that the &#8220;l.php&#8221; script isn&#8217;t abused by non-facebook traffic.  I could be wrong on both parts, but if the exact unique hash doesn&#8217;t appear with the corresponding link&#8230; Facebook throws a 404 instead of a redirect to the url parameter.</p>

<p>Because of the way this linking works, if you look within your own analytics suite you&#8217;ll see that ALL traffic from Facebook.com appears as if its from &#8220;l.php&#8221;.  The only way to see how your referral traffic performs from Facebook is to use their own, limited, analytics program &#8212; and that can&#8217;t roll up into your existing analytics reporting tools AND only applies to &#8220;pages&#8221;.</p>

<p>If you embed a &#8220;Like&#8221; button on a page you can specify a &#8220;ref&#8221; label, into which Facebook will toss information back to your site with.  However &#8211; this isn&#8217;t a default action, and applies to &#8220;Like&#8221; stories only, not organic shares.  This is confusingly documented too &#8211; at a major publisher I was working with, earlier versions of the docs suggested that we would be able to note where on the site that button was placed, and we would then be able to access the information&#8230; nope.</p>

<p><em><strong>What Facebook should do: append information about the outbound links into query strings on the redirect (e.g. &#8220;?fb:context=user.newsstream&#8221; ) or create intermediary dummy redirects that have that information and will appear in referral logs ( e.g. &#8220;/l.php&#8221; -> &#8220;/l/user.newstream.php&#8221; ), thereby letting publishers access that information within their own analytics programs.  The information could even be coerced into the &#8220;utm_&#8221; namespace that Google uses, as Omniture can work with them by default &#8212; easily supporting two of the top analytics packages at once.</p>

<p>As a publisher your internal teams don&#8217;t need /much/ information (and they rarely have the time to sift though massive amounts), but it is invaluable to know some topline metrics &#8212; like the context of a link ( user newsfeed, profile page, app page, etc ) , and if there were images/non-default text shared, etc &#8212; the type of information that enables digital teams to better share and promote content on Facebook.</p>

<p>Additionally, the behavior of the &#8220;ref&#8221; tool should be on by default &#8212; affecting all links &#8212; and control for fine-tuning can be offered on a per-domain basis.</strong></em></p>

<h2>5- The internal Insights/Analytics app has a lot of data, but does little with it. There are some key metrics that could be shown now &#8211; and others that should be expanded upon.</h2>

<p>Facebook is great about telling me how much content is shared, but is pretty bad at telling me HOW it is shared.  As a publisher, I want to know WHERE the share is coming from and WHY &#8211; is it from within Facebook ?  If so, is it as people &#8220;share&#8221; on each other&#8217;s walls or another mechanism?  Is it happening from a &#8220;user to user&#8221; newsfeed story, or a &#8220;page to user&#8221; newsfeed ?  Where did someone &#8220;Like&#8221; my story &#8211; on my website, on a newsfeed, on my brand&#8217;s profile page?  As the Facebook Comments system is used more: I want to know if people are posting responses on Facebook , or on my own site.  Most importantly, I want the ability to slice and dice all these bits of data on a &#8220;per post&#8221; or &#8220;per url&#8221; basis &#8212; it&#8217;ll help me figure out how to spend my internal resources in promoting stories.  I need to figure out which types of stories do best as user-to-user vs brand-to-user, and which ones are being spread on Facebook vs those where offsite likes merely show an affinity for the stories.</p>

<p>For generic users this might sound silly, but as someone responsible for the digital growth of a brand this stuff is really, really, really important.  As someone who is debating how much of a yearly budget to allocate to Facebook development, advertising, and internal staffing &#8211; this is information I really need to know.  This is the type of information that tells me what I&#8217;m doing right, what I&#8217;m doing wrong, and guides my next steps.  I want to know which Headlines performed the best in terms of &#8220;Likes&#8221; and which had the highest percentage of clickthroughs.  Today, I only see the clickthrough data on my analytics suite and the aggregate of all activity on Facebook&#8217;s.  This data is simply not substantial enough to base sound decisions on.</p>

<p><em><strong>What Facebook should do: Surface the data. Repeat. Surface the data.</p>

<p>Give me granular details on the WHERE shares and comments come from; let me dive in and see things on a per-post basis.</p>

<p>&#8220;Like&#8221; buttons should support another tag called &#8220;placement&#8221; which tracks the context of the like on my site ( and makes the data available on Facebook&#8217;s site).  For example: I want to know if the &#8220;Like&#8221; on my site happened from the button on the top of an article or the button on the bottom &#8212; or did the only like the &#8220;abstract&#8221; description , instead of the full article.  I also want to know how social sharing is affected by A/B testing &#8212; did I get more likes using template A, B, or C on my website.</p>

<p>These are pretty basic things I want to know &#8212; but I can&#8217;t know them, because Facebook&#8217;s data collection and reporting just aren&#8217;t that great.</strong></em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.destructuring.net/2012/01/21/facebook-product-quirks-part-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Python Fun : Upgrading to 2.7 on OSX ; Installing Mysql-Python on OSX against MAMP ( ruby gem too)</title>
		<link>http://www.destructuring.net/2012/01/04/python-fu/</link>
		<comments>http://www.destructuring.net/2012/01/04/python-fu/#comments</comments>
		<pubDate>Wed, 04 Jan 2012 01:46:52 +0000</pubDate>
		<dc:creator>Jonathan</dc:creator>
				<category><![CDATA[Code - Python]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.destructuring.net/?p=496</guid>
		<description><![CDATA[I needed to upgrade from Python 2.6 to 2.7 and ran into a few issues along the way. Learn from my encounters below. Upgrading Python Installing the new version of Python is really quick. Python.org publishes a .dmg installer that [...]]]></description>
			<content:encoded><![CDATA[<div class="AWD_like_button "><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.destructuring.net%2F2012%2F01%2F04%2Fpython-fu%2F&amp;send=false&amp;layout=standard&amp;width=&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=arial&amp;height=40" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:px; height:40px;" allowTransparency="true"></iframe></div><p>I needed to upgrade from Python 2.6 to 2.7 and ran into a few issues along the way. Learn from my encounters below.</p>

<h1>Upgrading Python</h1>

<p>Installing the new version of Python is really quick.  Python.org publishes a .dmg installer that does just about everything for you.  Let me repeat &#8220;Just about everything&#8221;.</p>

<p>You&#8217;ll need to do 2 things once you install the dmg, however the installer only mentions the first item below:</p>

<ol>
<li><p>Run &#8220;/Applications/Python 2.x/Update Shell Command&#8221;.  This will update your .bash_profile to look in &#8220;/Library/Frameworks/Python.framework/Versions/2.x/bin&#8221; first.</p></li>
<li><p>After you run the app above, in a NEW terminal window do the following:</p></li>
</ol>

<ul>
<li>Check to see you&#8217;re running the new python with <code>python --version</code> or <code>which python</code></li>
<li>once you&#8217;re running the new python, re-install anything that installed an executable in bin.  THIS INCLUDES SETUPTOOLS , PIP , and VIRTUALENV</li>
</ul>

<p>It&#8217;s that second thing that caught me.  I make use of virtualenv a lot, and while I was building new virtualenvs for some projects I realized that my installs were building against <code>virtualenv</code> and <code>setuptools</code> from the stock Apple install in &#8220;/Library/Python/2.6/site-packages&#8221; , and not the new Python.org install in &#8220;/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages&#8221;.</p>

<p>It&#8217;s worth nothing that if you install setuptools once you&#8217;ve upgraded to the Python.org distribution, it just installs into the &#8220;/Library/Frameworks/Python.framework&#8221; directory &#8212; leaving the stock Apple version untouched (basically, you can roll back at any time).</p>

<h1>Installing Mysql-Python (or the ruby gem) against MAMP</h1>

<p>I try to stay away from Mysql as much as I can [ i &lt;3 PostgreSQL ], but occasionally I need to run it: when I took over at TheDailyBeast.com, they were midway through a relaunch on Rails , and I have a few consulting clients who are on Django.</p>

<p>I tried to run cinderella a while back ( http://www.atmos.org/cinderella/ ) but ran into too many issues. Instead of going with MacPorts or Homebrew, I&#8217;ve opted to just use MAMP ( http://www.mamp.info/en/index.html )</p>

<p>There&#8217;s a bit of a problem though &#8211; the persons who are responsible for the MAMP distribution decided to clear out all the mysql header files, which you need in order to build the Python and Ruby modules.</p>

<p>You have 2 basic options:</p>

<ol>
<li>Download the &#8220;MAMP_components&#8221; zip (155MB) , and extract the mysql source files. i often used to do this, but the Python module needed a compiled lib and I was lazy so&#8230;</li>
<li>Download the tar.gz version of Mysql compiled for OSX from http://dev.mysql.com/downloads/mysql/</li>
</ol>

<p>Whichever option you choose, the next steps are generally the same:</p>

<h2>Copy The Files</h2>

<h3>Where to copy the files ?</h3>

<p>mysql_config is your friend. at least the MAMP one is.</p>

<p>Make sure you can call the right mysql_config, and it&#8217;ll tell you where the files you copy should be stashed. Since we&#8217;re building against MAMP we need to make sure we&#8217;re referencing MAMP&#8217;s mysql_config</p>

<p><code>
iPod:~jvanasco$ which myqsl_config
/Applications/MAMP/Library/bin/mysql_config</p>

<p>iPod:~jvanasco$ mysql_config
Usage: /Applications/MAMP/Library/bin/mysql_config [OPTIONS]
Options:
        --cflags         [-I/Applications/MAMP/Library/include/mysql  -fno-omit-frame-pointer   -D_P1003_1B_VISIBLE -DSIGNAL_WITH_VIO_CLOSE -DSIGNALS_DONT_BREAK_READ -DIGNORE_SIGHUP_SIGQUIT  -DDONT_DECLARE_CXA_PURE_VIRTUAL]
        --include        [-I/Applications/MAMP/Library/include/mysql]
        --libs           [-L/Applications/MAMP/Library/lib/mysql -lmysqlclient -lz -lm]
        --libs_r         [-L/Applications/MAMP/Library/lib/mysql -lmysqlclient_r -lz -lm]
        --plugindir      [/Applications/MAMP/Library/lib/mysql/plugin]
        --socket         [/Applications/MAMP/tmp/mysql/mysql.sock]
        --port           [3306]
        --version        [5.1.44]
        --libmysqld-libs [-L/Applications/MAMP/Library/lib/mysql -lmysqld -ldl  -lz -lm]
</code></p>

<h3>Include</h3>

<p>Into /Applications/MAMP/include you need to place the mysql include files into a subdirectory called &#8220;mysql&#8221;</p>

<p><code>
mkdir -P /Applications/MAMP/Library/include
cp -Rp MySQL-Distribution/include /Applications/MAMP/Library/include/mysql
</code></p>

<h3>Lib</h3>

<p>Into /Applications/MAMP/Library/lib you need to place the mysql lib files</p>

<p><code>
mkdir -P /Applications/MAMP/Library/include
cp -Rp MySQL-Distribution/lib /Applications/MAMP/Library/lib/mysql
</code></p>

<h2>Configure the Env / Installers</h2>

<p>Note: if you&#8217;re installing for a virtualenv, this needs to be done after it&#8217;s been activated.</p>

<p>Set the archflags on the commandline:</p>

<p><code>
export ARCHFLAGS="-arch $(uname -m)"
</code></p>

<h3>Python Module</h3>

<p>I found that the only way to install the module is by downloading the source ( off sourceforge! ).</p>

<p>I edited site.cfg to have this line:</p>

<p><code>
mysql_config = /Applications/MAMP/Library/bin/mysql_config
</code></p>

<p>Basically, you just need to tell mysql to use the MAMP version of mysql_config to figure everything out itself.</p>

<p>the next steps are simply:</p>

<p><code>
python setup.py build
python setup.py install
</code></p>

<p>If you get any errors, pay close attention to the first few lines.</p>

<p>If you see something like the following within the first 10-30 lines, it means the various files we placed in the step above are not where the installer wants them to be:</p>

<p><code>
_mysql.c:36:23: error: my_config.h: No such file or directory
_mysql.c:38:19: error: mysql.h: No such file or directory
_mysql.c:39:26: error: mysqld_error.h: No such file or directory
_mysql.c:40:20: error: errmsg.h: No such file or directory
</code></p>

<p>If you look up a few lines, you might see something like this:</p>

<p><code>
building '<em>mysql' extension
gcc-4.0 -fno-strict-aliasing -fno-common -dynamic -g -O2 -DNDEBUG -g -O3 -arch i386 -Dversion_info=(1,2,3,'final',0) -D</em>_version__=1.2.3 -I/Applications/MAMP/Library/include/mysql -I/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7 -c _mysql.c -o build/temp.macosx-10.5-i386-2.7/_mysql.o -fno-omit-frame-pointer -D_P1003_1B_VISIBLE -DSIGNAL_WITH_VIO_CLOSE -DSIGNALS_DONT_BREAK_READ -DIGNORE_SIGHUP_SIGQUIT -DDONT_DECLARE_CXA_PURE_VIRTUAL
</code></p>

<p>note how we see &#8220;/Applications/MAMP/Library/include/mysql&#8221; in there.  When I quickly followed some instructions online that had all the files in /include &#8212; and not in that subdir &#8212; this error popped up.  Once I changed the directory structure to match what my mysql_config wanted, the package installed perfectly.</p>

<h3>Ruby Gem</h3>

<p>Assuming you&#8217;re using bundler:</p>

<p><code>
bundle config build.mysql \
                --with-mysql-include=/Applications/MAMP/Library/include/mysql/ \
                --with-mysql-lib=/Applications/MAMP/Library/lib \
                --with-mysql-config=/Applications/MAMP/Library/bin/mysql_config
</code></p>

<p>and then before you do a <code>bundle install</code> , set the env vars</p>

<p><code></p>

<blockquote>
  <p>export ARCHFLAGS="-arch x86_64" 
  </code></p>
</blockquote>

<p>or</p>

<p><code></p>

<blockquote>
  <p>export ARCHFLAGS="-arch $(uname -m)"
  </code></p>
</blockquote>

<h2>Test it</h2>

<p>If things install nicely, lets make sure it works&#8230;</p>

<p><code>
$ipod:~ jvanasco$ python</p>

<blockquote>
  <blockquote>
    <blockquote>
      <p>import _mysql
      </code></p>
    </blockquote>
  </blockquote>
</blockquote>

<p>Oh , crap:</p>

<p><code>
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "build/bdist.macosx-10.5-i386/egg/_mysql.py", line 7, in <module>
  File "build/bdist.macosx-10.5-i386/egg/_mysql.py", line 6, in <strong>bootstrap</strong>
ImportError: dlopen(/Users/jvanasco/.python-eggs/MySQL_python-1.2.3-py2.7-macosx-10.5-i386.egg-tmp/_mysql.so, 2): Library not loaded: libmysqlclient.18.dylib
  Referenced from: /Users/jvanasco/.python-eggs/MySQL_python-1.2.3-py2.7-macosx-10.5-i386.egg-tmp/_mysql.so
  Reason: image not found
</code></p>

<p>Basically what&#8217;s happening is that as you run it, mysql_python drops a shared object in your userspace. That shared object is referencing the location that the Mysql.org distribution placed all the library files &#8212; which differs from where we placed them in MAMP.</p>

<p>There&#8217;s a quick fix &#8212; add this to your bash profile, or run it before starting mysql/your app:</p>

<p><code>export DYLD_LIBRARY_PATH="$DYLD_LIBRARY_PATH:DYLD_LIBRARY_PATH=/Applications/MAMP/Library/lib/mysql"
</code></p>

<h1>Conclusion</h1>

<p>There are too many posts on this subject matter to thank.  A lot of people posted variations of this method &#8211; to which I&#8217;m very grateful &#8211; however no one addressed troubleshooting the Python process , which is why I posted this.</p>

<p>I also can&#8217;t stress the simple fact that if the MAMP distribution contained the header and built library files, none of this would be necessary.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.destructuring.net/2012/01/04/python-fu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Facebook Developer Notes &#8211; Javascript SDK and Asynchronous Woes</title>
		<link>http://www.destructuring.net/2011/12/08/facebook-developer-notes-javascript-sdk-and-asynchronous-woes/</link>
		<comments>http://www.destructuring.net/2011/12/08/facebook-developer-notes-javascript-sdk-and-asynchronous-woes/#comments</comments>
		<pubDate>Thu, 08 Dec 2011 20:30:49 +0000</pubDate>
		<dc:creator>Jonathan</dc:creator>
				<category><![CDATA[Code - JavaScript]]></category>
		<category><![CDATA[Social Media]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.destructuring.net/?p=495</guid>
		<description><![CDATA[I&#8217;m quickly prototyping something that needs to interact with Facebook&#8217;s API and got absolutely lost by all their documentation &#8211; which is plentiful, but poorly curated. I lost a full day of time trying to figure out why my code [...]]]></description>
			<content:encoded><![CDATA[<div class="AWD_like_button "><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.destructuring.net%2F2011%2F12%2F08%2Ffacebook-developer-notes-javascript-sdk-and-asynchronous-woes%2F&amp;send=false&amp;layout=standard&amp;width=&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=arial&amp;height=40" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:px; height:40px;" allowTransparency="true"></iframe></div><p>I&#8217;m quickly prototyping something that needs to interact with Facebook&#8217;s API and got absolutely lost by all their documentation &#8211; which is plentiful, but poorly curated.</p>

<p>I lost a full day of time trying to figure out why my code wasn&#8217;t doing what I wanted it to do, trying to understand how it works so I could figure out what I was actually telling it to do.  I eventually hit the &#8220;ah ha!&#8221; moment where I realized that by following the Facebook &#8220;getting started&#8221; guides, I was telling my code to do embarrassingly stupid things.  This all tends to dance around the execution order , which isn&#8217;t really documented at all.  Everything below should have been very obvious &#8212; and would have been obvious, had I not gone through the &#8220;getting started&#8221; guides, which really just throws you off track.</p>

<p>Here&#8217;s a collection of quick notes that I&#8217;ve made.</p>

<h2>Documentation Organization</h2>

<p>Facebook has made <em>a lot</em> of API changes over the past few years, and all the information is still up on their site&#8230; and out on the web.  While they&#8217;re (thankfully) still supporting deprecated features, their documentation doesn&#8217;t always say what is the preferred method or not &#8211; and the countless 3rd party tutorials and StackOverflow activity don&#8217;t either.  The &#8220;Getting Started&#8221; documentation and on-site + github code samples also doesn&#8217;t tie together with the API documentation well either.  If you go through the tutorials and demos, you&#8217;ll see multiple ways to handle a login/registration button&#8230; yet none seem to resemble what is going on in the API.  There&#8217;s simply no uniformity, consistency, or &#8216;official recommendations&#8217;.</p>

<p>I made the mistake of going through their demos and trying to &#8220;learn&#8221; their API.  That did more damage than good. Just jump into the <a href="https://developers.facebook.com/docs/reference/javascript/">Javascript SDK API Reference Documentation</a> itself.  After 20 minutes reading the API docs themselves, I realized what was happening under the hood&#8230; and got everything I needed to do working perfectly within minutes.</p>

<h2>Execution Order</h2>

<p>The Javascript SDK operations in the following manner:</p>

<ol>
<li>Define what happens on window.fbAsyncInit &#8211; the function the SDK will call once Facebook&#8217;s javascript code is fully loaded.  This requires, at the very least, calling the FB.init() routine.  FB.init() registers your app against the API and allows you to actually do things.</li>
<li>Load the SDK.  this is the few lines of code that start &#8220;(function(d){ var js, id = &#8216;facebook-jssdk&#8217;;&#8230;&#8221; .</li>
<li>Once loaded, the SDK will call &#8220;window.fbAsyncInit&#8221;</li>
<li>window.fbAsyncInit will call FB.init() , enabling the API for you.</li>
</ol>

<p>The important things to learn from this are :</p>

<ol>
<li>If you write any code that touches the FB namespace <em>before</em> the SDK is fully loaded (Step 3), you&#8217;ll get an error.</li>
<li>If you write any code that touches the FB namespace <em>before</em> FB.init() is called (Step 4), you&#8217;ll get an error.</li>
<li>You should assume that the entire FB namespace is off-limits until window.fbAsyncInit is executed.</li>
<li>You should probably not touch anything in the FB namespace until you call FB.init().</li>
</ol>

<p>This means that just about everything you want to do either needs to be:</p>

<ol>
<li>defined or run after FB.init()</li>
<li>defined or run with some sort of callback mechanism, after FB.init()</li>
</ol>

<p>That&#8217;s not hard to do, once you actually know that&#8217;s what you have to do.</p>

<h2>Coding Style / Tips</h2>

<p>The standard way the Facebook API is &#8216;instructed to integrated is to drop in a few lines of script.  The problem is that the how&amp;why this works isn&#8217;t documented well, and is not linked to properly on their site. Unless you&#8217;re trying to do exactly what the tutorials are for &#8211; or wanting to code specific Facebook API code on every page, you&#8217;ll probably get lost trying to get things to run in the order that you want.</p>

<p>Below I&#8217;ll mark up the Facebook SDK code and offer some of ideas on how to get coding faster than I did&#8230; I wasted a lot of time going through the Facebook docs, reading StackOverflow and reverse engineering a bunch of sites that had good UX integrations with Facebook to figure this out.</p>

<p><pre class="wp-code-highlight prettyprint">
// before loading the Facebook SDK, load some utility functions that you will write
&lt;script type=&quot;text/javascript&quot; language=&quot;javascript&quot; src=&quot;/js/fb_Utils.js&quot;&gt;&lt;/script&gt;
&lt;div id=&quot;fb-root&quot;&gt;&lt;/div&gt;
&lt;script&gt;
    // when Facebook's SDK is loaded, it calls &quot;window.fbAsyncInit&quot;
    // the SDK load is the second block of code below
    window.fbAsyncInit = function() {
        FB.init({
            appId      : 'YOUR_APP_ID', // App ID
            channelUrl : '//WWW.YOUR_DOMAIN.COM/channel.html', // Channel File
            status     : true, 
            cookie     : true,
            xfbml      : true,
            oauth      : true 
        });
        // Additional initialization code here
        // ----------------------
        // ----------------------
        // the above is the fairly standard example from Facebook
        // now we'll do something custom 
        // we want to wrap all our facebook init stuff within a function that runs post async, but is cached across the site
        fb_Utils.initialize();
    };
    // this block actually loads the SDK
    (function(d){
       var js, id = 'facebook-jssdk'; if (d.getElementById(id)) {return;}
       js = d.createElement('script'); js.id = id; js.async = true;
       js.src = &quot;//connect.facebook.net/en_US/all.js&quot;;
       d.getElementsByTagName('head')[0].appendChild(js);
     }(document));<br />
&lt;/script&gt;
</pre></p>

<p>One of the move annoying things I encountered, is that Facebook has that little, forgettable, line in their examples that read:</p>

<p><pre class="wp-code-highlight prettyprint">
// Additional initialization code here
</pre></p>

<p>You might have missed that line, or not understood its meaning.  It&#8217;s very easy to do, as its quite forgettable.</p>

<p>That line could really be written better as :</p>

<p><pre class="wp-code-highlight prettyprint">
// Additional initialization code here
// NEARLY EVERYTHING YOU WRITE AGAINST THE FACEBOOK API NEEDS TO BE INITIALIZED / DEFINED / RUN HERE.
// YOU EITHER NEED TO INCLUDE YOUR CODE IN HERE, OR SET IT TO RUN AFTER THIS BLOCK HAS EXECUTED ( VIA CALLBACKS, STACKS, ETC ).
// (sorry for yelling, but you get the point)
</pre></p>

<p>So, let&#8217;s explore some ways to make this happen&#8230;</p>

<p>In the code above I called fb_Utils.initialize() , which would have been defined in /js/fb_Utils.js (or any other file) as something like this:</p>

<p><pre class="wp-code-highlight prettyprint">
// grab a console for quick logging
var console = window['console'];</p>

<p>// i originally ran into a bunch of issues where a function would have been called before the Facebook API inits. 
// the two ideas i had were to either:
// 1) pass calls through a function that would ensure we already initialized, or use a callback to retry on intervals
// 1) pass calls through a function that would ensure we already initialized, or pop calls into an array to try after initialization
// seems like both those ideas are popular, with dozens of variations on each used across popular sites on the web
// i'll showcase some of them below</p>

<p>var fb_Utils= {
    _initialized : false
    ,
    isInitialized: function() {
        return this._initialized;
    }
    ,
    // wrap all our facebook init stuff within a function that runs post async, but is cached across the site
    initialize : function(){
        // if you wanted to , you could migrate into this section the following codeblock from your site template:
        // -- FB.init({
        // --    appId : 'app_id'
        // --    ...
        // -- });
        // i looked at a handful of sites, and people are split between calling the facebook init here, or on their templates
        // personally i'm calling it from my templates for now, but only because i have the entire section driven by variables</p>

<pre><code>    // mark that we've run through the initialization routine
    this._initialized= true;

    // if we have anything to run after initialization, do it.
    while ( this._runOnInit.length ) { (this._runOnInit.pop())(); }
}
,
// i checked StackOverflow to see if anyone had tried a SetTimeout based callback before, and yes they did.
// link - http://facebook.stackoverflow.com/questions/3548493/how-to-detect-when-facebooks-fb-init-is-complete
// this works like a charm
// just wrap your facebook API commmands in a fb_Utils.ensureInit(function_here) , and they'll run once we've initialized
ensureInit :  function(callback) {
    if(!fb_Utils._initialized) {
        setTimeout(function() {fb_Utils.ensureInit(callback);}, 50);
    } else {
        if(callback) { callback(); }
    }
}
,
// our other option is to create an array of functions to run on init
_runOnInit: []
,
// we can then wrap items in fb_Utils.runOnInit(function_here) , and they
runOnInit: function(f) {
    if(this._initialized) {
        f();
    } else {
        this._runOnInit.push(f);
    }       
},
// a few of the Facebook demos use a function like this to illustrate the api
// here, we'll just wrap the FB.getLoginStatus call , along with our standard routines, into fb_Utils.handleLoginStatus()
// the benefit/point of this, is that you have this routine nicely compartmentalized, and can call it quickly across your site
handleLoginStatus : function(){
        FB.getLoginStatus(
            function(response){
                console.log('FB.getLoginStatus');
                console.log(response);
                if (response.authResponse) {
                    console.log('-authenticated');
                } else {
                    console.log('-not authenticated');
                }
            }
        );
    }
, 
// this is a silly debug tool , which we'll use below in an example
event_listener_tests : function(){  
    FB.Event.subscribe('auth.login', function(response){
      console.log('auth.login');
      console.log(response);
    });
    FB.Event.subscribe('auth.logout', function(response){
          console.log('auth.logout');
          console.log(response);
    });
    FB.Event.subscribe('auth.authResponseChange', function(response){
          console.log('auth.authResponseChange');
          console.log(response);
    });
    FB.Event.subscribe('auth.statusChange', function(response){
          console.log('auth.statusChange');
          console.log(response);
    });
}
</code></pre>

<p>}
</pre></p>

<p>So, with some fb_Utils code like the above, you might do the following to have all your code nicely asynchronous:</p>

<ol>
<li>Within the body of your html templates, you can call functions using ensureInit()</li>
</ol>

<p><pre class="wp-code-highlight prettyprint">
fb_Utils.ensureInit(fb_Utils.handleLoginStatus)
fb_Utils.ensureInit(function(){alert(&quot;I'm ensured, but not insured, to run sometime after initialization occurred.);})
</pre></p>

<ol>
<li>When you activate the SDK &#8211; probably in the document &#8216;head&#8217; &#8211; you can decree which commands to run after initialization:
<pre class="wp-code-highlight prettyprint">
window.fbAsyncInit = function() {
// just for fun, imagine that FB.init() is located within the fb_Utils.initialize() function
FB.init({});
fb_Utils.runOnInit(fb_Utils.handleLoginStatus)
fb_Utils.runOnInit(function(){alert(&quot;When the feeling is right, i'm gonna run all night. I'm going to run to you.&quot;);})
fb_Utils.initialize();
};
</pre></li>
</ol>

<h2>Concluding Thoughts</h2>

<p>I&#8217;m not sure if I prefer the timeout based &#8220;ensureInit&#8221; or the stack based &#8220;runOnInit&#8221; concept more. Honestly, I don&#8217;t care. There&#8217;s probably a better method out there, but these both work well enough.</p>

<p>In terms of what kind of code should go into the fb_Utils and what should go in your site templates &#8211; that&#8217;s entirely a function of your site&#8217;s traffic patterns &#8212; and your decision of whether-or-not a routine is something that should be minimized for the initial page load or tossed onto every visitor.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.destructuring.net/2011/12/08/facebook-developer-notes-javascript-sdk-and-asynchronous-woes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fancy Blenders</title>
		<link>http://www.destructuring.net/2011/05/15/fancy-blenders/</link>
		<comments>http://www.destructuring.net/2011/05/15/fancy-blenders/#comments</comments>
		<pubDate>Sun, 15 May 2011 19:32:53 +0000</pubDate>
		<dc:creator>Jonathan</dc:creator>
				<category><![CDATA[Thoughts]]></category>

		<guid isPermaLink="false">http://www.destructuring.net/?p=492</guid>
		<description><![CDATA[I&#8217;m looking into the top blenders out there; there seems to be many pros &#38; cons with the VitaMix and the BlendTec. Most notably I&#8217;ve found this: VitaMix Great Warranty &#8211; 7 years The motor has issues for many people [...]]]></description>
			<content:encoded><![CDATA[<div class="AWD_like_button "><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.destructuring.net%2F2011%2F05%2F15%2Ffancy-blenders%2F&amp;send=false&amp;layout=standard&amp;width=&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=arial&amp;height=40" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:px; height:40px;" allowTransparency="true"></iframe></div><p>I&#8217;m looking into the top blenders out there; there seems to be many pros &amp; cons with the VitaMix and the BlendTec. Most notably I&#8217;ve found this:</p>

<p>VitaMix</p>

<ul>
<li>Great Warranty &#8211; 7 years</li>
<li>The motor has issues for many people &#8211; like burning out or needing a rest period &#8211; its just not as &#8220;industrial&#8221; as many thing.</li>
<li>Most people need to use the stirring tool to blend</li>
<li>Not many bad reviews on the Amazon page, but many people on the BlendTec page mention &#8220;trading up&#8221; from it.</li>
</ul>

<p>BlendTec</p>

<ul>
<li>Warranty isn&#8217;t as great</li>
<li>Seems to blend faster for everyone.</li>
<li>The reviews are great, but some people have owned several units</li>
</ul>

<p><SCRIPT charset="utf-8" type="text/javascript" src="http://ws.amazon.com/widgets/q?rt=ss_mfw&#038;ServiceVersion=20070822&#038;MarketPlace=US&#038;ID=V20070822/US/destructuring-20/8001/c71e79ce-4663-48c1-85a6-c42bab7fa06f"></SCRIPT><NOSCRIPT><A HREF="http://ws.amazon.com/widgets/q?rt=ss_mfw&#038;ServiceVersion=20070822&#038;MarketPlace=US&#038;ID=V20070822%2FUS%2Fdestructuring-20%2F8001%2Fc71e79ce-4663-48c1-85a6-c42bab7fa06f&#038;Operation=NoScript">Amazon.com Widgets</A></NOSCRIPT></p>
]]></content:encoded>
			<wfw:commentRss>http://www.destructuring.net/2011/05/15/fancy-blenders/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Net Neutrality</title>
		<link>http://www.destructuring.net/2011/01/24/net-neutrality/</link>
		<comments>http://www.destructuring.net/2011/01/24/net-neutrality/#comments</comments>
		<pubDate>Mon, 24 Jan 2011 01:16:01 +0000</pubDate>
		<dc:creator>Jonathan</dc:creator>
				<category><![CDATA[Politics]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Work]]></category>

		<guid isPermaLink="false">http://www.destructuring.net/?p=489</guid>
		<description><![CDATA[Net Neutrality is an increasingly popular topic for debate: Consumer advocates preaching about the freedom of choice; lobbyists preach about the freedom of markets; millions of people sit on the sidelines and wonder what they hell they&#8217;re talking about. While [...]]]></description>
			<content:encoded><![CDATA[<div class="AWD_like_button "><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.destructuring.net%2F2011%2F01%2F24%2Fnet-neutrality%2F&amp;send=false&amp;layout=standard&amp;width=&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=arial&amp;height=40" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:px; height:40px;" allowTransparency="true"></iframe></div><p>Net Neutrality is an increasingly popular topic for debate: Consumer advocates preaching about the freedom of choice; lobbyists preach about the freedom of markets; millions of people sit on the sidelines and wonder what they hell they&#8217;re talking about.  While I can appreciate the arguments from each stakeholder, I&#8217;ve come to find both rather moot as internet tiering seems to be more a symptom of a larger economic problems than an actual issue itself.  Net Neutrality isn&#8217;t a battle about the rights of internet consumers, its about the decline of innovation in the American economy.</p>

<p>Once upon a time ( in a land far far away), companies would compete for consumer dollars based on the strength of their products.  The best /whatever/ were solid pieces of machinery that would last for years as the focus of innovation was to create better products.  Most people are all too familiar with buying a modern day kitchen appliance that barely lasts a few years, while their parents regularly use products that are decades old.</p>

<p>At some point in time there was a cultural shift in America and we collectively decided to stop making purchases based on the strength of products, but instead on price.  At the same time, corporations started to focus exclusively on maximizing their profits &#8212; and we all became familiar with planned obsolescence, offshore labor, and eventually offshore customer support as we increasingly complained about inferior goods.</p>

<p>The typical American Company no longer cared to innovate on the strength of their products, and instead focused on their financial statements &#8212; trying to make products as cheaply as possible. People began to not care they&#8217;d have to replace their blenders every year, because an unserviceable chinese made appliance was cheap enough to not care about how long it lasted.  Unfortunately, we all learned the real costs involved on the third, fourth and fifth times we replaced any given appliance.</p>

<p>I doubt manufacturers consciously aimed to reduce quality at first, they simply didn&#8217;t care about it anymore; quality was an early casualty of minimizing costs.  At some point though, marketers realized that they could position multiple lines of products &#8212; using a lower price point of disposable goods to inflate the prices of better made products, and encouraging consumers to trade-up to the higher priced model.</p>

<p>Over several decades, the general focus of what we innovate on &#8212; across our entire economy &#8212; has shift from <em>what</em> we make, to <em>how</em> we make and market it.  American products are no longer as well made as they once were; in fact, many are not even made in America, they&#8217;re merely designed or managed within US borders, and manufactured outside.</p>

<p>Our capacity to innovate has shifted focus so much onto Costs and Marketing that an entire industry has grown around virtual goods.  No, I&#8217;m not talking about the million dollar digital goods purchased in online games &#8212; I&#8217;m referring to the 1.2 quadrillion dollar &#8220;financial derivatives&#8221; market that nearly collapsed the US economy.  Financial derivatives aren&#8217;t products that are linked to tangible goods, they&#8217;re essentially complex methods of valuing trading loan repayment obligations.  An entire industry worth not millions, billions or trillions &#8212; but quadrillions &#8212; was created on the premise of selling different types of billing arrangements.</p>

<p>Financial Derivatives are merely an example of our shift from tangible products to intangible transaction-oriented &#8216;products&#8217;.  US based Bank of America and Wells Fargo both recently lost class action lawsuits for creating illegal &#8220;billing products&#8221; in which their customers banking activity was processed in a way to maximize overdraft fees.  While a customer&#8217;s deposits would be processed in a chronological order, their withdrawals would be reordered into a &#8220;largest to smallest&#8221; list.  This created an abusive and aggressive situation in which multiple overdraft fees and penalty charges would occur.  Instead of figuring out ways to lower fees or provide better service, Bank of America and Wells Fargo decided to innovate on how they bill their customers.</p>

<p>Telecommunication companies have operated in a similar manner.  If you have a multi-year Cellular or Internet Service contract, you might note that your service has remained the exact same, while you have an increasing number of plans or service changes disclosed in your bills.  It&#8217;s not uncommon to have an &#8216;unlimited&#8217; plan suddenly capped at a very limited number; or learn that you now have your choice of 3 different ways to be billed for the exact same phone service.  Instead of addressing the countless dropped calls or 2 week wait for customer service appointments, telecommunications companies have pushed their capacity to innovate into their billing department.</p>

<p>In modern times we use the term &#8220;billing products&#8221; to discuss these types of innovations, but historically this has been called &#8220;Rent Seeking (Activities)&#8221;.  For those unfamiliar with the term, Rent Seeking is when an organization uses their resources to obtain an economic gain, without actually creating any wealth.</p>

<p>While the financial derivatives crisis has shown itself to be outrageous, the Net Neutrality issues is nothing other than perverse.  For the first time in history, companies are actively lobbying for the ability to charge people for substantially worse service &#8211; and proud of it.</p>

<p>The argument for Tiered Internet Service isn&#8217;t one about free markets &#8211; in fact its the exact opposite , as its requires the manipulating of telecommunication resources &#8211; not to mention garnering government legal support.   Instead of spending their energy on faster downloads, larger bandwidth, or cheaper costs&#8230; these companies are spending tens of millions of dollars to lobby the government for the ability to charge consumers more money for worse service.  Instead of lowering their customer&#8217;s bills or improving their service through technological advances, companies like Comcast, Verizon and AT&amp;T are spending time, energy and resources to  argue for the ability to charge additional fees for improvements on a degraded service.  Even in a purely capitalistic sense, this is a terrible idea &#8212; its an implicit sign to stockholders that these companies are technologically unable to compete for products, so must instead find new ways to bill.</p>

<p>I&#8217;m simply amazed that no one is discussing the situation around Net Neutrality from the larger economic context.  Many people like to talk about the core of the American economy shifting from product to service based, but the service aspects have increasingly proven to be a midpoint on a larger shift &#8212; one in which Rent Seeking is a major component.  The presence of Rent Seeking Activity has historically been one of the best indicators of substantial economic and governmental problems one can find, if you can find it.  Today we&#8217;re in a cultural moment where this sort of activity isn&#8217;t happening behind-the-scenes , but its being publicly embraced and hailed as an ideal by its benefactors.  Our economy has embraced a shift away from innovating on goods and creating better products that push our civilization forward, to one that is just trying to bill people differently.  To me, this isn&#8217;t troubling, it&#8217;s terrifying.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.destructuring.net/2011/01/24/net-neutrality/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

