<?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; Featured</title>
	<atom:link href="http://dentedreality.com.au/category/featured/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>Lessons Learned</title>
		<link>http://dentedreality.com.au/2010/08/lessons-learned/</link>
		<comments>http://dentedreality.com.au/2010/08/lessons-learned/#comments</comments>
		<pubDate>Wed, 04 Aug 2010 00:57:45 +0000</pubDate>
		<dc:creator>Beau Lebens</dc:creator>
				<category><![CDATA[Featured]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[lessons]]></category>
		<category><![CDATA[life]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://dentedreality.com.au/?p=5400</guid>
		<description><![CDATA[A few weeks ago I had a pretty rough time with something I was working on, so I thought I&#8217;d take the chance to share some lessons with you that I learned along the way. I&#8217;m taking these specifically from my experience as a developer of web-based systems, but I feel like at least some [...]]]></description>
			<content:encoded><![CDATA[<p>A few weeks ago I had a pretty rough time with something I was working on, so I thought I&#8217;d take the chance to share some lessons with you that I learned along the way. I&#8217;m taking these specifically from my experience as a developer of web-based systems, but I feel like at least some of them apply to a lot of other situations in life as well. <acronym title="Your Mileage May Vary">YMMV</acronym>.</p>
<p><span id="more-5400"></span></p>
<ul>
<li><strong>Understand something before trying to change it</strong>: If you&#8217;re intending on making some changes in your life, whether it be in a web application, or the neighborhood you live in, it&#8217;s a good idea to truly understand what it is that you&#8217;re changing before you go about changing it. Perhaps in fully understanding it you&#8217;ll find that you will no longer want to change it. Perhaps it doesn&#8217;t actually need changing. Even if you end up changing it, knowing its current state more fully will help make sure that your changes don&#8217;t have unintended consequences or put you in a worse position than you started.</li>
<li><strong>You can&#8217;t solve a problem that you can&#8217;t define</strong>: If you&#8217;re trying to &#8220;fix&#8221; something, your first step should be accurately defining what it is that you&#8217;re trying to fix and how it is currently &#8220;broken&#8221;. This includes creating a consistent way of reproducing the problem you&#8217;re experiencing so that once you think you&#8217;ve fixed it, you can confirm it by no longer being able to reproduce the problem. You might also want to look at the flip side of this and define what you <strong>should</strong> be seeing but are not, and then confirming that your solution results in seeing that.</li>
<li><strong></strong><strong>&#8220;Revert&#8221;. Now.</strong><span style="font-weight: normal;">: If you are lucky enough to recognize when you&#8217;ve made a mistake before it&#8217;s caused too much damage, you might have the ability to at the very least stop it from getting worse. Do that. Now. Version control systems allow you to &#8220;revert&#8221; (or reverse merge). Life isn&#8217;t quite as clean, but perhaps a simple apology, right now, would &#8220;stop the hemorrhaging&#8221; so that you can really fix the problem.</span></li>
<li><strong>Ask for help early and often</strong>: I think most people generally try to avoid asking for help unless they really need it. I know I do. That&#8217;s actually a bad habit to get too deep into. Trying to &#8220;go it alone&#8221; can get you tangled up in something that a fresh set of eyes/opinion could easily see straight through. Give it a shot on your own, but as soon as you start feeling that spiral of getting lost in a problem, seek out help or other opinions/ideas.</li>
<li><strong>Relax. Walk away for a while</strong>: It&#8217;s easy to get caught up thinking that what you&#8217;re working on is the end of the world. Maybe if you work on the control circuits for nuclear missiles it is. If you don&#8217;t then it&#8217;s quite likely not, although it might feel like it. Make sure your current situation isn&#8217;t causing completely irreversible damage then walk away; take a nap; go for a walk around the block; take a shower; do something to take your mind off the problem at hand. Not only does this give you a chance to not melt your brain, but it gives your subconscious a chance to roll the problem around and maybe come up with a solution.</li>
</ul>
<p>I&#8217;d prefer to have had the chance to learn these (or had them reinforced) some other way, but I guess things are more memorable when they&#8217;re surrounded by drama, right? Back to the saddle.</p>
]]></content:encoded>
			<wfw:commentRss>http://dentedreality.com.au/2010/08/lessons-learned/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
	</item>
		<item>
		<title>Web Service Authentication APIs</title>
		<link>http://dentedreality.com.au/2010/01/web-service-authentication-apis/</link>
		<comments>http://dentedreality.com.au/2010/01/web-service-authentication-apis/#comments</comments>
		<pubDate>Sun, 24 Jan 2010 01:34:55 +0000</pubDate>
		<dc:creator>Beau Lebens</dc:creator>
				<category><![CDATA[Featured]]></category>
		<category><![CDATA[Techn(ical|ology)]]></category>
		<category><![CDATA[authentication]]></category>
		<category><![CDATA[authsub]]></category>
		<category><![CDATA[bebo]]></category>
		<category><![CDATA[blogger]]></category>
		<category><![CDATA[delicious]]></category>
		<category><![CDATA[digg]]></category>
		<category><![CDATA[documentation]]></category>
		<category><![CDATA[dopplr]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[flickr]]></category>
		<category><![CDATA[friendfeed]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[last.fm]]></category>
		<category><![CDATA[linkedin]]></category>
		<category><![CDATA[mixx]]></category>
		<category><![CDATA[myspace]]></category>
		<category><![CDATA[oauth]]></category>
		<category><![CDATA[openid]]></category>
		<category><![CDATA[picasa]]></category>
		<category><![CDATA[posterous]]></category>
		<category><![CDATA[reddit]]></category>
		<category><![CDATA[tumblr]]></category>
		<category><![CDATA[twitter]]></category>
		<category><![CDATA[verification]]></category>
		<category><![CDATA[vimeo]]></category>
		<category><![CDATA[web services]]></category>
		<category><![CDATA[yahoo]]></category>
		<category><![CDATA[youtube]]></category>

		<guid isPermaLink="false">http://dentedreality.com.au/?p=4670</guid>
		<description><![CDATA[For a project I&#8217;m working on, I&#8217;ve been looking at a lot of web service authentication/verification APIs lately. I thought folks might be interested in the results. Here are the methods available for a variety of web services/applications online, with links to their appropriate docs: Web Application Authentication Method Bebo Custom token Blogger.com AuthSub Delicious [...]]]></description>
			<content:encoded><![CDATA[<p>For a project I&#8217;m working on, I&#8217;ve been looking at a lot of web service authentication/verification APIs lately. I thought folks might be interested in the results. Here are the methods available for a variety of web services/applications online, with links to their appropriate docs:</p>
<p><span id="more-4670"></span></p>
<table class="aligncenter" style="border: 0pt solid #cccccc;" border="0">
<thead>
<tr>
<th>Web Application</th>
<th>Authentication Method</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="http://bebo.com">Bebo</a></td>
<td><a href="http://www.bebo.com/docs/auth">Custom token</a></td>
</tr>
<tr>
<td><a href="http://blogger.com">Blogger.com</a></td>
<td><a href="http://code.google.com/apis/blogger/docs/2.0/developers_guide_protocol.html#Authenticating">AuthSub</a></td>
</tr>
<tr>
<td><a href="http://delicious.com">Delicious</a></td>
<td><a href="http://delicious.com/help/api">OAuth (and HTTP Basic)</a></td>
</tr>
<tr>
<td><a href="http://digg.com">Digg</a></td>
<td><a href="http://digg.com/api/docs/authentication">OAuth</a></td>
</tr>
<tr>
<td><a href="http://dopplr.com">Dopplr</a></td>
<td><a href="http://dopplr.pbworks.com/">AuthSub</a></td>
</tr>
<tr>
<td><a href="http://facebook.com">Facebook</a></td>
<td><a href="http://developers.facebook.com/connect.php">Custom token (Facebook Connect)</a></td>
</tr>
<tr>
<td><a href="http://flickr.com">Flickr</a></td>
<td><a href="http://www.flickr.com/services/api/auth.spec.html">Custom token</a></td>
</tr>
<tr>
<td><a href="http://friendfeed.com">FriendFeed</a></td>
<td><a href="http://friendfeed.com/api/documentation#authentication">OAuth</a></td>
</tr>
<tr>
<td><a href="http://www.google.com/profiles">Google Profiles</a></td>
<td><a href="http://code.google.com/apis/apps/profiles/developers_guide_protocol.html#Auth">AuthSub</a></td>
</tr>
<tr>
<td><a href="http://last.fm">Last.fm</a></td>
<td><a href="http://www.last.fm/api/webauth">Custom token</a></td>
</tr>
<tr>
<td><a href="http://linkedin.com">LinkedIn</a></td>
<td><a href="http://developer.linkedin.com/docs/DOC-1008">OAuth</a></td>
</tr>
<tr>
<td><a href="http://mixx.com">Mixx</a></td>
<td><a href="http://help.mixx.com/API:v1r1:user_auth">OAuth</a></td>
</tr>
<tr>
<td><a href="http://myspace.com">MySpace</a></td>
<td><a href="http://wiki.developer.myspace.com/index.php?title=What_is_MySpaceID%3F#MySpace_Application_Authorization_and_OAuth">OAuth</a></td>
</tr>
<tr>
<td><a href="http://picasa.com">Picasa</a></td>
<td><a href="http://code.google.com/apis/picasaweb/docs/1.0/developers_guide_php.html#AuthSub">AuthSub</a></td>
</tr>
<tr>
<td><a href="http://posterous.com">Posterous</a></td>
<td><a href="http://posterous.com/api/posting">HTTP Basic</a></td>
</tr>
<tr>
<td><a href="http://reddit.com">Reddit</a></td>
<td><a href="http://code.reddit.com/wiki/API">Custom token</a> (modhash)</td>
</tr>
<tr>
<td><a href="http://tumblr.com">Tumblr</a></td>
<td><a href="http://www.tumblr.com/docs/api#authenticate">HTTP POST</a> (plaintext password)</td>
</tr>
<tr>
<td><a href="http://twitter.com">Twitter</a></td>
<td><a href="http://apiwiki.twitter.com/Twitter-REST-API-Method%3A-oauth-authorize">OAuth</a></td>
</tr>
<tr>
<td><a href="http://vimeo.com">Vimeo</a></td>
<td><a href="http://www.vimeo.com/api/docs/authentication">OAuth</a></td>
</tr>
<tr>
<td><a href="http://yahoo.com">Yahoo</a></td>
<td><a href="http://developer.yahoo.com/oauth/">OAuth</a></td>
</tr>
<tr>
<td><a href="http://youtube.com">YouTube</a></td>
<td><a href="http://code.google.com/apis/youtube/2.0/developers_guide_protocol_authsub.html">AuthSub</a> and <a href="http://code.google.com/apis/youtube/2.0/developers_guide_protocol_oauth.html">OAuth</a></td>
</tr>
</tbody>
</table>
<p>Interesting stats:</p>
<ul>
<li>21 web services analyzed</li>
<li>10 (48%) are using <a href="http://oauth.net">OAuth</a> (including YouTube)</li>
<li>5 (24%) are using <a href="http://code.google.com/apis/accounts/docs/AuthSub.html">AuthSub</a> (also including YouTube)</li>
<li>Dopplr is the only non-Google property using AuthSub</li>
<li>Tumblr is the only property using plaintext passwords, although Posterous is using HTTP Basic, which is basically plaintext</li>
</ul>
<p>Looks like OAuth is gaining some real traction, and in fact if Google switched over to using it, it&#8217;d have a real hold on the authentication space. That would probably be a good thing. Next up in my adventure will be seeing how truly conformant/compatible all these OAuth implementations are, and how portable my code be able to be in accessing them all.</p>
<p>If you&#8217;d like to add any others that you know about, please throw them in the comments and I&#8217;ll add them to the table above so everyone can find them.</p>
]]></content:encoded>
			<wfw:commentRss>http://dentedreality.com.au/2010/01/web-service-authentication-apis/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
	
	</item>
		<item>
		<title>On Cafe Working</title>
		<link>http://dentedreality.com.au/2009/12/cafe-working-selection-criteria/</link>
		<comments>http://dentedreality.com.au/2009/12/cafe-working-selection-criteria/#comments</comments>
		<pubDate>Mon, 21 Dec 2009 02:49:30 +0000</pubDate>
		<dc:creator>Beau Lebens</dc:creator>
				<category><![CDATA[Featured]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[cafe]]></category>
		<category><![CDATA[cafeworking]]></category>
		<category><![CDATA[laptop]]></category>
		<category><![CDATA[remote working]]></category>
		<category><![CDATA[travel]]></category>
		<category><![CDATA[wifi]]></category>
		<category><![CDATA[work]]></category>

		<guid isPermaLink="false">http://dentedreality.com.au/?p=4435</guid>
		<description><![CDATA[Since arriving in Santiago, I&#8217;ve been posed with the challenge of finding good locations to work from. I like to work from cafes, which I refer to as &#8220;cafeworking&#8221;. Whether you&#8217;re traveling or just wanting to get out of the house for the day though (assuming you work from home, like I normally do), your [...]]]></description>
			<content:encoded><![CDATA[<p>Since <a title="First Few Days in Santiago" rel="nofollow" href="http://dentedreality.com.au/2009/12/first-few-days-in-santiago-chile/">arriving in Santiago</a>, I&#8217;ve been posed with the challenge of finding good locations to work from. I like to work from cafes, which I refer to as &#8220;cafeworking&#8221;. Whether you&#8217;re traveling or just wanting to get out of the house for the day though (assuming you work from home, like I normally do), your selection criteria are probably similar either way. I decided that I&#8217;d document some of the things I look for when I&#8217;m trying to find a good place to work for the day. Feel free to add your own criteria in the comments.</p>
<p><span id="more-4435"></span>Some of the things I look for in a good cafeworking location:</p>
<ul>
<li><strong>Internet Access</strong> &#8212; Obviously this is important, and it can be harder than you might expect to find decent wifi/connectivity. Places that have a sticker up don&#8217;t always have it, places that do have it are sometimes being leeched by people (so it&#8217;s slow), signal strength can be weak, or worst of all, wifi can be fine, but internet connectivity is down, or patchy/slow. The worst part here is if you don&#8217;t find out about problems until after you&#8217;ve already ordered something, because then not only are you stuck there with what you&#8217;ve ordered, but if you have to go somewhere else, you&#8217;ve got to order something again.</li>
<li><strong>Ergonomics</strong> &#8212; My aim is always to find somewhere that I can sit for at least 3 hours to get some work done. This means that ideally I want a table of some sort, and a comfortable chair. It doesn&#8217;t need to be a Herman Miller or anything, but ideally I want more than a wooden fold-up chair if I can get it. Also in this category is looking for a place where I can sit that doesn&#8217;t result in sun reflecting off my screen. Especially with a glossy MacBook Pro, this is a big issue. You should also be looking out for sun in your eyes, the height of the table you score and possibly your position in relation to others (in case you don&#8217;t want someone looking over your shoulder while you&#8217;re working).</li>
<li><strong>Power Availability</strong> &#8212; This one is less of an issue for some people (of whom I am thoroughly jealous). For us MacBook Pro users, it&#8217;s going to be pretty important because realistically, you only get a couple of hours&#8217; juice from your battery, and working with your screen brightness turned down extends your untethered time a bit, but is really annoying. I picked up an <a href="http://www.hypershop.com/HyperMac-External-MacBook-Battery-100Wh-p/mbp-100.htm">external HyperMac battery</a> which gives me a couple extra hours on top of the built-in one, but I still need a power outlet if I want to sit somewhere all day and work with full screen brightness. Mac power bricks (with the optional extension cord) give you good range, but if you&#8217;re in a different country and using <a href="http://store.apple.com/us/product/MB974ZM/A?fnode=MTY1NDEwMQ&amp;mco=MTA4NDE3MDQ">one of the international adapters</a> which you dutifully picked up at the Apple Store, you may find yourself cut short. Because of the way the official Apple adapters work, you can&#8217;t use the extension end of the cord at the same time, so youhalf the distance you&#8217;re able to sit from a power outlet.</li>
<li><strong>Decent Food/Beverages</strong> &#8212; This one is a no-brainer. If you&#8217;re going to be working somewhere all day, you want to be able to buy some food and drink to keep you going (and to stop them from kicking you out!). Sometimes it&#8217;s fun to work somewhere that serves &#8220;adult beverages&#8221; so that at the end of the day you can enjoy a glass of vino or a cerveza while you&#8217;re finishing off your day&#8217;s work.</li>
<li><strong>Vibe</strong> &#8212; The last one is more of an attitude than anything specific you&#8217;ll be able to see from a difference. I like to refer to this as &#8220;<a href="http://www.youtube.com/watch?v=ITUSZ6LRHrk">the vibe</a>&#8220;. It takes into account the general feel of the place, and specifically the attitude of the staff. You don&#8217;t want to be somewhere that you feel unwelcome, where they&#8217;re hovering over your shoulder every 15 minutes trying to get you to buy something, or where there is an outright policy of not allowing people to work all day. This one is hard to judge based on a quick walk-through of a cafe, but with a bit of practice and a quick, honest question here and there, you should be OK.</li>
</ul>
<p>Once you find a place with all of this, then all you need to do is concentrate long enough to get anything done <img src='http://dentedreality.com.au/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>What do you look for when you&#8217;re cafe-working? Let me know below, I&#8217;m interested to hear what&#8217;s important for other folks.</p>
]]></content:encoded>
			<wfw:commentRss>http://dentedreality.com.au/2009/12/cafe-working-selection-criteria/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
	</item>
		<item>
		<title>LDAP (very) Basics</title>
		<link>http://dentedreality.com.au/2009/11/ldap-very-basics/</link>
		<comments>http://dentedreality.com.au/2009/11/ldap-very-basics/#comments</comments>
		<pubDate>Sun, 29 Nov 2009 04:11:40 +0000</pubDate>
		<dc:creator>Beau Lebens</dc:creator>
				<category><![CDATA[Featured]]></category>
		<category><![CDATA[Techn(ical|ology)]]></category>
		<category><![CDATA[basics]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[ldap]]></category>
		<category><![CDATA[openldap]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://dentedreality.com.au/?p=1077</guid>
		<description><![CDATA[Getting started with LDAP can be quite daunting. In the space of a weekend, I took myself on a bit of a crash course to learn about LDAP so that I could work on a project that needed LDAP to access an address book. Here are some of the things I learned along the way: [...]]]></description>
			<content:encoded><![CDATA[<p>Getting started with LDAP can be quite daunting. In the space of a weekend, I took myself on a bit of a crash course to learn about LDAP so that I could work on a project that needed LDAP to access an address book. Here are some of the things I learned along the way:</p>
<p><span id="more-1077"></span></p>
<h3>Some LDAP Terminology</h3>
<ul>
<li>LDAP &#8211; Lightweight Directory Access Protocol. It&#8217;s a system for accessing a &#8220;directory&#8221; of information in a structured way</li>
<li>DN &#8211; Distinguished Name. It identifies a specific entry by either a series of RDNs, or a search string, to locate that particular entry.</li>
<li>RDN &#8211; Relative Distinguished Name. Basically a portion of a DN.</li>
<li>CN &#8211; Common Name. This is the general purpose &#8220;name&#8221; of an entry, and is usually used as part of the DN for an entry.</li>
<li>DC &#8211; Domain Component. This is also part of a DN/RDN, and is often used to define the name of your service/directory/top-level-domain.</li>
<li>directory &#8211; your collection of entries that you want to access via LDAP (it&#8217;s the D in LDAP!)</li>
<li>schema &#8211; the &#8220;design&#8221; of your directory. Refers to the hierarchy of entries within your directory.</li>
<li>top &#8211; the &#8220;root&#8221; level entry of your schema.</li>
<li>objectClass &#8211; a group of attributes, commonly used to describe a particular type of information. For example the inetOrgPerson objectClass contains a group of attributes for describing a person, with common internet-based communication methods.</li>
<li>attribute &#8211; a single piece of information belonging to an entry in your directory</li>
<li>LDIF &#8211; LDAP Data Interchange Format. This is a simple, text-based format used to read/write LDAP entries. It is in &#8220;attributeName: value&#8221; format, with one entry per line, so it&#8217;s very easy to read/handle on the command line or via code.</li>
</ul>
<h3>Setting Up an LDAP Server</h3>
<ul>
<li><a href="http://www.openldap.org/">OpenLDAP</a> is easy to install/configure, and is available via package managers for most common *NIX OSes.</li>
<li>You need to set up your DC correctly in the slapd configuration files so that you have something to connect to.</li>
<li>Run slapd in debug mode so that you can get some useful information and see what is and isn&#8217;t working while you&#8217;re figuring things out.</li>
</ul>
<h3>Custom objectClass Creation</h3>
<p>In our case, we needed some attributes that weren&#8217;t available in any of the objectClasses that were being loaded by OpenLDAP, so we decided to create our own. OpenLDAP was loading the config files for a lot of attributes, but until they&#8217;re included in an objectClass, and that objectClass is referenced in your entry, you can&#8217;t use those attributes. Here&#8217;s what we came up with:</p>
<pre>objectclass ( 1.1.1.1.1.1.1.1.1.1.1.1.1 NAME 'vCardPerson' SUP inetOrgPerson STRUCTURAL
 MAY ( additionalName $ personalTitle $ honorificSuffix $ bday $ tz $ sourceURI ) )</pre>
<p>Basically we just created an objectClass called &#8220;vCardPerson&#8221; which inherited everything (SUP) from inetOrgPerson, then added a few optional (MAY) attributes. The 1.1.1&#8230;.. is a garbage number that we made up. You&#8217;re supposed to register and get a unique number to identify every objectClass from IANA, but, well, we were working on an experimental project so we didn&#8217;t bother <img src='http://dentedreality.com.au/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h3>Working with LDAP via PHP</h3>
<ul>
<li>If you get an error message: &#8220;Object Class violation&#8221;, then you&#8217;re probably trying to set an attribute which isn&#8217;t available. You might need to include another objectClass (or define your own) so that you have access to that attribute.</li>
<li>Connecting and Binding to an LDAP server is pretty easy once you have things set up. You will probably use something similar to this:
<pre>$ldap = ldap_connect( 'ldap://ldaphostname.com/' );
if ( $ldap ) {
 $bind = ldap_bind( $ldap, 'cn=admin,dc=nodomain', 'password' );
 if ( !$bind ) {
 echo 'Failed to connect to LDAP server!';
 exit;
 }
}</pre>
</li>
<li>A DN should probably include a unique identifier to make life easier, ours ended up looking something like this (where uid changed for each entry):
<pre>uid=123,dc=1234,dc=nodomain</pre>
</li>
<li>Creating an entry (and saving it in LDAP) is as easy as creating an array and then calling a PHP function. Each of the array elements matches up to an LDAP attribute, and you just need to be sure to include an objectClass entry to define which attributes you&#8217;re using. Here&#8217;s an example (assuming you&#8217;re connected to an LDAP server via $ldap and have defined a new, unique DN via $dn):
<pre>$entry = array();
$entry['objectClass']     = array( 'top', 'person', 'organizationalPerson', 'inetOrgPerson', 'hCard' );
$entry['cn']              = array( 'Billy Bob' ); // Common Name
$entry['sn']              = array( 'Bob' ); // Surname/Family Name
$entry['gn']              = array( 'Billy' ); // Given Name
$entry['displayName']     = array( 'BillyBob' ); // Nickname
$entry['mail']            = array( 'billy@bob.com' ); // Email
$entry['labeledURI']      = array( 'http://billybob.com' );
$entry['mobile']          = array( '+12345678912' ); // Mobile number

if ( !ldap_add( $ldap, $dn, $entry ) ) {
 echo ldap_error( $ldap );
} else {
 echo 'Successfully added entry';
}</pre>
</li>
</ul>
<p>Hopefully I&#8217;ll be able to add to this over time as I learn some more bits and pieces with LDAP. Do you have any good pointers or explanations for how LDAP works? Please add them in the comments!</p>
]]></content:encoded>
			<wfw:commentRss>http://dentedreality.com.au/2009/11/ldap-very-basics/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
	</item>
		<item>
		<title>Challenges You Will Face When Working With Remote Teams</title>
		<link>http://dentedreality.com.au/2008/12/challenges-you-will-face-when-working-with-remote-teams/</link>
		<comments>http://dentedreality.com.au/2008/12/challenges-you-will-face-when-working-with-remote-teams/#comments</comments>
		<pubDate>Tue, 23 Dec 2008 18:00:35 +0000</pubDate>
		<dc:creator>Beau Lebens</dc:creator>
				<category><![CDATA[Featured]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[Techn(ical|ology)]]></category>
		<category><![CDATA[basecamp]]></category>
		<category><![CDATA[beanstalk]]></category>
		<category><![CDATA[communication]]></category>
		<category><![CDATA[distributed office]]></category>
		<category><![CDATA[flyspray]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[google docs]]></category>
		<category><![CDATA[lighthouse]]></category>
		<category><![CDATA[presently]]></category>
		<category><![CDATA[project management]]></category>
		<category><![CDATA[prologue]]></category>
		<category><![CDATA[remote teams]]></category>
		<category><![CDATA[remote working]]></category>
		<category><![CDATA[skype]]></category>
		<category><![CDATA[svn]]></category>
		<category><![CDATA[task management]]></category>
		<category><![CDATA[timezones]]></category>
		<category><![CDATA[trac]]></category>
		<category><![CDATA[wikis]]></category>
		<category><![CDATA[yammer]]></category>

		<guid isPermaLink="false">http://wiggin.local/dev/dentedreality.com.au/?p=479</guid>
		<description><![CDATA[For a number of reasons at a number of times in my career, I&#8217;ve found myself working with variously-distributed teams of one kind or another. Perhaps the &#8220;office&#8221; is a building that spans 2 square miles, perhaps someone was working from home for a day or someone was on a 2 week &#8220;vacation&#8221;, or even [...]]]></description>
			<content:encoded><![CDATA[<p>For a number of reasons at a number of times in my career, I&#8217;ve found myself working with variously-distributed teams of one kind or another. Perhaps the &#8220;office&#8221; is a building that spans 2 square miles, perhaps someone was working from home for a day or someone was on a 2 week &#8220;vacation&#8221;, or even working for a distributed company with no real office. These were all different situations, but they all suffered from simliar challenges. I want to take a look at a couple of those challenges and some ways that you can help mitigate them.</p>
<p>I&#8217;m looking at this mostly as a member of a technical team of some sort, but I&#8217;m sure a lot of it would apply to pretty much anyone who&#8217;s not working face-to-face with their colleagues. Apologies in advance for this being kind of rambling (and very long). It&#8217;s a collection of all sorts of observations, links and ideas that I&#8217;ve collected over time.<span id="more-479"></span></p>
<h3>Communication Deficiencies</h3>
<p>This is first for a reason. Number one in frequency and potential to cause damage are all manner of communication deficiencies. This is one of those things that is just as true for cube-workers as it is for distributed teams. Communicate or die. Here are a couple of guidelines to help you all communicate:</p>
<ul>
<li>Get a <a href="http://www.dokuwiki.org/dokuwiki">wiki</a> and use it at least for more &#8220;permanent&#8221; documentation like company policies/rules etc.</li>
<li>Ideally, use your wiki for specifications, project requirements etc &#8211; you get a revision history and a neat, centralized document that everyone can check up on.</li>
<li>You could also put a page on the wiki (or somewhere) for each person in the company, so that new hires can &#8220;get to know everyone&#8221; by reading a bit about each person.</li>
<li>Consider setting up an <a href="http://wordpress.org">internal blog</a> (perhaps <a href="http://en.blog.wordpress.com/2008/01/28/introducing-prologue/">Prologue</a>, <a href="http://yammer.com">Yammer</a> or <a href="http://present.ly">Present.ly</a> even) or mailing list for announcements etc that everyone in the company needs to know about (email isn&#8217;t great for this, because it gets lost in amongst everything else)</li>
<li>Don&#8217;t CC: everyone on everything. It&#8217;s annoying, often irrelevant, and it leads to &#8220;boy who cried wolf&#8221; syndrome where people start ignoring emails they should be paying attention to.</li>
<li>Get everyone on IM and make sure that you&#8217;re all comfortable talking to each other. This doesn&#8217;t mean that the sysadmin needs to be IMing the CEO of the company telling them about their weekend, just that normal &#8220;communication lines&#8221; within the hierarchy of the company should be open online as well.</li>
<li>Consider using video chat as way to do some synchronous communication when the situation calls for it (but don&#8217;t overdo it).</li>
<li>Use email when it makes sense.</li>
<li>If it&#8217;s an emergency, it does NOT make sense to use email &#8211; call.</li>
<li>Get <a href="http://skype.com">Skype</a> (or something similar) and use it when it makes sense.</li>
<li>Always keep your language as simple as possible (whether you&#8217;re interacting with someone with the same native language or not). e.g. (bad) &#8220;I&#8217;m of the opinion that without the conversion of these resources to the requested format within a limited period, the ramifications for the project deadline would be negative&#8221;. How about (good) &#8220;We will not meet the project deadline if the resources aren&#8217;t converted to &lt;format&gt; by &lt;date&gt;&#8221;</li>
<li>Be succinct yet descriptive with all communications &#8211; you&#8217;re just wasting everyone&#8217;s time if everything requires confirmation/discussion.</li>
<li>Consider setting up a group IRC channel or something similar which you can use for group discussions. Log it and make the logs available and searchable to everyone in the company.</li>
</ul>
<h3>Task Management/Allocation</h3>
<p>Knowing and managing what everyone is working on is hard enough when you&#8217;re all in the same office, but when you&#8217;re spread out across the country or across the globe, it gets even harder. You need to keep track of what people are working on now, what they are aware of that they should be working on next, what&#8217;s been allocated to who, etc etc etc. This one largely comes down to communication again (doesn&#8217;t it all?) but there are some unique challenges here (don&#8217;t think you can just solve this with a lot of email, it doesn&#8217;t scale). Here are some tips:</p>
<ul>
<li>You&#8217;ll want a centralized system of some sort for this so that you can all &#8220;go&#8221; to the same place to see what&#8217;s going on.</li>
<li>Being able to allocate/assign tasks is important so that you can see who&#8217;s responsible for something.</li>
<li>It&#8217;s good for everyone to be able to look at everyone else&#8217;s list, so for example I can see if someone else has a huge list, then there&#8217;s no point allocating them additional work. Or I can see that someone has nothing on their list so either they&#8217;re not using the system, or there are other questions to be answered!</li>
<li>Transparency is a good thing &#8211; pick a system that keeps track of who changed what, when. Especially changing the assignment of tasks.</li>
<li>There&#8217;s a balancing act to be played between privacy and control as far as who can edit what, who can allocate tasks etc, but personally I think companies should strive to have an open enough culture that you can remove these sorts of barriers and allow people to use their own judgment.</li>
<li>It&#8217;s good to be able to attach/associate files with tasks, but be careful about revision control on those documents (especially if you&#8217;re all used to relying on a different system for everything else).</li>
<li>Email integration is important, even if it&#8217;s just notifications when things change. It will help bring people back to the system and keep using it, since email really is the &#8220;nerve-center&#8221; of most people&#8217;s online business world.</li>
<li>Something like <a href="http://basecamphq.com">BaseCamp</a> might be handy here, or you can use a bug-tracking system like <a href="http://trac.edgewall.org/">Trac</a>, a new player like <a href="http://flyspray.org/">FlySpray</a> or <a href="http://lighthouseapp.com/">Lighthouse</a> or any of a number of other options. Some companies choose to roll their own to suit their needs which works as well.</li>
</ul>
<h3>Version/Revision Control and Race Conditions</h3>
<p>The minute you have more than one person working on any kind of file (Word Document, source code, images, anything) the question will arise: &#8220;is this the latest copy of this file?&#8221; This is not a question that you want to answer with &#8220;no&#8221;, especially when you&#8217;ve already saved it, uploaded it to your live server and lost all track of any previous changes. A race condition is when 2 people edit the same file at the same time, and then try to store it back in a central location (e.g. networked drives). In addition to race conditions, what happens when you need to see previous versions of a file for some reason? You made changes that are going to be reverted, you made changes that are plain wrong? There are some different common solutions to different parts of this problem, for example:</p>
<ul>
<li><a href="https://docs.google.com/">Google Docs</a> attempts to solve the problem by providing a single &#8220;master&#8221; copy of documents, which everyone edits in the same location, at the same time. This means that you don&#8217;t take a copy of your document and then go and edit it, you actually edit the live, master copy, every time. In addition to removing potential race conditions, GDocs also stores revisions of your documents over time so you can get old copies if you need to.</li>
<li><a href="http://subversion.tigris.org/">Subversion</a>, <a href="http://git.or.cz/">Git</a>, <a href="http://www.nongnu.org/cvs/">CVS</a>, <a href="http://en.wikipedia.org/wiki/Visual_SourceSafe">SourceSafe</a> and a bunch of other traditional &#8220;source code versioning systems&#8221; are designed specifically for working with source code (for programmers) and other pure-text based documents, but they can also usually handle other file-types. There are differences between the options, but in general you get a &#8220;working copy&#8221; of a document of some sort, and can manually update it based on a centralized master copy. If there are clashes between changes you and someone else has made, then you can &#8220;merge&#8221; the changes into a single new document (then put that back as the master copy). Most of these systems allow you to install them on your own server, or there are also hosted options like <a href="http://beanstalkapp.com/">Beanstalk</a> and <a href="http://github.com/">GitHub</a>.</li>
<li>Wikis will maintain previous revisions of each document (one of their most valuable features), so you can always see what people have changed over time and how a document has evolved.</li>
<li>Ideally, all documents would be under some sort of version control, with little to no user intervention/interaction required. Google Docs does a decent job of this for &#8220;Office&#8221; style documents. Wikis handle it automatically for anything that&#8217;s created within them, while SVN/Git etc all require users to be involved, but for good reason (you don&#8217;t want your source code doing things that might result in breaking on its own).</li>
</ul>
<h3>Timezones</h3>
<p>Although there are some benefits to having people in different timezones, there are also some real problems when you&#8217;ve got people you&#8217;re trying to interact with spread all over the place (and awake/asleep at different times).</p>
<h4>Benefits:</h4>
<ul>
<li>Global customer support: depending on which people you have in different timezones, it may allow you to provide support to your users for more hours of the day</li>
<li>24/7 progress: perhaps not completely 24/7, but if the timezones mesh up, then you can potentially set a task as you&#8217;re leaving at the end of the day, and come back to work the next day with the completed task in your inbox.</li>
<li>Localized contacts/markets if your staff are actively engaging with people in their real world surroundings as well.</li>
</ul>
<h4>Challenges:</h4>
<ul>
<li>Lack of synchronous communication: if you&#8217;re all on different timezones, it&#8217;s often difficult to get everyone online at the same time to discuss something. This means you either a) communicate very clearly and descriptively what you&#8217;re trying to do, or b) spend a lot of time going back and forth clarifying things before anything gets done.</li>
<li>Delays: generally stemming from communication problems, you can easily find yourself waiting days at a time to get something seemingly simple done because of the back and forth resulting from people requiring extra information/authority etc.</li>
<li>Potential for additional costs due to requiring multiple office locations (unless people are working from their own locations, in which case this becomes a benefit because you can save on having an office at all).</li>
</ul>
<h3>Wrap-Up</h3>
<p>I&#8217;m really interested in these topics in part because they&#8217;ve directly affected me and my work, and in part because I know they affect so many other people. There are no doubt still plenty of opportunities to provide tools and systems to help groups work together from disparate locations and timezones, so I&#8217;m interested to see/hear more about what&#8217;s going on in this space. Do you know of any other tools which are particularly handy for distributed teams? Please add them in the comments. What other elements of the distributed office are specific pain-points for you?</p>
]]></content:encoded>
			<wfw:commentRss>http://dentedreality.com.au/2008/12/challenges-you-will-face-when-working-with-remote-teams/feed/</wfw:commentRss>
		<slash:comments>0</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>Blogging APIs</title>
		<link>http://dentedreality.com.au/2004/03/blogging-apis/</link>
		<comments>http://dentedreality.com.au/2004/03/blogging-apis/#comments</comments>
		<pubDate>Wed, 10 Mar 2004 20:47:29 +0000</pubDate>
		<dc:creator>Beau Lebens</dc:creator>
				<category><![CDATA[Featured]]></category>
		<category><![CDATA[Techn(ical|ology)]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[apis]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[blogging]]></category>
		<category><![CDATA[blogs]]></category>

		<guid isPermaLink="false">http://dentedreality.com.au/?p=608</guid>
		<description><![CDATA[On the blosxom mailing list, someone was confused about the interaction between the different APIs for accessing blogging tools and formats. They asked what the story was, and I responsed with this summary of the market (available from the blosxom mailing list archives) (which was current at the time, but getting a little dated now); [...]]]></description>
			<content:encoded><![CDATA[<p>On the <a title="Go to the blosxom mailing list on yahoo.com" href="http://groups.yahoo.com/group/blosxom/">blosxom mailing list</a>, someone was confused about the interaction between the different APIs for accessing blogging tools and formats. They asked what the story was, and I responsed with this summary of the market (available from the <a title="View my post in the archives" href="http://groups.yahoo.com/group/blosxom/message/7010">blosxom mailing list archives</a>) (which was current at the time, but getting a little dated now);</p>
<blockquote><p>From:  &#8220;Beau&#8221; &lt;beau@d&#8230;&gt;<br />
Date:  Tue Mar 9, 2004  4:00 pm<br />
Subject:  Re: [blosxom] APIs, new blogging things, etc.</p>
<p>Ok Steve, I&#8217;ll take a bash at some of this, since I&#8217;ve been working with blogging APIs for a couple years now in effect, I&#8217;ve come across all the ones that you&#8217;ve mentioned <img src='http://dentedreality.com.au/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Someone else please fill gaps or correct me if I slip up somewhere <img src='http://dentedreality.com.au/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Ok &#8211; so, in approximate chronological order of time of appearance on the scene;</p>
<p>* Blogger API 1.0<br />
- <a href="http://plant.blogger.com/api/">http://plant.blogger.com/api/</a><br />
The original &#8211; based on XML-RPC [1] calls, gave access to most (all?) of Blogger&#8217;s original functionality, and was pretty darned easy to use. You POST an XML doc with encoded requests in it to a specific URL, and the response is another XML doc which you can then use however you like. Ev Williams of Blogger knocked this up over a couple of days apparently, and it went crazy from there &#8211; I&#8217;m still using it today in http://www.dentedreality.com.au/avantblog and it still works (usually <img src='http://dentedreality.com.au/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> )</p>
<p>* metaWebLogAPI<br />
- <a href="http://www.xmlrpc.com/metaWeblogApi">http://www.xmlrpc.com/metaWeblogApi</a> [Added 2004-07-07]<br />
Effectively a derivative of the Blogger API (and also XML-RPC based), this one came up to support Radio, I believe Dave Weiner knocked it up, and there was some animosity between he and Ev Williams over whether they should combine to create a unified blogging API (Radio and Blogger being the big 1 at the time) or go their separate ways. I believe one of the main reasons things went this way was because Blogger didn&#8217;t need/want title field support, but Radio did,<br />
thus the metaWebLogAPI, intended to be more universal.</p>
<p>* Blogger API 2.0<br />
- <a href="http://www.blogger.com/developers/api/documentation20.html">http://www.blogger.com/developers/api/documentation20.html</a><br />
Blogger realised that with their new versions, support from Google etc, they needed to clean up their API-act, so they started working on API 2.0. This one supports title fields and a number of other things, and is accessed via XML-RPC as well. As you can see at the URL, the draft specs were released in Feb 2003, but a couple months later, it was revoked and people were instructed not to use it, because there was no support for it and Atom (then called Echo) was going to be used in prefence&#8230; which brings us to&#8230;</p>
<p>* Echo&#8230; Necho&#8230; Atom API<br />
- <a href="http://www.intertwingly.net/wiki/pie/FrontPage">http://www.intertwingly.net/wiki/pie/FrontPage</a><br />
- <a href="http://www.atomenabled.org/">http://www.atomenabled.org/</a><br />
Originally called Echo, then they decided that was no good, so it was refered to as Necho (Not Echo) for a while, and finally ended up being called Atom. This one is based on a REST architecture ([2], [3]), based on [4]. The Atom API sort of duplicates the efforts of RSS, in that it presents blog data in an XML format, but it also allows you to modify that data (thus API) via<br />
REST-style interactions, involving PUT/POST/DELETE requests. I haven&#8217;t worked all this out just yet, but I have to so that I can update a few projects of mine (namely AvantBlog [5] and webpad [6]). There is also a SOAP [7] implementation of Atom, which I assume supports all the same sort of functions (retrieving posts/blogs, updating them etc), tho I haven&#8217;t looked at that at<br />
all, as personally I hate SOAP <img src='http://dentedreality.com.au/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  The idea of Atom is to provide a universal API which will be supported by all blogging systems (I believe MT and Blogger are already on board, others are likely to follow) so that we can write tools which will interop with all systems easily.</p>
<p>[1] <a href="http://www.xmlrpc.com/">http://www.xmlrpc.com/</a><br />
[2] <a href="http://internet.conveyor.com/RESTwiki/moin.cgi/FrontPage">http://internet.conveyor.com/RESTwiki/moin.cgi/FrontPage</a><br />
[3] <a href="http://www.xfront.com/REST.html">http://www.xfront.com/REST.html</a><br />
[4] <a href="http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm">http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm</a><br />
[5] <a href="http://www.dentedreality.com.au/avantblog">http://www.dentedreality.com.au/avantblog</a><br />
[6] <a href="http://www.dentedreality.com.au/webpad">http://www.dentedreality.com.au/webpad</a><br />
[7] <a href="http://www.w3.org/TR/soap/">http://www.w3.org/TR/soap/</a></p>
<p>Now, as for blosxom&#8217;s support for any of this mumbo jumbo &#8211; I know that sxtem [8] was written to provide Blogger API functionality for blosxom, and then you also have the atomfeed plugin [9] to provide an outgoing only (RSS-like syndication side of Atom, but not the modification side) feed for blosxom blogs. As for complete Atom API integration (allowing post editing etc via REST-calls), I&#8217;m not aware of any implementation allowing that so far, probably because the Atom spec [10] is still somewhat in flux, and even if it&#8217;s not, it&#8217;s a little hard to understand (for me at least <img src='http://dentedreality.com.au/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p>[8] <a href="http://www.blosxom.com/plugins/input/sxtem.htm">http://www.blosxom.com/plugins/input/sxtem.htm</a><br />
[9] <a href="http://www.blosxom.com/plugins/syndication/atomfeed.htm">http://www.blosxom.com/plugins/syndication/atomfeed.htm</a><br />
[10] <a href="http://www.atomenabled.org/developers/api/atom-api-spec.php">http://www.atomenabled.org/developers/api/atom-api-spec.php</a></p>
<p>So there you have it &#8211; as far as I am aware, that&#8217;s how the playing field lies at this point in regards to blogging APIs, and I haven&#8217;t even bothered to mention Movabletype (which, incidentally, implements a mish-mash of Blogger.com API and metaWebLogAPI functionality), so we&#8217;re doing quite well <img src='http://dentedreality.com.au/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  The beauty of blosxom is that to some extent, it doesn&#8217;t even need any of this mumbo-jumbo &#8211; you can call FTP the blosxom API if you really want <img src='http://dentedreality.com.au/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  When I eventually get an Atom toolkit operational, it&#8217;ll be written in PHP and linked from my Blogger API page [11], which is the current home of a number of other PHP-based blogging classes and function libraries. Until then &#8211; I&#8217;ll keep an eye out and play Lazy-web-style in the hope that someone else will beat me to it <img src='http://dentedreality.com.au/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>[11] <a href="http://dentedreality.com.au/bloggerapi/">http://dentedreality.com.au/bloggerapi/</a></p>
<p>Cheers, and I hope that sums things up for you Steve (and others)</p>
<p>Beau</p>
<p>&#8211;<br />
Beau Lebens<br />
Information Architect<br />
beau@d&#8230;<br />
Dented Reality &#8211; www.dentedreality.com.au<br />
Information Architecture, Usability, Web Development</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://dentedreality.com.au/2004/03/blogging-apis/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
	</item>
		<item>
		<title>Blogs: What Are They Good For?</title>
		<link>http://dentedreality.com.au/2003/06/blogs-what-are-they-good-for/</link>
		<comments>http://dentedreality.com.au/2003/06/blogs-what-are-they-good-for/#comments</comments>
		<pubDate>Wed, 04 Jun 2003 20:42:48 +0000</pubDate>
		<dc:creator>Beau Lebens</dc:creator>
				<category><![CDATA[Featured]]></category>
		<category><![CDATA[Techn(ical|ology)]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[blogging]]></category>
		<category><![CDATA[blogs]]></category>

		<guid isPermaLink="false">http://dentedreality.com.au/?p=605</guid>
		<description><![CDATA[NOTE: This post was written in 2003 and in places is now out of date. WordPress is now the dominant self-installed blogging platform, and continues to gain more of the market. Updates have been integrated into this post. What is a Blog? In its &#8216;purest&#8217; form, a blog is something akin to an online, personal [...]]]></description>
			<content:encoded><![CDATA[<p><strong>NOTE:</strong> This post was written in 2003 and in places is now out of date. <a href="http://wordpress.org">WordPress</a> is now the dominant self-installed blogging platform, and continues to gain more of the market. Updates have been integrated into this post.</p>
<h3>What is a Blog?</h3>
<p>In its &#8216;purest&#8217; form, a blog is something akin to an online, personal journal or diary,          taking the form of a series of chronologically-ordered, short, personal posts on a website.          It is easy to update and normally works by adding short posts to a template design of some sort.</p>
<p>BLOG is short for weB LOG, and became recognised widely as a web-publishing format in about 1999, when, among others,           <a title="Visit Evan's personal website" href="http://www.evhead.com/">Evan Williams</a> (via <a title="Visit the Pyra Labs website (not much there)" href="http://www.pyra.com/">Pyra Labs</a>, now owned by <a title="Visit google.com" href="http://www.google.com/">Google</a>) created <a title="Visit blogger.com" href="http://www.blogger.com/">Blogger.com</a>,          a free-to-access blogging tool which published your blog back to your own site by <acronym title="File Transfer Protocol">FTP</acronym>.           Blogger.com is currently one of the most popular blogging platforms in the world, along with <a href="http://wordpress.org">WordPress</a>, <a title="Visit livejournal.com" href="http://www.livejournal.com/">LiveJournal</a> and <a title="Visit movabletype.org" href="http://www.movabletype.org/">MovableType</a>.</p>
<p>Blogging (the process of posting an update to a blog) took off, as did the community around it.          Bloggers proved to be a friendly bunch, and many of them linked to each other and other sites,          creating a dense web of links and opinion. The personal nature of most blogs meant that          blogs became one of the most accessible personal-opinion formats on the web.</p>
<h3>Why Blog?</h3>
<p>Why would anyone want to keep an updated record of their personal thoughts and opinions online?          There&#8217;s a lot more to blogs than just that, but even for that purpose alone, it&#8217;s an amazing way          to exercise a right to free speech, and to reach potentially millions of people with your thoughts.</p>
<p>There are a growing number of different applications of blog-technology, including:</p>
<ul>
<li>Professional News Sites/Portals</li>
<li>Lightweight Content Management for all sorts of websites</li>
<li>To-Do Lists (personal or across a group)</li>
<li>Review Sites (movies, music, food, you name it!)</li>
<li>Corporate Knowledge Management (Knowledge Logs or <a title="Visit the yahoo.com k-logs mailing list site" href="http://groups.yahoo.com/group/klogs">K-Logs</a>)</li>
<li>Project Management (recording work completed at &#8216;x&#8217; time for &#8216;y&#8217; project)</li>
<li>Podcasting (delivering audio segments periodically)</li>
<li>Vlogging (Video-blogging; delivering video snippets/segments periodically)</li>
</ul>
<p>There will no doubt be more uses for the technology in the future, especially as blogs and related          technologies evolve and mature more, and as different kinds of <acronym title="Data about data">meta-data</acronym> is stored within blogs.</p>
<h3>How Do I Blog?</h3>
<p>Most blogging systems have their own interface of some sort for posting blogs, whether it be via          the web (like <a title="Visit blogger.com" href="http://www.blogger.com/">Blogger.com</a> and <a title="Visit movabletype.org" href="http://www.movabletype.org/">MovableType</a>),          using one of the many desktop clients (like <a title="Visit the w.bloggar website" href="http://www.wbloggar.com/">w.bloggar</a> and <a href="http://www.red-sweater.com/marsedit/">MarsEdit</a>), or          even straight into a text file in a directory (like <a title="Visit blosxom.com" href="http://www.blosxom.com/">blosxom</a> uses).</p>
<p>A common thread amongst each of these systems is that each &#8216;post&#8217; is treated as a separate entity,           which allows for a number of cool features (see below).</p>
<p>Today, there are tools of all sorts for posting to blogs, including 2 of my own, <a title="Visit the AvantBlog project page on this site" href="../avantblog/">AvantBlog</a>,          for posting to Blogger.com from a handheld/Palm device, and <a title="Visit the webpad project page on this site" href="../webpad/">webpad</a>, a more powerful editor with          access to a number of different blogging systems and number of HTML tools for managing post content.</p>
<h3>Bells &amp; Whistles</h3>
<p>With blogs becoming more popular, a number of related technologies and extras have developed          in the last few years. Some of the more popular features/extras are:</p>
<dl>
<dt>Comments</dt>
<dd>Allowing readers to contribute comments to a blog post creates a feedback loop and in many             cases provides a simple discussion forum/community feel.</dd>
<dt>Categorization/Topics</dt>
<dd>Most blogging tools allow for some sort of categorisation of posts so that they can be             organised according to topics. Different systems handle this in different ways, for example             MovableType allows you to store a post against multiple categories, while blosxom stores a post             in a single directory, representing a topic/category.</dd>
<dt>RSS/Atom</dt>
<dd><acronym title="Really Simple Syndication">RSS</acronym> allows other users to easily syndicate             the content of your blog into their own, or into a news reader/aggregator of some sort (web-based             like <a title="Visit bloglines.com" href="http://www.bloglines.com/">BlogLines</a>, or desktop-based like <a title="Visit the NetNewsWire website" href="http://ranchero.com/netnewswire/">NetNewsWire</a>).              In addition to content syndication, Atom also provides a programming interface for             modifying posts made in a blog using other tools.</dd>
<dt>Calendar Navigation</dt>
<dd>Many blog tools offer the option of including a calendar on your blog, so that people can             navigate your posts by jumping straight to a particular date and seeing all posts on that day/month/year.</dd>
<dt>Permalinks</dt>
<dd>Upholding the spirit of a &#8216;permanent location&#8217; for everything on the Internet, so-called             permalinks are automatically-created URLs which are intended to be the permanent location             of a post, even after it &#8216;scrolls off&#8217; the homepage of a blog (since only a certain number             of posts will be displayed on the homepage normally).</dd>
<dt>Blog-roll</dt>
<dd>Since bloggers are such a friendly bunch, they often maintain a list of the blogs which they             read regularly. This list is normally presented along the side of their own blog, so that you             might also find other sites which interest you. This list is called a blog-roll (see <a title="Visit blogrolling.com, the home of blog-rolling!" href="http://www.blogrolling.com/">blogrolling.com</a> for more about blog-rolls).</dd>
</dl>
<p>Hopefully this has provided you with a bit of an introduction to blogging and blogs, and          you can see that they are a great way to get information online quickly. Their personal and          business uses are only going to grow, and it will be interesting to see where they go in the future.          Sites like <a title="Visit Technorati.com" href="http://www.technorati.com/">Technorati</a> and <a title="MIT's creation, blogdex, provides an index of blogs and their updates" href="http://blogdex.media.mit.edu/">BlogDex</a> are probably good places to keep an eye on if you&#8217;re interested in the future of blogging.</p>
<p>So now, if all you want is to see a blog in action &#8211; jump over to the <a href="/">blog</a> section of this site         and knock yourself out!</p>
]]></content:encoded>
			<wfw:commentRss>http://dentedreality.com.au/2003/06/blogs-what-are-they-good-for/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
	</item>
	</channel>
</rss>

