<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0"><generator uri="http://www.habariproject.org/" version="0.8">Habari</generator><id>tag:looseideas.co.uk,2012-02-27:atom/dd035d9c8b92fbaa2315aab5f351e1cb3f863bbc</id><title>Looseideas.co.uk - Ryan Mitchell</title><updated>2011-10-22T14:30:54+01:00</updated><link rel="alternate" href="http://looseideas.co.uk/" /><link rel="first" href="http://looseideas.co.uk/atom/1/page/1" type="application/atom+xml" title="First Page" /><link rel="next" href="http://looseideas.co.uk/atom/1/page/2" type="application/atom+xml" title="Next Page" /><link rel="last" href="http://looseideas.co.uk/atom/1/page/6" type="application/atom+xml" title="Last Page" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/looseideascouk-RyanMitchell" /><feedburner:info uri="looseideascouk-ryanmitchell" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry><title>Making session storage play nicely with server side sessions</title><link rel="alternate" href="http://feedproxy.google.com/~r/looseideascouk-RyanMitchell/~3/ey_i45-3CwA/making-session-storage-play-nicely-with-server-side-sessions" /><link rel="edit" href="http://looseideas.co.uk/making-session-storage-play-nicely-with-server-side-sessions/atom" /><author><name>Ryan Mitchell</name><uri>http://looseideas.co.uk</uri></author><id>tag:www.looseideas.co.uk,2011:making-session-storage-play-nicely-with-server-side-sessions/1319287733</id><updated>2011-10-22T14:30:54+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-10T08:13:20+00:00</app:edited><published>2011-10-22T14:30:54+01:00</published><category term="html5" /><category term="web-storage" /><content type="html">&lt;p&gt;Session and local storage have made the storage of data on a clients machine respectable, gone are the big cookies and window.name, partnered with the ability to define manifest files developers can now exert control over how resources and data are cached to a level that makes Apache and IIS look embarrassing.&lt;/p&gt;&#xD;
&lt;p&gt;However, with every new feature, some things get easier and some things get harder.&lt;/p&gt;&#xD;
&lt;p&gt;Session storage is held only in a particular tab or window, allocated to the domain and lasting as long as that window persists. Opening the same domain in another tab will create a new session. Local storage is also allocated to a domain but persists between sessions, tabs and windows.&lt;/p&gt;&#xD;
&lt;p&gt;Web storage does not cater for different users, domains and windows are all it knows.&lt;/p&gt;&#xD;
&lt;p&gt;There are additional complications if users on your site are able to login, if your web storage includes data individual to the user you need to take care to clear and refresh data whenever the state changes&lt;/p&gt;&#xD;
&lt;h2&gt;How to maintain state between web storage and server sessions&lt;/h2&gt;&#xD;
&lt;p&gt;It might be a bit old-school, but Cookies are still the way that most back-end systems track user sessions. The simplest thing to do is to store the value of the session cookie in your web storage and to compare those values when the page loads and if the values differ clear the session of user specific data.&lt;/p&gt;&#xD;
&lt;pre&gt;&#xD;
	sLocalKey = 'StoredIdentity',&#xD;
	sCookieKey = 'CookieKey',&#xD;
	storedIdent = window.localStorage.getItem(sLocalKey);&#xD;
	sCookieValue = readCookie(CookieKey);&#xD;
&#xD;
	if (sCookieValue === storedIdent) {&#xD;
		return true; //same cookie value&#xD;
	}&#xD;
	else {&#xD;
		return sCookieValue; //different value, new session&#xD;
	}&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;Another case to watch for is a login/logout events, it's unlikely the cookie value will change (the session existed before login) but either you can watch for a query-string value or particular pages like login/logout success.&lt;/p&gt;&#xD;
&lt;img src="http://feeds.feedburner.com/~r/looseideascouk-RyanMitchell/~4/ey_i45-3CwA" height="1" width="1"/&gt;</content><feedburner:origLink>http://looseideas.co.uk/making-session-storage-play-nicely-with-server-side-sessions</feedburner:origLink></entry><entry><title>"The Web Behind the Medium" - An article for the Idea Engineers Blog</title><link rel="alternate" href="http://feedproxy.google.com/~r/looseideascouk-RyanMitchell/~3/F9xUU4NAIi0/web-behind-the-medium" /><link rel="edit" href="http://looseideas.co.uk/web-behind-the-medium/atom" /><author><name>Ryan Mitchell</name><uri>http://looseideas.co.uk</uri></author><id>tag:www.looseideas.co.uk,2011:web-behind-the-medium/1316339589</id><updated>2011-09-18T10:53:09+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-18T10:53:09+01:00</app:edited><published>2011-09-12T12:00:26+01:00</published><category term="idea-engineers" /><content type="html">&lt;p&gt;Over the past few months I've been amazed at how simple it can be to reuse the same code and structures on quite different devices. When I was asked to write an article for Sapient's Idea Engineer blog I straight away knew that was what I wanted to talk about.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;The purpose of the article is to highlight the idea that using the technology of the web (APIs, JavaScript, CSS) can save us time and effort when developing for multiple, disparate platforms.&lt;/p&gt; &#xD;
&#xD;
&lt;p&gt;Read &lt;a href="http://ideaengineers.sapient.com/technology/the-web-behind-the-medium/"&gt;The Web Behind the Medium (Idea Engineers)&lt;/a&gt;&lt;img src="http://feeds.feedburner.com/~r/looseideascouk-RyanMitchell/~4/F9xUU4NAIi0" height="1" width="1"/&gt;</content><feedburner:origLink>http://looseideas.co.uk/web-behind-the-medium</feedburner:origLink></entry><entry><title>Hashbangs, useful, but probably not what you want</title><link rel="alternate" href="http://feedproxy.google.com/~r/looseideascouk-RyanMitchell/~3/DWkg-6F0itA/hashbangs-not-what-you-want" /><link rel="edit" href="http://looseideas.co.uk/hashbangs-not-what-you-want/atom" /><author><name>Ryan Mitchell</name><uri>http://looseideas.co.uk</uri></author><id>tag:looseideas.co.uk,2011:hashbangs-not-what-you-want/1310980362</id><updated>2011-07-18T10:12:42+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-18T10:13:17+01:00</app:edited><published>2011-07-18T10:12:42+01:00</published><category term="ajax" /><category term="hashbang" /><category term="history" /><content type="html">&lt;p&gt;In the modern web AJAX is the workhorse behind the interactions. CSS3 might add the shine but AJAX is still doing the work. The strength of AJAX is that it's a background request, the UI will ignore them completely, which is fantastic unless you've just ripped out the hole page content and replaced it with another one. &lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;To enable the user to track that changed state you need to change the URL, and this is where hashbangs come in. Hashbangs are a work-around. But Hashbangs are an old workaround for an old problem.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;Where previously we only has window.location available to us we now have the history API, window.history.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;Use pushState to add states and watch for the popstate event to revert to previous states.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;One final caveat, &lt;strong&gt;if you are updating only a region of your page then a hashbang may still be valid for you&lt;/strong&gt;. The hashbang URL must convert into a querystring URL for search engines to parse the content. They expect only the changed content to be returned when they visit that converted URL.&lt;/p&gt;&#xD;
&#xD;
&lt;h2&gt;Resources&lt;/h2&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&lt;a href="http://code.google.com/web/ajaxcrawling/docs/specification.html"&gt;Crawling AJAX content (Google code)&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="http://isolani.co.uk/blog/javascript/BreakingTheWebWithHashBangs"&gt;Breaking the Web with hash-bangs&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="http://diveintohtml5.org/history.html"&gt;History API (Dive Into HTML5)&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="https://github.com/balupton/history.js"&gt;History.js&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&#xD;
&lt;img src="http://feeds.feedburner.com/~r/looseideascouk-RyanMitchell/~4/DWkg-6F0itA" height="1" width="1"/&gt;</content><feedburner:origLink>http://looseideas.co.uk/hashbangs-not-what-you-want</feedburner:origLink></entry><entry><title>Open up to better project tools</title><link rel="alternate" href="http://feedproxy.google.com/~r/looseideascouk-RyanMitchell/~3/J28ZOKMzg48/better-project-tools" /><link rel="edit" href="http://looseideas.co.uk/better-project-tools/atom" /><author><name>Ryan Mitchell</name><uri>http://looseideas.co.uk</uri></author><id>tag:looseideas.co.uk,2011:better-project-tools/1310301933</id><updated>2011-07-10T13:45:33+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-02T23:16:53+00:00</app:edited><published>2011-07-10T13:45:33+01:00</published><category term="assembla" /><category term="basecamp" /><category term="tools" /><content type="html">&lt;p&gt;Project tools are there to support the project. If those tools are sub-standard then it's likely they will cost your team time and raise their irritation levels. An annoyed developer is a dangerous thing, we're fully capable of complaining about minor things for hours so imagine what seriously crap bit of software can do.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;When working as a team, solid, clear and simple communication is paramount. Whether it be about initial requirements, planning, defects or delivery, the task should be the focus and the tool is just the medium. Customization comes later, the Project Manager has different priorities than a Developer, they can tailor their own views and then everyone gets to see what they need and get past the noise.&lt;/p&gt;&#xD;
&#xD;
&lt;h2&gt;Info in, detail out&lt;/h2&gt;&#xD;
&lt;p&gt;Email is not a good project communication tool, &lt;strong&gt;email is a very bad project communication tool&lt;/strong&gt;. In email all messages are equal; your email with client changes is probably sandwiched between an email about IE6 and an invitation to drinks. When i try to find it again the only word that describes that process is trawling.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;CC your email to your project tool&lt;/strong&gt; and it'll be tracked there, anyone with access can find it, and I'm less likely to delete it when Entourage tells me I've no space&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Track tasks and defects in the tool&lt;/strong&gt;, create sub-tasks, allocate them to developers and have them update the status as it changes. If we did this then status meetings get shorter and our productive working days get longer, and your status report becomes a link to the tool. Even with the burn-down filled in if that's your thing.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Use SVN or Git&lt;/strong&gt;, because not doing is irresponsible, dropbox is not a replacement for SVN, it's a lazy insecure shared space. Think of those shared drives we used to all have. The only "improvement" that dropbox has over them is your sysadmin doesn't have to be involved and it's got an icon in the taskbar.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;Most of all, just because you have tool you've used for ages, investigate alternatives. Basecamp is good, Assembla is better, because it's got an SVN. Both can be bought and stored locally, useful when your systems people complain about where the data is held. &lt;strong&gt;Don't settle for crap tools&lt;/strong&gt;.&lt;img src="http://feeds.feedburner.com/~r/looseideascouk-RyanMitchell/~4/J28ZOKMzg48" height="1" width="1"/&gt;</content><feedburner:origLink>http://looseideas.co.uk/better-project-tools</feedburner:origLink></entry><entry><title>Looseideas in 2011</title><link rel="alternate" href="http://feedproxy.google.com/~r/looseideascouk-RyanMitchell/~3/0OnP4nI2WWY/looseideas-in-2011" /><link rel="edit" href="http://looseideas.co.uk/looseideas-in-2011/atom" /><author><name>Ryan Mitchell</name><uri>http://looseideas.co.uk</uri></author><id>tag:looseideas.co.uk,2011:looseideas-in-2011/1308565311</id><updated>2011-06-20T11:21:51+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-20T11:22:12+01:00</app:edited><published>2011-06-20T11:21:51+01:00</published><content type="html">&lt;p&gt;I've made a few changes to this site recently, the blog is now upfront and the old "content" has gone. Previously I maintained this site to pad out my portfolio, but since working at Sapient I've ignored and patched it until the code is mush&lt;/p&gt;&#xD;
&lt;p&gt;From now on it's going to have a change of emphasis. I'm going to write bits and pieces, rambling through a topic with a couple of decent links. I don't expect anyone to read it but it's better out of my head than bubbling away in there.&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;Love and hugs,&lt;br /&gt;&#xD;
Ryan&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/looseideascouk-RyanMitchell/~4/0OnP4nI2WWY" height="1" width="1"/&gt;</content><feedburner:origLink>http://looseideas.co.uk/looseideas-in-2011</feedburner:origLink></entry></feed>

