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

<channel>
	<title>Dented Reality &#187; Clients</title>
	<atom:link href="http://dentedreality.com.au/category/clients/feed/" rel="self" type="application/rss+xml" />
	<link>http://dentedreality.com.au</link>
	<description>Beau Lebens throws down his opinion on all sorts of things he doesn&#039;t know too much about.</description>
	<lastBuildDate>Tue, 07 Feb 2012 20:48:00 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4-alpha-19719</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>On Social Customer Support</title>
		<link>http://dentedreality.com.au/2009/04/on-social-customer-support/</link>
		<comments>http://dentedreality.com.au/2009/04/on-social-customer-support/#comments</comments>
		<pubDate>Sat, 18 Apr 2009 18:07:26 +0000</pubDate>
		<dc:creator>Beau Lebens</dc:creator>
				<category><![CDATA[Clients]]></category>
		<category><![CDATA[Techn(ical|ology)]]></category>
		<category><![CDATA[automattic]]></category>
		<category><![CDATA[customer service]]></category>
		<category><![CDATA[customer support]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[get satisfaction]]></category>
		<category><![CDATA[intensedebate]]></category>
		<category><![CDATA[social media]]></category>
		<category><![CDATA[twitter]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://dentedreality.com.au/?p=1023</guid>
		<description><![CDATA[Through my work with Automattic, I&#8217;ve had the privilege of working with the guys over at Intense Debate. I&#8217;ve been helping them improve their WordPress plugin and get it ready for some new features. Along the way I made the blunder of releasing a version that had a pretty serious bug in it, and that [...]]]></description>
			<content:encoded><![CDATA[<p>Through my work with <a href="http://automattic.com/">Automattic</a>, I&#8217;ve had the privilege of working with the guys over at <a href="http://intensedebate.com/">Intense Debate</a>. I&#8217;ve been helping them improve their <a href="http://wordpress.org/extend/plugins/intensedebate">WordPress plugin</a> and get it ready for some new features. Along the way I made the blunder of releasing a version that had a pretty serious <a href="http://twitter.com/beaulebens/status/1531557495">bug</a> in it, and that triggered a lot of customer support issues/cases.</p>
<p>In the &#8220;old days&#8221; (or in a lot of big corporates today), those support cases would have been handled behind a corporate &#8220;veil of secrecy&#8221;, tucked in a back end system somewhere, responded to by anonymous &#8220;Customer Service Representatives&#8221; via a generic email account like &#8220;support@intensedebate.com&#8221;. While we&#8217;re also making use of a generic email address, the similarities between our approach and that of big corporates ends there. End to end, the differences are pretty stark.</p>
<p><span id="more-1023"></span></p>
<h3>Plugin Release</h3>
<p>Previously, companies may have tried to encode their plugins, or released them as some sort of binary so that they could control access to them and avoid people modifying them. When we released the 2.1 version of our plugin, we &#8220;checked it in&#8221; to a public-readable Subversion repository which then publishes to the WordPress Plugin Directory. That code (and all other code in the Plugin Directory) is GPL licensed and available for re-use/hacking/modification. People are welcome to read the code and see what we&#8217;re doing, point out where we could do things better, and ideally improve upon it themselves.</p>
<p>After we&#8217;ve uploaded the code, people will start getting notifications in their WordPress admin panel that there&#8217;s a new version available. To help explain what&#8217;s going on, we published a <a href="http://blog.intensedebate.com/2009/04/13/wordpress-plugin-v21/">blog post announcing the new version</a>, the new features etc.</p>
<h3>Comment Support</h3>
<p>Not that it&#8217;s a recommended channel for receiving support, but this is where we start really differing. People have posted a number of issues and questions about the plugin right there on the announcement post. We could moderate and remove those comments (or not allow them in the first place); instead, we work with our customers and try to address their problems right there an then. Michael and I have been bouncing around on that post answering questions and finding out more information from people so that we could fix some problems and get to 2.1.1. With email notifications coming in every time someone commented on that post, we&#8217;re able to quickly respond to people and help work out any issues they&#8217;re having.</p>
<h3>Seeking Satisfaction</h3>
<p>If people aren&#8217;t commenting on that post directly, they&#8217;re often over at the <a href="http://getsatisfaction.com/intensedebate/">Intense Debate Get Satisfaction</a> forum, a community-powered support system where a number of people are contributing. Again, this is a very public way of supporting users, and puts us out there in the limelight, warts n&#8217; all. We answer what we can, assure people that we&#8217;re still working on things and that we&#8217;re making progress (which we are, a lot of it) and that we&#8217;ll get back to them as soon as there&#8217;s something to report. When there are updates, or when we need more information for troubleshooting, we post another message and get a stack of responses from eager users, hoping to have their problems solved. This is very real and very connected, and I truly believe that being open and transparent about problems that people are having and the way that we&#8217;re working with them helps not just that user, but others who may have similar problems.</p>
<h3>Late-night Tweeting</h3>
<p>For real-time feedback and almost-instant-messaging-immediacy, there&#8217;s <a href="http://twitter.com/">Twitter</a>. I know, with <a href="http://news.cnet.com/8301-17939_109-10222030-2.html">Oprah getting in on it</a> now Twitter will probably implode soon, but in the meantime, I&#8217;ve found myself providing support direct to people via Twitter as well. One user wanted to use IntenseDebate, but found the <a href="http://twitter.com/rodhilton/statuses/1530115904">comment importer wasn&#8217;t working</a>. I replied that we were <a href="http://twitter.com/beaulebens/statuses/1531187765">about to release a fix</a>, and that user was then able to get <a href="http://twitter.com/rodhilton/statuses/1531552697">up and running</a>. This all happened, asynchronously, within about 4 hours of his first tweet.</p>
<h3>In Your Facebook</h3>
<p>Then for one that I really wasn&#8217;t expecting, someone contacted me through <a href="http://facebook.com/">Facebook</a> to try to sort out a problem. A user spotted me providing support via Get Satisfaction and other methods, and tracked me down on Facebook. In this case, it was someone that we were already working on a fix for, but it demonstrates just another way that people have been able to get in touch with us.</p>
<h3>Better for Customers, Better for Us?</h3>
<p>I guess the big question (or 2 questions really) this all poses is: Is this new way of providing support better for our customers? Is it better for us (as the company providing support)? Could it be better for everyone still?</p>
<p>The biggest problem I have (as someone providing support) is just trying to keep track of all these different &#8220;vectors&#8221;. I&#8217;ve identified 4 different support vectors above, and that&#8217;s not even including our <a href="http://intensedebate.com/contactus">normal support email/form</a>, <a href="http://www.facebook.com/group.php?gid=18092405897">official Facebook group</a> or VIP support channels. That makes at least 7 different vectors through which we might be providing support. It can get messy trying to keep up to date with them all and ensuring that you&#8217;ve replied to people where they&#8217;ve contacted you and in a timely fashion. Perhaps there&#8217;s an argument for traditional, centralized systems after all <img src='http://dentedreality.com.au/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://dentedreality.com.au/2009/04/on-social-customer-support/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
	</item>
		<item>
		<title>The All-New LiveJournal Importer for WordPress</title>
		<link>http://dentedreality.com.au/2009/02/livejournal-importer-for-wordpress/</link>
		<comments>http://dentedreality.com.au/2009/02/livejournal-importer-for-wordpress/#comments</comments>
		<pubDate>Tue, 17 Feb 2009 23:30:59 +0000</pubDate>
		<dc:creator>Beau Lebens</dc:creator>
				<category><![CDATA[Clients]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[Techn(ical|ology)]]></category>
		<category><![CDATA[automattic]]></category>
		<category><![CDATA[guav]]></category>
		<category><![CDATA[importer]]></category>
		<category><![CDATA[livejournal]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://dentedreality.com.au/?p=907</guid>
		<description><![CDATA[Over the past few weeks, I have been working on a new importer for people who use LiveJournal, but would like to switch over to WordPress. With LiveJournal laying off a bunch of employees, it seemed like some people might prefer to move to a platform where they had a bit more control over their [...]]]></description>
			<content:encoded><![CDATA[<p>Over the past few weeks, I have been working on a new importer for people who use <a href="http://livejournal.com/">LiveJournal</a>, but would like to switch over to <a href="http://wordpress.org/">WordPress</a>. With LiveJournal <a href="http://www.adotas.com/2009/01/livejournal-layoffs/">laying off a bunch of employees</a>, it seemed like some people might prefer to move to a platform where they had a bit more control over their own content, rather than relying on another company to handle it for them. I decided that my measure of success would be that it needed to be capable of importing <a href="http://throwingstardna.livejournal.com/">Guav&#8217;s entire journal</a> &#8212; comments and all, without error.</p>
<p>As it turns out, it&#8217;s been quite a project. <a href="http://www.livejournal.com/doc/server/ljp.csp.protocol.html">LiveJournal&#8217;s API</a> is, shall we say, &#8220;challenging&#8221; to work with, and the sheer size of Guav&#8217;s journal (over 3,700 posts and nearly 200,000 comments) meant that I kept running into time, memory and database limits that would crash the importer. After a lot of back and forth with Guav though, I&#8217;m happy to present the new importer (find it under Tools &gt; Import &gt; LiveJournal), sporting the following features:</p>
<ul>
<li>Just enter your LiveJournal username and password and you&#8217;re ready to go</li>
<li>Via the API, it connects directly to LiveJournal and imports all of your posts,
<ul>
<li>Posts marked as &#8220;Friends Only&#8221; are assigned a password within WordPress,</li>
<li>Posts marked as &#8220;Private (you only)&#8221; are marked as Private within WordPress, which means that only authors on your new blog can read them,</li>
<li>lj-cut tags are converted to the WordPress equivalent, the &lt;! &#8212; more &#8212; &gt; tag,</li>
<li>lj-user tags are converted to normal links, and have class=&#8221;lj-user&#8221; attached to them to make it easier to style them if you like,</li>
<li>Tags are imported properly,</li>
<li>If you closed the comments on a post in LiveJournal, then they&#8217;ll be closed in WordPress as well,</li>
<li>Lots of the &#8220;meta&#8221; information related to posts is also imported using WordPress&#8217; Custom Fields feature. You could then use these values to reproduce some of LiveJournal&#8217;s functionality within your new theme if you like. The fields imported are:
<ul>
<li>If your post contains adult content (lj_adult_content),</li>
<li>Your current co-ordinates and location (lj_current_coords and lj_current_location),</li>
<li>Your current mood (lj_current_mood),</li>
<li>Current music (lj_current_music),</li>
<li>Your userpic keyword (lj_picture_keyword)</li>
</ul>
</li>
</ul>
</li>
<li>Next up, all of your comments are also imported,
<ul>
<li>Threading is preserved, so replies to other comments show up successfully (provided you enable that feature in WordPress),</li>
<li>The &#8220;subject&#8221; of each comment is included as the first line of the comment itself, because WordPress doesn&#8217;t have a comment title/subject value,</li>
<li>LiveJournal users get links back to their LiveJournals,</li>
<li>Your own comments are linked to your WordPress account, and are linked back to your new WordPress blog,</li>
<li>Anonymous users are labeled as &#8220;Anonymous&#8221;,</li>
<li>&#8220;Screened&#8221; comments on LiveJournal are imported as &#8220;Unapproved&#8221; within WordPress, so you can decide what to do with them</li>
</ul>
</li>
</ul>
<p>So there you have it, a brand new, shiny LiveJournal importer. This should be bundled with the 2.8 release of WordPress (it&#8217;s available right now on <a href="http://wordpress.com/">WordPress.com</a>), and will be available for everyone. As I mentioned, it&#8217;s been tested with one single, very large blog (and a few smaller test ones), but if you find anything wrong with it, please <a href="http://trac.wordpress.org/">file a bug on the WordPress Trac</a>!</p>
<p>Huge thanks again to <a href="http://throwingstardna.livejournal.com/">Guav</a> for helping with the testing of this thing (maybe now he can migrate over to WordPress as well)!</p>
]]></content:encoded>
			<wfw:commentRss>http://dentedreality.com.au/2009/02/livejournal-importer-for-wordpress/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
	
	</item>
		<item>
		<title>HOWTO: Implement Facebook Connect on WordPress (in reality)</title>
		<link>http://dentedreality.com.au/2008/12/implementing-facebook-connect-on-wordpress-in-reality/</link>
		<comments>http://dentedreality.com.au/2008/12/implementing-facebook-connect-on-wordpress-in-reality/#comments</comments>
		<pubDate>Thu, 18 Dec 2008 23:05:22 +0000</pubDate>
		<dc:creator>Beau Lebens</dc:creator>
				<category><![CDATA[Clients]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[Techn(ical|ology)]]></category>
		<category><![CDATA[@morganb]]></category>
		<category><![CDATA[blownmortgage.com]]></category>
		<category><![CDATA[comments]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[facebook connect]]></category>
		<category><![CDATA[fb connect]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[resumedonkey.com]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://dentedreality.com.au/?p=798</guid>
		<description><![CDATA[2008-12-23: There were a number of problems with the code samples in this post previously due to some WordPress formatting problems. They are all corrected now, and you should be able to follow through this post and get this working on your own blog quite easily. 2008-12-26: Fixed a bug that caused the JS to [...]]]></description>
			<content:encoded><![CDATA[<p><strong>2008-12-23: There were a number of problems with the code samples in this post previously due to some WordPress formatting problems. They are all corrected now, and you should be able to follow through this post and get this working on your own blog quite easily.</strong></p>
<p><strong>2008-12-26: Fixed a bug that caused the JS to overwrite details on a non-FB Connect comment as well. Also changed the fake email address that&#8217;s stored to include the user&#8217;s FB user ID.<br />
</strong></p>
<p>In case you&#8217;ve been living under a no-technology-news rock for the last few weeks, you&#8217;ll know that <a href="http://developers.facebook.com/news.php?blog=1&amp;story=108">Facebook Connect</a> was released recently. I had been seeing/hearing a lot about it, including <a href="http://mashable.com/2008/12/11/facebook-connect-blog/">this video at Mashable</a>, showing how to implement FB Connect in 8 minutes. So when my friend <a href="http://blownmortgage.com/">Morgan from BlownMortgage</a> asked me if I&#8217;d be able to help him implement it on his new resume-editing site <a href="http://resumedonkey.com/">ResumeDonkey.com</a>, I figured &#8220;how hard could it be&#8221; and said yes. Although it definitely didn&#8217;t take 8 minutes, I got it done, so I thought I&#8217;d post some details on the specific approach I used for ResumeDonkey.com.</p>
<p><span id="more-798"></span>Before I rolled my own solution, I took a good look at a few of the existing WordPress options including:</p>
<ul>
<li>The <a href="http://wiki.developers.facebook.com/index.php/WP-FBConnect">WP-FBConnect plugin</a>, made by Facebook,</li>
<li>Another <a href="http://www.sociable.es/facebook-connect/">WordPress plugin made by Sociable</a>, and</li>
<li>The <a href="http://staynalive.com/the-community-facebook-connect-plugin/">Community Facebook Connect Plugin</a>, by Jesse Stay</li>
</ul>
<p>None of these worked quite how Morgan and I had discussed, so I decided to make my own, lightweight solution. Before editing any actual theme files, there&#8217;s some prep-work to be done, so:</p>
<ol>
<li>Log into Facebook and then go and add the <a href="http://www.facebook.com/developers/">Facebook Developers Application</a></li>
<li>Click the big button at the top right to Set Up a New Application</li>
<li>Enter a name and agree to the terms (you read them all, right?)</li>
<li>On the next page, enter the base URL of your website in the &#8220;Callback URL&#8221; field. MAKE SURE you use the correct preference for your website as far as www. or no www. is concerned, and preferably enforce that on your website using a plugin or something. If you enter http://www.domain.com here, and someone accesses your site as http://domain.com, then your FB Connect integration will break and throw a warning about being on the wrong URL.</li>
<li>You can also set some sexy icons/logos to appear in the News Feed of people who comment on your blog, but I&#8217;ll let you handle that.</li>
<li>Get a copy of the &#8220;API Key&#8221; at the top of this page, you&#8217;ll need that later.</li>
</ol>
<p>OK, now we need to register a &#8220;template bundle&#8221;, which will be used to post updates to the News Feed of people who comment on your blog.</p>
<ol>
<li>Go to the <a href="http://www.facebook.com/developers/apps.php">list of your Facebook Apps</a> and click on the app we just created on the left</li>
<li>Click &#8220;Create Feed Template&#8221; in the list of links on the right</li>
<li>Make sure your correct App is selected in the box, then click Next</li>
<li>In the &#8220;One Line Template&#8221; box, paste this exact text
<pre>{*actor*} commented on the {*blog*} post {*post*}.</pre>
</li>
<li>In the &#8220;Sample Template Data&#8221; box, paste this (make sure quote marks are still  quotes and not fancy curly-quotes)
<pre>{"blog":"&lt;a href='http://test.domain.com'&gt;My Blog Name&lt;/a&gt;", "post":"&lt;a href='http://test.domain.com/post-url/'&gt;Test Post Title&lt;/a&gt;"}</pre>
</li>
<li>Click Update Preview and make sure that you&#8217;re happy with the News Feed format (if not, change the One Line Template string)</li>
<li>Click Next</li>
<li>Now click Skip (and ignore/Okay any errors) until you get to the final page and then click &#8220;Register Template Bundle&#8221;</li>
<li>It will give you a Template Bundle ID, and you&#8217;ll want to get a copy of that, because we&#8217;ll need it later as well.</li>
</ol>
<p>OK. Now you&#8217;ve got a registered and configured (roughly) App on Facebook, time to get dirty on your own blog. Create a file in the root of your domain and call it &#8220;xd_receiver.htm&#8221;, then copy the following code into it:</p>
<pre>&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;head&gt;
&lt;title&gt;Cross-Domain Receiver Page&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;script src="http://static.ak.facebook.com/js/api_lib/v0.4/XdCommReceiver.js" type="text/javascript"&gt;&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Add the &#8220;fb&#8221; XML namespace to the header.php file in your theme. Mine ended up looking like this (in PHP):</p>
<pre>&lt;html xmlns="http://www.w3.org/1999/xhtml" xmlns:fb="http://www.facebook.com/2008/fbml" &lt;?php language_attributes(); ?&gt;&gt;</pre>
<p>And also drop in a reference to jQuery if you don&#8217;t already use it in your theme. It&#8217;s bundled with WordPress so you can reference it like this (anywhere before the call to &#8220;wp_head()&#8221; in your header.php):</p>
<pre>&lt;?php wp_enqueue_script('jquery'); ?&gt;</pre>
<p>Then you&#8217;ll want to edit comments.php (assuming you&#8217;re using a relatively normal theme), and make some changes to add the FB Connect button. Find the part where a user would normally enter their name/email/URL and change it to look something like this:</p>
<pre>&lt;div id="comment-user-details"&gt;
&lt;fb:login-button length="long" onlogin="update_user_details();"&gt;&lt;/fb:login-button&gt;

&lt;p style="clear:left;"&gt;&lt;strong&gt;Or enter your details below:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;label for="name"&gt;Name &lt;?php if ($req) echo "(required)"; ?&gt;&lt;/label&gt;&lt;br /&gt;
&lt;input type="text" name="author" id="name" value="&lt;?php echo $comment_author; ?&gt;" size="50" tabindex="1" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;label for="email"&gt;Email Address &lt;?php if ($req) echo "(required)"; ?&gt;&lt;/label&gt;&lt;br /&gt;
&lt;input type="text" name="email" id="email" value="&lt;?php echo $comment_author_email; ?&gt;" size="50" tabindex="2" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;label for="url"&gt;Website&lt;/label&gt;&lt;br /&gt;
&lt;input type="text" name="url" id="url" value="&lt;?php echo $comment_author_url; ?&gt;" size="50" tabindex="3" /&gt;&lt;/p&gt;
&lt;/div&gt;</pre>
<p>Just above this block, you should also find the start of the &lt;form&gt; tag for posting a comment, you want to add the &#8220;onsubmit&#8221; attribute to it so that it looks something like this:</p>
<pre>&lt;form action="&lt;?php echo get_option('siteurl'); ?&gt;/wp-comments-post.php" method="post" id="commentform" onsubmit="update_form_values();"&gt;</pre>
<p>The important parts there are that it&#8217;s all wrapped in a DIV or SPAN with id=&#8221;comment-user-details&#8221; and then obviously the &lt;fb:login-button&gt; stuff. Now further down (I went right down to the bottom of the comments.php file actually), add this code:</p>
<pre>&lt;script src="http://static.ak.connect.facebook.com/js/api_lib/v0.4/FeatureLoader.js.php" type="text/javascript"&gt;&lt;/script&gt;
&lt;style type="text/css"&gt;
#fb-user { border: 1px dotted #C0C0C0; padding: 5px; display: block; height: 48px; }
#fb-msg { float:left; }
.fb_profile_pic_rendered { margin-right: 5px; }
a.FB_Link img { float: left; }
&lt;/style&gt;

&lt;script type="text/javascript"&gt;
var fb_connect_user = false;
function update_user_details() {
fb_connect_user = true;
// Show their FB details
if (!jQuery('#fb-user').length) {
jQuery('#comment-user-details').hide().after("&lt;span id='fb-user'&gt;" +
"&lt;fb:profile-pic uid='loggedinuser' facebook-logo='true'&gt;&lt;/fb:profile-pic&gt;" +
"&lt;span id='fb-msg'&gt;&lt;strong&gt;Hi &lt;fb:name uid='loggedinuser' useyou='false'&gt;&lt;/fb:name&gt;!&lt;/strong&gt;&lt;br /&gt;You are logged in with your Facebook account. " +
"&lt;a href='#' onclick='FB.Connect.logoutAndRedirect(\"&lt;?php the_permalink() ?&gt;\"); return false;'&gt;Logout&lt;/a&gt;" +
"&lt;/span&gt;&lt;/span&gt;");
}

// Refresh the DOM
FB.XFBML.Host.parseDomTree();
}

function update_form_values() {
if (fb_connect_user) {
profile = jQuery('#fb-user').find('.FB_ElementReady .FB_Link')[1]['href'];
user_id = profile.substring(profile.indexOf('?id=')+4);
jQuery('#url').val(profile); // FB profile URL
jQuery('#email').val(user_id+'@facebook.com'); // Can't get a real one from FB unfortunately. This saves their user id @facebook.com
jQuery('#fb-user').find('.FB_ElementReady .FB_Link').each(function(i){ if (i==1) { jQuery('#name').val(jQuery(this).text()); } }); // Gets their name from the DOM
setCookie('fb_connect', 'yes');
}
}

function setCookie(c_name,value,expiredays) {
var exdate=new Date();
exdate.setDate(exdate.getDate()+expiredays);
document.cookie=c_name+ "=" +escape(value)+((expiredays==null) ? "" : ";expires="+exdate.toGMTString());
}

function getCookie(c_name) {
if (document.cookie.length&gt;0) {
c_start=document.cookie.indexOf(c_name + "=");
if (c_start!=-1) {
c_start=c_start + c_name.length+1;
c_end=document.cookie.indexOf(";",c_start);
if (c_end==-1) c_end=document.cookie.length;
return unescape(document.cookie.substring(c_start,c_end));
}
}
return "";
}

FB.init("YOUR-FACEBOOK-API-KEY", "/xd_receiver.htm");
FB.Connect.ifUserConnected(update_user_details);
if (getCookie('fb_connect') == 'yes') {
setCookie('fb_connect', null);
FB.Connect.showFeedDialog(YOUR-TEMPLATE-BUNDLE-ID, {'blog':'&lt;a href="&lt;?php bloginfo('home') ?&gt;"&gt;&lt;?php addslashes(bloginfo('name')) ?&gt;&lt;/a&gt;', 'post':'&lt;a href="&lt;?php the_permalink() ?&gt;"&gt;&lt;?php addslashes(the_title()) ?&gt;&lt;/a&gt;'}, null, null, null, FB.RequireConnect.promptConnect);
}
&lt;/script&gt;</pre>
<p>For those of you paying any attention to what you&#8217;re copy-pasting, you would have noticed that there are 2 important things you need to replace in that last block of code. Go back now and replace &#8220;YOUR-FACEBOOK-API-KEY&#8221; and &#8220;YOUR-TEMPLATE-BUNDLE-ID&#8221; with the appropriate values from the beginning of this process. YOUR-FACEBOOK-API-KEY should be replaced with the 32-character string from the Facebook App config, and <strong>should</strong> include double-quotes around it in the code above. The YOUR-TEMPLATE-BUNDLE-ID should <strong>not</strong> have quotes around it.</p>
<p>Save everything and upload it (if you were working offline). If all has gone well, you should now get a FB Connect button on your comments (you need to log out of WordPress to see it), and when you click it, you should connect to FB, then be able to post a comment.</p>
<p>When a Facebook user comments on your blog now, their name will be loaded from Facebook, their profile URL will be used as their URL, and the email address will be recorded as &#8220;user@facebook.com&#8221; (their API doesn&#8217;t allow you to actually get it, to avoid spam I assume).</p>
<p>Enjoy.</p>
]]></content:encoded>
			<wfw:commentRss>http://dentedreality.com.au/2008/12/implementing-facebook-connect-on-wordpress-in-reality/feed/</wfw:commentRss>
		<slash:comments>153</slash:comments>
	
	</item>
		<item>
		<title>symfony &#8220;not&#8221; Validator</title>
		<link>http://dentedreality.com.au/2008/11/symfony-not-validator/</link>
		<comments>http://dentedreality.com.au/2008/11/symfony-not-validator/#comments</comments>
		<pubDate>Thu, 20 Nov 2008 01:29:00 +0000</pubDate>
		<dc:creator>Beau Lebens</dc:creator>
				<category><![CDATA[Clients]]></category>
		<category><![CDATA[Techn(ical|ology)]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[validation]]></category>
		<category><![CDATA[validator]]></category>

		<guid isPermaLink="false">http://dentedreality.com.au/?p=740</guid>
		<description><![CDATA[One of the projects that I&#8217;m currently working on for a client is being built in symfony, the PHP5 framework. I am working in version 1.1 of the framework, which has a new Forms handling system that uses the concept of widgets and validators to handle interacting with most form elements. I had a need [...]]]></description>
			<content:encoded><![CDATA[<p>One of the projects that I&#8217;m currently working on for a client is being built in <a href="http://symfony-project.org/">symfony</a>, the PHP5 framework. I am working in version 1.1 of the framework, which has a new Forms handling system that uses the concept of widgets and validators to handle interacting with most form elements. I had a need to ensure that certain fields did <strong>not</strong> contain certain values. Although this could be done with the regular expression validator that comes bundled with symfony (sfValidatorRegex), I decided to write my own validator specifically for this purpose.<span id="more-740"></span></p>
<p>This validator may be used in conjunction with sfValidatorAnd() or other constructs, and just allows you to quickly and easily ensure that a field does not contain a value (or an array of values).</p>
<pre>/**
 * validatorNot verifies that an input value is NOT some other value.
 *
 * @author     Beau Lebens &lt;beau@dentedreality.com.au&gt;
 */
class validatorNot extends sfValidatorBase {
  protected $not;

  /**
	 * Configures the validator
	 *
	 * Available Options:
	 *
	 *  * not: The value or array of values that the input value should NOT be.
	 *
	 * Available Error Codes:
	 *
	 *  * not
	 *
	 * @param $options Array of options
	 * @param $messages Array of error messages
	 *
	 * @see sfValidatorBase
	 *
	 */
  protected function configure($options = array(), $messages = array()) {
    parent::configure($options, $messages);
  	$this-&gt;addRequiredOption('not');
    $this-&gt;addMessage('not', '\'%not%\' is not allowed.');
    $this-&gt;not = $options['not'];
  }

  /**
   * Compares $value to the restricted/denied value
   *
   * @param  mixed $value  The input value
   *
   * @return mixed The cleaned value
   *
   * @throws sfValidatorError
   */
	protected function doClean($value) {
		if (!is_array($this-&gt;not)) {
      $not = array($this-&gt;not);
		} else {
			$not = $this-&gt;not;
		}
		foreach ($not as $n) {
			if ($value == $n) {
				throw new sfValidatorError($this, 'not', array('not'=&gt;$n));
			}
		}
		return $value;
	}

	/**
	 * Access the "not" value
	 *
	 * @return mixed value this field may not equal
	 */
	public function getNot() {
		return $this-&gt;not;
	}
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://dentedreality.com.au/2008/11/symfony-not-validator/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
	</item>
		<item>
		<title>Fixed: WP Super Cache not creating meta files (and not working)</title>
		<link>http://dentedreality.com.au/2008/09/wp-super-cache-not-creating-meta-files/</link>
		<comments>http://dentedreality.com.au/2008/09/wp-super-cache-not-creating-meta-files/#comments</comments>
		<pubDate>Wed, 03 Sep 2008 03:03:14 +0000</pubDate>
		<dc:creator>Beau Lebens</dc:creator>
				<category><![CDATA[Clients]]></category>
		<category><![CDATA[Techn(ical|ology)]]></category>
		<category><![CDATA[buffer]]></category>
		<category><![CDATA[caching]]></category>
		<category><![CDATA[lvs]]></category>
		<category><![CDATA[ob_end_flush]]></category>
		<category><![CDATA[output buffers]]></category>
		<category><![CDATA[wp-cache]]></category>
		<category><![CDATA[wp-super-cache]]></category>

		<guid isPermaLink="false">http://wiggin.local/dev/dentedreality.com.au/?p=452</guid>
		<description><![CDATA[I&#8217;ve been (attempting to) set up caching on WordPress for a client, and after days (literally) of poking around, trying to figure out what was going on with both WP-Cache, and then WP-Super-Cache, I finally have an answer. The Configuration Everything here is happening on a completely (and very) custom theme, which is hosted on [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been (attempting to) set up caching on WordPress for a client, and after days (literally) of poking around, trying to figure out what was going on with both <a href="http://wordpress.org/extend/plugins/wp-cache/">WP-Cache</a>, and then <a href="http://wordpress.org/extend/plugins/wp-super-cache/">WP-Super-Cache</a>, I finally have an answer.<span id="more-452"></span></p>
<h3>The Configuration</h3>
<p>Everything here is happening on a completely (and very) custom theme, which is hosted on a WP 2.6.1 blog. It&#8217;s powered by 2 frontend web servers, which are transparently accessed via an <a href="http://www.linuxvirtualserver.org/">LVS</a>. The database is hosted on 2 servers, which are configured in a multiple-master configuration and are also accessed via the LVS. I&#8217;ve configued WP-Cache and WP-Super-Cache before so I&#8217;m confident I haven&#8217;t messed anything &#8220;basic&#8221; up with the configuration of the plugin.</p>
<h3>The Problem</h3>
<p>Let&#8217;s make sure we&#8217;re solving the same problem here. I was seeing my pages load just fine, and they even included the appended comment:</p>
<pre>&lt;!-- Dynamic Page Served (once) in 0.928 seconds --&gt;</pre>
<p>I saw that files were created in wp-content/cache/*.html <strong>but</strong> there were no files created in wp-content/cache/meta/*.meta (for WP-Super-Cache). Apparently without the meta files (which contain appropriate headers etc), the caching system assumes it can&#8217;t send the cached version, so it re-processes everything and sends the dynamic version (thus the comment).</p>
<h3>The Solution(s)</h3>
<p>I tried all sorts of things to get this to work, including:</p>
<ul>
<li>Moving the define(&#8216;WP_CACHE&#8217;, true) to the top of wp-config.php, just in case</li>
<li>Deleting and manually re-creating the symlink for advanced-cache.php</li>
<li>Turning on $use_flock in wp-cache-config.php</li>
<li>Modifying $sem_id in wp-cache-config.php (you never know!)</li>
<li>Banging my head repeatedly on the keyboard.</li>
</ul>
<p>Needless to say, none of these things worked. Eventually, I came across a thread where Donncha (the author of WP-Super-Cache, and really nice guy to boot) mentions that a <a href="http://wordpress.org/support/topic/199559">plugin doesn&#8217;t have an ob_end_flush()</a> where it should. That reminded me of a post about <a href="http://blog.4rev.net/2007-10/wp-cache-and-anarchy-media-player/">Anarchy Media Player not working with WP-Cache</a> that I&#8217;d seen, so I tried it out by changing the end of my footer.php theme file to look like this:</p>
<pre>&lt;/html&gt;&lt;?php while (ob_end_flush()) {} ?&gt;</pre>
<p>That seems to have fixed it! I&#8217;m now getting the beloved comment that I was looking for in my source files:</p>
<pre>&lt;!-- Cached page served by WP-Cache --&gt;</pre>
<p>and performance is way up. High-fives all around. The moral of the story is <strong>make sure you close/flush buffers in your themes and plugins.</strong> This is a bit of a hack fix for when someone doesn&#8217;t do that, but it works.</p>
]]></content:encoded>
			<wfw:commentRss>http://dentedreality.com.au/2008/09/wp-super-cache-not-creating-meta-files/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
	
	</item>
		<item>
		<title>HumanSciences.com.au Live</title>
		<link>http://dentedreality.com.au/2003/07/humansciencescomau-live/</link>
		<comments>http://dentedreality.com.au/2003/07/humansciencescomau-live/#comments</comments>
		<pubDate>Sun, 20 Jul 2003 14:13:00 +0000</pubDate>
		<dc:creator>Beau Lebens</dc:creator>
				<category><![CDATA[Clients]]></category>
		<category><![CDATA[client]]></category>
		<category><![CDATA[human sciences]]></category>
		<category><![CDATA[humansciences]]></category>

		<guid isPermaLink="false">http://wiggin.local/dev/dentedreality.com.au/2003/07/humansciencescomau-live/</guid>
		<description><![CDATA[I didn&#8217;t post earlier, but the changes which I made (along with a designer) to the HumanSciences.com.au website are now live. I worked mostly on some technical modifications to the discussion forums and the mailing list, while the designer involved changed the look and feel and structure of the site.]]></description>
			<content:encoded><![CDATA[<p>I didn&#8217;t post earlier, but the changes which I made (along with a designer) to the <a href="http://www.humansciences.com.au/" title="Visit the website">HumanSciences.com.au</a> website are now live. I worked mostly on some technical modifications to the discussion forums and the mailing list, while the designer involved changed the look and feel and structure of the site.</p>
]]></content:encoded>
			<wfw:commentRss>http://dentedreality.com.au/2003/07/humansciencescomau-live/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
	</item>
		<item>
		<title>Latest Doust Modifications Online</title>
		<link>http://dentedreality.com.au/2003/07/latest-doust-modifications-online/</link>
		<comments>http://dentedreality.com.au/2003/07/latest-doust-modifications-online/#comments</comments>
		<pubDate>Sun, 20 Jul 2003 14:12:00 +0000</pubDate>
		<dc:creator>Beau Lebens</dc:creator>
				<category><![CDATA[Clients]]></category>
		<category><![CDATA[doust]]></category>
		<category><![CDATA[doust plumbing]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://wiggin.local/dev/dentedreality.com.au/2003/07/latest-doust-modifications-online/</guid>
		<description><![CDATA[I forgot to mention this earlier on, but the additions/modifications to the Doust Plumbing Products website are also online now. The changes included the addition of a couple of product videos, taken from some films which are played with the products in large department stores, and a new product being added to the Australian section.]]></description>
			<content:encoded><![CDATA[<p>I forgot to mention this earlier on, but the additions/modifications to the<a href="http://www.doustproducts.com.au/" title="View the Doust Plumbing Products website"> Doust Plumbing Products</a> website are also online now. The changes included the addition of a couple of <a href="http://www.doustproducts.com.au/aus/doustvalve.html" title="Doust Valve prouct page">product </a><a href="http://www.doustproducts.com.au/aus/douststop.html" title="Doust Stop product page">videos</a>, taken from some films which are played with the products in large department stores, and a <a href="http://www.doustproducts.com.au/aus/doustclean.html" title="New product - Doust Clean">new product</a> being added to the Australian section.</p>
]]></content:encoded>
			<wfw:commentRss>http://dentedreality.com.au/2003/07/latest-doust-modifications-online/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
	</item>
		<item>
		<title>No DOLA</title>
		<link>http://dentedreality.com.au/2003/04/no-dola/</link>
		<comments>http://dentedreality.com.au/2003/04/no-dola/#comments</comments>
		<pubDate>Tue, 08 Apr 2003 12:12:00 +0000</pubDate>
		<dc:creator>Beau Lebens</dc:creator>
				<category><![CDATA[Clients]]></category>
		<category><![CDATA[client]]></category>
		<category><![CDATA[dola]]></category>
		<category><![CDATA[ia]]></category>
		<category><![CDATA[information architecture]]></category>

		<guid isPermaLink="false">http://wiggin.local/dev/dentedreality.com.au/2003/04/no-dola/</guid>
		<description><![CDATA[That&#8217;s annoying &#8212; last week I got a call from DOLA, asking if I would be able to come in early next week (this week) to talk to them about doing some IA work for them. I had to turn them down, because I am now working at AdultShop.com, which is taking up nearly all [...]]]></description>
			<content:encoded><![CDATA[<p>That&#8217;s annoying &#8212; last week I got a call from <acronym title="Department Of Land Administration">DOLA</acronym>, asking if I would be able to come in early next week (this week) to talk to them about doing some IA work for them.</p>
<p>I had to turn them down, because I am now working at AdultShop.com, which is taking up nearly all of my time, and I simply wouldn&#8217;t have had time to dedicate to the job. I asked them what they were doing anyway, and apparently they wanted me to work on the information architecture of their entire suite of websites and online applications &#8211; bugger!</p>
]]></content:encoded>
			<wfw:commentRss>http://dentedreality.com.au/2003/04/no-dola/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
	</item>
	</channel>
</rss>

