<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1456030802763040550</id><updated>2024-10-05T12:43:17.724+10:00</updated><category term="Code"/><category term="Life"/><category term="twitter"/><category term="programming"/><category term="anthrophony"/><category term="appfog"/><category term="biophony"/><category term="cargo cults"/><category term="chris anderson"/><category term="coding"/><category term="confluence"/><category term="data"/><category term="delicious"/><category term="deployment"/><category term="digg"/><category term="dropbox"/><category term="facebook"/><category term="git"/><category term="grails"/><category term="heroku"/><category term="ifttt"/><category term="information"/><category term="interesting2008"/><category term="internet"/><category term="java"/><category term="oauth"/><category term="php"/><category term="services"/><category term="skitch"/><category term="social media"/><category term="social network"/><category term="wired"/><title type='text'>every108minutes</title><subtitle type='html'>Piecing together the digital unknown unknowns</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.every108minutes.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1456030802763040550/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://www.every108minutes.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Keith</name><uri>http://www.blogger.com/profile/03839585259712953186</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYDdtVZKP8wmnipabYeX4tUn2_aL6Bk-MAFVVL6vDCEpZjLkmj_sigWmx2UyLMAToseIEYrK36T0kRWVRTO6A11dTws8u3u9HkhalDuWZ9-2kcqfQ9zkFANRYbueW-4nM/s220/face.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>8</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1456030802763040550.post-3439807526205862057</id><published>2013-06-25T15:59:00.002+10:00</published><updated>2015-02-25T13:50:31.798+11:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="appfog"/><category scheme="http://www.blogger.com/atom/ns#" term="Code"/><category scheme="http://www.blogger.com/atom/ns#" term="facebook"/><category scheme="http://www.blogger.com/atom/ns#" term="grails"/><category scheme="http://www.blogger.com/atom/ns#" term="heroku"/><category scheme="http://www.blogger.com/atom/ns#" term="oauth"/><category scheme="http://www.blogger.com/atom/ns#" term="programming"/><category scheme="http://www.blogger.com/atom/ns#" term="twitter"/><title type='text'>Local Testing OAuth Social Signin</title><content type='html'>On some recent Grails projects, I have been looking at using the Twitter and Facebook OAuth signin process.&lt;br /&gt;
&lt;br /&gt;
This process allows you to authenticate users based on their Twitter/Facebook logins, without the need for the user to expose their passwords to your site.&lt;br /&gt;
&lt;br /&gt;
When you create your &#39;application&#39; within Twitter or Facebook, it is necessary to define the URL where the application can be accessed. Twitter and Facebook will only redirect to this URL during the authentication process.&lt;br /&gt;
&lt;br /&gt;
I have tested running some applications on &lt;a href=&quot;https://www.heroku.com/&quot; target=&quot;_blank&quot;&gt;Heroku &lt;/a&gt;or &lt;a href=&quot;https://www.appfog.com/&quot; target=&quot;_blank&quot;&gt;Appfog&lt;/a&gt;, with Twitter and Facebook happy to redirect to the appropriate URLs with successful authentication.&lt;br /&gt;
&lt;br /&gt;
However, when testing locally, I follow these steps to work through the authentication process.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;1. App Context&lt;/b&gt;&lt;br /&gt;
Ensure that the Grails app context is &#39;/&#39; - as the application is generally deployed this way on Heroku/Appfog:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;&lt;i&gt;Config.groovy&lt;/i&gt;

grails.app.context = &#39;/&#39;

&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;2. Port Binding:&lt;/b&gt;&lt;br /&gt;
While the local application will generally run on port 8080, we want it accessible&amp;nbsp;via port 80 - as it is run on Heroku and Appfog. One method of achieving this locally is to bind the ports as follows&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;sudo ssh -L 80:localhost:8080 root@localhost
&lt;/pre&gt;
&lt;br /&gt;
&lt;i&gt;Note: if you are working on a Mac - ensure that Remote Login is enabled also.&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
If you application is running via HTTPS (port 8443), the following port forward command is required:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;sudo ssh -L 443:localhost:8443 root@localhost&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;3. Hosts&lt;/b&gt;&lt;br /&gt;
Edit the &lt;i&gt;/etc/hosts&lt;/i&gt; file in order to redirect calls to your Heroku/Appfog application URL to your localhost:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;&lt;i&gt;/etc/hosts&lt;/i&gt;

127.0.0.1 murmuring-gorge-6675.herokuapp.com

&lt;/pre&gt;
&lt;div&gt;
&lt;b&gt;4. Test the Process&lt;/b&gt;&lt;/div&gt;
Now, running the application on your local machine, it should be possible to follow the Twitter/Facebook OAuth process, with all interaction taking place with your local server.&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.every108minutes.com/feeds/3439807526205862057/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.every108minutes.com/2013/06/local-testing-social-signin.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1456030802763040550/posts/default/3439807526205862057'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1456030802763040550/posts/default/3439807526205862057'/><link rel='alternate' type='text/html' href='http://www.every108minutes.com/2013/06/local-testing-social-signin.html' title='Local Testing OAuth Social Signin'/><author><name>Keith</name><uri>http://www.blogger.com/profile/03839585259712953186</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYDdtVZKP8wmnipabYeX4tUn2_aL6Bk-MAFVVL6vDCEpZjLkmj_sigWmx2UyLMAToseIEYrK36T0kRWVRTO6A11dTws8u3u9HkhalDuWZ9-2kcqfQ9zkFANRYbueW-4nM/s220/face.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1456030802763040550.post-3972801912525800430</id><published>2013-05-09T09:03:00.001+10:00</published><updated>2014-05-21T15:28:01.504+10:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Code"/><category scheme="http://www.blogger.com/atom/ns#" term="deployment"/><category scheme="http://www.blogger.com/atom/ns#" term="git"/><category scheme="http://www.blogger.com/atom/ns#" term="php"/><title type='text'>Deploying With Git</title><content type='html'>I have the &lt;strike&gt;mis&lt;/strike&gt;fortune to work on a number of PHP based web applications at work. Previously, the deployment process involved determining which files had changed since the last release and copying them across to the server. Needless to say, this was an error-prone and inefficient way of deploying updates.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
Gitobots, Roll Out&lt;/h3&gt;
&lt;div&gt;
We use Git for our version control and, with &lt;a href=&quot;http://toroid.org/ams/git-website-howto&quot; target=&quot;_blank&quot;&gt;Heroku&#39;s push to deploy&lt;/a&gt;&amp;nbsp;in mind, I looked further into the possibilities of using Git for our deployment process. &lt;a href=&quot;http://toroid.org/ams/git-website-howto&quot; target=&quot;_blank&quot;&gt;Abhijit Menon-Sen&#39;s&lt;/a&gt; article details the process very well. With a few slight variations, these are the steps I follow to deploy changes via Git.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h3&gt;
Prime Remote&lt;/h3&gt;
On the remote server for your application (e.g. production, staging or test), create a new, bare Git repository for your codebase:&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;cd /cygdrive/c/repo
mkdir project.git
cd project.git
git --bare init
&lt;/pre&gt;
&lt;h3&gt;
Hooks&lt;/h3&gt;
&lt;div&gt;
As this bare repository does not contain a working tree (the&amp;nbsp;actual&amp;nbsp;source), a &lt;a href=&quot;http://git-scm.com/book/en/Customizing-Git-Git-Hooks&quot; target=&quot;_blank&quot;&gt;Git hook&lt;/a&gt; is used to checkout the code to a specific location. Git hooks allow custom scripts to be executed when certain important actions occur.&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Create the directory from which your application is accessed/executed - e.g. /cygdrive/c/webroot/project&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Create the file &lt;i&gt;post-receive&lt;/i&gt; in the &lt;i&gt;project.git/hooks&lt;/i&gt; directory.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Edit the file to include the following:
&lt;pre class=&quot;prettyprint&quot;&gt;#!/bin/sh
GIT_WORK_TREE=/cygdrive/c/webroot/project git checkout -f staging
rm -rf /cygdrive/c/webroot/project/twig_cache/*
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Set the file to be executable - e.g.:
&lt;pre class=&quot;prettyprint&quot;&gt;chmod +x post-receive
&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
The main point of this hook is in the configuration of a working directory and the checkout of a specific branch (&lt;i&gt;staging&lt;/i&gt; in this case) to this location. I also utilise the hook to clear out a cache directory for a templating engine (&lt;a href=&quot;http://twig.sensiolabs.org/&quot; target=&quot;_blank&quot;&gt;Twig&lt;/a&gt;) used in the application.&lt;/div&gt;
&lt;br /&gt;
&lt;h3&gt;
Push It&amp;nbsp;&lt;/h3&gt;
Within your local development repository, add the bare repository as a remote:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;prettyprint lang-bash&quot;&gt;git remote add staging-web ssh://keibro@127.0.0.1/cygdrive/c/repo/project.git
&lt;/pre&gt;
&lt;br /&gt;
Once you have committed your local changes and are ready to deploy to your server, the server code base can be updated by pushing to the remote repository:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;prettyprint&quot;&gt;git push staging-web staging
&lt;/pre&gt;
&lt;br /&gt;
The remote repository should update and also note that it is already on that particular branch. The updated files should now be present in the working directory.&lt;br /&gt;
&lt;br /&gt;
Note: it may be necessary to manually execute the &lt;i&gt;post-receive&lt;/i&gt; hook for the first push.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
Branching Environment&lt;/h3&gt;
The above process can be replicated for various environments so that changes can be pushed to these environments as needed (e.g. test, staging, production). Following a similar model as described by &lt;a href=&quot;http://nvie.com/posts/a-successful-git-branching-model/&quot; target=&quot;_blank&quot;&gt;Vincent Driessen&lt;/a&gt;, I&amp;nbsp;utilise different branches for each environment (e.g. the &lt;i&gt;staging&lt;/i&gt; branch is pushed to the remote repo &lt;i&gt;staging-web&lt;/i&gt;, the &lt;i&gt;master&amp;nbsp;&lt;/i&gt;branch is pushed to the remote repo &lt;i&gt;production-web&lt;/i&gt;). However, this generally implies that each environment will require unique configuration settings.&lt;br /&gt;
&lt;br /&gt;
In order to address this issue, I created a new &lt;i&gt;local&amp;nbsp;&lt;/i&gt;configuration file to supplement a more generic configuration file.&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;i&gt;config.local.php&lt;/i&gt; contains configuration settings that are unique to that environment - e.g. database connection details, email settings, etc. &lt;b&gt;Note&lt;/b&gt;: This file is not under Git control, as you do not want to commit any changes from this file across all your environments. Changes need to be made to each environment individually - these changes are normally relatively infrequent.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;config.php&lt;/i&gt;&amp;nbsp;contains generic environment settings that apply across all environments - e.g. global constants, LDAP server connection details,&amp;nbsp;etc. This file is under Git control.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
It is necessary to ensure that all environment specific variables are extracted into appropriate configuration files (e.g. REST access points for your Backbone frontend, database connection, etc.)&lt;br /&gt;
&lt;br /&gt;
While not optimal, this solution addressed the problem at hand.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
Restricted Access&lt;/h3&gt;
As all files under Git control are now pushed to the server, you may wantto ensure that some files are not accessible when accessed via the web browser. In this case, I created a new directory &lt;i&gt;restricted&lt;/i&gt;&amp;nbsp;within the project and included a &lt;i&gt;.htaccess &lt;/i&gt;file to prevent access to the files contained therein.</content><link rel='replies' type='application/atom+xml' href='http://www.every108minutes.com/feeds/3972801912525800430/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.every108minutes.com/2013/05/git-to-deploy.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1456030802763040550/posts/default/3972801912525800430'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1456030802763040550/posts/default/3972801912525800430'/><link rel='alternate' type='text/html' href='http://www.every108minutes.com/2013/05/git-to-deploy.html' title='Deploying With Git'/><author><name>Keith</name><uri>http://www.blogger.com/profile/03839585259712953186</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYDdtVZKP8wmnipabYeX4tUn2_aL6Bk-MAFVVL6vDCEpZjLkmj_sigWmx2UyLMAToseIEYrK36T0kRWVRTO6A11dTws8u3u9HkhalDuWZ9-2kcqfQ9zkFANRYbueW-4nM/s220/face.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1456030802763040550.post-3028481661612916781</id><published>2011-08-01T23:53:00.000+10:00</published><updated>2013-05-09T11:48:59.923+10:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Code"/><category scheme="http://www.blogger.com/atom/ns#" term="ifttt"/><category scheme="http://www.blogger.com/atom/ns#" term="internet"/><category scheme="http://www.blogger.com/atom/ns#" term="Life"/><category scheme="http://www.blogger.com/atom/ns#" term="services"/><title type='text'>If This, Then What?</title><content type='html'>Imagine that you could combine services (internet and otherwise) together like Lego blocks to create new, personalised services.&lt;br /&gt;
&lt;br /&gt;
&lt;em&gt;If This, Then That (&lt;a href=&quot;http://ifttt.com/&quot; title=&quot;If This Then That&quot;&gt;ifttt&lt;/a&gt;)&lt;/em&gt;&amp;nbsp;is a new service that allows you to do just that.&lt;br /&gt;
&lt;br /&gt;
Through an intuitive interface&amp;nbsp;&lt;em&gt;ifttt&lt;/em&gt;&amp;nbsp;puts the power of &quot;&lt;a href=&quot;http://en.wikipedia.org/wiki/Event-driven_programming&quot;&gt;Event Driven Programming&lt;/a&gt;&quot; at your fingertips, letting you connect services with &lt;a href=&quot;http://blog.ifttt.com/post/2316021241/ifttt-the-beginning&quot;&gt;digital duct tape&lt;/a&gt;. Event driven programming can be simply broken into two stages - event selection/detection followed by event handling.&amp;nbsp;&lt;em&gt;ifttt&lt;/em&gt;&amp;nbsp;terms these stages as &lt;em&gt;triggers&lt;/em&gt; and &lt;em&gt;tasks&lt;/em&gt; and provides a comprehensive list of services that you can target as a trigger or task, from Facebook and Twitter through to Google calendar events.&lt;br /&gt;
&lt;br /&gt;
For example, it is&amp;nbsp;possible&amp;nbsp;to build a service that will send a text to your mobile phone (task) if the weather service has forecast rain for the following day (trigger). The mechanism for building such a service is so simple and straight-forward that no programming knowledge is required. Trigger and task&amp;nbsp;construction&amp;nbsp;follows a simple&amp;nbsp;workflow of clicks.&amp;nbsp;In some cases, it is necessary to provide some extra details in order to fine tune the trigger/task or to authorise &lt;em&gt;ifttt&lt;/em&gt;&amp;nbsp;to access your online account.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAr8aN0JisouZTUl8r2bWrDrpdL3DYVtrdjkJ3US8V9ozzTQjxTfaW1gCwqr2oWEIDmU3hVJBAieRfOYRY1SWI_JWNDZQ-SwOpyQvTBKTqEupE_hN8FaiHotcwvrMsefbiuCv2HqEliYuh/s1600/iftt.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;146&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAr8aN0JisouZTUl8r2bWrDrpdL3DYVtrdjkJ3US8V9ozzTQjxTfaW1gCwqr2oWEIDmU3hVJBAieRfOYRY1SWI_JWNDZQ-SwOpyQvTBKTqEupE_hN8FaiHotcwvrMsefbiuCv2HqEliYuh/s320/iftt.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;br /&gt;
This is a really awesome idea that has been well executed and realised. The simplicity of how these new services can be glued together and the countless possible outcomes from the trigger/task combinations opens the power of the web to everyone.&lt;br /&gt;
&lt;blockquote&gt;
I realize that ifttt only addresses a small subset of the ways in which you can be creative with digital information, but within that subset there are tons of opportunities to hook together existing services, devices and objects. For instance, you can use Google reader starred items to share images on your Tumblr blog, or customize how and which photos from your Flickr stream show up on your Facebook wall.&lt;br /&gt;
&lt;br /&gt;
Linden Tibbets, &lt;em&gt;ifttt&lt;/em&gt;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh88Mc5uGGnlF7qYH8lv0MId07q_kr4aI416b1ZI7lIocwhpOk8vWdNHHKA6HXJdRxh5RLjUb5Ks2X3lrKliUYhEisVddWlxr9F5-MbM0E7mfBVkLosTCasteTXtkDN3uhTg24rclKLXaa8/s1600/tasks.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;173&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh88Mc5uGGnlF7qYH8lv0MId07q_kr4aI416b1ZI7lIocwhpOk8vWdNHHKA6HXJdRxh5RLjUb5Ks2X3lrKliUYhEisVddWlxr9F5-MbM0E7mfBVkLosTCasteTXtkDN3uhTg24rclKLXaa8/s320/tasks.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://www.every108minutes.com/feeds/3028481661612916781/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.every108minutes.com/2011/08/if-this-then-what.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1456030802763040550/posts/default/3028481661612916781'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1456030802763040550/posts/default/3028481661612916781'/><link rel='alternate' type='text/html' href='http://www.every108minutes.com/2011/08/if-this-then-what.html' title='If This, Then What?'/><author><name>Keith</name><uri>http://www.blogger.com/profile/03839585259712953186</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYDdtVZKP8wmnipabYeX4tUn2_aL6Bk-MAFVVL6vDCEpZjLkmj_sigWmx2UyLMAToseIEYrK36T0kRWVRTO6A11dTws8u3u9HkhalDuWZ9-2kcqfQ9zkFANRYbueW-4nM/s220/face.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAr8aN0JisouZTUl8r2bWrDrpdL3DYVtrdjkJ3US8V9ozzTQjxTfaW1gCwqr2oWEIDmU3hVJBAieRfOYRY1SWI_JWNDZQ-SwOpyQvTBKTqEupE_hN8FaiHotcwvrMsefbiuCv2HqEliYuh/s72-c/iftt.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1456030802763040550.post-7286928740601687437</id><published>2009-09-04T03:06:00.000+10:00</published><updated>2012-01-08T16:32:07.320+11:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Life"/><title type='text'>Farewell to a Friend</title><content type='html'>Earlier this week, Jeffrey Walker &lt;a href=&quot;http://radiowalker.wordpress.com/2009/09/02/goodbye-jeffrey/&quot;&gt;passed away&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;I had the pleasure of meeting and working with Jeffrey when he assumed the role of President of &lt;a href=&quot;http://www.atlassian.com/&quot;&gt;Atlassian&lt;/a&gt; in July 2005. In the last few years, Jeffrey inspired us all by publicly &lt;a href=&quot;http://radiowalker.wordpress.com/2007/08/27/cancer-20-the-killer-app/&quot;&gt;announcing his war&lt;/a&gt; on cancer, but Jeffrey was so much more than this battle.&lt;br/&gt;&lt;br/&gt;He had a passion and zest for life and business that was plainly evident when he walked into a room. He really did have a knowing smile, accompanied by that glint in his eyes - and you knew he was seeing something that you were missing. He was dubbed as the ‘Lance Armstrong of Silicon Valley’ at one point.&lt;br/&gt;&lt;br/&gt;I am proud to have known this gentleman and my sympathies go out to the Walker family and the Atlassian staff.&lt;br/&gt;&lt;br/&gt;Grey Goose Gibsons, straight up with a twist, all round while we &lt;a href=&quot;http://www.youtube.com/watch?v=Up-tzmMdfMI&quot;&gt;remember Jeffrey like we should&lt;/a&gt;.</content><link rel='replies' type='application/atom+xml' href='http://www.every108minutes.com/feeds/7286928740601687437/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.every108minutes.com/2009/09/farewell-to-friend.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1456030802763040550/posts/default/7286928740601687437'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1456030802763040550/posts/default/7286928740601687437'/><link rel='alternate' type='text/html' href='http://www.every108minutes.com/2009/09/farewell-to-friend.html' title='Farewell to a Friend'/><author><name>Keith</name><uri>http://www.blogger.com/profile/03839585259712953186</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYDdtVZKP8wmnipabYeX4tUn2_aL6Bk-MAFVVL6vDCEpZjLkmj_sigWmx2UyLMAToseIEYrK36T0kRWVRTO6A11dTws8u3u9HkhalDuWZ9-2kcqfQ9zkFANRYbueW-4nM/s220/face.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1456030802763040550.post-9143846648872632631</id><published>2008-08-05T23:04:00.000+10:00</published><updated>2012-01-08T16:32:07.204+11:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="anthrophony"/><category scheme="http://www.blogger.com/atom/ns#" term="biophony"/><category scheme="http://www.blogger.com/atom/ns#" term="chris anderson"/><category scheme="http://www.blogger.com/atom/ns#" term="Code"/><category scheme="http://www.blogger.com/atom/ns#" term="data"/><category scheme="http://www.blogger.com/atom/ns#" term="delicious"/><category scheme="http://www.blogger.com/atom/ns#" term="digg"/><category scheme="http://www.blogger.com/atom/ns#" term="dropbox"/><category scheme="http://www.blogger.com/atom/ns#" term="information"/><category scheme="http://www.blogger.com/atom/ns#" term="Life"/><category scheme="http://www.blogger.com/atom/ns#" term="skitch"/><category scheme="http://www.blogger.com/atom/ns#" term="social media"/><category scheme="http://www.blogger.com/atom/ns#" term="twitter"/><category scheme="http://www.blogger.com/atom/ns#" term="wired"/><title type='text'>Brain Error: No space left on device</title><content type='html'>&lt;blockquote&gt;I&#39;m not dumb. I just have a command of thoroughly useless information.&lt;br/&gt;Calvin - It&#39;s a Magical World, &lt;a href=&quot;http://en.wikipedia.org/wiki/Bill_Watterson&quot;&gt;Bill Waterson&lt;/a&gt;&lt;/blockquote&gt;&lt;br/&gt;&lt;a href=&quot;http://www.wired.com/&quot;&gt;Wired&#39;s&lt;/a&gt; June 2008 edition included an article entitled &#39;&lt;a href=&quot;http://www.wired.com/science/planetearth/magazine/16-06/st_thompson&quot;&gt;Quiet Please&lt;/a&gt;: how Man-made noises may be altering Earth&#39;s ecology&#39;.&lt;br/&gt;&lt;br/&gt;The article focused on the theory put forward by &lt;a href=&quot;http://en.wikipedia.org/wiki/Bernie_Krause&quot;&gt;Bernie Krause&lt;/a&gt;, a field recording scientist, that nature&#39;s soundtrack (biophony) is being adversely affected by a louder human-made cacophony (anthrophony). Krause postulates that the animal kingdom divides the acoustic spectrum so it&#39;s inhabitants do not interfere with each other. However, human-made noise is increasingly disrupting this harmony and intrudes on a piece of the spectrum already in use - drowning out natures voice.&lt;br/&gt;&lt;br/&gt;As an example, Krause summizes that the rapidly declining population of the Yosemite spadefoot toad is due to the noise generated from low-flying military aircraft, performing training exercises in the area. Coyotes and owls are able to home in on individual frogs as they have lost the veil of protection provided by the synchronicity of their calls.&lt;br/&gt;&lt;blockquote&gt;The information flow in the jungle is compromised&lt;/blockquote&gt;&lt;br/&gt;&lt;h3&gt;Mediaophony&lt;/h3&gt;&lt;br/&gt;Something similar is happening with the explosive adoption of &lt;a href=&quot;http://www.slideshare.net/mzkagan/what-the-fk-social-media/&quot;&gt;social media&lt;/a&gt; tools and the information they generate.&lt;br/&gt;&lt;br/&gt;These social media tools now afford the ability to create informational flows of near unbounded proportions from as many sources. So much information threatens to drown out real information of value.&lt;br/&gt;&lt;br/&gt;In his book &quot;&lt;a href=&quot;http://www.amazon.co.uk/Here-Comes-Everybody-Organizing-Organizations/dp/0713999896&quot;&gt;Here Comes Everybody&lt;/a&gt;&quot;, &lt;a href=&quot;http://www.shirky.com/&quot;&gt;Clay Shirky&lt;/a&gt; notes that the old process of &#39;&lt;em&gt;filter-then-publish&lt;/em&gt;&#39; has been inverted to &#39;&lt;em&gt;publish-then-filter&lt;/em&gt;&#39; through the adoption of new digital broadcast media by the masses. The inherent simplification and reduction in cost of the publishing process through social media tools has enabled a multitude of &#39;amatuer&#39; publishers to transmit their work online. The traditional system of publishing only select items has been replaced - a momentous move from where the few decided upon the information that the many should consume. However, with this new freedom, the task of information filtration is now transferred to the consumer.&lt;br/&gt;&lt;br/&gt;With this glut of information and the potential for overload, the ability to sift and sort the &#39;signal&#39; from the &#39;noise&#39; is key.&lt;br/&gt;&lt;h3&gt;Follow the leader&lt;/h3&gt;&lt;br/&gt;One potential mechanism to address the information overload is to track the digital trail of your peer group. Most social media tools are founded on the very principle of sharing and enable users to see what is of interest to their tribe. A type of group filtering system evolves. The links formed in these social networks imply that information of interest to one of your connections, most probably will also be of interest to you.&lt;br/&gt;&lt;br/&gt;&lt;a href=&quot;http://digg.com/about&quot;&gt;Digg&lt;/a&gt; is an example of such group filtration in action - content of interest to the general group bubbles to the top. The site further supplements the origial content by facilitating a discussion around it. &lt;a href=&quot;http://delicious.com/&quot;&gt;Delicious&lt;/a&gt; allows users to share content they have bookmarked on the web.&lt;br/&gt;&lt;h3&gt;Let the Data Talk&lt;/h3&gt;&lt;br/&gt;In another Wired article, &lt;a href=&quot;http://en.wikipedia.org/wiki/Chris_Anderson_(The_Long_Tail)&quot;&gt;Chris Anderson&lt;/a&gt; talks about &lt;a href=&quot;http://www.wired.com/science/discoveries/magazine/16-07/pb_theory&quot;&gt;the Petabyte Age&lt;/a&gt;. He notes how large bodies of data can be mined with analytical tools and contextualised. It is&lt;br/&gt;&lt;blockquote&gt;a world where massive amounts of data and applied mathematics replace every other tool that might be brought to bear.&lt;/blockquote&gt;&lt;br/&gt;Using Google as an example, he notes how this analysis is used in advertising and translation to generate better results - without applying subject knowledege. Further, Google&#39;s search results provide a level of filtration through the application of the &lt;a href=&quot;http://en.wikipedia.org/wiki/PageRank&quot;&gt;PageRank&lt;/a&gt; algorithm.&lt;br/&gt;&lt;br/&gt;As the data cloud and understanding of these concepts grow, these type of tools will help filter informational value and provide relevant data customised for each user.&lt;br/&gt;&lt;h3&gt;Appophony&lt;/h3&gt;&lt;br/&gt;The ill-effects of information overload can also be experienced in software applications and websites. All too often, applications are encumbered with feature bloat - overwhelming the end user with too may options and features.&lt;br/&gt;&lt;br/&gt;&lt;a href=&quot;http://www.37signals.com/svn/posts/934-ira-glass-entropy-and-software-development&quot;&gt;Matt Linderman&lt;/a&gt; suggests that we should be:&lt;br/&gt;&lt;blockquote&gt;the sniper who must pick off every distraction, unneeded feature, and extra word that doesn’t absolutely have to be there.&lt;/blockquote&gt;&lt;br/&gt;Some of the latest application success stories include tools that focus primarily on one core task. &lt;a href=&quot;http://www.getdropbox.com/&quot;&gt;Dropbox&lt;/a&gt; provides a seamless experience in sharing, syncing and sharing data. &lt;a href=&quot;http://skitch.com/&quot;&gt;Skitch&lt;/a&gt; makes taking screenshots a pleasure. &lt;a href=&quot;http://twitter.com/home&quot;&gt;Twitter&lt;/a&gt;, the de-facto micro-blogging tool, concentrates on the fundamental process of posting 140 character status updates. In each case, the principal functionality is the focus  - provided with simple, yet intuitive design.&lt;br/&gt;&lt;h3&gt;Staying Afloat&lt;/h3&gt;&lt;br/&gt;The flow of information is only set to increase; as will the need for the skill to sift through this flow. In part, social networks will provide frameworks for data filtration, while new tools will emerge to further help extract the information of value.</content><link rel='replies' type='application/atom+xml' href='http://www.every108minutes.com/feeds/9143846648872632631/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.every108minutes.com/2008/08/brain-error-no-space-left-on-device.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1456030802763040550/posts/default/9143846648872632631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1456030802763040550/posts/default/9143846648872632631'/><link rel='alternate' type='text/html' href='http://www.every108minutes.com/2008/08/brain-error-no-space-left-on-device.html' title='Brain Error: No space left on device'/><author><name>Keith</name><uri>http://www.blogger.com/profile/03839585259712953186</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYDdtVZKP8wmnipabYeX4tUn2_aL6Bk-MAFVVL6vDCEpZjLkmj_sigWmx2UyLMAToseIEYrK36T0kRWVRTO6A11dTws8u3u9HkhalDuWZ9-2kcqfQ9zkFANRYbueW-4nM/s220/face.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1456030802763040550.post-8960154232902271528</id><published>2008-06-24T18:26:00.000+10:00</published><updated>2012-01-08T16:32:06.922+11:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="cargo cults"/><category scheme="http://www.blogger.com/atom/ns#" term="Code"/><category scheme="http://www.blogger.com/atom/ns#" term="coding"/><category scheme="http://www.blogger.com/atom/ns#" term="Life"/><category scheme="http://www.blogger.com/atom/ns#" term="programming"/><category scheme="http://www.blogger.com/atom/ns#" term="social network"/><title type='text'>Coding Cults &amp;amp; Internet Gods</title><content type='html'>&lt;blockquote&gt;Any sufficiently advanced technology is indistinguishable from magic.&lt;br/&gt;Arthur C. Clarke&lt;/blockquote&gt;&lt;br/&gt;Its been &lt;a href=&quot;http://fishbowl.pastiche.org/2004/10/13/cargo_cult_programming&quot;&gt;talked about before&lt;/a&gt;, but while reading the &#39;&lt;a href=&quot;http://www.waterstones.com/waterstonesweb/displayProductDetails.do?sku=5687077&quot;&gt;The God Delusion&lt;/a&gt;&#39; by &lt;a href=&quot;http://richarddawkins.net/&quot;&gt;Richard Dawkins&lt;/a&gt; (and &lt;a href=&quot;http://richarddawkins.net/forum/viewtopic.php?f=14&amp;amp;p=1006355#p1006345&quot;&gt;no he doesn&#39;t Twitter&lt;/a&gt;!), the meme of the &lt;a href=&quot;http://en.wikipedia.org/wiki/Cargo_cult&quot;&gt;Cargo Cult&lt;/a&gt; once again caught my attention.&lt;br/&gt;&lt;h3&gt;Cargo Cult: Waiting for Frum&lt;/h3&gt;&lt;br/&gt;Anthropologists have observed the phenomenon of island inhabitants (most famously of Pacific Melanesia and New Guinea) mimicking and performing rituals of visiting advanced cultures in the belief that these acts will provide them with material goods and wealth. This phenomenon is known as a &lt;em&gt;Cargo Cult&lt;/em&gt;.&lt;br/&gt;&lt;br/&gt;The islanders observed that the visiting people enjoyed great luxuries, with seemingly little or no useful work required in return - they sat behind desks while new or repaired items appeared on the island as if by magic.&lt;br/&gt;&lt;br/&gt;In one instance, on the island of Tanna in the New Hebrides (now known as Vanuata), the islanders awaited the return the messianic &lt;a href=&quot;http://en.wikipedia.org/wiki/John_Frum&quot;&gt;Mr John Frum&lt;/a&gt; who would bear bountiful cargo. Supposedly arriving by plane from America, the islanders cleared an airstrip and installed a bamboo control tower, replete with wooden headphones. They still await his return.&lt;br/&gt;&lt;br/&gt;In our technologically advanced, self-actualising, networked society, cargo cults are still in full effect.&lt;br/&gt;&lt;h3&gt;The Cult of the Internet Gods&lt;/h3&gt;&lt;br/&gt;With new social networking tools emerging on the net every day, users scrabble to adopt these applications in the hope of increasing their social network status. A case in point: &lt;a href=&quot;http://twitter.com&quot;&gt;Twitter&lt;/a&gt;. A few in the industry have risen to deified status, having built large networked tribes with thousands of followers. &#39;Lesser mortals&#39; reply or re-tweet these Twitter superstars in the hope of building their visibility and profile.&lt;br/&gt;&lt;br/&gt;The cult of the social media tool is further expounded with the concept of the invite-only period. The exclusivity built around the new network heightens user desire to be included and follow in the keystrokes of the privileged early adopters. As these tools grow and permeate, the onus is on people to opt in to these new networks - or fear missing this new source of flow information.&lt;br/&gt;&lt;br/&gt;That being said, this phenomenon does propel the ideas and tools in that space forward, helping refine processes and opening the network for use in unexpected and innovative ways. The mass take-up of the network helps progress the tool and inevitably leads to a disruptive leap to the next social network tool.&lt;br/&gt;&lt;br/&gt;Users also quickly determine if the tool is of real use in their daily workflows and can decide to opt out of that particular network stream.&lt;br/&gt;&lt;br/&gt;Cargo cults with less satisfactory results can also be found in coding practices.&lt;br/&gt;&lt;h3&gt;The Cult of Copy And Paste&lt;/h3&gt;&lt;br/&gt;At times, we need to replicate a piece of code from one code-base in another project/application. For the times when the functionality cannot be extracted out to a utility library, the temptation to simply copy the code can be strong. The application may even work as expected during testing and it appears that some time may have been saved. At some point, however, copy&#39;n&#39;paste karma may come calling  back with problems.&lt;br/&gt;&lt;br/&gt;Time should be taken to understand and verify what each line of the replicated code is doing. Is each line necessary? Is there a subtle change required to achieve the goals in the new code-base? Answering these questions can avoid problems and unexpected behaviour and gives the developer confidence in knowing the flow of the application.&lt;br/&gt;&lt;h3&gt;The Cult of Scripting&lt;/h3&gt;&lt;br/&gt;Build systems and deployment scripts can sometimes be arcane pieces of dark magic - &lt;a href=&quot;http://maven.apache.org/&quot;&gt;Maven&lt;/a&gt; still confounds me! Often written in languages that require real expertise to understand subtle nuances, developers can be left executing scripts which they know little about other than the final (hopefully successful!) result. This lack of understanding can lead to problems.&lt;br/&gt;&lt;br/&gt;On one banking application I worked on, a set of build scripts was employed to deploy an application into the target environment - configuring the database and the application server. The development team was given little information on the intention of the scripts, with only sample scripts from another project as a guide.&lt;br/&gt;&lt;br/&gt;New scripts were developed (copied!) and executed. However, soon after application initialisation, problems with database connections were reported and the application would need to be restarted. For each deployment, the release engineer was requested to run all the scripts. Upon further investigation into the nature of the scripts, it transpired that one of the scripts was only required to be executed once at the outset of the project, in order to configure the database and connections. Thereafter, only the application configuration scripts were required.&lt;br/&gt;&lt;br/&gt;Build and deployment scripts can be difficult and time-consuming to deconstruct. In this respect, breaking the task into discrete parts can help, by aiming to understand small sections of the script at a time. Learning to understand the intricacies of the process can lead to resolution of issues as described above, or improvements in the overall process workflow.&lt;br/&gt;&lt;br/&gt;So, is your code expecting the return of Mr Frum anytime soon?</content><link rel='replies' type='application/atom+xml' href='http://www.every108minutes.com/feeds/8960154232902271528/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.every108minutes.com/2008/06/coding-cults-internet-gods.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1456030802763040550/posts/default/8960154232902271528'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1456030802763040550/posts/default/8960154232902271528'/><link rel='alternate' type='text/html' href='http://www.every108minutes.com/2008/06/coding-cults-internet-gods.html' title='Coding Cults &amp;amp; Internet Gods'/><author><name>Keith</name><uri>http://www.blogger.com/profile/03839585259712953186</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYDdtVZKP8wmnipabYeX4tUn2_aL6Bk-MAFVVL6vDCEpZjLkmj_sigWmx2UyLMAToseIEYrK36T0kRWVRTO6A11dTws8u3u9HkhalDuWZ9-2kcqfQ9zkFANRYbueW-4nM/s220/face.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1456030802763040550.post-5861397501771695472</id><published>2008-06-24T04:23:00.000+10:00</published><updated>2012-01-09T22:24:05.912+11:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="interesting2008"/><category scheme="http://www.blogger.com/atom/ns#" term="Life"/><title type='text'>Explore. Dream. Discover. Be Interesting.</title><content type='html'>&lt;h3&gt;
Interesting 2008&lt;/h3&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHr_-yPH0hpV94LVu22TkG_tQJDjea_iJKmauxwxtlbAF5xyGt5OkgDi8kdPs94ck9pUo2aD4Cb8HAGnKV5Sh2yojFxqiiNiFns6tK4XZC6E0wx2CI5cd0UGzetjOB5cEzhe-vY1gThXVr/s1600/interesting2008.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;250&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHr_-yPH0hpV94LVu22TkG_tQJDjea_iJKmauxwxtlbAF5xyGt5OkgDi8kdPs94ck9pUo2aD4Cb8HAGnKV5Sh2yojFxqiiNiFns6tK4XZC6E0wx2CI5cd0UGzetjOB5cEzhe-vY1gThXVr/s320/interesting2008.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Bunting and all ...&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;
Twenty years from now you will be more disappointed by the things that you didn’t do than by the ones you did do. So throw off the bowlines. Sail away from the safe harbor. Catch the trade winds in your sails. Explore. Dream. Discover.&lt;br /&gt;
&lt;br /&gt;
Mark Twain&lt;/blockquote&gt;
&lt;br /&gt;
Over the weekend, my wife and I attended Interesting 2008. The concept of the event - to gather a number of speakers to talk about something they are interested in - was intriguing and all reports suggested it would be a Saturday well spent. Comparisons with the &lt;a href=&quot;http://www.ted.com/&quot;&gt;TED&lt;/a&gt; talks certainly helped to pique my interest and we were most definitely not disappointed.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://russelldavies.typepad.com/&quot;&gt;Russell Davies&lt;/a&gt;, the coordinator of the day, has this to say about being &#39;interesting&#39;:&lt;br /&gt;
&lt;blockquote&gt;
The way to be interesting is to be interested. You’ve got to find what’s interesting in everything, you’ve got to be good at noticing things, you’ve got to be good at listening. If you find people (and things) interesting, they’ll find you interesting.&lt;/blockquote&gt;
&lt;br /&gt;
Attended by designers, developers, social media consultants, teachers and more, the speakers came from a similar varied background of skills and interests. The day was extremely entertaining and enjoyable. I believe video casts of most of the talks will be available on the Guardian website soon.&lt;br /&gt;
&lt;br /&gt;
For me, some of the highlights of the day included:&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://geographyproducers.blogspot.com/&quot;&gt;Daniel Raven-Ellison&lt;/a&gt;, a teacher (with such energy and passion, he is the kind of teacher you wish you had had back in school!) spoke about &lt;strong&gt;Geography&lt;/strong&gt;. Daniel&amp;nbsp;looked at how we accept scrutiny under CCTV due to its&amp;nbsp;inconspicuous&amp;nbsp;nature, the diminishing level of designated play areas for children and the energy footprint of Salisbury. Seemingly, we need another 2.5 planets to keep going at the average rate of energy consumption of your typical Salisburian.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://www.johnsonbanks.co.uk/thoughtfortheweek/index.php&quot;&gt;Michael Johnson&lt;/a&gt; gave a lively talk on the pattern of convergence of good music and design over the last century, interspersed with guitar examples performed by Michael himself. Maybe you can tell a good album by the cover?&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://creativegeneralist.blogspot.com/&quot;&gt;Steve Hardy&lt;/a&gt; looked at what, specifically, generalists do. Steve spoke about the phenomenon of how niche interest has taken over. While being a good thing overall, Steve noted that we also needed to embrace broad thinking ideas; giving ideas space to run around and occasionally bump into strangers, connecting people in different areas of&amp;nbsp;specialism. This is a talk I would like to revisit.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://www.thepirategeek.com/&quot;&gt;Jenny Owen&lt;/a&gt; presented a 7:42 minute&amp;nbsp;synopsis&amp;nbsp;(a personal public speaking record!) on Winston Churchill and his qualities.&lt;br /&gt;
&lt;br /&gt;
Andrew Dick sought to enlighten the audience on how to combat chronic insomia. The answer, according to Andrew, lies in listening to badly written, and equally badly narrated, audio books. The plot excitement level should lie somewhere between extreme boredom (forcing you to think about all the world ills as reported on the BBC World Service) and high octane addiction (and thereby keeping you awake to hear what happens next). Andrew has found iTunes to be a great source of prime material - 50&#39;s BBC produced story lines.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://www.mattdent.com/&quot;&gt;Matt Dent&lt;/a&gt; introduced us to his winning design for the new UK coinage and some fascinating (he assured us!) facts on the minting process and their coin use.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://www.gyford.com/&quot;&gt;Phil Gyford&lt;/a&gt; spoke about the art of mask making and its use in theatre, harking back to &lt;a href=&quot;http://en.wikipedia.org/wiki/Commedia_dell%27arte&quot;&gt;La Commedia dell&#39;Arte&lt;/a&gt;. Phil showed the power of the medium with the application of a simple red nose and some quirky acting.&lt;br /&gt;
&lt;br /&gt;
Unfortunately, I have forgotten the name of the speaker (mixed up in the line of Matts and Andrews!) who presented a tale of Patagonian physics, conquistadors and ancient libraries. This is another talk I would like to review.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://www.maxgadney.com/&quot;&gt;Max Gadney&lt;/a&gt; discussed his passion behind World War II history and the need for accurate representations of this information. He presented some superb examples of how he has applied his form of data visualisation on the topic. A striking example took shape of graphically representing a soldier in a platoon, in a&amp;nbsp;battalion&amp;nbsp;and a division - finally displaying the number of dead per country involved. Stark data to behold but illuminating facts in an understandable manner.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://younghee.com/&quot;&gt;Younghee Jung&lt;/a&gt; ventured into the world of the toilet with images taken from around the world looking at the different cultural and social mores around this everyday activity (seemingly 6 times a day is the healthy recommended number of visits).&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://www.spaaace.com/cope/&quot;&gt;James Wallis&lt;/a&gt; led the audience on a geophysical survey of the &lt;a href=&quot;http://en.wikipedia.org/wiki/World_of_Warcraft&quot;&gt;World of Warcraft&lt;/a&gt; and the planet&amp;nbsp;&lt;a href=&quot;http://en.wikipedia.org/wiki/Azeroth_%28world%29#Geography&quot;&gt;Azeroth&lt;/a&gt;. Using novel methods of throwing characters off buildings and traversing straight line sections of the planet, James has determined such data as the force of gravity and the diameter of planet. Based on this data, it appears that Azeroth would be roughly the same size as another well know &lt;a href=&quot;http://en.wikipedia.org/wiki/Deathstar&quot;&gt;spherical object&lt;/a&gt;.&lt;br /&gt;
&lt;h4&gt;
Be Interested. Be Interesting.&lt;/h4&gt;
&lt;br /&gt;
This list is certainly not exhaustive and the speakers all presented very thought-provoking talks. I would urge you to review some of the talks once they come online (or indeed head over to &lt;a href=&quot;http://www.ted.com/&quot;&gt;TED&lt;/a&gt; for some further enlightenment). As Russell noted, it is wonderful to think that so many would turn out to hear &#39;interesting&#39; talks.&lt;br /&gt;
&lt;br /&gt;
The day struck a chord with me in that we should all be motivated to look at things anew and find what is interesting about it - no matter what that object, subject or experience be. The sense of enthusiasm generated by someone finding something interesting can, quite often, be contagious.&lt;br /&gt;
&lt;br /&gt;
&lt;em&gt;Explore. Dream. Discover. Be Interesting.&lt;/em&gt;&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.every108minutes.com/feeds/5861397501771695472/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.every108minutes.com/2008/06/explore-dream-discover-be-interesting.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1456030802763040550/posts/default/5861397501771695472'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1456030802763040550/posts/default/5861397501771695472'/><link rel='alternate' type='text/html' href='http://www.every108minutes.com/2008/06/explore-dream-discover-be-interesting.html' title='Explore. Dream. Discover. Be Interesting.'/><author><name>Keith</name><uri>http://www.blogger.com/profile/03839585259712953186</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYDdtVZKP8wmnipabYeX4tUn2_aL6Bk-MAFVVL6vDCEpZjLkmj_sigWmx2UyLMAToseIEYrK36T0kRWVRTO6A11dTws8u3u9HkhalDuWZ9-2kcqfQ9zkFANRYbueW-4nM/s220/face.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHr_-yPH0hpV94LVu22TkG_tQJDjea_iJKmauxwxtlbAF5xyGt5OkgDi8kdPs94ck9pUo2aD4Cb8HAGnKV5Sh2yojFxqiiNiFns6tK4XZC6E0wx2CI5cd0UGzetjOB5cEzhe-vY1gThXVr/s72-c/interesting2008.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1456030802763040550.post-6328321141070138166</id><published>2008-06-12T10:15:00.000+10:00</published><updated>2014-08-08T13:50:48.930+10:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Code"/><category scheme="http://www.blogger.com/atom/ns#" term="confluence"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="twitter"/><title type='text'>Let your Confluence Tweet!</title><content type='html'>&lt;blockquote&gt;
&lt;i&gt;The single biggest problem in communication is the illusion that it has taken place.&lt;/i&gt;&lt;br /&gt;
&lt;a href=&quot;http://en.wikipedia.org/wiki/George_Bernard_Shaw&quot;&gt;George Bernard Shaw&lt;/a&gt;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;br /&gt;
The recent &lt;a href=&quot;http://blogs.atlassian.com/developer/2008/03/announcing_codegeist_iii_be_th.html&quot; title=&quot;Atlassian Codegeist competition&quot;&gt;Atlassian Codegeist competition&lt;/a&gt; afforded me an opportune moment to further explore new areas of &lt;a href=&quot;http://www.atlassian.com/software/confluence/&quot;&gt;Confluence&lt;/a&gt; plugin development. My current contracting assignment involves heavily customising both the theme and functionality of the Confluence platform - but Codegeist offered a chance to really experiment!&lt;br /&gt;
&lt;br /&gt;
With the explosion of social networking applications and the rise of the &lt;a href=&quot;http://www.stoweboyd.com/message/2008/03/beyond-blogs-th.html&quot; title=&quot;flow&quot;&gt;flow&lt;/a&gt;, I decided to integrate the functionality of one of the most profilic flow tools in the netsphere, &lt;a href=&quot;http://twitter.com/&quot; title=&quot;Twitter&quot;&gt;Twitter&lt;/a&gt;, with Confluence.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Twitter + wiki = Twikkir&lt;/strong&gt;&lt;br /&gt;
Posing the simple question &#39;What are you doing now?&quot;, millions have taken to tweeting their response on Twitter to anybody who will listen. From a simple status update to a &lt;a href=&quot;http://www.codesqueeze.com/twitter-a-possible-support-circle/&quot;&gt;possible support circle&lt;/a&gt; to &lt;a href=&quot;http://www.randsinrepose.com/archives/2008/05/15/we_travel_in_tribes.html&quot;&gt;a tribe building ecosystem&lt;/a&gt;, Twitter has become another pillar of the fast-evolving web. In his blog, Rands notes:&lt;br /&gt;
&lt;blockquote&gt;
I want to see how they see the world. This is why I follow people on Twitter. This is why they follow me.&lt;/blockquote&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Enterprise Flow&lt;/strong&gt;&lt;br /&gt;
As I commented on the &lt;a href=&quot;http://workstreamr.com/blog/2008/05/12/twitter-for-wikis/&quot;&gt;Workstreamer blog&lt;/a&gt;, I think enterprise companies have witnessed social networks flourish outside of their control and domain. They are now looking to replicate these networks in their own space in order to captialise on the perceived benefits, create structure/control mechanisms and expose the data for processing. Granted, some of these integrations may be exploratory - but the enterprise is definitely looking to keep apace with these developments - and a Twitter-like tool is a main contender.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Twikkir&lt;/h2&gt;
&lt;br /&gt;
The actual &lt;a href=&quot;http://confluence.atlassian.com/display/CODEGEIST/Twikkir+-+Twitter+for+your+wiki!&quot;&gt;plugin&lt;/a&gt; development proffered some interesting issues to solve - persistence of posted messages, an update mechanism for diffusing new messages and the display of messages amongst others.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
Persistence&lt;/h3&gt;
&lt;br /&gt;
The issue of persisting user posts was one of the first obstacles to tackle. Confluence offers various &lt;a href=&quot;http://confluence.atlassian.com/display/DOC/Persistence+in+Confluence&quot;&gt;persistence mechanisms&lt;/a&gt; for storing data - in brief:&lt;br /&gt;
&lt;ul&gt;&lt;br /&gt;
&lt;li&gt;&lt;b&gt;Hibernate&lt;/b&gt; - Confluence uses the Hibernate framework to persist its objects. However, it is generally not recommended to modify the Hibernate files to incorporate persistence of custom objects.&lt;/li&gt;
&lt;br /&gt;
&lt;li&gt;&lt;b&gt;Content Properties&lt;/b&gt; - a mechanism to store a key value pair with an associated object (content, space, etc.) within Confluence&lt;/li&gt;
&lt;br /&gt;
&lt;li&gt;&lt;b&gt;Bandana&lt;/b&gt; - this Atlassian framework uses XStream to convert arbitrary Java objects into XML for storage.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
I selected the Bandana framework as the solution - allowing content-unrelated data (Twikkir posts and users) to be stored in the Confluence database. Extremely simple to use, Bandana allows the persistence and retrieval of objects through keys in a global or space related context. In order to avoid class loader issues, as noted by &lt;a href=&quot;http://confluence.atlassian.com/display/DOC/Persistence+in+Confluence?focusedCommentId=185062#comment-185062&quot;&gt;David Peterson&lt;/a&gt;, it is necessary for plugins to set the classloader reference in the XStream object correctly:&lt;br /&gt;
&lt;br /&gt;
[java]&lt;br /&gt;
// Create xstream reference&lt;br /&gt;
if(xstream == null)&lt;br /&gt;
{&lt;br /&gt;
xstream = new XStream(); &lt;br /&gt;
xstream.setClassLoader(getClass().getClassLoader());&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
// Persist data within the global Bandana context&lt;br /&gt;
String xml = getXStream().toXML(userSet);&lt;br /&gt;
bandanaManager.setValue(new ConfluenceBandanaContext(), Constants.BANDANA_CTX_KEY_TWIKKIR_USERS, xml);&lt;br /&gt;
...&lt;br /&gt;
// Retrieve&lt;br /&gt;
String xmlString = (String) bandanaManager.getValue(new ConfluenceBandanaContext(), Constants.BANDANA_CTX_KEY_TWIKKIR_USERS);&lt;br /&gt;
[/java]&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
AJAX&lt;/h3&gt;
&lt;br /&gt;
I was eager to add some AJAX functionality to this plugin and, in doing so, explore some of the JS libraries offering some &#39;Web 2.0&#39; goodness.  My goal was to enable the asynchronous ability to post and receive new twikkir posts and avoid a total page reload.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://jquery.com/&quot;&gt;jQuery&lt;/a&gt; is an extremely powerful library and affords the developer some neat tricks with minimal fuss. In order to enable the jQuery library for use within the plugin JavaScript files, I found it necessary to define an alternate name for the jQuery variable through the &lt;i&gt;noConflict()&lt;/i&gt; function in the main Velocity template.&lt;br /&gt;
[js]&lt;br /&gt;
var $jq = jQuery.noConflict();&lt;br /&gt;
$jq(&quot;document&quot;).ready(function(){ ...&lt;br /&gt;
[/js]&lt;br /&gt;
&lt;br /&gt;
All subsequent calls to jQuery were made through the variable &lt;i&gt;$jq&lt;/i&gt;. jQuery really impressed me - the animated tab panels were generated by one line of code! I look forward to exploring jQuery further.&lt;br /&gt;
&lt;br /&gt;
jQuery can also simplify the construction and management of AJAX calls, but as I was interested in understanding the inner details of the application flow, I coded these manually in JavaScript. All calls followed this format - with the response callback using an anonymous function:&lt;br /&gt;
&lt;br /&gt;
[js]&lt;br /&gt;
var request = createRequest();&lt;br /&gt;
var url = &quot;/plugin/twikkir/postit.action&quot;;&lt;br /&gt;
request.open(&quot;POST&quot;, url, true);&lt;br /&gt;
request.onreadystatechange = function()&lt;br /&gt;
{&lt;br /&gt;
if(request.readyState == 4)&lt;br /&gt;
{&lt;br /&gt;
resp = request.responseXML;&lt;br /&gt;
document.getElementById(&quot;poststatus&quot;).innerHTML = getTagContent(resp, &quot;poststatus&quot;);&lt;br /&gt;
postStatusImg.src = restImage.src;&lt;br /&gt;
document.getElementById(&quot;twikkirpost&quot;).value = null;&lt;br /&gt;
document.getElementById(&quot;charsleft&quot;).innerHTML = maxPostLen;&lt;br /&gt;
$jq(&quot;#poststatus&quot;).fadeIn(2000).fadeOut(3000);&lt;br /&gt;
}&lt;br /&gt;
};&lt;br /&gt;
request.setRequestHeader(&quot;Content-Type&quot;, &quot;application/x-www-form-urlencoded&quot;);&lt;br /&gt;
request.send(&quot;twikkirPost=&quot;+escape(twikkir)+&quot;&amp;amp;username=&quot;+escape(username));&lt;br /&gt;
[/js]&lt;br /&gt;
&lt;br /&gt;
It should be noted that it is necessary to set the appropriate request type header in the request parameter &lt;i&gt;(line 16 above)&lt;/i&gt;. It is also necessary to set the appropriate response type in the associated action class - for example:&lt;br /&gt;
&lt;br /&gt;
[java]&lt;br /&gt;
ServletActionContext.getResponse().setContentType(&quot;text/xml&quot;);&lt;br /&gt;
[/java]&lt;br /&gt;
&lt;br /&gt;
Further, the altassian-plugin.xml should also reflect the return type of the action - in this instance &quot;velocity-xml&quot;:&lt;br /&gt;
&lt;pre&gt;
&lt;code&gt;
 &amp;lt;action name=&quot;postit&quot; class=&quot;com.sidus.confluence.twikkir.action.PostItAction&quot;&amp;gt;
  &amp;lt;result name=&quot;success&quot; type=&quot;velocity-xml&quot;&amp;gt;/templates/sidus/twikkir/posted.vm&amp;lt;/result&amp;gt;
 &amp;lt;/action&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
Another experiment took shape in the version control system used - Github - where you can find the &lt;a href=&quot;https://github.com/keibro/twikkir&quot;&gt;source code&lt;/a&gt; behind the plugin.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
Future&lt;/h3&gt;
&lt;br /&gt;
Building the plugin proved to be an extremely useful learning exercise. The plugin certainly could be improved and there are many extension points:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;br /&gt;
&lt;li&gt;Send/receive tweets from Twitter&lt;/li&gt;
&lt;br /&gt;
&lt;li&gt;Protect your twikkir feed&lt;/li&gt;
&lt;br /&gt;
&lt;li&gt;Enable Confluence entities (pages/ blogposts, etc.) to send tweets&lt;/li&gt;
&lt;br /&gt;
&lt;li&gt;Enable a command line interface to execute Confluence actions&lt;/li&gt;
&lt;br /&gt;
&lt;li&gt;Build twikkir clouds&lt;/li&gt;
&lt;br /&gt;
&lt;li&gt;Build twikkir connection data - inferring/suggesting potential relationships between users based on who is following who&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
The flexibility of the Confluence plugin system creates countless possibilities for extending the wiki platform with social networking integration and Twikkir is just one of these possibilities.&lt;br /&gt;
&lt;br /&gt;
... and of course you can follow me @ &lt;a href=&quot;http://twitter.com/keibro&quot;&gt;keibro&lt;/a&gt; on Twitter.</content><link rel='replies' type='application/atom+xml' href='http://www.every108minutes.com/feeds/6328321141070138166/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.every108minutes.com/2008/06/let-your-confluence-tweet.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1456030802763040550/posts/default/6328321141070138166'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1456030802763040550/posts/default/6328321141070138166'/><link rel='alternate' type='text/html' href='http://www.every108minutes.com/2008/06/let-your-confluence-tweet.html' title='Let your Confluence Tweet!'/><author><name>Keith</name><uri>http://www.blogger.com/profile/03839585259712953186</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYDdtVZKP8wmnipabYeX4tUn2_aL6Bk-MAFVVL6vDCEpZjLkmj_sigWmx2UyLMAToseIEYrK36T0kRWVRTO6A11dTws8u3u9HkhalDuWZ9-2kcqfQ9zkFANRYbueW-4nM/s220/face.jpg'/></author><thr:total>4</thr:total></entry></feed>