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

<channel>
	<title>Jeff Sayre Webtrepreneur</title>
	<atom:link href="http://jeffsayre.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://jeffsayre.com</link>
	<description>Thoughts on startups, leadership, the Web, and disruptive technologies</description>
	<lastBuildDate>Thu, 29 Jul 2010 14:34:32 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		<atom:link rel="next" href="http://jeffsayre.com/feed/?page=2" />

		<item>
		<title>WordPress Hook Sniffer v0.14 Released!</title>
		<link>http://jeffsayre.com/2010/07/28/wordpress-hook-sniffer-v0-14-released/</link>
		<comments>http://jeffsayre.com/2010/07/28/wordpress-hook-sniffer-v0-14-released/#comments</comments>
		<pubDate>Wed, 28 Jul 2010 14:34:44 +0000</pubDate>
		<dc:creator>Jeff Sayre</dc:creator>
				<category><![CDATA[BuddyPress]]></category>
		<category><![CDATA[Social Media & Semantic Web]]></category>
		<category><![CDATA[developers]]></category>
		<category><![CDATA[WordPress Plugins]]></category>

		<guid isPermaLink="false">http://jeffsayre.com/?p=710</guid>
		<description><![CDATA[As I posted about ten-days ago, my WordPress Hook Sniffer had a cold, its sniffer all clogged up and not functioning properly. Today, I release a once-again healthy, new and improved Hook Sniffer plugin for all WordPress plugin developers. There are a number of nice improvements.
(You can download the latest version of WordPress Hook Sniffer [...]]]></description>
			<content:encoded><![CDATA[<p>As I posted about ten-days ago, <a href="http://jeffsayre.com/2010/07/17/important-developers-notice-please-deactivate-wordpress-hook-sniffer-for-the-time-being/">my WordPress Hook Sniffer had a cold</a>, its sniffer all clogged up and not functioning properly. Today, I release a once-again healthy, new and improved Hook Sniffer plugin for all WordPress plugin developers.<span id="more-710"></span> There are a number of nice improvements.</p>
<p>(You can <a href="http://wordpress.org/extend/plugins/wordpress-hook-sniffer/">download the latest version of WordPress Hook Sniffer here</a>. Please read the readme.txt file for important usage and installation notes.)</p>
<p>After the bug fixes, the most noticeable improvement is that you no longer need to manually install the modified plugin.php file&mdash;the file that gives hook sniffer its abilities. The plugin now automatically installs the modified plugin.php file upon plugin activation and then reinstalls the original, stock WP version of the /wp-includes/plugin.php file upon plugin deactivation. This means that when you deactivate the plugin, you can rest assured that WP Hook Sniffer no longer has any influence over the operation of WordPress.</p>
<p>As there are important differences between the /wp-includes/plugin.php files of WP 2.9.2 and WP 3.0, WP Hook Sniffer now requires WordPress 3.0. Upon activation, an automatic version check is performed to make sure that WP Hook Sniffer is installed on the proper version of WordPress. If the plugin is installed on an older version of WordPress, it will not run. A warning message is displayed in the Plugins directory and in the WP Hook Sniffer Settings screen.</p>
<p>Also, I’ve versioned the modified plugin.php file that comes with WP Hook Sniffer. Now, when you activate the plugin, it runs a check to make sure that the proper version of the modified plugin.php file is installed in /wp-includes.</p>
<p>Finally, I added a CSS file to improve proper code separation&ndash;the older version simply had inline CSS definitions&ndash;and renamed all CSS selectors to make them unique to the plugin.</p>
<p>If WordPress Hook Sniffer has become an indispensable tool in your WP plugin development toolkit, please donate to help me keep this plugin updated and its sniffer healthy! Thank you!</p>
<div class="paypal_button">
<form action="https://www.paypal.com/cgi-bin/webscr" method="post">
<input type="hidden" name="cmd" value="_s-xclick"/>
<input type="hidden" name="hosted_button_id" value="VTHMENKR9ZWB4"/>
<table>
<tr>
<td>
<input type="hidden" name="on0" value="Sponsorship Levels"/>Sponsorship Levels</td>
</tr>
<tr>
<td>
<select name="os0">
							<option value="Supporter">Supporter $15.00</option><br />
							<option value="Donor">Donor $25.00</option><br />
							<option value="Sponsor">Sponsor $50.00</option><br />
							<option value="Benefactor">Benefactor $100.00</option><br />
							<option value="Patron">Patron $250.00</option><br />
							<option value="Open Source Angel">Open Source Angel $500.00</option><br />
							<option value="Holy Cow!">Holy Cow! $1,000.00</option><br />
						</select>
</td>
</tr>
</table>
<input type="hidden" name="currency_code" value="USD"/>
<input type="image" src="https://www.paypal.com/en_US/i/btn/btn_paynowCC_LG.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!"/>
						<img alt="" border="0" src="https://www.paypal.com/en_US/i/scr/pixel.gif" width="1" height="1"/><br />
					</form>
<p><em>If you are a corporate user, consultant, plugin developer, or theme designer and profit from using my plugin, please consider donating at one of the upper levels. Thank you!</em></p>
</p></div>
]]></content:encoded>
			<wfw:commentRss>http://jeffsayre.com/2010/07/28/wordpress-hook-sniffer-v0-14-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Important Developers&#8217; Notice:  Please deactivate WordPress Hook Sniffer for the time being</title>
		<link>http://jeffsayre.com/2010/07/17/important-developers-notice-please-deactivate-wordpress-hook-sniffer-for-the-time-being/</link>
		<comments>http://jeffsayre.com/2010/07/17/important-developers-notice-please-deactivate-wordpress-hook-sniffer-for-the-time-being/#comments</comments>
		<pubDate>Sat, 17 Jul 2010 16:26:52 +0000</pubDate>
		<dc:creator>Jeff Sayre</dc:creator>
				<category><![CDATA[BuddyPress]]></category>
		<category><![CDATA[developers]]></category>
		<category><![CDATA[WordPress Plugins]]></category>

		<guid isPermaLink="false">http://jeffsayre.com/?p=703</guid>
		<description><![CDATA[If you are using my WordPress Hook Sniffer plugin, I ask that you please deactivate it at this time and remove the modified plugin.php file&#8211;the one that comes with the plugin&#8211;replacing it with the original version that ships with WordPress. Make sure that you use the one that comes with the version of WordPress you [...]]]></description>
			<content:encoded><![CDATA[<p>If you are using my WordPress Hook Sniffer plugin, I ask that you please deactivate it at this time and remove the modified plugin.php file&ndash;the one that comes with the plugin&ndash;replacing it with the original version that ships with WordPress.<span id="more-703"></span> Make sure that you use the one that comes with the version of WordPress you are running.</p>
<p>I have been having a few issues with BuddyPress development over the past week. I went through all the usual techniques to isolate the issue, finally deactivating all my 3rd-party plugins. But, the issue remained. Finally, I wondered about my WordPress Hook Sniffer plugin. I realized that although it was deactivated, it might be negatively affecting the operation of WordPress if the modified plugin.php file that comes with the plugin had issues. I replaced the modified version of plugin.php with the original one that ships with my version of WordPress, and bingo, the issues went away. All I could think was crap&mdash;especially as I say this in the installation instructions:</p>
<p>&#8220;The modifications to WordPress’ standard Plugin API file are used exclusively for WordPress Hook Sniffer. They should not affect the functioning of the rest of WordPress.&#8221;</p>
<p>In fact, this statement is still technically correct. The culprit is that when I updated the modified plugin.php file for last week&#8217;s version 0.13 update to the WP Hook Sniffer, I failed to use the proper base plugin.php file. I used the one that ships with WP 2.9.2 and not WP 3.0. Even though I thought I had done a sufficient parity check between these two files, I had failed to notice a few important changes.</p>
<p><strong>WordPress Core Developers please note</strong>: if you change a function you should indicate as much in the inline documentation. Please use the <a href="http://manual.phpdoc.org/HTMLSmartyConverter/HandS/phpDocumentor/tutorial_tags.version.pkg.html">@version PHPDocumenter tag</a> to indicate that the function has changed.  The @since tag version indicator is not helpful if the function has changed.</p>
<p>What issues did I have that caused me to discover this problem? The WordPress &#8220;wp&#8221; action hook was not firing. Yep. That is a big problem, especially if you are doing development work. Interestingly enough, most of BuddyPress continued to function as expected, except for a few features that used to work but suddenly stopped working&mdash;right at the time I installed the updated version of WP Hook Sniffer. Of course, I failed to notice this for several days.</p>
<p>I have gone through the stock plugin.php file&ndash;with a very fine-toothed comb&ndash;and ferreted out all the changes. I am in the process of updating the modified plugin.php file that WP Hook Sniffer is required to use. I want to make sure that it is adequatley tested before releasing an updated version. Look for the updated version with a fixed plugin.php file to be available either Sunday or Monday.</p>
<p>With this pending update, WordPress Hook Sniffer will require WordPress 3.0. Therefore, if you want to use it in an older version of WordPress, you will have to install Version 0.12 of WP Hook Sniffer. Please note, I will only support the most recent version of WordPress Hook Sniffer.</p>
<p>I apologize if this has caused you to lose valuable development time. I know that I have lost several days of productive coding due to this issue. There were obviously some important changes between WP 2.9.x and WP 3.0. Even though I thought I had properly assessed potential changes within the plugin.php file, I had not. I guess I need more sleep, more caffeine, fewer late-night alien visits, or some combination of those three.</p>
]]></content:encoded>
			<wfw:commentRss>http://jeffsayre.com/2010/07/17/important-developers-notice-please-deactivate-wordpress-hook-sniffer-for-the-time-being/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Thinking Outside the Privacy Box</title>
		<link>http://jeffsayre.com/2010/06/07/thinking-outside-the-privacy-box/</link>
		<comments>http://jeffsayre.com/2010/06/07/thinking-outside-the-privacy-box/#comments</comments>
		<pubDate>Mon, 07 Jun 2010 20:51:04 +0000</pubDate>
		<dc:creator>Jeff Sayre</dc:creator>
				<category><![CDATA[Social Media & Semantic Web]]></category>
		<category><![CDATA[foaf+ssl]]></category>
		<category><![CDATA[identiy 2.0]]></category>
		<category><![CDATA[privacy 2.0]]></category>
		<category><![CDATA[SocialWeb]]></category>
		<category><![CDATA[WebID]]></category>

		<guid isPermaLink="false">http://jeffsayre.com/?p=682</guid>
		<description><![CDATA[When it comes to issues of privacy and identity, the Web continues to experience growing pains. People speak of privacy and identity management as if they were separate issues. I believe that managing your personal identity is tantamount to managing your privacy. In effect, what is termed Privacy 2.0 and Identity 2.0 are really one [...]]]></description>
			<content:encoded><![CDATA[<p>When it comes to issues of privacy and identity, the Web continues to experience growing pains. People speak of privacy and identity management as if they were separate issues. I believe that managing your personal identity is tantamount to managing your privacy. In effect, what is termed Privacy 2.0 and Identity 2.0 are really one and the same thing.<span id="more-682"></span></p>
<p>There are differing software tools, protocols, and specifications in the Privacy 2.0 and Identity 2.0 realms. There are also differences between how corporations address privacy policy and identity management. But these are just semantically-packaged terms used for the convenience and profit of startups, conference organizers, rights advocates, and the gurus who coined the terms.</p>
<p>The reality is that, when looking at these supposedly disparate issues from the viewpoint of the individual, the differences disappear. And when looking at the topics of privacy and identity, in my opinion, the only viewpoint that matters is that of the individual.</p>
<p>So, privacy management tools and protocols are nothing more than identity management tools and protocols. Why is this the case?</p>
<p><strong>Defining Identity</strong></p>
<p>In David Kirkpatrick&#8217;s book, <em>The Facebook Effect</em>, Facebook founder Mark Zuckerberg states that “Having two identities for yourself is an example of a lack of integrity.&#8221; What Zuckerberg is actually saying is that having two accounts on Facebook, or any other social network, is a problem. Whereas this can be a real issue, Zuckerberg makes the same mistake that most people make&mdash;conflating a user&#8217;s account with their identity.</p>
<p>Identity is not a username and password combination. Identity is not your OpenID, WebID, Facebook, or Twitter account. Those are simply identifiers, of which a user may have many different ones across the Web, one for each social network site. In fact, as mentioned above, it is possible that a given individual might have more than one account, more than one identifier, at a given social network. These alternate accounts (referred to as alts for alternate “identities”), are just another aspect of the individual’s overall identity. Alts are not separate identities&mdash;no matter how much the owner of an alt identifier tries to make it.</p>
<p>Now, even if a user has carefully selected to join only those sites that offer the option to register via OpenID Connect, their single OpenID is not their identity. It is just an identifier. So, OpenID Providers are not identity providers, they are identifier providers.</p>
<p>What is identity on the Web, then? Identity is your presence strewn throughout the Web. It is the sum total of all your verified activity on the Web (blog, forum, and social network posts, video, music, and photo uploads, etcetera), your associated interactions with others, and their comments about and interactions with you. That makes up what can best be thought of as your identity graph.</p>
<p>When we talk about privacy control on the Web, then, we are not talking about the ability of users to totally control their identity graph. Obviously, a given user can theoretically control only part of their identity graph. Why is this the case? Because each user can exert only so much control over what someone on the Web thinks and says about them. That part of their identity graph is controlled by others.</p>
<p>So what are we trying to accomplish by allowing users partial access to and control over their identity graph? What kind of privacy, identity controls can reasonably be provided to users?</p>
<p><strong>The IdentitySpace: Privacy and Identity in a Semantic World</strong></p>
<p>From a user’s perspective, identity control on the Web is about offering fine-grained control over the data that they personally generate. It is not about offering tools to control their entire identity graph, to control the subset of their identity graph generated by others.</p>
<p>The IdentitySpace is that part of a user’s identity graph that they personally generated. It is the subset of their identity graph that they create, and therefore should own and have sole access to controlling.</p>
<p>Do users have any options for managing that part of their identity graph that is created and controlled by others? Yes. It is called reputation management and there are <a href="http://www.reputationdefender.com/">some fee-based services</a> that offer users some concrete means with which to do just that. But in a free society whenever two or more people are involved in creating an identity graph, it will never be possible for each individual to be able to control their entire identity graph.</p>
<p>This last issue is where a user’s <a href="http://blogs.sun.com/bblfish/entry/more_on_authorization_in_foaf">Web of Trust (WOT)</a> can help. By carefully choosing with whom a user interacts, they can build a network, a web, of trusted individuals. This web of trusted individuals can more easily vouch for the user’s reputation than a more loosely defined network of associates. This Web of Trust can also be used as part of an authorization framework that utilizes <a href="http://esw.w3.org/Foaf%2Bssl">FOAF+SSL</a> and <a href="http://esw.w3.org/WebID">WebIDs</a>.</p>
<p>In my perfect Web world, the IdentitySpace would be a global, distributed, decentralized dataspace which any one person, corporation, or government could access. The ACLs of each unique IdentitySpace&ndash;the datasets created, owned, and controlled by an individual user&ndash;would determine what subset of data a given query would return and how and where that data could be used. Individuals would be free to release more of their data for use, or restrict its consumption.</p>
<p>The key here is that users remain in control of their primary, personal data no matter where their Internet journeys and sojourns may take them. While a user would have little control over what other people may post about them, they would maintain control and ownership over the data that they personally generate. They would control their IdentitySpace. </p>
<p>There are existing ontologies and protocols in the Semantic Web stack that can readily be adopted to offer users the fine-grained identity management that they desire. A wonderful <a href="http://esw.w3.org/PrivacyAwareWeb">summation of these technologies can be found here</a>.</p>
<p><strong><em>See Also:</em></strong></p>
<p><a href="http://jeffsayre.com/2010/05/15/repackaging-the-promise-of-the-social-semantic-web/">Repackaging the Promise of the Social Semantic Web</a></p>
<p><a href="http://jeffsayre.com/2010/05/02/regaining-control-of-privacy-and-identity-it’s-up-to-each-individual/">Regaining Control of Privacy and Identity: It’s up to Each Individual</a></p>
<p><a href="http://jeffsayre.com/2010/01/11/privacy-in-the-facebook-era/">Privacy in the Facebook Era</a></p>
<p><a href="http://www.youtube.com/watch?v=QOEMv0S8AcA">A thought-provoking presentation on open source, freedom, privacy, and identity</a>. It&#8217;s by Eben Moglen, the founder, Director-Counsel, and Chairman of the Software Freedom Law Center.</p>
]]></content:encoded>
			<wfw:commentRss>http://jeffsayre.com/2010/06/07/thinking-outside-the-privacy-box/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>The Answer is Ebooks</title>
		<link>http://jeffsayre.com/2010/06/07/the-answer-is-ebooks/</link>
		<comments>http://jeffsayre.com/2010/06/07/the-answer-is-ebooks/#comments</comments>
		<pubDate>Mon, 07 Jun 2010 15:03:16 +0000</pubDate>
		<dc:creator>Jeff Sayre</dc:creator>
				<category><![CDATA[Publishing 2.0]]></category>
		<category><![CDATA[Books]]></category>
		<category><![CDATA[climate change]]></category>
		<category><![CDATA[nature]]></category>
		<category><![CDATA[publishing]]></category>

		<guid isPermaLink="false">http://jeffsayre.com/?p=678</guid>
		<description><![CDATA[One of numerous variables that are often overlooked in calculating the environmental impacts of any product replacement is ecosystem services. It is an exceedingly difficult variable to include as it encompasses additional subvariables, many of which are difficult to fully quantify.
As publishers and authors scramble to figure out which of the quickly-evolving publishing paradigms will [...]]]></description>
			<content:encoded><![CDATA[<p>One of numerous variables that are often overlooked in calculating the environmental impacts of any product replacement is ecosystem services. It is an exceedingly difficult variable to include as it encompasses additional subvariables, many of which are difficult to fully quantify.<span id="more-678"></span></p>
<p>As publishers and authors scramble to figure out which of the quickly-evolving publishing paradigms will take hold, the issue of what product type is greener&ndash;ebooks or paper books&ndash;keeps coming up. In my mind, there is no longer any debate. The answer is clear. Ebooks are the preferred choice. Here’s why.</p>
<p><strong>Looking Beyond Carbon</strong></p>
<p>My wife (as many of my readers know) is a <a href="http://www.aprilsayre.com/">successful children&#8217;s book author</a> primarily writing books about science and nature. Therefore, this issue is very close to our hearts. </p>
<p>Like most paper-based children’s books published these days, most of her books are sent overseas to be printed in Asia. One of our greatest fears about the sourcing of the paper used to print her books was recently confirmed: most of the paper used by Asian printers contains some pulp from virgin Indonesian rainforests.</p>
<p>This is absolutely devastating news to us. As avid naturalists who have literally spent thousands of hours in rainforests around the world, this confirmation of our fears hit us like a nail-riddled two-by-four in the face.</p>
<p>( See the Rainforest Action Network’s recently-released report, <a href="http://ran.org/sites/default/files/Turning_The_Page_on_Rainforest_Destruction.pdf"><em>Turning the Page<br />
on Rainforest Destruction: Children’s books and the future of Indonesia’s rainforests</em></a> )</p>
<p>The e-book versus treeware book calculations do not take into account the loss of ecosystem services from the destruction of complex, highly-biodiverse virgin rainforest habitat. Unlike virgin temperate forests that are not as complex or species diverse, tropical forest recovery is a significantly longer process, requiring centuries. In fact, it is not yet fully clear if a destroyed virgin tropical forest can actually recover.</p>
<p>Environmental calculations that simply compare carbon emissions are woefully myopic. The ecosystem services of forests are numerous. And when comparing temperate to tropical forest ecosystems, those factors are often multiplied many fold. I will not go into the various ecosystem services provided by virgin rainforest habitat. You can read the linked-to report to learn some of these.</p>
<p>Of course, we cannot turn our backs on the fact that books are printed on paper. Even before publishers started sending the majority of their children’s books overseas to be printed in Asia, we knew that forests in Europe and North America were being destroyed to print her books. Most of those forests, however, were non-virgin forests, having long ago been destroyed. We took some solace in the fact that very few virgin acres of temperate forest were being decimated for producing paper.</p>
<p>Yes, there are many environmental impacts of foresting, paper manufacturing, printing, and distribution of which the book publishing industry is complicit, but we rationalized that the environmental benefit of April’s message resulted in a net positive. With this recent revelation, the environmental calculus may have shifted to a net negative.</p>
<p>So the next time you read or hear a debate about the environmental costs of ebooks versus paper-based books, think about what is happening with the production of paper-based children’s books. When it comes to children’s books, we feel that the answer is clear. Paper-based children’s books need to be phased out. Paperless ebooks are the better alternative.</p>
<p><strong>What are We Doing About this Issue?</strong></p>
<p>As some of you know, <a href="http://www.binarybooks.com/">my project of the last several years</a> is to build a pioneering ebook venture that will redefine the concept of book publishing and sales in the Web 2.0 / Web 3.0 Internet age.</p>
<p>My resolve has been strengthened many fold with this unfortunate news. I am redoubling my efforts and will be unveiling our new publishing vision later this year.</p>
]]></content:encoded>
			<wfw:commentRss>http://jeffsayre.com/2010/06/07/the-answer-is-ebooks/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Repackaging the Promise of the Social Semantic Web</title>
		<link>http://jeffsayre.com/2010/05/15/repackaging-the-promise-of-the-social-semantic-web/</link>
		<comments>http://jeffsayre.com/2010/05/15/repackaging-the-promise-of-the-social-semantic-web/#comments</comments>
		<pubDate>Sat, 15 May 2010 20:23:27 +0000</pubDate>
		<dc:creator>Jeff Sayre</dc:creator>
				<category><![CDATA[Entrepreneurship & Leadership]]></category>
		<category><![CDATA[Social Media & Semantic Web]]></category>
		<category><![CDATA[data silos]]></category>
		<category><![CDATA[foaf+ssl]]></category>
		<category><![CDATA[identiy 2.0]]></category>
		<category><![CDATA[privacy 2.0]]></category>
		<category><![CDATA[WebID]]></category>

		<guid isPermaLink="false">http://jeffsayre.com/?p=671</guid>
		<description><![CDATA[I recently read Robert Scoble’s blog post, Privacy Reboot Needed. He makes a compelling case for the possible benefits accrued to each Web citizen that volunteers to expose their entire activity stream&#8211;across their various social networks&#8211;for all to see.
However, there is one comment that Robert makes at the end of his piece that demonstrates that [...]]]></description>
			<content:encoded><![CDATA[<p>I recently read Robert Scoble’s blog post, <a href="http://scobleizer.com/2010/05/15/privacy-reboot-needed/">Privacy Reboot Needed</a>. He makes a compelling case for the possible benefits accrued to each Web citizen that volunteers to expose their entire activity stream&ndash;across their various social networks&ndash;for all to see.<span id="more-671"></span></p>
<p>However, there is one comment that Robert makes at the end of his piece that demonstrates that we in the Social Semantic Web space have a ways to go to get our message across. He states that:</p>
<blockquote><p>If Facebook wants to be trusted it must make a privacy contract with its users that will have real consequences if Zuckerberg throws it under the bus. I don’t know what that looks like. This is why the alternatives to Facebook just don’t matter either. They all could break their privacy contract with us. Even Google or Microsoft could and we all know it. So, we’re just going to have to live in this new world where privacy is a myth.</p></blockquote>
<p>As someone who is tapped into the pulse of the InterWebs, Scoble’s statement was somewhat of a shock. How can Robert Scoble not have heard about the promise of distributed social networks powered by the Semantic Web? How can he not understand some of the virtues of a fully-actualized Social Semantic Web?</p>
<p>What he states is true only for Facebook alternatives that offer more of the same&mdash;the closed data silos that remain under the control of an entity other than its users. What he fails to mention are those proposals that will put each user back in control of their own identity, privacy, and data. The only way that a privacy contract could be broken in that scenario is if a user breaks it with him or herself.</p>
<p>There are a number of us Semantic Web / Linked Data folks who are working on bringing this ideal to fruition. As an example of one such proposal, see my article, <a href="http://jeffsayre.com/2010/02/24/a-flock-of-twitters-decentralized-semantic-microblogging/">A Flock of Twitters: Decentralized Semantic Microblogging</a>. Another recent proposal that has received significant attention is <a href="http://www.joindiaspora.com/">diaspora</a>.</p>
<p>User-centric, distributed platforms like these will remove the issue of who owns our data and who decides its fate as it will be each individual who controls, who owns their data. These platforms will be the next evolution of the Web. As I conclude in my article, A Flock of Twitters:</p>
<blockquote><p>It’s time to return to the original concept of the Web-based Internet—an interconnected, decentralized and distributed, open and independent cacophony of individuals who control their own Webspace, operate their own communication channel, and freely communicate with others without having to worry about a central point of failure&#8230;The only way [for that to happen] is by leveraging the power of the Semantic Web.</p></blockquote>
<p>The promise of a fully-actualized Social Semantic Web is to firmly place the control of one’s identity and privacy back into the hands of the Web’s citizens. If our work in making that dream come to reality is going to succeed, we must better craft our message, we must better communicate the virtues of a user-centric, user-controlled Social Semantic Web.</p>
<p><strong>Related Articles</strong></p>
<p><a href="http://jeffsayre.com/2010/05/02/regaining-control-of-privacy-and-identity-it’s-up-to-each-individual/">Regaining Control of Privacy and Identity: It’s up to Each Individual</a><br />
<a href="http://jeffsayre.com/2010/01/11/privacy-in-the-facebook-era/">Privacy in the Facebook Era</a><br />
<a href="http://jeffsayre.com/2010/02/17/flocking-to-the-stream/">Flocking To the Stream</a></p>
]]></content:encoded>
			<wfw:commentRss>http://jeffsayre.com/2010/05/15/repackaging-the-promise-of-the-social-semantic-web/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>The Growing Panoply of Specialty BuddyPress Developer and Administration Tools</title>
		<link>http://jeffsayre.com/2010/05/08/the-growing-panoply-of-specialty-buddypress-developer-and-administration-tools/</link>
		<comments>http://jeffsayre.com/2010/05/08/the-growing-panoply-of-specialty-buddypress-developer-and-administration-tools/#comments</comments>
		<pubDate>Sat, 08 May 2010 18:27:42 +0000</pubDate>
		<dc:creator>Jeff Sayre</dc:creator>
				<category><![CDATA[BuddyPress]]></category>
		<category><![CDATA[developers]]></category>
		<category><![CDATA[WordPress Plugins]]></category>

		<guid isPermaLink="false">http://jeffsayre.com/?p=658</guid>
		<description><![CDATA[When it comes to the availability of useful, specialty plugins for site administrators and plugin developers, BuddyPress may be approaching an interesting inflection point. Recently, several new plugins have been released that help site administrators better understand and manage their network or offer developers insight into vexing issues and help make coding their WordPress and [...]]]></description>
			<content:encoded><![CDATA[<p>When it comes to the availability of useful, specialty plugins for site administrators and plugin developers, BuddyPress may be approaching an interesting inflection point. Recently, several new plugins have been released that help<span id="more-658"></span> site administrators better understand and manage their network or offer developers insight into vexing issues and help make coding their WordPress and BuddyPress plugins a little easier.</p>
<p>These are not the normal, run-of-the-mill plugins that extend BuddyPress by adding additional functionality for a site’s members, or allow a site administrator to selectively alter the core functionality of BuddyPress. Instead, the plugins that I’m excited about are  specifically targeted to providing site administrators and developers with unique services. I call these tools to differentiate them from the general-purpose plugins.</p>
<p>Although there are currently only a handful of such tools available, I hope that these releases indicate a trend. The WordPress ecosystem needs more specialty tools for site administrators and plugin developers.</p>
<p>So, in no particular order of importance, here is a listing of the more interesting plugins that provide useful tools for the site administrator’s or developer’s toolbox.</p>
<p><strong>Developer Tools</strong></p>
<p><a href="http://jeffsayre.com/2010/04/29/introducing-wordpress-hook-sniffer-a-developer-plugin/ "><em>WordPress Hook Sniffer</em></a>: This is a tool I recently released that helps plugin developers determine the sequence in which action and filter functions are fired. It provides a window into the inner workings of the WordPress Plugin API and can help a developer figure out why a custom action or filter hook or function is not working as intended.</p>
<p><a href="http://wordpress.org/extend/plugins/demo-data-creator/"><em>Wordpress MU Demo Data Creator</em></a>: Provides a utility for populating your WPMU development sandbox database with dummy data. Why waste time creating your own dummy data to test your plugins when it can be auto generated for you.</p>
<p><a href="http://wordpress.org/extend/plugins/buddypress-skeleton-component/"><em>BuddyPress Skeleton Component</em></a>: This is not a new developer tool. In fact, as an example BuddyPress plugin component, it is the grand progenitor of many BuddyPress plugins.</p>
<p><a href="http://wordpress.org/extend/plugins/bp-template-pack/"><em>BuddyPress Template Pack</em></a>: This is not a developer’s tool per say. But I think it deserves listing nonetheless. It is actually a theme designer’s tool that helps make a custom WordPress theme compatible for use as a BuddyPress theme.</p>
<p><strong>Site Administrator Tools</strong></p>
<p><a href="http://teleogistic.net/code/buddypress/bp-system-report/"><em>BP System Report</em></a>: This tool gathers useful network intelligence on a site’s member and group activity. It provides a site administrator with usage trends and statistics, offering important insights into the health of their community.</p>
<p><a href="http://wordpress.org/extend/plugins/import-from-ning/"><em>Import from Ning</em></a>: I thought I should throw this one in as well as it is a tool that helps social network operators. It provides some utility in helping to migrate a Ning network to BuddyPress. As Ning does not offer too much help in migrating existing networks to competing platforms, this tool is not a panacea to your Ning-networking woes&mdash;but it is a great start!</p>
<p><strong>Plugin Developers Need Your Support</strong></p>
<p>Creating a high-quality plugin takes more time than most people realize. In fact, it can take as much time if not more than creating a top-quality theme. But plugin developers rarely receive the same financial rewards that premium theme designers do.</p>
<p>My limited, empirical data shows that with the number of downloads of my current three WordPress / BuddyPress plugins, that less than 0.1% (yes, that is less than one-tenth of  one percent) bother to donate. If my plugins received poor reviews, that would be understandable. But, as my lowest-rated plugin received a 4.5-star review out of 5, the lack of donations obviously has nothing to do with perceived quality. <em>Note: Although I am a listed contributor to the BuddyPress Skeleton Component, I do not include that as one of  my three plugins.</em></p>
<p>Whereas the greater WordPress community appears to have no issue with spending money on what are called premium themes, there seems to be a disconnect when it comes to supporting the developers of the plugins that help make their communities successful. Yes, great themes definitely provide an important face to a community, but it’s important to remember that plugins&ndash; along with the core functionality of WordPress and BuddyPress&ndash;provide the foundation to our networks.</p>
<p>So please generously donate to plugin developers and help keep them coding their wonderful plugins be they general purpose or specialty in nature.</p>
]]></content:encoded>
			<wfw:commentRss>http://jeffsayre.com/2010/05/08/the-growing-panoply-of-specialty-buddypress-developer-and-administration-tools/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>BuddyPress Featured Members Plugin Widget Re-Released</title>
		<link>http://jeffsayre.com/2010/05/05/buddypress-featured-members-plugin-widget-re-released/</link>
		<comments>http://jeffsayre.com/2010/05/05/buddypress-featured-members-plugin-widget-re-released/#comments</comments>
		<pubDate>Wed, 05 May 2010 18:09:52 +0000</pubDate>
		<dc:creator>Jeff Sayre</dc:creator>
				<category><![CDATA[BuddyPress]]></category>
		<category><![CDATA[GPL]]></category>
		<category><![CDATA[WordPress Plugins]]></category>

		<guid isPermaLink="false">http://jeffsayre.com/?p=650</guid>
		<description><![CDATA[After dragging my feet for too long, I’ve finally upgraded and updated my old Featured Members Widget to work with WP/MU 2.9.2 and BuddyPress 1.2.3. The code has been entirely rewritten using the WordPress Plugin API.
This re-released version is what I call a plugin widget as it is a BuddyPress-specific widget and must be activated [...]]]></description>
			<content:encoded><![CDATA[<p>After dragging my feet for too long, I’ve finally upgraded and updated my old Featured Members Widget to work with WP/MU 2.9.2 and BuddyPress 1.2.3. The code has been entirely rewritten using the <a href="http://codex.wordpress.org/Widgets_API">WordPress Plugin API</a>.<span id="more-650"></span></p>
<p>This re-released version is what I call a plugin widget as it is a BuddyPress-specific widget and must be activated like other BP plugins. Widget installation is handled this way so that if BuddyPress is not activated, then this plugin widget will not be loaded&mdash;which could cause issues with your WP site. The widget does an internal check to see if BuddyPress is activated, if so then it continues loading. If not, it stops loading and will not be visible in the widget gallery. The widget is automatically activated sitewide so your other members will not see it in their plugins section if you&#8217;re running a multisite install.</p>
<p><strong>Download BuddyPress Featured Members Plugin Widget and Donate!</strong></p>
<p>You can <a href="http://wordpress.org/extend/plugins/buddypress-featured-members-widget/">download version 1.2 of the BuddyPress Featured Members Plugin Widget from the WordPress Plugin Repository</a>. Even more excitingly, you can help me support this plugin, encourage me to create new ones, and enable me to keep living by selecting a sponsorship level below and clicking the &#8220;Pay Now&#8221; button. Thank you!</p>
<div class="paypal_button">
<form action="https://www.paypal.com/cgi-bin/webscr" method="post">
<input type="hidden" name="cmd" value="_s-xclick"/>
<input type="hidden" name="hosted_button_id" value="VTHMENKR9ZWB4"/>
<table>
<tr>
<td>
<input type="hidden" name="on0" value="Sponsorship Levels"/>Sponsorship Levels</td>
</tr>
<tr>
<td>
<select name="os0">
							<option value="Supporter">Supporter $15.00</option><br />
							<option value="Donor">Donor $25.00</option><br />
							<option value="Sponsor">Sponsor $50.00</option><br />
							<option value="Benefactor">Benefactor $100.00</option><br />
							<option value="Patron">Patron $250.00</option><br />
							<option value="Open Source Angel">Open Source Angel $500.00</option><br />
							<option value="Holy Cow!">Holy Cow! $1,000.00</option><br />
						</select>
</td>
</tr>
</table>
<input type="hidden" name="currency_code" value="USD"/>
<input type="image" src="https://www.paypal.com/en_US/i/btn/btn_paynowCC_LG.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!"/>
						<img alt="" border="0" src="https://www.paypal.com/en_US/i/scr/pixel.gif" width="1" height="1"/><br />
					</form>
<p><em>If you are a corporate user, consultant, plugin developer, or theme designer and profit from using my plugin, please consider donating at one of the upper levels. Thank you!</em></p>
</p></div>
<p><strong>Using the Plugin Widget</strong></p>
<p>Please read the readme.txt file for installation and usage instructions. If you have any issues, please leave a comment in this post, or visit the <a href="http://buddypress.org/community/groups/buddypress-featured-members-widget/forum/">support forum for this plugin widget</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://jeffsayre.com/2010/05/05/buddypress-featured-members-plugin-widget-re-released/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Regaining Control of Privacy and Identity: It’s up to Each Individual</title>
		<link>http://jeffsayre.com/2010/05/02/regaining-control-of-privacy-and-identity-it%e2%80%99s-up-to-each-individual/</link>
		<comments>http://jeffsayre.com/2010/05/02/regaining-control-of-privacy-and-identity-it%e2%80%99s-up-to-each-individual/#comments</comments>
		<pubDate>Sun, 02 May 2010 17:57:05 +0000</pubDate>
		<dc:creator>Jeff Sayre</dc:creator>
				<category><![CDATA[Entrepreneurship & Leadership]]></category>
		<category><![CDATA[Social Media & Semantic Web]]></category>
		<category><![CDATA[data silos]]></category>
		<category><![CDATA[freedoms]]></category>
		<category><![CDATA[identiy 2.0]]></category>
		<category><![CDATA[privacy]]></category>
		<category><![CDATA[privacy 2.0]]></category>

		<guid isPermaLink="false">http://jeffsayre.com/?p=639</guid>
		<description><![CDATA[This is a follow-up post to my article, Privacy in the Facebook Era. It was originally a reply to a comment by Chris Messina in that post. As this topic continues to be relevant, I’ve decided to extract my comment from that post, revise it, add to it, and turn it into an article.
Personal freedoms, [...]]]></description>
			<content:encoded><![CDATA[<p><em>This is a follow-up post to my article, <a href="http://jeffsayre.com/2010/01/11/privacy-in-the-facebook-era/">Privacy in the Facebook Era</a>. It was originally a <a href="http://jeffsayre.com/2010/01/11/privacy-in-the-facebook-era/#comment-371">reply to a comment by Chris Messina</a> in that post. As this topic continues to be relevant, I’ve decided to extract my comment from that post, revise it, add to it, and turn it into an article.</em><span id="more-639"></span></p>
<p>Personal freedoms, control over one’s privacy, and the ability to manage one’s identity on the Web have never been in more jeopardy. With <a href="https://www.eff.org/deeplinks/2010/04/facebook-timeline">Facebook’s continued war on personal privacy</a>, the day when a user no longer has any rights to control their own data is closer at hand. The question is, How should society respond?</p>
<p>Of course, Facebook&ndash;or any other corporation&ndash;is free to offer services and manage their user base in anyway that benefits their stakeholders&mdash;as long as they do not break the laws under which they are obligated to operate. Individuals have the freedom to decide whether or not they agree with Facebook’s policies, in particular as they pertain to privacy and the use of their personal data. They can choose not to use Facebook, Twitter, or any other Social Web network.</p>
<p>I have no issue with corporations making a profit, I am a businessman myself. My argument is that society should not feel comfortable when a few individuals (or in this case a single person) make broad, sweeping decisions about how an individual’s data is managed.</p>
<p>Society should not be complacent when a large corporation like Facebook continues to assail personal privacy on one front while purporting to be the <a href="http://www.readwriteweb.com/archives/identity_wars_google_yahoo_bow_to_facebook_twitter.php">de facto provider of Web-based identity on the other</a>. Free societies should strive toward assisting individuals to gain control over their personal data.</p>
<p>Currently, there are inherent barriers to providing users with an easy-to-use mechanism that grants fine, granular control over personal data on the Internet and Web. Most users have their personal data strewn throughout myriad, disparate data silos, across different closed social networks. This makes it difficult to create tools that offer users an efficient and effective way to manage their data, to manage their on-line identity.</p>
<p>Some of the initiatives that open a user’s data up to other applications and networks&ndash;<a href="http://developer.yahoo.net/blog/archives/2008/12/the_open_stack.html">the Open Stack</a>, for instance&ndash;begin to address this issue. But, as long as users’ personal data remains effectively siloed in government and corporate databases, this vision will not be obtainable.</p>
<p>As the Web matures and new technologies such as Semantic Web protocols and tools become available, solutions to the proverbial Privacy 2.0 and Identity 2.0 debate are possible. Whether corporate adoption rates of those solutions will be sufficient to make them viable is unclear. This is were the wishes and desires of a free society come into play. If there is a sufficient cry to adopt new identity-management protocols, then perhaps we can effect change.</p>
<p>In my article, “<a href="http://jeffsayre.com/2010/02/24/a-flock-of-twitters-decentralized-semantic-microblogging/">A Flock of Twitters: Decentralized Semantic Microblogging</a>”, I offer one such path to a user-driven, user-centric identity management and privacy solution. It does not rely on corporate adoption but instead puts the power back in the hands of individuals.</p>
<p>But there are other solutions that offer great business opportunities to companies that truly listen to users’ concerns over the usurpation of their personal privacy and identity. In the coming decade, those companies that build new interfaces and provide new services that facilitate user-centric identity and privacy management will find their visions rewarded. There is plenty of room for both open source and proprietary solutions in this space.</p>
<p>Whereas Facebook has shown great acumen at growing their small business into a global behemoth, it has lost sight as to the roots of its success&mdash;their users’ trust. If the Web’s citizens take a stand and demand that their personal privacy and identity remain their domain, and not the domain of corporations or governments, then companies like Facebook could very well end up being a relic of a Wild-west Web, a bygone time where anything and everything was acceptable in the name of profit.</p>
<p>It is up to society, to the Web’s citizens, to decide how the issue of privacy and identity will turn out. If only a few voice their opinions, if only a few are cognizant of this crisis and its negative ramifications, then Facebook and other corporations will decide how privacy and identity are managed.</p>
<p>If you think privacy and identity are too important to let the few decide how they are managed, then it’s time for you to act. Write about it on your blog, tweet about it, retweet my article, do whatever it takes to get those who trust you in your various social networks to take note, to listen, to understand, and to ultimately act.</p>
<p>UPDATE: May 8, 2010: Jeff Jarvis published an interesting article on this topic. See <a href="http://www.buzzmachine.com/2010/05/08/confusing-a-public-with-the-public/">Confusing *a* public with *the* public</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://jeffsayre.com/2010/05/02/regaining-control-of-privacy-and-identity-it%e2%80%99s-up-to-each-individual/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Introducing WordPress Hook Sniffer: a Developer Plugin</title>
		<link>http://jeffsayre.com/2010/04/29/introducing-wordpress-hook-sniffer-a-developer-plugin/</link>
		<comments>http://jeffsayre.com/2010/04/29/introducing-wordpress-hook-sniffer-a-developer-plugin/#comments</comments>
		<pubDate>Thu, 29 Apr 2010 20:26:56 +0000</pubDate>
		<dc:creator>Jeff Sayre</dc:creator>
				<category><![CDATA[BuddyPress]]></category>
		<category><![CDATA[developers]]></category>
		<category><![CDATA[WordPress Plugins]]></category>

		<guid isPermaLink="false">http://jeffsayre.com/?p=575</guid>
		<description><![CDATA[As a developer, one of the benefits to sophisticated Open Source projects like WordPress and BuddyPress is that a significant amount of foundational code is already in place. This makes adding additional functionality, additional value, to the platform easier. You just create a plugin.
As a developer, one of the downsides to Open Source projects like [...]]]></description>
			<content:encoded><![CDATA[<p>As a developer, one of the benefits to sophisticated Open Source projects like WordPress and BuddyPress is that a significant amount of foundational code is already in place. This makes adding additional functionality, additional value, to the platform easier. You just create a plugin.<span id="more-575"></span></p>
<p>As a developer, one of the downsides to Open Source projects like WordPress and BuddyPress is that a significant amount of foundational code is already in place. There are hundreds of functions, classes, methods, and general code that you never actually get to know. Sure, you might call them from within your code, you might know how and when to use them, but you more than likely do not understand how and why they work and what they actually do to accomplish their task.</p>
<p>Why? Because you were (more than likely) not part of the team that wrote the code, that figured out what each function was required to accomplish and in what ways that code would interact with other parts of the foundation.</p>
<p>This is exactly the situation I found myself in several weeks ago as I was trying to figure out why one of my custom do_action events in my BuddyPress Privacy Component was not working as I had expected. My investigation into this issue not only opened my eyes into the inner workings of WordPress’ Plugin API, but also helped me figure out why a few <a href="http://trac.buddypress.org/ticket/2325">BuddyPress action events were not behaving as intended</a>.</p>
<p><strong>Understanding Hook Firing Sequence</strong></p>
<p>How can you know the firing sequence of action functions or filter functions that you attach to existing WordPress and BuddyPress hooks? Why is this even important?</p>
<p>To answer the second question, read my article, <a href="http://jeffsayre.com/2010/04/29/wordpress-hooks-barbs-and-snags/"><em>WordPress Hooks, Barbs, and Snags</em></a>. The answer to the first question is more difficult.</p>
<p>Since many internal WordPress and BuddyPress functions may be tying into the same action or filter hooks, there is no easy way to know the firing sequence of action functions or filter functions. Add to that the fact that 3rd-party external plugins can also tie into these same action or filter hooks and the issue becomes even more murky. </p>
<p>As I had a serious issue with a custom do_action event in my BuddyPress Privacy Component not working as expected, I set out to solve the first question. Although my problem appeared to be with my custom do_action event, I soon discovered that it was caused by another hook to which I had tied in to.</p>
<p>The result of my investigation: a new tool for WordPress and BuddyPress developers called the WordPress Hook Sniffer. What does this plugin do? It helps plugin developers determine the sequence in which action and filter functions are fired, providing a window  into the inner workings of the WordPress Plugin API.</p>
<p>As with all of my other WordPress and BuddyPress plugins, this plugin is licensed under the <a href="http://www.gnu.org/licenses/gpl.html">GNU General Public License 3.0 (GPL)</a>.</p>
<p><strong>Download WordPress Hook Sniffer and Donate!</strong></p>
<p>You can download <a href="http://wordpress.org/extend/plugins/wordpress-hook-sniffer/">the WordPress Hook Sniffer via the WP Plugin Repository</a>. Even more excitingly, you can help me support this plugin, encourage me to create new ones, and enable me to keep living by selecting a sponsorship level below and clicking the &#8220;Pay Now&#8221; button. Thank you!</p>
<div class="paypal_button">
<form action="https://www.paypal.com/cgi-bin/webscr" method="post">
<input type="hidden" name="cmd" value="_s-xclick"/>
<input type="hidden" name="hosted_button_id" value="VTHMENKR9ZWB4"/>
<table>
<tr>
<td>
<input type="hidden" name="on0" value="Sponsorship Levels"/>Sponsorship Levels</td>
</tr>
<tr>
<td>
<select name="os0">
							<option value="Supporter">Supporter $15.00</option><br />
							<option value="Donor">Donor $25.00</option><br />
							<option value="Sponsor">Sponsor $50.00</option><br />
							<option value="Benefactor">Benefactor $100.00</option><br />
							<option value="Patron">Patron $250.00</option><br />
							<option value="Open Source Angel">Open Source Angel $500.00</option><br />
							<option value="Holy Cow!">Holy Cow! $1,000.00</option><br />
						</select>
</td>
</tr>
</table>
<input type="hidden" name="currency_code" value="USD"/>
<input type="image" src="https://www.paypal.com/en_US/i/btn/btn_paynowCC_LG.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!"/>
						<img alt="" border="0" src="https://www.paypal.com/en_US/i/scr/pixel.gif" width="1" height="1"/><br />
					</form>
<p><em>If you are a corporate user, consultant, plugin developer, or theme designer and profit from using my plugin, please consider donating at one of the upper levels. Thank you!</em></p>
</p></div>
<p><strong>Using the Plugin</strong></p>
<p><em>WARNING: This plugin is to be used only in a development sandbox and not in a production environment. It is intended solely for use by plugin developers to help determine the sequence in which action and filter functions are fired. Use at your own risk. As this plugin should not be installed on an active WordPress-based site (a production site), no support for broken sites will be given. You have been warned!</em></p>
<p>It is important that you carefully follow the installation instructions in the readme.txt file. There are several crucial steps you must take to make this plugin work.</p>
<ol>
<li>Once installed and activated, you will find a new menu option in the Settings menu<br />
<a href="http://jeffsayre.com/wp-content/uploads/2010/04/WP-Hook-Sniffer-Menu.png"><img src="http://jeffsayre.com/wp-content/uploads/2010/04/WP-Hook-Sniffer-Menu.png" alt="" title="WordPress Hook Sniffer Menu Selection" width="161" height="214" class="alignnone size-full wp-image-576" /></a></li>
<li>Clicking on that will bring up the WordPress Hook Sniffer Settings screen. The first thing to do is look in the upper left-hand corner of the screen. See that gratuitous &#8220;Please Support My Work&#8221; section? Go ahead and select a nice, juicy amount and then click the “Pay Now” button. Your donation (in any amount) is greatly appreciated! Okay, enough begging.<br />
<a href="http://jeffsayre.com/wp-content/uploads/2010/04/WP-Hook-Sniffer-Settings.png"><img src="http://jeffsayre.com/wp-content/uploads/2010/04/WP-Hook-Sniffer-Settings-300x283.png" alt="" title="WordPress Hook Sniffer Settings Screen" width="300" height="283" class="alignnone size-medium wp-image-577" /></a></li>
<li>Next, read the “Usage Notes” section at the end of this article for a few additional bits of important information</li>
<li>Finally, select “Enabled” in the Main Sniffer Settings section, choose what data you wish to view in the Output Options section, and then select where you would like the output to go in the Output Location section</li>
<li>It’s that easy!</li>
</ol>
<p><strong>Output Settings Options</strong></p>
<p>Whereas getting the WordPress Hook Sniffer to work is relatively straight forward, interpreting the output is a different story. What does all of that crap stuff mean?</p>
<p>Here is a brief overview of each of the output options and what information it can provide. However, to truly understand how to interpret the output and how best to use it in your development work, you will need to read my article, <a href="http://jeffsayre.com/2010/04/29/wordpress-hooks-barbs-and-snags/"><em>WordPress Hooks, Barbs, and Snags article</em></a>.</p>
<p>A. Added Functions</p>
<p>Selecting this option outputs the special WP Hook Sniffer array that holds, in the order in which they were encountered during code execution, all add_action calls and add_filter calls. The file and line number from which a given function was triggered is also provided.</p>
<p>B. Removed Functions</p>
<p>Selecting this option outputs the special WP Hook Sniffer array that holds, in the order in which they were encountered during code execution, all remove_action calls and remove_filter calls. The file and line number from which a given function was triggered is also provided.</p>
<p>C. Action and Filter Function Array </p>
<p>This is the grandaddy, grandmommy, grandchild, Grand Ole Opry of output data. It contains the output of the $wp_filter array, the array that holds all of the added action and filter functions and is used by the do_action and apply_filters functions call to determine function firing order&mdash;although there is a twist here. You must read my article <a href="http://jeffsayre.com/2010/04/29/wordpress-hooks-barbs-and-snags/"><em>WordPress Hooks, Barbs, and Snags article</em></a> to learn what it is.</p>
<p>D. Action Event Firing Order </p>
<p>This option contains the output of the $wp_actions array. A simple, one dimensional array that holds the sequential listing of all the do_action events that need to be processed. The events within this array used in conjunction with with corresponding data in the $wp_filter array determines the firing sequence of all action functions</p>
<p>E. Action Event Firing Sequence</p>
<p>Selecting this option outputs the special WP Hook Sniffer array that holds the sequential listing of do_action events with their corresponding fired action function(s). This listing shows you exactly the sequence in which each triggered action event fires its hooked action functions.</p>
<p>F. Filter Event Firing Sequence</p>
<p>Selecting this option outputs the special WP Hook Sniffer array that holds the sequential listing of apply_filters events with their corresponding fired filter function(s). This listing shows you exactly the sequence in which each triggered filter event fires its hooked filter functions.</p>
<p><strong>
<div id="notes">Usage Notes</div>
<p></strong></p>
<ol>
<li><em>Reporting Bugs</em>: If you find bugs or are having issues using this plugin, you can either post a comment in this article or <a href="http://buddypress.org/community/groups/wordpress-hook-sniffer/forum/">visit the support forum for this plugin</a>. Assistance in providing patches to this plugin is appreciated.</li>
<li><em>Increasing Precision</em>: If you want to see a more precise accounting of the execution time of a given function, you have to edit your php.ini file to increase the precision displayed for floating point numbers. Search your php.ini file for the entry:
<p><code>precision = 12</code></p>
<p>and change that to:</p>
<p><code>; precision = 12<br />
precision = 16</code></p>
<p>As you can see, I like to comment out any changes to my default php.ini settings just in case I decide to revert the changes later. This allows you to do so easily without having to remember or look up what the default setting is supposed to be.</p>
<p>Save your modified php.ini file and then restart your development server and you should now see the time-executed stamp displaying 6 significant figures instead of 2. This provides a sufficient level of detail.</li>
<li><em>Text Output Issues</em>: If you’re using SSL or are behind a proxy server, you may have issues when selecting to send the output to a text file. There are a few work arounds for this, but suffice it to say that since this plugin is to be used exclusively in a development sandbox environment, I will not be coding these into the plugin. If you must use this plugin with SSL or behind a proxy server, then simply select the screen output option. You can learn more about this in the <a href="http://www.php.net/manual/en/function.fopen.php">PHP manual for the fopen function</a>.</li>
<li><em>Screen Output</em>: When printing to screen, it may take a several seconds for output to finish. The output will start just below your theme’s footer.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://jeffsayre.com/2010/04/29/introducing-wordpress-hook-sniffer-a-developer-plugin/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>WordPress Hooks, Barbs, and Snags</title>
		<link>http://jeffsayre.com/2010/04/29/wordpress-hooks-barbs-and-snags/</link>
		<comments>http://jeffsayre.com/2010/04/29/wordpress-hooks-barbs-and-snags/#comments</comments>
		<pubDate>Thu, 29 Apr 2010 20:25:07 +0000</pubDate>
		<dc:creator>Jeff Sayre</dc:creator>
				<category><![CDATA[BuddyPress]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[developers]]></category>
		<category><![CDATA[WordPress Plugins]]></category>

		<guid isPermaLink="false">http://jeffsayre.com/?p=587</guid>
		<description><![CDATA[This article is intended to help you learn how to interpret the output from the WordPress Hook Sniffer developer’s tool
This article is my exhaustive study of what I thought was a simple little function&#8212;the do_action function. It details how WordPress action hooks really work. It is a long, detailed article. If you want to understanding [...]]]></description>
			<content:encoded><![CDATA[<p><em>This article is intended to help you learn how to interpret the output from the <a href="http://jeffsayre.com/2010/04/29/introducing-wordpress-hook-sniffer-a-developer-plugin/">WordPress Hook Sniffer developer’s tool</a></em></p>
<p>This article is my exhaustive study of what I thought was a simple little function&mdash;the do_action function. It details how WordPress action hooks really work.<span id="more-587"></span> It is a long, detailed article. If you want to understanding the inner works of the do_action function, then it will be worth your time. Although this article only briefly mentions the apply_filters function, the lessons learned about the do_action function apply equal as well as the coding of these two functions is nearly identical.</p>
<p>This is not a beginners guide to <a href="http://codex.wordpress.org/Plugin_API">WordPress action and filter hooks</a>. To benefit from this article, you need to understand what hooks are, why you use them, and how to use them.</p>
<p><strong>Hooks, Barbs, and Snags</strong></p>
<p>Before we start, I need to define two terms. You may be wondering about the title of this article, “WordPress Hooks, Barbs, and Snags.” You should already know the definition of a WordPress hook. But what are barbs and snags?</p>
<p>These are two terms I created to classify the following:</p>
<p><em>Barbs</em>: salient insights about the functioning of WordPress hooks that stick out and grab your attention. Understanding these barbs help you avoid snags. In this sense, a barb is a good thing.</p>
<p><em>Snags</em>: WordPress hooks that do not execute as expected, not because the do_action or apply_filters functions are misbehaving, but rather because you do not understand how these functions actually work.</p>
<p><strong>The Hook Loop or Where the Issue Gets Complex</strong></p>
<p>When it comes to code, loops can be tricky constructs to properly implement. What seems like a simple, innocuous operation may actually be more complex than meets the eye. This is the case with the do loops in the do_action and apply_filters functions.</p>
<p>There are two key arrays that WordPress uses to determine the firing sequence of actions and filters&mdash; the $wp_actions and $wp_filter arrays. These arrays get built throughout the execution of each page load and are not fully populated until page load is complete and PHP stops execution, waiting for its next command.</p>
<p><em>The $wp_filter Array</em></p>
<p>The $wp_filter array is where all added action functions and filter functions are stored for future reference and processing by both the apply_filters function and the do_action function. This array is a very-large, multidimensional array nested to four levels. See the snapshot of the partial contents of this massive array.<a href="http://jeffsayre.com/wp-content/uploads/2010/04/WP-Hook-Sniffer-filter-array.png"><img src="http://jeffsayre.com/wp-content/uploads/2010/04/WP-Hook-Sniffer-filter-array-300x211.png" alt="" title="WordPress Hook Sniffer $wp_filter Array" width="300" height="211" class="alignright size-medium wp-image-603" /></a></p>
<p>Here is a snapshot of what is generated in the $wp_filter array just by navigating to the homepage in my particular setup. Your results will vary depending on which plugins you have activated, which theme you’re using, whether you’re running WordPress in single-site or multi-site mode, whether you’re running BuddyPress, whether a user is logged into your site, and of course which versions of WP / BP you currently have installed.</p>
<p>As you can see, there are a lot of action functions and filter functions listed, each of which result in the grabbing and storing of added actions and filters. Not all of these are necessarily triggered. It is up to the apply_filters and do_action functions to determine which of the referenced functions will be fired.</p>
<p><em>The $wp_action Array</em></p>
<p>The $wp_actions array holds all of the current actions invoked by do_action events in the files that are processed when a given page is loaded. Like the $wp_filter array, the contents of this array obviously depend on the page to which a user navigates.</p>
<p>Here is a snapshot of what is generated in the $wp_actions array just by navigating to the homepage in my particular setup.<a href="http://jeffsayre.com/wp-content/uploads/2010/04/WP-Hook-Sniffer-action-array.png"><img src="http://jeffsayre.com/wp-content/uploads/2010/04/WP-Hook-Sniffer-action-array-300x88.png" alt="" title="WordPress Hook Sniffer $wp_action Array" width="300" height="88" class="alignright size-medium wp-image-604" /></a></p>
<p>But read on as knowing about these two arrays is only one aspect to fully understanding the underlying processes, in figuring out the entire puzzle.</p>
<p><strong>Populating the Arrays, Firing the Hooks</strong></p>
<p>Here’s another piece to this complex puzzle. We know that the array $wp_filter holds an array listing all of the currently active action functions and filter functions. But how is this array built?</p>
<p>It’s simple. All action and filter functions that are not enclosed within a function, a loop, or any type of conditional clause currently not triggered, are added sequentially to this array as a given file is executed after it’s loaded (via either an include, include_only, require, or require_only function call). Therefore, as soon as a file is loaded, execution passes to that file and all directly executable add_action, add_filter, remove_action, and remove_filter function calls are processed.</p>
<p>This means that PHP is furiously processing function calls from these four functions, resulting in data being added or removed from the $wp_filter array. When an add_action call is triggered, the parameters are sent to the add_action function in the WP plugin API. When an add_filter call is triggered, the parameters are sent to the add_filter function&mdash;and so on.</p>
<p>However, one additional function is called when an add_action call is processed. As soon as the add_action function gets called, it immediately passes on the responsibility to the add_filter function. This means that WordPress looks at action functions and filter functions as the same. This is another key insight and is why both action functions and filter functions are referenced within the same array&mdash; the $wp_filter array.</p>
<p>Once the add_filter function gets control, it adds the calling function to the growing list of  actions and filters that can be triggered by a given do_action or apply_filters event. This process quickly results in the $wp_filter array growing into a massive, multidimensional array. Of course, action and filter functions can get removed from the array via calls from the remove_action and remove_filter functions.</p>
<p>The reality of code execution is of course more complex. The $wp_filter array is still being populated with action and filter functions when the first do_action events are triggered. This means that it is possible to have a situation where an action or filter that is hooked to a given do_action or apply_filters event will not get triggered if the file in which the hooked function is located has not been loaded before the hook is triggered.</p>
<p>This last point is exactly what was happening in BuddyPress when the bp_init action hook fired. This is the issue that was puzzling me and resulted in this exhaustive study and creation of my new WordPress Hook Sniffer plugin. You can <a href="http://trac.buddypress.org/ticket/2325">read this BuddyPress Trac ticket</a> to learn more.</p>
<p><strong>A Detailed Analysis to Shed Some Light</strong></p>
<p>Here is a breakdown and partial analysis of the $wp_actions array, the array that holds all of the current actions invoked by do_action events in the files that are processed when the homepage is loaded. We will use this array along with the $wp_filter array to figure out what is really going on.</p>
<p>The contents of this array obviously depends on the page to which a user navigates. This is just what happens when a non-logged-in user visits the homepage of the default BuddyPress theme in my WPMU setup. The only other plugin that is activated is my BuddyPress Privacy Component. For these tests, I am running WPMU 2.9.2 and BuddyPress 1.2.3.</p>
<p>NOTE: To fully understand what is going on, you need to make sure that you are looking at the completed arrays and not the partial arrays grabbed partway through page-load.</p>
<p>Let’s look at the order in which do_action events will be triggered. We will analyze what is happening in the first four elements of the $wp_actions array (index value of “0” through “3”). How is each action triggered and what are the results? This will start off as a detailed look into each hook’s actions, but will provide fewer details with each additional event as the basic processes become evident.</p>
<p><em>The First Four Triggered Action Events</em></p>
<p><code>[0] => muplugins_loaded</p>
<p>[1] => bp_core_loaded</p>
<p>[2] => plugins_loaded</p>
<p>[3] => bp_setup_root_components<br />
</code></p>
<p><em>[0] => muplugins_loaded</em></p>
<p>When a user navigates to the homepage of a default BuddyPress install running on top of WPMU, the first action hook that is invoked is muplugins_loaded. This is directly triggered on line 547 in wp-settings.php. Any added actions that are tied to this event will next be triggered.</p>
<p>Looking at the $wp_filter array, you will see that there are no actions tied to this hook. This means that there is no subarray element with a key name of muplugins_loaded. In other words, you will not find any reference to that action event within the $wp_filter array. So, this action event does not result in any action functions getting fired.</p>
<p><em>NOTE: A triggered hook may or may not have actions tied to it. If no actions are tied to the hook, the do_action routine passes by that hook, checking the next invoked hook for added action functions to fire.</em></p>
<p>Before the next action event is triggered, something important happens.</p>
<p>Execution of the wp-settings.php file continues. On line 703 of wp-settings.php, all the active plugins are loaded&mdash;both blog specific plugins and site-wide plugins.</p>
<p>If you look at that line, $current_plugins can be modified by any added filters. That is what happens. On line 2348 of wpmu-functions.php, an add_filter call triggers function mu_filter_plugins_list. This filter modifies the contents of $current_plugins, adding any MU plugins that have been activated site wide. Processing is returned wp-settings.php, resulting in the main file of each activated plugin getting loaded.</p>
<p>There is an interesting item to notice within function mu_filter_plugins_list. On line 2345 of that function, the two arrays $active_plugins and $active_sitewide_plugins are merged and the resultant new array is sorted.</p>
<p>What does this mean? It means that when it comes to the issue of action and filter sequence firing, it does not matter which plugins you activate first. The order in which plugins are added to each of the serialized objects active_plugins and active_sitewide_plugins is immaterial. The sort function will alphabetically reorder the contents of the merged array.</p>
<p><em>NOTE: Each WPMU blog has it’s own listing of active plugins that are stored in a serialized object in the blog’s wp_x_options table. Look for the entry “active_plugins” within the option_name field of that table. The corresponding active plugins are in the option_value field of that record. All plugins that are to be activated site wide within WPMU are stored in a serialized object in the wp_sitemeta table. Look for the entry “active_sitewide_plugins” within the meta_key field of that table and the corresponding plugins that are to be activated site wide in the meta_value field of that record.</em></p>
<p>So, in our particular case with two site-wide plugins installed and activated (buddypress and bp-authz), the order in which they were activated is immaterial in determining which file is included (loaded) first by the conditional loop code starting on line 704 of wp-settings.php.</p>
<p>If you look in the wp_sitemeta table for the meta_key “active_sitewide_plugins”, you will see this:</p>
<p><code>a:2:{s:24:"buddypress/bp-loader.php";i:1270239897;s:28:"bp-authz/bp-authz-loader.php";i:1270396554;}</code></p>
<p>BuddyPress appears first because I activated it first&mdash;as is necessary. But, when the references to these two main plugin files are processed through the mu_filter_plugins_list function, they get sorted. This results in bp-authz-loader.php getting loaded before bp-loader.php.</p>
<p>This could be a big issue as all BP-dependent plugins rely on BuddyPress to be installed, activated, and loaded. Any BP-dependent plugin that comes alphabetically before “buddypress” will have their main file loaded before BuddyPress’ main file.</p>
<p><strong>Barb 1:</strong> As a BuddyPress plugin developer, this is the first major insight, the first important barb that can prevent your code from hitting a snag with regards to action and filter execution.</p>
<p>Fortunately, there is an easy way to prevent this barb from snagging you and those that use your plugin. Make sure that <a href="http://codex.buddypress.org/how-to-guides/checking-buddypress-is-active/">BuddyPress is active before your plugin loads</a> its core files.</p>
<p>Since that is exactly what I’ve done with my BuddyPress Privacy Component, there are no issues and execution quickly passes back to the loop and the next file in the $current_plugins array is loaded. This is the main BuddyPress file, bp-loader.php.</p>
<p><em>[1] => bp_core_loaded</em></p>
<p>Execution of bp-loader.php begins. On line 22 of bp-loader.php, the first custom BuddyPress action event is invoked:</p>
<p><code>do_action( 'bp_core_loaded' );</code></p>
<p>It is directly invoked, directly triggered. It is not enclosed within a function, a loop, or any type of conditional clause. This invoked event is what appears in the second element of the $wp_actions array.</p>
<p>Since there are currently no tied-in actions to this particular action event (as can be easily determined by looking at the $wp_filter array), the invocation of this action does not result in further actions being triggered.</p>
<p>The execution of bp-loader.php continues. Right after line 22, a series of conditional clauses include (load) all enabled BuddyPress modules&mdash;activity, blogs, forums, friends, groups, messages, xprofile.</p>
<p>As each of these files are included (loaded), any directly invoked (directly triggered) action events within each of them will also be invoked. Since there are no additional, directly invokable do_action calls within any of these files, execution is passed back to wp-settings.php.</p>
<p><em>[2] =>plugins_loaded</em></p>
<p>On line 735 in wp-settings.php, the do_action event for plugins_loaded is directly triggered.</p>
<p><code>do_action('plugins_loaded');</code></p>
<p>This is when things really start to accelerate. Up until this time, only a few lines of php code within BuddyPress have actually been run.</p>
<p>With the invocation of the plugins_loaded event, we now have our first action hook that has actions tied to it. Understanding what happens next leads us to the second major insight, the second important barb.</p>
<p>To understand what happens next, we need to inspect the elements within the plugins_loaded array of the $wp_filter array. I have extracted just that subarray element below:</p>
<p><code>plugins_loaded:<br />
Array<br />
(<br />
    [0] => Array<br />
        (</p>
<p>            [wp_maybe_load_widgets] => Array<br />
                (<br />
                    [function] => wp_maybe_load_widgets<br />
                    [accepted_args] => 1<br />
                )</p>
<p>            [wp_maybe_load_embeds] => Array<br />
                (<br />
                    [function] => wp_maybe_load_embeds<br />
                    [accepted_args] => 1<br />
                )</p>
<p>        )</p>
<p>    [2] => Array<br />
        (<br />
            [bp_core_setup_root_uris] => Array<br />
                (<br />
                    [function] => bp_core_setup_root_uris<br />
                    [accepted_args] => 1<br />
                )</p>
<p>            [bp_setup_root_components] => Array<br />
                (<br />
                    [function] => bp_setup_root_components<br />
                    [accepted_args] => 1<br />
                )</p>
<p>        )</p>
<p>    [3] => Array<br />
        (<br />
            [bp_core_set_uri_globals] => Array<br />
                (<br />
                    [function] => bp_core_set_uri_globals<br />
                    [accepted_args] => 1<br />
                )</p>
<p>        )</p>
<p>    [5] => Array<br />
        (<br />
            [bp_core_load_buddypress_textdomain] => Array<br />
                (<br />
                    [function] => bp_core_load_buddypress_textdomain<br />
                    [accepted_args] => 1<br />
                )</p>
<p>            [bp_setup_globals] => Array<br />
                (<br />
                    [function] => bp_setup_globals<br />
                    [accepted_args] => 1<br />
                )</p>
<p>        )</p>
<p>    [10] => Array<br />
        (<br />
            [bp_setup_nav] => Array<br />
                (<br />
                    [function] => bp_setup_nav<br />
                    [accepted_args] => 1<br />
                )</p>
<p>            [bp_setup_widgets] => Array<br />
                (<br />
                    [function] => bp_setup_widgets<br />
                    [accepted_args] => 1<br />
                )</p>
<p>            [bp_register_activity_actions] => Array<br />
                (<br />
                    [function] => bp_register_activity_actions<br />
                    [accepted_args] => 1<br />
                )</p>
<p>            [bp_loaded] => Array<br />
                (<br />
                    [function] => bp_loaded<br />
                    [accepted_args] => 1<br />
                )</p>
<p>        )</p>
<p>)<br />
</code></p>
<p>This array element is itself a multidimensional nested array. In fact, the first element (with an index value of “0”) has two action functions referenced.</p>
<p><em>An important point: each subarray of the $wp_filter array is a numeric array. Read that again. This means that the second level of the nested $wp_filter array contains numeric arrays.</em></p>
<p>You might be wondering how the index values for these numeric arrays are set. This is simple.</p>
<p>The key, the index value, of each 2nd-level array element is determined by the priority assigned to the event in the add_action and add_filter call. Thus, the priority set for a given action or filter function becomes the key of each element in a given hook’s multidimensional array. If a priority is not set for a given add_action or add_filter call, it is automatically defaulted to “10”. This means that any and all added actions or filters that do not specify a priority are automatically assigned to the proper action array element with an index value of “10”.</p>
<p>As an example, if the priority for a given added action is set to “16”, then that particular action function will be located in the array element for that action with an index value of “16”. Multiple action functions can be added under the same index value, creating an array of action functions associated with the same numeric key element. The order in which they appear is determined by the order in which they were executed.</p>
<p><strong>Barb 2:</strong> This is the second major insight, the second important barb that can prevent your code from hitting a snag with regards to action and filter execution.</p>
<p>Now, the next piece of the puzzle is this. The order in which action functions are added to a given action array element is determined by the order in which they are encountered, the order in which their corresponding add_action or add_filter calls were fired. As we will see below, this is what makes determining the firing order of added actions and filters difficult.</p>
<p><strong>Barb 3:</strong> This is the third major insight, the third important barb that can prevent your code from hitting a snag with regards to action and filter execution.</p>
<p><strong>Barb 4:</strong> The higher the index key, the later the action or filter functions within that index-key grouping will get fired. Therefore, using the example above, if we set a priority of “16” for a given action function, it would get fired only after all the other action functions with a lower priority have been fired.</p>
<p>We have now reached the final piece of the puzzle!</p>
<p>Near the beginning of this article, the complexity of the do loops within the do_action and apply_filters functions was briefly mentioned. And it is within those loops that this story really finally gets resolved.</p>
<p>If you look at lines 166 (within the apply_filters function) and line 339 (within the do_action function) of the wp-includes/plugin.php file, you will find the code lines where the actual hooked functions are fired. Do you see the call_user_func_array() function call? That is a core PHP function. It is what will actually fire the next action or filter function in line, as determined by the data in the $wp_filter array.</p>
<p>The action of the call_user_func_array() function nested within the do loop is not as simple as it may seem. Why is this? Well, currently we are discussing the plugins_loaded action event and all of the tied into functions that get fired.</p>
<p>Look at the next action event to get triggered within the $wp_actions array. It is the action event bp_setup_root_components. But wait. Why is there another action event being triggered? We have not yet finished iterating through all of the added action functions to the plugins_loaded action event.</p>
<p>Once again, the reason is simple. Triggered action functions can themselves have action events. Inspecting the plugins_loaded subarray in the $wp_filter array, we see that the bp_setup_root_components action function is invoked by the plugins_loaded event via an added action call on line 2021 in bp-core.php. Within that action function there is an action event called bp_setup_root_components.</p>
<p>So, the sequential processing of all the added action functions with the plugins_loaded subarray of the $wp_filter function has come across a new action event to trigger. It now gets priority and further processing of the plugins_loaded subarray is put on hold until the bp_setup_root_components action event is finished processing its added action functions.</p>
<p><strong>Barb 5:</strong> This can quickly result in a nested grouping of action events with the firing of their corresponding action functions. This is the final piece to the puzzle and the last and final barb that can prevent your code from hitting a snag with regards to action and filter execution.</p>
<p>As you are reading this, the juxtaposed actions of the do loop with the call_user_func_array() function more than likely seem obvious. It may seem this is not unexpected behavior or difficult to understand.</p>
<p>Whereas that is the case when all of the data is clearly laid out before you, the complex actions of these intertwined functions are not apparent when you are coding a plugin. There is no practical way to peek inside this action-event, action-function feedback loop.</p>
<p>This is were the true value of the WordPress Hook Sniffer plugin is revealed.</p>
<p><em>[3] => bp_setup_root_components</em> </p>
<p>Here’s where we understand the last piece to this confusing puzzle.</p>
<p>Inspecting the $wp_filter array for this action event you will see that there are four action functions that are hooked to this action event: bp_activity_setup_root_component, bp_blogs_setup_root_component, bp_forums_setup_root_component, groups_setup_root_component.</p>
<p>These action functions are fired in that sequence. Since they do not have any action events which they trigger, control is passed back to the plugins_loaded event and the next action function in the plugins_loaded subarray is fired.</p>
<p><strong>Applying the Lessons</strong></p>
<p>When interpreting the results of the WoodPress Hook Sniffer plugin, you need to look at the output of the $wp_actions array and then search out the hooked actions to each of those items (if any) in the $wp_filter array. This will give you a general idea of what gets fired when. You can then experiment and see how changes to action priorities affect the firing sequence of a given added action.</p>
<p>You need to carefully think about the execution timing of each action or filter you add, looking at the corresponding triggering event for the hook or hooks to which it’s tied. Remember, you can hook a function to more than one hook which means that it is possible, if you are not careful, that some of them may fire whereas others may not. It’s all a matter of whether or not the reference to the action or filter function was successfully added to the $wp_filter array before the associated hook is triggered.</p>
<p>Looking at the Action Event Firing Sequence and the Filter Event Firing Sequence will help you precisely tune your added hooks and filters. Remember that execution my temporarily pass to another action or filter event. The output of these two WordPress Hook Sniffer arrays will show you when that happens.</p>
<p>Finally, there is no requirement that you place your add_action and add_filter calls right below the functions in which they are associated. Whereas doing so does facilitate code understanding, you could instead place them all at the top of the file (or the bottom) in which the associated functions are located. Remember, each add_action and add_filter function call that is directly executable is processed as soon as a file is loaded. So it does not matter where within the file those calls are located&mdash;with the possible exception of fine tuning the execution order of a particular function.</p>
<p><strong>Final Notes on the $wp_filter and $wp_actions Arrays</strong></p>
<p>The arrays $wp_filter and $wp_actions are repopulated from scratch each time a page is loaded. They do not contain a running accounting of all action and filter functions and all action and filter hooks. The contents of both of these arrays may vary depending on which page you navigate. The contents will depend on the files that are loaded (via include, include_only, require, require_only) when a given page you are on is displayed.</p>
<p>The reality is that, when visiting a given page, there will always be more hooks, action, and filter functions buried deep inside non-loaded files or within function blocks that are not directly hooked. The first is a result of the add_action, remove_action, add_filter, or remove_filter calls not getting fired until that file is loaded. At file load, any directly-executable do_action or apply_filters will be triggered as well. The second is the result of functions that have hooks that only get triggered if the file is loaded and the function is fired.</p>
<p>Although the WP Hook Sniffer will locate all action and filter hooks, and action and filter functions no mater the source&ndash;core files, custom themes, or 3rd-party plugins&ndash;what is captured depends on one simple rule&mdash;that the hooks and function calls are actually fired during page load.</p>
<p>As an example, WP Hook Sniffer cannot locate add_action calls that get fired on a different page than the currently loaded page. It can also not locate add_action calls that are buried inside a function that does not get triggered unless a special criteria is met. To sniff out those added actions, you have to navigate to that page so that those calls get fired or cause the special criteria to be met so that the function containing the buried action call is triggered.</p>
<p>Remember, the way that the WordPress Plugin API processes added and removed actions and filters is by storing (or deleting) a reference to them in the $wp_filter array. But that only happens for hooked functions that are actually encountered during page load. The $wp_filter array is wiped clean with each page load and rebuilt from scratch. The same holds true for the $wp_actions array and the action hooks it tracks.</p>
<p>Therefore, if you have action or filter functions that are supposed to be fired on a given page but you are not seeing that they’ve been fired, then that indicates that they are hooked to an action or filter event that finishes firing before the file in which the target action or filter functions are located even gets loaded. This is exactly what happened to me and caused me to write WP Hook Sniffer.</p>
<p><strong>Summary of Barbs: the Key Insights</strong></p>
<p>1. When it comes to the issue of action function and filter function sequence firing, it does not matter which plugins you activate first.</p>
<p>2. The key, the index value, of each 2nd-level array element within the $wp_filter array is determined by the priority assigned to the event in the add_action and add_filter call.</p>
<p>3. The order in which action functions and filter functions are added to a given action or filter subarray element in the $wp_filter array is determined by the order in which they are encountered during code execution.</p>
<p>4. The higher the index key, the later the action or filter functions within that index-key grouping will get fired.</p>
<p>5. Action hooks (events) &#8211;> trigger action functions &#8211;> which can have additional action hooks &#8211;> which can trigger additional action functions &#8211;> until control is passed back to the the originally-triggering action hook.</p>
<p><a href="http://jeffsayre.com/wp-content/uploads/2010/04/WP-Hook-Sniffer-action-firing.png"><img src="http://jeffsayre.com/wp-content/uploads/2010/04/WP-Hook-Sniffer-action-firing-300x277.png" alt="" title="WordPress Hook Sniffer Action Event Pausing" width="300" height="277" class="alignnone size-medium wp-image-612" /></a></p>
<p>This is the action-event, action-function feedback loop caused by the juxtaposed actions of the do loop with the call_user_func_array() function.</p>
]]></content:encoded>
			<wfw:commentRss>http://jeffsayre.com/2010/04/29/wordpress-hooks-barbs-and-snags/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Crap, GPL Questions Once Again</title>
		<link>http://jeffsayre.com/2010/04/12/crap-gpl-questions-once-again/</link>
		<comments>http://jeffsayre.com/2010/04/12/crap-gpl-questions-once-again/#comments</comments>
		<pubDate>Mon, 12 Apr 2010 20:00:40 +0000</pubDate>
		<dc:creator>Jeff Sayre</dc:creator>
				<category><![CDATA[Social Media & Semantic Web]]></category>
		<category><![CDATA[BuddyPress]]></category>
		<category><![CDATA[GPL]]></category>
		<category><![CDATA[WordPress Plugins]]></category>

		<guid isPermaLink="false">http://jeffsayre.com/?p=522</guid>
		<description><![CDATA[Recently, someone sent me a private message on the BuddyPress.org community network. They had joined WPMU DEV and acquired all of their premium plugins. They wanted to know it they could, “release those plugins all to the buddypress / wp mu community without consequences.”
I wrote a response but decided to share it here as I [...]]]></description>
			<content:encoded><![CDATA[<p>Recently, someone sent me a private message on the <a href="http://buddypress.org/forums/">BuddyPress.org community network</a>. They had joined <a href="http://wpmudev.org/">WPMU DEV</a> and acquired all of their premium plugins. They wanted to know it they could, “<em>release those plugins all to the buddypress / wp mu community without consequences</em>.”</p>
<p>I wrote a response but decided to share it here as I periodically receive<span id="more-522"></span> similar DMs, PMs, and emails. So, the next time that someone asks my opinion on this issue, I can simply point them to this post and be done with it.</p>
<p>Although this topic seems to rear its ugly head periodically, it clearly will not die. This is not an attempt to reignite any of the heated debates of the past.</p>
<p>Please respectfully add your comments and thoughts. I will include all that stay civil.</p>
<p><strong>My Response</strong></p>
<p>You have specific freedoms with all GPLed themes and plugins. To find out what those are, you should read the appropriate version of the license under which a given theme or plugin is licensed.</p>
<p>Here are a few things to consider:</p>
<ol>
<li>If you turn around and release any premium GPLed theme or plugin to the public, you will have to offer support to anyone who uses it or tell them that there is no support offered. Most authors of premium themes and plugins will not provide support for thier work if it was obtained from another site.</li>
<li>The community in general frowns upon people who take someone else&#8217;s work and profit from it&mdash;even though it may be perfectly acceptable under the GPL. So, if you decide to redistribute someone else&#8217;s premium work for a fee, then you should be aware that it may cause some backlash. If you are using someone else&#8217;s premium work as the basis of a new product, in other words you will be adding additional value to it, that is a different issue. The value added should be appreciable, you must always give credit to the original creator, and the work must remain licensed under the GPL.</li>
<li>You will have to provide your own download site. Since you are not the author of the theme or plugin, the WordPress repository will most likely not accept it for inclusion. The exception to this would be if you are creating a new version of the original theme or plugin, if you are adding additional, substantive value to it as detailed above. One scenario would be updating and rereleasing a GPLed theme or plugin that the original author no longer supports.</li>
<li>Many people within the greater WP community frown upon such maneuvers in general. Both premium theme designers and premium plugin developers donate a considerable amount of time to designing their themes and coding their plugins. They are simply trying to earn an honest living from their generous contributions.</li>
<li>There is nothing in the GPL that disallows theme designers or plugin developers from charging a distribution fee or a support fee for their work. The GPL is about usage freedoms, not about free-as-in-cost software. There is nothing in the GPL that differentiates between a designer&#8217;s work being fundamentally different than a developer&#8217;s work. So designers and developers are operating within the rights of the GPL when they offer their work for a premium&mdash;as long as they are only charging a distribution and/or support fee. When it comes to offering premium themes or plugins, any talk about the differences in rights between designers and developers is outside of the GPL, is a matter of opinion more than legal fact.</li>
<li>Currently it seems that in the WordPress community, premium theme designers are accepted in general whereas many premium plugin developers are not. I believe this disparity, this inequity, cannot last for long. The community needs both designers and developers. If developers are not afforded the same opportunities, then some will move on.</li>
<li>See my post in the following thread for <a href="http://buddypress.org/community/groups/miscellaneous/forum/topic/gpl-question-re-upcoming-plugin-release/#post-36398">my additional thoughts and opinions on this topic</a>.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://jeffsayre.com/2010/04/12/crap-gpl-questions-once-again/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Easy Code to Show Your Most Recent Tweets in WordPress</title>
		<link>http://jeffsayre.com/2010/03/13/easy-code-to-show-your-most-recent-tweets-in-wordpress-2/</link>
		<comments>http://jeffsayre.com/2010/03/13/easy-code-to-show-your-most-recent-tweets-in-wordpress-2/#comments</comments>
		<pubDate>Sat, 13 Mar 2010 23:26:15 +0000</pubDate>
		<dc:creator>Jeff Sayre</dc:creator>
				<category><![CDATA[Social Media & Semantic Web]]></category>
		<category><![CDATA[BuddyPress]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[WordPress Plugins]]></category>

		<guid isPermaLink="false">http://jeffsayre.com/?p=491</guid>
		<description><![CDATA[I’ve been reworking my website today and decided it was time to add a recent Twitter tweet to the front page. I checked out the Twitter widget and several (of the many) WordPress plugins that display your most recent tweets, but decided that they had a few issues.
I went looking for a solution. The result, [...]]]></description>
			<content:encoded><![CDATA[<p>I’ve been reworking my website today and decided it was time to add a recent Twitter tweet to the front page. I checked out the Twitter widget and several (of the many) WordPress plugins that display your most recent tweets, but decided that they had a few issues.<span id="more-491"></span></p>
<p>I went looking for a solution. The result, 15 lines of PHP you can use to accomplish the goal. No need to mess with plugins. Instead, you pull your tweets from your own Twitter RSS feed using the simpler <a href="http://apiwiki.twitter.com/Twitter-Search-API-Method%3A-search">Twitter Search API</a>, not the Twitter REST API.</p>
<p>Here’s the <a href="http://scriptplayground.com/tutorials/php/Latest-Twitter-Update-With-PHP/">article I found and used as the basis for my own solution</a>. I’ve made a few modifications to the parsing function that I think provides a better, more flexible outcome. One change is that I add the rel=“nollow” attribute to each &#8220;a&#8221; tag. Since the content you are displaying (in your tweet) is your own, Why would you want the search engines sending some of your hard-fought link juice back to Twitter? </p>
<p>The second change I made was to parse the array an additional time so as to separate out the body of the tweet from the metadata. I just want to display my tweet. That’s all. But, the new array can be used as you see fit. </p>
<pre class="brush: php;">
&lt;div id=&quot;my_tweets&quot;&gt;
	&lt;?php
		// Your twitter username; replace below; keep username in quotes
		$username = &quot;blahblah&quot;;

		// Content you want to include before your tweet; I'm using this for a quick title
		$prefix = &quot;&lt;h2&gt;My Latest Tweet&lt;/h2&gt;&quot;;

		// Content you want to include after your tweet
		/*$suffix = &quot;&lt;br /&gt;&lt;br /&gt;You should follow me on Twitter&quot;;*/

		$latest_tweet = &quot;http://search.twitter.com/search.atom?q=from:&quot; . $username . &quot;&amp;rpp=1&quot;;

		function parse_feed( $latest_tweet ) {
		    $tweet_array = explode( &quot;&lt;content type=\&quot;html\&quot;&gt;&quot;, $latest_tweet );
		    $tweet_array2 = explode( &quot;&lt;/content&gt;&quot;, $tweet_array[1] );

			$tweet = $tweet_array2[0];

			//No need for search engines to follow twitter links or tags; add no follow
			$tweet = str_replace( &quot;&amp;lt;a &quot;, &quot;&amp;lt;a rel=\&quot;nofollow\&quot; &quot;, $tweet );
		    $tweet = str_replace( &quot;&amp;lt;&quot;, &quot;&lt;&quot;, $tweet );
		    $tweet = str_replace( &quot;&amp;gt;&quot;, &quot;&gt;&quot;, $tweet );

		    //some extra tweet metadata you can use if you want
		    $tweet_extra = $tweet_array2[1];

		    return array ( $tweet, $tweet_extra );
		}		

		list ( $tweet, $tweet_extra ) = parse_feed( file_get_contents( $latest_tweet ) );

		echo stripslashes( $prefix ) . $tweet;

		// If you want to include more content after the tweet, use this instead
		/*echo stripslashes( $prefix ) . $tweet . stripslashes( $suffix );*/
	?&gt;
&lt;/div&gt;
</pre>
<p>I simply placed this code in a division within my index.php file. You can place the code wherever you like&mdash;in a sidebar, the footer, a separate page, etcetera. Of course, you could also add it to your functions.php file and simply call your custom twitter-feed function in your template. It’s your choice. </p>
<p>Also, I imagine this simple code could be adapted for use in BuddyPress as well.</p>
<p>To see how it looks on my site, just <a href="http://jeffsayre.com/">go to my homepage</a>.</p>
<p>By the way, it may come as little surprise to you, but I am not a design genius nor even a moderately-skilled designer. I choose to spend my WordPress time either coding or actually creating content for my site. So, you are on your own as far as positioning the output. But, I hear that you can use CSS to do that. <img src='http://jeffsayre.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  </p>
<p>Have fun! </p>
]]></content:encoded>
			<wfw:commentRss>http://jeffsayre.com/2010/03/13/easy-code-to-show-your-most-recent-tweets-in-wordpress-2/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Nosquare and Nowalla: Polluting the Stream</title>
		<link>http://jeffsayre.com/2010/03/13/nosquare-and-nowalla-polluting-the-stream/</link>
		<comments>http://jeffsayre.com/2010/03/13/nosquare-and-nowalla-polluting-the-stream/#comments</comments>
		<pubDate>Sat, 13 Mar 2010 17:53:11 +0000</pubDate>
		<dc:creator>Jeff Sayre</dc:creator>
				<category><![CDATA[Social Media & Semantic Web]]></category>
		<category><![CDATA[Foursquare]]></category>
		<category><![CDATA[Gowalla]]></category>
		<category><![CDATA[location-based services]]></category>
		<category><![CDATA[microblogging]]></category>
		<category><![CDATA[rant]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://jeffsayre.com/?p=481</guid>
		<description><![CDATA[Location-based services are great. But please stop sending updates (check ins) to your Twitter and Facebook accounts. It is the perfect example of social-networking tie-in gone wrong.
Why do I say this? It’s simple. For those of us that are hundreds or thousands of miles away&#8211;which could be many of your followers&#8211;tweeting your current location provides [...]]]></description>
			<content:encoded><![CDATA[<p>Location-based services are great. But please stop sending updates (check ins) to your Twitter and Facebook accounts. It is the perfect example of social-networking tie-in gone wrong.</p>
<p>Why do I say this? It’s simple. For those of us that are hundreds or thousands of miles away&ndash;which could be many of your followers&ndash;tweeting your current location provides zero value.<span id="more-481"></span> In fact, it is a (big) waste of your followers’ time.</p>
<p>In a <a href="http://jeffsayre.com/2010/02/24/a-flock-of-twitters-decentralized-semantic-microblogging/">recent article</a>, I stated this:</p>
<blockquote><p>&#8230;for absolutely every person I currently follow on Twitter, I don’t care who just booted whom out as the mayor of whateverville. I don’t want that drivel polluting my pleasant paddle down my River. It adds zero value to my day and provides little if any entertainment.</p>
<p>I also rarely need to know (nor care to know) whenever someone has just stopped by a Starbucks, or is eating at this and such restaurant 1000 miles away, or is on a treadmill listening to Kid Rock on their fancy Zune.</p></blockquote>
<p>I am not against the occasional fun, non-work-related tweet. It is one of the things that makes a social network social. But, at some point, my Twitter stream started to resemble a scrolling marquee of useless drivel and it became clear that the location-based tweets were the big offenders.</p>
<p>The Foursquare, Gowalla, and other location-based auto-tweets are nothing more in my opinion than a form of advertising. They do not fall into the idle chatter that occurs between friends and colleagues. They are not the type of content that makes sense plastering all over your various social networks.</p>
<p><strong>To Follow or Not to Follow</strong></p>
<p>One of the reasons I am not following more people on Twitter at this time is that when I check out many people with whom I do actually have a genuine interest in following, I discover that their Twitter stream is too cluttered with location-based tweets. When I consider how many location-based tweets will be added to my Twitter stream, I quickly decide to pass them by.</p>
<p>Here’s why.</p>
<p>If I follow 150 additional people each who easily auto tweets on average seven Foursquare or Gowalla check ins each day, that is a total of 1050 location-based tweets added to my stream each day. Since I scan my tweet stream at about 1.5 seconds per tweet, only stopping on those that appear to have worthwhile content, that means I will waste more than 26 minutes each day looking at worthless location-based tweets. In a week that adds up to more than 3 hours* wasted!</p>
<p>I don’t know about you, but that is A LOT of time. I sure could use that time more productively. And I do by simply not following more people. It’s too bad because I really would like to follow more tech-centric people.</p>
<p>Now, I am not against location-based services in general, nor the fun-natured gaming aspect of Foursquare. I think Gowalla, Foursquare, and others have created interesting services that provide value when appropriately used.</p>
<p>I’m arguing that it is best for users to keep their location-based check ins isolated within the location-based services they are using. If I want to find out where you are, to discover if anyone in my network is nearby, I’ll simply fire up my Foursquare or Gowalla app on my smartphone. So please turn off the auto updates to your various networks. They truly provide me with little value and zero useful content.</p>
<p><strong>#Nosquare and #Nowalla</strong></p>
<p>I think it is time for those of us that are fed up with having our Streams polluted with location-based check ins to stand up and make a point. Tweet to your network that you’d appreciate the cessation of your followees auto-tweeting their Gowalla, Foursqaure, and other location-based check ins. Post to your Wall that you’re sick and tired of having to wade through updates that provide little value to your day.</p>
<p>In fact, I’m considering unfollowing those whom I deem abuse my time by virtue of auto posting their location-based check ins to Twitter. I’m not going to share what I consider an abuse of my time, but you can get some hint of my criteria above.</p>
<p>Finally, start using these hashtags to communicate that you’re fed up with this nonsense: #Nosquare and #Nowalla.</p>
<p><em>* ((( 150 people x 7 useless tweets each x 1.5 seconds per tweet ) / 60 seconds per minute ) x 7 days ) / 60 minutes per hour = 3.0625 hours per week. To be fair, it is more than likely that most of those 150 people would not pollute my Twitter stream with that many  location-based auto tweets every single week. Some weeks (maybe many weeks), it might be a lot less, some weeks more. But, you get the idea.</em></p>
<p><strong>UPDATE March 18, 2010:</strong></p>
<p>I found an interesting post that argues for the need for people to manage their own flow: <a href="http://blog.justinkorn.com/2010/02/manage-your-social-network-flow-now/?success">Manage Your Social Network Flow…NOW!</a></p>
<p><a href="http://www.google.com/buzz/chris.messina/GNwQRnKB6mt/Trying-an-experiment-Im-going-to-remove-Twitter">Chris Messina made a Google Buzz post today</a> where he announced an experiment to &#8220;remove Twitter and Flickr as connected sites in Buzz&#8221; to see how that is received.</p>
]]></content:encoded>
			<wfw:commentRss>http://jeffsayre.com/2010/03/13/nosquare-and-nowalla-polluting-the-stream/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>A Flock of Twitters: Decentralized Semantic Microblogging</title>
		<link>http://jeffsayre.com/2010/02/24/a-flock-of-twitters-decentralized-semantic-microblogging/</link>
		<comments>http://jeffsayre.com/2010/02/24/a-flock-of-twitters-decentralized-semantic-microblogging/#comments</comments>
		<pubDate>Wed, 24 Feb 2010 16:30:09 +0000</pubDate>
		<dc:creator>Jeff Sayre</dc:creator>
				<category><![CDATA[Social Media & Semantic Web]]></category>
		<category><![CDATA[data silos]]></category>
		<category><![CDATA[foaf]]></category>
		<category><![CDATA[foaf+ssl]]></category>
		<category><![CDATA[identiy 2.0]]></category>
		<category><![CDATA[microblogging]]></category>
		<category><![CDATA[privacy 2.0]]></category>
		<category><![CDATA[sioc]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[WebID]]></category>
		<category><![CDATA[WordPress Plugins]]></category>

		<guid isPermaLink="false">http://jeffsayre.com/?p=395</guid>
		<description><![CDATA[In my last article, Flocking To the Stream, I ended with this thought about the growing issue of social-networking fatigue:
&#8230;as the number of streams continue to increase and as the flow rate of each stream picks up, people will grow tired of having to subscribe to, having to join yet-another-stream phenomenon (YASP). Does the Web [...]]]></description>
			<content:encoded><![CDATA[<p>In my last article, <a href="http://jeffsayre.com/2010/02/17/flocking-to-the-stream/"><em>Flocking To the Stream</em></a>, I ended with this thought about the growing issue of social-networking fatigue:</p>
<blockquote><p>&#8230;as the number of streams continue to increase and as the flow rate of each stream picks up, people will grow tired of having to subscribe to, having to join yet-another-stream phenomenon (YASP). Does the Web truly need additional stream providers each with their own data silos? Is there a user-centric solution to this rapidly growing, overflowing-stream issue that puts YASP to rest once and for all?</p></blockquote>
<p>This article answers these two questions in great detail but the succinct preview version is as follows:<span id="more-395"></span></p>
<ol>
<li>The Web does not need additional stream providers each who exert significant control over a vast number of individuals, each who require their users to have a separate new user account (a new digital identity)</li>
<li>The Web does not need additional closed data islands (data silos)</li>
<li>The Web does need a means with which each individual can create, maintain, and control their own identity, efficiently and effectively manage stream conversations, and therefore not be beholden to a few, large data-silo stream providers</li>
<li>The only way to accomplish point three is for the emergence of a distributed, decentralized, Open Source microblogging ecosystem that leverages the power of the Semantic Web</li>
</ol>
<p><strong>Table of Contents</strong></p>
<p>Since some of the following may be too generic for more advanced readers, I&#8217;m providing this Table of Contents to help readers navigate to those parts with which they may have the most interest. The first four sections are a general review of the problem and solution. The rest of the article provides my detailed thoughts on this issue.</p>
<ul>
<li><a href="#dstream">A Web of Damned Streams</a></li>
<li><a href="#flock">A Flock of Twitters</a></li>
<li><a href="#decent">Why Decentralized?</a></li>
<li><a href="#semantic">Why Semantic?</a></li>
<li><a href="#evolving">Evolving Nova’s Stream Concept</a></li>
<li><a href="#drop2">A Drop of An Idea</a></li>
<li><a href="#channel">Channeling Your Stream, Seining Your River</a></li>
<li><a href="#MBO">The MicroBlogOcean</a></li>
<li><a href="#SW">Social Web Versus Social Network</a></li>
<li><a href="#anatomy">Anatomy of a Drop</a></li>
<li><a href="#thoughts">Some Technical Thoughts</a></li>
<li><a href="#players">Some Early Players in This Space</a></li>
<li><a href="#conclusion">Conclusion</a></li>
</ul>
<p>Although you should feel free to skip ahead, doing so might result in missing a crucial connection.</p>
<div id="dstream"><strong>A Web of Damned Streams</strong></p>
<p>From a user’s perspective, one of the issues with YASP is that their Web identity is strewn throughout the Web with some of their thoughts clumped in one data silo while others are deposited in another data silo. This makes it very difficult for each user to manage all their streams and associated relationships.</p>
<p>What happens when a new, exciting stream comes along? When a new Stream comes along, users have to weigh the potential benefits of membership against the likely pain and inconvenience caused by having to create a new identity, build a new network, and manage yet another stream.</p>
<p>Social networks benefit from what is called user lock in—the very real fact that, most things being equal between social networks, a user will likely decide to stick with a social network because it takes too much work to move data from one site to another. So, instead of moving their data and possibly closing their account, a user will simply open up another account at a competing social network.</p>
<p>Of course, this version of lock in assumes that social networks allow the moving of, or the copying of, their members’ data from one network to a competing network. In reality, the vast majority of social networks do not even allow their members free access and control over their personal data.</p>
<p>The issue facing most Web 2.0 users is that they have a multitude of accounts, each with its own username and password, each associated with a specific web service, and each located in a separate, independent repository—the proverbial walled garden of disparate user data, the omnipresent data silo.</p>
<p>Although most of the large social networks do expose a portion of their users’ data via proprietary APIs, they do not run an open network. They guard their data closely, assuming ownership of all their users’ personal streams. It is easy to understand why this is the case. A social network’s competitive advantage is their users’ data.</p>
<p>The current Web is dominated by the Web-2.0 social networking meme. It is not a healthy, vibrant Web. In fact, the current Web is becoming filled with damned streams, silos whose data barely trickles out and are not openly accessible to the rest of the Web. Google Buzz, Facebook, and Twitter could almost be considered alternate Webs, their members’ data mostly disconnected from the greater Web.</p>
<p>From a user’s standpoint, it is even worse. Most of these fortresses have rules and regulations that make it difficult for users to freely access and use their data elsewhere. Two years ago, <a href="http://scobleizer.com/2008/01/03/ive-been-kicked-off-of-facebook/">Robert Scoble found out this shocking fact</a> when he tried to move his social graph from Facebook to another service.</p>
<p>What’s the result of all these damned data silos? The promise of the Social Web is hindered. Later I’ll discuss the difference between the Social Web and social networks.</p>
</div>
<div id="flock"><strong>A Flock of Twitters</strong></p>
<p>Instead of people becoming more dependent on highly centralized, proprietary microblogging services like Twitter, FriendFeed, Google Buzz, and Facebook, What if users could embed microblogging capabilities into their personal websites?</p>
<p>I don’t mean simply tie their Twitter, Facebook, and other social media streams into their website via behind the scenes, proprietary  APIs—which they can already do. I mean actually host their own microblogging platform, become their own microblogging provider.</p>
<p>People should be able to subscribe directly to your microblog, to you and not to one of your myriad profiles on someone’s data silo. The way it currently works is that a user interested in what you have to say not only has to join Twitter (or Facebook, or Google Buzz, etc), but they must also subscribe to your stream on that particular service.</p>
<p>But what if a user who was interested in what you had to say could simply subscribe to your microblog, in essence subscribe to you? What if they could pull microblogging content from your site that originated directly on your site? What if there were a flock of Twitters and not just a single, centralized Twitter?
</p></div>
<div id="decent"><strong>Why Decentralized?</strong></p>
<p>Whereas a flock of Twitters may seem like an interesting concept, you may wonder if there actually is a benefit to creating a decentralized, distributed microblogging platform.</p>
<p>Part of the original vision of the Internet was to create a distributed communications network that did not have a central point of failure. The Web added a layer that allowed anyone, in theory, the opportunity to operate their own communications platform or channel (called a website).</p>
<p>But today’s Web-2.0 data-siloed social networks have created a handful of massive points of communication failure in the daily lives of hundreds of millions of people.</p>
<p>As an example, over the past two months, Twitter has experienced increasing unreliability. In fact, on January 20, 2010, Twitter was down for 90 minutes causing an uproar in the community. Whereas this might have been a fluke, or possibly have been related to their growth rate, the cause does not really matter. What does matter is that millions of people felt lost without their connection to their network.</p>
<p>This illustrates another fact of Web-2.0 life—that the promise of a Web where everyone had their own communications channel has been usurped. Although most people naively believe they do have their own communications channel by having a Twitter, Facebook, or LinkedIn account, in reality they are beholden to a few Web behemoths to offer them communication services.</p>
<p>By creating a truly decentralized and distributed microblogging platform, users can once again regain control over their Web experience and create their own communications channels. They will benefit from increased data control, data accessibility, data usability, and data security.</p>
<p>A final benefit to decentralized microblogging: data portability is no longer an issue when you own, host, manage, and control your own data store&mdash;at least with regard to your microblog activity. You do not have to port the data into a new silo because your data is always right where it should be—in your own silo. Your data is kept by you, managed by you, and controlled by you. You may have to move periodically your database to a new server or another web hosting firm, but that is not an issue of data portability.</p>
<p>Even with decentralized microblogging, there will still be data silos. The silos will just be micro silos (or solo silos) where all the data contained within each silo represents one entity and is controlled by that one entity. It is the perfect entity-to-silo ratio.</p>
<p>A final point. There is a theoretical limit to the number of microblog installs. It is the extant human population. Actually, it is more than that if you make allowances for the fact that businesses, governmental entities, and clubs could host and manage their own microblogs. A user, after all, does not have to be an individual person. A user can be a business.
</p></div>
<div id="semantic"><strong>Why Semantic?</strong></p>
<p>Offering users the ability to operate their own microblogging platform is an enticing thought. But a decentralized, distributed microblogging system does not guarantee that data will be readily available and open throughout the Web.</p>
<p>Instead of having a few, very large closed data silos, a Web of microblogs would in essence be millions of very small closed data silos.</p>
<p>Why is being open important?</p>
<p>One of the promises of the Web in its early conception was to create a network were disparate data sources were interconnected in such a way that integration and interoperability issues went away. To accomplish that goal, data needs to be exposed.</p>
<p>Exposing data creates an entirely new realm of beneficial possibilities. Instead of websites being searched for matching keywords and phrases, the underlying data can be directly queried.</p>
<p>So, how do we open up all the micro silos? By leveraging the power of the Semantic Web.</p>
<p>This article will not go into a deep explanation of the Semantic Web. However, you can think about it in this broad way. Web browsers navigate hypertext; Semantic Web applications navigate hyperdata—data that is encoded with semantic markup and interconnected to other semantically-coded data in other locations. So, whereas hypertext is text linking to other text (documents), hyperdata is data linking to other data. <em>(See 1 &#038;  2 below)</em></p>
<p>Semantic Web applications are built using a stack of W3C-specific technologies— in particular the Resource Description Framework (RDF) and the Ontology Language (OWL). The Semantic Web technology stack is particularly important, as it provides a standardized way of encoding data without the need for a central controlling authority.</p>
<p>When data is semantically tagged, with the underlying metadata modeled using RDF and URIs, machines can “see and understand” the content. By this, I am not referring to some type of artificial intelligence (AI) engine that can infer meaning from data.</p>
<p>Instead, the data that has been encoded with semantic markup (semantic metadata) becomes structured in such a way that the intent, the meaning intended by the author is unambiguous. This is accomplished by using various ontologies (vocabularies) to tag the upper-level data with sufficient, relevant metadata that structure and meaning is added to the human-readable data.</p>
<p>Once data is opened up to discovery by being semantically marked up, the Web becomes a truly interconnected network.</p>
<p>For more information on the Semantic Web, you can start here:</p>
<ol>
<li><a href="http://twitter.com/bblfish">Henry Story</a>’s excellent presentation <a href="http://www.slideshare.net/bblfish/building-secure-open-distributed-social-networks-presentation"><em>Building Secure Open &#038; Distributed Social Networks</em></a></li>
<li>For a more detailed explanation of hyperdata, read Nova’s article, <a href="http://www.novaspivack.com/technology/the-semantic-web-collective-intelligence-and-hyperdata"><em>The Semantic Web, Collective Intelligence and Hyperdata</em></a></li>
<li>For more information on the Semantic Web (definitions, RDF, and development tools), <a href="http://www.w3.org/2001/sw/SW-FAQ">visit this link</a></li>
<li>For a brief history of the Semantic Web, read James Hendler&#8217;s article, <a href="http://network.nature.com/people/jhendler/blog/2009/06/16/what-is-the-semantic-web-really-all-about"><em>What is the Semantic Web really all about?</em></a></li>
</ol>
<p>Since it is difficult to succinctly and accurately describe the Semantic Web in layman’s terms, I encourage you to read other sources and become well versed in the Semantic Web&ndash;its concepts, underlying technologies, and how you can participate in it.</p>
</div>
<div id="evolving"><strong>Evolving Nova’s Stream Concept</strong></p>
<p>Before I get too far into the specifics, I need to present a new interpretation of what <a href="http://www.novaspivack.com/">Nova Spivack</a> calls the Stream.</p>
<p>One of the powers of Nova’s Stream concept–at least in my opinion–is that it evokes the imagery of a flowing body of water. As I began gathering my thoughts for this article, it became apparent that his Stream metaphor could be expanded, could be evolved in a way that sets the table for a more meaningful discussion about decentralized semantic microblogging.</p>
<p>Nova describes the Stream as follows:</p>
<blockquote><p>Just as the Web is formed of sites, pages and links, the Stream is formed of streams.</p>
<p>Streams are rapidly changing sequences of information around a topic. They may be microblogs, hashtags, feeds, multimedia services, or even data streams via APIs.</p></blockquote>
<p>In my extension to his concept, I diverge somewhat from his original definition of the Stream. Instead of viewing each stream as an information flow around a particular topic, I’ve reimagined the stream as the flow of ideas from a given individual. A Stream is thus a monologue that contributes to a greater conversation.
</p></div>
<div id="drop2"><strong>A Drop of An Idea</strong></p>
<p>In keeping with the metaphor of a flowing body of water, I envisioned a water-cycle like flow from a single idea to an ocean of open discussion. Therefore, I call my model of a decentralized microblogging ecosystem the Meta-Hydrological Model.</p>
<p>With that concept in mind, you can think of a single idea posted by a user as a drop. Just as a user of Twitter adds to a conversation by posting a tweet, and a user of FriendFeed or Facebook makes what is generically called a micropost, a user in this new conversation ecosystem posts a drop. So a drop is equal to a tweet is equal to a micropost.</p>
<p>Here is a simplified, graphical representation of the Meta-Hydrological Model (also called the Meta-Flow for short).<div id="attachment_398" class="wp-caption alignleft" style="width: 310px"><a href="http://jeffsayre.com/wp-content/uploads/2010/02/Drop_MetaFlow.png"><img src="http://jeffsayre.com/wp-content/uploads/2010/02/Drop_MetaFlow-300x180.png" alt="" title="The Meta-Flow" width="300" height="180" class="size-medium wp-image-398" /></a><p class="wp-caption-text">Click to see full size</p></div></p>
<p>The aggregation of all of a given user’s Drops is that user’s Stream. Viewed in this way, if a Stream is what a single user produces, then the River is the confluence of disparate users’ Streams. I’ll describe this in more detail later.</p>
<p>Within each user’s Stream, ideas might coalesce into specific topics. I call these Channels (Stream Channels). Channels are Drops that are grouped under a specific topic to form substream categories.</p>
<p>The final part of the Meta-Hydrological Model is what I call the MicroBlogOcean (MBO). The MBO is the sum total of all microblogging activity in the global conversation ecosystem. It is all the conversations, represented by all the Rivers.</p>
<p>Below is a natural, visual representation of this model as seen from space.</p>
<div id="attachment_404" class="wp-caption alignright" style="width: 310px"><a href="http://jeffsayre.com/wp-content/uploads/2010/02/amazon-delta-lg.jpg"><img class="size-medium wp-image-404" title="Amazon Delta As Seen from Space" src="http://jeffsayre.com/wp-content/uploads/2010/02/amazon-delta-lg-300x300.jpg" alt="" width="300" height="300" /></a><p class="wp-caption-text">Satellite image of the Amazon River delta from NASA&#39;s Landsat GeoCover Program</p></div>
</div>
<div id="channel"><strong>Channeling Your Stream, Seining Your River</strong></p>
<p>In our hydrological metaphor, a River is the confluence of disparate users’ Streams. But it is not a passive mixing of user ideas. Instead, each user has their own unique River, a River that they assemble, that they control. In particular, a River is the aggregation of all the Streams to which a given user is subscribed. It is similar to your following list on Twitter.</p>
<p>With Twitter, however, there is no practical way to filter the streams of those whom you follow. You subscribe to their entire stream of consciousness. Wouldn’t it be great if you could decide what thoughts, what information you let other users send flowing down your River? Wouldn’t you like the option to grab just the content in which you are truly interested?</p>
<p>Whereas users could of course choose to subscribe to your entire treasure trove of thoughts, by organizing your content into Channels, you provide a means whereby your subscribers can filter out what they do not care to see. They would have the option to subscribe just to your substream(s) and not your entire Stream.</p>
<p>Why is this important?</p>
<p>Well, as an example, for absolutely every person I currently follow on Twitter, <a href="http://jeffsayre.com/2010/03/13/nosquare-and-nowalla-polluting-the-stream/">I don’t care who just booted whom out as the mayor of whateverville</a>. I don’t want that drivel polluting my pleasant paddle down my River. It adds zero value to my day and provides little if any entertainment.</p>
<p>I also rarely need to know (nor care to know) whenever someone has just stopped by a Starbucks, or is eating at this and such restaurant 1000 miles away, or is on a treadmill listening to Kid Rock on their fancy Zune. It’s also the case for many people whom I follow that I’m not actually interested in all the serious topics about which they micropost. In effect, I actually subscribe to them only for a small subset of their shared knowledge.</p>
<p>Now, to be perfectly fair, I bet some of my followers would be very glad to filter out my microposts on the Semantic Web, whereas others would be happy to stop seeing my microposts about WordPress or BuddyPress. It may also be the case that no one cares at all to see any of my general thoughts that I occasional let float down their River. I think my subscribers, my followers, should have the right to filter out what they consider to be MY drivel.</p>
<p>By providing a mechanism for channeling thoughts into topics, our new microblogging client would provide a better user experience. The utility of user Channels could be further improved by offering public and private Channels. A Public Channel would be visible to all and open to subscription. A Private Channel would only be available to those users who are granted access via their WebID (more on the concept of using the WebID later).
</p></div>
<div id="MBO"><strong>The MicroBlogOcean</strong></p>
<p>As mentioned above, the totality of all microblogging activity is called the MicroBlogOcean (MBO). In this global conversation ecosystem, Drops are constantly being pushed to and pulled from the MBO cloud.</p>
<p>To provide and manage the myriad MBO services, a new type of SaaS model needs to be created. I call this software-based service a Confluence Hub. A confluence is the point where two or more bodies of water meet. Therefore, a Confluence Hub is the place where Drops sent by various users meet up, are processed, and wait for further action. <div id="attachment_471" class="wp-caption alignleft" style="width: 310px"><a href="http://jeffsayre.com/wp-content/uploads/2010/02/Drop_MetaCycle2.jpg"><img src="http://jeffsayre.com/wp-content/uploads/2010/02/Drop_MetaCycle2-300x247.jpg" alt="" title="The Meta-Hydrological Cycle of a Drop" width="300" height="247" class="size-medium wp-image-471" /></a><p class="wp-caption-text">Notice User has only subscribed to User 3's Channel. Click for full size</p></div>
<p>This is how the process works. A user’s client sends a Drop to the closest Confluence Hub where an amalgamator combines them for transmittal to all that user’s subscribers. The Drops are organized by Channels, if any, and cached. If a Confluence Hub (CH) is down, then the Drop is automatically rerouted to the next closest hub.</p>
<p>An aggregate is a collection of items that are gathered together from different sources. The role of the client-side aggregator then, is to poll, to query the primary Confluence Hub Server (CHS) of each user Stream to which a user is subscribed, pulling the resultant dataset into their River on a predefined, regular interval.<div id="attachment_472" class="wp-caption alignright" style="width: 291px"><a href="http://jeffsayre.com/wp-content/uploads/2010/02/Channel_Filter.jpg"><img src="http://jeffsayre.com/wp-content/uploads/2010/02/Channel_Filter-281x300.jpg" alt="" title="Seining a Channel" width="281" height="300" class="size-medium wp-image-472" /></a><p class="wp-caption-text">Only the content the User wants gets through. Click for full size</p></div></p>
<p>So, whereas a user’s Drop is pushed to the closest, active Confluence Hub, the Drops of each user that they follow are pulled into their River from the MBO cloud.</p>
<p>Using our hydrological-based metaphor, Drops are created and stored on each owners’ site. This means any Drops that are de facto responses to someone else&#8217;s Drop are contained within disparate sites across the Web. Whereas the user’s client would cache all incoming Drops (in their River) and the application might even have an option to save a discussion to disk, the original Drop remains located in the owner’s Stream.</p>
<p>The Meta-Flow concept is not a perfect analogy to a natural hydrological flow. Whereas Drops do travel to Confluence Hubs, copies of those Drops are pulled into each subscribing-user’s client to form their unique River. The MicroBlogOcean therefore contains multiple references to the same original Drop and the Rivers actually flow out of the MBO rather than into it.</p>
<p>Although I personally believe this hydrological-based metaphor does a sufficient job of breaking down and describing the component parts of the overall decentralized microblogging ecosystem, for purposes of user understandability, the terms may need to be replaced with a more generic, globally-recognized nomenclature. Although, what is more globally recognizable than the water cycle?
</p></div>
<div id="SW"><strong>Social Web Versus Social Network</strong></p>
<p>When talking about the Semantic Web, it’s important to differentiate between social networks and the Social Web. These terms are not synonyms. In fact, the Social Web is not even the sum of all social networks.</p>
<p>Why is this the case?</p>
<p>Today’s social networks are nothing more than the famous walled gardens of the Web&mdash;as was <a href="#dstream">previously discussed</a>.</p>
<p>With their closely-guarded data silos, social networks are not full participants in the Web, they are not participants in the interconnected data ecosystem. So, unlike an ecological web (think of a food web), the Web-based Internet is not as much of an intact web as it is a land of social network islands that punctuate an ocean of truly connected websites.</p>
<p>The Social Web, on the other hand, is a fully functioning and healthy ecosystem were all data are globally connected. In my view, the only way to bring to fruition the promise of the Social Web is to embrace the Semantic Web.</p>
<p>The term Social Semantic Web is often used to differentiate between the current social-network based Web and a truly connected Web of Data. Since I believe that the Social Web requires the Semantic Web, I view the two terms as synonyms.</p>
<p>What might a truly connected Social Web look like?</p>
<p>I use this image as a graphical representation of what an open, fully linked, global Social Web would look like (see the caption for the actual description of the image). Imagine that each end point is a user creating their Drops that freely flow down their Stream, into their River, finally ending up in the MBO cloud. Each node, the point were multiple Streams converge, would be a Confluence Hub Server.</p>
<div id="attachment_443" class="wp-caption alignleft" style="width: 310px"><a href="http://jeffsayre.com/wp-content/uploads/2010/02/Internet_traffic.jpg"><img src="http://jeffsayre.com/wp-content/uploads/2010/02/Internet_traffic-300x300.jpg" alt="" title="Internet Traffic Map" width="300" height="300" class="size-medium wp-image-443" /></a><p class="wp-caption-text">This image is a tracing of all the Internet traffic circa late 2006. It is licensed under a Creative Commons License (by-nc-sa/1.0) and created by http://opte.org/</p></div>
<p>Where would the big social networks appear on this graph?</p>
<p>Twitter would be a single point in this image with a few tenuous tendrils extending out representing the limited access that Twitter allows to their data silos via their proprietary APIs. There would be no lines representing conversations between users as the totality of conversation all occurs within the walled-off Twitter space.</p>
<p>The same holds true for Facebook, Google Buzz, FriendFeed, LinkedIn, and many of the other social networks. The lines connecting these services would be nothing more than gossamer strands representing the brute-force pushing of limited duplicate content between these data silos.</p>
<p>You might be thinking that conversations regularly occur between users of these platforms. For instance, I can choose to show my latest tweets on Facebook or LinkedIn, I can choose to display my latest Facebook or LinkedIn status updates on Twitter, and so forth. But these are not conversations. They are just snapshots of conversation that are occurring within other data silos.
</p></div>
<div id="anatomy"><strong>Anatomy of a Drop</strong></p>
<p>A Drop contains more than just the visible content, more than just the human-readable layer. A Drop is a packet composed of several layers, each providing additional metadata that makes the management and discovery of data more feasible.</p>
<div id="attachment_399" class="wp-caption alignright" style="width: 310px"><a href="http://jeffsayre.com/wp-content/uploads/2010/02/DropLayers.png"><img class="size-medium wp-image-399" title="Anatomy of a Data Drop" src="http://jeffsayre.com/wp-content/uploads/2010/02/DropLayers-300x225.png" alt="" width="300" height="225" /></a><p class="wp-caption-text">Click to see full size</p></div>
<p><em>Content Layer</em>: that part of the Drop that is actually intended to be seen by humans; also referred to as the droplet</p>
<p><em>Metadata Condensate</em>: when the Drop is being assembled, different metadata layers are aggregated together, which are then deposited into a super-metadata layer. This layer encodes all the supporting data that makes extensibility, management, delivery, and discovery of the user’s Drop possible.</p>
<p>The Metadata Condensate layer is composed of five sub layers:</p>
<p>Rich-media Layer: pointers to associated audio, video, or picture files</p>
<p>Semantic Layer: the machine-readable, semantically-marked up metadata</p>
<p>Rights Layer: the granted usage rights for the Drop</p>
<p>Using the proposed <a href="http://sciencecommons.org/projects/publishing/open-access-data-protocol/">Protocol for Implementing Open Access Data</a> as a model, Drops, Channels, and even entire Streams could be marked with usage rights</p>
<p>Security Layer: WebID to tag Drop to specific user; whether Drop is public, private</p>
<p>Stream Management Layer: unique Drop ID; time stamp; GIS metadata (location-based tagging for mobile microblogging); Channel tag for grouping Drop content (allows filtering by other users); whether Drop is to be broadcast to all, a specific user group, or to one specific user; Drop broadcast delay; Drop time decay (a finite lifespan for Drop if desired); client metadata (whether Drop was sent via Web client, desktop client, via a CHS service, etc.)</p>
<p>Semantifying the Drop addressees several key issues that hinder current microblogging platforms. First, by providing a mechanism where machine-readable metadata can be effectively and efficiently associated with Drops, this unlocks each micro data silo, opening it up to outside services to access via query. Second, organizing, grouping, classifying Drops into Channels allows for meaningful filtering of users content. Third, by using a FOAF+SSL backed WebID, privacy and identity management across the MBO becomes possible.</p>
<p>Whereas users can still add tags (via micro and nanoformats) when composing each Drop&ndash;and maybe even some basic html markup, like the &#8220;a&#8221; link tag&ndash;the real benefit accrues from the automatic encoding of semantic metadata into the Drop.</p>
<p>Additional ontological encoding could occur on each Drop via a Semantic Interface Options box on the Drop composition panel.</p>
<p>It’s important to note that although each individual user will have the right to determine how much of their microblogging content is shareable across the Web and even with whom it can be shared, in concept, if a user is wishing to participate in the global microblogging community, it is assumed that they will wish others to see what they have to say.</p>
<p>This is just an initial concept of the structure of a Drop. It may be that one or more of the Metadata Condensate layers (or parts of a given layer) should be included under the Semantic Layer.</p>
</div>
<div id="thoughts"><strong>Some Technical Thoughts</strong></p>
<p>This article is primarily a presentation of an initial concept. The technical details obviously need to be fleshed out. But I have ideas toward that end which I’ll present here in no particular order of importance.</p>
<p><em>User and Stream Management</em></p>
<p>How do users login into their Streams? How do users subscribe to another person’s Stream?</p>
<p>By using a combination of FOAF+SSL, the micbroblogging ecosystem would authenticate and authorize users based on their <a href="http://esw.w3.org/topic/WebID">WebIDs</a>. </p>
<p>So, as an example, a single user (authenticated via their WebID and FOAF+SSL) of type foaf:Person will subscribe to, will follow the Streams of many users of type foaf:Person.</p>
<p>NOTE: At this point some readers may be asking why OpenID, a well-known SSO, is not being suggested. The reason is that <a href="http://blogs.sun.com/bblfish/entry/what_does_foaf_ssl_give">OpenID has some important limitations</a>. But the use of FOAF+SSL does have a big limitation at this time ( thanks to <a href="http://twitter.com/webr3">nathan</a> for pointing this out). Many smartphones do not support SSL certificates. One possible solution is to use FOAF+OpenID. But, all things being equal, a WebID backed by FOAF+SSL is more powerful, easier to use, and takes advantage of the FOAF Semantic Web ontology.</p>
<p><em>Fault Tolerance and Redudancy</em></p>
<p>Redundant distribution and replication to geo-disparate Confluence Hub Servers could provide additional fault-tolerance for those stream providers who want too ensure that their subscribers are guaranteed access to their Streams at all time. This would be very useful in crisis situations where the real-time nature of microblogging has proven extremely beneficial during several recent natural disasters.</p>
<p><em>Platform Ecosystem</em></p>
<p>My model of a decentralized semantic microblogging ecosystem (the Meta-Hydrological Model) requires three basic software components:</p>
<p>Personal Stream Server (PSS): the client software that a user uses to create their Stream and manage their River.</p>
<p>Community Stream Server (CSS): for those users who do not want to manage their own self-hosted solution, a community-based, public Stream provider is necessary. Such providers could offer the service for free or for a fee. The important issue here is that all users with an account at a Community Stream Server would be the owners of all their data, deciding how the data is used and exposed. If they wished to move their data (their Stream identity) to another server, they could easily do so. Community Stream Servers would be configured so that users could brand their identity, using their own domain names.</p>
<p>Confluence Hub Server (CHS): this has been discussed in more detail above. In addition to the aforementioned duties, each CHS would also be responsible for co-aggregating the realtime view of the MicroBlogOcean.</p>
<p>Unlike the handful of DNS root zones in the Domain Name System, the number of Confluence Hubs would not be limited by any authority. Anyone who meets a set of minimum requirements (hardware, software, and bandwidth) could host a CHS. Although anyone could download the CHS platform software, only those whose setup meet the minimum requirements would be able to initiate an active CHS service.</p>
<p><em>Client-Server Software Architecture</em></p>
<p>The software architecture of client and server, as well as the UI/UX, is beyond the scope of this article. Although I do have a few top-level suggestions/ideas:</p>
<ol>
<li>Software stack must utilize all open-source based technologies</li>
<li>Use of a graph database backend (or a similar NOSQL DB) which is better suited at modeling the graph-like nature of social networks. For more details on this comment, look for my upcoming <em>Powering Startups to Become Smartups</em> series.</li>
<li> Possibly the use of a language that allows for coding of a Web-based interface as well as desktop client software (Java, Python, or Ruby to name a few). One of the drivers of growth and success for Twitter has been the development of 3rd-party desktop clients. It may make sense to offer an initial version of such a client along with the Web-based interface.</li>
</ol>
<p>These are just kernels of an idea about possible architectural considerations.</p>
<p><em>Possible Extensions to FOAF and SIOC Ontologies</em></p>
<p>As the <a href="http://xmlns.com/foaf/spec/">FOAF</a> specification states, “FOAF documents describe the characteristics and relationships amongst friends of friends, and their friends, and the stories they tell.” In the world of social networking&ndash;especially decentralized microblogging&ndash;the concept of friend can be very nebulous.</p>
<p>This is why microblogging services like Twitter and Google Buzz use the term follower, and FriendFeed (owned by Facebook) uses the term subscriber. It is a one-way relationship that does not have implicit reciprocity.</p>
<p>In other words, just because I follow you does not imply that you follow me, that you plan on following me, or that you will ever follow me. In fact, in practically all cases, users with large followings do not know and are not even aware of the vast majority of their followers.</p>
<p>The FOAF concepts of “friend” and “know” are often not in tight alignment with the realities of the newer social networks. A better classification of these relationships needs to be created.</p>
<p>A new FOAF class of foaf:Following may be all that is needed to rectify this type mismatch. A list of all the people that a given user is following could easily be compiled by querying the system for all unique foaf:Following relationships. This list could be further broken down by unique social networks by extending the query to include property foaf:account. It would equally be simple to determine all of the people who are following a given user.</p>
<p><em>Addendum: Thanks to comments below from John Breslin and Alexandre Passant who pointed out the SIOC specification does have the sioc:follows property. So, using foaf:Person with sioc:follows could properly classify a following relationship. </em> </p>
<p>How should users of a globally decentralized semantic microblogging platform be classified?</p>
<p>Each user would be identified via their WebID and not their sioc:User type&mdash;which is utilized only for marking up the various accounts a user has throughout the Web of social networks.</p>
<p>Whereas the <a href="http://rdfs.org/sioc/spec">SIOC Core Ontology</a> is designed for easy extendability, the emergence of decentralized microblogging may necessitate an addition to the core classes as the current classes do not fully capture the uniqueness of such a system.</p>
<p>Whereas discussions within traditional blogs and forums occur on the same site (within the same data silo), discussions on a decentralized microblogging cloud are not the same. The discussions occur across the cloud, across the Social Semantic Web. This then becomes an issue of classifying relationships within the Social Web and not between disparate social networks and their data silos.</p>
</div>
<div id="players"><strong>Some Early Players in This Space</strong></p>
<p>There are a few early players in the decentralized microblogging platform space and at least one in the open source centralized blogging arena. It is important to note that only one of the players below is working on a decentralized semantic microblogging implementation.</p>
<ul>
<li><a href="http://smob.me/">SMOB</a>: self described as an open, distributed Semantic MicroBlogging framework</li>
<li><a href="http://www.get6d.com/">6d</a>: self described as decentralized social network. This is not a true microblogging platform but I thought it should be included for reference.</li>
<li><a href="http://onesocialweb.org/code.html">onesocialweb</a>: an open-source application created by the Vodafone Group described as a free, open, decentralized microblogging platform</li>
<li><a href="http://status.net/">StatusNet</a>: the open source, centralized microblogging platform that powers <a href="http://identi.ca/">Identi.ca</a></li>
<li>ADDED March 16, 2010: <a href="http://groups.fsf.org/wiki/Group:GNU_Social">GNU social</a>: A project of the Free Software Foundation to create a &#8220;decentralized social network that you can install on your own server.&#8221;</li>
</ul>
<p>Which of these is the right solution?</p>
<p>While all of these are encouraging entrants in the space, SMOB shows the most promise at this time as it is the only platform that is working on bringing about the Social Web through decentralized semantic microblogging.
</p></div>
<div id="conclusion"><strong>Conclusion</strong></p>
<p>It’s time to return to the original concept of the Web-based Internet&mdash;an interconnected, decentralized and distributed, open and independent cacophony of individuals who control their own Webspace, operate their own communication channel, and freely communicate with others without having to worry about a central point of failure.</p>
<p>The only way to build a truly open and decentralized global microblogging network is by leveraging the power of the Semantic Web. Doing so will help usher in the reality of the Social Web.</p>
<p>Decentralizing and individualizing Stream creation and management will help ensure that the MicroBlogOcean does not have a central point of failure and does not require a central-controlling authority. With a properly semantified and structured Stream, even efficient and effective privacy and identity management become feasible.</p>
<p>This article is just one drop in the bucket (yep, I had to say it). It is a first version of an evolving concept. As people provide constructive feedback and the idea gets debated, I’ll openly evolve this concept to better reflect the realities of the emerging Social Web and the technologies that will help bringing it to fruition.</p>
<p><em>Additional Background Information:</em> Read my short post about Facebook and privacy issues: <a href="http://jeffsayre.com/2010/01/11/privacy-in-the-facebook-era/">Privacy in the Facebook Era</a></p>
<p><em>FOLLOW UP (March 16, 2010):</em> A number of people have asked me via Twitter how to follow developments on this topic. Unfortunately, Twitter is not well suited for &#8220;following&#8221; ideas since there is no way to create groups. The real-time Web is not about building groups that can upload documents, create lists, and have an easily-searchable history. So, we have created the <a href="http://identi.ca/group/smob">Semantic Mirco Blogging group on identi.ca</a>. You can sign up there and participate in the discussions.</p>
<p><em>FOLLOW UP (March 20, 2010):</em> There are a number of additional services that a distributed, decentralized semantic microblogging platform could perform. One such service would be to replace the current closed-siloed, location-based, check-in services like Foursquare, Gowalla, Brightkite, etcetera. Currently, these services are is competition for users&#8217; time. They also pose <a href="http://jeffsayre.com/2010/03/13/nosquare-and-nowalla-polluting-the-stream/">some issues as discussed in my brief post here</a> and this article, <a href="http://techcrunch.com/2010/03/19/check-in-fatigue-location-war/">Check-In Fatigue. Or, Why I’m Rooting For An All-Out Location War</a>. If users could use their own microblogging space to not only post their Drops but also to post location-based check-ins, it would allow for the filtering, the channeling, of that data so that their subscribers could opt-out of having such check-ins float down their River.
</div>
]]></content:encoded>
			<wfw:commentRss>http://jeffsayre.com/2010/02/24/a-flock-of-twitters-decentralized-semantic-microblogging/feed/</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
		<item>
		<title>Flocking To the Stream</title>
		<link>http://jeffsayre.com/2010/02/17/flocking-to-the-stream/</link>
		<comments>http://jeffsayre.com/2010/02/17/flocking-to-the-stream/#comments</comments>
		<pubDate>Wed, 17 Feb 2010 21:13:37 +0000</pubDate>
		<dc:creator>Jeff Sayre</dc:creator>
				<category><![CDATA[Social Media & Semantic Web]]></category>
		<category><![CDATA[data silos]]></category>
		<category><![CDATA[microblogging]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://jeffsayre.com/?p=366</guid>
		<description><![CDATA[I recently began to go through some article backlogs on the websites of various people whose thoughts and perspectives I want to understand better. One such person with whom I’m trying to play catch up is Nova Spivack. If you don’t follow Nova then I suggest taking the time to remedy that egregious error.
Since I’m [...]]]></description>
			<content:encoded><![CDATA[<p>I recently began to go through some article backlogs on the websites of various people whose thoughts and perspectives I want to understand better. One such person with whom I’m trying to play catch up is <a href="http://twitter.com/novaspivack">Nova Spivack</a>. If you don’t follow Nova then I suggest taking the time to remedy that<span id="more-366"></span> egregious error.</p>
<p>Since I’m basically working through Nova’s article archive in reverse chronological order, it may very well be that in the future, I’ll scribe thoughts on some of his even older ruminations. So, if that occurs, please pardon this information time dilation.</p>
<p><strong>The Stream</strong></p>
<p>I read Nova’s article, <a href="http://www.novaspivack.com/uncategorized/welcome-to-the-stream-next-phase-of-the-web"><em>Welcome to the Stream – Next Phase of the Web</em></a>, with great interest. With all the buzz about Google Buzz over the past eight days or so, this article made me think about the yet-another-stream phenomenon (YASP). *1</p>
<p>What is YASP? It is that somewhat exciting but ultimately frustrating realization that there is yet another social networking, microblogging, threaded-conversation service that you might have to join so that you don’t get left behind.</p>
<p>The idea of user streams is interesting. As I read Nova’s article, the imagery of a kayaker navigating down world-class rapids came to mind.</p>
<p>There is a qualitative difference in streams. Some streams may drizzle like a gentle shower, while others furiously flow like class-5 rapids.</p>
<p>Unfortunately, a higher flow rate does not necessarily equal higher quality. In my experience, there is a noticeable decrease in the signal versus noise ratio as the flow of each stream increases. This is why it is crucial to follow only those people with whom you are genuinely interested in hearing their thoughts. Simply following someone (or following them back) to build your follower numbers is a sure-fired way to increase the noise in your stream.</p>
<p><strong>High Flow Is Not Always Healthy Flow</strong></p>
<p>As users begin to tap into more streams, those streams usually start flowing faster. As Nova states, we need to create filters, or gates, that can discriminately select the signal from the noise, that can help to slow the flood of information. </p>
<p>Look at Twitter. As you follow more and more people, the rate of flow increases. In turn, you must work harder to fish the nutritious data from the swollen data stream. Eventually, the stream can become too treacherous to navigate. So, you either drop a number of people, thereby reducing the flow and hopefully increasing the signal to noise ratio, or you portage on over to another stream with more gently moving data.</p>
<p>This is exactly what some people did last year when they tried an experiment, switching from primarily using Twitter to only using FriendFeed. Of course, that stream quickly became a fast moving torrent as well. So, what’s next? Will these users jump ship once again, looking for the next, best, newest, and maybe calmer body of data to sail?</p>
<p>Well, we already have a new test underway with the introduction of Google Buzz. Many Twitterers have Gmail accounts and many of them activated their new Buzz stream. However, the early consensus from Buzz users is that Buzz is a Twitter-FriendFeed hybrid.</p>
<p>I tried using Buzz for several days but found that it was too much information being shared by too few people. It was a lot of noise and not enough signal.</p>
<p>Of course, my impression could also be the inevitable result of information overload. When you have too many concurrent streams to navigate&ndash;Twitter, Facebook, Skype, iChat, an IRC channel or two, email, and Buzz&ndash;it becomes a little too much to take in. So, what’s the answer?</p>
<p><strong>Taking a Break From and Portaging Your Streams</strong></p>
<p>The key to navigating successfully and safely in any fast moving, constantly changing environment is to get out of the flow every so often to rest and reassess the situation. Let the flow pass you by and take a break. The stream will continue to flow without you.</p>
<p>Even the best world-class paddlers have to get out of the rapids periodically and take a break. When they return to the stream, they concentrate only on what is ahead and never worry about what has already passed them by.</p>
<p>Sometimes, though, you have to take your kayak out of the water and portage to another stream. That’s an important lesson to us all. You cannot successfully navigate every stream at the same time. Pick a few streams to monitor at a time. Then portage on over to another stream or two for awhile, taking a break from the others.</p>
<p>What does this mean for Google Buzz’s future? What does this mean for other microblogging service providers that inevitably will come to the party, trying to get you to put another kayak into their stream?</p>
<p>Well, as the number of streams continue to increase and as the flow rate of each stream picks up, people will grow tired of having to subscribe to, having to join yet-another-stream phenomenon (YASP). Does the Web truly need additional stream providers each with their own data silos? Is there a user-centric solution to this rapidly growing, overflowing-stream issue that puts YASP to rest once and for all?</p>
<p>There is, which is the subject of my next post coming <del datetime="2010-02-18T20:08:25+00:00">tomorrow</del> this Friday&mdash;<em>A Flock of Twitters: Decentralized Semantic Microblogging</em>.</p>
<p><em>NOTE</em></p>
<p>1. YASP: Yes, I just made this phrase and acronym up. Feel free to spread it around the Web, turning it into yet-another-disgusting buzzword (YADB).</p>
]]></content:encoded>
			<wfw:commentRss>http://jeffsayre.com/2010/02/17/flocking-to-the-stream/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Big Snow Equals Global Cooling, What?</title>
		<link>http://jeffsayre.com/2010/02/12/big-snow-equals-global-cooling-what/</link>
		<comments>http://jeffsayre.com/2010/02/12/big-snow-equals-global-cooling-what/#comments</comments>
		<pubDate>Fri, 12 Feb 2010 18:56:57 +0000</pubDate>
		<dc:creator>Jeff Sayre</dc:creator>
				<category><![CDATA[Nature & Ecology]]></category>
		<category><![CDATA[climate change]]></category>
		<category><![CDATA[global warming]]></category>
		<category><![CDATA[nature]]></category>
		<category><![CDATA[science]]></category>

		<guid isPermaLink="false">http://jeffsayre.com/?p=344</guid>
		<description><![CDATA[With the recent record-setting snowstorms in the Mid-Atlantic states, global climate change deniers are once again crying foul with global warming and ringing the global cooling bell. People need a heaping helping of science literacy to weather this storm, to rationally understand the overall processes that can cause massive winter storms like this even when [...]]]></description>
			<content:encoded><![CDATA[<p>With the recent record-setting snowstorms in the Mid-Atlantic states, global climate change deniers are once again crying foul with global warming and ringing the global cooling bell. People need a heaping helping of science literacy to weather this storm, to rationally understand the overall processes that can cause massive winter storms like this even when the average global temperature is increasing.<span id="more-344"></span></p>
<p>So, here are three sources to get you started:</p>
<ol>
<li> My blog post, <a href="http://jeffsayre.com/2010/01/04/the-hot-air-about-global-climate-change/"><em>The Hot Air About Global Climate Change</em></a></li>
<li>A timely, short recap of the <a href="http://www.repoweramerica.org/climate-change-causes-severe-weather/">affects of global warming on global climate</a></li>
<li> A humorous, but poignantly true, <a href="http://www.thedailyshow.com/watch/wed-february-10-2010/unusually-large-snowstorm">report from the Daily Show</a></li>
</ol>
<p>As I sit in my office looking out at a gorgeously sunny day&ndash;where I live, it&#8217;s an unusual treat to have 7 days in a row with bright sun in the winter&ndash;and pondering the fact that our average snowfall is almost 15% below for this time in February, I think how odd it is that states to our east and to our south are having an exceptionally severe winter. But, then I think about the science and realize that global climate change does not mean hotter and drier everywhere at the same time. So, if you are in the global cooling camp, please cool down your hot rhetoric and learn more about the science.</p>
]]></content:encoded>
			<wfw:commentRss>http://jeffsayre.com/2010/02/12/big-snow-equals-global-cooling-what/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>It’s Chemical Free and Not Tested on Animals!</title>
		<link>http://jeffsayre.com/2010/02/03/it%e2%80%99s-chemical-free-and-not-tested-on-animals/</link>
		<comments>http://jeffsayre.com/2010/02/03/it%e2%80%99s-chemical-free-and-not-tested-on-animals/#comments</comments>
		<pubDate>Wed, 03 Feb 2010 22:55:14 +0000</pubDate>
		<dc:creator>Jeff Sayre</dc:creator>
				<category><![CDATA[Nature & Ecology]]></category>
		<category><![CDATA[leadership]]></category>
		<category><![CDATA[nature]]></category>
		<category><![CDATA[rant]]></category>
		<category><![CDATA[science]]></category>

		<guid isPermaLink="false">http://jeffsayre.com/?p=305</guid>
		<description><![CDATA[As a trained scientist, there are two phrases that stir up my ire every time I see them in marketing copy: “chemical free” and “not tested on animals.” I know that may seem odd, but with our woefully-gullible and science-challenged populace, this is a real issue to me.
I was planning to post an article this [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://jeffsayre.com/2010/02/03/it%e2%80%99s-chemical-free-and-not-tested-on-animals/animaltesting/" rel="attachment wp-att-320"><img src="http://jeffsayre.com/wp-content/uploads/2010/02/AnimalTesting-150x150.png" alt="" title="Not Tested on Animals" width="150" height="150" class="alignleft size-thumbnail wp-image-320" /></a>As a trained scientist, there are two phrases that stir up my ire every time I see them in marketing copy: “chemical free” and “not tested on animals.” I know that may seem odd, but with our woefully-gullible and science-challenged populace, this is a real issue to me.</p>
<p>I was planning to post an article this morning about the Semantic Web and Web 3.0 but this gnawed at me as I just ran into these phrases once again. So, I decided to write a quick rant. I’ll post the more serious stuff in a week or two.</p>
<p>Okay, my rant is now officially beginning&#8230;<span id="more-305"></span></p>
<p><code>&laquo;rant&raquo;</code></p>
<p><strong>I Am Not an Animal</strong></p>
<p>Contrary to the Elephant Man’s insistence, he was indeed an animal. So was his mother. So were all the people who mocked him. So is every human being that has ever lived or is currently living.</p>
<p>People–our species, <em>Homo sapiens</em>–are in the Kingdom Animalia. We are animals just like the birds and squirrels outside my window; just like the butterflies that I enjoy watching in the summer; just like the mosquitos that I don’t enjoy nearly as much as the butterflies; just like the fish I had for dinner last night, which I enjoyed more than the mosquitoes who seem to enjoy me.</p>
<p>Get over it people. We ARE animals. If you think otherwise, then go back to school and take a basic science class.</p>
<p>People = humans = <em>Homo sapiens</em> = animals</p>
<p>animals = {people; fish; flies; gnats; beetles; cats; dogs; mice; lions; aardvarks; sloths; worms; snakes; frogs; turtles; sharks; bees; and many more species}</p>
<p>So, the next time you want to write about the difference between humans and animals, instead think about writing about the difference between people and non-human animals.</p>
<p>Case closed.</p>
<p><strong>Universe in a Vacuum: It’s Chemical Free</strong></p>
<p>We’ve all seen advertisements for chemical free skin-care products, or all &#8220;natural&#8221; chemical free laundry detergent, or chemical free organic lawn products.</p>
<p>To these amazing claims, I ask, Oh really?</p>
<p>Chemical free. Contains no chemicals. These are idiotic claims that many “natural” products companies use in their marketing copy. (Now, before you think that I&#8217;m against natural, organic products&ndash;I am not, I use them all the time&ndash;please read on.)</p>
<p>To make my point, let’s look at two simple examples of everyday chemicals.</p>
<ul>
<li>Water: Yep, it’s a chemical</li>
<li>Oxygen: it’s one of the 117 (or so) known elements, also called atoms. But guess what? It’s also a chemical just like the other 116 (or so) elements</li>
</ul>
<p>That’s right. Even the base elements–those funny little guys that comprise the <a href="http://www.periodicvideos.com/">Periodic Table of Elements</a>–are considered chemicals, although they are often referred to as chemical elements. Why do you think it’s called Chemistry Class?</p>
<p>Speaking of water, not only is it a chemical, it is also a molecule composed of two different bonded species of atoms—hydrogen and oxygen. Thus, it is composed of two different chemicals and is therefore often referred to as a chemical substance.</p>
<p>So, when I buy a product that is claimed to be chemical free, I expect to have just purchased something that contains absolutely nothing. No, that’s not sufficient. <div id="attachment_350" class="wp-caption alignright" style="width: 235px"><a href="http://jeffsayre.com/wp-content/uploads/2010/02/IMG_0008.jpg"><img src="http://jeffsayre.com/wp-content/uploads/2010/02/IMG_0008-225x300.jpg" alt="" title="It&#039;s Chemical Free" width="225" height="300" class="size-medium wp-image-350" /></a><p class="wp-caption-text">NO CHEMICALS are used at any time. Really? Aren't enzymes chemicals?</p></div></p>
<p>When I buy a product that is claimed to be chemical free, I demand that it contains absolutely nothing. It better not contain a single atom of anything or I will sue for misleading advertising.</p>
<p>When I buy a product that is claimed to be chemical free, I want a tube, a bottle, a jar, a box whose contents are guaranteed to be absolutely void of any matter whatsoever. It should be a microcosm of the vacuum in deep space.</p>
<p>Of course, deep space is not even a perfect vacuum. The vacuum of deep space is not even chemical free. So, how do these “natural” products companies create a chemical-free product? You have to wonder. It must be magic.</p>
<p><strong>It’s “Natural” and Organic, So It Must Be Good!</strong></p>
<p>Have you noticed that I keep qualifying the word “natural” by putting it in quotes? Why is this?</p>
<p>Well, natural means absolutely nothing special. It simply refers to something that occurs in nature, is naturally occurring, or is produced by natural processes.</p>
<p>Well, plants growing surely must be a natural process; so peppermint oil is natural. Bees building their hives surely must be a natural process; so beeswax must be natural.</p>
<p>What about people&ndash;in particular chemists&ndash;who create unique chemical substances that are highly toxic to insects? Is that natural? Well, sure.</p>
<p>Since people are animals, we are part of the natural world. Therefore, everything that humans do is part of the natural process and all of our creations can be considered natural. I know that aliens consider us as puny little, natural organic animals messing up the rest of nature.</p>
<p>What? Are you kidding me?</p>
<p>Not at all&#8230;Oh, you’re not asking about the aliens, are you.</p>
<p>Natural is not the appropriate word for separating humankind&#8217;s activities or creations from the rest of the ecosystem. Instead, manmade, human made, or artificial should be used.</p>
<p>I prefer people remember that they are part of the natural world instead of abstracting themselves from it. That way, they are less likely to get swollen heads and think that they are separate from all the other animals, that they are not part of the ecosystem. (NB: That is why I think that the phrase anthropogenic climate change is brilliant. It keeps humankind in the climate as part of the ecosystem. See my other rant, <a href="http://jeffsayre.com/2010/01/04/the-hot-air-about-global-climate-change/"><em>The Hot Air About Global Climate Change</em></a>.)</p>
<p>Okay, what about organic products?</p>
<p>Wow, now this is just becoming too long of a rant. But, since you asked.</p>
<p>The phrase “organic” is another co-opted word used by product marketers. Why? Because most chemical substances can be broken down into two categories—organic and inorganic.</p>
<p>If a chemical substance is primarily comprised of carbon and hydrogen atoms, it is usually classified as being organic. Thus, DDT is organic and, by the way, since it is a human creation, it is also natural. But that does not mean it is safe to eat DDT. It is also best classified as being a highly toxic, artificial chemical substance.</p>
<p>How about plant-based chemicals? Surely they must be safer to use than human-made chemicals. Not necessarily. Some plant-based chemical substances are highly toxic to human animals.</p>
<p><strong>How Can This Get Better?</strong></p>
<p>Well yesterday, when I was looking for a healthier alternative to petroleum-based lip balm, I came across this description on a “natural” products company’s website. I just about lost it when I read this:</p>
<blockquote><p>Our all natural chemical free lip balm&#8230; is not tested on animals.</p></blockquote>
<p>Holy Cow! I got to get my some of that!</p>
<p>The second thought that came to mind is that I actually should avoid that product at all costs. Why? Because when I use it, I will be the first person to have ever tested the product. I will in fact be the company’s guinea pig. I mean, if it has not been tested on animals, then it cannot yet have been tested on any person.</p>
<p>But then I realized that they might actually be telling the truth. Since the product is chemical free, it contains absolutely nothing. So, it cannot be tested on anything—animals, plants, protozoans, fungi, bacteria, inanimate objects. You get the point. There is nothing to test because they are selling a product which has had all the chemicals removed. So, they can’t even test it on us human animals.</p>
<p><strong>It’s Just a Marketing Message</strong></p>
<p>I realize that phrases such as “chemical free” and “not tested on animals” are meant to convey the message that the products are natural, safe to use, and politically correct to purchase because no non-human animals have been forced to use the products. But, let’s be clear. Natural does not imply safe anymore than organic implies edible.</p>
<p>Lead, arsenic, and benzene are all naturally-occurring chemicals that are quite toxic to people. I don’t know about you, but I try to avoid using any of those natural chemicals when washing my hair. Water, a natural essential chemical substance for all life (as far as we know), can even be lethal under certain uses.</p>
<p>Here&#8217;s an interesting article about <a href="http://www.pawnation.com/2010/02/04/are-avocados-bad-for-pets/">the toxicity of avocados to some non-human animal species</a>. Once again, &#8220;natural&#8221; does not necessarily connote edible, healthy, or safe.</p>
<p>Finally, the uninformed usage of the word animal occurs in more that just marketing copy. I see it all the time in news reports, popular articles written by scientists, and many times in letters to the editors. Every time I see someone removing humans from the animal zoo of life, it irks me just a little.</p>
<p>Am I being unreasonable? Well, of course I don’t think so.</p>
<p>In our science-illiterate culture, expressions such as “chemical free” and “not tested on animals” simply add to the disconnect between science, nature, and our view of humanity’s place in the world. I think it is inexcusable and irresponsible.</p>
<p>Okay, end of rant.</p>
<p><code>&laquo;/rant&raquo;</code></p>
<p>I bet you are now entirely confused about all natural, organic, chemical-free products that have not been tested on animals. I’m glad I could help.</p>
<p><em>Disclaimer: This natural rant is chemical free and has not been tested on any animals (other than organic humans). However, a few plants of multiple species were severely masticated as I sat at my computer writing—yummy all natural organic rolled oatmeal with locally-grown organic blueberries, organic raisins, freshly-ground organic flaxseed, and local genotype native, organic pecans. Oh, I also imagine a number of organic-based bacteria lost their natural lives as well.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://jeffsayre.com/2010/02/03/it%e2%80%99s-chemical-free-and-not-tested-on-animals/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rash Decisions Are Not Good Decisions</title>
		<link>http://jeffsayre.com/2010/01/22/rash-decisions-are-not-good-decisions/</link>
		<comments>http://jeffsayre.com/2010/01/22/rash-decisions-are-not-good-decisions/#comments</comments>
		<pubDate>Fri, 22 Jan 2010 18:31:18 +0000</pubDate>
		<dc:creator>Jeff Sayre</dc:creator>
				<category><![CDATA[Entrepreneurship & Leadership]]></category>
		<category><![CDATA[developers]]></category>
		<category><![CDATA[founders]]></category>
		<category><![CDATA[leadership]]></category>
		<category><![CDATA[startups]]></category>

		<guid isPermaLink="false">http://jeffsayre.com/?p=269</guid>
		<description><![CDATA[I recently posted an article entitled, Looking for Two Startup Partners 35-plus years Old.
It is interesting how some people quickly jumped to conclusions and made sweeping assumptions based on a single blog article, or worse yet, blog title. Although the majority of people who have taken the time to comment or tweet about this post [...]]]></description>
			<content:encoded><![CDATA[<p>I recently posted an article entitled, <a href="http://jeffsayre.com/2010/01/14/looking-for-two-startup-partners-35-plus-years-old/"><em>Looking for Two Startup Partners 35-plus years Old</em></a>.</p>
<p>It is interesting how some people quickly jumped to conclusions and made sweeping assumptions based on a single blog article, or worse yet, blog title. Although the majority of people who have taken the time to comment or tweet about this post have been positive about my efforts, a small minority (across the age spectrum), have been negative, even seemingly offended.<span id="more-269"></span></p>
<p>I’ve concluded that this latter group must not have read the post in its entirety. In fact, it is very possible that they got emotionally thrown-off guard by the title and didn’t bother reading the post at all. The other likely scenario is that they only read the first half of the post and found it disagreeable so they did not finish reading the rest.</p>
<p>Either way, it is a shame when people make accusations&ndash;are prejudiced&ndash;based on a few words. It is an unfortunate fact that some people will judged you on little more than a few words or sentences. They will not take the time to learn more about who you are before rendering an opinion.</p>
<p>Now I have thick skin. When you’ve been through a life-threatening illness, not sure whether you would live another year, you learn what is truly important and are able to filter out most impacts of personal attacks, illogical drivel, and emotionally-charged, incorrect assertions.</p>
<p><strong>Marketing Message</strong></p>
<p>Although the title of my post was somewhat sensational, it did speak directly to the issue of ageism in the VC-funding of web startups. This is a real issue.</p>
<p>But, my article only used that issue to build a bridge to the larger point&mdash;that what matters in startup founders in not age, but their experience, skills, and maturity. In fact, near the end of my piece I state this:</p>
<blockquote><p>Now, I am not an ageist by any stretch of the imagination. So, if you’re an exceptional under-35 year old who is interested in this opportunity, send an email convincing me that you’re the one I should pick. You will still be required to meet all the requirements except age.</p></blockquote>
<p>So, when it comes to my search for exceptionally-talented startup partners, this post is really not about age. I’ll gladly consider anyone, regardless of their age&mdash;although when choosing a founder, the experience-bar must be set higher.</p>
<p><strong>Rash Decisions Are Not Good Decisions</strong></p>
<p>The fact that someone tweeted today calling me “utterly pompous” for my statements in that article, does not surprise me nor upset me. Whenever someone sends a negative tweet about something I’ve said or written, I always engage them in respectful debate. Some will reply, a few simply ignore my tweets. My purpose is to better communicate my original message and learn what in particular set them off.</p>
<p>When I received that tweet this morning, I sent off three, quick tweets encouraging him to read the whole article and explaining that the major point of that piece was that I’m looking for two experienced people with the skills to be founders. I told him that it was really not about age at all.</p>
<p>He eventually sent another tweet back but has not yet recanted his remark. That’s fine. He’s entitled to his opinion. I have big enough shoulders. If I&#8217;m ever in need of the services his firm offers, I’ll fully assess the firm’s strengths and weakness. I will not jump to conclusions based on the little interaction that I’ve had with one of its partners.</p>
<p>This experience made me realize another essential quality of a great leader&mdash;to be slow to judgement. If you are too quick to judge, then you are likely a person that misses key information that could make a difference to your business’ success. You may be prone to letting emotions influence your judgement too much. Instead of making a rash assumption about a person, project, or opportunity, do your homework. Properly assess the situation so you know as much of the truth as possible before making your decision.</p>
]]></content:encoded>
			<wfw:commentRss>http://jeffsayre.com/2010/01/22/rash-decisions-are-not-good-decisions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>BuddyPress Privacy: Moving Toward a Privacy API</title>
		<link>http://jeffsayre.com/2010/01/20/buddypress-privacy-moving-toward-a-privacy-api/</link>
		<comments>http://jeffsayre.com/2010/01/20/buddypress-privacy-moving-toward-a-privacy-api/#comments</comments>
		<pubDate>Thu, 21 Jan 2010 00:23:19 +0000</pubDate>
		<dc:creator>Jeff Sayre</dc:creator>
				<category><![CDATA[BuddyPress]]></category>
		<category><![CDATA[Social Media & Semantic Web]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[developers]]></category>
		<category><![CDATA[privacy]]></category>
		<category><![CDATA[WordPress Plugins]]></category>

		<guid isPermaLink="false">http://jeffsayre.com/?p=256</guid>
		<description><![CDATA[BuddyPress development is moving toward a modular, team-focused approach. In my mind, this is the biggest news that came out of the weekly BuddyPress developers’ chat (you can read a succinct summary of the chat that DJPaul wrote up or you can read the entire chat-stream).
During the chat, Andy Peatling (lead BP developer and Automattic [...]]]></description>
			<content:encoded><![CDATA[<p>BuddyPress development is moving toward a modular, team-focused approach. In my mind, this is the biggest news that came out of the weekly BuddyPress developers’ chat<span id="more-256"></span> (you can read a <a href="http://bpdevel.wordpress.com/2010/01/20/summary-of-jan-20th-dev-chat/">succinct summary of the chat</a> that <a href="http://twitter.com/pgibbs">DJPaul</a> wrote up or you can <a href="https://irclogs.wordpress.org/chanlog.php?channel=buddypress-dev&#038;day=2010-01-20&#038;sort=asc">read the entire chat-stream</a>).</p>
<p>During the chat, <a href="http://twitter.com/apeatling">Andy Peatling</a> (lead BP developer and Automattic employee), presented an idea about breaking up development work into component teams:</p>
<blockquote><p>I&#8217;d like to start breaking BP down into chunks, and find people that are really interested in specific features&#8230;so for example if you really love the activity stream functionality you could focus specifically on that, and stick to patching just this area&#8230;so the long term goal is to get teams on components and have that transition into core commit teams.</p></blockquote>
<p>This has merit. As the complexity of the BuddyPress codebase expands, it will be increasingly difficult for a one- or two-person team to do all the core lifting. BuddyPress is a complex suite of plugins. It is a social-network-creating ecosystem full of hundreds of functions and classes. Breaking the workload into project teams is a sensible approach.</p>
<p><strong>More Hands to Watch</strong></p>
<p>But, this notion of modularizing BuddyPress core development made me realize that a single guy&ndash;that would be me&ndash;cannot effectively continue to maintain and update the BuddyPress Privacy Component. It is impractical.</p>
<p>As you already may know from my <a href="http://jeffsayre.com/2010/01/02/do-you-support-buddypress-privacy/">very successful fundraising drive</a> for my <a href="http://jeffsayre.com/2009/12/05/buddypress-privacy-component-released/">BuddyPress Privacy Component</a>, keeping the BP Privacy plugin up to snuff with each new release of BP is quite challenging. In effect, I have to be an expert on all the BuddyPress components.</p>
<p>If there will be project teams managing the future development of the BuddyPress suite of components, that means two things: 1) there will be too much information created by too many hands on which I need to stay caught up; 2.) there’s an opportunity to streamline privacy filtering.</p>
<p><strong>Enter the BuddyPress Privacy API</strong></p>
<p>Privacy should be a core feature of any social network. BuddyPress is no exception to this rule. So, I’m now thinking that the best approach to privacy in BuddyPress is via a Privacy Layer that provides a basic Privacy API which any and all components can access.</p>
<p>I’m now investigating how practical and possible it will be to create a Privacy Layer using my current privacy codebase. If it is something that can successfully be created without a significant amount of additional work, I will switch my efforts toward creating the BP Privacy Layer.</p>
<p>This means, that going forward, it will be up to each BuddyPress component development team to utilize the Privacy Layer (if they choose to), to tie their component into the Privacy API, and provide privacy filtering. That way, providing privacy will become a team effort and not just one guy playing catch up, running behind Andy, jjj, and all the component-team members who are furiously evolving the BuddyPress codebase.</p>
<p>Do you think a BuddyPress Privacy Layer is the best way to ensure that privacy becomes a core element of each component? Do you think a BuddyPress Privacy API is a desirable feature?</p>
]]></content:encoded>
			<wfw:commentRss>http://jeffsayre.com/2010/01/20/buddypress-privacy-moving-toward-a-privacy-api/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Are You a Successful Project Manager Or a Reluctant Leader?</title>
		<link>http://jeffsayre.com/2010/01/19/are-you-a-successful-project-manager-or-a-reluctant-leader/</link>
		<comments>http://jeffsayre.com/2010/01/19/are-you-a-successful-project-manager-or-a-reluctant-leader/#comments</comments>
		<pubDate>Tue, 19 Jan 2010 21:43:02 +0000</pubDate>
		<dc:creator>Jeff Sayre</dc:creator>
				<category><![CDATA[Entrepreneurship & Leadership]]></category>
		<category><![CDATA[leadership]]></category>
		<category><![CDATA[mentoring]]></category>
		<category><![CDATA[project management]]></category>

		<guid isPermaLink="false">http://jeffsayre.com/?p=233</guid>
		<description><![CDATA[In my previous incarnations as an executive at two different consulting firms, I often came across the type of person that I refer to as the reluctant leader, or the reluctant manager. I use this term somewhat euphemistically. This type of person is more aptly described as having or exhibiting one or more of the [...]]]></description>
			<content:encoded><![CDATA[<p>In my previous incarnations as an executive at two different consulting firms, I often came across the type of person that I refer to as the reluctant leader, or the reluctant manager. I use this term somewhat euphemistically. This type of person is more aptly described as having or exhibiting one or more of the following attributes: being clueless about their role and responsibilities; scared that they are in over their head; ineffective at managing people and projects.<span id="more-233"></span></p>
<p>Whereas it is clear that a person who can be classified as a reluctant leader is currently a bad fit for the position, the brunt of the responsibility falls on the shoulders of that person’s immediate superior. Should they have been hired or promoted to project manager in the first place? Did they receive proper guidance and training? Were clear expectations and responsibilities proactively communicated?</p>
<p><strong>Project Manager versus Managing a Project</strong></p>
<p>In smaller firms, a person who is called a project manager may actually be a single person working on a single project. In that case, whereas they are managing a project, they are not truly a project manager. Project mangers usually oversee more than one project at a time and have a team of people whom they lead.</p>
<p>When a company’s backlog grows large enough, it is crucial to appoint a few, results-oriented project managers. Each project manager leads their own team of people. Each project team is tasked with handling a number of the firm’s overall projects in the backlog. The project manager will delegate various chunks of a project’s workload to the team, only keeping a small portion of the project work to his or herself.</p>
<p><strong>Signs of a Reluctant Leader</strong></p>
<p>To me, one of the telltale signs of a reluctant leader is that they would rather be doing the “real” project work and not that “other stuff”. How is that desire communicated? In different ways, but often like this.</p>
<p>When sitting in a meeting discussing a project issue, that project manager seems uncomfortable, maybe even frequently looking at their watch. They finally get the guts to say, “I need to get to work on the project,” or “can we end this discussion because I have to get back to work.”</p>
<p>It is not uncommon for reluctant leaders to assume that all the other duties of a project manager are subordinated to the project work itself. What they fail to realize is that successful project managers have many responsibilities that must equally be performed. Their share of an overall project’s work is just one of many duties.</p>
<p><strong>Successful Project Managers</strong></p>
<p>Successful project managers need to be proficient multitaskers. They need to accept as well as give constructive feedback; proactively communicate with clients and employees; build motivated, results-oriented project teams; sell their vision to their team, to clients, and to recruits; have a passion for leadership; and derive a good portion of their energy from coaching team members and helping each member reach their potential.</p>
<p>In addition to these basic requirements, successful project managers need to manage project chargeability (if measured), organize and lead team meetings, and oversee their share of an organization’s strategic plan. They also need to be results oriented, handle difficult employee issues, and oversee project QA/QC.</p>
<p>A project manager needs to respond in a timely fashion to all team-member inquires&mdash;even if it is uncomfortable to them based on his or her communication style. It is imperative that project managers provide clear guidance and direction, effectively delegate the work load, and, finally, perform their share of the project work&mdash;what reluctant leaders call the “real” project work.</p>
<p><strong>What Makes a Project In Itself Successful?</strong></p>
<p>Well, that depends on the overall goals for a given project. But a general definition is as follows: hitting the profitability goal, completing the project on time and on budget, and achieving more than satisfactory results for all parties.</p>
<p>In the end, it is up to a project manager’s superior to hold them accountable for project successes and failures. By doing so, it increases the success rate of future projects and can help mold a reluctant leader into a successful project manager.</p>
]]></content:encoded>
			<wfw:commentRss>http://jeffsayre.com/2010/01/19/are-you-a-successful-project-manager-or-a-reluctant-leader/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
