<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>A blog by Simon McManus</title>
  <subtitle>The blog of Simon McManus.</subtitle>
  <link href="https://simonmcmanus.com/feed.xml" rel="self"/>
  <link href="https://simonmcmanus.com/"/>
  <updated>2026-06-03T06:22:30Z</updated>
  <id>https://simonmcmanus.com/</id>
  <author>
    <name>Simon McManus</name>
    <email>mcmanus.simon@gmail.com</email>
  </author>
  
  <entry>
    <title>IP in Action - Security Event</title>
    <link href="https://simonmcmanus.com/posts/ip-in-action-security-event/"/>
    <updated>2007-06-29T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/ip-in-action-security-event/</id>
    <content type="html">&lt;p&gt;A couple of weeks ago I attended the IP in Action Security event in Coventry, This was a part of my old role on a project to provide designs for a complete end to end security solution for BT (access cards, access readers, Biometrics, IP CCTV, Door Control and ID/Role Management)&lt;/p&gt;
&lt;p&gt;I was pleased to see that everyone at the event acknowledged new security projects require as much IT expertise as the do conventional security knowledge. Unfortunately not all suppliers fully grasped the concept of programmatically exposing their devices though xml and web services but there were a number who did.&lt;/p&gt;
&lt;p&gt;This is particularly important to BT as it drives towards a SOA (Service Orientated Architecture) . With the use of standards such as BPEL (Business Process Execution Language) and BAM (Business Activity Monitoring) , we are going to see some extremely clever &amp;quot;Enterprise Mash-ups&amp;quot; in the not too distant future.&lt;/p&gt;
&lt;p&gt;Video analytics was the buzzword at the event causing the most excitement, that’s the software that automatically sends you a fine if you stop in the wrong part of a junction (yellow box)&lt;/p&gt;
&lt;p&gt;Sony gave a particularly impressive demonstration of how they can use analytics to generate meta data about videos, and only notify an operator if there is actually something they need to look at.&lt;/p&gt;
&lt;p&gt;http://www.sonybiz.net/biz/view/ShowContent.action?BIZ_SESSIONID=GWVHGG9WkrmNTcJfjppj5JHSpn69td2nCYzcLFLhGKNc6yDxK3qv!-46656936&amp;amp;logicalname=NVM%20DEPA%20Flash&amp;amp;site=biz_en_GB&lt;/p&gt;
&lt;p&gt;The event had a focus on local governments/councils. There were a number of companies proposing they could cut costs for local councils by consolidating their CCTV, traffic light, traffic information boards and emergency service networks into one IP WiFi network. Leeds council gave an impressive demonstration of how they have done this and used the same network to provide WiFi access to some of its poorest areas.&lt;/p&gt;
&lt;p&gt;Finally I though I would mention one of the more comical ideas from the event, some councils are promoting Bluetooth networks, while there may be many good uses for this technology the example given was rather poor…..&lt;/p&gt;
&lt;p&gt;When walking into an area of high crime people receive a message on their mobile informing them that criminal may be operating in the area. On receiving that message most peoples reaction would be to get their phone from their pocket and review the message thus display their lovely new phone to all the criminals. Genius.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Simon McManus and Osmosoft</title>
    <link href="https://simonmcmanus.com/posts/simon-mcmanus-and-osmosoft/"/>
    <updated>2007-07-03T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/simon-mcmanus-and-osmosoft/</id>
    <content type="html">&lt;p&gt;What with the launch of the official Osmosoft.com site linking to my blog I thought it would be appropriate to give you an idea of what I hope to do in BT Osmosoft. As a part of BT we will have a focus on using the BT SDK (&lt;a href=&quot;http://sdk.bt.com/&quot; title=&quot;http://sdk.bt.com/&quot;&gt;http://sdk.bt.com/&lt;/a&gt;) which provides the following services :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;SMS&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Voice Calls&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Conference Calls&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Authentication&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Information about Me&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Location&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Contacts&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;here are my current ideas of how I would like to use them :&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;WordPress Plug-in - &lt;a href=&quot;http://wordpress.com/&quot; title=&quot;http://wordpress.com/&quot;&gt;http://wordpress.com/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;WordPress is a popular open source blogging application. I would like to create a plug-in for WordPress which integrates some of the functionality mentioned above. The most obvious use would be a widget with a &amp;quot;text me&amp;quot; or &amp;quot;Ring Me&amp;quot; button allowing readers to get in contact with the blog owner on their mobile without exposing the mobile number.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Facebook Application - &lt;a href=&quot;http://www.facebook.com/&quot; title=&quot;http://www.facebook.com/&quot;&gt;http://www.facebook.com/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I like Facebook, its very addictive. Ive been particularly keeping an eye on the application that resulted from its API.&lt;/p&gt;
&lt;p&gt;(&lt;a href=&quot;http://developers.facebook.com/&quot; title=&quot;http://developers.facebook.com/&quot;&gt;http://developers.facebook.com/&lt;/a&gt;) One of the things which I find interesting about facebook applications is their ability to spread very very quickly....&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://blog.pmarca.com/2007/06/analyzing_the_f.html&quot; title=&quot;http://blog.pmarca.com/2007/06/analyzing_the_f.html&quot;&gt;http://blog.pmarca.com/2007/06/analyzing_the_f.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;So what kind of functionality would I be looking to integrate into Facebook? Below are some initial ideas.....&lt;/p&gt;
&lt;p&gt;1 .. Allow users to store their contact details and provide a &amp;quot;call me&amp;quot; and &amp;quot;text me&amp;quot; buttons on facebook.&lt;/p&gt;
&lt;p&gt;2 .. Use the BT SDK Location service to display a users location&lt;/p&gt;
&lt;p&gt;3 .. Integration with BT Vault - let users share files using BT Vault on facebook.&lt;/p&gt;
&lt;p&gt;4 .. Import/Export of BT contacts One Address book and Facebook contacts?&lt;/p&gt;
&lt;p&gt;5 .. Some kind of Yellow Pages (YELL.COM) integration?&lt;/p&gt;
&lt;p&gt;6 .. Interface into MSN, Yahoo, AOL and google chat all from within facebook.&lt;/p&gt;
&lt;p&gt;I will post updates and new ideas on this blog so please keep checking back.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>My First (very simple) Facebook Application using the BT Web21c SDK</title>
    <link href="https://simonmcmanus.com/posts/my-first-(very-simple)-facebook-application-using-the-bt-web21c-sdk/"/>
    <updated>2007-07-16T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/my-first-(very-simple)-facebook-application-using-the-bt-web21c-sdk/</id>
    <content type="html">&lt;p&gt;This is a simple proof of concept&lt;/p&gt;
&lt;p&gt;Firstly I took the existing PHP example code for CallMe (from the BT SDK PHP Examples) and modified it.&lt;/p&gt;
&lt;p&gt;For more info on getting the PHP SDK set up please see &lt;a href=&quot;https://simonmcmanus.wordpress.com/2007/07/16/php-sdk-for-dummies-using-windows-2/&quot; title=&quot;this post.&quot;&gt;this post&lt;/a&gt;.  It talk about setting up the SDK locally but its very similiar when FTPing up to a live web server.&lt;/p&gt;
&lt;p&gt;Please note that should you want to use this code you will need to modify  the line :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;  
    $called = &amp;quot;tel:+44YOUR&#92;_MOBILE&#92;_NUMBER&#92;_HERE&amp;quot;;  
  

  
 #!/usr/bin/env php  
&amp;lt;?php  
require&#92;_once(dirname(&#92;_&#92;_FILE&#92;_&#92;_) . &#39;/../../web21c.php&#39;);  
require&#92;_once(dirname(&#92;_&#92;_FILE&#92;_&#92;_) . &#39;/../common.php&#39;);  
  
if(!$&#92;_REQUEST&#92;[&#39;tel&#39;&#92;])  
{  
echo &#39;no number to call&#39;;  
exit;  
}  
    $calling = &amp;quot;tel:+&amp;quot;.$&#92;_REQUEST&#92;[&#39;tel&#39;&#92;];  
    $called = &amp;quot;tel:+44YOUR&#92;_MOBILE&#92;_NUMBER&#92;_HERE&amp;quot;;  
  
    /&#92;*  
     &#92;*  make one phone ring another  
     &#92;*/  
    $web21c = new Web21c($applicationName, $environment);  
  
    $voice = $web21c-&amp;gt;SessionThirdPartyCall();  
  
    $r = $voice-&amp;gt;makeCall($calling, $called, 30);  
  
    print &amp;quot;call made as : &amp;quot; . $r-&amp;gt;callId . &amp;quot;&#92;&#92;n&amp;quot;;  
  
?&amp;gt;  
  
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Putting this code up on the internet will expose your account to others so we suggest placing it somewhere that only you know about it.&lt;/p&gt;
&lt;p&gt;The changes mean that a user can call your number by passing it in the url.....eg.....&lt;/p&gt;
&lt;p&gt;phpWeb21C/cmds/MakeCall.php?tel=OTHER TEL NUM&lt;/p&gt;
&lt;p&gt;the format of the number is 44000000000  (the + is added by the php file)&lt;/p&gt;
&lt;p&gt;You can check that it works simply by specifying a different phone number to the one specified previously.&lt;/p&gt;
&lt;p&gt;To create the Facebook application I simply provided the introdution to facebook apps....&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://developers.facebook.com/step_by_step.php&quot;&gt;http://developers.facebook.com/step_by_step.php&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I suggest you go up to at least step 18.&lt;/p&gt;
&lt;p&gt;When you have got this far you can change the index.php file so it contains the code below:&lt;/p&gt;
&lt;p&gt;Please note that you will need to change  the action value to the absolute URL where the BT SDK files are stored.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;form action=&amp;quot;[http://YOURAPPLICATIONURL/phpWeb21C/examples/cmds/makeCall.php](http://yourapplicationurl/phpWeb21C/examples/cmds/makeCall.php)&amp;quot;&amp;gt;  
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tel&amp;quot; /&amp;gt;  
&amp;lt;input type=&amp;quot;SUBMIT&amp;quot; name=&amp;quot;SUBMIT&amp;quot;  value=&amp;quot;submitx&#92;`&amp;quot;/&amp;gt;  
&amp;lt;/form&amp;gt;  

&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
  
  <entry>
    <title>PHP SDK for Dummies using Windows</title>
    <link href="https://simonmcmanus.com/posts/php-sdk-for-dummies-using-windows/"/>
    <updated>2007-07-16T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/php-sdk-for-dummies-using-windows/</id>
    <content type="html">&lt;p&gt;This page provides instruction for how to using the BT SDK in PHP with XXAMP&lt;br /&gt;
1 .. Install XAMPP (&lt;a href=&quot;http://www.apachefriends.org/en/xampp.html&quot;&gt;http://www.apachefriends.org/en/xampp.html&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;This is not required but this particular apache configuration has been tested.&lt;/p&gt;
&lt;p&gt;2 .. Register for an account at &lt;a href=&quot;http://sdk.bt.com/&quot;&gt;http://sdk.bt.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;3 .. Download the PHP source files: Downloads &amp;gt; PHP&lt;/p&gt;
&lt;p&gt;4 ..  Unzip the directory into your htdocs folder.  If you installed XAMPP to the default location the htdocs folder will be in : C:&#92;xampp&#92;htdocs&lt;/p&gt;
&lt;p&gt;Unzip the files to a folder of your choosing. With the default install this can be found at:&lt;/p&gt;
&lt;p&gt;C:&#92;xampp&#92;htdocs&#92;phpWeb21C&lt;/p&gt;
&lt;p&gt;5 ..  Registering your applications&lt;/p&gt;
&lt;p&gt;Note : Before you can use the SDK you will need to register an application (One registration covers all of your programs)&lt;/p&gt;
&lt;p&gt;You can register application at the URL below:&lt;/p&gt;
&lt;p&gt;https://sdk.bt.com/Default.aspx?TabId=127&lt;/p&gt;
&lt;p&gt;In order to run the certificate generation tool you may need  the latest version of “Java Runtime Environment (JRE)”  from &lt;a href=&quot;http://java.sun.com/javase/downloads/index.jsp&quot;&gt;http://java.sun.com/javase/downloads/index.jsp&lt;/a&gt; (you will receive an error when attempting to run the tool if you require this upgrade.)&lt;/p&gt;
&lt;p&gt;When you use the tool 3 files will be generated on your desktop. (I called my app Umbrella)&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Umbrella_Sandbox_PrivateKey.pem&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Umbrella_Sandbox_PublicKey.pem&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Umbrella_Sandbox_SignedCert.pem&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Two of those files :&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Umbrella_Sandbox_PrivateKey.pem&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Umbrella_Sandbox_SignedCert.pem&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Should then be place in a folder called keys (which you may need to create). E.g.&lt;/p&gt;
&lt;p&gt;C:&#92;xampp&#92;htdocs&#92;phpWeb21C&#92;keys&lt;/p&gt;
&lt;p&gt;6 .. Open the common.php file which can be found in the folder:&lt;/p&gt;
&lt;p&gt;C:&#92;xampp&#92;htdocs&#92;phpWeb21C&#92;examples&#92;common.php&lt;/p&gt;
&lt;p&gt;7 .. Ensure that the application name is the same as the one specified when generating your certificate.&lt;/p&gt;
&lt;p&gt;8 ..  Open the folder C:&#92;xampp&#92;htdocs&#92;phpWeb21C&#92;examples&#92;cmds&lt;/p&gt;
&lt;p&gt;You should now be able to configure and run these files.&lt;/p&gt;
&lt;p&gt;9 ..  Running the code.  If you have used the default installation settings go to and edit the file:&lt;/p&gt;
&lt;p&gt;C:&#92;xampp&#92;htdocs&#92;phpWeb21C&#92;examples&#92;cmds&#92;makeCall.php&lt;/p&gt;
&lt;p&gt;Change the variables for :&lt;/p&gt;
&lt;p&gt;$calling = &amp;quot;tel:+44791&amp;quot;;&lt;/p&gt;
&lt;p&gt;$called = &amp;quot;tel:+44791&amp;quot;;&lt;/p&gt;
&lt;p&gt;To the numbers you wish to ring when the page is run.&lt;/p&gt;
&lt;p&gt;When you now open the file in a browser the phones should start ringing. http://127.0.0.1/phpWeb21C/examples/cmds/makeCall.php&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Mashing Up BT Web21c Location service with Google Maps</title>
    <link href="https://simonmcmanus.com/posts/mashing-up-bt-web21c-location-service-with-google-maps/"/>
    <updated>2007-07-20T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/mashing-up-bt-web21c-location-service-with-google-maps/</id>
    <content type="html">&lt;p&gt;This example combines the  two post  (&lt;a href=&quot;https://simonmcmanus.wordpress.com/2007/07/20/the-google-maps-api/&quot; title=&quot;google Maps API&quot;&gt;Google Maps API&lt;/a&gt; and &lt;a href=&quot;https://simonmcmanus.wordpress.com/2007/07/20/your-location-from-the-bt-sdk-web21c-in-google-maps/&quot; title=&quot;your location from the sdk.&quot;&gt;your location from the sdk&lt;/a&gt;)to automatically look up a phones location and then map it straight to a google map box.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;The code is below, please note you should only need to change the four variables at the top of the code :
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;&amp;lt;?php 
  
require&#92;_once(dirname(&#92;_&#92;_FILE&#92;_&#92;_) . &#39;/../../web21c.php&#39;); 
  
require&#92;_once(dirname(&#92;_&#92;_FILE&#92;_&#92;_) . &#39;/../common.php&#39;);

//  command to locate a mobile deviice 
  
//  - set these to sensible values

$deviceId = &#39;tel:+PHONENUMBER&#39;; 
  
$username = [USERNAME@MAIL.COM](mailto:USERNAME@MAIL.COM); 
  
$password = &amp;quot;YOUR PASSWORD&amp;quot;; 
  
$googleAPIKey = &amp;quot;YOUR GOOGLE API KEY&amp;quot;;

$web21c = new Web21c($applicationName, $environment);

// login as a user 
  
$wla = $web21c-&amp;gt;WhiteLabelAuthentication(); 
  
$wla-&amp;gt;login($username, $password);

 //  locate mobile 
  
$location = $web21c-&amp;gt;Location(); 
  
$location-&amp;gt;web21cUser = $wla-&amp;gt;web21cUser;

try 
  
{ 
  
 $r = $location-&amp;gt;getGeoLocation($deviceId); 
  
} 
  
catch (Web21cPermissionDeniedException $e) 
  
{ 
  
 print &amp;quot;requesting device owner&#39;s permission to be located ..n&amp;quot;; 
  
 print &amp;quot;try again later when the owner may have respondedn&amp;quot;; 
  
 $access = $web21c-&amp;gt;LocationPermission(); 
  
 $access-&amp;gt;web21cUser = $wla-&amp;gt;web21cUser; 
  
 $access-&amp;gt;requestPermission($deviceId); 
  
}

// var&#92;_dump($r-&amp;gt;geoLocation);

echo &#39;Longitude : &#39;.$r-&amp;gt;geoLocation-&amp;gt;longitude. &#39;&amp;lt;br /&amp;gt;&#39;; 
  
echo &#39;Latitude : &#39;.$r-&amp;gt;geoLocation-&amp;gt;latitude. &#39;&amp;lt;br /&amp;gt;&#39;; 
  
echo &amp;quot;Click below to see the location of mobile number &amp;quot;.$deviceId.&amp;quot;&amp;lt;br /&amp;gt;&amp;quot;; 
  
echo &amp;quot;&amp;lt;a href=&#39;http://maps.google.com?q=&amp;quot;.$r-&amp;gt;geoLocation-&amp;gt;latitude.&amp;quot;,%20&amp;quot;.$r-&amp;gt;geoLocation-&amp;gt;longitude.&amp;quot;&#39;&amp;gt;Google Maps&amp;lt;/a&amp;gt; &amp;quot;; 
  
//echo &#39;start : &#39;.$r-&amp;gt;getGeoLocation()-&amp;gt;getLongitude(); 
  
?&amp;gt; 
  
&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Strict//EN&amp;quot; 
  
  &amp;quot;[http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd](http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd)&amp;quot;&amp;gt; 
  
&amp;lt;html xmlns=&amp;quot;[http://www.w3.org/1999/xhtml](http://www.w3.org/1999/xhtml)&amp;quot;&amp;gt; 
  
  &amp;lt;head&amp;gt; 
  
    &amp;lt;script src=&amp;quot;[http://maps.google.com/maps?file=api&amp;amp;v=2&amp;amp;key=&amp;lt;?=$googleAPIKey](http://maps.google.com/maps?file=api&amp;amp;v=2&amp;amp;key=&amp;lt;?=$googleAPIKey)?&amp;gt;&amp;quot; 
  
      type=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;

&amp;lt;/head&amp;gt; 
  
  &amp;lt;body onload=&amp;quot;load()&amp;quot; onunload=&amp;quot;GUnload()&amp;quot;&amp;gt; 
  
    &amp;lt;p&amp;gt; 
  
  &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;    
  
  function load() 
  
  {      
  
   if (GBrowserIsCompatible()) 
  
   {        
  
    var map = new GMap2(document.getElementById(&amp;quot;map&amp;quot;));        
  
    var map = new GMap2(document.getElementById(&amp;quot;map&amp;quot;)); 
  
    map.setCenter(new GLatLng(&amp;lt;?=$r-&amp;gt;geoLocation-&amp;gt;latitude?&amp;gt;, &amp;lt;?=$r-&amp;gt;geoLocation-&amp;gt;longitude?&amp;gt;), 13); 
  
    map.openInfoWindow(map.getCenter(), 
  
    document.createTextNode(&amp;quot;Simon is here &amp;quot;)); 
  
    }   
  
  }    
  
   
  
  &amp;lt;/script&amp;gt; 
  
      &amp;lt;span class=&amp;quot;style1&amp;quot;&amp;gt;BT SDK Location Service &amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt; 
  
    &amp;lt;div id=&amp;quot;map&amp;quot; style=&amp;quot;width: 500px; height: 300px&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; 
  
  &amp;lt;/body&amp;gt; 
  
&amp;lt;/html&amp;gt; 
  
 
&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
  
  <entry>
    <title>The Google Maps API</title>
    <link href="https://simonmcmanus.com/posts/the-google-maps-api/"/>
    <updated>2007-07-20T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/the-google-maps-api/</id>
    <content type="html">&lt;p&gt;Now that we can find out the logitude and latitude of  a persons mobile number (&lt;a href=&quot;https://simonmcmanus.com/posts/your-location-from-the-bt-sdk-(web21c)-in-google-maps/&quot; title=&quot;see this post&quot;&gt;see this post&lt;/a&gt;) the next step is to get the Google API set up.   This post talks you through setting up the Maps API (its very simple)&lt;/p&gt;
&lt;p&gt;1 .. First of all you need to register for a google maps api account. You can do that &lt;a href=&quot;http://www.google.com/apis/maps/signup.html&quot; title=&quot;here&quot;&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;2 ..  Make sure that you specify a the folder that you file will actually be sitting in. (it wont work otherwise)&lt;/p&gt;
&lt;p&gt;3 ..  You then simply need to create a file in the folder specifed and then add the below code.&lt;/p&gt;
&lt;p&gt;4 .. Note that you will need to change the &amp;quot;YOURKEY&amp;quot; value to your key.&lt;/p&gt;
&lt;p&gt;_________________________&lt;/p&gt;
&lt;p&gt;&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot;  
  &quot;[http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd](http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd)&quot;&gt;&lt;/p&gt;
&lt;html xmlns=&quot;[http://www.w3.org/1999/xhtml](http://www.w3.org/1999/xhtml)&quot;&gt;  
  &lt;head&gt;  
    &lt;script src=&quot;https://simonmcmanus.com/posts/the-google-maps-api/[http://maps.google.com/maps?file=api&amp;v=2&amp;key=YOURKEY](http://maps.google.com/maps?file=api&amp;v=2&amp;key=YOURKEY)&quot;      =&quot;&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;  
&lt;/head&gt;  
  &lt;body onload=&quot;load()&quot; onunload=&quot;GUnload()&quot;&gt;  
    &lt;p&gt;  
  &lt;script type=&quot;text/javascript&quot;&gt;     
  function load()  
  {       
   if (GBrowserIsCompatible())  
   {         
    var map = new GMap2(document.getElementById(&quot;map&quot;));         
    var map = new GMap2(document.getElementById(&quot;map&quot;));  
    map.setCenter(new GLatLng(51.5052680969, -0.102480553091), 13);  
    map.openInfoWindow(map.getCenter(),  
    document.createTextNode(&quot;Simon is here &quot;));  
    }    
  }     
    
  &lt;/script&gt;  
      &lt;span class=&quot;style1&quot;&gt;BT SDK Location Service &lt;/span&gt;&lt;/p&gt;  
    &lt;div id=&quot;map&quot; style=&quot;width: 500px; height: 300px&quot;&gt;&lt;/div&gt;  
  &lt;/body&gt;  
&lt;/html&gt;  
&lt;p&gt;_________________________&lt;/p&gt;
&lt;p&gt;On the above application the script is current hard coded to show my current location (51.5052680969, -0.102480553091).  Over the coming posts I will discuss how to integrate this fuctionality into the the &lt;a href=&quot;https://simonmcmanus.com/posts/your-location-from-the-bt-sdk-(web21c)-in-google-maps/&quot; title=&quot;BT SDK location example&quot;&gt;BT SDK location example&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Your Location from the BT SDK (Web21c) in Google Maps</title>
    <link href="https://simonmcmanus.com/posts/your-location-from-the-bt-sdk-(web21c)-in-google-maps/"/>
    <updated>2007-07-20T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/your-location-from-the-bt-sdk-(web21c)-in-google-maps/</id>
    <content type="html">&lt;p&gt;The steps to setting up a very  basic example of the BT Web21c location service are below.  Over the coming weeks I will evolve these example and hope to release a new version of the PHP examples provided on the official &lt;a href=&quot;http://sdk.bt.com/&quot; title=&quot;Web21c Site&quot;&gt;Web21c site&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This app results in in a link which when clicked displays the mobiles current location in google maps.&lt;/p&gt;
&lt;p&gt;If you need to get the SDK set up you may find some help in &lt;a href=&quot;https://simonmcmanus.com/posts/php-sdk-for-dummies-using-windows/&quot; title=&quot;this post&quot;&gt;this post.&lt;/a&gt;  When the examples have  evolved I will publish a new step by step example of how to get set up in the first place.&lt;/p&gt;
&lt;p&gt;1 ..  Before you can view a phones location you must first register the user who you wish to track. This is done using the addUser.php page in the examples directory. I have added the code below:&lt;/p&gt;
&lt;p&gt;addUser.php&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;  
&amp;lt;?php  
require&#92;_once(dirname(&#92;_&#92;_FILE&#92;_&#92;_) . &#39;/../../web21c.php&#39;);  
require&#92;_once(dirname(&#92;_&#92;_FILE&#92;_&#92;_) . &#39;/../common.php&#39;);  
  
     //  command to add a user     
    $web21c = new Web21c($applicationName, $environment);  
    $wla = $web21c-&amp;gt;WhitelabelAuthentication();  
    $wla-&amp;gt;addUser([your-email@mail.com](mailto:your-email@mail.com));  
    //  dump response  
    var&#92;_dump($wla-&amp;gt;getAllUsers());  
?&amp;gt;   
  
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Please note that you will need to change &amp;quot;&lt;a href=&quot;mailto:your-email@mail.com&quot;&gt;your-email@mail.com&lt;/a&gt;&amp;quot; to the email address of the user that you wish to be added.&lt;/p&gt;
&lt;p&gt;The bottom line will display any errors that are returned.&lt;/p&gt;
&lt;p&gt;2 ..  When the user has been added they will recieve a password via email.&lt;/p&gt;
&lt;p&gt;3 ..  With the password you will now be able change three variables in locate.php  and then run the file.&lt;/p&gt;
&lt;p&gt;The three variables you need to change are :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;$deviceId = &#39;tel:+440000000000&#39;;  
$username = [youremail@mail](mailto:youremail@mail.com)[.](mailto:simon.mcmanus@.com)com;  
$password = &amp;quot;YOURPASS&amp;quot;;  
  
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;locate.php&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;  
&amp;lt;?php  
require&#92;_once(dirname(&#92;_&#92;_FILE&#92;_&#92;_) . &#39;/../../web21c.php&#39;);  
require&#92;_once(dirname(&#92;_&#92;_FILE&#92;_&#92;_) . &#39;/../common.php&#39;);  
  
//  command to locate a mobile deviice  
//  - set these to sensible values  
  
$deviceId = &#39;tel:+44700000000000&#39;;  
$username = &amp;quot;[YOURMAIL@MAIL.com](mailto:simon.mcmanus@bt.com)&amp;quot;;  
$password = &amp;quot;YOURPASSWORD&amp;quot;;  
  
$web21c = new Web21c($applicationName, $environment);  
  
// login as a user  
$wla = $web21c-&amp;gt;WhiteLabelAuthentication();  
$wla-&amp;gt;login($username, $password);  
  
 //  locate mobile  
$location = $web21c-&amp;gt;Location();  
$location-&amp;gt;web21cUser = $wla-&amp;gt;web21cUser;  
  
try  
{  
 $r = $location-&amp;gt;getGeoLocation($deviceId);  
}  
catch (Web21cPermissionDeniedException $e)  
{  
 print &amp;quot;requesting device owner&#39;s permission to be located ..&#92;&#92;n&amp;quot;;  
 print &amp;quot;try again later when the owner may have responded&#92;&#92;n&amp;quot;;  
 $access = $web21c-&amp;gt;LocationPermission();  
 $access-&amp;gt;web21cUser = $wla-&amp;gt;web21cUser;  
 $access-&amp;gt;requestPermission($deviceId);  
}  
  
// var&#92;_dump($r-&amp;gt;geoLocation);  
  
echo &#39;Longitude : &#39;.$r-&amp;gt;geoLocation-&amp;gt;longitude. &#39;&amp;lt;br /&amp;gt;&#39;;  
echo &#39;Latitude : &#39;.$r-&amp;gt;geoLocation-&amp;gt;latitude. &#39;&amp;lt;br /&amp;gt;&#39;;  
echo &amp;quot;Click below to see the location of mobile number &amp;quot;.$deviceId.&amp;quot;&amp;lt;br /&amp;gt;&amp;quot;;  
echo &amp;quot;&amp;lt;a href=&#39;http://maps.google.com?q=&amp;quot;.$r-&amp;gt;geoLocation-&amp;gt;latitude.&amp;quot;,%20&amp;quot;.$r-&amp;gt;geoLocation-&amp;gt;longitude.&amp;quot;&#39;&amp;gt;Google Maps&amp;lt;/a&amp;gt; &amp;quot;;  
//echo &#39;start : &#39;.$r-&amp;gt;getGeoLocation()-&amp;gt;getLongitude();  
?&amp;gt;  
  
&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
  
  <entry>
    <title>PHPWeb21C Certificate Generation (Using the Wizard)</title>
    <link href="https://simonmcmanus.com/posts/phpweb21c-certificate-generation-(using-the-wizard)/"/>
    <updated>2007-07-23T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/phpweb21c-certificate-generation-(using-the-wizard)/</id>
    <content type="html">&lt;p&gt;This is just a quick post to let you know about generating certificate when using PHPWeb21C.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://simonmcmanus.files.wordpress.com/2007/07/sdk_cert.gif&quot; title=&quot;sdk_cert.gif&quot;&gt;&lt;img src=&quot;https://simonmcmanus.files.wordpress.com/2007/07/sdk_cert.gif&quot; alt=&quot;sdk_cert.gif&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;For option three you should choose sandbox for the environment(to enable your 10 free calls each day)  and then choose PEM (PKCS#8).  If you choose the PFX option you will need to get apache to talk to your windows certificate store.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>A Simple DHTML Phone</title>
    <link href="https://simonmcmanus.com/posts/a-simple-dhtml-phone/"/>
    <updated>2007-07-24T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/a-simple-dhtml-phone/</id>
    <content type="html">&lt;p&gt;I spent a while searching for this script only to realise it would be quicker to write it myself!&lt;/p&gt;
&lt;p&gt;This simple application uses javascript and HTML to allow the user to enter a number using the keypad and then let them make a call. This example can link to makeCall.php in the examples directory if you wish to make calls.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://simonmcmanus.files.wordpress.com/2007/07/phone_call.gif&quot; title=&quot;phone_call.gif&quot;&gt;&lt;img src=&quot;https://simonmcmanus.files.wordpress.com/2007/07/phone_call.gif&quot; alt=&quot;phone_call.gif&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Just copy the code into a HTML file in the root of the BT PHP directory and you should be in business.&lt;/p&gt;
&lt;p&gt;Here is the code :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;&#92;_&#92;_&#92;_&#92;_&#92;_&#92;_&#92;_&#92;_&#92;_&#92;_&#92;_&#92;_&#92;_&#92;_&#92;_&#92;_&#92;_&#92;_&#92;_&#92;_&#92;_&#92;_&#92;_&#92;_&#92;_&#92;_&#92;_&#92;_&#92;_&#92;_&#92;_&#92;_&#92;_
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt; &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
  
  
function add(id)
  
{ form1.number.value = form1.number.value + id ;
  
 if (id==&amp;quot;C&amp;quot;)
  
 { form1.number.value = &#39;&#39;;
  
 }
  
}
  
function pre&#92;_submit(a)
  
{
  
 location.href=&amp;quot;examples/makeCall.php?tel=&amp;quot; + document.form1.number.value;
  
}
  
  
&amp;lt;/script&amp;gt;
  
   &amp;lt;form name=&amp;quot;form1&amp;quot; id=&#39;form1&#39; method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;quot;&amp;gt;
  
       &amp;lt;table width=&amp;quot;154&amp;quot; border=&amp;quot;0&amp;quot;&amp;gt;
  
            &amp;lt;tr&amp;gt;
  
              &amp;lt;td colspan=&amp;quot;4&amp;quot;&amp;gt;&amp;lt;input name=&amp;quot;number&amp;quot; type=&amp;quot;text&amp;quot;    onkypress=&amp;quot;check&#92;_type(&#39;d&#39;);&amp;quot;  id=&amp;quot;number&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;
  
            &amp;lt;/tr&amp;gt;
  
            &amp;lt;tr&amp;gt;
  
              &amp;lt;td width=&amp;quot;24&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;
  
              &amp;lt;td width=&amp;quot;24&amp;quot;&amp;gt;&amp;lt;input name=&amp;quot;1&amp;quot;   type=&amp;quot;button&amp;quot; onClick=&amp;quot;add(this.value);&amp;quot; id=&amp;quot;1&amp;quot; value=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;
  
              &amp;lt;td width=&amp;quot;28&amp;quot;&amp;gt;&amp;lt;input name=&amp;quot;2&amp;quot; type=&amp;quot;button&amp;quot; onClick=&amp;quot;add(this.value);&amp;quot;  id=&amp;quot;2&amp;quot; value=&amp;quot;2&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;
  
              &amp;lt;td width=&amp;quot;52&amp;quot;&amp;gt;&amp;lt;input name=&amp;quot;3&amp;quot; type=&amp;quot;button&amp;quot; onClick=&amp;quot;add(this.value);&amp;quot;  id=&amp;quot;3&amp;quot; value=&amp;quot;3&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;
  
            &amp;lt;/tr&amp;gt;
  
            &amp;lt;tr&amp;gt;
  
              &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;
  
              &amp;lt;td&amp;gt;&amp;lt;input name=&amp;quot;4&amp;quot; type=&amp;quot;button&amp;quot; onClick=&amp;quot;add(this.value);&amp;quot;  id=&amp;quot;4&amp;quot; value=&amp;quot;4&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;
  
              &amp;lt;td&amp;gt;&amp;lt;input name=&amp;quot;5&amp;quot; type=&amp;quot;button&amp;quot; onClick=&amp;quot;add(this.value);&amp;quot;  id=&amp;quot;5&amp;quot; value=&amp;quot;5&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;
  
              &amp;lt;td&amp;gt;&amp;lt;input name=&amp;quot;6&amp;quot; type=&amp;quot;button&amp;quot; onClick=&amp;quot;add(this.value);&amp;quot;  id=&amp;quot;6&amp;quot; value=&amp;quot;6&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;
  
            &amp;lt;/tr&amp;gt;
  
            &amp;lt;tr&amp;gt;
  
              &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;
  
              &amp;lt;td&amp;gt;&amp;lt;input name=&amp;quot;7&amp;quot; type=&amp;quot;button&amp;quot; onClick=&amp;quot;add(this.value);&amp;quot;  id=&amp;quot;7&amp;quot; value=&amp;quot;7&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;
  
              &amp;lt;td&amp;gt;&amp;lt;input name=&amp;quot;8&amp;quot; type=&amp;quot;button&amp;quot; onClick=&amp;quot;add(this.value);&amp;quot;  id=&amp;quot;8&amp;quot; value=&amp;quot;8&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;
  
              &amp;lt;td&amp;gt;&amp;lt;input name=&amp;quot;9&amp;quot; type=&amp;quot;button&amp;quot; onClick=&amp;quot;add(this.value);&amp;quot;  id=&amp;quot;9&amp;quot; value=&amp;quot;9&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;
  
            &amp;lt;/tr&amp;gt;
  
            &amp;lt;tr&amp;gt;
  
              &amp;lt;td&amp;gt;&amp;lt;p&amp;gt; &amp;lt;/p&amp;gt;              &amp;lt;/td&amp;gt;
  
              &amp;lt;td&amp;gt;&amp;lt;input name=&amp;quot;+&amp;quot; type=&amp;quot;button&amp;quot; onClick=&amp;quot;add(this.value);&amp;quot;  id=&amp;quot;+&amp;quot; value=&amp;quot;+&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;
  
              &amp;lt;td&amp;gt;&amp;lt;input name=&amp;quot;0&amp;quot; type=&amp;quot;button&amp;quot; onClick=&amp;quot;add(this.value);&amp;quot;  id=&amp;quot;0&amp;quot; value=&amp;quot;0&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;
  
              &amp;lt;td&amp;gt;&amp;lt;input name=&amp;quot;Clear&amp;quot; type=&amp;quot;button&amp;quot; onClick=&amp;quot;add(this.value);&amp;quot;  id=&amp;quot;Clear&amp;quot; value=&amp;quot;C&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;
  
            &amp;lt;/tr&amp;gt;
  
            &amp;lt;tr&amp;gt;
  
             &amp;lt;td colspan=&amp;quot;4&amp;quot;&amp;gt;
  
      &amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;
  
        &amp;lt;p&amp;gt;            &amp;lt;/p&amp;gt;
  
        &amp;lt;p&amp;gt;
  
          &amp;lt;input name=&amp;quot;Make Call&amp;quot; type=&amp;quot;button&amp;quot; onClick=&amp;quot;pre&#92;_submit(document.form1.number.value)&amp;quot;  id=&amp;quot;Make Call&amp;quot; value=&amp;quot;Make Call&amp;quot;&amp;gt;
  
              &amp;lt;/p&amp;gt;
  
      &amp;lt;/div&amp;gt;&amp;lt;/td&amp;gt;
  
            &amp;lt;/tr&amp;gt;
  
     &amp;lt;/table&amp;gt;
  
&amp;lt;/form&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
  
  <entry>
    <title>Conference Calling with Web21c PHP SDK</title>
    <link href="https://simonmcmanus.com/posts/conference-calling-with-web21c-php-sdk/"/>
    <updated>2007-07-24T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/conference-calling-with-web21c-php-sdk/</id>
    <content type="html">&lt;p&gt;Over the last few days I have been consuming my credits for the BT SDK by playing with the conference calling service.   This service lets 4 users connect on the Sandbox and currently 10 on production servers (This may soon been increased to unlimited)&lt;/p&gt;
&lt;p&gt;A member of the SDK support team mentioned that a lot of people have expereinced problems when using the conference calling service so I thought I would try to provide some help.  One of the biggest problems I experienced was accessing particular variables.  In this example I have demonstrated how you can create a call and then use various functions to obtain information about the call.&lt;/p&gt;
&lt;p&gt;The page returns details of each person in the call.  You will notice that participantInfo does not return the phone number of the users connected.  I have requested that this functionality be added but for the time being you will have to store ids against phone numbers when the user is added in order to display the users phone number.&lt;/p&gt;
&lt;p&gt;Keep an eye on the blog, my next example will attempt to combine this with the DHTML Phone example I made earlier.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt; &amp;lt;? 
  
require&#92;_once(dirname(&#92;_&#92;_FILE&#92;_&#92;_) . &#39;/../../lib/web21c.php&#39;); 
require&#92;_once(dirname(&#92;_&#92;_FILE&#92;_&#92;_) . &#39;/../../config.php&#39;);
$web21c = new Web21c($applicationName, $environment);
$conf = $web21c-&amp;gt;SessionConferencing();
try 
  
{ 
  
 $conf&#92;_back = $conf-&amp;gt;createConference(); 
  
 $confId = $conf&#92;_back-&amp;gt;conferenceId; 
  
 $talker1 = $conf-&amp;gt;inviteParticipant($confId, &#39;tel:+447918880749&#39;); 
  
 $talker2 = $conf-&amp;gt;inviteParticipant($confId, &#39;tel:+442087261159&#39;); 
  
 $confInfo = $conf-&amp;gt;getConferenceInfo($confId); 
  
 echo &#39;&amp;lt;hr /&amp;gt;ConfID : &#39;; 
  
 echo $cid = $confInfo-&amp;gt;conferenceInfo-&amp;gt;conferenceId;   
  
 echo &#39;&amp;lt;br /&amp;gt;Status : &#39;.$confInfo-&amp;gt;conferenceInfo-&amp;gt;status;   
  
 echo &#39;&amp;lt;br /&amp;gt;Start : &#39;.$confInfo-&amp;gt;conferenceInfo-&amp;gt;startTime;   
  
 echo  &#39;&amp;lt;br /&amp;gt;Number of Participants : &#39;.$confInfo-&amp;gt;conferenceInfo-&amp;gt;numberOfParticipants;   
  
 echo &#39;&amp;lt;br /&amp;gt;Duration : &#39;.$confInfo-&amp;gt;conferenceInfo-&amp;gt;duration;   
  
 //var&#92;_dump($confInfo); 
  
 echo &#39;&amp;lt;hr /&amp;gt;&#39;; 
  
 // wait while the users answer their phones 
  
 sleep(5); 
  
 // get call details using the call id returned. 
  
 $conf&#92;_detail = $conf-&amp;gt;getParticipants($cid); 
  
  
  
 echo &amp;quot;&amp;lt;hr /&amp;gt;&amp;lt;h1&amp;gt; Each Participant&amp;lt;/h1&amp;gt;&amp;quot;; 
  
 $ParInfo = $conf&#92;_detail-&amp;gt;participantInfos; 
  
 $pars = $ParInfo-&amp;gt;participantInfo; 
  
  
  
 foreach ($pars as $par) 
  
 { 
  
  echo &#39; &amp;lt;hr /&amp;gt;&#39;; 
  
  echo  &#39;&amp;lt;b&amp;gt;Participant ID :&amp;lt;/b&amp;gt; &#39;.$par-&amp;gt;participantId.&#39;&amp;lt;br /&amp;gt;&#39;; 
  
  echo  &#39;&amp;lt;b&amp;gt;participantStatus : &amp;lt;/b&amp;gt;&#39;.$par-&amp;gt;participantStatus.&#39;&amp;lt;br /&amp;gt;&#39;; 
  
  $par&#92;_detail = $conf-&amp;gt;getParticipantInfo($par-&amp;gt;participantId); 
  
  //var&#92;_dump($par&#92;_detail); 
  
 }
 ?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
  
  <entry>
    <title>Mock Ajax in Facebook</title>
    <link href="https://simonmcmanus.com/posts/mock-ajax-in-facebook/"/>
    <updated>2007-08-01T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/mock-ajax-in-facebook/</id>
    <content type="html">&lt;p&gt;This example simply sends the variable specified in the text area to response.php and then displays the result from response.php in the facebook window without reloading the main page.&lt;/p&gt;
&lt;p&gt;In this particular example response.php only returns the same variables but this will be the underlying structure for many facebook apps. To use this example place the below fbml into the small default fbml box when editing the application info.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;&amp;lt;fb:subtitle&amp;gt;Simple FBML&amp;lt;/fb:subtitle&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;&amp;lt;form id=&#39;form&#39;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;&amp;lt;div id=&amp;quot;preview&amp;quot; style=&amp;quot;border-style: solid; border-color: black;   border-width: 1px; padding: 5px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;&amp;lt;textarea name=&amp;quot;data&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;&amp;lt;input type=&amp;quot;submit&amp;quot; clickrewriteform=&#39;form&#39;  clickrewriteurl=&amp;quot;http://osmosoft-php.com/facebook/simple/response.php&amp;quot;  clickrewriteid=&amp;quot;preview&amp;quot; value=&amp;quot; get response&amp;quot;/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;&amp;lt;/form&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;then response.php contains :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;&amp;lt;?php
  
	echo $&#92;_POST&#92;[&#39;data&#39;&#92;];
  
?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;for more info please see :&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://wiki.developers.facebook.com/index.php/Mock_ajax&quot; title=&quot;http://wiki.developers.facebook.com/index.php/Mock_ajax &quot;&gt;http://wiki.developers.facebook.com/index.php/Mock_ajax&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Getting your friends out of facebook</title>
    <link href="https://simonmcmanus.com/posts/getting-your-friends-out-of-facebook/"/>
    <updated>2007-08-08T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/getting-your-friends-out-of-facebook/</id>
    <content type="html">&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;The code below lists the names of all your facebook contacts.  Quite handy....
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;&amp;lt;?
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;$friends = $facebook-&amp;gt;api&#92;_client-&amp;gt;friends&#92;_get();
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;  
foreach($friends as $friend)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;{
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;    $name = $facebook-&amp;gt;api&#92;_client-&amp;gt;users&#92;_getInfo($friend,&#39;name, status, hometown&#92;_location.city&#39;);
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;    echo $name&#92;[0&#92;]&#92;[name&#92;].&#39;&amp;lt;br /&amp;gt;&#39;;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Keep an eye on the blog to see how I evolve this script.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Is Facebook the answer to everything? - Facebook for the Enterprise?</title>
    <link href="https://simonmcmanus.com/posts/is-facebook-the-answer-to-everything-facebook-for-the-enterprise/"/>
    <updated>2007-08-08T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/is-facebook-the-answer-to-everything-facebook-for-the-enterprise/</id>
    <content type="html">&lt;p&gt;I ask the question simply because it seems to come up as a potential solution to everything these days.&lt;/p&gt;
&lt;p&gt;While I have been making many technical posts about Facebook I have held back on opinions and insights while a massive debate seems to be raging around me.&lt;/p&gt;
&lt;p&gt;So why are people so excited about Facebook? &lt;a href=&quot;http://confusedofcalcutta.com/&quot; title=&quot;JP&quot;&gt;JP&lt;/a&gt; has made a number of Facebook related blog entries, I found two of his comments insightful.&lt;/p&gt;
&lt;p&gt;&amp;quot;It is rooted in physical relationship rather than just electronic. The interactions are therefore a lot richer.&amp;quot;&lt;/p&gt;
&lt;p&gt;&amp;quot;And this phenomenon, of a physical community being extended and enriched by electronic ties, is something that is a lot closer to real life.&amp;quot;&lt;/p&gt;
&lt;p&gt;These two quotes are quite fundamental to why Facebook is so successful, it is not the the apps or even the platform, but rather the brilliant way you can find, communicate and interact with past and current (real life) friends.&lt;/p&gt;
&lt;p&gt;Before I go any further three bits of history for you:&lt;/p&gt;
&lt;p&gt;1 .. I initially started investigating the Facebook API to build an application which lets Facebook users make phone calls and send texts using the &lt;a href=&quot;http://web21c.bt.com/&quot; title=&quot;BT Web21C SDK&quot;&gt;BT Web21C SDK.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;2 .. Before I started with BT Osmosoft I made MyPages which was an enterprise version of Facebook / MySpace inside the BT firewall.&lt;/p&gt;
&lt;p&gt;3 .. In MyPages users could create blogs, wikis, spreadsheets, file and photo shares. Employees could show their relation with other staff and each user had a recent activity news feed. I had big plans for group permissions and the news feeds.&lt;/p&gt;
&lt;p&gt;In a big enterprise there is always going to be thousands of relationships and interactions which are generally ignored by enterprise software. Clearly the ability to map and search these relationships has benefits. If I am unable to contact Phil, being able to browse and search his work contacts could be very helpful.&lt;/p&gt;
&lt;p&gt;So should these relationships be stored on an internal system such as MyPages? or maybe an out of the box Facebook behind your firewall? Or maybe just build a Facebook app? If you are asking yourself these questions you should think about the points below :&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Security / Ownership&lt;/strong&gt;&lt;br /&gt;
- Lots of things like security and data protection to think about. You may want the system to tell you when your confidential documents have been read or updated. Clearly some legal and security issues to work through.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Integrations with other Systems&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;- One of the most useful concepts in Facebook that the enterprise can really take advantage of is the news feed. I talk about this more later but the ability to show useful updates in a configurable news feeds could really help reduce email traffic and improve workflow.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Control of Data&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;- How much control do you want over the data?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Search&lt;/strong&gt;&lt;br /&gt;
- Something like MyPages has real value when you can search the intranet for a topic and find someone in the company who has been blogging about it. Especially when you can then explore their network of contacts. This is would be very tricky to implement securely on facebook.com&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Self Promotion&lt;/strong&gt;&lt;br /&gt;
- MyPages provided each member of staff with their own home page, they were encouraged to use this as an online CV to explain what they had done, were doing and wished to do in the future. &lt;a href=&quot;http://jermolene.wordpress.com/&quot; title=&quot;Jeremy Ruston&quot;&gt;Jeremy Ruston&lt;/a&gt; (my boss) often asks the question, what intranet content should we not share externaly, and why not? This is a interesting point, and particularly in relation to this issue.&lt;/p&gt;
&lt;p&gt;My mind runs away with ideas of allowing customers to pick a team based on public profile pages with reviews from previous client. This of course takes opening up the enterprise to a whole new level and you would need to ensure at least two things : 1 : Does your company have good quality staff / teams and the resource to provide good customer service?. 2 : Can your company hold onto its best staff even with their success being public knowledge?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Functionality&lt;/strong&gt;&lt;br /&gt;
- if we are talking about a Facebook box then we would see some new enterprisish apps but I suspect their functionality would still be restricted by the Facebook API.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Enforced Sign Up&lt;/strong&gt;&lt;br /&gt;
- Can you imagine being told you have to sign up to Facebook at work? its an extreme but I suspect that people would have dramatically different relationships with Facebook.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fewer Distraction?&lt;/strong&gt;&lt;br /&gt;
-I&#39;m not going to go as far as to say that I waste my time on Facebook but it has been known to distract me from work in the past, regular Facebook users may not notice work related news feed items between all the &amp;quot;noise&amp;quot; generated by their non-work related updates.&lt;/p&gt;
&lt;p&gt;There are also some other considerations when building a business app for Facebook:&lt;/p&gt;
&lt;p&gt;I don&#39;t want to step into the open vs closed debate but lets be honest, Facebooks API is restrictive and I suspect that the desire to maintain consistency and control has reduced peoples ability innovate. A browse through the Facebook application directory really doesn&#39;t return a wide array of useful apps, mostly annoying games. I would love to integrate my dhtml phone into Facebook but as all javascript is removed Iwould have to hack my way round, leaving my app liable to be broken as soon as facebook figure out what im doing. I know the guys at Facebook have just recently provided some javascript access but I have not tested it yet.&lt;/p&gt;
&lt;p&gt;this is another big point, can you really have an app thats going to become business critical reliant on systems over which you have no control or contracted support? APIs can be changed with little or in some cases no notice.&lt;/p&gt;
&lt;p&gt;Each Facebook application is limited in the number of posting it can make to a user&#39;s news feed on a given day (currently 10 I believe), to me this is yet another problem, I still need to see my 11th news feed item of the day. If a system was being heavily used I would expect up to 20-30 per day, this would of course be configurable:&lt;/p&gt;
&lt;p&gt;update my news feed when I receive an email.&lt;br /&gt;
update my news feed on the activity of these people:&lt;br /&gt;
Update my news feed on activity to do with these project:&lt;br /&gt;
update my news feed when these document (collaborative wikis and blogs) are changed&lt;br /&gt;
update my news feed when something is tagged ________&lt;br /&gt;
update my news feed when someone searches for __________&lt;br /&gt;
don&#39;t update my news feed when....&lt;br /&gt;
This brings me to a fascinating search engine optimization (SEO) type article: &lt;a href=&quot;http://www.insidefacebook.com/2007/07/16/inside-facebook-nfo-is-the-new-seo/&quot; title=&quot;http://www.insidefacebook.com/2007/07/16/inside-facebook-nfo-is-the-new-seo/&quot;&gt;Inside Facebook, NFO (News Feed Optimization) is the new SEO&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Do you really want to be in a situation where the business has to pay for your items to appear at the top of peoples news feed?&lt;/p&gt;
&lt;p&gt;So one possible answer to this is for Facebook build an enterprise/professional tab, allowing people to differentiate between their work and personal lives while still showing the inevitable connections. It would also need to include more useful business related applications such as blogs, wikis and file stores. This could create a whole new market for enterprise Facebook apps.&lt;/p&gt;
&lt;p&gt;Since playing around with the API my relationship has changed with Facebook, my initial reaction after logging is now to goto my profile page to test my application, My news feed is very much a constantly changing blur and I am rarely able to keep up. I&#39;m not sure if it is the &#39;noise&#39; or maybe seeing some of the problems with the API has taken away the sleek near perfect view I had of Facebook when I was just a user. The reason I raise the slightly obscure point is because I think it will be interesting to see how people would relate to Facebook should it be required of them at work.&lt;/p&gt;
&lt;p&gt;So I have probably asked a lot more questions that I have answered in the above post so I should attempt to conclude in some way shape or form. So, Facebook while it deserves all the attention its gets it is just another internet craze. While its closed source its only the people at Facebook who can really provide the functionality we require. In a lot of cases I suspect they won&#39;t. As with any craze it will pass, people will find a new killer web app and we will be trying to work out how we can maximize our effectiveness by using it. We have to understand and respect this. Any solution that relies on Facebook will probably become redundant when net users find another killer social networking site. We need to be thinking about applications which can be completely independent and just pump their data in and out of the latest social networking tools.&lt;/p&gt;
&lt;p&gt;lastly - thank you for reading this far, as I have written this post my views have actually evolved. I hope you found this thought provoking.&lt;/p&gt;
&lt;p&gt;comments welcome.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Get your friends details out of Facebook</title>
    <link href="https://simonmcmanus.com/posts/get-your-friends-details-out-of-facebook/"/>
    <updated>2007-08-09T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/get-your-friends-details-out-of-facebook/</id>
    <content type="html">&lt;p&gt;The below code outputs a HTML table showing all of your facebook friends and their details.  You will need to include the code on a PHP server where you have already registered your application.&lt;/p&gt;
&lt;p&gt;This code is far from finished, but provides a very good starting point because it shows how you can access each of the variables.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;&amp;lt;?php
require&#92;_once &#39;facebook.php&#39;;
$friends = $facebook-&amp;gt;api&#92;_client-&amp;gt;friends&#92;_get();
echo &#39;&amp;lt;table border=1&amp;gt;&#39;;
foreach($friends as $friend)
{
    echo &#39;&amp;lt;tr&amp;gt;&#39;;
    echo &#39;&amp;lt;td&amp;gt;&#39;;
    $name = $facebook-&amp;gt;api&#92;_client-&amp;gt;users&#92;_getInfo($friend,&#39;name, pic&#92;_small, birthday, sex, hometown&#92;_location, meeting&#92;_sex, meeting&#92;_for, affiliations, relationship&#92;_status, significant&#92;_other&#92;_id, political, current&#92;_location, activities, interests, music, tv, about&#92;_me, work&#92;_history, education&#92;_history, status&#39;);
    echo &amp;quot;&amp;lt;img src=&#39;&amp;quot;.str&#92;_replace(&#39;/http&#39;, &#39;&#39;, str&#92;_replace(&#39;.jpg/&#39;,&#39;&#39;, $name&#92;[0&#92;]&#92;[pic&#92;_small&#92;])).&amp;quot;&#39;/&amp;gt;&amp;quot;;
  
    echo &#39; &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&#39;;
    echo $name&#92;[0&#92;]&#92;[name&#92;];
    echo &#39; &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&#39;;
    echo $name&#92;[0&#92;]&#92;[birthday&#92;];
    echo &#39; &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&#39;;
    echo $name&#92;[0&#92;]&#92;[sex&#92;];
    echo &#39;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&#39;;
    echo $name&#92;[0&#92;]&#92;[hometown&#92;_location&#92;]&#92;[city&#92;].&#39;, &#39;;
    echo $name&#92;[0&#92;]&#92;[hometown&#92;_location&#92;]&#92;[state&#92;].&#39;, &#39;;
    echo $name&#92;[0&#92;]&#92;[hometown&#92;_location&#92;]&#92;[country&#92;].&#39;, &#39;;
    echo &#39;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&#39;;
    echo $name&#92;[0&#92;]&#92;[meeting&#92;_sex&#92;];
    echo &#39;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&#39;;
    echo $name&#92;[0&#92;]&#92;[meeting&#92;_for&#92;];
    echo &#39; &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&#39;;
    echo &#39; &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&#39;;
//    echo var&#92;_dump($name&#92;[0&#92;]&#92;[affiliations&#92;]);
    foreach ($name&#92;[0&#92;]&#92;[affiliations&#92;] as $aff)
    {
    echo &#39;&amp;lt;ul&amp;gt;&#39;;
        foreach ($aff as $aff&#92;_det)
            echo &#39;&amp;lt;li&amp;gt;&#39;.$aff&#92;_det.&#39;&amp;lt;/li&amp;gt;&#39;;
    echo &#39;&amp;lt;/ul&amp;gt;&#39;;
    }
    echo &#39; &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&#39;;
    echo $name&#92;[0&#92;]&#92;[relationship&#92;_status&#92;];
    echo &#39;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&#39;;
    echo $name&#92;[0&#92;]&#92;[significant&#92;_other&#92;_id&#92;];
    echo &#39; &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&#39;;

    echo $name&#92;[0&#92;]&#92;[political&#92;];

    echo &#39;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&#39;;

    echo &#39;&amp;lt;ul&amp;gt;&#39;;

    foreach ($name&#92;[0&#92;]&#92;[current&#92;_location&#92;] as $aff)
    echo &#39;&amp;lt;li&amp;gt;&#39;.$aff.&#39;&amp;lt;/li&amp;gt;&#39;;
    echo &#39;&amp;lt;/ul&amp;gt;&#39;;
    //echo $name&#92;[0&#92;]&#92;[current&#92;_location&#92;];
    echo &#39;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&#39;;
    echo $name&#92;[0&#92;]&#92;[activities&#92;];
    echo &#39; &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&#39;;
    echo $name&#92;[0&#92;]&#92;[interests&#92;];
    echo &#39; &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&#39;;
    echo $name&#92;[0&#92;]&#92;[music&#92;];
    echo &#39;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&#39;;
    echo $name&#92;[0&#92;]&#92;[tv&#92;];
    echo &#39; &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&#39;;
    echo $name&#92;[0&#92;]&#92;[about&#92;_me&#92;];
    echo &#39; &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&#39;;
    echo $name&#92;[0&#92;]&#92;[work&#92;_history&#92;];
    echo &#39; &amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&#39;;
        foreach ($name&#92;[0&#92;]&#92;[education&#92;_history&#92;] as $aff)
    {
    echo &#39;&amp;lt;ul&amp;gt;&#39;;
        foreach ($aff as $aff&#92;_det)
        {
            echo &#39;&amp;lt;li&amp;gt;&#39;;

            echo arrayToXML($aff&#92;_det);
            echo &#39;&amp;lt;/li&amp;gt;&#39;;
        }
    echo &#39;&amp;lt;/ul&amp;gt;&#39;;

    }

    //echo $name&#92;[0&#92;]&#92;[education&#92;_history&#92;];

    echo &#39;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&#39;;
    if ($name&#92;[0&#92;]&#92;[status&#92;]&#92;[time&#92;]!=0)
        echo $name&#92;[0&#92;]&#92;[status&#92;]&#92;[message&#92;].&#39; - &#39;.date(&amp;quot;Y/m/d&amp;quot;, $name&#92;[0&#92;]&#92;[status&#92;]&#92;[time&#92;]).&#39;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&#39;;
}
  
echo &#39;&amp;lt;/table&amp;gt;&#39;;

?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
  
  <entry>
    <title>Steps for setting up the SDK</title>
    <link href="https://simonmcmanus.com/posts/steps-for-setting-up-the-sdk/"/>
    <updated>2007-08-13T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/steps-for-setting-up-the-sdk/</id>
    <content type="html">&lt;p&gt;For a number of BT Osmosoft demos we have demonstrated how to make phone calls from within a TiddlyWiki, I thought i would provide a post which explains exactly what we did in order to set up the PHP side of these demos.&lt;/p&gt;
&lt;p&gt;The demo I am refering to can be found at the following URL&#39;s:&lt;/p&gt;
&lt;p&gt;- &lt;a href=&quot;http://osmosoft.com/events/speedgeeking/&quot; title=&quot;Speed Geeking&quot;&gt;Speed Geeking&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Step 1 You need a web server running :&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;PHP 5.2&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;OpenSSL and SOAP PHP extensions&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Step 2 - Register for an account at &lt;a href=&quot;http://sdk.bt.com/&quot;&gt;http://sdk.bt.com/&lt;/a&gt;&lt;/h2&gt;
&lt;h2&gt;Step 3 - Download the PHP source files: Downloads &amp;gt; PH&lt;strong&gt;P&lt;/strong&gt;&lt;/h2&gt;
&lt;h2&gt;Step 4 - Upload the files to a folder on your web server.&lt;/h2&gt;
&lt;h2&gt;Step 5 -  Registering your applications...&lt;/h2&gt;
&lt;p&gt;Note : Before you can use the SDK you will need to register an application (One registration covers all of your programs)&lt;/p&gt;
&lt;p&gt;You can register application at the URL below:&lt;/p&gt;
&lt;p&gt;https://sdk.bt.com/Default.aspx?TabId=127&lt;/p&gt;
&lt;p&gt;In order to run the certificate generation tool you may need  the latest version of “Java Runtime Environment (JRE)”  from &lt;a href=&quot;http://java.sun.com/javase/downloads/index.jsp&quot;&gt;http://java.sun.com/javase/downloads/index.jsp&lt;/a&gt; (you will receive an error when attempting to run the tool if you require this upgrade.)&lt;/p&gt;
&lt;p&gt;When you use the tool 3 files will be generated on your desktop. (I called my app Umbrella)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;_APPLICATIONNAME&#92;_Sandbox&#92;_PrivateKey.pem_  
  
_APPLICATIONNAME&#92;_Sandbox&#92;_PublicKey.pem_  
  
_APPLICAIONNAME&#92;_Sandbox&#92;_SignedCert.pem_  

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Two of those files :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  
_APPLICATIONNAME&#92;_Sandbox&#92;_PrivateKey.pem_  
  
_APPLICAIONNAME&#92;_Sandbox&#92;_SignedCert.pem_  

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Should then be place in a folder called keys (which you may need to create).&lt;/p&gt;
&lt;h2&gt;Step 6 - Open the common.php file which can be found in the folder:&lt;/h2&gt;
&lt;p&gt;&#92;examples&#92;common.php&lt;/p&gt;
&lt;h2&gt;Step 7  - Ensure that the application name is the same as the one specified when generating your certificate**.**&lt;/h2&gt;
&lt;h2&gt;Step 9  - Running the code.  If you have used the default installation settings go to and edit the file:&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;&#92;&#92;examples&#92;&#92;cmds&#92;&#92;makeCall.php  
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Change the variables for :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$calling = “tel:+44791″;  
  
$called = “tel:+44791″;  
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You will need to modify these two lines so that they can receive an input from the URL, I would suggest changing these to:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$calling =&#39;tel:&#39;.$&#92;_REQUEST&#92;[&#39;callingParty&#39;&#92;];  
  
$called = &#39;tel:&#39;.$&#92;_REQUEST&#92;[&#39;calledParty&#39;&#92;] ;  
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You will need to ensure that the variable names are the same as the variables sent my TiddlyWiki.&lt;/p&gt;
&lt;p&gt;Let me know if you have any problems.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Enterprise TiddlyWiki</title>
    <link href="https://simonmcmanus.com/posts/enterprise-tiddlywiki/"/>
    <updated>2007-08-14T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/enterprise-tiddlywiki/</id>
    <content type="html">&lt;p&gt;TiddlyWiki has been used for a number of years to organise information, what requirements would an enterprise version of TiddlyWiki have?&lt;/p&gt;
&lt;p&gt;TiddlyWiki can be used in the enterprise as a collaboration tool allowing multiple users to contribute to a single TiddlyWiki. In this particular instance we wish to build a sit allowing BT staff to have their own personal Wikis on the intranet.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SiteMinder&lt;/strong&gt; is the default authentication method used for all BT applications (both internal and external.) In order to conform to BT&#39;s security policy the authentication and authorization will have to be done through SiteMinder. More details about this will be provided soon.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;History and Auditing&lt;/strong&gt; - The system should be able to see all the previous revisions of a document and see who has made each of the changes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Site Structure&lt;/strong&gt; - When a user first visits the site a TiddlyWiki homepage should be created for them. The URL should take the form :&lt;/p&gt;
&lt;p&gt;&lt;em&gt;tiddlyfarm.intra.bt.com/simon.mcmanus/&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;which would be extracted from my email address.&lt;/p&gt;
&lt;p&gt;Any pages which I then create should be made as sub folders of simon.mcmanus. e.g.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;tiddlyfarm.intra.bt.com/simon.mcmanus/todolist/&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The idea of this is to give users their own space on the BT intranet where they can store many TiddlyWikis.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>social network aggregator</title>
    <link href="https://simonmcmanus.com/posts/social-network-aggregator/"/>
    <updated>2007-08-16T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/social-network-aggregator/</id>
    <content type="html">&lt;p&gt;I recently read an article which pointed out that a social networks value is more affected by the connections made between contacts than by the number of people in the given network.&lt;/p&gt;
&lt;p&gt;This is so true, Facebook does so well because its very easy to define connections. Despite its issues Facebook is also actually quite inclusive, It can pull in my Wordpress blog and there are a number of applications which can pull external data into Facebook. This is also one of Facebook big strengths, to be able to see an aggregated view of your networks recent activity from various sources on the internet.&lt;/p&gt;
&lt;p&gt;Where Facebook really lets us down is by not letting us access that aggregated view through any platform other than Facebook. In Facebook you can also only import contacts from MSN. The ability to import from a number of sources (one of which being facebook) Will make a real difference to a Facebook for the enterprise.&lt;/p&gt;
&lt;p&gt;To start of with I would like to import my contacts from&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Facebook&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Internal MSN&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;External MSN&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;My Mobile Phone&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Microsoft Communicator&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;By pulling in the data from so many sources we are going to be able to show more relationships and possibly know more about the relationships. I would then want to store internet assets (blogs wikis) against a de-duplicated list of my contacts. In such a setup users would be encouraged to publish information onto public blogs.&lt;/p&gt;
&lt;p&gt;I had lunch with Jon Lister today and we had an interesting discussion about the implications of actively encouraging a companies employees to blog about what they are working on. As John pointed out while you give away a small advantage by telling people what you are doing you also get to learn a great deal from the other peoples comments and feedback.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Those Fuckers at Facebook - Part Two</title>
    <link href="https://simonmcmanus.com/posts/those-fuckers-at-facebook-part-two/"/>
    <updated>2007-09-13T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/those-fuckers-at-facebook-part-two/</id>
    <content type="html">&lt;p&gt;So it appears that my facebook applications still doesnt work.  Its been at least 15 hours since mock Ajax worked and I have been getting reports that the issue started (albeit intermittently)  about 32 hours ago.&lt;/p&gt;
&lt;p&gt;I have previously blogged about the dangers of any application that relies on an external platform over which we have not contractual support, i think this highlights the issue, but most of all makes facebook look very bad.&lt;/p&gt;
&lt;p&gt;At my demo tomorrow I can explain the situation and providing mock ajax still works on the beta platform use that.  With that said it is really not the point.   Since this morning I have been closely watching the developer forum and have been popped in and out of the facebook IRC channel.   What have facebook said? Absolutely nothing, 15 hours into the issue facebook have still not even ackolwedged the issue exists.&lt;/p&gt;
&lt;p&gt;There is no way that Facebook can continue to piss of the developers who ultimately they rely on for the further expansion and inovation around their platform.    In the enterprise environment there would be very clearly defined SLA&#39;s for service up time, change notifications, support fix times etc.&lt;/p&gt;
&lt;p&gt;Lets hope facebook learn from this and start to provide some kind of SLA (any level of service would be nice.) As developers we may not pay them money but we are  a massive part of their business model and I think we deserve some respect.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Those Fuckers at Facebook - trying to hush me up.</title>
    <link href="https://simonmcmanus.com/posts/those-fuckers-at-facebook-trying-to-hush-me-up/"/>
    <updated>2007-09-13T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/those-fuckers-at-facebook-trying-to-hush-me-up/</id>
    <content type="html">&lt;p&gt;Hahahaha, I have been posting links to my last two blog posts on the developer forum on facebook, not sure if i have just sent too many  messages or someone is trying to hush me up!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://simonmcmanus.files.wordpress.com/2007/09/picture-4.png&quot; alt=&quot;picture-4.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I would love an explaination but think they have more important things to be worrying about at the moment.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Server Side TiddlyWikis</title>
    <link href="https://simonmcmanus.com/posts/server-side-tiddlywikis/"/>
    <updated>2007-09-14T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/server-side-tiddlywikis/</id>
    <content type="html">&lt;p&gt;This post is a work in progress trying to summarize the different server side tiddlywikis.&lt;/p&gt;
&lt;p&gt;the existence of a database is not being seen as an advantage or disadvantage at this point. This is a work in progress but if you see any glaring omissions then please comment or send me a mail. Thanks.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://tiddlyhome.bidix.info/&quot; title=&quot;TiddlyHome&quot;&gt;&lt;strong&gt;TiddlyHome&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The main fetaures are :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;BSD open source license&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;written in PHP, no database&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Based on UploadPlugin&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;All User management in .htpasswd&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;All control access in .htaccess&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;All admin tasks from a dedicated TiddlyWiki&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;User Options and Site Options accessible from TiddlyWiki&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;and much more ...&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The next step will be :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GroupAuthoring support&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;database back end&lt;/strong&gt; : no&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;multi user&lt;/strong&gt; : functionality already present - UI could be improved.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;multi instance&lt;/strong&gt; :functionality already present - UI could be improved.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tiddlywiki Upgrade&lt;/strong&gt; : ? currently using TW 2.2.5&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Strengths&lt;/strong&gt; : Makes good use of native apache functionality&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Weaknesses&lt;/strong&gt; : The UI requires work. Still in the Beta stages.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://patrickcurry.com/tiddly/&quot; title=&quot;PHPTiddlyWiki&quot;&gt;&lt;strong&gt;PHPTiddlyWiki&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;database back end&lt;/strong&gt; : yes&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;multi user&lt;/strong&gt; : yes&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;multi instance&lt;/strong&gt; : would require work store the tiddlers in relation to a TiddlyWiki instance.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tiddlywiki Upgrade&lt;/strong&gt; :Javascript code is stored in two php files. tiddly1 and tiddly2.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Strengths&lt;/strong&gt; :simple install and config.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Weaknesses&lt;/strong&gt; : No login, code not being maintained.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.minitiddlyserver.com/&quot; title=&quot;Mini Tiddly Server&quot;&gt;&lt;strong&gt;Mini Tiddly Server&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;New Features&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;compatible with TW2.2 and older.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;autodetect TW core and save accordingly&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;unicode fix, solves issues with international characters.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;improved error handling and recovery.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;various bug fixes to the saving routine.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;improved download link. Just click it!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;http://tiddlysnip.com/&quot; title=&quot;//tiddlysnip.com&quot;&gt;TiddlySnip&lt;/a&gt; support.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;database back end :&lt;/strong&gt; no&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;multi user :&lt;/strong&gt; no&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tiddlywiki Upgrade:&lt;/strong&gt; store in a single file on the server.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Strengths :&lt;/strong&gt; password authentication present&lt;/p&gt;
&lt;p&gt;**Weaknesses: ** install process has some issues.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://cctiddly.sourceforge.net/&quot; title=&quot;ccTiddlyWiki&quot;&gt;&lt;strong&gt;ccTiddlyWiki&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;database back end&lt;/strong&gt; : yes&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;multi user&lt;/strong&gt; : yes - there can be many users for the same workspace.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;multi instance&lt;/strong&gt; : would require work store the tiddlers in relation to a TiddlyWiki instance.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tiddlywiki Upgrade&lt;/strong&gt; : js code stored on the server.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Strengths&lt;/strong&gt; : password authentication already present but the may not be relevant as SiteMinder will be used for login.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Weaknesses&lt;/strong&gt; : code not being maintained. Possible problem with login variables being stored in server variables, could be a problem with multiple instances running on the same server.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Writing to the Facebook News feed.</title>
    <link href="https://simonmcmanus.com/posts/writing-to-the-facebook-news-feed/"/>
    <updated>2007-09-15T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/writing-to-the-facebook-news-feed/</id>
    <content type="html">&lt;p&gt;I have been modifying the mock &lt;a href=&quot;https://simonmcmanus.com/posts/mock-ajax-in-facebook/&quot; title=&quot;mock ajax example&quot;&gt;ajax example.&lt;/a&gt; This code is used in response.php, it takes two variables which need to be posted in through forms. This code requires facebookid and viewer_facefacebookid to be passed in from a form to look up the names and then the data is sent in from the data variable.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;require&#92;_once(&#39;appinclude.php&#39;);
$name&#92;_to = $facebook-&amp;gt;api&#92;_client-&amp;gt;users&#92;_getInfo($&#92;_POST&#92;[&#39;facebookid&#39;&#92;],&#39;name, pic&#92;_small&#39;);
$name&#92;_from = $facebook-&amp;gt;api&#92;_client-&amp;gt;users&#92;_getInfo($&#92;_POST&#92;[&#39;viewer&#92;_facebookid&#39;&#92;],&#39;name, pic&#92;_small&#39;);
$title = $name&#92;_to&#92;[0&#92;]&#92;[name&#92;].&#39; was sent the following text by &#39;.$name&#92;_from&#92;[0&#92;]&#92;[name&#92;].&#39; from the &amp;lt;a href=http://apps.facebook.com/mojomob&amp;gt;Mojo Application&amp;lt;/a&amp;gt;&#39;;
$body = $&#92;_POST&#92;[&#39;data&#39;&#92;];
$facebook-&amp;gt;api&#92;_client-&amp;gt;feed&#92;_publishStoryToUser($title, $body);
$facebook-&amp;gt;api&#92;_client-&amp;gt;feed&#92;_publishActionOfUser($title, $body);
exit;
&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
  
  <entry>
    <title>The Osmosoft Social Network - Elgg</title>
    <link href="https://simonmcmanus.com/posts/the-osmosoft-social-network-elgg/"/>
    <updated>2007-09-19T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/the-osmosoft-social-network-elgg/</id>
    <content type="html">&lt;p&gt;I have always found social networking sites fascinating, so when i got the opportunity to install &lt;a href=&quot;http://elgg.org/&quot; title=&quot;Elgg&quot;&gt;Elgg&lt;/a&gt; I jumped high in the air. So what is elgg? In its own words :&lt;/p&gt;
&lt;p&gt;&amp;quot;Elgg is an open source social platform based around choice, flexibility and openness: a system that firmly places individuals at the centre of their activities.&amp;quot;&lt;/p&gt;
&lt;p&gt;In BT we are keen to understand social networks. We love facebook, but we know it has some openness issues. I have previously asked the question what would happen if Facebook were to be open sourced? Well here we have an app that is open source and does facebook type stuff.&lt;/p&gt;
&lt;p&gt;So at a first glance it looks nice : &lt;a href=&quot;https://simonmcmanus.files.wordpress.com/2007/09/picture-5.png&quot; title=&quot;picture-5.png&quot;&gt;&lt;img src=&quot;https://simonmcmanus.files.wordpress.com/2007/09/picture-5.png&quot; alt=&quot;picture-5.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You get all the things you would expect, most notably RSS everywhere. The problem with social networking applications is that its very hard to evaluate them when you are the only user.&lt;/p&gt;
&lt;p&gt;So &lt;a href=&quot;http://osmosoft.servehttp.com/elgg/&quot; title=&quot;Join Elgg&quot;&gt;here&lt;/a&gt; is the link if anyone would like to log in and try using Elgg,&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://osmosoft.servehttp.com/elgg/&quot; title=&quot;http://osmosoft.servehttp.com/elgg/  &quot;&gt;http://osmosoft.servehttp.com/elgg/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Please be aware that this is only an experimental instance for you and I to look around and play with. It is in no way a permanent installation. If you have any views on Elgg then please let me know.&lt;/p&gt;
&lt;p&gt;There &lt;a href=&quot;http://elgg.org/mod/plugins/&quot; title=&quot;wide selection of elgg plugins&quot;&gt;is a wide selection of Plugin,&lt;/a&gt; if you would like me to make any particular ones available please let me know.&lt;/p&gt;
&lt;p&gt;In the Osmosoft offices we recently tried Mash which Yahoos answer to Facebook. Its nice but is also another social network to add to a long list. I cant help but think that the next big thing will be something that allows you to centrally control your identity across all the social networks. Where facebook fits into that we will have to wait and see. Most facebook users are not even aware they cannot export their data. It will be interesting to see how peoples view of facebook changes as they realise their data is trapped inside.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Hacking for a Wii.</title>
    <link href="https://simonmcmanus.com/posts/hacking-for-a-wii/"/>
    <updated>2007-09-24T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/hacking-for-a-wii/</id>
    <content type="html">&lt;p&gt;Last Monday Osmosoft purchased its first games console, the Wii. One of the conditions of the office having a Wii was that we needed to do something cool (and not just play games) by the Friday.&lt;/p&gt;
&lt;p&gt;What with TiddlyWiki&#39;s third year anniversary also being on the Friday it proved an interesting week.&lt;/p&gt;
&lt;p&gt;So my first mission was to find some way of detecting movement from the Wii controllers, I have seen a number of demos showing the &lt;a href=&quot;http://mike.verdone.ca/wiitomidi/&quot; title=&quot;wii controlling midi interface&quot;&gt;wii controlling a Midi interfaces&lt;/a&gt; but my distinct lack of a midi interface proved a problem here.&lt;/p&gt;
&lt;p&gt;I managed to find a number of apps which let me control my mac from the Wii controller &lt;a href=&quot;http://wiibrew.org/index.php?title=List_of_Wii_Applications&quot; title=&quot;control aps from your wii controller&quot;&gt;here&lt;/a&gt;. Eventually I found a site which provides example javascript code demonstrating how to read the Wii controller coordinates as variables!&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://hullbreachonline.com/wii/sdk.html&quot; title=&quot;javscript wii controller code&quot;&gt;Javascript Wii Controller Code&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Unfortunately you cannot detect false feedback on the controllers but we can we could access X, ,Y Distance and rotation co-ordinates from the controller when being viewed through Opera on the Wii (the code does not work when hooked up to the PC)&lt;/p&gt;
&lt;p&gt;So at this point I had the idea to turn the code powering the wall demo into a navigation tool for &lt;a href=&quot;http://tiddlywiki.com/&quot; title=&quot;TiddlyWiki&quot;&gt;TidllyWiki.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We uesd&lt;a href=&quot;http://tw.lewcid.org/&quot; title=&quot;Ful screen tw&quot;&gt;&lt;/a&gt; &lt;a href=&quot;http://tw.lewcid.org/&quot;&gt;Saqs&lt;/a&gt; full screen TiddlyWiki plugin as the basis, when we had built the code to detect the left and right motion we then combined it with Saqs plugin (he was visiting the office for the TW anniversary which made he particularly accessible)&lt;/p&gt;
&lt;p&gt;The end result can be loaded onto a Wii from the URL below:&lt;/p&gt;
&lt;p&gt;http://osmosoft.servehttp.com/wii/a.htm&lt;/p&gt;
&lt;p&gt;and you can watch video of the result on &lt;a href=&quot;http://www.youtube.com/watch?v=8AX_uEzVVnU&quot;&gt;youtube.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[youtube=http://www.youtube.com/watch?v=8AX_uEzVVnU]&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Giving TiddlyWiki a rest......MYSQL to REST in PHP.</title>
    <link href="https://simonmcmanus.com/posts/giving-tiddlywiki-a-restmysql-to-rest-in-php/"/>
    <updated>2007-09-25T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/giving-tiddlywiki-a-restmysql-to-rest-in-php/</id>
    <content type="html">&lt;p&gt;As part of my server side TiddlyWiki work we are looking at building a REST interface where TiddlyWikis can store their tiddlers.   I was doing some research into ways of providing a REST interface to MySQL datbases.&lt;/p&gt;
&lt;p&gt;I found this great bit of code:&lt;/p&gt;
&lt;p&gt;http://phprestsql.sourceforge.net/&lt;/p&gt;
&lt;p&gt;You simply point the project at a database on your server and it provides a REST interface into your MySQL database.   In order to get the code working you simply need to copy the folder into your working directory and change the phprestsql.ini file to reflect your settings.&lt;/p&gt;
&lt;p&gt;One problem that I noticed was that the .htaccess files is lost when the file is zipped.  To get the app working you simple need to create a .htaccess file in your working directory and copy the text below :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;RewriteEngine On
  
RewriteCond %{REQUEST&#92;_FILENAME} !-d
  
RewriteCond %{REQUEST&#92;_FILENAME} !-f
  
#RewriteRule ^.&#92;*$ index.php
  
RewriteRule ^.&#92;*$ /rest/index.php
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In this case the working directory was /rest/&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Macro template for TiddlyWiki</title>
    <link href="https://simonmcmanus.com/posts/macro-template-for-tiddlywiki/"/>
    <updated>2007-10-16T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/macro-template-for-tiddlywiki/</id>
    <content type="html">&lt;p&gt;This code provides a template for creating Macros. When tagged systemConfig this macro can be called  using &amp;lt;&lt;exampleplugin&gt;&amp;gt;&lt;/exampleplugin&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;/***
|&#39;&#39;Name:&#39;&#39;|ExamplePlugin|
|&#39;&#39;Description:&#39;&#39;|To demonstrate how to write TiddlyWiki plugins|
|&#39;&#39;Version:&#39;&#39;|2.0.3|
|&#39;&#39;Date:&#39;&#39;|Sep 22, 2006|
|&#39;&#39;Source:&#39;&#39;|http://www.tiddlywiki.com/#ExamplePlugin|
|&#39;&#39;Author:&#39;&#39;|SimonMcManus|
|&#39;&#39;License:&#39;&#39;|&#92;[&#92;[BSD open source license&#92;]&#92;]|
|&#39;&#39;~CoreVersion:&#39;&#39;|2.1.0|
|&#39;&#39;Browser:&#39;&#39;|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|
***/
config.macros.exampleplugin = {
    handler: function() {
        alert(&#39;here&#39;);
    }
}
&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
  
  <entry>
    <title>Output text into a Tiddler without changing the tiddler - macro</title>
    <link href="https://simonmcmanus.com/posts/output-text-into-a-tiddler-without-changing-the-tiddler-macro/"/>
    <updated>2007-10-17T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/output-text-into-a-tiddler-without-changing-the-tiddler-macro/</id>
    <content type="html">&lt;p&gt;This macro combines the last two posts with a new bit of code from Phil Hawksworth. The code lets you output text into the a tiddler using a macro, without actually changing the contents of the tiddler.&lt;/p&gt;
&lt;p&gt;So the end result is that output from the .php file is shown in any macro which contains &amp;lt;&lt;ccConfig&gt;&amp;gt; but the tiddler content is not actually change.&lt;/ccConfig&gt;&lt;/p&gt;
&lt;p&gt;The aim here is to be able to manage users and your config for ccTiddly from Tiddlers.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;/&#92;*&#92;*&#92;*
|&#39;&#39;Name:&#39;&#39;|ccConfig|
|&#39;&#39;Description:&#39;&#39;|Lets you configure ccTiddly|
|&#39;&#39;Version:&#39;&#39;|2.0.3|
|&#39;&#39;Date:&#39;&#39;|Sep 22, 2006|
|&#39;&#39;Author:&#39;&#39;|SimonMcManus|
|&#39;&#39;License:&#39;&#39;|&#92;[&#92;[BSD open source license&#92;]&#92;]|
|&#39;&#39;~CoreVersion:&#39;&#39;|2.1.0|
|&#39;&#39;Browser:&#39;&#39;|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|
&#92;*&#92;*&#92;*/
    config.macros.ccConfig = {
        handler: function(place,macroName,params,wikifier,paramString,tiddler) {
    
            function callback(status,params,responseText,xhr) {
                    createTiddlyLink(place,responseText,true);
            }
            params = {};
            params.title =tiddler.title;
            var a = doHttp(&#39;GET&#39;, &#39;http://127.0.0.1/cctw&#92;_tw/cctiddly/handle/index.php&#39;,null,null,null,null,callback,params);
        }
    }
&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
  
  <entry>
    <title>Macs in BTC</title>
    <link href="https://simonmcmanus.com/posts/macs-in-btc/"/>
    <updated>2007-10-19T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/macs-in-btc/</id>
    <content type="html">&lt;p&gt;Thanks to &lt;a href=&quot;http://www.facebook.com/profile.php?id=663022342&quot;&gt;Anna Carlson&lt;/a&gt;  for this picture.   Taken in BTC at the last London Barcamp.  Spot the non-mac.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Enable and use Mod-Rewrite</title>
    <link href="https://simonmcmanus.com/posts/enable-and-use-mod-rewrite/"/>
    <updated>2007-10-22T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/enable-and-use-mod-rewrite/</id>
    <content type="html">&lt;p&gt;Mod rewrite is a great way to manipulate URLs. In this post I hope to explain how to get Mod-rewrite set up and working:&lt;/p&gt;
&lt;p&gt;Firstly we need to make sure that apache has been set up correctly, this requires us to check our httpd.conf file :&lt;br /&gt;
This line:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;LoadModule rewrite&#92;_module modules/mod&#92;_rewrite.so
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;should be uncommented (the starting hash removed)&lt;/p&gt;
&lt;p&gt;Some apache configurations also require you to uncomment :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt; AddModule mod&#92;_rewrite.c
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You will also need to allow .htaccess files to change your apache config. You can do this by ensuring that the AllowOverride option is set to all :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;    #
  
    # AllowOverride controls what directives may be placed in .htaccess files.
  
    # It can be &amp;quot;All&amp;quot;, &amp;quot;None&amp;quot;, or any combination of the keywords:
  
    #   Options FileInfo AuthConfig Limit
  
    #
  
    AllowOverride All
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We then just need to restart apache for our settings to take effect. When apache has restarted we can get started. We do mod-rewrite stuff in .htaccess files. I reccomend creating your .htaccess file in some kind of FTP client as both the Mac Finder and Windows Explorer dont like to create files starting with a dot. (they are reserved for system/hidden files)&lt;/p&gt;
&lt;p&gt;When you have created the .htaccess file you simple need to add the below code :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;RewriteEngine On
  
RewriteCond %{REQUEST&#92;_FILENAME} !-d
  
RewriteCond %{REQUEST&#92;_FILENAME} !-f
  
RewriteRule ^.&#92;* /shared/index.php
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You should change the last line to reflect a file which actually exists.&lt;/p&gt;
&lt;h4&gt;What have I done?&lt;/h4&gt;
&lt;p&gt;While it might seem complex what you have just done is incredibly simple, any request recieved by the folder containing your .htaccess file (and folders below it) will be directed to the .htaccess file.&lt;/p&gt;
&lt;p&gt;In this particular case our .htaccess file looks to see if the request exists as a file or directory, if it does not the request is passed on to /shared/index.php on the server. So if we put the .htaccess file in our root directory all the below URLs would actually point to the same file (/shared/index.php)&lt;/p&gt;
&lt;p&gt;osmosoft.com/wordpress&lt;/p&gt;
&lt;p&gt;osmosoft.com/typo&lt;/p&gt;
&lt;p&gt;osmosoft.com/BLAHNLASD&lt;/p&gt;
&lt;h4&gt;Where do I go from here?&lt;/h4&gt;
&lt;p&gt;Now you need to change /shared/index.php to display different things based on the URL, the simplist way I have found to do this is by breaking up the URL into variables and then proccessing them in index.php. eg:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;&amp;lt;?php
$url = split(&#39;/&#39;, $&#92;_SERVER&#92;[&#39;PHP&#92;_SELF&#39;&#92;]);
$instance =  $url&#92;[1&#92;];

?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
  
  <entry>
    <title>Facebook Screen Scraping - Get your friends back from Facebook and into TiddlyWiki!</title>
    <link href="https://simonmcmanus.com/posts/facebook-screen-scraping-get-your-friends-back-from-facebook-and-into-tiddlywiki!/"/>
    <updated>2007-10-23T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/facebook-screen-scraping-get-your-friends-back-from-facebook-and-into-tiddlywiki!/</id>
    <content type="html">&lt;p&gt;One of the great things about TiddlyWiki is that it can import information from any number of sources, what with all the fuss going on around the walled gardens of facebook this seemed like a great application. This is not a finished application, far from it. It does however prove that you can get your information back from facebook in a form you can control.&lt;/p&gt;
&lt;p&gt;In this particular example I have only extracted the list of friends. The code is also there to import your news feed (from which you could then generate an RSS feed!) although it requires some more coding to get it working. Currently there are two lines in the recipe file which are commented out :&lt;/p&gt;
&lt;p&gt;#tiddler: ../../feeds/FacebookNewsFeed.tiddler&lt;br /&gt;
#tiddler: ../../adaptors/FacebookNewsAdaptorPlugin.js&lt;/p&gt;
&lt;p&gt;uncommenting this should let you play with the news feed adaptor.&lt;/p&gt;
&lt;p&gt;Unfortunately the login is also not working. To import your friends you will need to have two tabs open, one logged into Facebook, and the other using the Facebook Tiddlywiki import. You can ignore the prompts.&lt;/p&gt;
&lt;h3&gt;So how does it all work?&lt;/h3&gt;
&lt;p&gt;So firstly I should thank Martin Budden who I have been constantly asking for help recently. He is responsible for creating the original adaptors and helping me get them started.&lt;/p&gt;
&lt;p&gt;In order to use this code you will need to become familar with the process of cooking a TiddlyWiki. Hopefully this link will help you :&lt;/p&gt;
&lt;p&gt;http://trac.tiddlywiki.org/wiki/ProductionProcess&lt;br /&gt;
If not please let me know and we will try to get a better guide written.&lt;/p&gt;
&lt;p&gt;You can see the files which make up this vertical from the rest.html.recipe. Below is quick summary of each of the important files :&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;taggingContent.tiddler&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Its used by the links to display all tiddlers tagged news.&lt;br /&gt;
**&lt;br /&gt;
feeds/FacebookFriendsFeed.tiddler&lt;br /&gt;
**&lt;/p&gt;
&lt;p&gt;Tells tiddlyWiki that there is a facebook friends feed available.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;adaptors/FacebookFriendsAdaptorPlugin.js&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Tells TiddlyWiki how to deal with the information in the facebook friends feed. This is where most of the screen scraping is done.&lt;/p&gt;
&lt;p&gt;I hope this gives enough info for people to start playing around. If there is any more detail required then please let me know via a comment. The source for this project can be found :&lt;/p&gt;
&lt;p&gt;http://svn.tiddlywiki.org/Trunk/contributors/SimonMcManus/verticals/testFacebook/&lt;/p&gt;
&lt;p&gt;enjoy.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Video on Open Social</title>
    <link href="https://simonmcmanus.com/posts/video-on-open-social/"/>
    <updated>2007-11-01T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/video-on-open-social/</id>
    <content type="html">&lt;p&gt;As the imminent release of Open Social draws closer we are starting to see more info about it :&lt;/p&gt;
&lt;p&gt;http://blog.pmarca.com/2007/10/open-social-scr.html&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Latest Database design for ccTiddly</title>
    <link href="https://simonmcmanus.com/posts/latest-database-design-for-cctiddly/"/>
    <updated>2007-11-09T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/latest-database-design-for-cctiddly/</id>
    <content type="html">&lt;p&gt;&lt;a href=&quot;https://simonmcmanus.files.wordpress.com/2007/11/erm2.jpg&quot; title=&quot;erm2.jpg&quot;&gt;&lt;img src=&quot;https://simonmcmanus.files.wordpress.com/2007/11/erm2.jpg&quot; alt=&quot;erm2.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;and the sql :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;&#92;[sourcecode language=&#39;sql&#39;&#92;]  
&#92;-- phpMyAdmin SQL Dump  
&#92;-- version 2.10.1  
&#92;-- http://www.phpmyadmin.net  
&#92;--  
&#92;-- Host: localhost  
&#92;-- Generation Time: Nov 09, 2007 at 01:32 PM  
&#92;-- Server version: 5.0.41  
&#92;-- PHP Version: 5.2.2  
  
SET SQL&#92;_MODE=&amp;quot;NO&#92;_AUTO&#92;_VALUE&#92;_ON&#92;_ZERO&amp;quot;;  
  
&#92;--  
&#92;-- Database: &#92;`permissions&#92;`  
&#92;--  
  
&#92;-- --------------------------------------------------------  
  
&#92;--  
&#92;-- Table structure for table &#92;`admin&#92;_of&#92;_instance&#92;`  
&#92;--  
  
CREATE TABLE &#92;`admin&#92;_of&#92;_instance&#92;` (  
&#92;`user&#92;_id&#92;` varchar(255) NOT NULL,  
&#92;`instance&#92;_name&#92;` varchar(100) NOT NULL  
) ENGINE=MyISAM DEFAULT CHARSET=latin1;  
  
&#92;--  
&#92;-- Dumping data for table &#92;`admin&#92;_of&#92;_instance&#92;`  
&#92;--  
  
&#92;-- --------------------------------------------------------  
  
&#92;--  
&#92;-- Table structure for table &#92;`group&#92;`  
&#92;--  
  
CREATE TABLE &#92;`group&#92;` (  
&#92;`name&#92;` varchar(50) NOT NULL,  
&#92;`desc&#92;` mediumtext NOT NULL  
) ENGINE=MyISAM DEFAULT CHARSET=latin1;  
  
&#92;--  
&#92;-- Dumping data for table &#92;`group&#92;`  
&#92;--  
  
&#92;-- --------------------------------------------------------  
  
&#92;--  
&#92;-- Table structure for table &#92;`group&#92;_membership&#92;`  
&#92;--  
  
CREATE TABLE &#92;`group&#92;_membership&#92;` (  
&#92;`user&#92;_id&#92;` varchar(255) NOT NULL,  
&#92;`group&#92;_name&#92;` varchar(50) NOT NULL  
) ENGINE=MyISAM DEFAULT CHARSET=latin1;  
  
&#92;--  
&#92;-- Dumping data for table &#92;`group&#92;_membership&#92;`  
&#92;--  
  
&#92;-- --------------------------------------------------------  
  
&#92;--  
&#92;-- Table structure for table &#92;`instance&#92;`  
&#92;--  
  
CREATE TABLE &#92;`instance&#92;` (  
&#92;`name&#92;` varchar(100) NOT NULL,  
&#92;`lang&#92;` varchar(10) NOT NULL,  
&#92;`keep&#92;_revision&#92;` int(1) NOT NULL,  
&#92;`require&#92;_login&#92;` int(1) NOT NULL,  
&#92;`session&#92;_expire&#92;` int(10) NOT NULL,  
&#92;`tag&#92;_tiddler&#92;_with&#92;_modifier&#92;` int(1) NOT NULL,  
&#92;`char&#92;_set&#92;` varchar(10) NOT NULL,  
&#92;`hashseed&#92;` varchar(50) NOT NULL,  
&#92;`debug&#92;` int(1) NOT NULL,  
&#92;`status&#92;` varchar(10) NOT NULL,  
&#92;`tiddlywiki&#92;_type&#92;` varchar(30) NOT NULL,  
&#92;`default&#92;_anonymous&#92;_perm&#92;` varchar(4) NOT NULL,  
&#92;`default&#92;_user&#92;_perm&#92;` varchar(4) NOT NULL,  
&#92;`rss&#92;_group&#92;` varchar(50) NOT NULL,  
&#92;`markup&#92;_group&#92;` varchar(50) NOT NULL,  
PRIMARY KEY (&#92;`name&#92;`)  
) ENGINE=MyISAM DEFAULT CHARSET=latin1;  
  
&#92;--  
&#92;-- Dumping data for table &#92;`instance&#92;`  
&#92;--  
  
INSERT INTO &#92;`instance&#92;` (&#92;`name&#92;`, &#92;`lang&#92;`, &#92;`keep&#92;_revision&#92;`, &#92;`require&#92;_login&#92;`, &#92;`session&#92;_expire&#92;`, &#92;`tag&#92;_tiddler&#92;_with&#92;_modifier&#92;`, &#92;`char&#92;_set&#92;`, &#92;`hashseed&#92;`, &#92;`debug&#92;`, &#92;`status&#92;`, &#92;`tiddlywiki&#92;_type&#92;`, &#92;`default&#92;_anonymous&#92;_perm&#92;`, &#92;`default&#92;_user&#92;_perm&#92;`, &#92;`rss&#92;_group&#92;`, &#92;`markup&#92;_group&#92;`) VALUES  
(&#39;permissions&#39;, &#39;en&#39;, 1, 0, 0, 0, &#39;utf8&#39;, &#39;&#39;, 0, &#39;&#39;, &#39;TiddlyWiki&#39;, &#39;&#39;, &#39;&#39;, &#39;&#39;, &#39;&#39;);  
  
&#92;-- --------------------------------------------------------  
  
&#92;--  
&#92;-- Table structure for table &#92;`login&#92;_session&#92;`  
&#92;--  
  
CREATE TABLE &#92;`login&#92;_session&#92;` (  
&#92;`user&#92;_id&#92;` varchar(255) NOT NULL,  
&#92;`session&#92;_token&#92;` varchar(150) NOT NULL COMMENT &#39;username+password+time&#39;,  
&#92;`expire&#92;` int(20) NOT NULL,  
&#92;`ip&#92;` varchar(15) NOT NULL  
) ENGINE=MyISAM DEFAULT CHARSET=latin1;  
  
&#92;--  
&#92;-- Dumping data for table &#92;`login&#92;_session&#92;`  
&#92;--  
  
&#92;-- --------------------------------------------------------  
  
&#92;--  
&#92;-- Table structure for table &#92;`permissions&#92;`  
&#92;--  
  
CREATE TABLE &#92;`permissions&#92;` (  
&#92;`read&#92;` int(1) NOT NULL,  
&#92;`insert&#92;` int(1) NOT NULL,  
&#92;`edit&#92;` int(1) NOT NULL,  
&#92;`delete&#92;` int(1) NOT NULL,  
&#92;`group&#92;_name&#92;` varchar(50) NOT NULL,  
&#92;`instance&#92;_name&#92;` varchar(100) NOT NULL  
) ENGINE=MyISAM DEFAULT CHARSET=latin1;  
  
&#92;--  
&#92;-- Dumping data for table &#92;`permissions&#92;`  
&#92;--  
  
&#92;-- --------------------------------------------------------  
  
&#92;--  
&#92;-- Table structure for table &#92;`tiddler&#92;`  
&#92;--  
  
CREATE TABLE &#92;`tiddler&#92;` (  
&#92;`id&#92;` int(11) NOT NULL auto&#92;_increment,  
&#92;`instance&#92;_name&#92;` varchar(100) NOT NULL,  
&#92;`title&#92;` text NOT NULL,  
&#92;`body&#92;` mediumtext NOT NULL,  
&#92;`fields&#92;` text NOT NULL,  
&#92;`tags&#92;` text NOT NULL,  
&#92;`modifier&#92;` varchar(255) NOT NULL,  
&#92;`creator&#92;` varchar(255) NOT NULL,  
&#92;`modified&#92;` varchar(12) NOT NULL,  
&#92;`created&#92;` varchar(12) NOT NULL,  
&#92;`version&#92;` int(11) NOT NULL,  
PRIMARY KEY (&#92;`id&#92;`)  
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO&#92;_INCREMENT=1 ;  
  
&#92;--  
&#92;-- Dumping data for table &#92;`tiddler&#92;`  
&#92;--  
  
&#92;-- --------------------------------------------------------  
  
&#92;--  
&#92;-- Table structure for table &#92;`tiddler&#92;_revision&#92;`  
&#92;--  
  
CREATE TABLE &#92;`tiddler&#92;_revision&#92;` (  
&#92;`id&#92;` int(11) NOT NULL auto&#92;_increment,  
&#92;`title&#92;` text NOT NULL,  
&#92;`body&#92;` mediumtext NOT NULL,  
&#92;`fields&#92;` text NOT NULL,  
&#92;`modified&#92;` varchar(12) NOT NULL,  
&#92;`modifier&#92;` varchar(255) NOT NULL,  
&#92;`revision&#92;` int(11) NOT NULL,  
&#92;`tags&#92;` text NOT NULL,  
&#92;`tiddler&#92;_id&#92;` int(11) NOT NULL,  
PRIMARY KEY (&#92;`id&#92;`)  
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO&#92;_INCREMENT=1 ;  
  
&#92;--  
&#92;-- Dumping data for table &#92;`tiddler&#92;_revision&#92;`  
&#92;--  
  
&#92;-- --------------------------------------------------------  
  
&#92;--  
&#92;-- Table structure for table &#92;`user&#92;`  
&#92;--  
  
CREATE TABLE &#92;`user&#92;` (  
&#92;`id&#92;` varchar(255) NOT NULL,  
&#92;`password&#92;` varchar(50) NOT NULL,  
&#92;`short&#92;_name&#92;` varchar(50) NOT NULL,  
&#92;`long&#92;_name&#92;` varchar(100) NOT NULL,  
PRIMARY KEY (&#92;`id&#92;`)  
) ENGINE=MyISAM DEFAULT CHARSET=latin1;  
  
&#92;--  
&#92;-- Dumping data for table &#92;`user&#92;`  
&#92;--  
  
&#92;[/sourcecode&#92;]

        

&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
  
  <entry>
    <title>MIME Types in for Server Side TiddlyWikis - Download a HTML file from a link</title>
    <link href="https://simonmcmanus.com/posts/mime-types-in-for-server-side-tiddlywikis-download-a-html-file-from-a-link/"/>
    <updated>2007-11-21T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/mime-types-in-for-server-side-tiddlywikis-download-a-html-file-from-a-link/</id>
    <content type="html">&lt;p&gt;One of the things we like about TiddlySpot is the way that it immediately provides the save as dialog box when you click the download link. For a demo at the UC Hot House we needed to do something similar. Here is what I did it. If any one knows of a better way to achieve the same goal please let me know.&lt;/p&gt;
&lt;p&gt;With PHP its nice and easy to return a different MIME type. This can be done using one line of code :&lt;/p&gt;
&lt;p&gt;header(&amp;quot;Content-Type: application/zip zip&amp;quot;);&lt;/p&gt;
&lt;p&gt;There a many different MIME types available, Wikipedia provides a summary of some of the more relevant types at :&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Internet_media_type&quot; title=&quot;http://en.wikipedia.org/wiki/Internet_media_type&quot;&gt;http://en.wikipedia.org/wiki/Internet_media_type&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Setting the MIME type to HTML simple loads the webpage into the browser becuase it knows how to display html files. There were two ways to produce the save dialog box, firstly the above example. By telling the browser to expect a Zip file it immediately returns the save as box. I was not overly happy with this because it was not a zip file and the dialog box informed the user they were going to be downloading a PC ZIP Achive :&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://simonmcmanus.files.wordpress.com/2007/11/picture-2.png&quot; alt=&quot;picture-2.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;After some googling I discovered that browsers will return the save as dialog for any file formats that they do not understand. So I changed the MIME type to :&lt;/p&gt;
&lt;p&gt;header(&amp;quot;Content-Type: application/zisdfsdfpsdf zisdfp&amp;quot;);&lt;/p&gt;
&lt;p&gt;and got the same except it was defaulting to saying it was saving a .php file in the save dialog box.&lt;/p&gt;
&lt;p&gt;This of course only returns an empty file: To make it save the tiddlywiki file I then added :&lt;br /&gt;
[sourcecode language=&#39;php&#39;]&lt;/p&gt;
&lt;p&gt;header(&amp;quot;Pragma: public&amp;quot;);&lt;br /&gt;
header(&amp;quot;Expires: 0&amp;quot;);&lt;br /&gt;
header(&amp;quot;Cache-Control: must-revalidate, post-check=0, pre-check=0&amp;quot;);&lt;br /&gt;
header(&amp;quot;Cache-Control: public&amp;quot;);&lt;br /&gt;
header(&amp;quot;Content-Description: File Transfer&amp;quot;);&lt;br /&gt;
header(&amp;quot;Content-Type: application/sdfzip zipsdfsdf&amp;quot;);&lt;/p&gt;
&lt;p&gt;$file = @fopen(&#39;index.html&#39;,&amp;quot;rb&amp;quot;);&lt;br /&gt;
if ($file) {&lt;br /&gt;
while(!feof($file)) {&lt;br /&gt;
print(fread($file, 1024*8));&lt;br /&gt;
flush();&lt;br /&gt;
if (connection_status()!=0) {&lt;br /&gt;
@fclose($file);&lt;br /&gt;
die();&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
@fclose($file);&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;[/sourcecode]&lt;br /&gt;
The fact that it was saving a PHP file was a problem. This was actually very simple to resolve :I created a .htaccess file in the folder containing the above code and entered :&lt;/p&gt;
&lt;p&gt;AddType application/x-httpd-php .htm&lt;br /&gt;
AddType application/x-httpd-php .html&lt;/p&gt;
&lt;p&gt;This means that any .html and .htm files will now be processed by the PHP engine. The final step it to change the filename of the file containing the above PHP code so that it is a HTML file.&lt;/p&gt;
&lt;p&gt;The end result is the file should prompt you to save a HTML from one click.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>ccTiddly 2.x - An Overview</title>
    <link href="https://simonmcmanus.com/posts/cctiddly-2x-an-overview/"/>
    <updated>2007-11-26T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/cctiddly-2x-an-overview/</id>
    <content type="html">&lt;h2&gt;Why are we doing this?&lt;/h2&gt;
&lt;p&gt;We&#39;ve now got a couple of user groups within BT using ccTiddly. Their feedback is driving a wave of improvements that I&#39;m working on with CoolCold, the man who originally created ccTiddly. The areas we&#39;ve been looking at are:&lt;/p&gt;
&lt;h2&gt;Self-service Workspace Creation&lt;/h2&gt;
&lt;p&gt;The new version of ccTiddly will allows users to create their own ccTiddly workspaces, which is a (more or less) a complete independent wiki with it&#39;s own security permissions.&lt;/p&gt;
&lt;h2&gt;Reusable Master Workspaces&lt;/h2&gt;
&lt;p&gt;ccTiddly 2.x introduces the concept of master workspaces.  A &amp;quot;master workspace&amp;quot; allows a set of tiddlers to be packaged up and included in several different workspaces. This allows common content such as themes to be shared between workspaces. Because the links are dynamic, it is also possible to change a tiddler from a master workspace and have the change automatically appear in workspaces that use that master.&lt;/p&gt;
&lt;h2&gt;User Management&lt;/h2&gt;
&lt;p&gt;The new version of ccTiddly will have new user management and security that allows permissions to be set on a per-workspace basis for individual users and groups.  Although we&#39;re currently working with a custom user database, I&#39;ve got experimental support for both LDAP and OpenID.&lt;/p&gt;
&lt;h2&gt;Image and Attachment Support&lt;/h2&gt;
&lt;p&gt;Users will be able to upload images and other attachments to a workspace .&lt;/p&gt;
&lt;h2&gt;Import Support&lt;/h2&gt;
&lt;p&gt;Users will also be able to upload a standalone TiddlyWiki file so that it can be imported into a ccTiddly workspace.&lt;/p&gt;
&lt;h2&gt;Personal Tiddlers&lt;/h2&gt;
&lt;p&gt;Users will be able to create custom personal tiddlers which will persist across all workspaces they access on a server, allowing advanced users to be able to have settings applied consistently across all their workspaces&lt;/p&gt;
&lt;p&gt;Over the coming few weeks I will be making the above happen and providing you details about each of these sections on my blog.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>The Robbie Clutton Problem.</title>
    <link href="https://simonmcmanus.com/posts/the-robbie-clutton-problem/"/>
    <updated>2007-11-28T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/the-robbie-clutton-problem/</id>
    <content type="html">&lt;p&gt;&lt;a href=&quot;http://blog.iclutton.com/&quot; title=&quot;Robbie&quot;&gt;Robbie&lt;/a&gt; seems to be getting slightly annoyed about people such as myself who link their del.icio.us accounts with their wordpress accounts.  He explains his problem in the following blog post :&lt;br /&gt;
http://blog.iclutton.com/2007/11/other-peoples-blogs.html&lt;/p&gt;
&lt;p&gt;I quite like this functionality, I have had a number of comments about the links which  I post. I also like the way people can know what I am reading and thinking about in between normal posts.&lt;/p&gt;
&lt;p&gt;As Robbie points out you can get a direct stream of my del.icio.us feed from &lt;a href=&quot;http://del.icio.us/simonmcmanus&quot; title=&quot;this page. &quot;&gt;this page.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I value Robbie as a reader/commenter  so dont want to continue to enrage his anger, I  looked at the settings thinking I would make it update once a week,  unfortunately I can only configure the hour of the day at which the update occurs.&lt;/p&gt;
&lt;p&gt;Id be interested in any comments for or against Robbies motion, if no-one says they like viewing my links in their RSS reader I will remove the mystical link.&lt;/p&gt;
&lt;p&gt;This has also got me thinking about aggregation in a slightly different way, in some ways I like RSS feeds which are about a particular topic, but I also like the fact that certain blogs aggregate various different topics.&lt;/p&gt;
&lt;p&gt;Comments please...&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Epoch to TiddlyTime</title>
    <link href="https://simonmcmanus.com/posts/epoch-to-tiddlytime/"/>
    <updated>2007-12-03T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/epoch-to-tiddlytime/</id>
    <content type="html">&lt;p&gt;This handy PHP function receives  a epoch time stamp and returns the a string using the TiddlyWiki date format.   Quite handy.&lt;/p&gt;
&lt;p&gt;//  Returns time in TiddlyWiki format from Epoch time stamp.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;function epochToTiddlyTime($timestamp)  
{  
return date(&#39;YmdHi&#39;, $timestamp);  
}
&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
  
  <entry>
    <title>Del.icio.us Feed Removal</title>
    <link href="https://simonmcmanus.com/posts/delicious-feed-removal/"/>
    <updated>2007-12-06T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/delicious-feed-removal/</id>
    <content type="html">&lt;p&gt;Following on from my previous posts about &lt;a href=&quot;https://simonmcmanus.com/posts/the-robbie-clutton-problem/&quot; title=&quot;the Robbie problem&quot;&gt;the Robbie problem&lt;/a&gt; I have now removed my mystical link between my blog and del.icio.us account.&lt;/p&gt;
&lt;p&gt;If anyone would like to follow my del.icio.us links feed then you can get it &lt;a href=&quot;http://del.icio.us/simonmcmanus&quot; title=&quot;here&quot;&gt;here.&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>ccTiddly System Tiddler Plugins</title>
    <link href="https://simonmcmanus.com/posts/cctiddly-system-tiddler-plugins/"/>
    <updated>2007-12-10T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/cctiddly-system-tiddler-plugins/</id>
    <content type="html">&lt;p&gt;ccTiddly currently uses a modified version of the basic TiddlyWiki HTML code. This means that whenever there&#39;s an update to the core code, we have to manually update ccTiddly to the new version (which involves some fiddly manual steps).&lt;/p&gt;
&lt;p&gt;The goal is to make it so that ccTiddly uses a clean, unadorned copy of empty.html from tiddlywiki.com, and to have it automatically splice in the extra bits and pieces that are needed by ccTiddly.&lt;/p&gt;
&lt;p&gt;These extra bits and pieces are a bunch of plugins and some &amp;quot;stock&amp;quot; tiddlers that use macros from those plugins to expose them to the user.&lt;/p&gt;
&lt;p&gt;If, like me, you get confused about the difference between a plugin and a macro, remember that a plugin is just a tiddler tagged &amp;quot;systemConfig&amp;quot;, a plugin can  can contain many different macros (which use config.macros)&lt;/p&gt;
&lt;p&gt;For instance, there is a plugin called &amp;quot;CreateWorkspacePlugin&amp;quot; that provides the &amp;lt;&lt;ccCreateWorkspace&gt;&amp;gt; macro. The macro produces a user interface that allows users to interactively create a new workspace. So, we need to include the plugin in the HTML file, and we also need to, say, add a new tiddler called &amp;quot;CreateWorkspace&amp;quot; that contains a call to &amp;lt;&lt;ccCreateWorkspace&gt;&amp;gt; the create workspace macro.&lt;/ccCreateWorkspace&gt;&lt;/ccCreateWorkspace&gt;&lt;/p&gt;
&lt;p&gt;Here&#39;s the complete list:&lt;br /&gt;
&lt;strong&gt;Macro &amp;lt;&lt;ccCreateWorkspace&gt;&amp;gt; (from CreateWorkspacePlugin)&lt;/ccCreateWorkspace&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This macro allows the user to create a new ccTiddly workspace by specifying a name, and the permissions for both anonymous and registered users. We&#39;ll make the macro available to users via the backstage area, since this isn&#39;t a particularly common operation.&lt;/p&gt;
&lt;p&gt;**Macro &amp;lt;&lt;ccEditWorkspace&gt;&amp;gt; (from EditWorkspacePlugin)&lt;br /&gt;
**&lt;/ccEditWorkspace&gt;&lt;/p&gt;
&lt;p&gt;This plug in will allow users to manage permissions on a workspace which already exists (assuming they have the correct permission). Going forward this will probably include the master workspace management which will then be moved to its own plug in.&lt;/p&gt;
&lt;p&gt;**Macro &amp;lt;&lt;ccUserTiddler&gt;&amp;gt; (From UserTiddlerPlugin) **&lt;/ccUserTiddler&gt;&lt;/p&gt;
&lt;p&gt;This tiddler will be used to change your email address, password and user specific tiddlers.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Macro &amp;lt;&lt;ccLogin&gt;&amp;gt; - (From LoginPlugin)&lt;/ccLogin&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This macro displays the login UI.  When not logged in it will allow the users to login  using OpenID, LDAP or the internal user database. When logged in the user will be informed who they are logged in as and be given the option to log out.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Pondering PageRank and TinyURLs</title>
    <link href="https://simonmcmanus.com/posts/pondering-pagerank-and-tinyurls/"/>
    <updated>2007-12-10T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/pondering-pagerank-and-tinyurls/</id>
    <content type="html">&lt;p&gt;A couple of weeks ago I posted a link on &lt;a href=&quot;http://www.twitter.com/&quot; title=&quot;twitter&quot;&gt;Twitter&lt;/a&gt; and noticed it was automatically converted into a tinyurl (&lt;a href=&quot;http://tinyurl.com/&quot; title=&quot;http://tinyurl.com&quot;&gt;http://tinyurl.com&lt;/a&gt;). The URL was not too long to fit into my 140 characters.&lt;/p&gt;
&lt;p&gt;This got me thinking, I have never felt the need to use tinyurls, but are they actually doing damage?&lt;/p&gt;
&lt;p&gt;How do tinyurls effect PageRank? Should hosts fear a duplicate content penalty? especially if tinyurl.com has a higher initial page rank than your own site?&lt;/p&gt;
&lt;p&gt;Has anyone seen googles algorithm deal with these URLs in a good or bad way? Are all these great links in twitter going to waste? Surely not?&lt;/p&gt;
&lt;p&gt;There is some debate about this topic here :&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.thescripts.com/forum/thread96963.html&quot; title=&quot;http://www.thescripts.com/forum/thread96963.html&quot;&gt;http://www.thescripts.com/forum/thread96963.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I would be interested in any views on this.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Bullshit 2.0</title>
    <link href="https://simonmcmanus.com/posts/bullshit-20/"/>
    <updated>2007-12-12T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/bullshit-20/</id>
    <content type="html">&lt;p&gt;I&#39;m currently at the second day of the &lt;a href=&quot;http://www.leweb3.com/&quot; title=&quot;le web 3&quot;&gt;LeWeb3 Conference&lt;/a&gt;. For a long time I have disliked the term &amp;quot;web 2.0&amp;quot; for a number of reasons.&lt;/p&gt;
&lt;p&gt;It has no clear definition, different people take it to mean completely different things.&lt;/p&gt;
&lt;p&gt;The web is evolving, it is not released in easily defined iterations.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://doc-weblogs.com/&quot; title=&quot;Doc Searls&quot;&gt;Doc Searls&lt;/a&gt; asked the question in his talk: who can define web 2.0? About 2 people in an audience of 1000 people raised their hands.&lt;/p&gt;
&lt;p&gt;Often these terms are used to describe things that we don&#39;t quite understand or can&#39;t explain. I once overhead &lt;a href=&quot;http://tommorris.org/&quot; title=&quot;Tom Morris&quot;&gt;Tom Morris&lt;/a&gt; say that its only non-developers who use the term web 2.0.&lt;/p&gt;
&lt;p&gt;Its scary how many time I have heard people say they want a web 2.0 app. &lt;a href=&quot;http://blogs.smh.com.au/innovator/archives/2007/09/has_innovation_become_a_dirty.html&quot; title=&quot;This ost&quot;&gt;This post&lt;/a&gt; talks about how innovation has become a dirty word. I think the same can be said for anything ending 2.0.&lt;/p&gt;
&lt;p&gt;I would love to see an end to terminology 2.0 but realistically I can only ask that if people insist on using these terms they follow it by an explanation of what they actually mean.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>The Ultimate N95 hack - Helicopters</title>
    <link href="https://simonmcmanus.com/posts/the-ultimate-n95-hack-helicopters/"/>
    <updated>2007-12-24T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/the-ultimate-n95-hack-helicopters/</id>
    <content type="html">&lt;p&gt;It struck me while watching the below video of the &lt;a href=&quot;http://web.nseries.com/products/n95/#l=products,n95&quot; title=&quot;http://web.nseries.com/products/n95/#l=products,n95&quot;&gt;Nokia n95&lt;/a&gt; yesterday that the n95 has all the necessary equipment required to run an r/c helicopter.&lt;/p&gt;
&lt;p&gt;[youtube=http://www.youtube.com/watch?v=EMjAYdF13cU]&lt;/p&gt;
&lt;p&gt;With its built in GPS and the ability to run a web server, It would seem sensible to replace the radio receiver from a helicopter with a bluetooth one (as shown in the above video)&lt;/p&gt;
&lt;p&gt;Ive also been playing with the nokia&#39;s on board web server. It works, although the connection is not exactly reliable.&lt;/p&gt;
&lt;p&gt;With a connection it would be really easy to control the helicopter from anywhere on the web!&lt;/p&gt;
&lt;p&gt;Ive not quite worked out how we avoid killing folk when the connection drops out.&lt;/p&gt;
&lt;p&gt;I consulted &lt;a href=&quot;http://www.nats.co.uk/&quot; title=&quot;http://www.nats.co.uk/&quot;&gt;NATS&lt;/a&gt; about this (ok my sister in law) and it would basically only be legal to fly over private property and below a certain heights.&lt;/p&gt;
&lt;p&gt;I really want to scratch this itch but think it could be a little dangerous and I dont really have enough space.&lt;/p&gt;
&lt;p&gt;I will try to get up some other posts about the stuff I have been doing with the n95.&lt;/p&gt;
&lt;p&gt;The web server stuff is particularly cool&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://opensource.nokia.com/projects/mobile-web-server/&quot; title=&quot;http://opensource.nokia.com/projects/mobile-web-server/&quot;&gt;http://opensource.nokia.com/projects/mobile-web-server/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I am particularly looking forward to PAMP in early Jan:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://blogs.s60.com/mws/2007/11/hot_news_php_coming_to_s60.html&quot; title=&quot;http://blogs.s60.com/mws/2007/11/hot_news_php_coming_to_s60.html&quot;&gt;http://blogs.s60.com/mws/2007/11/hot_news_php_coming_to_s60.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Merry Christmas every body.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Life Streaming in ccTiddly</title>
    <link href="https://simonmcmanus.com/posts/life-streaming-in-cctiddly/"/>
    <updated>2008-01-04T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/life-streaming-in-cctiddly/</id>
    <content type="html">&lt;p&gt;This afternoon I noticed &lt;a href=&quot;http://www.hawksworx.com/journal/&quot; title=&quot;http://www.hawksworx.com/journal/&quot;&gt;Phil Hawksworth&lt;/a&gt; playing around with a script to add a life streaming to his blog.&lt;/p&gt;
&lt;p&gt;Thanks to &lt;a href=&quot;http://adactio.com/&quot; title=&quot;http://adactio.com/&quot;&gt;Jeremy Keith&lt;/a&gt;, for the &lt;a href=&quot;http://adactio.com/extras/stream/stream.phps&quot; title=&quot;http://adactio.com/extras/stream/stream.phps&quot;&gt;original code&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;With very few changes I have got the script working in &lt;a href=&quot;http://cctiddly.sourceforge.net/&quot;&gt;ccTiddly&lt;/a&gt;.&lt;br /&gt;
In index.php you simply need to add the code contained in this file (&lt;a href=&quot;https://simonmcmanus.files.wordpress.com/2008/01/lifestream1.txt&quot; title=&quot;lifestream1.txt&quot;&gt;lifestream1.txt)&lt;/a&gt; under&lt;/p&gt;
&lt;div id=&quot;storeArea&quot;&gt;  
&lt;p&gt;in Index.php&lt;/p&gt;
&lt;p&gt;And below is the end result.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://simonmcmanus.files.wordpress.com/2008/01/picture-2.png&quot; title=&quot;picture-2.png&quot;&gt;&lt;img src=&quot;https://simonmcmanus.files.wordpress.com/2008/01/picture-2.png&quot; alt=&quot;picture-2.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This code probably wont make it into the next release of ccTiddly but I thought I would get it out there for you to play with.&lt;/p&gt;
&lt;p&gt;Some of the date sorting bits are not actually required here because Tiddlywiki can do the date sorting.&lt;/p&gt;
&lt;p&gt;Enjoy, comments and suggestions welcome as always.&lt;/p&gt;
&lt;/div&gt;</content>
  </entry>
  
  <entry>
    <title>Product Streaming for ccTiddly???</title>
    <link href="https://simonmcmanus.com/posts/product-streaming-for-cctiddly/"/>
    <updated>2008-01-07T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/product-streaming-for-cctiddly/</id>
    <content type="html">&lt;p&gt;My recent play/ &lt;a href=&quot;https://simonmcmanus.com/posts/life-streaming-in-cctiddly/&quot; title=&quot;Life streaming blog post&quot;&gt;blog post&lt;/a&gt; with &lt;a href=&quot;http://adactio.com/journal/1202/&quot; title=&quot;Life Streaming explained &quot;&gt;life streaming&lt;/a&gt; script got me thinking. Today I&#39;ve been looking at the various online resources for ccTiddly. Currently we have :&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://sourceforge.net/project/showfiles.php?group_id=156016&amp;amp;package_id=173962&quot; title=&quot;http://sourceforge.net/project/showfiles.php?group_id=156016&amp;amp;package_id=173962&quot;&gt;http://cctiddly.sourceforge.net -&lt;/a&gt; ccTiddly on Sourceforge&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://groups.google.com/group/ccTiddly&quot; title=&quot;ccTiddly Google Groups&quot;&gt;http://groups.google.com/group/ccTiddly&lt;/a&gt; - Google Groups on ccTiddly &lt;a href=&quot;http://coolcold.wordpress.com/&quot; title=&quot;CoolColds Blog&quot;&gt;http://coolcold.wordpress.com&lt;/a&gt; - Cool Colds blog   [&lt;/p&gt;
&lt;p&gt;https://simonmcmanus.com](https://simonmcmanus.wordpress.com/wp-admin/My%20Blog) - My Blog&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.tiddlywiki.org/wiki/CcTiddly&quot; title=&quot;ccTiddly User Wiki&quot;&gt;http://www.tiddlywiki.org/wiki/CcTiddly&lt;/a&gt; - Wiki for ccTiddly&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.tiddlywiki.org/wiki/CcTiddlyDeveloper&quot; title=&quot;ccTiddly Developer Wiki&quot;&gt;http://www.tiddlywiki.org/wiki/CcTiddlyDeveloper&lt;/a&gt;  - Wiki for ccTiddly developers.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://svn.tiddlywiki.org/Trunk/association/serversides/cctiddly/&quot; title=&quot;ccTiddly SVN Repository&quot;&gt;http://svn.tiddlywiki.org/Trunk/association/serversides/cctiddly&lt;/a&gt; - SVN for ccTiddly&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://trac.tiddlywiki.org/&quot; title=&quot;ccTiddly Trac DB&quot;&gt;http://trac.tiddlywiki.org&lt;/a&gt; - Trac for Tiddlywiki&lt;/p&gt;
&lt;p&gt;and there are potentially more. Most of these produce some kind of RSS feed. It would be nice to provide an aggregated view of all these feeds in a similar way to Life Streaming.&lt;/p&gt;
&lt;p&gt;At a quick glance I can see a few problems. The Wikis are being hosted on the TiddlyWiki Media Wiki installation which does not appear to provide an RSS feed per page. Maybe this can be resolved using the &lt;a href=&quot;http://www.tiddlywiki.org/wiki/Special:WikiFeeds&quot;&gt;media wiki categories feed&lt;/a&gt; .&lt;/p&gt;
&lt;p&gt;Anyway, just a thought, would anyone find this usefull?&lt;/p&gt;
&lt;p&gt;Comments and suggestions welcome as always.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Server Side Search for ccTiddly.</title>
    <link href="https://simonmcmanus.com/posts/server-side-search-for-cctiddly/"/>
    <updated>2008-01-15T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/server-side-search-for-cctiddly/</id>
    <content type="html">&lt;p&gt;We are starting to deploy &lt;a href=&quot;http://www.tiddlywiki.org/wiki/CcTiddlyDeveloper&quot; title=&quot;ccTiddly&quot;&gt;ccTiddly&lt;/a&gt; within BT and have been importing various types of data. In the same way that users experience issues with a &lt;a href=&quot;http://tiddlywiki.com/&quot; title=&quot;Tiddlywiki&quot;&gt;Tiddlywiki&lt;/a&gt; files greater than 1 or 2 mbs the same issue occurs on ccTiddly.&lt;/p&gt;
&lt;p&gt;Being server side there are a number of things we can do to reduce these issues. One idea we have is only loading the title data for each of the tiddlers onLoad. With such techniques the client side search (and some other areas) will lose value. As a result I have started experimenting with a server side search solution for ccTiddly.&lt;/p&gt;
&lt;p&gt;The nice thing about this code is that it can later be used to search across revisions, tiddlywiki&#39;s bag&#39;s and even across different servers. It could also be modified quite easily to incorporate google search results.&lt;/p&gt;
&lt;p&gt;The code is made up of two parts :&lt;/p&gt;
&lt;p&gt;The plug-in (you need to update the server,  url and then create a tiddler and tag it with systemConfig) :&lt;/p&gt;
&lt;p&gt;Plugin :&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://simonmcmanus.files.wordpress.com/2008/01/search.txt&quot; title=&quot;search.txt&quot;&gt;search.txt&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;PHP Code :&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://simonmcmanus.files.wordpress.com/2008/01/searchphp.txt&quot; title=&quot;searchphp.txt&quot;&gt;searchphp.txt&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;(you will need to rename the file from searchphp.txt to search.php)&lt;/p&gt;
&lt;p&gt;This code has been written for ccTiddly 2.0 but you should be able to get it working on ccTiddly 1.2 with minimal problems. In this case search.php was added to a folder called &#39;handle&#39; in the root ccTiddly directory.&lt;/p&gt;
&lt;p&gt;This is the format we will be using in ccTiddly 2.x&lt;/p&gt;
&lt;p&gt;A temporary example of this script can be found running at :&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://wikidev.osmosoft.com/search#search&quot; title=&quot;http://wikidev.osmosoft.com/search#search&quot;&gt;http://wikidev.osmosoft.com/search#search&lt;/a&gt; - Please note this is a dev server only.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Time for a blog post about twitter.</title>
    <link href="https://simonmcmanus.com/posts/time-for-a-blog-post-about-twitter/"/>
    <updated>2008-01-15T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/time-for-a-blog-post-about-twitter/</id>
    <content type="html">&lt;p&gt;I was a slow starter when it came to &lt;a href=&quot;http://www.twitter.com/&quot; title=&quot;Twiter&quot;&gt;twitter&lt;/a&gt;, im now subscribed to about 54 people and they generates a good few tweats.(updates) I now rarely read beyond the first page so I miss quite a few of them.&lt;/p&gt;
&lt;p&gt;I found it interesting how the whole twitter experience became more enjoyable again when I unsubscribed from &lt;a href=&quot;http://twitter.com/Scobleizer&quot; title=&quot;@Scobleizer&quot;&gt;@Scobleizer&lt;/a&gt;. The human brain may be good at filtering information but its alot happier when it doesn&#39;t have to. For a while twitter was reminding me of Outlook. It turns out that was because I was using it like Outlook by not missing a tweat.&lt;/p&gt;
&lt;p&gt;That is where I was going wrong....&lt;/p&gt;
&lt;p&gt;An email never guarantees that it has been received, and certainly not that due care and attention has been paid to reading and digesting the information contained with in it. That however is exactly what people expect. With twitter I have not seen the same expectations.&lt;/p&gt;
&lt;p&gt;I like to think about tweats as throw away comments that may not be read by any one, and thats fine, but they could also make someone smile or avoid two people doing exactly the same piece of work.&lt;/p&gt;
&lt;p&gt;I am really looking forward to having &lt;a href=&quot;http://tiddlywiki.org/wiki/CcTiddly&quot; title=&quot;ccTiddly&quot;&gt;ccTiddly&lt;/a&gt; at a stage where we can recreate things like twitter. If twitters success is all about constraints it will be really interesting to see what happens when we tweak those constraints for different environments.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Google Images in TiddlyWiki...and maybe flickr?</title>
    <link href="https://simonmcmanus.com/posts/google-images-in-tiddlywikiand-maybe-flickr/"/>
    <updated>2008-01-21T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/google-images-in-tiddlywikiand-maybe-flickr/</id>
    <content type="html">&lt;p&gt;After playing with the &lt;a href=&quot;https://simonmcmanus.com/posts/server-side-search-for-cctiddly/&quot; title=&quot;ccTiddly server side search&quot;&gt;server side search&lt;/a&gt; for &lt;a href=&quot;http://www.tiddlywiki.org/wiki/CcTiddly&quot; title=&quot;ccTiddly&quot;&gt;ccTiddly&lt;/a&gt; and knowing there were some project on the horizon that wanted to integrate google search into tiddlywiki results I decided to add google search into &lt;a href=&quot;http://tiddlywiki.com/&quot; title=&quot;tiddlywiki&quot;&gt;TiddlyWiki&lt;/a&gt;. An example of which can be found &lt;a href=&quot;http://wikidev.osmosoft.com/searchgoogle&quot; title=&quot;google search tiddlywiki example&quot;&gt;here.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As an extension to that I decided to add a google images search.&lt;/p&gt;
&lt;p&gt;I have uploaded an example to &lt;a href=&quot;http://tiddlyspot.com/&quot; title=&quot;tiddlyspot&quot;&gt;Tiddlyspot&lt;/a&gt; at:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://imgsearch.tiddlyspot.com/&quot; title=&quot;Google Images search Tiddlywiki Example&quot;&gt;http://imgsearch.tiddlyspot.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The tiddlers which make it all work  are:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://imgsearch.tiddlyspot.com/#googleImage&quot; title=&quot;googleImage tiddler&quot;&gt;http://imgsearch.tiddlyspot.com/#googleImage&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Overrides search onKeyPress function so that tw searches google when the users presses enter.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://imgsearch.tiddlyspot.com/#MarkupPostHead&quot; title=&quot;MarkupPostHead&quot;&gt;http://imgsearch.tiddlyspot.com/#MarkupPostHead&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Includes the google javascript file, you will need to change the API key (at the end of the URI) if using on a domain other than Tiddlyspot&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://imgsearch.tiddlyspot.com/#imageView&quot; title=&quot;ImageView Tiddler&quot;&gt;http://imgsearch.tiddlyspot.com/#imageView&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Code that creates the drop down list of images.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://imgsearch.tiddlyspot.com/#taggedTemplateTweak&quot; title=&quot;taggedTemplateTweak tiddler&quot;&gt;http://imgsearch.tiddlyspot.com/#taggedTemplateTweak&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Allows tiddlers tagged &amp;quot;image&amp;quot; to use a different template.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://imgsearch.tiddlyspot.com/#EditTemplate&quot; title=&quot;EditTemplate tiddler&quot;&gt;http://imgsearch.tiddlyspot.com/#EditTemplate&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Adds images link to the EditTemplate. Im sure there is a better way of doing this.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://imgsearch.tiddlyspot.com/#ImageViewTemplate&quot; title=&quot;ImageViewTemplate tiddler&quot;&gt;http://imgsearch.tiddlyspot.com/#ImageViewTemplate&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;It all works by storing the URI to the thumbnail in the tiddler title. With this template we hide the title.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;and &lt;strong&gt;&lt;a href=&quot;http://www.flickr.com/&quot; title=&quot;flickr&quot;&gt;Flickr&lt;/a&gt;?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I started playing with the &lt;a href=&quot;http://www.flickr.com/services/api/&quot; title=&quot;flickr api&quot;&gt;flickr API&lt;/a&gt;, its returning the results in &lt;a href=&quot;http://en.wikipedia.org/wiki/JSON&quot; title=&quot;JSON&quot;&gt;JSON&lt;/a&gt; but I have not had time to integrate that into the above script.&lt;/p&gt;
&lt;p&gt;If you look at the &lt;a href=&quot;http://wikidev.osmosoft.com/flickr#flickr&quot; title=&quot;flckr tiddlers&quot;&gt;flickr tiddler&lt;/a&gt; its currently searching for &amp;quot;simonmcmanus&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://wikidev.osmosoft.com/flickr&quot; title=&quot;http://wikidev.osmosoft.com/flickr&quot;&gt;http://wikidev.osmosoft.com/flickr&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Given that im now on holiday its not going to get done for quite a while. If anyone wants to make a tiddlywiki flickr plugin the pieces are all in place.&lt;/p&gt;
&lt;p&gt;Comments and suggestions welcome as usual but pls be aware that I may not respond for a good few weeks. :)&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>nokia n95 stuff.</title>
    <link href="https://simonmcmanus.com/posts/nokia-n95-stuff/"/>
    <updated>2008-01-23T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/nokia-n95-stuff/</id>
    <content type="html">&lt;p&gt;This post is just a load of useful links and info about things you can do with the &lt;a href=&quot;http://europe.nokia.com/A4323278&quot;&gt;Nokia n95.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I was going to send it to a friend via email but it seemed worth turning into a blog post.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Installation Tip :&lt;/strong&gt; I have experienced some problems when trying to extract and install .zip files on the phone. If you do have this problem you can try unzipping them on your PC and then send the files one by one. The installation file is usually a .sis file.&lt;/p&gt;
&lt;p&gt;A guide to setting up you nokia n95 to run gmail through the phones built in functions can be found at:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.knowyourmobile.com/nokia/nokian95/nokian95internet/2533/setting_up_email_on_the_nokia_n95.html&quot; title=&quot;setting up gmail on n95&quot;&gt;http://www.knowyourmobile.com/nokia/nokian95/nokian95internet/2533/setting_up_email_on_the_nokia_n95.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I don&#39;t actually use this method. Its set up but it doesn&#39;t seem to work with gmail very well. I believe a benefit of this technique is that you can attach files when sending emails.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.google.com/mobile/mail/index.html&quot; title=&quot;Google Mail Application&quot;&gt;&lt;strong&gt;Google Mail Application&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I don&#39;t use this either. I just connect over the web and have a bookmark stored which is linked to from the main screen.&lt;/p&gt;
&lt;h2&gt;Other Applications :&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;http://www.bysamir.fr/rotateme&quot; title=&quot;Rotate Me&quot;&gt;&lt;strong&gt;Rotate Me&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Auto rotation:&lt;/strong&gt; when you turn your device, the screen automatically rotates.&lt;/p&gt;
&lt;p&gt;Not played with this one too much yet.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://symbianblog.com/index.php/flipsilent/&quot; title=&quot;Flip Silent&quot;&gt;&lt;strong&gt;FlipSilent&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[youtube=http://www.youtube.com/watch?v=KFxUTb8ik3k&amp;amp;rel=1&amp;amp;border=1]&lt;br /&gt;
&lt;a href=&quot;http://mobile.divx.com/login&quot; title=&quot;DivX Mobile&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://mobile.divx.com/login&quot; title=&quot;DivX Mobile&quot;&gt;&lt;strong&gt;DivX&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;To play AVI files rather than just mp4s.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.niime.com/&quot; title=&quot;NiiMe&quot;&gt;&lt;strong&gt;NiiMe&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[youtube=http://www.youtube.com/watch?v=A0lz35Boe_I&amp;amp;rel=1&amp;amp;border=1]&lt;br /&gt;
[youtube=http://www.youtube.com/watch?v=79xeREnZ_7Q&amp;amp;rel=1&amp;amp;border=1]&lt;/p&gt;
&lt;p&gt;I am really looking forward to this being released for the mac.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://www.symbian-freak.com/news/008/01/nokia_n95_magic_py_piwo.htm&quot; title=&quot;drink beer&quot;&gt;pyPiwo&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;drink beer from your n95.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://www.symbian-freak.com/news/007/12/pypoziomica_freeware_level_tool.htm&quot; title=&quot;pyPoziomica Spirit Level tool&quot;&gt;pyPoziomica&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Spirit level tool for the n95!&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://qrcode.kaywa.com/&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://qrcode.kaywa.com/&quot;&gt;&lt;strong&gt;QR Code Generator&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You don&#39;t need to download any software, the n95 has a built in QR code reader, from this site you can generate QR codes to try on your phone.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://qrcode.kaywa.com/img.php?s=8&amp;amp;d=http%3A%2F%2Fsimonmcmanus.com&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://mosh.nokia.com/content/3E1BD59369462687E040050AEE043609&quot;&gt;&lt;strong&gt;Dr. Jukka’s Inclinometer&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://mosh.nokia.com/content/3E1BD59369462687E040050AEE043609&quot;&gt;Y-Inclinometer&lt;/a&gt; by &lt;a href=&quot;http://drjukka.com/&quot;&gt;Dr.Jukka&lt;/a&gt; is an instrument for measuring angles of slope (or tilt), elevation or inclination of an object with respect to gravity . You have only to fix your phone and adjust it so that it is perfectly upright in your vehicle :)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;More apps and reviews :&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://n95blog.com/25-must-have-applicatons-for-your-nokia-n95/&quot; title=&quot;apps list&quot;&gt;http://n95blog.com/25-must-have-applicatons-for-your-nokia-n95/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://sjc-123.blogspot.com/2007/06/best-tips-and-tricks-for-nokia-n95.html&quot; title=&quot;tips and tricks for n95&quot;&gt;http://sjc-123.blogspot.com/2007/06/best-tips-and-tricks-for-nokia-n95.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.hd911.com/archives/114&quot; title=&quot;apps and reviews&quot;&gt;http://www.hd911.com/archives/114&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Running a Web Server from the N95&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;http://mymobilesite.net/download/&quot; title=&quot;My Mobile Site&quot;&gt;&lt;strong&gt;Mobile Web Server&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;allows you to run a web server on the phone.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://wiki.opensource.nokia.com/projects/PAMP&quot; title=&quot;PAMP&quot;&gt;PAMP&lt;/a&gt; - Personal Apache Mysql and PHP&lt;/p&gt;
&lt;p&gt;I am yet to grasp the potential of everyone walking around with a web server in their pocket. &lt;a href=&quot;http://www.tiddlywiki.org/wiki/CcTiddly&quot; title=&quot;ccTiddly&quot;&gt;ccTiddly&lt;/a&gt; is nearly working on PAMP and I have been reading some interesting use cases. Notably a bar which pulls its music from everyones phones and can also project videos from peoples phones onto the walls.&lt;/p&gt;
&lt;p&gt;I&#39;m off to Brazil for two weeks but will post more about the potential of the n95  running a web server when I get back.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Off the Shelf Integration in Enterprises</title>
    <link href="https://simonmcmanus.com/posts/off-the-shelf-integration-in-enterprises/"/>
    <updated>2008-02-21T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/off-the-shelf-integration-in-enterprises/</id>
    <content type="html">&lt;p&gt;Two blog posts have got me thinking lately,&lt;/p&gt;
&lt;p&gt;This from &lt;a href=&quot;http://blog.whatfettle.com/2008/02/19/mashup-or-integration/&quot; title=&quot;PSD&quot;&gt;PSD&lt;/a&gt; and this from &lt;a href=&quot;http://confusedofcalcutta.com/2008/02/18/musing-about-enterprise-information-and-flow/&quot; title=&quot;JP and information flow in the enterprise&quot;&gt;JP&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The snapshot analogy led to a plethora of sins, to the way we designed databases, to the way we “inserted”, “amended” and “deleted” data. As we tried to force the snapshots to move around between systems, we hit DRM version 1. Enterprise Application Integration. Otherwise known as paying to bury our data, paying to dig it out again, and then, just in case we haven’t had enough, paying to move it around. And we could do so many wonderfully silly things as a result. Hire armies of people to write code to synchronise things, then hire more armies of people to write code to reconcile the data. Sometimes we missed out the “writing code” bit and just hired the reconcilers direct.&lt;/p&gt;
&lt;p&gt;And the platform vendors prospered. And the database guys prospered. The storage guys prospered. The EAI guys prospered. The code writers prospered. The reconcilers prospered. Everyone prospered.&lt;/p&gt;
&lt;p&gt;Except the customer.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;- &lt;a href=&quot;http://confusedofcalcutta.com/2008/02/18/musing-about-enterprise-information-and-flow/&quot;&gt;JP&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I have seen a number of enterprise projects pay external consultants to bury, dig out and then move around data. Its amazing how complicated a simple job can become. Its even more amazing that an industry still thrives from doing so.&lt;/p&gt;
&lt;p&gt;For a while now it has been common practice to buy off the shelf products to perform common tasks. They come with a nice fluffy layer of support and there is always a consultant on hand if you want to spend some more cash. In general these off the shelf products do NOT do what they need to do. They require a great deal of customisation usually taken care of by a bespoke programming language specific to the &amp;quot;Off the Shelf software.&amp;quot;&lt;/p&gt;
&lt;p&gt;As a result you either buy consultancy or train your own staff in the bespoke language. - both of which stink of vendor lock in.&lt;/p&gt;
&lt;p&gt;Lets think for a moment what that common task actually is. A common task is accessing, consuming and potentially updating data from a completely different system. None of the off the shelf systems seem capable of doing so without swallowing vast sums of consultancy fees. JP points out the daily tasks for knowledge workers are actually search, syndication fulfillment and conversation. Each of these are very valuable to the enterprise. In this case I am particularly talking about syndication.&lt;/p&gt;
&lt;p&gt;No man is an island.&lt;/p&gt;
&lt;p&gt;Neither is software..... particularly in the enterprise.&lt;/p&gt;
&lt;p&gt;Software (as with people) is only as good as its ability to interact with the eco-system around it.&lt;/p&gt;
&lt;p&gt;In fact without some kind of syndication between systems you will find that search, conversation and fulfillment lose much of their value.&lt;/p&gt;
&lt;p&gt;We seem to be at an interesting time in the enterprise, billions of pounds have been spent on massive integration projects/software but when compared to small RESTful APIs like &lt;a href=&quot;http://www.flickr.com/services/api/&quot; title=&quot;Flickr API&quot;&gt;Flickr&lt;/a&gt; and &lt;a href=&quot;http://twitter.com/help/api&quot; title=&quot;twitter api&quot;&gt;Twitter&lt;/a&gt; your left wondering where all the money has gone.&lt;/p&gt;
&lt;p&gt;I love &lt;a href=&quot;http://blog.whatfettle.com/2008/02/19/mashup-or-integration/&quot; title=&quot;Pauls definition of mashup&quot;&gt;Paul&#39;s definition of a mash up&lt;/a&gt; :&lt;/p&gt;
&lt;p&gt;To me its actually simpler,&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;mash ups are fun&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;integration sounds like hard work and usually is&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As &lt;a href=&quot;http://blogs.law.harvard.edu/doc/&quot; title=&quot;Doc Searls&quot;&gt;Doc&lt;/a&gt; points out Markets are conversations, two way conversations, which means companies need to state very clearly to big vendors what they need to change. In this case, its zero touch access to data stored with-in an enterprise system.&lt;br /&gt;
Maybe the big vendors will sort out their act or maybe open source and open standards will provail in the enterprise leaving the vendors wondering what to do with all their consultants.&lt;/p&gt;
&lt;p&gt;Will that day ever happen?? I&#39;m hoping so.....&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://blog.whatfettle.com/&quot;&gt;PSD&lt;/a&gt; has also pointed me to a earlier post of his : &lt;a href=&quot;http://blog.whatfettle.com/2007/01/12/a-moral-tale/&quot;&gt;A Moral Tale&lt;/a&gt;, which is well worth a read.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Innovating with small pieces loosely joined</title>
    <link href="https://simonmcmanus.com/posts/innovating-with-small-pieces-loosely-joined/"/>
    <updated>2008-02-29T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/innovating-with-small-pieces-loosely-joined/</id>
    <content type="html">&lt;p&gt;It&#39;s hard to justify the production of a single piece in a jigsaw.&lt;/p&gt;
&lt;p&gt;A mash-up is much like a jigsaw. The services which sit behind the mash-up are generally of less value than the combined value. Businesses want to own the whole jigsaw because that is where the obvious money is.&lt;/p&gt;
&lt;p&gt;So why should a company expose data when they can see no immediate benefit? Can exposing such a service be justified when the benefit to the end user is not immediately obvious?&lt;/p&gt;
&lt;p&gt;Businesses seem to understand the widget model quite well. They can stretch their online estate, pushing the brand outside of the traditional .com domain. However, when the only reference to the brand is an AJAX call to a server never seen by the end user, where is the value?&lt;/p&gt;
&lt;p&gt;Businesses are comfortable with prescribed innovation. They need an idea before there is investment, and exposing data is not an idea. The thing that I particularly love about the English language is that it&#39;s described rather than prescribed.&lt;/p&gt;
&lt;p&gt;Its the reasons that we have words such as: &amp;quot;&lt;strong&gt;blogosphere&lt;/strong&gt;&amp;quot;, &amp;quot;&lt;strong&gt;flash mob&lt;/strong&gt;&amp;quot; and &amp;quot;&lt;strong&gt;stealth tax&lt;/strong&gt;&amp;quot; in the Oxford English dictionary.&lt;/p&gt;
&lt;p&gt;Solving problems not building business models....in many cases we may not even be able to see a problem. The end users knows all about the problems and weaknesses, and if you can enable the edges of your network to try out different solutions to their problems you are going to see more innovative solutions.&lt;/p&gt;
&lt;p&gt;Lets think of it as an innovation model rather than a business model. By allowing developers to mash up their own data you find out that they want to do something with it that you could never have imagined. You can then incorporate those ideas into your own product(s).&lt;/p&gt;
&lt;p&gt;In my previous post I said that :&lt;/p&gt;
&lt;p&gt;&amp;quot;Software (as with people) is only as good as its ability to interact with the eco-system around it.&amp;quot;&lt;/p&gt;
&lt;p&gt;Increasingly we are judging software by its ability to pump information in and out. How long will it be until the same can be said about a business?&lt;/p&gt;
&lt;p&gt;If you have any other good reasons for business opening up there data please let me know.&lt;/p&gt;
&lt;p&gt;As always comments welcome.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Announcing ccTiddly 1.5.1</title>
    <link href="https://simonmcmanus.com/posts/announcing-cctiddly-151/"/>
    <updated>2008-03-10T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/announcing-cctiddly-151/</id>
    <content type="html">&lt;p&gt;Over the last few weeks and months I have slowly been working away with Matt toward ccTiddly 2.0. Its still early days but we wanted to start getting feedback as soon as possible, so please welcome ccTiddly 1.5 Alpha.I have added information about the release to the tiddlywiki.org wiki.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://tiddlywiki.org/wiki/CcTiddly/v1.5.1_Release_Notes&quot;&gt;http://tiddlywiki.org/wiki/CcTiddly/v1.5.1_Release_Notes&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If you have any problems please raise them on the ccTiddly google groups :&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://groups.google.com/group/ccTiddly&quot;&gt;http://groups.google.com/group/ccTiddly&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Cheers&lt;/p&gt;
&lt;p&gt;Simon&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Rest in Peace Civil Serf</title>
    <link href="https://simonmcmanus.com/posts/rest-in-peace-civil-serf/"/>
    <updated>2008-03-10T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/rest-in-peace-civil-serf/</id>
    <content type="html">&lt;p&gt;I was upset this morning to read that the Civil Serf blog had been shut down. It did however explain why the RSS feed had been filled with info about the birth of a French baby called Arthur and other less useful info.For those of you that don&#39;t know, Civil Serf was a blog by a civil servant providing a great insight into the internal runnings of government.&amp;quot;The online diarist, known only as &amp;quot;Civil Serf&amp;quot;, has been titillating readers with tales of incompetence from within the government machine since last November.&amp;quot; - Scotsman&lt;/p&gt;
&lt;p&gt;She eventually gave enough details for her to be identity to be revealed so it was not entirely unexpected.&lt;/p&gt;
&lt;p&gt;We (businesses) spend a great deal of time talking about how tools such as blogs can improve collaboration within businesses. The same can surely be said for Government.&lt;/p&gt;
&lt;p&gt;As &lt;a href=&quot;http://mulqueeny.wordpress.com/2008/03/04/social-media-and-democracy/&quot;&gt;Emma Mulqueeny&lt;/a&gt; Says :&amp;quot;Anyone who works in an e-media team in the public sector, will tell you how difficult it is to champion the use of any social media tool to any great effect. And, other than responding to the perennial cry: &#39;I want a blog&#39; - which never, ever really means I want a blog (Miliband excepted of course) there is little or no interest. This could be due to the fact that there is a great nervousness around it: mis-information and wild assumptions all ultimately culled by risk aversion/avoidance.&amp;quot;&lt;/p&gt;
&lt;p&gt;The internet is far less tolerable of nicely worded press statements that have been worded in corporate/politicians waffle. Or as &lt;a href=&quot;http://blogs.law.harvard.edu/doc/&quot;&gt;Doc&lt;/a&gt; puts it :The internet means &amp;quot;Bullshit will lose leverage.&amp;quot;&lt;/p&gt;
&lt;p&gt;In fact politicians could learn a lot from listening to folk like &lt;a href=&quot;http://blogs.law.harvard.edu/doc/&quot;&gt;Doc&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;.. Markets are Conversation.&lt;br /&gt;
... Election should be Conversations?&lt;br /&gt;
.... Conversations will win Elections!&lt;/p&gt;
&lt;p&gt;Businesses, politicians and parties need to understand this.&lt;/p&gt;
&lt;p&gt;Politicians need to learn to engage people in conversations. It&#39;s an interesting issue if a civil servant should blog but there is clearly a lot that can be learned by politicians from this experience.&lt;/p&gt;
&lt;p&gt;Corporates are currently trying to understand how they can be private in public; trying to understand how they can collaborate with their customers safely on the internet while still keeping their core data secure. It&#39;s an interesting issue. There are great benefits from any organisation talking openly about its ideas before it commits firmly to them.&lt;/p&gt;
&lt;p&gt;Obviously certain information needs to be kept secure for legal, financial, commercial, diplomatic or political reasons but when I start thinking seriously about what information needs to be protected and what would benefit from being shared the vast majority falls into the &amp;quot;should be shared&amp;quot; category.&lt;/p&gt;
&lt;p&gt;The Data Protection Act allows people to request information, usually when its too late, so the government ends up giving out information that results in the government looking bad. Maybe this is fueling an attitude where politicians are scared to give out information early.&lt;/p&gt;
&lt;p&gt;Hiding problems which are shared with others rarely makes sense.&lt;/p&gt;
&lt;p&gt;&amp;quot;Information wants to be free!&amp;quot;- ?&lt;/p&gt;
&lt;p&gt;&amp;quot;The internet recognises censorship as a fault and routes around it.&amp;quot;-?&lt;/p&gt;
&lt;p&gt;Governments could be using blogs such as this as a great way to dip their toe in the water, instead of leaking a policy one week before announcing it.&lt;/p&gt;
&lt;p&gt;I have not managed to find much information about the circumstances around the blog being shut down (it only happened over the weekend). While I understand the reasons for shutting it down I would much rather see them do something more positive with the blog. If the civil servant has been identified and sacked it will be a real shame for the civil service. They would be wasting a fine asset.&lt;/p&gt;
&lt;p&gt;One day I will try to read the &lt;a href=&quot;http://www.civilservice.gov.uk/documents/doc/cscode/cscode.doc&quot;&gt;civil service code&lt;/a&gt; and form a slightly stronger opinion about how openly civil servants should be allowed to blog.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Avoid being Civil Serfed</title>
    <link href="https://simonmcmanus.com/posts/avoid-being-civil-serfed/"/>
    <updated>2008-03-11T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/avoid-being-civil-serfed/</id>
    <content type="html">&lt;p&gt;So it seems the Civil Serf case is causing something of a stir.&lt;/p&gt;
&lt;p&gt;For me the bigger issue here is how we can encourage management to let people blog about their work. Particularly people working for Government. I suspect governance/regulation can only provide minimal assistance on this matter, what we need is common sense.&lt;/p&gt;
&lt;p&gt;Personally I have never read our companies&#39; blogging policy, I think we have one, but there are some pretty common sense rules which have managed to keep me in work so far :&lt;/p&gt;
&lt;p&gt;- Be authentic and honest.&lt;br /&gt;
- Don&#39;t bitch - If you must then make sure you back it up with evidence.&lt;br /&gt;
- Justify what you say.&lt;br /&gt;
- Make your Mum proud, my mum doesn&#39;t understand most of the stuff I blog about but I like to think she would be proud if she did understand.&lt;br /&gt;
- Learn from your mistakes.&lt;br /&gt;
- keep secrets secret.&lt;br /&gt;
- Talk to your boss about what you&#39;re blogging and why.&lt;br /&gt;
- Abstract away from events/people/companies/parties and talk about anonymous examples.&lt;br /&gt;
- Don&#39;t be afraid of being wrong (this one does depend a bit more on your employer)&lt;br /&gt;
- Make it clear that the views expressed are yours and not that of your past, present or any future employer.&lt;/p&gt;
&lt;p&gt;I am quite fortunate in that &lt;a href=&quot;http://jermolene.wordpress.com/&quot; title=&quot;Jeremy Ruston&quot;&gt;my boss&lt;/a&gt; and &lt;a href=&quot;http://confusedofcalcutta.com/&quot;&gt;his boss&lt;/a&gt; are bloggers with a good understanding of the blogosphere.&lt;/p&gt;
&lt;p&gt;There is one key thing here, the people at the top need to realise that the &amp;quot;one voice culture&amp;quot; cannot be maintained. There will always be a variety of opinions in any organisation; it&#39;s often the variety in opinions that result in great innovations. To stop your customers talking to your staff about ideas does not seem to make sense. When you take it a step further and stop politicians/civil servants talking to voters it makes even less sense. My understanding of the role of civil servants is quite limited, but I suspect we need to encourage them to debate topics in public using the same level of professionalism that they would use when discussing any given issue with their boss. &lt;a href=&quot;http://whitehallwebby.wordpress.com/disclaimer/&quot;&gt;Jeremy&#39;s Whitehall Webb blog&lt;/a&gt; provides a nice example.&lt;/p&gt;
&lt;p&gt;I was pleased to see that &lt;a href=&quot;http://www.tom-watson.co.uk/&quot;&gt;MP Tom Watson&lt;/a&gt; seems to get the idea; let&#39;s hope his colleagues see the benefits of his conversations and start their own.&lt;/p&gt;
&lt;p&gt;Exclusively positive blogs don&#39;t work. People can tell when a PR machine has been working away on a statement, even when it&#39;s cunningly disguised as a blog post - the tone of voice lacks authenticity. You need to let people talk about negatives, but at the same time empower them to turn them into positives.&lt;/p&gt;
&lt;p&gt;Most complaints start with a small fault which only becomes a complaint through poor communication/management.&lt;/p&gt;
&lt;p&gt;Forming tight guidelines on what you can and cannot say is never going to encourage people to blog, quite the opposite - and besides, lengthy policy documents never get read.&lt;/p&gt;
&lt;p&gt;Just to confirm, The Guardian quotes me as saying that I believe that Civil Serf has been sacked. I actually said &amp;quot;If the civil servant has been identified and sacked it will be a real shame for the civil service&amp;quot;. In fact I suspect &#39;she&#39; may have pulled the blog to avoid being sacked. It&#39;s mainly for this reason that I have not re-published the blog posts which google reader stored nicely for me.&lt;/p&gt;
&lt;p&gt;Is/Was &#39;She&#39; really an Asset?&lt;/p&gt;
&lt;p&gt;Well she started an inevitable conversation which is never a bad thing. Looking back over the Civil Serf posts I don&#39;t see any comments. I&#39;m not sure if that&#39;s because they were never enabled or they have not been cached. I would like to have read over peoples reactions to the blog. If there was no ability to add comments the blog was effectively just a scratching post.&lt;/p&gt;
&lt;p&gt;As for setting back Government 2.0...&lt;a href=&quot;https://simonmcmanus.com/posts/bullshit-20/&quot;&gt;I&#39;m no fan of terminology 2.0&lt;/a&gt; &lt;a href=&quot;https://simonmcmanus.com/posts/bullshit-20/&quot;&gt;&lt;/a&gt;mainly because people seem to use such terms to describe things they don&#39;t understand or can&#39;t explain. I suspect we can learn a great deal about Government 2.0 and the issues that need to be tackled in order to make it a reality. Whatever that reality may be.&lt;/p&gt;
&lt;p&gt;If you want to learn more about blogging in Corporates I can recommend reading &lt;a href=&quot;http://www.amazon.com/Naked-Conversations-Changing-Businesses-Customers/dp/047174719X&quot;&gt;Naked Conversation&lt;/a&gt; from &lt;a href=&quot;http://scobleizer.com/&quot;&gt;Robert Scoble&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Shel_Israel&quot;&gt;Shel Israel.&lt;/a&gt; Its a good read.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>ccTiddly File Uploading</title>
    <link href="https://simonmcmanus.com/posts/cctiddly-file-uploading/"/>
    <updated>2008-03-20T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/cctiddly-file-uploading/</id>
    <content type="html">&lt;p&gt;Over the last couple of days I have been working on the ccUpload macro for &lt;a href=&quot;http://www.tiddlywiki.org/wiki/CcTiddly&quot;&gt;ccTiddly&lt;/a&gt;.  This is a macro that will allow people to upload files to the ccTiddly server so that it can linked to and included in their TiddlyWikis.&lt;/p&gt;
&lt;p&gt;The work was in part motivated by &lt;a href=&quot;http://jaybyjayfresh.com/&quot;&gt;Jon&#39;s&lt;/a&gt; requirement to post HTML files and strings to a end point where the file is then uploaded. This is a part of his &lt;a href=&quot;http://jaybyjayfresh.com/2008/01/23/tiddlytemplating-using-tiddlywiki-to-create-webpages/&quot;&gt;template work&lt;/a&gt; and some SEO work which will naturally fall out from it - that, however, is a completely different blog post.&lt;/p&gt;
&lt;p&gt;We are getting to the stage where we have something functional to share and wanted to provide the opportunity for community feedback.&lt;/p&gt;
&lt;p&gt;We&#39;re introducing three concepts for ccTiddly users; instances, workspaces and user areas.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Instance&lt;/strong&gt;: An area containing multiple workspaces.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Workspace&lt;/strong&gt;: An online area where an individual TiddlyWiki can be stored and maintained. The area can also contain files which have been uploaded by a workspace administrator.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;User area&lt;/strong&gt;: An online area exclusively dedicated to the uploading of files by a single user. Each user has their own user area by default.&lt;/p&gt;
&lt;p&gt;The macro enabling file upload does not require the page to refresh in order to upload additional files; instead it posts the form to a hidden iFrame for processing. At present, we&#39;re giving users the choice to upload their file to either their workspace or their user area. I am probably going to remove the ability to upload a file to a user area for sake of simplicity (although the code will still exist and can be used if needed).&lt;/p&gt;
&lt;p&gt;I am yet to decide what convention I will use when assigning a user area directory to OpenID users. The following structure is not an option:&lt;br /&gt;
wiki.osomsosft.com/uploads/users/https://simonmcmanus.com&lt;/p&gt;
&lt;p&gt;I would be interested to hear any suggestions/examples.&lt;/p&gt;
&lt;p&gt;I have currently not implemented any security with ccTiddly.  I am currently thinking that we will only allow people to upload files if they are the owner of the workspace; at the back end users will be able to upload files to their user space provided they are logged in.&lt;/p&gt;
&lt;p&gt;Here are the screenshots showing the work so far..... feedback is welcomed.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://farm3.static.flickr.com/2042/2347575468_de9c5a584e.jpg?v=0&quot; alt=&quot;&quot; /&gt;&lt;br /&gt;
&lt;img src=&quot;https://farm3.static.flickr.com/2130/2346744603_3a3697567b.jpg?v=0&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;You can either leave your comments against this blog post or leave them on the google groups page :&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://groups.google.com/group/ccTiddly&quot;&gt;http://groups.google.com/group/ccTiddly&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We are also going to need an area where people can browse and manage their uploaded files. That will probably take the form of a separate macro (ccBrowse??) but I would be interested to hear from anyone who sees value in displaying the previously uploaded files underneath the upload functionality as the below sketch shows :&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://farm3.static.flickr.com/2275/2346781123_dc056653bd.jpg?v=1206012805&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Does this sound useful to anyone?&lt;/p&gt;
&lt;p&gt;When I have formalised the upload API, I will document it on the &lt;a href=&quot;http://tiddlywiki.org/wiki/CcTiddly&quot;&gt;ccTiddly&lt;/a&gt; page on &lt;a href=&quot;http://tiddlywiki.org/&quot;&gt;TiddlyWiki.org&lt;/a&gt;. I hope to have this code released in the next week or two.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Free our Bills</title>
    <link href="https://simonmcmanus.com/posts/free-our-bills/"/>
    <updated>2008-03-26T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/free-our-bills/</id>
    <content type="html">&lt;p&gt;For those of you that have not already seen &lt;a href=&quot;http://www.theyworkforyou.com/&quot;&gt;http://www.theyworkforyou.com/&lt;/a&gt; please go and check it out now. Its been around for a good few years now but I was particularly pleased to see their recent action list (&lt;a href=&quot;http://www.theyworkforyou.com/freeourbills/&quot;&gt;Free our Bills&lt;/a&gt;) has gained support from David Cameron. Im sure this will make lots of the &amp;quot;Give us our data back&amp;quot; folk happy.&lt;/p&gt;
&lt;p&gt;[youtube=http://www.youtube.com/watch?v=ter8T5B8ojI]&lt;/p&gt;
&lt;p&gt;In relation to &lt;a href=&quot;http://mulqueeny.wordpress.com/&quot;&gt;Emma Mulqueenys&lt;/a&gt; point about &lt;a href=&quot;http://mulqueeny.wordpress.com/2008/03/19/links-libel-and-law/&quot;&gt;Links, libel and law&lt;/a&gt;. My linking to Mr Cameron does not in anyway suggest support for his views except in the Free our Bills case. I am simply linking to an article which I have read/watched and found sufficiently interesting to share with others.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>How to save your Enterprise some money</title>
    <link href="https://simonmcmanus.com/posts/how-to-save-your-enterprise-some-money/"/>
    <updated>2008-04-11T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/how-to-save-your-enterprise-some-money/</id>
    <content type="html">&lt;p&gt;Here is something I have noticed: the people that specify enterprise software requirements and success criteria are rarely the end user. They are business owners and spreadsheet supervisors.&lt;/p&gt;
&lt;p&gt;The software produces great reports but the experience to the end user is rarely properly considered. The tendency is to meet the objectives of the business owner rather than the needs of end users.&lt;/p&gt;
&lt;p&gt;So this blog post is about saving money. Well, time is money...right? Take an expenses system. If your employees spend their time trying to work out how to use the system, that&#39;s time not being spent making money.&lt;/p&gt;
&lt;p&gt;Imagine saving every employee 5-10 minute each month. Across 100,000 people, that&#39;s 100,000 - 200,000 man hours a year!&lt;/p&gt;
&lt;p&gt;Enterprise software pays a reasonable amount of attention to accessibility but not enough to usability. Now I&#39;m no user experience expert but I have been exploring some &lt;a href=&quot;http://en.wikipedia.org/wiki/Experience_design&quot; title=&quot;//en.wikipedia.org/wiki/Experience_design&quot;&gt;experience design&lt;/a&gt; techniques with &lt;a href=&quot;http://philwhitehouse.blogspot.com/search/label/experience%20design&quot; title=&quot;//philwhitehouse.blogspot.com/search/label/experience%20design&quot;&gt;Phil&lt;/a&gt; recently (for the new ccTiddly macros). I think the correct use of such techniques within the enterprise would make a massive difference. In fact any technique that stops developers thinking so much like developers and more like the poor sod who&#39;s going to be relying on the software the better.&lt;/p&gt;
&lt;p&gt;Imagine being able to apply the time savings across each of &lt;a href=&quot;http://confusedofcalcutta.com/&quot; title=&quot;//confusedofcalcutta.com&quot;&gt;JP&#39;s&lt;/a&gt; &lt;a href=&quot;http://confusedofcalcutta.com/2006/03/30/four-pillars-time-for-a-recap/&quot; title=&quot;//confusedofcalcutta.com/2006/03/30/four-pillars-time-for-a-recap/&quot;&gt;four pillars&lt;/a&gt; : Search, Syndication, Conversation and fulfillment.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Politics, Twitter and Accessibility (politically speaking)</title>
    <link href="https://simonmcmanus.com/posts/politics-twitter-and-accessibility-(politically-speaking)/"/>
    <updated>2008-04-23T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/politics-twitter-and-accessibility-(politically-speaking)/</id>
    <content type="html">&lt;p&gt;I used to love politics. Over the last four or five years I&#39;ve developed a dislike for it.  I was starting to think I had maybe grown out of it or maybe I&#39;m no-longer so idealistic and naive.&lt;/p&gt;
&lt;p&gt;Some interesting things have been happening recently, I bumped into &lt;a href=&quot;http://twitter.com/abscond&quot;&gt;@absond&lt;/a&gt; on the train into work a good few months back. He told me about &lt;a href=&quot;http://www.barcamp.org/BarcampUKGovweb&quot;&gt;BarCampUKGovWeb&lt;/a&gt; which sounded quite interesting.&lt;/p&gt;
&lt;p&gt;Ive since started following a number of blogs from people that work in and around government. I&#39;ve even started to follow the blogs of some MP&#39;s. I have so far followed all MP&#39;s I am aware of regardless of party.&lt;/p&gt;
&lt;p&gt;I don&#39;t pay particular attention to every post but rather scan read whatever they choose to blog. As more MP&#39;s start to blog I will need to become more selective. At the moment its interesting just to see what our representatives feel comfortable blogging about.&lt;/p&gt;
&lt;p&gt;The other day &lt;a href=&quot;http://www.lynnefeatherstone.org/column190-beijing-olympics.htm&quot;&gt;this post&lt;/a&gt; from &lt;a href=&quot;http://www.lynnefeatherstone.org/&quot;&gt;Lynne Featherstone&lt;/a&gt; caught my attention.  She talks about human rights in China in relation to the Olympics.  An issue at the front of my mind after going to see the Olympic torch pass St Paul&#39;s the previous week.  We didn&#39;t actually see the torch, it was bundled onto a bus with the Chinese thugs just before it got to us. Regardless I found Lynne&#39;s post quite agreeable.&lt;/p&gt;
&lt;p&gt;Normally in this situation I would drop a comment on the blog to show my agreement. Unfortunately &lt;a href=&quot;http://www.lynnefeatherstone.org/&quot;&gt;Lynne&#39;s blog&lt;/a&gt; is not quite a real blog. You can&#39;t add comments.  Here is what is really cool though, Lynne&#39;s on &lt;a href=&quot;http://twitter.com/&quot;&gt;Twitter&lt;/a&gt;. So I tweeted her.&lt;/p&gt;
&lt;p&gt;The Downing Twitter feed is rather interesting. &lt;a href=&quot;http://twitter.com/downingstreet&quot;&gt;@DowningStreet&lt;/a&gt;. It provides updates, responds to questions and actually provides an interesting insight into life at Downing Street.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;http://twitter.com/Conservatives&quot;&gt;@Conservative&lt;/a&gt; twitter feed even impressed me yesterday. I was getting ready for work when they tweeted that David Cameron was going to be interviewed on BBC 1 just after 8am... and they wanted feedback. So I watched. And then I replied :&lt;/p&gt;
&lt;p&gt;&amp;quot;&lt;a href=&quot;http://twitter.com/Conservatives&quot;&gt;@Conservatives&lt;/a&gt; - not bad - Your still not getting my vote. Just to confirm. Are you left or right these days?&amp;quot;&lt;/p&gt;
&lt;p&gt;It was slightly sarcastic and I wasn&#39;t particularly expecting a reply. When I arrived at work an hour later there was a reply from the Conservative  Party.&lt;/p&gt;
&lt;p&gt;&amp;quot;&lt;a href=&quot;http://twitter.com/simonmcmanus&quot;&gt;@simonmcmanus&lt;/a&gt; Thanks for your feedback, and we&#39;re on the centre-right!&amp;quot;&lt;/p&gt;
&lt;p&gt;For the first the first time in my life I had engaged in a two way conversation with a political party!&lt;/p&gt;
&lt;p&gt;The 140 character constraint removes some of the formality associated with blogging and email.   I sure as hell wouldn&#39;t have written that in an email.  Even an email of the same length. Twitter, it would seem is making politicians more accessible. Or at least making politicians appear more accessible.&lt;/p&gt;
&lt;p&gt;I&#39;m really interested to see how this all develops. I&#39;m loving the idea of my MP being on Twitter.  Lets hope &lt;a href=&quot;http://www.eppingforestconservatives.com/index.php?option=com_content&amp;amp;task=view&amp;amp;id=12&amp;amp;Itemid=1&quot;&gt;Eleanor Lang&lt;/a&gt; (my MP) is listening.  I would love to see politicians adopting these tools because they provide a  highly effective communications platform.&lt;/p&gt;
&lt;p&gt;I should thank &lt;a href=&quot;http://puffbox.com/&quot;&gt;http://puffbox.com/&lt;/a&gt; for keeping me informed about the latest politicians using Twitter.  Interesting to see that &lt;a href=&quot;http://twitter.com/brianpaddick&quot;&gt;@brianpaddick ,&lt;/a&gt; &lt;a href=&quot;http://twitter.com/backboris&quot;&gt;@backboris&lt;/a&gt; are both using Twitter.&lt;/p&gt;
&lt;p&gt;Politics and politicians can often seem invisible and unaccountable. Twitter could start to change that.  Given that MP&#39;s claim to represent us in parliament I don&#39;t think its wrong to wonder.....What are they doing?&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Offline is back Online</title>
    <link href="https://simonmcmanus.com/posts/offline-is-back-online/"/>
    <updated>2008-08-11T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/offline-is-back-online/</id>
    <content type="html">&lt;p&gt;Sorry I haven&#39;t blogged for a while...I&#39;ve been keeping myself busy with several changes to ccTiddly!&lt;/p&gt;
&lt;p&gt;I&#39;m pleased to announce the imminent release of &lt;a href=&quot;http://tiddlywiki.org/wiki/CcTiddly&quot;&gt;ccTiddly&lt;/a&gt; v1.7! This version of ccTiddly was originally going to contain the new server side plugin functionality. It was decided that the next release would contain so much new functionality that it would be inappropriate and in fact confusing to release it as v1.6.5, and so v1.7 does not include server side plugins. Plugins are still planned for the next release: ccTiddly v1.8.&lt;/p&gt;
&lt;h2&gt;Syncing Functionality&lt;/h2&gt;
&lt;p&gt;From v1.7 of ccTiddly onwards, users will be able to take a copy of a ccTiddly workspace (collaborative wiki) with them on a train, plane or anywhere without an internet connection. While a user is offline the wiki will save changes locally like a conventional TiddlyWiki file.&lt;/p&gt;
&lt;p&gt;When the user has finished making changes offline, and when reconnected to the internet, they can click the sync button on their local version of ccTiddly and their changes will be sent back to the server.&lt;/p&gt;
&lt;p&gt;Based on the changes, TiddlyWiki will show the following options before syncing:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://farm4.static.flickr.com/3188/2731660267_fd75c77b85.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;This is very new functionality. It&#39;s working in Firefox nicely. Unfortunately, I now need to get it working in IE6. Given that IE6 is likely to be challenging, I don&#39;t want to make any promises about release dates. However I suspect it will be out in the next few weeks! If you can&#39;t wait to have a play the code is in the &lt;a href=&quot;http://svn.tiddlywiki.com/&quot;&gt;TiddlyWiki subversion repository&lt;/a&gt;&lt;a href=&quot;http://svn.tiddlywiki.com/&quot;&gt;.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;By using a TiddlyWiki adaptor, ccTiddly can now provide support for enhancements including lazy loading (see below) and integration with projects such as &lt;a href=&quot;http://tiddlysnip.com/&quot; title=&quot;//tiddlysnip.com/&quot;&gt;TiddlySnip&lt;/a&gt; (a firefox extension for moving web content to your wiki).&lt;/p&gt;
&lt;h2&gt;New Macros&lt;/h2&gt;
&lt;p&gt;As part of the ccTiddly project, I have been rewriting many of the ccTiddly macros so that they work with TiddlyWiki slightly better than they did originally.&lt;/p&gt;
&lt;p&gt;ccTiddly 1.7 will introduce the following new macros :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;&amp;lt;&amp;lt;ccLogin&amp;gt;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ok, so this is not a new macro but it&#39;s been completely redesigned and making full use of the TiddlyWiki wizard framework. It has also been integrated with the register macro. If the register macro is installed there will be a register button on the login screen.&lt;/p&gt;
&lt;p&gt;I hope to extend this mechanism for things like &lt;a href=&quot;http://openid.net/&quot; title=&quot;//openid.net/&quot;&gt;OpenID&lt;/a&gt; login.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;&amp;lt;&amp;lt;ccEditWorkspace&amp;gt;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This macro will allow users to update the permissions on an existing workspace. It currently only allows users to set permissions for anonymous users but will be extended to support setting permissions for admins, logged in users and possibly groups.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;&amp;lt;&amp;lt;ccManage&amp;gt;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The ccManage macro will allow workspace administrators to grant other users administration access to a given workspace.&lt;/p&gt;
&lt;h2&gt;New Skins&lt;/h2&gt;
&lt;p&gt;TiddlyWiki recently introduced the concept of single tiddler themes. These allow developers to pack many different tiddlers into a single tiddler which makes up a theme e.g. stylesheet, pageTemplate and viewTemplate. ccTiddly now makes full use of the theme mechanism. We will distribute ccTiddly 1.7 with three themes.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://farm4.static.flickr.com/3024/2753077987_cd23bdd133.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Improved Architecture&lt;/h2&gt;
&lt;p&gt;We have now reached an important milestone in ccTiddly where the Javascript and PHP code are completely separate. This greatly simplifies ccTiddly. All modification to theTiddlyWiki file are loaded from the /tiddlers/ folder as either .js files or .tiddler files.&lt;/p&gt;
&lt;p&gt;There is a file: /includes/ccAssignments.php which creates the ccAssignments tiddler. This is the only point where the PHP and Javascript cross over.&lt;/p&gt;
&lt;p&gt;Any requests made from the client to the server are handled by a file in the /handle/ folder.&lt;/p&gt;
&lt;h2&gt;Lazy Loading&lt;/h2&gt;
&lt;p&gt;With &amp;quot;Lazy loading&amp;quot; a subset of tiddlers are loaded in the first instance, and then others are only loaded upon request.&lt;/p&gt;
&lt;p&gt;In ccTiddly, it&#39;s possible to pass the tags variable in the URL. If the tags variable is specified in the URL, the ccTiddly workspace will only load tiddlers with the specified tag. For example;&lt;/p&gt;
&lt;p&gt;tags=task&lt;/p&gt;
&lt;p&gt;...would only return the tiddlers tagged &#39;task&#39; in the requested workspace. If users click on links to tiddlers which are not tagged task, they would be loaded at that point.&lt;/p&gt;
&lt;p&gt;This technique can be used to dramatically improve loading times of TiddlyWiki files. As soon as ccTiddly v 1.7 is available I will announce it on the &lt;a href=&quot;http://groups.google.com/group/ccTiddly&quot; title=&quot;//groups.google.com/group/ccTiddly&quot;&gt;ccTiddly groups&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>TiddlyDocs - Collaborating on large documents</title>
    <link href="https://simonmcmanus.com/posts/tiddlydocs-collaborating-on-large-documents/"/>
    <updated>2009-02-06T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/tiddlydocs-collaborating-on-large-documents/</id>
    <content type="html">&lt;p&gt;Recently I&#39;ve been building a proof of concept, the brief was simple...&lt;/p&gt;
&lt;p&gt;&amp;quot;Come up with a way for my team to collaborate with people outside the organisation on large Word document. At the moment, we tend to email them between us, which can degenerate into a nightmare.&amp;quot;&lt;/p&gt;
&lt;p&gt;Our approach was to think about breaking these large documents down into small sections which could be assigned to individuals for authoring and/or review. These sections could then be reassembled into a single document for printing.&lt;/p&gt;
&lt;p&gt;To build this proof of concept we used &lt;a href=&quot;http://tiddlywiki.com/&quot;&gt;TiddlyWiki&lt;/a&gt; and &lt;a href=&quot;http://jquery.com/&quot;&gt;jQuery&lt;/a&gt;. The latest release of TiddlyWiki (2.5) includes jQuery (1.2.6) so this provided a fine opportunity to explore the new potential.&lt;/p&gt;
&lt;p&gt;So &lt;a href=&quot;http://wiki.osmosoft.com/TiddlyDocs/&quot;&gt;here is the demo&lt;/a&gt;,&lt;/p&gt;
&lt;p&gt;The online demo does not demonstrate the iGoogle integration of TiddlyDocs.   The iGoogle integration showed how we could provide a personalised view of the sections assigned to each user.  While we used iGoogle for the original demo this portlet just contains HTML so could be embedded into any portal framework which supports HTML.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://blog.whatfettle.com/&quot;&gt;PSD&lt;/a&gt; wrote some &lt;a href=&quot;http://www.w3schools.com/xslfo/xslfo_intro.asp&quot;&gt;XSL-FO&lt;/a&gt; to translate the generated HTML into a printable PDF document. Paul&#39;s code can be found &lt;a href=&quot;http://svn.tiddlywiki.org/Trunk/contributors/PaulDowney/server/html2pdf/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h1&gt;&lt;strong&gt;Features :&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Drag and Drop your Table of Content&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://farm4.static.flickr.com/3318/3253469780_55cedf9eea.jpg&quot; alt=&quot;&quot; title=&quot;TiddlyDocs - drag n drop &quot; /&gt;&lt;/p&gt;
&lt;p&gt;Allows users to change the order and hierarchy of the document table of content&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Easily assign sections to Users&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://farm4.static.flickr.com/3391/3252648993_18d90588aa.jpg&quot; alt=&quot;&quot; title=&quot;TiddlyDoc - Assign chunk&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Allows each section to be easily assigned to a pre-populated list of users.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Full WYSIWYG text editing with FCKEditor&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://farm4.static.flickr.com/3503/3253482874_bc934ce199.jpg&quot; alt=&quot;&quot; title=&quot;TiddlyDocs&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Allows users to edit the document content in a familiar word style environment.  Also allows content including images to be pasted in the textarea from the clipboard.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;iGoogle Integration of Personalised Task Lists&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img.skitch.com/20090205-k7u7rpctmxsbmstudwr3mphiug.jpg&quot; alt=&quot;&quot; title=&quot;TiddlyDoc&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The iGoogle integration allows each users to have their own view of all the tasks assigned to them. This can be used in various portal frameworks.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Easy view of the documents status&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://farm4.static.flickr.com/3316/3253512996_30f9a0787c.jpg?v=0&quot; alt=&quot;&quot; title=&quot;TiddlyDoc - Status&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The bar to the right of the table of content shows the status of each section. When the bar is completely green the document is complete.  This example demonstrates that only one of the sections has been completed.&lt;/p&gt;
&lt;p&gt;**Each Section Allows for Comments&lt;br /&gt;
**&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://farm4.static.flickr.com/3302/3253503268_0b5bd3e38e.jpg&quot; alt=&quot;&quot; title=&quot;TiddlyDoc&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Each section allows multi-threaded comments which will not be printed in the final document.  This allows for conversations to take place around each section of content.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Components :&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We were able to build this proof of concept so quickly by reusing open source code that is available in the TiddlyWiki and jQuery communities.  Below I talk about the components that make up TiddlyDocs.&lt;/p&gt;
&lt;p&gt;**SplitView Plugin&lt;br /&gt;
**&lt;/p&gt;
&lt;p&gt;This is one of the plugins I wrote specifically for the demo. The macro accepts one parameter which is the name of another tiddler to store the document specification. The document specification is stored in list format, eg:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;* Heading 1&lt;/em&gt;_&lt;br /&gt;
* Heading 2&lt;br /&gt;
&lt;strong&gt;** Heading 2.1&lt;br /&gt;
** Heading 2.2&lt;/strong&gt;&lt;br /&gt;
* Heading 3_&lt;/p&gt;
&lt;p&gt;Every time the document is re-arranged the specification tiddler is saved.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PrintView Plugin&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is the other plugin which I wrote specifically for the demo.  This plugin can read the document specification, collect the data from each of the required tiddlers, and then generate a static html file on the server which can then be converted to PDF for printing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Single Page Mode Plugin&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Provided by Eric of &lt;a href=&quot;http://tiddlytools.com/&quot;&gt;TiddlyTools,&lt;/a&gt; the singlePageModePlugin ensures only one tiddler is viewed at a time.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://tiddlytools.com/#SinglePageModePlugin&quot;&gt;https://tiddlytools.com/#SinglePageModePlugin&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comments Plugin&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Allows users to post comments against individual sections. These comments are presented as a threaded discussion, allowing rich conversations to take place around the content.  Thanks to &lt;a href=&quot;http://softwareas.com/&quot;&gt;Michael Mahemoff&lt;/a&gt; for this plugin who also helped with the demo.&lt;a href=&quot;http://softwareas.com/&quot;&gt;&lt;br /&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://tiddlyguv.com/CommentsPlugin.html&quot;&gt;http://tiddlyguv.com/CommentsPlugin.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Value Switcher Plugin TeamTasks&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Taken from &lt;a href=&quot;http://hawksworx.com/&quot;&gt;Phil Hawksworth&lt;/a&gt;&#39;s TeamTasks, this allows the fields provided by TiddlyWiki to be used to store information about ownership and current status.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://svn.tiddlywiki.org/Trunk/contributors/PhilHawksworth/verticals/TeamTasks/core/plugins/ValueSwitcherPlugin.js&quot;&gt;https://svn.tiddlywiki.org/Trunk/contributors/PhilHawksworth/verticals/TeamTasks/core/plugins/ValueSwitcherPlugin.js&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;from:  &lt;a href=&quot;http://getteamtasks.com/&quot;&gt;http://getteamtasks.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;**FCKEditor&lt;br /&gt;
**&lt;br /&gt;
&lt;a href=&quot;http://www.fckeditor.net/&quot;&gt;FCKEditor&lt;/a&gt; is a project to make a nice WYSIWYG editor from any HTML textarea.  I have to say a I have been very impressed with FCKEditor.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.fckeditor.net/&quot;&gt;http://www.fckeditor.net/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TiddlyWiki FCKEditor Plugin&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A TiddlyWiki plugin that makes FCKEditor work nicely with TiddlyWiki.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://visualtw.ouvaton.org/VisualTW.html#FCKeditorPlugin&quot;&gt;http://visualtw.ouvaton.org/VisualTW.html#FCKeditorPlugin&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NestedSortable -(a  jQuery plugin)&lt;/strong&gt;&lt;br /&gt;
This jQuery plugin provides the drag and drop interface for the demo.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://code.google.com/p/nestedsortables/&quot;&gt;http://code.google.com/p/nestedsortables/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This demo is hosted by &lt;a href=&quot;http://www.tiddlywiki.org/wiki/CcTiddly&quot;&gt;ccTiddly&lt;/a&gt; but its been written to work on &lt;a href=&quot;http://www.tiddlywiki.org/wiki/TiddlyWeb&quot;&gt;TiddlyWeb&lt;/a&gt; and any other server-side implementation of TiddlyWiki.  Over the next few months I will be working on TiddlyDocs to prepare it for easy consumption.&lt;/p&gt;
&lt;p&gt;Updated : &lt;a href=&quot;http://softwareas.com/&quot;&gt;Michael Mahemoff&lt;/a&gt; has produced a screencast talking through the features of this demo :  &lt;a href=&quot;http://vimeo.com/3109248&quot;&gt;http://vimeo.com/3109248&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>My Recent Contribution to the House of Lords Information Committee</title>
    <link href="https://simonmcmanus.com/posts/my-recent-contribution-to-the-house-of-lords-information-committee/"/>
    <updated>2009-06-24T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/my-recent-contribution-to-the-house-of-lords-information-committee/</id>
    <content type="html">&lt;p&gt;My name is Simon McManus. I work as a web developer. After recently attending a UKGovBarCamp I noticed that it was difficult to reuse parliament&#39;s publications. I made a comment on a parliamentary blog post&lt;br /&gt;
which resulted in Richard contacting me via e-mail. The fact that I was able to comment in the first place has made it possible for me to speak to you now. Thank you for this opportunity.&lt;/p&gt;
&lt;p&gt;The essential dissatisfaction I have with the parliament website is that the information is not being published for re-use. In this paper I will explain what I mean by this, why I believe it and offer some alternative solutions. I would be more than happy to come and discuss this with you further and would appreciate any feedback that you might have.&lt;/p&gt;
&lt;h1&gt;Executive Summary&lt;/h1&gt;
&lt;p&gt;Websites like Wikipedia demonstrate how conversations can take place around information. For each article there is a discussions tab which allows readers and authors to discuss the articles. If you would like the same thing to occur around your meeting transcripts and legislation you need to change the format to make the data referenceable, commentable and easily queried by a programming language.&lt;/p&gt;
&lt;p&gt;I believe there are five steps to opening up Parliamentary data:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Data Copyright&lt;/li&gt;
&lt;li&gt;Making raw data available&lt;/li&gt;
&lt;li&gt;Marking up data with semantic information&lt;/li&gt;
&lt;li&gt;Making data linkable&lt;/li&gt;
&lt;li&gt;exposing data through APIs&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;each of these parts will now be discussed.&lt;/p&gt;
&lt;h2&gt;1 . Data Copyright&lt;/h2&gt;
&lt;p&gt;Publishing data online holds little value if the data has not been licensed for reuse. I suggest all parliamentary publications be made available under a creative commons copyright, so that anyone can republish commercially or otherwise.&lt;/p&gt;
&lt;h2&gt;2 . Making Raw data available.&lt;/h2&gt;
&lt;p&gt;It is important that the raw data dumps which make any application possible are also available to the public. The data should be available be with no style information, no scripting nothing but pure, unadulterated data. While there is value in Parliament building websites/applications it is far more important that developers have equal access to the original data so they can build other applications without the unaffected by the preconceptions of parliament.uk developers.&lt;/p&gt;
&lt;p&gt;Currently most parliamentary publications are in PDF form. This causes a number of problems :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Individual pages and sections are not indexed by search engines.&lt;/li&gt;
&lt;li&gt;It is difficult to programmatically extract data from a PDF.&lt;/li&gt;
&lt;li&gt;It is not possible to reference particular sections of a document.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;3 . Marking up data with semantic information&lt;/h2&gt;
&lt;p&gt;Theyworkforyou.com have put together a basic template of how parliament can improve the semantics of parliamentary publications. More details of their suggestions can be found at the following address :&lt;/p&gt;
&lt;p&gt;http://www.theyworkforyou.com/freeourbills/techy&lt;/p&gt;
&lt;p&gt;I fully endorse these suggestions. If followed, they would make it a great deal easier for developers like me to build new and richer interfaces because it makes the data more meaningful.&lt;/p&gt;
&lt;h2&gt;4 . Making data linkable&lt;/h2&gt;
&lt;p&gt;When writing the paper it was particularly difficult to find the references from transcripts of your Committee&#39;s meetings. It was sent to me in the following form :&lt;/p&gt;
&lt;p&gt;&amp;quot;The transcript of the meetings the Committee has had as part of its inquiry are available here:&lt;/p&gt;
&lt;p&gt;http://www.publications.parliament.uk/pa/ld/lduncorr.htm#info&lt;br /&gt;
(See in particular questions 78, 85 and 86 of the 1 April meeting).&amp;quot;&lt;/p&gt;
&lt;p&gt;Finding the information required the following steps to be taken:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;clicking the above link&lt;/li&gt;
&lt;li&gt;Searching for the meeting on the 1 April&lt;/li&gt;
&lt;li&gt;clicking another link which downloaded a big PDF file&lt;/li&gt;
&lt;li&gt;Waiting for the entire document to download&lt;/li&gt;
&lt;li&gt;Searching the pdf for question 78&lt;/li&gt;
&lt;li&gt;Searching the pdf for question 85&lt;/li&gt;
&lt;li&gt;Searching the pdf for question 86&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I would like to see an implementation where clicking the following three URLs would take you straight to view each question, allow you to read its answer and comment against either.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;http://www.publications.parliament.uk/InformationCommittee/PeopleAndParliament/Meetings/1April09/Question78&lt;/li&gt;
&lt;li&gt;http://www.publications.parliament.uk/InformationCommittee/PeopleAndParliament/Meetings/1April09/Question85&lt;/li&gt;
&lt;li&gt;http://www.publications.parliament.uk/InformationCommittee/PeopleAndParliament/Meetings/1April09/Question86&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If the information is published in HTML files which are being indexed by Google the bills will be findable in google and extend your outreach to every single user of google.&lt;/p&gt;
&lt;p&gt;The simplest way to expose data on the web is to break it down into small individually addressable sections each of which has a unique URL. These URLs can then be sent round in emails, added to a user&#39;s favorites or programmatically interrogated.&lt;/p&gt;
&lt;h2&gt;5 . Exposing data through APIs&lt;/h2&gt;
&lt;p&gt;An Application Programming Interface (API) provides developers an interface for interacting with a data set easily. By making it possible to programatically search legislation and comment against a particular section from a remote site, it becomes much easier for people to build new interfaces for the available data. A good API would make it really easy to build new ways of browsing, searching and commenting on legislation.&lt;/p&gt;
&lt;p&gt;Data should be exposed so that it can be presented in ways never expected by those collating the data. It is through this approach that you help people to view and, most importantly, interact with both Houses regarding proposed legislation.&lt;/p&gt;
&lt;p&gt;A good API will make data available in a number of different formats. HTML, XML and JSON are a good starting point. From the earliest possible opportunity any code being used to expose data should be open sourced so that developers can extend the existing code base without needing to start from scratch. Not only does this allow people to build things more quickly, it allows developers to extend functionality and form a community of developers working together to improve the nations data infrastructure.&lt;/p&gt;
&lt;p&gt;If Parliament wants to engage with people it will be a great deal easier on sites they already visit rather than the parliament.uk site. You cannot expect to engage the majority of the electorate at parliament.uk. It needs to be made particularly easy to integrate the goings on of both Houses into any website so that useful (relevant) data can be pulled in about a given subject.&lt;/p&gt;
&lt;p&gt;A site about digital rights and copyright should be able to make a call to the API which looks for any recent mentions of &amp;quot;Digital Rights&amp;quot; and &amp;quot;Copyright&amp;quot; and can then embed the results in its own site. I also suspect that providing functionality to comment against the results would massively increase the potential of both Houses to engage with the electorate.&lt;/p&gt;
&lt;p&gt;Below I have put together a general criteria for exposing data on the web :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The data should be indexable and discoverable in google/other search engines.&lt;/li&gt;
&lt;li&gt;The data should be exposed using open data formats (HTML, oof)&lt;/li&gt;
&lt;li&gt;The data should be licensed for re-use, even by commercial organisations.&lt;/li&gt;
&lt;li&gt;It should be possible to browse the data in a web browser.&lt;/li&gt;
&lt;li&gt;Make the original data set available.&lt;/li&gt;
&lt;li&gt;Maintain a consistent interface for developers to build against.&lt;/li&gt;
&lt;li&gt;Any code used to abstract away from the data should be open sourced.&lt;/li&gt;
&lt;li&gt;Any semantics that can be added to data are beneficial.&lt;/li&gt;
&lt;li&gt;There should not be separate systems for MPs and the public. Whatever system MPs use to look up bills, track their progress through parliament, find out amendments etc should be available to the public.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The following criteria are not essential but I suspect could have a major effect on parliaments ability to interact with the people online :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;the information should have a plain English summary. Often bills are full of jargon that makes them incomprehensible to many. A good example is the creative commons licenses. These have a plain English version and a legalspeak version.&lt;/li&gt;
&lt;li&gt;Electronic book support. All bill, minutes etc should be available in a non-proprietary electronic book format (eg epub) for download.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Please note all that all the above should be possible for very little cost. All the software required is available for free with open source software licenses. The primary cost should be for one or two developers who work with the community to expose data based on user/developer feedback.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Installing TiddlyDocs latest on TiddlyWeb (Mac)</title>
    <link href="https://simonmcmanus.com/posts/installing-tiddlydocs-latest-on-tiddlyweb-(mac)/"/>
    <updated>2009-09-21T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/installing-tiddlydocs-latest-on-tiddlyweb-(mac)/</id>
    <content type="html">&lt;p&gt;Assuming you have already installed TiddlyWeb and TiddlyWebWiki (http://tiddlyweb.peermore.com/wiki/) this is how to install the very latest development version of TiddlyDocs on your local machine :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl http://svn.tiddlywiki.org/Trunk/contributors/SimonMcManus/tiddlyweb/tiddlydocs/install.sh &amp;gt;install.sh
sudo sh install.sh
cd tiddlydocs
twanager server 127.0.0.1 8080   

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In your browsers then goto :&lt;/p&gt;
&lt;p&gt;http://127.0.0.1:8080/recipes/tiddlydocs/tiddlers.wiki&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>A Simple CKEditor Plugin Template</title>
    <link href="https://simonmcmanus.com/posts/a-simple-ckeditor-plugin-template/"/>
    <updated>2010-05-12T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/a-simple-ckeditor-plugin-template/</id>
    <content type="html">&lt;p&gt;FCKEditor has recently released a new version called &lt;a href=&quot;http://ckeditor.com/&quot;&gt;CKEditor&lt;/a&gt;. Unfortunately much of the documentation has not been updated which makes building things on top of the API somewhat difficult at the moment.&lt;/p&gt;
&lt;p&gt;I have published a basic template which make it clear how to create a plugin that adds an item to the CKEditor toolbar, when that button is pressed the users is presented with a simple dialog box containing two tabs which can interact with the parent editor.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Installing CKEditor with standalone TiddlyWiki</title>
    <link href="https://simonmcmanus.com/posts/installing-ckeditor-with-standalone-tiddlywiki/"/>
    <updated>2010-06-28T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/installing-ckeditor-with-standalone-tiddlywiki/</id>
    <content type="html">&lt;p&gt;I was recently asked how to use &lt;a href=&quot;http://ckeditor.com/&quot;&gt;CKEditor&lt;/a&gt; with a standalone &lt;a href=&quot;http://tiddlywiki.com/&quot;&gt;TiddlyWiki&lt;/a&gt;. &lt;a href=&quot;http://ckeditor.com/&quot;&gt;CKEditor&lt;/a&gt; is the replacement for FCKEditor. I&#39;ve been using it for a while in MyDocs (a customisation of &lt;a href=&quot;http://tiddlydocs.com/&quot;&gt;TiddlyDocs&lt;/a&gt;) but thought I would take this opportunity to document how it can be used in a standalone TiddlyWiki.&lt;/p&gt;
&lt;p&gt;First off we need to get all the tiddlers required for &lt;a href=&quot;https://ckeditor.com/&quot;&gt;CKEditor&lt;/a&gt;, the easiest way to do that is to cook the &lt;a href=&quot;http://svn.tiddlywiki.org/Trunk/verticals/ckeditor/index.html.recipe&quot;&gt;ckeditor vertical recipe&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For your convenience I&#39;ve uploaded the &lt;a href=&quot;https://simonmcmanus.com/posts/installing-ckeditor-with-standalone-tiddlywiki/tiddlywiki.com&quot;&gt;TiddlyWiki&lt;/a&gt; file it produces &lt;a href=&quot;https://simonmcmanus.com/stuff/ckeditor/index.html&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Now we need to download the &lt;a href=&quot;https://ckeditor.com/&quot;&gt;CKEditor&lt;/a&gt; files, You can download them &lt;a href=&quot;http://download.cksource.com/CKEditor/CKEditor/CKEditor%203.3.1/ckeditor_3.3.1.zip&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Finally you just need to change the location set in the &lt;a href=&quot;https://simonmcmanus.com/stuff/ckeditor/index.html#MarkupPreHead&quot;&gt;MarkupPreHead&lt;/a&gt; tiddler so it points to the CKEditor folder you just downloaded. In my case:&lt;/p&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;https://simonmcmanus.com/posts/installing-ckeditor-with-standalone-tiddlywiki/**./ckeditor/ckeditor.js**&quot;&gt;&lt;/script&gt;  
&lt;p&gt;If you are using cook you will need to save the MarkupPreHead tiddler from within the TiddlyWiki file for it to be set correctly. I have already done so in the example provided.&lt;/p&gt;
&lt;p&gt;You may also want to change the values in the &amp;quot;CKEditorSettings&amp;quot; tiddler.&lt;/p&gt;
&lt;p&gt;Save your changes, refresh the browser and that should do it.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>3D Transforms with CSS3</title>
    <link href="https://simonmcmanus.com/posts/3d-transforms-with-css3/"/>
    <updated>2011-01-05T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/3d-transforms-with-css3/</id>
    <content type="html">&lt;p&gt;Over Christmas I started moving &lt;a href=&quot;https://simonmcmanus.com/&quot; title=&quot;Simon McManus homepage&quot;&gt;simonmcmanus.com&lt;/a&gt; over to &lt;a href=&quot;http://nodejs.org/&quot;&gt;node.js&lt;/a&gt; making some tweaks to the CSS as I went. I wanted to examine the z-index of my page so decided to investigate CSS3 3D transformations. I won&#39;t be launching the new &lt;a href=&quot;https://simonmcmanus.com/&quot;&gt;simonmcmanus.com&lt;/a&gt; for a while but here is what I found out about 3D CSS transformations.&lt;/p&gt;
&lt;p&gt;The following examples only work on the latest webkit browsers (Chrome and Safari). In Chrome you will need to enable &amp;quot;GPU Accelerated Compositing&amp;quot;. Goto chrome flags and turn on &amp;quot;GPU Accelerated Compositing&amp;quot; and then restart Chrome.&lt;/p&gt;
&lt;p&gt;I started off with one of &lt;a href=&quot;http://www.paulrhayes.com/experiments/perspective/&quot;&gt;Paul Hayes early experiments&lt;/a&gt; which later progressed into his &lt;a href=&quot;http://www.paulrhayes.com/2009-07/animated-css3-cube-interface-using-3d-transforms/&quot;&gt;animated cube demo.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://simonmcmanus.com/stuff/css3/rotate/standalone/index.html&quot;&gt;Here is what I came up with.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Screenshots:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://simonmcmanus.files.wordpress.com/2011/01/1.png&quot;&gt;&lt;img src=&quot;https://simonmcmanus.files.wordpress.com/2011/01/1.png?w=300&quot; alt=&quot;&quot; title=&quot;1&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://simonmcmanus.files.wordpress.com/2011/01/2.png&quot;&gt;&lt;img src=&quot;https://simonmcmanus.files.wordpress.com/2011/01/2.png?w=300&quot; alt=&quot;&quot; title=&quot;2&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://simonmcmanus.files.wordpress.com/2011/01/3.png&quot;&gt;&lt;img src=&quot;https://simonmcmanus.files.wordpress.com/2011/01/3.png?w=300&quot; alt=&quot;&quot; title=&quot;3&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is what I did:&lt;/p&gt;
&lt;h3&gt;Step 1: Create the 3d space&lt;/h3&gt;
&lt;p&gt;Wrap two divs round the elements to appear in 3D :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;&amp;lt;div id=&amp;quot;perspective&amp;quot;&amp;gt;
  
   &amp;lt;div id=&amp;quot;rotator&amp;quot;&amp;gt;
  
      &amp;lt;!--original HTML in here--&amp;gt;
  
   &amp;lt;/div&amp;gt;
  
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Set the following CSS:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;.perspective { -webkit-perspective: 2400; }
.three-d { -webkit-transform-style: preserve-3d; }
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Step 2: Setting translateZ&lt;/h3&gt;
&lt;p&gt;Set translateZ for each item to appear 3D:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;-webkit-transform: translateZ(3em);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In my example I set it for the following items:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;h1,
.item,
.twitter-bird.sign,
.vcard{
   -webkit-transform: translateZ(3em); 
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In this case each z-index will be represented by 3ems.&lt;/p&gt;
&lt;h3&gt;Step 3: Making it move&lt;/h3&gt;
&lt;p&gt;Define the animation :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;#rotator {
   -webkit-animation-name: rotate;
   -webkit-animation-duration: 15s; 
   -webkit-animation-iteration-count: infinite;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And then specify the steps of the animation:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;@-webkit-keyframes rotate {
    0% {
       -webkit-transform:rotateY(0deg); 
   }
   5% {
      -webkit-transform:rotateY(0deg);
   }
   30% {
      -webkit-transform:rotateY(-40deg);
   }
   50% {
      -webkit-transform:rotateY(85deg);
   }
   55% {
      -webkit-transform:rotateY(85deg);
   }
   90% {
      -webkit-transform:rotateY(0deg);
   } 
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Step 4 ..  Perspective&lt;/h3&gt;
&lt;p&gt;To give a zoom effect I created a second animation:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;#perspective { 
   -webkit-animation-name: perspective;
   -webkit-animation-duration: 15s;
   -webkit-animation-iteration-count: infinite;
 }
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;@-webkit-keyframes perspective {
   0% {
      -webkit-perspective: 2400;
   }
   5% {
      -webkit-perspective:2400;
   }
   30% {
      -webkit-perspective:650;
   }
   50% {
      -webkit-perspective:2000;
   }
   55% {
      -webkit-perspective:2000;
   }
   70% {
      -webkit-perspective: 2400;
   }  
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://simonmcmanus.com/stuff/css3/rotate/standalone/index.html&quot; title=&quot;final demo&quot;&gt;final demo&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;That&#39;s what I&#39;ve done so far. Comments and modifications welcomed.&lt;/p&gt;
&lt;p&gt;Happy New Year&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Building on the Web</title>
    <link href="https://simonmcmanus.com/posts/building-on-the-web/"/>
    <updated>2011-02-11T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/building-on-the-web/</id>
    <content type="html">&lt;p&gt;&lt;strong&gt;Foundations&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When building a house the foundations are fundamental to it&#39;s structural integrity. Without good strong foundations the house is weak and liable to fall over at any moment.&lt;/p&gt;
&lt;p&gt;Things on the web also have foundations in the form of HTML and URIs.  JavaScript can then be layered on top to improve the experience. It&#39;s called progressive enhancement and people seem to be forgetting about it these days.&lt;/p&gt;
&lt;p&gt;It&#39;s pretty simple, build your HTML and CSS  first and then override the default behaviours with JavaScript.  This will ensure you are building on solid foundations.&lt;/p&gt;
&lt;p&gt;When generating HTML on the server, you can easily re-use it with JavaScript. Its far better than generating the HTML in the browser (with JavaScript) and either ignoring Search engines or having to duplicate your logic on the server for SEO, accessibility and things like RSS feeds.&lt;/p&gt;
&lt;p&gt;Here are some rather sweeping statements:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; JavaScript should NEVER be used to process data in the browser.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt; JavaScript should rarely be used in the browser to generate html (sharing code with server-side JavaScript is acceptable).&lt;/p&gt;
&lt;p&gt;I did warn you they were rather sweeping.&lt;/p&gt;
&lt;p&gt;I&#39;ve heard it said that if you want to provide an app/flash like experience you need to use JavaScript to render your pages: You need to build single page JavaScript apps.&lt;/p&gt;
&lt;p&gt;history.pushState() tells us otherwise. You can read about it &lt;a href=&quot;https://developer.mozilla.org/en/DOM/Manipulating_the_browser_history&quot; title=&quot;history.pushState docs&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Basically it makes it possible for what we now call single page web apps to exist across multiple pages while still providing nice page transitions (no page refresh).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;history.pushState() - A Fallback&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;History.pushState is all well and good but it&#39;s only available in WebKit and Firefox(4) at the moment.  Maybe that is why people are seeing &lt;a href=&quot;http://www.isolani.co.uk/blog/javascript/BreakingTheWebWithHashBangs&quot;&gt;hashbangs&lt;/a&gt; as an alternative solution. Personally I would rather fallback to a fragment identifier (#) only in situations where history.pushState is not available.&lt;/p&gt;
&lt;p&gt;There would need to be a bit of JavaScript at the top of each page redirecting users to the appropriate fragment identifier in browsers that do not support pushState.&lt;/p&gt;
&lt;p&gt;So when pushState is not available:&lt;/p&gt;
&lt;p&gt;https://simonmcmanus.com/page.html&lt;/p&gt;
&lt;p&gt;might redirect to :&lt;/p&gt;
&lt;p&gt;https://simonmcmanus.com#page.html&lt;/p&gt;
&lt;p&gt;which would then go and fetch the contents from&lt;/p&gt;
&lt;p&gt;https://simonmcmanus.com/page.html&lt;/p&gt;
&lt;p&gt;If a page is loaded with the fragment identifier in a browser that supports pushState the hash should be removed and pushState used.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When you require JavaScript for templating and data processing you are on a very slippery slope to writing JavaScript applications.&lt;/p&gt;
&lt;p&gt;We have for a long time been able to obfuscate our data with technologies like Flash, I for one have avoided these technologies because I believe that when we publish data properly on the web it becomes more re-usable, findable, accessible and actually has far greater potential.&lt;/p&gt;
&lt;p&gt;By all means use JavaScript, but please don&#39;t rely on it.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Cross Browser CSS3 Gradient</title>
    <link href="https://simonmcmanus.com/posts/cross-browser-css3-gradient/"/>
    <updated>2011-04-05T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/cross-browser-css3-gradient/</id>
    <content type="html">&lt;p&gt;Publishing this here for my own convenience.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;background: #FF8D2C; /&#92;* for non-css3 browsers &#92;*/
  
/&#92;* For WebKit (Safari, Google Chrome etc) &#92;*/
  
background: -webkit-gradient(linear, left top, left bottom, from(#FFFFFF), to(#FF8D2C));
  
/&#92;* For Mozilla/Gecko (Firefox etc) &#92;*/
  
background: -moz-linear-gradient(top, #FFFFFF, #FF8D2C);
  
/&#92;* For Internet Explorer 5.5 - 7 &#92;*/
  
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#FFFFFF, endColorstr=#FF8D2C);
  
/&#92;* For Internet Explorer 8 &#92;*/
  
&#92;-ms-filter: &amp;quot;progid:DXImageTransform.Microsoft.gradient(startColorstr=#FFFFFF, endColorstr=#FF8D2C)&amp;quot;;
&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
  
  <entry>
    <title>Sizlate</title>
    <link href="https://simonmcmanus.com/posts/sizlate/"/>
    <updated>2011-11-22T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/sizlate/</id>
    <content type="html">&lt;p&gt;Over the past year I have been experimenting with &lt;a href=&quot;http://nodejs.org/&quot;&gt;Node.js&lt;/a&gt;. Its been a pretty interesting journey and I have learned a great deal.&lt;/p&gt;
&lt;p&gt;One of my more interesting experiments has been &lt;a href=&quot;https://github.com/simonmcmanus/sizlate/&quot;&gt;Sizlate&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;On projects at work I often find myself doing things like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;domNode.find(&#39;div.class&#39;).html(&#39;&amp;lt;b&amp;gt;INSERT SOME STUFF HERE&amp;lt;/b&amp;gt;&#39;); 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It&#39;s a really powerful way to populate HTML. What I really like is that there is no need to add any crazy syntax into my templates.  Templates are just valid HTML and the point of insertion is specified by the jQuery selector.&lt;/p&gt;
&lt;p&gt;From the developers point of view this is really simple, it does however introduce problems when Javascript is not turned on. I found myself wondering how this technique might be transferred onto the server.&lt;/p&gt;
&lt;p&gt;After some experimentation I came up with &lt;a href=&quot;https://github.com/simonmcmanus/sizlate/&quot;&gt;Sizlate&lt;/a&gt;. A HTML templating engine for Express.js.&lt;/p&gt;
&lt;p&gt;Its pretty easy to get jQuery running on Node.js but I decided that  jQuery wasn&#39;t  a good fit for my use case.  &lt;a href=&quot;http://sizzlejs.com/&quot; title=&quot;sizzle&quot;&gt;Sizzle&lt;/a&gt; is the selector engine used by jQuery, I decided to investigate using Sizzle to provide the selector functionality. It turned out that this works quite nicely using the J&lt;a href=&quot;https://github.com/tmpvar/jsdom&quot;&gt;SDOM&lt;/a&gt; project.&lt;/p&gt;
&lt;p&gt;To use Sizlate you simple need to register it as your templating engine:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;var sizlate = require(&#39;sizlate&#39;); 
app.register(&#39;.html&#39;, sizlate);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And then just call res.render as you would normally with Express:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;res.render(&#39;template.html&#39;,  { selectors: { &#39;a&#39;: &#39;hi there&#39; } });
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That&#39;s the most basic example. On github I have provided an &lt;a href=&quot;https://github.com/simonmcmanus/sizlate/tree/master/examples&quot;&gt;example&lt;/a&gt; of  &lt;a href=&quot;https://github.com/simonmcmanus/sizlate/tree/master/examples/object&quot;&gt;passing sizlate an object&lt;/a&gt; allowing more complex data structures to be used. There is also an &lt;a href=&quot;https://github.com/simonmcmanus/sizlate/tree/master/examples/partial&quot;&gt;example using partials&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;At the moment Sizlate only works on the serverside but it should be quite easy to get it working in the browser.&lt;/p&gt;
&lt;p&gt;Feel free to have a play and let me know if you have any feedback.&lt;/p&gt;
&lt;p&gt;Sizlate is available as a NPM package and can be installed using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;
NPM install sizlate
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For more details please read the &lt;a href=&quot;https://github.com/simonmcmanus/sizlate&quot;&gt;readme on github.com.&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Learning from Single Page Web Applications</title>
    <link href="https://simonmcmanus.com/posts/learning-from-single-page-web-applications/"/>
    <updated>2012-01-05T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/learning-from-single-page-web-applications/</id>
    <content type="html">&lt;p&gt;I&#39;ve spent the last three years working on single page applications of various shapes and sizes. I don&#39;t like em,  this post isn&#39;t about why but I will just say I like data to be exposed at the lowest level (HTTP) and not require Javascript to turn it into something useful.   All that being said I&#39;ve been lucky enough to work with some clever folks and the end results have all been very interesting and pushed boundaries in their own way.&lt;/p&gt;
&lt;p&gt;At &lt;a href=&quot;http://2011.full-frontal.org/&quot;&gt;Full Frontal&lt;/a&gt; I enjoyed listening to &lt;a href=&quot;https://twitter.com/#!/slicknet&quot;&gt;Nicholas Zakas&lt;/a&gt; talking about &lt;a href=&quot;http://www.slideshare.net/nzakas/scalable-javascript-application-architecture&quot;&gt;Scalable Javascript Application Architecture&lt;/a&gt;. In many ways he described the architecture we used for the &lt;a href=&quot;http://configurator.vw.com/&quot;&gt;Volkswagen Configurator&lt;/a&gt;. Earlier in the day &lt;a href=&quot;http://hawksworx.com/&quot;&gt;Phil Hawksworth&lt;/a&gt; had been talking about &lt;a href=&quot;http://speakerdeck.com/u/philhawksworth/p/excessive-enhancement&quot;&gt;Excessive Enhancement&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It struck me that while most front end MVC frameworks make it easy to build Javascript applications, making them work as web applications (without Javascript) becomes much more difficult. This is largely due to the fact that you define and build your application, templates/page structure using the browser&#39;s Javascript interpreter.&lt;/p&gt;
&lt;p&gt;I&#39;m of the view that if you architect something properly you can get the same full experience provided by Javascript applications but still have a reliable fallback for those who do not have Javascript enabled. That is what I call a proper web application.&lt;/p&gt;
&lt;p&gt;In the back of my mind I&#39;ve been thinking about Charlie Robbins excellent post: &lt;a href=&quot;http://blog.nodejitsu.com/scaling-isomorphic-javascript-code&quot;&gt;Scaling Isomorphic Javascript Code&lt;/a&gt; which talks elegantly about why MVC might not be the best pattern in an environment where you can execute Javascript on the server. He suggests the Resource-View-Presenter pattern.&lt;/p&gt;
&lt;p&gt;It seemed that the way we currently split our frameworks between front and back end reduces reuse of configuration/code and actually encourages duplication.&lt;/p&gt;
&lt;p&gt;I wanted to try defining all of these things on the server, so they could be consumed on the server and client.&lt;/p&gt;
&lt;p&gt;As soon as the talk finished I found myself writing code. This blog post talks about what I have been building and why.&lt;/p&gt;
&lt;h2&gt;Sharing URLs between client and server&lt;/h2&gt;
&lt;p&gt;Allow me to deviate for a moment.&lt;/p&gt;
&lt;p&gt;On large applications it&#39;s common practice to split the code and teams between front and back end developers.  This often results in duplication and unnecessary bugs.  A common example being maintaining URLs in two places.  In the browser we might a have a URLs object:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;namespace.urls = {
    login: &#39;/login&#39;,  
    user: &#39;/user/:username&#39;,
    ....
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And then on the server the same URLs would be defined possibly using a different syntax.  Changing one does not change the other, and with split teams this can result in unnecessary bugs.&lt;/p&gt;
&lt;p&gt;With &lt;a href=&quot;http://nodejs.org/&quot;&gt;Node.js&lt;/a&gt; it&#39;s particularly easy to share exactly the same URL object on the client and server. If you ensure your HTML links are populated from the same URL object your application will continue to function when URLs change.&lt;/p&gt;
&lt;p&gt;This is what I&#39;ve been doing in some of my Node apps:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;(function(exports){
      exports.HOME = &#39;/&#39;;
    exports.LOGIN = &#39;/login&#39;;
    exports.USERS = &#39;/users&#39;;
    exports.USER = &#39;/users/:user&#39;;
    // also add URL functions here that can be shared between client and server.
    exports.build = function(str, tokens) {
        for(token in tokens){
            str = str.replace(&#39;:&#39;+token, tokens&#92;[token&#92;]);
        }
        return str;
    };
})(typeof exports === &#39;undefined&#39; ? namespace.urls={} : exports);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That allows it to be used as a Node module using require(&#39;./urls.js&#39;) and when served to the browser the URLs are available at namespace.urls.&lt;/p&gt;
&lt;p&gt;I&#39;ve been using &lt;a href=&quot;http://expressjs.com/&quot;&gt;Express.js&lt;/a&gt;, the parameter sytax seems to work nicely with &lt;a href=&quot;https://github.com/PaulKinlan/leviroutes&quot;&gt;Levi routes&lt;/a&gt; on the front end.&lt;/p&gt;
&lt;p&gt;This seems like common sense. It&#39;s a fine example of &lt;a href=&quot;http://en.wikipedia.org/wiki/Don&#39;t_repeat_yourself&quot;&gt;DRY.&lt;/a&gt;  Define as much as possible in server-side JS and then allow it to be consumed by the client-side JS reusing as much logic as possible.&lt;/p&gt;
&lt;h2&gt;Reusable modules&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;http://tiddlywiki.com/&quot;&gt;TiddlyWiki&lt;/a&gt; has the concept of plugins which are essentially just a chunk of HTML/CSS/JS relevant to a particular piece of functionality which could be added to HTML using a special syntax:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;&amp;lt;&amp;lt;pluginName&amp;gt;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On the &lt;a href=&quot;http://configurator.vw.com/&quot;&gt;Volkswagen Configurator&lt;/a&gt; we also have the concept of UI&#39;s which were reusable chunks of HTML/CSS/JS which could be appended into any DOM node.&lt;/p&gt;
&lt;p&gt;Both are essentially variants of the &lt;a href=&quot;http://www.adequatelygood.com/2010/3/JavaScript-Module-Pattern-In-Depth&quot;&gt;Module Pattern&lt;/a&gt; with added support for HTML and CSS as part of the module.  Both methods work really nicely just so long as you&#39;ve got Javascript turned on.&lt;/p&gt;
&lt;p&gt;I started to build a simple Node.js app which could parse a modules folder and serve the resources at appropriate URLs. See the following folder structure:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img.skitch.com/20120102-cyxfm2b6pgs8c5fasj7b1ppg5b.jpg&quot; alt=&quot;&quot; title=&quot;Folder Strucutre&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Generated the following URLs:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;/contact.css
/contact.html
/contact.js
/content.css
/content.html
/content.js
/flickr.css
/flickr.html
/flickr.js
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You will notice there is an app.js file in the flickr folder which contains the server-side JS required by the module. Later this will provide a getData method to asynchronously generate a templating object which can populate the HTML.&lt;/p&gt;
&lt;h2&gt;Define your views on the server&lt;/h2&gt;
&lt;p&gt;In browserland it&#39;s really easy to mess around with the DOM. You can completely transform a page, especially when you start appending modules of HTML/CSS/JS to DOM nodes. The problem comes when you want to show the same view to something that doesn&#39;t understand Javascript, an RSS feed or search engine for example.&lt;/p&gt;
&lt;p&gt;I decided to create a view specification which could be read by the server and also served to the browser. Doing so should make it really easy to render the exact same HTML with or without Javascript enabled.  Using &lt;a href=&quot;https://github.com/simonmcmanus/sizlate&quot;&gt;Sizlate&lt;/a&gt; I started with this (it has since changed):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;var views = [{
    url: &#39;/user/:user&#39;  
    view: &#39;userpage&#39;,
    modules: [
        &#39;photos&#39;,
        &#39;login&#39;,
        &#39;timeline&#39;
    ]
 }];
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In the following example I have left out the JS and CSS files.  The view is just a folder containing a HTML file of the same name and an optional app.js (as with the modules). It assumes the view HTML file contains a  tag with a id corresponding to each of the modules specified for the view.&lt;/p&gt;
&lt;p&gt;I like this simple approach but in order for it to scale I may soon need to start using HTML data attributes instead of ids. This is what the folder structure looked like:&lt;br /&gt;
&lt;img src=&quot;https://img.skitch.com/20120102-naqptbhb5cn63tgcx7gky8f83x.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;project/views/userpage/userpage.html (the view HTML file) contains:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;&amp;lt;html&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;nav&amp;gt;...&amp;lt;/nav&amp;gt;
    &amp;lt;div id=&amp;quot;photos&amp;quot; /&amp;gt;
    &amp;lt;div id=&amp;quot;login&amp;quot; /&amp;gt;
    &amp;lt;div id=&amp;quot;timeline&amp;quot; /&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The end result would look something like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;&amp;lt;html&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;nav&amp;gt;...&amp;lt;/nav&amp;gt;
    &amp;lt;div id=&amp;quot;photos&amp;quot;&amp;gt;
        .. contents of /modules/photos/photos.html appended in here
    &amp;lt;/div&amp;gt;
    &amp;lt;div id=&amp;quot;login&amp;quot;&amp;gt;
        .. contents of /modules/login/login.html appended in here
    &amp;lt;/div&amp;gt;
    &amp;lt;div id=&amp;quot;timeline&amp;quot;&amp;gt;
        .. contents of /modules/timeline/timeline.html appended in here
    &amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Concatenation vs Caching&lt;/h2&gt;
&lt;p&gt;At this stage I was able to build a sample app with my re-usable modules and a view. I thought it would be useful to concatenate all the JS and CSS files together for each view. It turns out I was wrong.&lt;/p&gt;
&lt;p&gt;In a situation where you&#39;re reusing modules across multiple views concatinating per view makes no sense because you end up serving the same CSS across multiple URLs. The CSS/JS will be cached per view, not per module.&lt;/p&gt;
&lt;p&gt;I decided it was actually better to use the URLs generated for the CSS/JS by the modules so they can be cached at the most granular level.  Both methods will be possible.  Currently CSS modules are served inline with the module HTML (not the document HEAD).  There will be some work to ensure that all CSS LINK tags are moved to the document HEAD before the view is rendered. &lt;a href=&quot;https://github.com/tmpvar/jsdom&quot;&gt;JSDOM&lt;/a&gt; should make that quite easy.&lt;/p&gt;
&lt;h2&gt;History API&lt;/h2&gt;
&lt;p&gt;With views and modules defined on the server I&#39;ve started to put together a front end framework which can consume the same application specification and make the whole experience a bit more pleasant.  I&#39;m currently experimenting with generating popstate listeners from the specification which can then fire off the default/custom transitions between views.&lt;/p&gt;
&lt;h2&gt;Whats going on here?&lt;/h2&gt;
&lt;p&gt;Essentially I have started building a framework for mixing up reusable modules of HTML/CSS/JS in ways usually associated with Javascript applications but with progressive enhancement as one of its core values.&lt;/p&gt;
&lt;p&gt;The functionality described above will almost certainly change.  What I have built so far is a simple proof of concept to test the best way to define views in this way using Sizlate.&lt;/p&gt;
&lt;p&gt;At the moment I&#39;m working on a sample app pulling in data from Flickr to demonstrate how it might all fit together in the real world.  Its pretty messy and requires lots of work but you can see the code &lt;a href=&quot;https://github.com/simonmcmanus/framework&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I thought it was worth blogging about my approach just to get some feedback. Please do let me know what you think. All idea&#39;s, contributions, criticisms welcomed.&lt;/p&gt;
&lt;p&gt;I&#39;m going to be talking about Sizlate at the London Node user group on the 25th January at the Forward Offices in Camden, London. &lt;a href=&quot;http://lnugjanuary12.eventbrite.co.uk/&quot;&gt;Please register here if you would like to attend.&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>HTTP requests with Node.js</title>
    <link href="https://simonmcmanus.com/posts/http-requests-with-nodejs/"/>
    <updated>2012-04-11T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/http-requests-with-nodejs/</id>
    <content type="html">&lt;p&gt;I couldn&#39;t find this code anywhere on the internets yesterday, posting here for my own convenience.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt; 
```js
var options = {
  
   host: &#39;api.twitter.com&#39;,
  
   port: 80,
  
   path: &#39;/path&#39;,
  
   method: &#39;GET&#39;,
  
   encoding: &#39;utf8&#39;
  
 };
  
  
  
 http.get({ host: options.host, path: options.path }, function(res2){
  
	var data = [];
  
	res2.on(&#39;data&#39;, function(chunk) { 
  
		data.push(chunk); 
  
	});
  
  
  
	res2.on(&#39;end&#39;, function() { // wait for the request to finish
  
		res.json(data.join(&#39;&#39;)); 
  
	})
  
});
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;
&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
  
  <entry>
    <title>Sublime 3 build system to run NPM Test</title>
    <link href="https://simonmcmanus.com/posts/sublime-3-build-system-to-run-npm-test/"/>
    <updated>2014-02-19T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/sublime-3-build-system-to-run-npm-test/</id>
    <content type="html">&lt;p&gt;In Sublime 3,  go to `tools &amp;gt; build system &amp;gt; new build system` and paste the below into the file:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;{  
 &amp;quot;working_dir&amp;quot;: &amp;quot;${project_path:${folder:${file_path}}}&amp;quot;,  
 &amp;quot;cmd&amp;quot;: [&amp;quot;npm&amp;quot;, &amp;quot;test&amp;quot;]  
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now you will have a build system that will run the NPM test command in your current project directory.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>DotJS Ltd - One Year Old</title>
    <link href="https://simonmcmanus.com/posts/dotjs-ltd-one-year-old/"/>
    <updated>2014-04-08T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/dotjs-ltd-one-year-old/</id>
    <content type="html">&lt;p&gt;One year ago today I formed my company &lt;a href=&quot;http://dotjs.co.uk/&quot;&gt;DotJS Ltd&lt;/a&gt; offering Node.js consultancy services to London and beyond.&lt;/p&gt;
&lt;p&gt;It&#39;s been a bloody great year and I just wanted to say thank you to everyone that has helped me on my way.&lt;/p&gt;
&lt;p&gt;Thank you!&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>EnhanceConf line-up</title>
    <link href="https://simonmcmanus.com/posts/enhanceconf-line-up/"/>
    <updated>2016-01-26T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/enhanceconf-line-up/</id>
    <content type="html">&lt;p&gt;Over the last 6 months, with the help of some trusted advisors, I’ve been putting together the line-up for &lt;a href=&quot;http://enhanceconf.com/&quot;&gt;EnhanceConf&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The whole event is dedicated to &lt;a href=&quot;http://en.wikipedia.org/wiki/Progressive_enhancement&quot;&gt;progressive enhancement&lt;/a&gt;, but what does that even mean in 2016? Well, that’s the point of EnhanceConf. We get to spend the 4th of March in The Great Room figuring it out.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://simonmcmanus.files.wordpress.com/2016/01/great-room.jpg&quot;&gt;&lt;img src=&quot;https://simonmcmanus.files.wordpress.com/2016/01/great-room.jpg?w=300&quot; alt=&quot;great-room&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We are going to start the day thinking about why we do progressive enhancement. &lt;a href=&quot;http://natbuckley.co.uk/&quot;&gt;Nat Buckley&lt;/a&gt; will look at many of the assumptions we make in modern web development. &lt;a href=&quot;http://maban.co.uk/&quot;&gt;Anna Debenham&lt;/a&gt; will then look at some of the unusual devices people use to interact with our sites/apps. &lt;a href=&quot;https://twitter.com/stilkov&quot;&gt;Stefan Tilkov&lt;/a&gt; will provide an architect&#39;s perspective.&lt;/p&gt;
&lt;p&gt;In the second section, we are going to look at some real world examples. We’ve got &lt;a href=&quot;https://twitter.com/misprintedtype&quot;&gt;Ola Gasidlo&lt;/a&gt; from Styla/Hoodie and &lt;a href=&quot;http://www.theguardian.com/profile/oliver-joseph-ash&quot;&gt;Oliver Joseph Ash&lt;/a&gt; from the Guardian talking about their experiences making things work offline. &lt;a href=&quot;https://twitter.com/ForbesLindesay&quot;&gt;Forbes Lindesay&lt;/a&gt; will be talking about building apps that can render on the server and in the browser.&lt;/p&gt;
&lt;p&gt;After lunch, we are going to think a bit more about design and UX. Does progressive enhancement constrain design? &lt;a href=&quot;https://twitter.com/philhawksworth&quot;&gt;Phil Hawksworth&lt;/a&gt; and &lt;a href=&quot;http://stephen-waller.com/&quot;&gt;Stephen Waller&lt;/a&gt; will debate. &lt;a href=&quot;http://jensimmons.com/&quot;&gt;Jen Simmons&lt;/a&gt; will explain why 2016 will be the year that web layouts change and how to use these new techniques as an enhancement. &lt;a href=&quot;http://adamsilver.io/&quot;&gt;Adam Silver&lt;/a&gt; will talk about embracing simplicity.&lt;/p&gt;
&lt;p&gt;In the final section, we are going to look to the future. How can we build interfaces given how little we know about the people and devices using them? &lt;a href=&quot;https://www.abilitynet.org.uk/robinchristopherson&quot;&gt;Robin Christopherson&lt;/a&gt; will be talking about inclusive design. &lt;a href=&quot;https://twitter.com/radiomorillo&quot;&gt;Stephanie Morillo&lt;/a&gt; will talk about copy and what to think about when writing it. Aaron Gustafson will round off the event by talking about building for devices that don’t exist yet.&lt;/p&gt;
&lt;p&gt;After each section, we are going to have 20 minutes of Q&amp;amp;A run by &lt;a href=&quot;https://twitter.com/adactio&quot;&gt;Jeremy Keith&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As if that wasn&#39;t enough, the Planning Adaptive Interfaces &lt;a href=&quot;http://enhanceconf.com/workshop.html&quot;&gt;workshop&lt;/a&gt; provides a unique opportunity to get training from &lt;a href=&quot;https://twitter.com/AaronGustafson&quot;&gt;Aaron Gustafson&lt;/a&gt; while he&#39;s in London. We are giving a limited number of copies of Aaron’s e-book &lt;a href=&quot;http://adaptivewebdesign.info/&quot;&gt;Adaptive Web Design&lt;/a&gt; with combined conference and workshop tickets.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://enhanceconf.com/tickets.html&quot;&gt;Reserve your seat&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>EnhanceConf Scholarship</title>
    <link href="https://simonmcmanus.com/posts/enhanceconf-scholarship/"/>
    <updated>2016-02-14T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/enhanceconf-scholarship/</id>
    <content type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;One of the big motivations behind &lt;a href=&quot;http://enhanceconf.com/&quot;&gt;EnhanceConf&lt;/a&gt;  was education. Conferences are a great place to learn but the associated costs often make them difficult for many to attend. In the spirit of progressive enhancement, we want to make EnhanceConf available to the widest possible audience.&lt;/p&gt;
&lt;p&gt;We have allocated a number of scholarship tickets for people who would like to attend but cannot pay for a ticket.&lt;/p&gt;
&lt;h3&gt;How to Apply&lt;/h3&gt;
&lt;p&gt;Send a short email to info@enhanceconf.com with a title of EnhanceConf Scholarship.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;In your email please include:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Who are you?&lt;/li&gt;
&lt;li&gt;What do you do?&lt;/li&gt;
&lt;li&gt;Why would you like the scholarship?&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Who should apply:&lt;/h3&gt;
&lt;p&gt;The scholarships are available to anyone not normally able to attend a conference. If that might be you (even if you&#39;re not in one of the groups below) then please apply.&lt;/p&gt;
&lt;p&gt;Some of the groups we are especially keen to support include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ethnic minorities&lt;/li&gt;
&lt;li&gt;Women&lt;/li&gt;
&lt;li&gt;LGBTQIA+&lt;/li&gt;
&lt;li&gt;Disabled people&lt;/li&gt;
&lt;li&gt;Charity workers&lt;/li&gt;
&lt;li&gt;Education / students&lt;/li&gt;
&lt;li&gt;Open source projects&lt;/li&gt;
&lt;li&gt;Industry newcomers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you have any questions, just send an email to info@enhanceconf.com&lt;/p&gt;
&lt;p&gt;**Details: **&lt;/p&gt;
&lt;p&gt;All emails will be treated in the strictest confidence, we will not announce who the scholarships go to but you’re welcome to say so yourself.&lt;/p&gt;
&lt;p&gt;Successful applicants will get a standard conference ticket.&lt;/p&gt;
&lt;p&gt;We are only able to cover the cost of the conference ticket so please consider your travel costs before applying.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Speclate</title>
    <link href="https://simonmcmanus.com/posts/speclate/"/>
    <updated>2016-08-13T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/speclate/</id>
    <content type="html">&lt;p&gt;The &lt;a href=&quot;http://lnug.org/&quot;&gt;London Node User group website&lt;/a&gt; is a static site hosted on &lt;a href=&quot;https://pages.github.com/&quot;&gt;github pages,&lt;/a&gt; it renders at build time, in the browser and works offline using &lt;a href=&quot;http://github.com/simonmcmanus/speclate&quot;&gt;Speclate&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The idea behind &lt;a href=&quot;https://github.com/simonmcmanus/speclate&quot;&gt;Speclate&lt;/a&gt; is you have a single file (a spec) which defines how your routes, pages and components fit together. A spec can be used to generate a static site and lots more too.  With the help of &lt;a href=&quot;https://github.com/simonmcmanus/speclate-router&quot;&gt;speclate-router&lt;/a&gt; we generate a router which swaps out the appropriate HTML elements to transition nicely between pages.&lt;/p&gt;
&lt;p&gt;Let&#39;s look at a simple example:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;module.exports = {  
     &#39;/&#39;: {  
         page: &#39;home&#39;,  
         selectors: {  
             title: &#39;Home&#39;,  
             &#39;a.home&#39;: {  
                 className: &#39;active&#39;  
             }  
         }  
     },  
     &#39;/contact.html&#39;: {  
         page: &#39;contact&#39;,  
         selectors: {  
             title: &#39;Contact&#39;,  
             &#39;a.contact&#39;: {  
                 className: &#39;active&#39;  
             }  
        }  
     }  
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This spec will produce index.html and contact.html based on the contents of &lt;a href=&quot;https://github.com/simonmcmanus/speclate-example/blob/master/pages/home/home.html&quot;&gt;/pages/home/home.html&lt;/a&gt; and &lt;a href=&quot;https://github.com/simonmcmanus/speclate-example/blob/master/pages/contact/contact.html&quot;&gt;/pages/contact/contact.html&lt;/a&gt; and the values in the selectors object.&lt;/p&gt;
&lt;p&gt;At the moment Speclate relies on a couple of conventions. &lt;a href=&quot;https://github.com/simonmcmanus/speclate-example/blob/master/pages/layout.html&quot;&gt;/pages/layout.html&lt;/a&gt; needs to contain an element with an id of &amp;quot;container&amp;quot;for the pages to be appended to. This will move to config eventually.&lt;/p&gt;
&lt;p&gt;I&#39;ve created a&lt;a href=&quot;https://github.com/simonmcmanus/speclate-example&quot;&gt; simple example app&lt;/a&gt;. You can see the &lt;a href=&quot;http://speclate-example.netlify.com/&quot;&gt;demo running&lt;/a&gt; on &lt;a href=&quot;http://netlify.com/&quot;&gt;Netlify&lt;/a&gt;, and get the &lt;a href=&quot;https://github.com/simonmcmanus/speclate-example&quot;&gt;source code on&lt;/a&gt; &lt;a href=&quot;https://github.com/simonmcmanus/speclate-example&quot;&gt;GitHub&lt;/a&gt;. You can also read more about the spec format in the &lt;a href=&quot;https://github.com/simonmcmanus/speclate&quot;&gt;speclate &lt;/a&gt;&lt;a href=&quot;https://github.com/simonmcmanus/speclate&quot;&gt;readme&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Rendering&lt;/h2&gt;
&lt;p&gt;Underneath the hood Speclate uses &lt;a href=&quot;https://github.com/simonmcmanus/sizlate&quot;&gt;Sizlate&lt;/a&gt; which makes extensive use of &lt;a href=&quot;https://sizzlejs.com/&quot;&gt;Sizzle&lt;/a&gt;, the selector engine from jQuery.  On the server, &lt;a href=&quot;https://github.com/cheeriojs/cheerio&quot;&gt;Cheerio&lt;/a&gt; provides a fast DOM implementation for generating the markup.&lt;/p&gt;
&lt;p&gt;Rendering can be broken down into three steps. Firstly we replace the main page (using #container), then we apply the page spec, this will apply selectors and components to the page and lastly we apply the global selectors to the markup. This allows us to effect elements in the main layout such as the page title.&lt;/p&gt;
&lt;p&gt;In the example there are three commands in the &lt;a href=&quot;https://github.com/simonmcmanus/speclate-example/blob/master/package.json&quot;&gt;package.json&lt;/a&gt; to generate the&lt;a href=&quot;http://speclate-example.netlify.com/&quot;&gt; site&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;&amp;quot;scripts&amp;quot;: {
    &amp;quot;markup&amp;quot;: &amp;quot;speclate&amp;quot;,
    &amp;quot;client&amp;quot;: &amp;quot;browserify ./client/router.js &amp;gt; ./client/router-compiled.js&amp;quot;,
    &amp;quot;build&amp;quot;: &amp;quot;npm run client &amp;amp;&amp;amp; npm run markup&amp;quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&#39;npm run markup&#39; will generate a functional HTML site. &#39;npm run client&#39; uses browserify to generate the &lt;a href=&quot;https://github.com/simonmcmanus/speclate-example/blob/master/client/router.js&quot;&gt;client-side router&lt;/a&gt; and &#39;npm run build&#39; generates the whole site by running both commands.&lt;/p&gt;
&lt;h2&gt;Offline&lt;/h2&gt;
&lt;p&gt;Currently, the &lt;a href=&quot;http://lnug.org/&quot;&gt;LNUG&lt;/a&gt; website works offline using an &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTML/Using_the_application_cache&quot;&gt;AppCache.manifest&lt;/a&gt; file. That file is generated from the spec like so:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;speclate.site.appCache(spec, [  
&#39;/css.css&#39;,  
&#39;/images/lnug-logo.svg&#39;  
])
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We use &lt;a href=&quot;https://github.com/gr2m/appcache-nanny&quot;&gt;appCache Nanny&lt;/a&gt; to handle updates but the experience is still not great. The latest releases of Speclate now use the fetch API so it opens up lots of possibilities with Service Workers.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Blog Migration</title>
    <link href="https://simonmcmanus.com/posts/blog-migration/"/>
    <updated>2019-07-04T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/blog-migration/</id>
    <content type="html">&lt;p&gt;I&#39;m in the process of moving this blog from &lt;a href=&quot;https://wordpress.com/&quot;&gt;Wordpress.com&lt;/a&gt; over to &lt;a href=&quot;https://simonmcmanus.com/&quot;&gt;simonmcmanus.com&lt;/a&gt; hosted on &lt;a href=&quot;https://netlify.com/&quot;&gt;netlify.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Its a work in progress, I&#39;ve disabled all tagging functionality while I port the content over. Please bare with me if you expereince any problems.&lt;/p&gt;
&lt;p&gt;Thanks&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Speclate@19</title>
    <link href="https://simonmcmanus.com/posts/speclate-19/"/>
    <updated>2019-08-27T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/speclate-19/</id>
    <content type="html">&lt;p&gt;I&#39;ve made some big changes to speclate and sizlate recently. The API stays the same, but under the hood things are much leaner.&lt;/p&gt;
&lt;h3&gt;No more sizzle&lt;/h3&gt;
&lt;p&gt;Previously sizlate required &lt;a href=&quot;https://sizzlejs.com/&quot;&gt;sizzle&lt;/a&gt; to operate in the browser, this meant using jQuery or something similar. With support for &lt;code&gt;querySelectorAll()&lt;/code&gt; being &lt;a href=&quot;https://caniuse.com/#feat=queryselector&quot;&gt;so good&lt;/a&gt; we can now do all our dom selection/manipulation with just speclate. At build time speclate still uses &lt;a href=&quot;https://cheerio.js.org/&quot;&gt;cheerio&lt;/a&gt; to provide the dom functions it needs to render the pages and components.&lt;/p&gt;
&lt;h3&gt;No more Page.js&lt;/h3&gt;
&lt;p&gt;Page.js helped me get speclate-router up and running quickly, at that time, just running speclate in the client seemed a long way off.&lt;/p&gt;
&lt;h3&gt;Speclate-router will be  deprecated&lt;/h3&gt;
&lt;p&gt;Version 9 will be the last standalone version of &lt;code&gt;speclate-router&lt;/code&gt;. From @19, Speclate includes a dramatically similified router, which can be included like so:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var router = require(&#39;speclate/router&#39;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The router will behave exactly as it did before. Just with a lot less code. When the router is loaded it looks for any links on the page that match the routes specified in the spec. When it finds one, it binds to the link click so speclate  can handle swapping out the pages with the appropriate transitions.&lt;/p&gt;
&lt;h3&gt;Smarter Service workers&lt;/h3&gt;
&lt;p&gt;Previously the spec was broken up to the relevant pieces at build time, but the generated service worker javascript file would still pull in a full copy of the spec, effectively meaning that each user would download the spec twice.&lt;/p&gt;
&lt;p&gt;This has now changed so that &lt;code&gt;speciate-cli&lt;/code&gt; generates a minimal version of the spec, effectively just containing a list of the pages and components that are used by that page, so that they can be made available offline.&lt;/p&gt;
&lt;p&gt;The changes described above are introduced in versions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;speclate@19.x.x&lt;/li&gt;
&lt;li&gt;speclate-service-worker@3.x.x&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  
  <entry>
    <title>Local development on npm packages</title>
    <link href="https://simonmcmanus.com/posts/npm-linking/"/>
    <updated>2019-09-10T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/npm-linking/</id>
    <content type="html">&lt;p&gt;When you run the &lt;code&gt;npm install&lt;/code&gt; command, npm looks at the package.json file in the root of the current project and fetches the appropriate published version of each package from the public NPM registry.&lt;/p&gt;
&lt;p&gt;When we develop locally we want to ensure we can see the changes In our application as quickly as possible, and don’t want to have to &lt;code&gt;npm publish&lt;/code&gt; and then &lt;code&gt;npm install&lt;/code&gt; for each change.&lt;/p&gt;
&lt;p&gt;We can do this using npm link. In order to do this we need to have both projects checked out on our local machine.&lt;/p&gt;
&lt;p&gt;First of all we need to tell the dependancies that we are going to link it. So we go into the package we want to work on (after a git clone) and type &lt;code&gt;npm link&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd shared

npm link

cd ../
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This will tell NPM that we will be linking the package into another package shortly.&lt;/p&gt;
&lt;p&gt;Then we need to goto the directory that will be consuming the package and type:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
npm link [PACKAGE-NAME]

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;[PACKAGE-NAME] should be replaced with the name of the package you wish to link into the current project.&lt;/p&gt;
&lt;p&gt;Now the package should behave as if it has been installed via an &lt;code&gt;npm i&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;There are a number of tools which can easily tell you which packages you have linked for a given project, and example is:&lt;/p&gt;
&lt;p&gt;https://www.npmjs.com/package/npm-link-check&lt;/p&gt;
&lt;p&gt;For more info, please see the docs:&lt;/p&gt;
&lt;p&gt;https://docs.npmjs.com/cli/link&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Wicked Elements</title>
    <link href="https://simonmcmanus.com/posts/wicked-elements/"/>
    <updated>2019-12-03T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/wicked-elements/</id>
    <content type="html">&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_custom_elements&quot;&gt;Custom Elements&lt;/a&gt; give us the ability to create custom html tags that you can use in your markup like so:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;word-count&amp;gt; 
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;customElements.define(&#39;word-count&#39;, WordCount, { extends: &#39;p&#39; });
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;But to use the above tag on a page the browser still needs to run some Javascript before it can render the custom element. The browser also needs to &lt;a href=&quot;https://caniuse.com/#feat=custom-elementsv1&quot;&gt;support custom elements&lt;/a&gt; to render anything at all.&lt;/p&gt;
&lt;p&gt;So the Progressive Enhancement story isn&#39;t great, and its for this reason I&#39;ve often avoided custom elements.&lt;/p&gt;
&lt;p&gt;With &lt;a href=&quot;https://github.com/WebReflection/wicked-elements&quot;&gt;Wicked Elements&lt;/a&gt; you can bind the component behaviour using css selectors. As we are not using the tag name to select which elements on the page to apply the behaviour to, we can send standard html tags in the initial request and the client side javascript just enhances them with interactivity afterwards.&lt;/p&gt;
&lt;p&gt;So our component gets sent to the browser like so:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;p is=&amp;quot;word-count&amp;quot;&amp;gt;12&amp;lt;/p&amp;gt; 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In this case using the &lt;code&gt;is&lt;/code&gt; attribute selector seems to work really nicely:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;wickedElements.define(&#39;[is=word-count]&#39;, ...)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This means we can send markup that works for the lowest possible tech (a &lt;code&gt;&lt;p&gt;&lt;/p&gt;&lt;/code&gt; tag). There is no hydration or anything other re-rendering when the browser js kicks in.  The browser javascript just makes the existing elements interactive. Kinda how progressive enhancement is meant to work.&lt;/p&gt;
&lt;p&gt;Wicked elements isn&#39;t the same as custom elements, but does provide a similar API (except for how you select the elements). The thing I like about Wicked elements is that it doesn&#39;t make assuptions about how the markup is rendered, it just enhances the markup that has already been rendered.&lt;/p&gt;
&lt;p&gt;I think its actually &lt;a href=&quot;https://github.com/WebReflection/regular-elements&quot;&gt;regular elements&lt;/a&gt; that adds the ability to bind behaviour with a css selector. Wicked elements combines a couple of extra modules to make things a bit easier.&lt;/p&gt;
&lt;p&gt;I&#39;ve been playing with it alongside &lt;a href=&quot;https://www.npmjs.com/package/speclate&quot;&gt;Speclate&lt;/a&gt; which also uses CSS selectors so there are some very nice parallels, but that&#39;s a whole post in its own right. :)&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Engineering Principles</title>
    <link href="https://simonmcmanus.com/posts/engineering-principles/"/>
    <updated>2021-05-08T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/engineering-principles/</id>
    <content type="html">&lt;p&gt;Over the last year, I&#39;ve been referring to my engineering principles quite regularly. I thought it would be worth writing them down here.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Define the Problem first&lt;/h2&gt;
&lt;p&gt;To identify a good solution, you must first be clear about the problem.
Working on a solution without a problem can introduce complexity with little or no value.
For best results, start with the business/user problems.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Hypothesis-driven development&lt;/h2&gt;
&lt;p&gt;By having a clearly defined problem statement, we can validate possible solutions. By working in small increments, we can validate our idea early to avoid wasted effort. (Fail fast)&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Keep it simple&lt;/h2&gt;
&lt;p&gt;Work in small increments, Take the most minor, most straightforward step possible so that you can learn something before taking the next step. What is the smallest step/s we can take to validate this hypothesis?&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://how.complexsystems.fail/&quot;&gt;Why complex systems fail&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Tight Feedback Loops&lt;/h2&gt;
&lt;p&gt;Work closely with designers, optimise for tight feedback loops and short iteration cycles. The sooner you can get real users testing your solutions, the better.&lt;/p&gt;
&lt;p&gt;Understand this happens at multiple levels, and you have multiple loops in play at any time.  Keep them tight and fast.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Justify complexity&lt;/h2&gt;
&lt;p&gt;As engineers, we trade in complexity every day. It&#39;s not always possible to avoid complexity entirely. We can minimise it by insisting any complexity introduced has to demonstrate it will add more user/business value, keeping unnecessary tech/requirements away from your code. &lt;a href=&quot;https://adamsilver.io/blog/the-boring-front-end-developer/&quot;&gt;Be boring&lt;/a&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Remove assumptions&lt;/h2&gt;
&lt;p&gt;Assumptions hide complexity - The best way to remove assumptions is to break a task down into smaller delivery units and make sure you have clear acceptance criteria for them. Keep breaking it down till there are no assumptions of concern.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Embrace the unknown&lt;/h2&gt;
&lt;p&gt;While this might seem at odds with removing assumptions, it&#39;s closely connected. By Acknowledging what we don&#39;t know, we remove assumptions from the process. We can then dedicate time to understanding and solving those problems in isolation.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Last responsible moment&lt;/h2&gt;
&lt;p&gt;Technology changes at a relentless pace,  be it the external landscape or your internal stack.   On big projects, it&#39;s often tempting to do some work up front to figure out the best solution.  In reality, it&#39;s better done as close to the actual work to ensure the solutions are relevant.&lt;/p&gt;
&lt;h2&gt;Integrate continuously&lt;/h2&gt;
&lt;p&gt;To operate at scale, it&#39;s often necessary to separate concerns and have clear boundaries so people work independently. The risk is the pieces built-in isolation won&#39;t work in unison.  You can mitigate this risk by always combining the different parts as often as possible.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Continuous improvement&lt;/h2&gt;
&lt;p&gt;As engineers, we never stop learning, which means there is always room for improvement.  Actively seek it out and challenging assumptions around the status quo. It&#39;s vital that engineers feel empowered to bring about change.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;I will try to keep this list up to date. Did I miss anything obvious? What are your engineering principles?&lt;/p&gt;
&lt;p&gt;Please let me know on Twitter.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/simonmcmanus&quot;&gt;@simonmcmanus&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Recursive selectors in Sizlate</title>
    <link href="https://simonmcmanus.com/posts/nested-selectors-in-sizlate/"/>
    <updated>2022-05-14T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/nested-selectors-in-sizlate/</id>
    <content type="html">&lt;p&gt;Previously nested selectors in &lt;a href=&quot;https://github.com/simonmcmanus/sizlate&quot;&gt;sizlate&lt;/a&gt; were limited to one level and didn’t provide all the functionality available to top level selector.&lt;/p&gt;
&lt;p&gt;In &lt;a href=&quot;https://www.npmjs.com/package/sizlate&quot;&gt;sizlate@4.1.0&lt;/a&gt; nested selectors now work exactly the same as top level selectors and there is no limit on nesting depths.&lt;/p&gt;
&lt;p&gt;What does this look like:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const selectors = {
  &amp;quot;ul#list-two&amp;quot;: {
    selectors: {
      &amp;quot;li.welcome&amp;quot;: {
        class: &amp;quot;highlight&amp;quot;,
        selectors: {
          &amp;quot;span.name&amp;quot;: &amp;quot;Simon&amp;quot;
        }
      }
    }
  }
};

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Transforms this HTML:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;ul&amp;gt;
    &amp;lt;li&amp;gt;list one&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;

&amp;lt;ul id=&amp;quot;list-two&amp;quot;&amp;gt;
    &amp;lt;li&amp;gt;list two&amp;lt;/li&amp;gt;
    &amp;lt;li class=&amp;quot;welcome&amp;quot;&amp;gt;
      Hello &amp;lt;span class=&amp;quot;name&amp;quot;&amp;gt;John&amp;lt;/span&amp;gt;
    &amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Into this HTML:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;ul&amp;gt;
    &amp;lt;li&amp;gt;list one&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;

&amp;lt;ul id=&amp;quot;list-two&amp;quot;&amp;gt;
    &amp;lt;li&amp;gt;list two&amp;lt;/li&amp;gt;
    &amp;lt;li class=&amp;quot;welcome highlight&amp;quot;&amp;gt;
      Hello &amp;lt;span class=&amp;quot;name&amp;quot;&amp;gt;Simon&amp;lt;/span&amp;gt;
    &amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I&#39;ve create an example on
&lt;a href=&quot;https://codesandbox.io/s/sizlate-nested-cix0y7&quot;&gt;CodeSandbox&lt;/a&gt; where you can try it out and easily fork the code.&lt;/p&gt;
&lt;p&gt;This was only a minor release because it just fixes issues and doesn&#39;t change the interface. In a future (major) release I will attempt to remove the need for the word selectors so much by making the default object behaviour be selectors, if that happens attributes would need to be explictly declared in the way selectors are in the example above.&lt;/p&gt;
&lt;p&gt;This came up when I was porting &lt;a href=&quot;https://simonmcmanus.com/&quot;&gt;simonmcmanus.com&lt;/a&gt; over to using eleventy with sizlate for the templating, it makes sizlate much more capable of handling complex templating requirements.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Eleventy Layouts with Sizlate</title>
    <link href="https://simonmcmanus.com/posts/eleventy-layouts-with-sizlate/"/>
    <updated>2022-06-11T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/eleventy-layouts-with-sizlate/</id>
    <content type="html">&lt;p&gt;In this post I&#39;m going to describe the different ways I was able to use &lt;a href=&quot;https://www.npmjs.com/package/sizlate&quot;&gt;sizlate&lt;/a&gt; query selectors in &lt;a href=&quot;https://www.11ty.dev/&quot;&gt;eleventy&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I created a very small wrapper called &lt;a href=&quot;https://www.npmjs.com/package/eleventy-sizlate&quot;&gt;eleventy-sizlate&lt;/a&gt;. I mainly created this package to migrate this blog over to eleventy but I still find Sizlate my preferred method for manipulating html.&lt;/p&gt;
&lt;p&gt;This was my first time using eleventy so if you can see any APIs missing or other improvements please let me know.&lt;/p&gt;
&lt;h2&gt;Example 1 - A Simple Layout&lt;/h2&gt;
&lt;p&gt;First thing to do is create a layout file, this is the file which supplies the html file and selectors for the outer layout. In the below example I&#39;ve inlined everything to make it easier to read:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;
////_includes/layouts/layout.sizlate.11ty.js
const eleventySizlate = require(&#39;eleventy-sizlate&#39;)
const template = `
&amp;lt;html&amp;gt;
    &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;
    &amp;lt;body&amp;gt;
        &amp;lt;h1&amp;gt;&amp;lt;/h1&amp;gt;
        &amp;lt;div id=&amp;quot;container&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
        &amp;lt;nav&amp;gt;
            &amp;lt;a href=&amp;quot;/example-1/&amp;quot;&amp;gt;example 1&amp;lt;/a&amp;gt;
            &amp;lt;a href=&amp;quot;/example-2/&amp;quot;&amp;gt;example 2&amp;lt;/a&amp;gt;
            &amp;lt;a href=&amp;quot;/example-3/&amp;quot;&amp;gt;example 3&amp;lt;/a&amp;gt;
            &amp;lt;a href=&amp;quot;/example-4/&amp;quot;&amp;gt;example 4&amp;lt;/a&amp;gt;
        &amp;lt;/nav&amp;gt;
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;`

const mappers = {} // we will use this in example 3.

class Sizlate {
    data = {
        template,
    };

    render(data) {
        const layoutSelectors = {
            &#39;h1&#39;: data.title,
            &#39;title&#39;: data.title,
            &#39;#container&#39;: data.content,
        }
        return eleventySizlate.render(data, layoutSelectors, mappers)
    }
}

module.exports = Sizlate;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Once we have the basic template, we can consume it from another file in eleventy like so:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;---
title: Simple layout
layout: layouts/layout.sizlate.11ty.js
---
This example shows how to use a simple layout with sizlate, it will wrap this markdown file in the layout and update the titles.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Which would produce the following output:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;
&amp;lt;html&amp;gt;
    &amp;lt;title&amp;gt;Simple layout&amp;lt;/title&amp;gt;
    &amp;lt;body&amp;gt;
        &amp;lt;h1&amp;gt;Simple layout&amp;lt;/h1&amp;gt;
        &amp;lt;div id=&amp;quot;container&amp;quot;&amp;gt;
            &amp;lt;p&amp;gt;This example shows how to use a simple layout with sizlate, it will wrap this markdown file in the layout and update the titles.&amp;lt;/p&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;nav&amp;gt;
            &amp;lt;a href=&amp;quot;/example-1/&amp;quot;&amp;gt;example 1&amp;lt;/a&amp;gt;
            &amp;lt;a href=&amp;quot;/example-2/&amp;quot;&amp;gt;example 2&amp;lt;/a&amp;gt;
            &amp;lt;a href=&amp;quot;/example-3/&amp;quot;&amp;gt;example 3&amp;lt;/a&amp;gt;
            &amp;lt;a href=&amp;quot;/example-4/&amp;quot;&amp;gt;example 4&amp;lt;/a&amp;gt;
        &amp;lt;/nav&amp;gt;
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Example 2 - Using sizlate object in layouts&lt;/h2&gt;
&lt;p&gt;In the front matter data you can also specify sizlate selectors to manipulate the html, in this example we add a testPage class to the html tag:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;---
title: Test page
layout: layouts/layout.sizlate.11ty.js
sizlate: { &#39;html&#39;: {
    className: &#39;testPage&#39;
}}

---
* list item 1 
* list item 2 
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Example 3 - Mapper Functions&lt;/h2&gt;
&lt;p&gt;Sometimes static selectors like the above don&#39;t quite cut it, you might need to generate selectors based off of data. This is where we can use mapping functions.&lt;/p&gt;
&lt;p&gt;Let&#39;s say we have an array of tags in the template data and we want to transform that into a list.
With sizlate static selectors we saw eariler we would just add it to the sizlate object in the front matter like so:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;---
layout: layouts/layout.sizlate.11ty.js
sizlate: { &#39;ul&#39;: [&#39;bacon&#39;, &#39;cheese&#39;]}
---
* list item
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;But if you want to generate the selectors based on the front matter data you can add a mapper function into  &lt;code&gt;layout.sizlate.11ty.js&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const mappers = {
    tags: (data) =&amp;gt; &#39;ul&#39;: data.tags
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That data object that gets passed in should give you access to all the data from that page, layout and collections too.&lt;/p&gt;
&lt;p&gt;Once your layout knows about the mapper functions you specify which mappers should be called when this page is rendered.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;---
layout: layouts/layout.sizlate.11ty.js
mappers: [&amp;quot;tags&amp;quot;]
tags: [&#39;bacon&#39;, &#39;cheese&#39;]
---

* list item
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Example 4 - Nested Layouts&lt;/h2&gt;
&lt;p&gt;Sometimes you need to go a step further and nest your layouts. For a blog post for example you might have a post layout that lives inside the main layout. This is where eleventy provides support for &lt;a href=&quot;https://www.11ty.dev/docs/layout-chaining/&quot;&gt;layout chaining&lt;/a&gt;. Which you can also do with &lt;code&gt;eleventy-sizlate&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;
const eleventySizlate = require(&#39;eleventy-sizlate&#39;)

const fs = require(&#39;fs&#39;)
const template = `
&amp;lt;h2&amp;gt;&amp;lt;/h2&amp;gt;
&amp;lt;p&amp;gt; Here is something else that you want to appear on the nested page. &amp;lt;/p&amp;gt;
&amp;lt;div id=&amp;quot;post&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
`

class SizlatePost {
    data = {
        layout: &#39;layouts/layout.sizlate.11ty.js&#39;
    }

    postSelectors(data) {
        return {
            &#39;h2&#39;: data.secondaryTitle,
            &#39;#post&#39;: data.content,
        }
    }

    render(data) {
        const selectors = this.postSelectors(data)
        return eleventySizlate.render({ template }, selectors)
    }
}

module.exports = SizlatePost;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and you can use that template exactly the same as you do the other ones:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;---
title: Nested layout example
secondaryTitle: &#39;More detail&#39;
layout: layouts/nested.sizlate.11ty.js
---


This content is wrapped in the nested template and the main layout.

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You can see all these examples in action working on &lt;a href=&quot;https://eleventy-sizlate-example.netlify.app/&quot;&gt;netlify&lt;/a&gt; and see the code on &lt;a href=&quot;https://github.com/simonmcmanus/eleventy-sizlate-example&quot;&gt;github&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This site is now running on eleventy with sizlate managing the layouts. I&#39;ve removed the clientside rendering for now, but thats not to say it can&#39;t be put back later.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>KISS Keep it simple Simon - Complexity killed the cat.</title>
    <link href="https://simonmcmanus.com/posts/KISS-Complexity-killed-the-cat/"/>
    <updated>2025-01-18T00:00:00Z</updated>
    <id>https://simonmcmanus.com/posts/KISS-Complexity-killed-the-cat/</id>
    <content type="html">&lt;p&gt;Sharing a talk I presented last year at the Trainline Tech Summit. This talk explores complexity and where it comes from. I discuss some emergent behaviours we see in complex systems and how they can be avoided.&lt;/p&gt;
&lt;p&gt;Please excuse the fire alarm and tech issues at the start.&lt;/p&gt;
&lt;video width=&quot;100%&quot; controls=&quot;&quot;&gt;
  &lt;source src=&quot;https://simonmcmanus.com/talks/Simon%20Mcmanus%20-%20KISS%20Keep%20it%20simple.mp4&quot; type=&quot;video/mp4&quot; /&gt;
&lt;/video&gt;
&lt;p&gt;Any questions of feedback please reach out on &lt;a href=&quot;https://bsky.app/profile/simonmcmanus.com&quot;&gt;bluesky&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
</feed>