<?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:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;DUMCSHs5eCp7ImA9WhBbGUs.&quot;"><id>tag:blogger.com,1999:blog-9088824</id><updated>2013-05-19T22:14:29.520+09:30</updated><category term="alarm" /><category term="api. freebase" /><category term="Zemanta" /><category term="news" /><category term="bug" /><category term="free" /><category term="soa" /><category term="pt adelaide" /><category term="silicon valley" /><category term="toronto" /><category term="selenium" /><category term="adobe" /><category term="Wine" /><category term="rat" /><category term="packing" /><category term="office space" /><category term="Test" /><category term="xampp" /><category term="awk" /><category term="Clients" /><category term="Languages" /><category term="savant" /><category term="City of Port Adelaide Enfield" /><category term="gobby" /><category term="lixi" /><category term="xpath" /><category term="license" /><category term="myself" /><category term="evil" /><category term="xhtml" /><category term="x3d" /><category term="bdd" /><category term="rant" /><category term="patch" /><category term="Automobile" /><category term="facebook" /><category term="java" /><category term="jewelery" /><category term="Data Formats" /><category term="Traffic light" /><category term="adelaide metro" /><category term="australia post" /><category term="pearweb" /><category term="apt" /><category term="government" /><category term="crafers" /><category term="cats" /><category term="faith" /><category term="warehousing" /><category term="ideas" /><category term="Concurrent Versions System" /><category term="Cut  copy  and paste" /><category term="United States" /><category term="album" /><category term="australia" /><category term="angry" /><category term="patents" /><category term="south australia" /><category term="chloe" /><category term="Multicast DNS" /><category term="Merlot" /><category term="Road" /><category term="ice" /><category term="Array" /><category term="fire" /><category term="Free Speech" /><category term="flickr" /><category term="panic" /><category term="gtfo" /><category term="power" /><category term="unit testing" /><category term="design" /><category term="america" /><category term="mp3" /><category term="pear" /><category term="statistics" /><category term="Method" /><category term="ubuntu" /><category term="Cycling shorts" /><category term="busking" /><category term="Uniform Resource Locator" /><category term="json" /><category term="google" /><category term="svn" /><category term="space" /><category term="ruby" /><category term="mail" /><category term="Document" /><category term="fruit" /><category term="nasa" /><category term="bpay" /><category term="democracy" /><category term="super hero" /><category term="data capture" /><category term="debugger" /><category term="cal" /><category term="in_array" /><category term="flight" /><category term="oops" /><category term="pidgin" /><category term="chefmoz" /><category term="tooltips" /><category term="documentary" /><category term="Recreation and Sports" /><category term="Application programming interface" /><category term="demo" /><category term="IP address" /><category term="censorship" /><category term="Joy Division" /><category term="Unit Tests" /><category term="LuckyCal" /><category term="it" /><category term="protest" /><category term="qantas" /><category term="airship" /><category term="Browsers" /><category term="zwave" /><category term="opensource" /><category term="lazyweb" /><category term="survey" /><category term="cycling" /><category term="snail mail" /><category term="Home" /><category term="dafur" /><category term="Insect" /><category term="roi" /><category term="filezilla" /><category term="social network" /><category term="zenity" /><category term="foaf" /><category term="prototype.js" /><category term="belgium" /><category term="downloadable design" /><category term="ebooks" /><category term="Australia censorship" /><category term="Website" /><category term="charles stross" /><category term="howto" /><category term="seadragon" /><category term="music" /><category term="nina starr" /><category term="scriptaculous" /><category term="question" /><category term="DNS Providers" /><category term="jbehave" /><category term="jquery" /><category term="cool" /><category term="wikipedia" /><category term="audioscrobbler" /><category term="energy" /><category term="Computers" /><category term="google earth" /><category term="sql" /><category term="loans" /><category term="Food Standards Australia New Zealand" /><category term="ipod" /><category term="twitter" /><category term="Government of Australia" /><category term="identi.ca" /><category term="icalendar" /><category term="Human Rights and Liberties" /><category term="Tools" /><category term="standards" /><category term="supervillan" /><category term="hot" /><category term="film" /><category term="health" /><category term="Computers and Internet" /><category term="office supplies" /><category term="shearing" /><category term="continuous integration" /><category term="sandra kanck" /><category term="Active record pattern" /><category term="documentation" /><category term="thebarton theatre" /><category term="Elections in Iran" /><category term="phpunit" /><category term="Amazon" /><category term="junit" /><category term="tablet pc" /><category term="Freedom of speech" /><category term="puzzle" /><category term="wtf" /><category term="ontology" /><category term="sunbird" /><category term="exhibit" /><category term="sci fi" /><category term="feature request" /><category term="library" /><category term="essays" /><category term="Power door locks" /><category term="xulrunner" /><category term="css" /><category term="web 2.0" /><category term="work. paper" /><category term="post office" /><category term="family" /><category term="Fraud" /><category term="handy" /><category term="Business logic" /><category term="bootleg" /><category term="app" /><category term="sheep" /><category term=".net" /><category term="tv" /><category term="review" /><category term="friend" /><category term="indian" /><category term="xml" /><category term="lga" /><category term="28 Days Later" /><category term="sydney" /><category term="dtei" /><category term="jabber" /><category term="google maps" /><category term="mysql" /><category term="lightning" /><category term="oracle_enhanced" /><category term="livejournal" /><category term="kml" /><category term="egovernment" /><category term="rdfa" /><category term="parody" /><category term="language" /><category term="mozconcept" /><category term="style" /><category term="ie8" /><category term="martin luther king" /><category term="good relations" /><category term="rspec" /><category term="adelaide" /><category term="trac" /><category term="android" /><category term="Stephen Conroy" /><category term="integration" /><category term="http_request2" /><category term="theft" /><category term="svg" /><category term="craft" /><category term="x10" /><category term="software" /><category term="Tomato soup" /><category term="vegetables" /><category term="goo" /><category term="release" /><category term="redundancy" /><category term="songbird" /><category term="Gasoline" /><category term="bathroom" /><category term="zend" /><category term="jpspan" /><category term="prototype" /><category term="Racing" /><category term="groklaw" /><category term="yahoo" /><category term="Standardization" /><category term="goodreads" /><category term="dbpedia" /><category term="javascript" /><category term="Lost" /><category term="useful" /><category term="jenkins" /><category term="real estate" /><category term="musing" /><category term="marriage" /><category term="Clive Hamilton" /><category term="http" /><category term="banking" /><category term="Fire drill" /><category term="air conditioner" /><category term="tipsy" /><category term="console" /><category term="rdf" /><category term="riding" /><category term="browser" /><category term="murder" /><category term="ning" /><category term="script" /><category term="tomboy" /><category term="404" /><category term="csv" /><category term="turbine" /><category term="driving" /><category term="friends" /><category term="car" /><category term="idea" /><category term="ausgrid" /><category term="fud" /><category term="internet explorer" /><category term="php" /><category term="Stairway" /><category term="asteroids" /><category term="Four-wheel drive" /><category term="Radio" /><category term="standards australia" /><category term="Pet peeve" /><category term="Resource Description Framework" /><category term="melbourne cup" /><category term="bbc" /><category term="Mortgage broker" /><category term="gecko" /><category term="samsung" /><category term="life" /><category term="aibo" /><category term="pepr" /><category term="potus" /><category term="daylight savings" /><category term="good practice" /><category term="valex" /><category term="blogger" /><category term="musicbrainz" /><category term="open office" /><category term="Domain Name System" /><category term="xspf" /><category term="Crop circle" /><category term="cowboy" /><category term="history" /><category term="Google Calendar" /><category term="rosewater" /><category term="mozilla" /><category term="command line" /><category term="maps" /><category term="Wiki" /><category term="metadata" /><category term="merger" /><category term="Beverages" /><category term="pirates" /><category term="sqlyog" /><category term="shaolin" /><category term="twine" /><category term="package" /><category term="alphagrip" /><category term="phones" /><category term="transport" /><category term="ai" /><category term="mock objects" /><category term="movies" /><category term="books" /><category term="development" /><category term="death" /><category term="shopping" /><category term="n" /><category term="Mozilla Firefox" /><category term="last.fm" /><category term="rabbitvcs" /><category term="Protocols" /><category term="TikiWiki" /><category term="api" /><category term="House" /><category term="xbmc" /><category term="war" /><category term="openstreetmap" /><category term="Testing" /><category term="owl" /><category term="getfridged" /><category term="job" /><category term="freebase" /><category term="Market value" /><category term="planningalerts" /><category term="git" /><category term="pwnage" /><category term="United States Department of Agriculture" /><category term="rails" /><category term="abc" /><category term="Tour de France" /><category term="video" /><category term="Mental retardation" /><category term="Events" /><category term="mashup" /><category term="bus" /><category term="Science and Technology" /><category term="work" /><category term="past" /><category term="hamachi" /><category term="cars" /><category term="savon" /><category term="rice" /><category term="nab" /><category term="lego" /><category term="global warming" /><category term="upcoming:event=129261" /><category term="woodworking" /><category term="Office Open XML" /><category term="example" /><category term="Opera" /><category term="injury" /><category term="Mortgage" /><category term="violence" /><category term="brain" /><category term="valuation" /><category term="Test suite" /><category term="geo" /><category term="Programs" /><category term="pizza" /><category term="pdf" /><category term="holden" /><category term="ooxml" /><category term="rest" /><category term="obama" /><category term="ui" /><category term="copiepresse" /><category term="drm" /><category term="Web APIs" /><category term="summer of code" /><category term="cardboard" /><category term="tram" /><category term="race" /><category term="Command-line interface" /><category term="United Kingdom" /><category term="gloves" /><category term="ridiculous" /><category term="lolcats" /><category term="gotcha" /><category term="Internet Relay Chat" /><category term="subversion" /><category term="knockout" /><category term="bikes" /><category term="education" /><category term="activerecord" /><category term="operator" /><category term="pride" /><category term="Asa Dotzler" /><category term="Wine tasting" /><category term="magic" /><category term="geoweb" /><category term="linked data" /><category term="guilt" /><category term="world war" /><category term="christmas" /><category term="github" /><category term="Kate Ellis" /><category term="Gedit" /><category term="xul" /><category term="nocleanfeed" /><category term="roomba" /><category term="astra" /><category term="tortoisesvn" /><category term="green" /><category term="The Amazing Race" /><category term="stationery" /><category term="sparql" /><category term="Conroy" /><category term="bicycle" /><category term="planning" /><category term="gimp" /><category term="want" /><category term="uml" /><category term="un" /><category term="DVD" /><category term="open standards" /><category term="apollo" /><category term="wind" /><category term="usability" /><category term="venuetix" /><category term="math" /><category term="NLP" /><category term="ssdp" /><category term="bible" /><category term="OpenDocument" /><category term="awesome" /><category term="gtk" /><category term="pigeon" /><category term="bookfeed" /><category term="punchbuggy" /><category term="web services" /><category term="raspberry pi" /><category term="red tape" /><category term="tip" /><category term="Arts" /><category term="copyright" /><category term="quake" /><category term="wireless" /><category term="ride" /><category term="vegetarian" /><category term="papercut" /><category term="id" /><category term="vpn" /><category term="open streetmap" /><category term="gnautilius" /><category term="project management" /><category term="horses" /><category term="Television" /><category term="Sports" /><category term="Triage" /><category term="oci8" /><category term="kettlebells" /><category term="fitness" /><category term="printers" /><category term="openid" /><category term="sad" /><category term="meetup" /><category term="chiropractic" /><category term="DNS" /><category term="3d" /><category term="Amazon.com" /><category term="upcoming" /><category term="upnp" /><category term="Stephen Morris" /><category term="garden" /><category term="rp data" /><category term="open source" /><category term="asterix" /><category term="Searching" /><category term="lobsters" /><category term="invites" /><category term="quality assurance" /><category term="Internet service provider" /><category term="bike" /><category term="Hype Machine" /><category term="gwibber" /><category term="firefox" /><category term="psychology" /><category term="cluttr" /><category term="travel" /><category term="urinal" /><category term="gaim" /><category term="tips" /><category term="metric" /><category term="haskell" /><category term="fresh fm" /><category term="hezbollah" /><category term="kung fu" /><category term="Canada" /><category term="web 3.0" /><category term="laptop" /><category term="grddl" /><category term="trance" /><category term="soldier" /><category term="future" /><category term="business" /><category term="advice" /><category term="foreach" /><category term="xmpp" /><category term="WWW" /><category term="refactoring" /><category term="natural language parsing" /><category term="security" /><category term="semantic web" /><category term="Cabernet Sauvignon" /><category term="CVS" /><category term="utf-8" /><category term="scripture" /><category term="dream" /><category term="robots" /><category term="Dialog box" /><category term="valuations" /><category term="ted" /><category term="game" /><category term="oracle" /><category term="flying spaghetti monster" /><category term="microformats" /><category term="Filter" /><category term="smart ac" /><category term="photo" /><category term="ssrs" /><category term="marijuana" /><category term="digg" /><category term="zend framework" /><category term="html" /><category term="atom" /><category term="calc" /><category term="quality" /><category term="desktop manufacturing" /><category term="bug triage" /><category term="china" /><category term="ferret" /><category term="automation" /><category term="architecture" /><category term="eco" /><category term="web design" /><category term="nautilus" /><category term="Safety" /><category term="contract" /><category term="abs" /><category term="loxton" /><category term="Personal computer" /><category term="ipad" /><category term="im" /><category term="open data" /><category term="Recreation" /><category term="environment" /><category term="toggg" /><category term="Programming" /><category term="cba" /><category term="earthquake" /><category term="gnome" /><category term="sudan" /><category term="achievement" /><category term="rsi" /><category term="msn" /><category term="augmented reality" /><category term="ibm" /><category term="20th century" /><category term="python" /><category term="North Pole" /><category term="Google Map" /><category term="internet" /><category term="International Organization for Standardization" /><category term="thunderbird" /><category term="geospatial web" /><category term="code review" /><category term="Calorie" /><category term="linux" /><category term="Drink" /><category term="dependency injection" /><category term="soap" /><category term="research" /><category term="birthday" /><category term="valuer" /><category term="budget" /><category term="monks" /><category term="ajax" /><category term="politics" /><category term="tutorial" /><category term="pfm" /><category term="snomed" /><category term="Long Distance Paths" /><category term="happy" /><category term="Content Filtering" /><category term="route" /><category term="Square metre" /><category term="web of things" /><category term="sql server" /><category term="anzac day" /><category term="pacman" /><category term="bitbucket" /><category term="outlook" /><category term="wishlist" /><category term="ew" /><category term="Iran" /><category term="gearman" /><category term="Google Talk" /><category term="FSANZ" /><category term="clock" /><category term="food" /><category term="Internet censorship" /><category term="Terminator: The Sarah Connor Chronicles" /><category term="functional programming" /><category term="daniel o'connor" /><category term="religion" /><category term="drupal" /><category term="microsoft" /><category term="oeb" /><category term="capistrano" /><category term="data" /><category term="Human-Computer Interaction" /><category term="drugs" /><category term="solar" /><category term="medicine" /><category term="linuxmce" /><category term="accounting" /><category term="Financial services" /><category term="toner" /><title>Daniel O'Connor</title><subtitle type="html">Daniel's collected open source and open data musings as a web developer, project manager and architect in Adelaide.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://clockwerx.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://clockwerx.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/9088824/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Daniel O'Connor</name><uri>https://plus.google.com/114910530124691879879</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-4ol1KKoueXA/AAAAAAAAAAI/AAAAAAAADUM/t9FtFRD-SzU/s512-c/photo.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>849</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/blogspot/GHCgp" /><feedburner:info uri="blogspot/ghcgp" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;CUYDQ3c_cCp7ImA9WhBbFEg.&quot;"><id>tag:blogger.com,1999:blog-9088824.post-362696101133006041</id><published>2013-05-13T23:22:00.001+09:30</published><updated>2013-05-13T23:22:52.948+09:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-05-13T23:22:52.948+09:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="australia" /><category scheme="http://www.blogger.com/atom/ns#" term="idea" /><category scheme="http://www.blogger.com/atom/ns#" term="adelaide" /><category scheme="http://www.blogger.com/atom/ns#" term="demo" /><category scheme="http://www.blogger.com/atom/ns#" term="south australia" /><category scheme="http://www.blogger.com/atom/ns#" term="openstreetmap" /><category scheme="http://www.blogger.com/atom/ns#" term="prototype" /><category scheme="http://www.blogger.com/atom/ns#" term="php" /><category scheme="http://www.blogger.com/atom/ns#" term="opensource" /><category scheme="http://www.blogger.com/atom/ns#" term="mashup" /><category scheme="http://www.blogger.com/atom/ns#" term="fire" /><title>Consuming GeoRSS and querying OpenStreetMap</title><content type="html">In Adelaide, there was an unexpected fire. It was a bushfire, and I'd just been mapping the area earlier that day - ironically, tracing some of the forests which were being burnt out at that very point in time.&lt;br /&gt;
&lt;br /&gt;
I decided to go and see what was available for fire alerts around the nation.&lt;br /&gt;
&lt;br /&gt;
It turns out the majority of fire authorities publish GeoRSS. I took the feeds and aggregated them, plus put in a transformation of the data to JSON.&lt;br /&gt;
&lt;br /&gt;
Using Leaflet, I added a rendering of particular fires.&lt;br /&gt;
&lt;br /&gt;Using the OpenStreetMap Overpass API, I queried for "all areas in a 500m bounding box", and again using Leaflet, rendered those polygons onto a map.&lt;br /&gt;
&lt;br /&gt;
Here's the Project:&lt;br /&gt;
&lt;a href="https://github.com/CloCkWeRX/burning-down"&gt;https://github.com/CloCkWeRX/burning-down&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Here's a few screenshots:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-KPfWGQEBDaA/UZDt0IIfvfI/AAAAAAAAEwM/jWekZMay82k/s1600/Screenshot+from+2013-05-13+23:09:45.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="174" src="http://2.bp.blogspot.com/-KPfWGQEBDaA/UZDt0IIfvfI/AAAAAAAAEwM/jWekZMay82k/s320/Screenshot+from+2013-05-13+23:09:45.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
Coverage, for most of Australia. WA doesn't provide openly licensed data, and South Australia's does not contain lat/long info.&lt;br /&gt;
The few you see in those states are from Sentinel, a satellite based system for detecting 'hot spots' that may indicate a fire.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-bv_2CRxm6Yk/UZDt0_1VhWI/AAAAAAAAEwY/lCNaLKq49v4/s1600/Screenshot+from+2013-05-13+23:11:24.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="174" src="http://4.bp.blogspot.com/-bv_2CRxm6Yk/UZDt0_1VhWI/AAAAAAAAEwY/lCNaLKq49v4/s320/Screenshot+from+2013-05-13+23:11:24.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
Here, a number of resident buildings are marked as 'at risk' from a fire. In reality, these are probably safe, due to fires in these areas tending to be contained to residential areas.&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
On the other hand, you can certainly consider adding an Open Street Bug report if someone's house may have burned down!&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-fhZWriW8i2g/UZDt0GYlCpI/AAAAAAAAEwQ/uwTMJWYHdG4/s1600/Screenshot+from+2013-05-13+23:11:49.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="174" src="http://3.bp.blogspot.com/-fhZWriW8i2g/UZDt0GYlCpI/AAAAAAAAEwQ/uwTMJWYHdG4/s320/Screenshot+from+2013-05-13+23:11:49.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
This is more interesting - there's a fire or other emergency &lt;i&gt;right next to a national park. National parks are made from trees, which in my experience tend to catch on a whole lot of fire!&lt;/i&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
Obviously this sort of incident is well in hand if the fire authorities are aware of it, but it is interesting to see that fuel sources are being picked up.&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
My next efforts here are going to be around encouraging edits near the area - if there isn't much detail on water sources (dams, swimming pools, rivers, lakes); it certainly makes sense to identify those if there's already been a fire once.&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
I also made a bit of effort to aggregate the feed output into sqlite - I might go run up a basic server and run this as a service at some later point, as aggregating this data seems useful.&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
The thing I like most about this - it's trivial to take any GeoRSS feed and query OpenStreetMap for nearby things - I've done fairly wide ranging queries with a narrow bounding box so far; but those are easy enough things to tweak.&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/blogspot/GHCgp/~4/t2ClbZ6aXac" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://clockwerx.blogspot.com/feeds/362696101133006041/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9088824&amp;postID=362696101133006041" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9088824/posts/default/362696101133006041?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9088824/posts/default/362696101133006041?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/GHCgp/~3/t2ClbZ6aXac/consuming-georss-and-querying.html" title="Consuming GeoRSS and querying OpenStreetMap" /><author><name>Daniel O'Connor</name><uri>https://plus.google.com/114910530124691879879</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-4ol1KKoueXA/AAAAAAAAAAI/AAAAAAAADUM/t9FtFRD-SzU/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-KPfWGQEBDaA/UZDt0IIfvfI/AAAAAAAAEwM/jWekZMay82k/s72-c/Screenshot+from+2013-05-13+23:09:45.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://clockwerx.blogspot.com/2013/05/consuming-georss-and-querying.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUABR3o_fyp7ImA9WhBbFE4.&quot;"><id>tag:blogger.com,1999:blog-9088824.post-7419685762877232393</id><published>2013-05-13T19:05:00.002+09:30</published><updated>2013-05-13T19:05:56.447+09:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-05-13T19:05:56.447+09:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Multicast DNS" /><category scheme="http://www.blogger.com/atom/ns#" term="DNS" /><category scheme="http://www.blogger.com/atom/ns#" term="xbmc" /><category scheme="http://www.blogger.com/atom/ns#" term="DNS Providers" /><category scheme="http://www.blogger.com/atom/ns#" term="Domain Name System" /><category scheme="http://www.blogger.com/atom/ns#" term="ubuntu" /><category scheme="http://www.blogger.com/atom/ns#" term="IP address" /><category scheme="http://www.blogger.com/atom/ns#" term="Protocols" /><title>Neat ad-hoc networking trick</title><content type="html">I didn't realise it for a long time, but instead of relying on &lt;a class="zem_slink" href="http://en.wikipedia.org/wiki/Domain_Name_System" rel="wikipedia" target="_blank" title="Domain Name System"&gt;DNS&lt;/a&gt; or directly entering &lt;a class="zem_slink" href="http://en.wikipedia.org/wiki/IP_address" rel="wikipedia" target="_blank" title="IP address"&gt;IP addresses&lt;/a&gt;, &lt;i&gt;most&lt;/i&gt;&amp;nbsp;machines in my &lt;a class="zem_slink" href="http://en.wikipedia.org/wiki/Home_network" rel="wikipedia" target="_blank" title="Home network"&gt;home network&lt;/a&gt; actually self organise. Many of you will already know this, but for those that dont...&lt;br /&gt;
&lt;br /&gt;
Most devices support a thing called &lt;a class="zem_slink" href="http://en.wikipedia.org/wiki/Multicast_DNS" rel="wikipedia" target="_blank" title="Multicast DNS"&gt;Multicast DNS&lt;/a&gt; - apple devices also do this.&lt;br /&gt;
&lt;br /&gt;
Here's the article:&lt;br /&gt;
&lt;a href="http://en.wikipedia.org/wiki/.local"&gt;http://en.wikipedia.org/wiki/.local&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
This is why things like Transmission, SickBeard, &lt;a class="zem_slink" href="http://www.xbmc.org/" rel="homepage" target="_blank" title="XBMC"&gt;XBMC&lt;/a&gt; and &lt;a class="zem_slink" href="http://en.wikipedia.org/wiki/Secure_Shell" rel="wikipedia" target="_blank" title="Secure Shell"&gt;SSH&lt;/a&gt; keys are useful: you can simply point to &lt;i&gt;xbmc.local:8080 &lt;/i&gt;and get to a basic remote control.&lt;br /&gt;
&lt;br /&gt;
This lets you simply refer to whatever the machine is and start talking to it. On a local wifi network, it's great.&lt;br /&gt;
&lt;br /&gt;
Wish:&lt;br /&gt;&lt;a class="zem_slink" href="http://www.ubuntu.com/" rel="homepage" target="_blank" title="Ubuntu (operating system)"&gt;Ubuntu&lt;/a&gt; made this much clearer in some fashion - the first time you join a network, it should flash a welcome message. If it hears about a particular host, it should notify "xbmc.local is available" or similar, indicating a few machines it has detected.&lt;br /&gt;
&lt;br /&gt;


&lt;div class="zemanta-pixie"&gt;
&lt;a class="zemanta-pixie-a" href="http://www.zemanta.com/?px" title="Enhanced by Zemanta"&gt;&lt;img alt="Enhanced by Zemanta" class="zemanta-pixie-img" src="http://img.zemanta.com/zemified_e.png?x-id=17960b67-d01f-4105-b12e-9ea0defe44e5" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/blogspot/GHCgp/~4/86Qvn-eJY_Y" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://clockwerx.blogspot.com/feeds/7419685762877232393/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9088824&amp;postID=7419685762877232393" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9088824/posts/default/7419685762877232393?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9088824/posts/default/7419685762877232393?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/GHCgp/~3/86Qvn-eJY_Y/neat-ad-hoc-networking-trick.html" title="Neat ad-hoc networking trick" /><author><name>Daniel O'Connor</name><uri>https://plus.google.com/114910530124691879879</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-4ol1KKoueXA/AAAAAAAAAAI/AAAAAAAADUM/t9FtFRD-SzU/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://clockwerx.blogspot.com/2013/05/neat-ad-hoc-networking-trick.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0cEQnk_fip7ImA9WhBbEE8.&quot;"><id>tag:blogger.com,1999:blog-9088824.post-4416566585843484327</id><published>2013-05-08T23:20:00.001+09:30</published><updated>2013-05-08T23:20:03.746+09:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-05-08T23:20:03.746+09:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="good practice" /><category scheme="http://www.blogger.com/atom/ns#" term="bitbucket" /><category scheme="http://www.blogger.com/atom/ns#" term="git" /><category scheme="http://www.blogger.com/atom/ns#" term="github" /><category scheme="http://www.blogger.com/atom/ns#" term="code review" /><title>Making code review on BitBucket suck less</title><content type="html">I'm a big fan of code review, I feel that almost everything should be given a once over. I'm used to it in various work places, I'm especially used to it when working in an open source project.&lt;br /&gt;
&lt;br /&gt;
BitBucket is a follower, not a leader, and has managed to get a lot of what makes Github work well added - inline comments are great.&lt;br /&gt;
&lt;br /&gt;
BitBucket has lead in one area though - much like a 'merge pull request', on each change there's an &lt;i&gt;Approve &lt;/i&gt;button.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-HIrreLZA73c/UYpWbxyDc4I/AAAAAAAAEqU/eHNFjM28Ggs/s1600/approve-button.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="70" src="http://3.bp.blogspot.com/-HIrreLZA73c/UYpWbxyDc4I/AAAAAAAAEqU/eHNFjM28Ggs/s320/approve-button.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
If you are happy with a commit, it's a click away - you don't even have to say 'LGTM', if not, have a discussion.&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-iSNCxdvWmwQ/UYpWdPffmsI/AAAAAAAAEqc/HGjdSxOUHmw/s1600/commit-list.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="52" src="http://2.bp.blogspot.com/-iSNCxdvWmwQ/UYpWdPffmsI/AAAAAAAAEqc/HGjdSxOUHmw/s320/commit-list.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
This adds a handy tick in the commits list, letting you see what is accepted or what needs to be talked about.&lt;br /&gt;
&lt;br /&gt;
There are two problems with this though:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Every time you hit the button, notifications are sent&lt;/li&gt;
&lt;li&gt;The review is per commit, not per feature or branch. If you use a simple 'all in' model, it's hard to group a stream of work - later fixes are applied that invalidate your review, all in the same push.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
The best answer I have for issue 1 is to create email rules. If it has to works "commit approved" from bitbucket.org, mark as read and archive it.&lt;/div&gt;
&lt;div&gt;
This dramatically changes the signal to noise ratio, but lets you still leverage the visual indications of review having taken place.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
For the second, feature branches and pull requests are the next best bet - BitBucket allows you to do a pull request from a feature branch on your repository to master.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
This lets review take place on sets of code and features; and works extremely well for integrating stable changes only.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/blogspot/GHCgp/~4/p8XdZuWs8U4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://clockwerx.blogspot.com/feeds/4416566585843484327/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9088824&amp;postID=4416566585843484327" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9088824/posts/default/4416566585843484327?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9088824/posts/default/4416566585843484327?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/GHCgp/~3/p8XdZuWs8U4/making-code-review-on-bitbucket-suck.html" title="Making code review on BitBucket suck less" /><author><name>Daniel O'Connor</name><uri>https://plus.google.com/114910530124691879879</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-4ol1KKoueXA/AAAAAAAAAAI/AAAAAAAADUM/t9FtFRD-SzU/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-HIrreLZA73c/UYpWbxyDc4I/AAAAAAAAEqU/eHNFjM28Ggs/s72-c/approve-button.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://clockwerx.blogspot.com/2013/05/making-code-review-on-bitbucket-suck.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEUMR3oyeip7ImA9WhBUF0k.&quot;"><id>tag:blogger.com,1999:blog-9088824.post-6434671672566178280</id><published>2013-05-05T17:54:00.000+09:30</published><updated>2013-05-05T17:54:46.492+09:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-05-05T17:54:46.492+09:30</app:edited><title>Called it!</title><content type="html">&lt;br /&gt;
&lt;a href="http://clockwerx.blogspot.com.au/2012/10/mapping-rosewater-arg-and-much-more.html"&gt;http://clockwerx.blogspot.com.au/2012/10/mapping-rosewater-arg-and-much-more.html&lt;/a&gt;&amp;nbsp;and&amp;nbsp;&lt;a href="http://clockwerx.blogspot.com.au/2012/05/things-i-want-to-build.html"&gt;http://clockwerx.blogspot.com.au/2012/05/things-i-want-to-build.html&lt;/a&gt;&amp;nbsp;meets&lt;br /&gt;
&lt;a href="https://play.google.com/store/apps/details?id=com.redrobotlabs.lifeiscrime&amp;amp;hl=en"&gt;Augmented Reality Games using open data&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/GHCgp/~4/_luKJbLAMrc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://clockwerx.blogspot.com/feeds/6434671672566178280/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9088824&amp;postID=6434671672566178280" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9088824/posts/default/6434671672566178280?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9088824/posts/default/6434671672566178280?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/GHCgp/~3/_luKJbLAMrc/called-it-httpclockwerx.html" title="Called it!" /><author><name>Daniel O'Connor</name><uri>https://plus.google.com/114910530124691879879</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-4ol1KKoueXA/AAAAAAAAAAI/AAAAAAAADUM/t9FtFRD-SzU/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://clockwerx.blogspot.com/2013/05/called-it-httpclockwerx.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0EMQXw9cCp7ImA9WhBVGEw.&quot;"><id>tag:blogger.com,1999:blog-9088824.post-4752206483941733848</id><published>2013-04-25T01:38:00.000+09:30</published><updated>2013-04-25T01:38:00.268+09:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-04-25T01:38:00.268+09:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="code review" /><title>A quick guide to code review</title><content type="html">In my opinion, it's good practice to have a strong culture of peer review - it ensures your team knows what is going on, catches simple issues, and makes you a better group of developers.&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Bitbucket and Github both provide a quite intuitive interface for reviewing code. You can simply look at a list of recent &lt;i&gt;commits&lt;/i&gt;, and find a particular line to add a &lt;i&gt;comment&lt;/i&gt;.&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://blog.bitbucket.org/files/2012/10/in-line-commenting-small.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="185" src="http://blog.bitbucket.org/files/2012/10/in-line-commenting-small.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;div&gt;
If you are new to git, I'd recommend you find an existing project and try this out.&lt;/div&gt;
&lt;div&gt;
&lt;ol&gt;
&lt;li&gt;Find the commits tab -&amp;nbsp;&lt;a href="https://github.com/jaz303/tipsy/commits/master"&gt;https://github.com/jaz303/tipsy/commits/master&lt;/a&gt;&amp;nbsp;for example&lt;/li&gt;
&lt;li&gt;You can see a number of commits, with references like&amp;nbsp;3545aa6ae2 - these are hashes that uniquely identify the change.&lt;br /&gt;It shows the commit message, author, as well as date/time.&lt;/li&gt;
&lt;li&gt;Viewing one brings up the review user interface.&lt;/li&gt;
&lt;/ol&gt;
&lt;table class="chat"&gt;&lt;tbody id="chat"&gt;
&lt;tr class="text_message message user_1374282" id="message_874877166"&gt;&lt;td class="person"&gt;&lt;span class="author" data-avatar="http://dge9rmgqjs8m1.cloudfront.net/global/missing/avatar.gif?r=3" data-email="daniel.o'connor@htw.com.au" data-name="Daniel O'Connor"&gt;&lt;/span&gt;&lt;/td&gt;
  &lt;td class="body"&gt;&lt;br /&gt;&lt;table class="chat"&gt;&lt;tbody id="chat"&gt;
&lt;tr class="text_message message user_1374282" id="message_874877166"&gt;&lt;td class="body"&gt;Code review is a fairly simple process. Different teams do different things, but I generally do:&lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Does the code change meet the description?&lt;/li&gt;
&lt;li&gt;Is the code self describing / self explanatory?&lt;/li&gt;
&lt;li&gt;Are there tests?&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="body"&gt;
&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr class="paste_message message user_1374282" id="message_874877894"&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
If you have questions, or don't understand something - ask. It may not be that you don't understand, it may be an oversight by the original developer.&lt;br /&gt;&lt;br /&gt;Give it a go on an open source project today!&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/blogspot/GHCgp/~4/m7qvOUr81-U" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://clockwerx.blogspot.com/feeds/4752206483941733848/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9088824&amp;postID=4752206483941733848" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9088824/posts/default/4752206483941733848?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9088824/posts/default/4752206483941733848?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/GHCgp/~3/m7qvOUr81-U/a-quick-guide-to-code-review.html" title="A quick guide to code review" /><author><name>Daniel O'Connor</name><uri>https://plus.google.com/114910530124691879879</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-4ol1KKoueXA/AAAAAAAAAAI/AAAAAAAADUM/t9FtFRD-SzU/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://clockwerx.blogspot.com/2013/04/a-quick-guide-to-code-review.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEAGSX08fyp7ImA9WhBVF04.&quot;"><id>tag:blogger.com,1999:blog-9088824.post-2771599231327564827</id><published>2013-04-24T01:26:00.000+09:30</published><updated>2013-04-24T01:28:48.377+09:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-04-24T01:28:48.377+09:30</app:edited><title>A first time using Git, with Bitbucket - add existing code.</title><content type="html">If you are new to Git, it can be a bit much to get your head around. The content below assumes you are making use of http://bitbucket.org/ - a good alternative for small commercial teams, which is roughly as good as Github in a number of areas.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Git (Windows)&lt;/b&gt;&lt;br /&gt;
First, let's get a git client. If you are on windows, I recommend one called &lt;i&gt;msysgit. &lt;/i&gt;It gives you access to a start menu item, known as &lt;i&gt;Git Bash&lt;/i&gt;&amp;nbsp;- this will look and feel a lot like a Linux terminal.&lt;br /&gt;
&lt;br /&gt;
&lt;table class="chat"&gt;&lt;tbody id="chat"&gt;
&lt;tr class="text_message message user_1374282" id="message_868364630"&gt;&lt;td class="body"&gt;&lt;div class="body"&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="http://code.google.com/p/msysgit/downloads/list" target="_blank"&gt;http://code.google.com/p/msysgit/downloads/list&lt;/a&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Grab Git-1.8.1.2-preview20130201.exe, the "Official installer for windows"&lt;/li&gt;
&lt;li&gt;&lt;div class="body"&gt;
Install, next, next, next, leave the line endings settings to whatever it defaulted to, next some more, SUCCESS!&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr class="text_message message user_1374282" id="message_868365104"&gt;&lt;td class="body"&gt;&lt;div class="body"&gt;
&lt;b&gt;Bitbucket&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table class="chat"&gt;&lt;tbody id="chat"&gt;
&lt;tr class="text_message message user_1374282" id="message_868363341"&gt;&lt;td class="body"&gt;&lt;div class="body"&gt;
&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr class="paste_message message user_1374282" id="message_868364034"&gt;&lt;td class="body"&gt;&lt;div class="body"&gt;
&lt;pre&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Much of the bitbucket UI for signup, create repository, etc is fairly self explanatory. Let's go ahead and &lt;i&gt;create a repository&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
When you've done that successfully, you'll be confronted with a screen:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;I am starting from scratch&lt;/li&gt;
&lt;li&gt;I have code to import&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
Selecting "I have code to import" will give you a number of git commands as examples - to initialize a repository, to add your content, and to add a &lt;i&gt;remote&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
There are two main protocols that git can make use of - https and ssh. The https URLs look like&lt;br /&gt;
&lt;br /&gt;
&lt;table class="chat"&gt;&lt;tbody id="chat"&gt;
&lt;tr class="paste_message message user_1374282" id="message_868364034"&gt;&lt;td class="body"&gt;&lt;div class="body"&gt;
&lt;pre&gt;&lt;code&gt;https://you@bitbucket.org/you/repository_name.git&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;span class="star "&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class="text_message message user_1374282" id="message_868364630"&gt;&lt;td class="body"&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
... and for the moment, are the simplest to understand. If you already know about SSH and SSH keys, use the other protocol.&lt;br /&gt;
&lt;br /&gt;
When you add a &lt;i&gt;remote&lt;/i&gt;, you give it a name - in this case, &lt;i&gt;origin&lt;/i&gt;. This is just a shortcut for the bitbucket server - you can choose any name you like; however there is a widespread convention to use &lt;i&gt;origin&lt;/i&gt;&amp;nbsp;with the main repository.&lt;br /&gt;
&lt;br /&gt;
For windows users,&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Start&lt;/li&gt;
&lt;li&gt;Git Bash - this is much like the windows command line (cmd), with a few different commands.&lt;/li&gt;
&lt;li&gt;Find your existing code - cd /c/path/on/your/hard/disk - note the direction of the slashes!&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
In Git Bash, instead of seeing a prompt like c:\&amp;gt;, the prompt ends in a $.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
To get to your c:\ drive&lt;/div&gt;
&lt;div&gt;
$ cd /c/&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
To get to another path&lt;/div&gt;
&lt;div&gt;
$ cd /c/path/to/location&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
If you aren't sure, you can hit the TAB key repeatedly to autocomplete your filenames or show you a list of suggestions.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Once you have located the right directory with your existing code, we want to initialize a repository&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
$ git init&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Next, add a &lt;i&gt;remote&lt;/i&gt;&amp;nbsp;called &lt;i&gt;origin&lt;/i&gt;&amp;nbsp;pointing at bitbucket.&lt;br /&gt;
$ git remote add origin https://you@bitbucket.org/you/repository_name.git&lt;br /&gt;
&lt;br /&gt;
Tell Git to monitor the files - this is like an svn add.&lt;br /&gt;
$ git add .&lt;br /&gt;
&lt;br /&gt;
To see the affect of git add, do&lt;br /&gt;
$ git status&lt;br /&gt;
&lt;pre&gt;# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached &lt;file&gt;..." to unstage)
#
#       new file:   A.xml
#       new file:   B.java
#       new file:   C.wsdl
#       new file:   D.wsdl
#
you@yourcomputer ~/path/to/local/code (master)&lt;/file&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;/pre&gt;
You can see the code is now being tracked. It wants you to commit.&lt;br /&gt;
&lt;br /&gt;
So, perform your first commit:&lt;br /&gt;
$ git commit -m "Importing my code" -a&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;[master (root-commit) 0bba05d] Importing my code&lt;/pre&gt;
&lt;pre&gt; 4 files changed, 127 insertions(+)&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
All done, right? Not quite. You've made a &lt;i&gt;commit&lt;/i&gt;, but this is only local to your repository. Think of it as the save command in a word document - it doesn't publish anything, but it lets you undo/redo changes.&lt;br /&gt;
From here you can do as many changes and as many commits as you want.&lt;br /&gt;
&lt;br /&gt;
$ git commit -m "fix typo"&lt;br /&gt;
$ git commit -m&amp;nbsp;"remove swearwords"&lt;br /&gt;
&lt;br /&gt;
Also, you probably saw some warnings like:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;*** Please tell me who you are.

Run
&lt;/pre&gt;
&lt;pre&gt;  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"&lt;/pre&gt;
&lt;br /&gt;
It's worth doing this, as each commit is attributed to a user - you'll only have to do this once. Don't worry too much: your commit will still have succeeded.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Anyway, you can check the status again with&lt;br /&gt;
&lt;pre&gt;$ git status
# On branch master
nothing to commit, working directory clean&lt;/pre&gt;
&lt;br /&gt;
It should tell you if there are any untracked files (git add them), or uncommmited files (git commit them) - but ideally, it should look like the above.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To &lt;i&gt;publish&lt;/i&gt;&amp;nbsp;your changes, you need to &lt;i&gt;push&lt;/i&gt;&amp;nbsp;them. For simplicity, we'll also set a default destination (via -u) - the &lt;i&gt;origin remote repository&lt;/i&gt;; &lt;i&gt;master branch&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
$ git push -u origin master&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;Password for 'https://you@bitbucket.org':
Counting objects: 6, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 3.81 KiB, done.
Total 6 (delta 1), reused 0 (delta 0)
remote: bb/acl: you is allowed. accepted payload.
To https://you@bitbucket.org/you/repository_name.git
 * [new branch]      master -&amp;gt; master
Branch master set up to track remote branch master from origin.
you@yourcomputer ~/path/to/code (master)
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
... and check bitbucket.org - your code should be published!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Great - but what just happened? If you look at the diagram, we've done everything on the left hand side - have a &lt;i&gt;local&lt;/i&gt;, have a &lt;i&gt;remote&lt;/i&gt;, and &lt;i&gt;pushed changes&lt;/i&gt;. It's now possible for someone else to &lt;i&gt;clone&lt;/i&gt;&amp;nbsp;your repo, or &lt;i&gt;fork &lt;/i&gt;it, and &lt;i&gt;pull changes&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
You can see that there can be&lt;i&gt;&amp;nbsp;many &lt;/i&gt;repositories - sometimes teams will maintain a 'core' repo, and people on the outside take a 'fork'.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-O0OTjut7bAw/UXau2RUIGFI/AAAAAAAAEWM/OaFIXWdT-MQ/s1600/what.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="158" src="http://1.bp.blogspot.com/-O0OTjut7bAw/UXau2RUIGFI/AAAAAAAAEWM/OaFIXWdT-MQ/s320/what.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/GHCgp/~4/gcSiegdC-Rk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://clockwerx.blogspot.com/feeds/2771599231327564827/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9088824&amp;postID=2771599231327564827" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9088824/posts/default/2771599231327564827?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9088824/posts/default/2771599231327564827?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/GHCgp/~3/gcSiegdC-Rk/a-first-time-using-git-with-bitbucket.html" title="A first time using Git, with Bitbucket - add existing code." /><author><name>Daniel O'Connor</name><uri>https://plus.google.com/114910530124691879879</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-4ol1KKoueXA/AAAAAAAAAAI/AAAAAAAADUM/t9FtFRD-SzU/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-O0OTjut7bAw/UXau2RUIGFI/AAAAAAAAEWM/OaFIXWdT-MQ/s72-c/what.png" height="72" width="72" /><thr:total>3</thr:total><feedburner:origLink>http://clockwerx.blogspot.com/2013/04/a-first-time-using-git-with-bitbucket.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkQBQXs-eSp7ImA9WhBWEkk.&quot;"><id>tag:blogger.com,1999:blog-9088824.post-872062751652358614</id><published>2013-04-06T22:09:00.000+10:30</published><updated>2013-04-06T22:09:10.551+10:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-04-06T22:09:10.551+10:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="valuation" /><category scheme="http://www.blogger.com/atom/ns#" term="data capture" /><category scheme="http://www.blogger.com/atom/ns#" term="openstreetmap" /><category scheme="http://www.blogger.com/atom/ns#" term="open data" /><title>New OpenStreetMap Editor available.</title><content type="html">&lt;a href="http://ideditor.com/"&gt;http://ideditor.com/&lt;/a&gt;&amp;nbsp;is pretty neat - it's a bit slower than potlatch, but try tracing the roof of a house.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here's the &lt;a href="http://mapbox.com/blog/techzulu-talks-future-of-mapping-with-mapbox"&gt;full blog post&lt;/a&gt;. It certainly looks like the kind of editor you want for any kind of property data capture - imagine doing a kerbside valuation and pulling this up on an ipad to explore / add data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/GHCgp/~4/UdX-UBUzz3U" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://clockwerx.blogspot.com/feeds/872062751652358614/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9088824&amp;postID=872062751652358614" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9088824/posts/default/872062751652358614?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9088824/posts/default/872062751652358614?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/GHCgp/~3/UdX-UBUzz3U/new-openstreetmap-editor-available.html" title="New OpenStreetMap Editor available." /><author><name>Daniel O'Connor</name><uri>https://plus.google.com/114910530124691879879</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-4ol1KKoueXA/AAAAAAAAAAI/AAAAAAAADUM/t9FtFRD-SzU/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://clockwerx.blogspot.com/2013/04/new-openstreetmap-editor-available.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D08EQXo8fip7ImA9WhBXE04.&quot;"><id>tag:blogger.com,1999:blog-9088824.post-5267751488565340560</id><published>2013-03-27T08:40:00.001+10:30</published><updated>2013-03-27T08:40:00.476+10:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-03-27T08:40:00.476+10:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Testing" /><category scheme="http://www.blogger.com/atom/ns#" term="adelaide metro" /><category scheme="http://www.blogger.com/atom/ns#" term="adelaide" /><category scheme="http://www.blogger.com/atom/ns#" term="transport" /><title>Bugs and annoyances with the Adelaide Metro Card Site</title><content type="html">&lt;p&gt;1. You cannot mark a card as lost or consolidate balances. I am now on my third card.&lt;/p&gt;
&lt;p&gt;2. Add one item to the cart, it redirects you to the list view. Add a duplicate due to a spotty connection - say... found on a bus in motion - it silently redirects you to the referring page but still adds the item.&lt;/p&gt;
&lt;p&gt;3. The site will charge you for multiple things which are identical.&lt;/p&gt;
&lt;p&gt;4. Deleting an item from the cart results in a 'temporarily unavailable' action, and does not remove content from your card.&lt;/p&gt;
&lt;p&gt;5. It is so painful to complete the act of purchasing, that I am twenty minutes in to the process. A bus driver laughed when I suggested I could recharge my expired card and reswipe it.&lt;br&gt;&lt;/p&gt;
&lt;p&gt;It seems like a fairly obvious set of things to cover during testing. I cant understand how a simple cart + cc gateway can take so long (Nov 2012 to now) and be so buggy.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/blogspot/GHCgp/~4/1CY-uMqGn_c" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://clockwerx.blogspot.com/feeds/5267751488565340560/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9088824&amp;postID=5267751488565340560" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9088824/posts/default/5267751488565340560?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9088824/posts/default/5267751488565340560?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/GHCgp/~3/1CY-uMqGn_c/bugs-and-annoyances-with-adelaide-metro.html" title="Bugs and annoyances with the Adelaide Metro Card Site" /><author><name>Daniel O'Connor</name><uri>https://plus.google.com/114910530124691879879</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-4ol1KKoueXA/AAAAAAAAAAI/AAAAAAAADUM/t9FtFRD-SzU/s512-c/photo.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://clockwerx.blogspot.com/2013/03/bugs-and-annoyances-with-adelaide-metro.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck8NRXk_eCp7ImA9WhBQGE8.&quot;"><id>tag:blogger.com,1999:blog-9088824.post-8465991615312118183</id><published>2013-03-21T09:38:00.000+10:30</published><updated>2013-03-21T09:38:14.740+10:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-03-21T09:38:14.740+10:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="savon" /><category scheme="http://www.blogger.com/atom/ns#" term="rails" /><category scheme="http://www.blogger.com/atom/ns#" term="ssrs" /><category scheme="http://www.blogger.com/atom/ns#" term="soa" /><title>Consuming SOAP services with Ruby / Rails</title><content type="html">Savon is a ruby soap library, and I mostly like it. I've been using&amp;nbsp;&lt;a href="http://savonrb.com/version2.html"&gt;the latest Savon&lt;/a&gt;&amp;nbsp;to do integrations with SSRS at work.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Getting started&lt;/b&gt;&lt;br /&gt;
As practical advice, I strongly recommend you go and find a decent pre-built SOAP IDE. I've used XMLSpy and Oxygen before, which have a slightly wider focus than just pure SOAP; but in recent times I've come to like SoapUI quite a lot.&lt;br /&gt;
&lt;br /&gt;
Compared to other tools, it will:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Take a WSDL&lt;/li&gt;
&lt;li&gt;Generate a sample request for each action&lt;/li&gt;
&lt;li&gt;Generate code for you in you happen to be writing in Java - and stub services&lt;/li&gt;
&lt;li&gt;Allow you to easily set different endpoints (ie: prod, staging, dev) without stuffing around with WSDLs.&lt;/li&gt;
&lt;li&gt;Allow you to develop a number of premade requests which will return expected responses.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
In short, it's a heck of a tool with a low price point: free.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;SSRS&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
If you aren't developing in C# or similar, MSDN isn't very helpful. Not having had to... enjoy... windows servers for some time, I found a lot of time was spent:&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Working out if I was authenticating correctly (browser to web UI, browser to WSDL, SOAP UI to WSDL, SOAP UI to SOAP Action, Actual Code to Soap Action)&lt;/li&gt;
&lt;li&gt;Blundering around looking for configuration files in a file manager, instead of using google to find a likely file path and using vim until success was achieved.&lt;/li&gt;
&lt;li&gt;Finding all kinds of Authentication that &lt;i&gt;should&lt;/i&gt;&amp;nbsp;work, simply don't. In the end, if the SOAP MSDN articles had simply pointed me to&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/cc281309.aspx"&gt;Configure Basic Authentication on the Report Server&lt;/a&gt;, I think I have achieved more.&lt;/li&gt;
&lt;li&gt;Discovering the docs were incorrect re what WSDLs were actually available vs what the server published, and what worked vs the configuration of 'Native Mode'.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;br /&gt;
Once you get over the successive hurdles of Auth, identifying the correct service, and guessing that &lt;i&gt;ListChildren&lt;/i&gt;&amp;nbsp;is the method you want to get a list of reports, it's fairly straight forward.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Gotchas with Savon&lt;/b&gt;&lt;br /&gt;
A few of the soap calls wanted specific soap headers. Savon only supports global soap headers, and once you've built the object it's hard to mutate it.&lt;br /&gt;
&lt;br /&gt;
Tips:&lt;br /&gt;
1) To get more control, ditch the &lt;i&gt;Savon::client()&lt;/i&gt; factory method - it's not really doing too much you can't do yourself.&lt;br /&gt;
&lt;a href="https://github.com/savonrb/savon/blob/master/lib/savon.rb"&gt;https://github.com/savonrb/savon/blob/master/lib/savon.rb&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
2) If you need to monkey with the global options, you can often extend your client to make them accessible.&lt;br /&gt;
&lt;a href="https://github.com/savonrb/savon/blob/master/lib/savon/client.rb"&gt;https://github.com/savonrb/savon/blob/master/lib/savon/client.rb&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
class ExtendedSoapClient &amp;lt; Savon::Client&lt;br /&gt;
&amp;nbsp; &amp;nbsp;attr_writable :globals&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
3) It's worth stealing from Javaland in most cases - for each configured Savon Client, do up a quick &lt;i&gt;FooServiceProxy. &lt;/i&gt;Inject your client into the constructor, and for all of the management of WSDLs, go stick that in your environment config.&lt;br /&gt;
If needed, go build yourself a SSRSServiceFactory to handle all of this wiring up.&lt;br /&gt;
&lt;br /&gt;
The primary advantage - you get a reasonably clean API that can return either hashes, or if you go a little further you can generate models for the SOAP responses and have those appropriately populated.&lt;br /&gt;
&lt;br /&gt;
It's important to remember these proxy classes exist &lt;i&gt;only to translate a SOAP request from your code, to the transport layer, and to return a simple, meaningful result to your code&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
That means avoiding a lot of logic in favour of making an API explicit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/GHCgp/~4/6S4-EZyalNY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://clockwerx.blogspot.com/feeds/8465991615312118183/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9088824&amp;postID=8465991615312118183" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9088824/posts/default/8465991615312118183?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9088824/posts/default/8465991615312118183?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/GHCgp/~3/6S4-EZyalNY/consuming-soap-services-with-ruby-rails.html" title="Consuming SOAP services with Ruby / Rails" /><author><name>Daniel O'Connor</name><uri>https://plus.google.com/114910530124691879879</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-4ol1KKoueXA/AAAAAAAAAAI/AAAAAAAADUM/t9FtFRD-SzU/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://clockwerx.blogspot.com/2013/03/consuming-soap-services-with-ruby-rails.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck8ARHY_eip7ImA9WhBQGE8.&quot;"><id>tag:blogger.com,1999:blog-9088824.post-1230321817744893520</id><published>2013-03-21T09:37:00.001+10:30</published><updated>2013-03-21T09:37:25.842+10:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-03-21T09:37:25.842+10:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="tutorial" /><title>My recommended pathway into Ruby / Rails</title><content type="html">&lt;br /&gt;
I was asked what I'd encourage a complete outsider to RoR to look into.&lt;br /&gt;
&lt;br /&gt;
Here's my list - what would you add?&lt;br /&gt;
&lt;br /&gt;
- Linux intro&lt;br /&gt;
&amp;nbsp; - User accounts&lt;br /&gt;
&amp;nbsp; - File permissions&lt;br /&gt;
&amp;nbsp; - su / sudo&lt;br /&gt;
&amp;nbsp; - Installing programs (apt)&lt;br /&gt;
&amp;nbsp; - What's a distro? (Ubuntu, Debian, etc)&lt;br /&gt;
&amp;nbsp; - Gnome desktop&lt;br /&gt;
&amp;nbsp; &amp;nbsp; - Alternatives&lt;br /&gt;
&amp;nbsp; - Bourne Again SHell (BASH)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; - cd, ls, touch, vim, top, kill, pgrep, pkill, mkdir, chmod, chown&lt;br /&gt;
&amp;nbsp; - Basic bash scripts&lt;br /&gt;
- Git intro&lt;br /&gt;
&amp;nbsp; - Cloning&lt;br /&gt;
&amp;nbsp; - Commits&lt;br /&gt;
&amp;nbsp; - Log&lt;br /&gt;
&amp;nbsp; - Push&lt;br /&gt;
&amp;nbsp; - Pull&lt;br /&gt;
&amp;nbsp; - Fetch, Merge&lt;br /&gt;
&amp;nbsp; - Branches&lt;br /&gt;
&amp;nbsp; - Tags&lt;br /&gt;
&amp;nbsp; - Revert&lt;br /&gt;
&amp;nbsp; - Reset&lt;br /&gt;
- Ruby intro&lt;br /&gt;
&amp;nbsp; - Hello world&lt;br /&gt;
&amp;nbsp; - Functions, Control flow, Loops&lt;br /&gt;
&amp;nbsp; - Classes&lt;br /&gt;
&amp;nbsp; - Modules&lt;br /&gt;
&amp;nbsp; - Blocks! Lambas! Currying!&lt;br /&gt;
&amp;nbsp; &amp;nbsp; - Chunky Bacon and Foxes!&lt;br /&gt;
&amp;nbsp; - DSLs&lt;br /&gt;
&amp;nbsp; - Libraries (gems)&lt;br /&gt;
&amp;nbsp; - Require / include path&lt;br /&gt;
&amp;nbsp; - Metaprogramming&lt;br /&gt;
&amp;nbsp; - OOP Intro&lt;br /&gt;
&amp;nbsp; - OOP: SOLID principles&lt;br /&gt;
&amp;nbsp; - OOP: TDD&lt;br /&gt;
- HTML intro&lt;br /&gt;
&amp;nbsp; - HTML5&lt;br /&gt;
&amp;nbsp; &amp;nbsp; - what is it?&lt;br /&gt;
&amp;nbsp; &amp;nbsp; - differences to HTML4/xhtml?&lt;br /&gt;
&amp;nbsp; &amp;nbsp; - Data attributes&lt;br /&gt;
&amp;nbsp; &amp;nbsp; - New inputs&lt;br /&gt;
&amp;nbsp; - Javascript basics&lt;br /&gt;
&amp;nbsp; &amp;nbsp; - JQuery&lt;br /&gt;
&amp;nbsp; &amp;nbsp; - AJAX&lt;br /&gt;
&amp;nbsp; &amp;nbsp; - Backbone, Ember, etc&lt;br /&gt;
&amp;nbsp; &amp;nbsp; - D3&lt;br /&gt;
&amp;nbsp; - CSS basics&lt;br /&gt;
&amp;nbsp; &amp;nbsp; - CSS3&lt;br /&gt;
&amp;nbsp; &amp;nbsp; - Responsive design&lt;br /&gt;
&amp;nbsp; - SVG basics&lt;br /&gt;
- JSON! YAML! Data structures &amp;amp; serializations.&lt;br /&gt;
- Rails intro&lt;br /&gt;
&amp;nbsp; - Generators&lt;br /&gt;
&amp;nbsp; - Rake&lt;br /&gt;
&amp;nbsp; - Organisation&lt;br /&gt;
&amp;nbsp; - Scaffolds&lt;br /&gt;
&amp;nbsp; - Convention, not configuration&lt;br /&gt;
&amp;nbsp; - Rspec&lt;br /&gt;
- Sinatra intro&lt;br /&gt;
- SASS / Less&lt;br /&gt;
&amp;nbsp; - What is it?&lt;br /&gt;
&amp;nbsp; - Bootstrap/Compass&lt;br /&gt;
- Continuous Integration&lt;br /&gt;
&amp;nbsp; - Jenkins&lt;br /&gt;
&amp;nbsp; - Travis CI&lt;br /&gt;
&amp;nbsp; - Post commit hooks&lt;br /&gt;
&amp;nbsp; - Rake tasks&lt;br /&gt;
- DevOps!&lt;br /&gt;
&amp;nbsp; - Chef&lt;br /&gt;
&amp;nbsp; - Puppet&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/blogspot/GHCgp/~4/G4kBs6OrvdQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://clockwerx.blogspot.com/feeds/1230321817744893520/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9088824&amp;postID=1230321817744893520" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9088824/posts/default/1230321817744893520?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9088824/posts/default/1230321817744893520?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/GHCgp/~3/G4kBs6OrvdQ/my-recommended-pathway-into-ruby-rails.html" title="My recommended pathway into Ruby / Rails" /><author><name>Daniel O'Connor</name><uri>https://plus.google.com/114910530124691879879</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-4ol1KKoueXA/AAAAAAAAAAI/AAAAAAAADUM/t9FtFRD-SzU/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://clockwerx.blogspot.com/2013/03/my-recommended-pathway-into-ruby-rails.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE4BRHw4eyp7ImA9WhBREE8.&quot;"><id>tag:blogger.com,1999:blog-9088824.post-7041515416056870020</id><published>2013-02-28T14:12:00.002+10:30</published><updated>2013-02-28T14:12:35.233+10:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-02-28T14:12:35.233+10:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="meetup" /><title>Adelaide Ruby Hack Day</title><content type="html">There's an effort to pull together a &lt;a href="https://groups.google.com/d/topic/adelaiderug/QopVSxVpnCg/discussion"&gt;Ruby Hack Day&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;span style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: 13px;"&gt;We're aiming to start up an open coding session on the Saturday following the monthly meetups. The main goal is to complement the presentations with a more hands on component in which some of the more experienced guys can make themselves available to help out newbies working their way into the Ruby / Rails world.&amp;nbsp;&lt;/span&gt;&lt;br style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: 13px;" /&gt;&lt;span style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: 13px;"&gt;The guys at the Majoran Distillery have been fantastic and offered to host this, so we've locked in the first one for the&amp;nbsp;&lt;/span&gt;&lt;b style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: 13px;"&gt;9th of March from 10am-1pm.&amp;nbsp;&lt;/b&gt;&lt;/blockquote&gt;
&lt;b style="background-color: white; color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: 13px;"&gt;&lt;br /&gt;&lt;/b&gt;
I'd like to go, but have travel planned.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/GHCgp/~4/LSkr9vTVm88" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://clockwerx.blogspot.com/feeds/7041515416056870020/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9088824&amp;postID=7041515416056870020" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9088824/posts/default/7041515416056870020?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9088824/posts/default/7041515416056870020?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/GHCgp/~3/LSkr9vTVm88/adelaide-ruby-hack-day.html" title="Adelaide Ruby Hack Day" /><author><name>Daniel O'Connor</name><uri>https://plus.google.com/114910530124691879879</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-4ol1KKoueXA/AAAAAAAAAAI/AAAAAAAADUM/t9FtFRD-SzU/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://clockwerx.blogspot.com/2013/02/adelaide-ruby-hack-day.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0cBQHc5eSp7ImA9WhBREE0.&quot;"><id>tag:blogger.com,1999:blog-9088824.post-6584065504296496401</id><published>2013-02-28T09:14:00.000+10:30</published><updated>2013-02-28T09:14:11.921+10:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-02-28T09:14:11.921+10:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="Active record pattern" /><category scheme="http://www.blogger.com/atom/ns#" term="unit testing" /><category scheme="http://www.blogger.com/atom/ns#" term="Business logic" /><title>A decent article on what tends to upset me about rails</title><content type="html">From&amp;nbsp;&lt;a href="http://collectiveidea.com/blog/archives/2012/06/28/wheres-your-business-logic/"&gt;http://collectiveidea.com/blog/archives/2012/06/28/wheres-your-business-logic/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;span style="background-color: rgba(0, 0, 0, 0.74902); color: #f1f1f1; font-family: 'Helvetica Neue', helvetica, arial, sans-serif; font-size: 13px; line-height: 22px;"&gt;&amp;nbsp;I put some of the blame on Rails itself, which has guided developers to use Controllers, Models, or Libraries, and nothing else.&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;
and&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;span style="background-color: rgba(0, 0, 0, 0.74902); color: #f1f1f1; font-family: 'Helvetica Neue', helvetica, arial, sans-serif; font-size: 13px; line-height: 22px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: rgba(0, 0, 0, 0.74902); color: #f1f1f1; font-family: 'Helvetica Neue', helvetica, arial, sans-serif; font-size: 13px; line-height: 22px;"&gt;Are your tests slow (&amp;gt;1s to run a single unit test)? Do your tests have large ungainly setup? Are you using factory_girl in your unit tests? Are you mocking implementation instead of interfaces?&lt;/span&gt;&amp;nbsp;&lt;/blockquote&gt;
&lt;br /&gt;
I'm only really into my 3rd or 4th rails application of appreciable size, and they all seem to have this kind of problem - the tight coupling of active record to the model, and the model mixing persistence with business logic is rampart.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;span style="background-color: rgba(0, 0, 0, 0.74902); color: #f1f1f1; font-family: 'Helvetica Neue', helvetica, arial, sans-serif; font-size: 13px; line-height: 22px;"&gt;Enter the Interactor. An Interactor handles a use case. It pulls together the models and libraries it needs to process a single business rule, and then it’s done. These objects are very easy to test and use and in proper OO fashion can be used anywhere the app needs to apply the use case or business rule.&lt;/span&gt;&lt;/blockquote&gt;
I dont think you need to call it an Interactor, it's just a Model. Not the relational-persistance kind, but the Model of your business logic - expressly applying SRP.&lt;br /&gt;
&lt;br /&gt;


&lt;div class="zemanta-pixie"&gt;
&lt;a class="zemanta-pixie-a" href="http://www.zemanta.com/?px" title="Enhanced by Zemanta"&gt;&lt;img alt="Enhanced by Zemanta" class="zemanta-pixie-img" src="http://img.zemanta.com/zemified_e.png?x-id=3de0c276-f8d2-4f09-8d07-1ac0e8bb25a2" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/blogspot/GHCgp/~4/DdNOqv0mXXQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://clockwerx.blogspot.com/feeds/6584065504296496401/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9088824&amp;postID=6584065504296496401" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9088824/posts/default/6584065504296496401?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9088824/posts/default/6584065504296496401?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/GHCgp/~3/DdNOqv0mXXQ/a-decent-article-on-what-tends-to-upset.html" title="A decent article on what tends to upset me about rails" /><author><name>Daniel O'Connor</name><uri>https://plus.google.com/114910530124691879879</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-4ol1KKoueXA/AAAAAAAAAAI/AAAAAAAADUM/t9FtFRD-SzU/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://clockwerx.blogspot.com/2013/02/a-decent-article-on-what-tends-to-upset.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0ANSX08fyp7ImA9WhBSGE4.&quot;"><id>tag:blogger.com,1999:blog-9088824.post-6973835078203456922</id><published>2013-02-26T10:13:00.001+10:30</published><updated>2013-02-26T10:13:18.377+10:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-02-26T10:13:18.377+10:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="functional programming" /><title>Ruby, Currying</title><content type="html">One of the better, clearer&amp;nbsp;explanations&amp;nbsp;of currying.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://khelll.com/blog/ruby/ruby-currying/"&gt;http://khelll.com/blog/ruby/ruby-currying/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Obviously useful for math, or scenarios where you inject your own lambdas (ie: sorting).&lt;img src="http://feeds.feedburner.com/~r/blogspot/GHCgp/~4/op3DzcCUmmY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://clockwerx.blogspot.com/feeds/6973835078203456922/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9088824&amp;postID=6973835078203456922" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9088824/posts/default/6973835078203456922?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9088824/posts/default/6973835078203456922?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/GHCgp/~3/op3DzcCUmmY/ruby-currying.html" title="Ruby, Currying" /><author><name>Daniel O'Connor</name><uri>https://plus.google.com/114910530124691879879</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-4ol1KKoueXA/AAAAAAAAAAI/AAAAAAAADUM/t9FtFRD-SzU/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://clockwerx.blogspot.com/2013/02/ruby-currying.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEAGQ3w-eCp7ImA9WhBSF0s.&quot;"><id>tag:blogger.com,1999:blog-9088824.post-4098538354823000703</id><published>2013-02-25T13:55:00.002+10:30</published><updated>2013-02-25T13:55:22.250+10:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-02-25T13:55:22.250+10:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="Programming" /><title>Keyword arguments.</title><content type="html">Thank god.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="line" style="border: 0px; color: #93a1a1; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-size: 13px; line-height: 18.84375px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: pre;"&gt;&lt;span class="c1" style="border: 0px; color: rgb(88, 110, 117) !important; font-family: inherit; font-style: italic !important; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;# Ruby 1.9:&lt;/span&gt;
&lt;/span&gt;&lt;span class="line" style="border: 0px; color: #93a1a1; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-size: 13px; line-height: 18.84375px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: pre;"&gt;  &lt;span class="c1" style="border: 0px; color: rgb(88, 110, 117) !important; font-family: inherit; font-style: italic !important; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;# (From action_view/helpers/text_helper.rb)&lt;/span&gt;
&lt;/span&gt;&lt;span class="line" style="border: 0px; color: #93a1a1; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-size: 13px; line-height: 18.84375px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: pre;"&gt;&lt;span class="k" style="border: 0px; color: rgb(203, 75, 22) !important; font-family: inherit; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;def&lt;/span&gt; &lt;span class="nf" style="border: 0px; color: rgb(38, 139, 210) !important; font-family: inherit; font-variant: inherit; font-weight: bold !important; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;cycle&lt;/span&gt;&lt;span class="p" style="border: 0px; font-family: inherit; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;(&lt;/span&gt;&lt;span class="n" style="border: 0px; color: rgb(38, 139, 210) !important; font-family: inherit; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;first_value&lt;/span&gt;&lt;span class="p" style="border: 0px; font-family: inherit; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;,&lt;/span&gt; &lt;span class="o" style="border: 0px; font-family: inherit; font-variant: inherit; font-weight: bold !important; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;*&lt;/span&gt;&lt;span class="n" style="border: 0px; color: rgb(38, 139, 210) !important; font-family: inherit; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;values&lt;/span&gt;&lt;span class="p" style="border: 0px; font-family: inherit; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class="line" style="border: 0px; color: #93a1a1; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-size: 13px; line-height: 18.84375px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: pre;"&gt;  &lt;span class="n" style="border: 0px; color: rgb(38, 139, 210) !important; font-family: inherit; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;options&lt;/span&gt; &lt;span class="o" style="border: 0px; font-family: inherit; font-variant: inherit; font-weight: bold !important; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;=&lt;/span&gt; &lt;span class="n" style="border: 0px; color: rgb(38, 139, 210) !important; font-family: inherit; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;values&lt;/span&gt;&lt;span class="o" style="border: 0px; font-family: inherit; font-variant: inherit; font-weight: bold !important; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;span class="n" style="border: 0px; color: rgb(38, 139, 210) !important; font-family: inherit; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;extract_options!&lt;/span&gt;
&lt;/span&gt;&lt;span class="line" style="border: 0px; color: #93a1a1; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-size: 13px; line-height: 18.84375px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: pre;"&gt;  &lt;span class="nb" style="border: 0px; color: rgb(133, 153, 0) !important; font-family: inherit; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;name&lt;/span&gt; &lt;span class="o" style="border: 0px; font-family: inherit; font-variant: inherit; font-weight: bold !important; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;=&lt;/span&gt; &lt;span class="n" style="border: 0px; color: rgb(38, 139, 210) !important; font-family: inherit; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;options&lt;/span&gt;&lt;span class="o" style="border: 0px; font-family: inherit; font-variant: inherit; font-weight: bold !important; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;.&lt;/span&gt;&lt;span class="n" style="border: 0px; color: rgb(38, 139, 210) !important; font-family: inherit; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;fetch&lt;/span&gt;&lt;span class="p" style="border: 0px; font-family: inherit; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;(&lt;/span&gt;&lt;span class="ss" style="border: 0px; font-family: inherit; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;:name&lt;/span&gt;&lt;span class="p" style="border: 0px; font-family: inherit; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;,&lt;/span&gt; &lt;span class="s1" style="border: 0px; color: rgb(42, 161, 152) !important; font-family: inherit; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;'default'&lt;/span&gt;&lt;span class="p" style="border: 0px; font-family: inherit; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class="line" style="border: 0px; color: #93a1a1; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-size: 13px; line-height: 18.84375px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: pre;"&gt;  &lt;span class="c1" style="border: 0px; color: rgb(88, 110, 117) !important; font-family: inherit; font-style: italic !important; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;# ...&lt;/span&gt;
&lt;/span&gt;&lt;span class="line" style="border: 0px; color: #93a1a1; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-size: 13px; line-height: 18.84375px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: pre;"&gt;&lt;span class="k" style="border: 0px; color: rgb(203, 75, 22) !important; font-family: inherit; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class="line" style="border: 0px; color: #93a1a1; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-size: 13px; line-height: 18.84375px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: pre;"&gt;
&lt;/span&gt;&lt;span class="line" style="border: 0px; color: #93a1a1; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-size: 13px; line-height: 18.84375px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: pre;"&gt;&lt;span class="c1" style="border: 0px; color: rgb(88, 110, 117) !important; font-family: inherit; font-style: italic !important; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;# Ruby 2.0:&lt;/span&gt;
&lt;/span&gt;&lt;span class="line" style="border: 0px; color: #93a1a1; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-size: 13px; line-height: 18.84375px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: pre;"&gt;&lt;span class="k" style="border: 0px; color: rgb(203, 75, 22) !important; font-family: inherit; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;def&lt;/span&gt; &lt;span class="nf" style="border: 0px; color: rgb(38, 139, 210) !important; font-family: inherit; font-variant: inherit; font-weight: bold !important; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;cycle&lt;/span&gt;&lt;span class="p" style="border: 0px; font-family: inherit; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;(&lt;/span&gt;&lt;span class="n" style="border: 0px; color: rgb(38, 139, 210) !important; font-family: inherit; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;first_value&lt;/span&gt;&lt;span class="p" style="border: 0px; font-family: inherit; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;,&lt;/span&gt; &lt;span class="o" style="border: 0px; font-family: inherit; font-variant: inherit; font-weight: bold !important; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;*&lt;/span&gt;&lt;span class="n" style="border: 0px; color: rgb(38, 139, 210) !important; font-family: inherit; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;values&lt;/span&gt;&lt;span class="p" style="border: 0px; font-family: inherit; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;,&lt;/span&gt; &lt;span class="nb" style="border: 0px; color: rgb(133, 153, 0) !important; font-family: inherit; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;name&lt;/span&gt;&lt;span class="p" style="border: 0px; font-family: inherit; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;:&lt;/span&gt; &lt;span class="s1" style="border: 0px; color: rgb(42, 161, 152) !important; font-family: inherit; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;'default'&lt;/span&gt;&lt;span class="p" style="border: 0px; font-family: inherit; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class="line" style="border: 0px; color: #93a1a1; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-size: 13px; line-height: 18.84375px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: pre;"&gt;  &lt;span class="c1" style="border: 0px; color: rgb(88, 110, 117) !important; font-family: inherit; font-style: italic !important; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;# ...&lt;/span&gt;
&lt;/span&gt;&lt;span class="line" style="border: 0px; color: #93a1a1; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-size: 13px; line-height: 18.84375px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: pre;"&gt;&lt;span class="k" style="border: 0px; color: rgb(203, 75, 22) !important; font-family: inherit; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
More&amp;nbsp;&lt;complete id="goog_72798891"&gt;@&amp;nbsp;&lt;/complete&gt;&lt;a href="http://blog.marc-andre.ca/2013/02/23/ruby-2-by-example/"&gt;http://blog.marc-andre.ca/2013/02/23/ruby-2-by-example/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="zemanta-related"&gt;
&lt;h6 class="zemanta-related-title"&gt;
Related articles&lt;/h6&gt;
&lt;a href="http://www.ruby-lang.org/en/news/2013/02/24/ruby-2-0-0-p0-is-released/" target="_blank"&gt;Ruby 2.0.0-p0 is released&lt;/a&gt;(ruby-lang.org)&lt;br /&gt;
&lt;div&gt;
&lt;hr /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="zemanta-pixie"&gt;
&lt;a class="zemanta-pixie-a" href="http://www.zemanta.com/?px" title="Enhanced by Zemanta"&gt;&lt;img alt="Enhanced by Zemanta" class="zemanta-pixie-img" src="http://img.zemanta.com/zemified_e.png?x-id=6d50876e-b1f5-4bf2-9d08-b6987310d1ca" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/blogspot/GHCgp/~4/jdoAS5OCtA8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://clockwerx.blogspot.com/feeds/4098538354823000703/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9088824&amp;postID=4098538354823000703" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9088824/posts/default/4098538354823000703?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9088824/posts/default/4098538354823000703?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/GHCgp/~3/jdoAS5OCtA8/keyword-arguments.html" title="Keyword arguments." /><author><name>Daniel O'Connor</name><uri>https://plus.google.com/114910530124691879879</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-4ol1KKoueXA/AAAAAAAAAAI/AAAAAAAADUM/t9FtFRD-SzU/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://clockwerx.blogspot.com/2013/02/keyword-arguments.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkQCSXw_fCp7ImA9WhBSGUk.&quot;"><id>tag:blogger.com,1999:blog-9088824.post-2401092018489517157</id><published>2013-02-19T12:54:00.000+10:30</published><updated>2013-02-27T17:29:28.244+10:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-02-27T17:29:28.244+10:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><title>Tree structures in relational data stores</title><content type="html">&lt;p&gt;&lt;a href="http://fungus.teststation.com/~jon/treehandling/TreeHandling.htm"&gt;http://fungus.teststation.com/~jon/treehandling/TreeHandling.htm&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Handy to read, as it lets you run queries over collections when tree relationships dont matter as much. IE cascading security or calculating totals.&lt;br&gt;
&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/blogspot/GHCgp/~4/COdR90M2thA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://clockwerx.blogspot.com/feeds/2401092018489517157/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9088824&amp;postID=2401092018489517157" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9088824/posts/default/2401092018489517157?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9088824/posts/default/2401092018489517157?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/GHCgp/~3/COdR90M2thA/tree-structures-in-relational-data.html" title="Tree structures in relational data stores" /><author><name>Daniel O'Connor</name><uri>https://plus.google.com/114910530124691879879</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-4ol1KKoueXA/AAAAAAAAAAI/AAAAAAAADUM/t9FtFRD-SzU/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://clockwerx.blogspot.com/2013/02/tree-structures-in-relational-data.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0AGRXszfSp7ImA9WhBTEE4.&quot;"><id>tag:blogger.com,1999:blog-9088824.post-8149462310948300938</id><published>2013-02-05T14:12:00.000+10:30</published><updated>2013-02-05T14:12:04.585+10:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-02-05T14:12:04.585+10:30</app:edited><title>Hurray for modern javascript!</title><content type="html">[1, 2, 3].foreach(function(i) { alert(i); });&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/forEach"&gt;https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/forEach&lt;/a&gt;&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/blogspot/GHCgp/~4/OIU8ohnPyxM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://clockwerx.blogspot.com/feeds/8149462310948300938/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9088824&amp;postID=8149462310948300938" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9088824/posts/default/8149462310948300938?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9088824/posts/default/8149462310948300938?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/GHCgp/~3/OIU8ohnPyxM/hurray-for-modern-javascript.html" title="Hurray for modern javascript!" /><author><name>Daniel O'Connor</name><uri>https://plus.google.com/114910530124691879879</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-4ol1KKoueXA/AAAAAAAAAAI/AAAAAAAADUM/t9FtFRD-SzU/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://clockwerx.blogspot.com/2013/02/hurray-for-modern-javascript.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEQGQX05fip7ImA9WhNaGUU.&quot;"><id>tag:blogger.com,1999:blog-9088824.post-5334743000608376865</id><published>2013-02-05T00:28:00.001+10:30</published><updated>2013-02-05T00:28:40.326+10:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-02-05T00:28:40.326+10:30</app:edited><title>So. Much. Yes.</title><content type="html">&lt;a href="http://mattsears.com/articles/2011/11/16/nyan-cat-rspec-formatter"&gt;http://mattsears.com/articles/2011/11/16/nyan-cat-rspec-formatter&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/GHCgp/~4/9QHBSYF60RM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://clockwerx.blogspot.com/feeds/5334743000608376865/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9088824&amp;postID=5334743000608376865" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9088824/posts/default/5334743000608376865?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9088824/posts/default/5334743000608376865?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/GHCgp/~3/9QHBSYF60RM/so-much-yes.html" title="So. Much. Yes." /><author><name>Daniel O'Connor</name><uri>https://plus.google.com/114910530124691879879</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-4ol1KKoueXA/AAAAAAAAAAI/AAAAAAAADUM/t9FtFRD-SzU/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://clockwerx.blogspot.com/2013/02/so-much-yes.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0IHSXkzfCp7ImA9WhBTF0w.&quot;"><id>tag:blogger.com,1999:blog-9088824.post-8788269302725502209</id><published>2013-02-01T10:02:00.001+10:30</published><updated>2013-02-13T11:02:18.784+10:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-02-13T11:02:18.784+10:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="rant" /><category scheme="http://www.blogger.com/atom/ns#" term="capistrano" /><title>Capistrano frustrates me</title><content type="html">&lt;br /&gt;
Here's why:&lt;br /&gt;
&lt;br /&gt;
1) It defines its own class path. If you want to load a customised extension, good luck - it is seemingly unaware of gems you add via bundle; pointing at a git repository&lt;br /&gt;
&lt;br /&gt;
2) Task definition and execution are not separated. require is replaced with load - and load means "load and run".&lt;br /&gt;
&lt;br /&gt;
For example - https://github.com/capistrano/capistrano/blob/master/lib/capistrano/recipes/deploy/assets.rb&lt;br /&gt;
You cannot "just" load the code and do something like compile assets locally by drawing on commands generated by someone else.&lt;br /&gt;
&lt;br /&gt;
3) The methods defined are too rigid. I would refactor every capistrano recipe out there into behaving in two ways. First, there's a lot of methods that generate commands to be run. Second, there's business logic which decides where those commands should be run.&lt;br /&gt;
&lt;br /&gt;
Looking at the recipe above:&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; task :clean, :roles =&amp;gt; assets_role, :except =&amp;gt; { :no_release =&amp;gt; true } do&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; run "cd #{latest_release} &amp;amp;&amp;amp; #{rake} RAILS_ENV=#{rails_env} #{asset_env} assets:clean"&lt;br /&gt;
&amp;nbsp; &amp;nbsp; end&lt;br /&gt;
&lt;br /&gt;
You get no control there - the run() method will execute that remotely.&lt;br /&gt;
More frustrating: the commands are dumb strings. You don't really have the input escaping or knowledge of what's valid to put into the command in the code itself.&lt;br /&gt;
&lt;br /&gt;
There needs to be flexibility, I agree, but some kind of basic input checking or modelling of what's happening &lt;i&gt;should be more widely used&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
4) The recipes tend to have no idea of where they are - you might as well write shell scripts to do most of it. Every time you see 'cd {absolute path}' is a good indication of this - smarter recipes would likely check current working directory (pwd); or keep a pointer to that.&lt;br /&gt;
&lt;br /&gt;
The only thing that capistrano does better than pure bash scripts:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;There's a lot pre-written, so you don't reinvent the wheel.&lt;/li&gt;
&lt;li&gt;It has a dependency solver (before this do that, after that do this)&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;img src="http://feeds.feedburner.com/~r/blogspot/GHCgp/~4/vsA_KeMtMW4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://clockwerx.blogspot.com/feeds/8788269302725502209/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9088824&amp;postID=8788269302725502209" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9088824/posts/default/8788269302725502209?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9088824/posts/default/8788269302725502209?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/GHCgp/~3/vsA_KeMtMW4/capistrano-frustrates-me.html" title="Capistrano frustrates me" /><author><name>Daniel O'Connor</name><uri>https://plus.google.com/114910530124691879879</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-4ol1KKoueXA/AAAAAAAAAAI/AAAAAAAADUM/t9FtFRD-SzU/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://clockwerx.blogspot.com/2013/02/capistrano-frustrates-me.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0IHSXk9cSp7ImA9WhBTF0w.&quot;"><id>tag:blogger.com,1999:blog-9088824.post-192794817717046348</id><published>2013-01-27T17:18:00.000+10:30</published><updated>2013-02-13T11:02:18.769+10:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-02-13T11:02:18.769+10:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="raspberry pi" /><title>Air con remote control success</title><content type="html">&lt;p&gt;After yet more hacking, I've stuck together just enough code to think I want to go and find a proper home automation framework.&lt;/p&gt;

&lt;p&gt;I've got &lt;em&gt;weather-util&lt;/em&gt; installed on a cron job doing:&lt;br /&gt;
&lt;code&gt;0 * * * * weather ypad ~/butler/weather.txt&lt;/code&gt;&lt;/p&gt;

This gets me a small text file:
&lt;pre&gt;
$ cat weather.txt 
Current conditions at Adelaide Airport, Australia (YPAD) 34-56S 138-31E 4M
Last updated Jan 26, 2013 - 11:30 PM EST / 2013.01.27 0430 UTC
   Temperature: 73 F (23 C)
   Relative Humidity: 46%
   Wind: from the SW (230 degrees) at 14 MPH (12 KT)
   Sky conditions: mostly clear
&lt;/pre&gt;
The first argument is an airport identifier.


Next, I've used &lt;a href="http://adhearsion.github.com/blather/"&gt;Blather&lt;/a&gt; to pull together a quick XMPP bot.

It supports commands like
&lt;pre&gt;
!ac on
!ac cool
!ac temp 23
!ac off
!weather
&lt;/pre&gt;

&lt;p&gt;!weather just pipes the weather.txt back to whomever messaged the bot.&lt;/p&gt;

&lt;p&gt;The !ac commands invoke some of the code to send commands to the air conditioner I talked about earlier.&lt;/p&gt;

&lt;p&gt;Finally, the bot checks the configured owners for all Auth, and if it hasn't seen you in 8 hours, says hello.&lt;/p&gt;


It's far from the cleanest code I've ever written, and Blather is good but needs that little bit more to become "the rails of XMPP". 

Most importantly here though, I'm a little bit of regex away from writing some simple rules (IFTTT style), and adding the relevant cronjobs.

The rules are going to be fairly terse:
&lt;pre&gt;
while temp &gt; 30; turn on AC

while temp &lt; 25; turn off AC
&lt;/pre&gt;

&lt;p&gt;I'd say if I did much more I'd want to refactor a lot of stuff to be more componentized - IE: jabber notification service when a decision is made doesn't need to be right next to the jabber command service.&lt;/p&gt;

&lt;p&gt;I can't decide if I'd want to bring in something like &lt;a href="https://github.com/ottawaruby/whenbot"&gt;Whenbot&lt;/a&gt;, or deal with something as complicated seeming as &lt;a href="https://github.com/derailed/rhouse"&gt;rhouse&lt;/a&gt;. Rhouse (linuxMCE) has a lot of UPnP stuff built it, but annoyingly the samsung smart devices are only using a subset of it - my phone notifies, the air con notifies back; rather than properly using M-SEARCHs.&lt;/p&gt;

&lt;p&gt;Having spent a lot of time on this, I suspect that would be quite annoying to work with.&lt;/p&gt;

&lt;p&gt;The next step I'll probably do is a further cleanup of my nmap code - when my phone's mac address walks in the door, the butler-bot should message me a greeting / fire up the AC decision engine.&lt;/p&gt;

&lt;p&gt;Finally, I have to stick this on it's production server - my new raspberry pi.&lt;/p&gt;

&lt;p&gt;More than happy to share the code I've got with anyone interested, it's in a few private bitbucket repos for now - I figured there would be few people with the same setup as I have; so kept it private (at least till I can make it into a few gems)...&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/GHCgp/~4/oVMtHAxqT_g" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://clockwerx.blogspot.com/feeds/192794817717046348/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9088824&amp;postID=192794817717046348" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9088824/posts/default/192794817717046348?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9088824/posts/default/192794817717046348?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/GHCgp/~3/oVMtHAxqT_g/air-con-remote-control-success.html" title="Air con remote control success" /><author><name>Daniel O'Connor</name><uri>https://plus.google.com/114910530124691879879</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-4ol1KKoueXA/AAAAAAAAAAI/AAAAAAAADUM/t9FtFRD-SzU/s512-c/photo.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://clockwerx.blogspot.com/2013/01/air-con-remote-control-success.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU8BSH07eip7ImA9WhNaEU8.&quot;"><id>tag:blogger.com,1999:blog-9088824.post-7056113185761762312</id><published>2013-01-26T00:49:00.001+10:30</published><updated>2013-01-26T00:54:19.302+10:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-01-26T00:54:19.302+10:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="rest" /><category scheme="http://www.blogger.com/atom/ns#" term="smart ac" /><category scheme="http://www.blogger.com/atom/ns#" term="samsung" /><category scheme="http://www.blogger.com/atom/ns#" term="upnp" /><title>SMART Airconditioner, Part II</title><content type="html">&lt;a href="http://clockwerx.blogspot.com.au/2013/01/hacking-samsung-smart-air-conditioners.html"&gt;I started trying to figure out my air conditioner&lt;/a&gt;, and have made some fairly good progress.&lt;br /&gt;
&lt;br /&gt;
Unfortunately, though I've been able to do a simple proof of concept; it's ambiguous as to how I can really make use of the resulting code - the terms of service narrowly define &lt;i&gt;only interfaces provided by Samsung&lt;/i&gt;&amp;nbsp;can be used to access their services.&lt;br /&gt;
&lt;br /&gt;
I'd wager that a restful service is "provided by Samsung" in all of the technical senses, but I don't really have the desire to explore the legal interpretations of that.&lt;br /&gt;
&lt;br /&gt;
Anyway...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As a first step, you want to authenticate your restful client against the Samsung SSO interface.&lt;br /&gt;
&lt;br /&gt;
I made use of Mechanize and providing my credentials to correctly generate an authorisation cookie for the samsung service; in an identical fashion to how chrome would do this step.&lt;br /&gt;
&lt;br /&gt;
There are a few steps to this, and a lot of javascript going back and forth.&lt;br /&gt;
&lt;br /&gt;
A post to https://account.samsung.com/account/check.do to get the login form (with a ServiceID and ActionID);&amp;nbsp;followed by submitting the actual login form.&lt;br /&gt;
There's yet more javascript that changes the form submit to location, so you end up manually pointing your requests at&amp;nbsp;https://account.samsung.com/account/startSignIn.do&lt;br /&gt;
&lt;br /&gt;
A final form submit completes the sign in, and you have a cookie somewhere in there generated.&lt;br /&gt;
After that, a fairly overwhelming interface renders itself. A lot of javascript happens to dynamically load UI controls and so forth.&lt;br /&gt;
&lt;br /&gt;
Rather than deal with this tag soup, I took my DUID (the mac address from before) and relied on the existing cookie to go forward.&lt;br /&gt;
&lt;br /&gt;
Mechanize wasn't going to let me do much with POST and raw XML, and I tried a few different clients - I didn't find one I was happy with.&lt;br /&gt;
&lt;br /&gt;
RestClient was close, but to be honest I would likely just use Net::HTTP directly in other situations.&lt;br /&gt;
After I had the authorisation, I sat in chrome and watched what was happening.&lt;br /&gt;
First, there's a call to understand your device's capabilities - selectDevice().&lt;br /&gt;
&lt;br /&gt;
You tend to get a lot of data back, and it took me a while to figure out that this is probably just the same UPnP service description file I was looking for.&lt;br /&gt;
&lt;br /&gt;
Interestingly, Samsung spell out all of the operations you can perform on the machine - it's certainly not a WSDL, but not too hard to see how they would create a number of dynamic UPnP control devices/services/UIs.&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;
      &amp;lt;Power type="string"&amp;gt;
        &amp;lt;AvailableList&amp;gt;
          &amp;lt;On/&amp;gt;
          &amp;lt;Off/&amp;gt;
        &amp;lt;/AvailableList&amp;gt;
      &amp;lt;/Power&amp;gt;
      &amp;lt;OperationMode type="string"&amp;gt;
        &amp;lt;AvailableList&amp;gt;
          &amp;lt;Auto/&amp;gt;
          &amp;lt;Cool/&amp;gt;
          &amp;lt;Dry/&amp;gt;
          &amp;lt;Wind/&amp;gt;
          &amp;lt;Heat/&amp;gt;
        &amp;lt;/AvailableList&amp;gt;
      &amp;lt;/OperationMode&amp;gt;


&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
Actually using the interface they provide, I saw requests to:&lt;/div&gt;
&lt;div&gt;
http://global.samsungsmartappliance.com/Communication/setControl&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
After a bit of probing, this looks very like the 'key value pair' style of controlling a UPnP device.&lt;/div&gt;
&lt;div&gt;
For example, to switch on your AC:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
POST http://global.samsungsmartappliance.com/Communication/setControl&lt;/div&gt;
&lt;div&gt;
Cookie: (What you had before)&lt;/div&gt;
&lt;div&gt;
duid: (mac address)&lt;/div&gt;
&lt;div&gt;
&amp;lt;ControlCommand LastUpdateTime="1359114535"&amp;gt;&amp;lt;Device&amp;gt;&amp;lt;Status Power="On" /&amp;gt;&amp;lt;/Device&amp;gt;&amp;lt;/ControlCommand&amp;gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
The response to this is an acknowledgement and a UUID, known as a CommandId.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
The website them proceeds to &lt;i&gt;spam the hell&lt;/i&gt;&amp;nbsp;out of the services - 1-2 requests a second, polling - just to see if your command worked at all; and to update the device status.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
GET checkControl&lt;/div&gt;
&lt;div&gt;
CommandId: UUIDFromBefore&lt;/div&gt;
&lt;div&gt;
&lt;pre&gt;&lt;code&gt;
&amp;lt;rsp stat="ok"&amp;gt;&amp;lt;ControlResult DUID="..."&amp;gt;Processing&amp;lt;/ControlResult&amp;gt;&amp;lt;/rsp&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
GET checkControl&lt;/div&gt;
&lt;div&gt;
CommandId: UUIDFromBefore&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;pre&gt;&lt;code&gt;
&amp;lt;rsp stat="ok"&amp;gt;&amp;lt;ControlResult DUID="..."&amp;gt;Success&amp;lt;/ControlResult&amp;gt;&amp;lt;/rsp&amp;gt;&lt;/pre&gt;&lt;/code&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Given the previous work sniffing packets, I would think I've just sent basically the UPnP packets to the AC, and global.samsung.com would be doing little to no transformation of them; beyond adding/removing from a queue.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
At this point, I was ready to try controlling the AC with my restful code and start publishing it to github - unfortunately; I thought to read the ToS and found the narrowly worded agreement.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
While I'd usually consider that hard to enforce, I don't really want to find out the ramifications of "unauthorised use of a computer" in Australian law - even if the end service is a Thing in My House that arguably doesn't need traffic going to Korea for it.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
However, since I now have a pretty good idea of the &lt;i&gt;other &lt;/i&gt;half of the conversation; I'm going to look closely at UPnP in the local environment again. If the services look similar, and it's just a matter of the same requests; but over UDP, I'm sorted!&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/GHCgp/~4/fLt-ePWkxiY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://clockwerx.blogspot.com/feeds/7056113185761762312/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9088824&amp;postID=7056113185761762312" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9088824/posts/default/7056113185761762312?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9088824/posts/default/7056113185761762312?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/GHCgp/~3/fLt-ePWkxiY/smart-airconditioner-part-ii.html" title="SMART Airconditioner, Part II" /><author><name>Daniel O'Connor</name><uri>https://plus.google.com/114910530124691879879</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-4ol1KKoueXA/AAAAAAAAAAI/AAAAAAAADUM/t9FtFRD-SzU/s512-c/photo.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://clockwerx.blogspot.com/2013/01/smart-airconditioner-part-ii.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEECQHs7eCp7ImA9WhNaEE4.&quot;"><id>tag:blogger.com,1999:blog-9088824.post-3192000026097876513</id><published>2013-01-24T23:20:00.001+10:30</published><updated>2013-01-24T23:34:21.500+10:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-01-24T23:34:21.500+10:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="rest" /><category scheme="http://www.blogger.com/atom/ns#" term="air conditioner" /><category scheme="http://www.blogger.com/atom/ns#" term="ssdp" /><category scheme="http://www.blogger.com/atom/ns#" term="soap" /><category scheme="http://www.blogger.com/atom/ns#" term="samsung" /><category scheme="http://www.blogger.com/atom/ns#" term="upnp" /><title>How the Samsung SMART Air conditioners/appliances work remotely</title><content type="html">I bought a smart air conditioner, and am marvelling at the fact I can control it from my phone.&lt;br /&gt;
&lt;br /&gt;
What I'm less happy about is the fact I can &lt;i&gt;only&lt;/i&gt;&amp;nbsp;control it from my phone; and that my local network has decided to stop letting me talk to the air con.&lt;br /&gt;
&lt;br /&gt;
I fired up wireshark, and here's what I know so far:&lt;br /&gt;
&lt;br /&gt;
Like most devices, the Air Conditioner is running UPnP services basically. There's packets being sent via&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Simple_Service_Discovery_Protocol"&gt;http://en.wikipedia.org/wiki/Simple_Service_Discovery_Protocol&lt;/a&gt;&amp;nbsp;for my Android phone and the air con to discover each other.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here's my phone asking over HTTPU (HTTP UDP) for air conditioners via multicast:&lt;br /&gt;
NOTIFY * HTTP/1.1&lt;br /&gt;
LOCATION: 192.168.1.2&lt;br /&gt;
HOST: 239.255.255.250:1900&lt;br /&gt;
CACHE-CONTROL: max-age=20&lt;br /&gt;
SERVER: AIR CONDITIONER&lt;br /&gt;
MAC_ADDR: 98:0c:82:f4:d4:5c&lt;br /&gt;
SPEC_VER: MSpec-1.00&lt;br /&gt;
SERVICE_NAME: ControlServer-MLib&lt;br /&gt;
MESSAGE_TYPE: CONTROLLER_START&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
... and the air conditioner starts to respond:&lt;br /&gt;
&lt;br /&gt;
NOTIFY * HTTP/1.1&lt;br /&gt;
LOCATION: http://192.168.1.4&lt;br /&gt;
NTS: ssdp:alive&lt;br /&gt;
CACHE_CONTROL: max-age=60&lt;br /&gt;
HOST: 255.255.255.255:1900&lt;br /&gt;
SERVER: SSDP,SAMSUNG-AC-BORACAY&lt;br /&gt;
MAC_ADDR: 7825AD103D06&lt;br /&gt;
SERVICE_NAME: ControlServer-MLib&lt;br /&gt;
SPEC_VER: MSpec-1.00&lt;br /&gt;
MESSAGE_TYPE: DEVICEDESCRIPTION&lt;br /&gt;
NICKNAME: 536D61727420412F432837383235414431303344303629&lt;br /&gt;
MODELCODE: SAMSUNG_DEVICE&lt;br /&gt;
&lt;br /&gt;
Unfortunately, my air con actually lives at 192.168.1.7, the web application isn't smart enough to respond to changing IP addresses; even if the web server and everything else is.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I'm not entirely sure why, but my phone tends to flood packets out there - I presume the people who put the phone app together wanted to avoid dodgy local wireless problems; and this now explains why my air con is always discovered quickly, but the screen keeps 'loading'.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Strangely, for the local in home network stuff, it looks like my air conditioner is talking to a samsung owned service to give it status updates, even when I'm on my local network:&lt;br /&gt;
211.45.27.216&lt;br /&gt;
&lt;br /&gt;
HTTP/1.1 200 OK&lt;br /&gt;
Cache-Control: private&lt;br /&gt;
Content-Length: 111&lt;br /&gt;
Content-Type: text/xml; charset=utf-8&lt;br /&gt;
Server: Microsoft-IIS/7.5&lt;br /&gt;
X-AspNet-Version: 2.0.50727&lt;br /&gt;
X-Powered-By: ASP.NET&lt;br /&gt;
Date: Thu, 24 Jan 2013 10:38:31 GMT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;rsp stat="ok"&amp;gt;&amp;lt;/rsp&amp;gt;&lt;br /&gt;
&amp;lt;device duid="7825AD103D06" message="Off"&amp;gt;&amp;lt;/device&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Attempt #2: There's an online service you can use.&lt;br /&gt;
Now, our clever friends at Samsung have done the right thing and made communication with their services via HTTPS - at least from the android to the soap service. Weirdly, the air conditioner &lt;u&gt;does not&lt;/u&gt;&amp;nbsp;speak HTTPS; and seems to be sending packets to the samsung control service, not my phone directly.&lt;br /&gt;
&lt;br /&gt;
I looked at a few packets, but at this point, I was pretty much fed up - I'm not going to do a MITM attack via my router, and redirect traffic to a HTTP proxy I control; I'm not going to reroute traffic, and sticking the app in an android emulator to sniff the packets is annoyingly hard.&lt;br /&gt;
&lt;br /&gt;
So, what's really left to do but... log in to the website and look at what's going on there?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-imAatM4zU7c/UQEojXtGALI/AAAAAAAADgA/ecPBncD-CGg/s1600/Screenshot+from+2013-01-24+22:56:28.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="182" src="http://2.bp.blogspot.com/-imAatM4zU7c/UQEojXtGALI/AAAAAAAADgA/ecPBncD-CGg/s320/Screenshot+from+2013-01-24+22:56:28.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-j8oXjm_aiD4/UQEojnv63sI/AAAAAAAADgE/rD4CZ8Uuu-M/s1600/Screenshot+from+2013-01-24+22:56:16.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="182" src="http://4.bp.blogspot.com/-j8oXjm_aiD4/UQEojnv63sI/AAAAAAAADgE/rD4CZ8Uuu-M/s320/Screenshot+from+2013-01-24+22:56:16.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;span class="webkit-html-tag" style="background-color: white; box-sizing: border-box; color: #881280; font-family: 'dejavu sans mono', monospace; font-size: 11px; text-align: start; white-space: pre;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
This looks like paydirt - there are numerous javascript files which are hitting endpoints to execute commands.&lt;br /&gt;
It's probably a fairly safe assumption to think those endpoints are just RESTful wrappers around the underlying webservice.&lt;br /&gt;
&lt;br /&gt;
Two are of quite a lot of interest, if ... dubious quality:&lt;br /&gt;
&lt;a href="http://global.samsungsmartappliance.com/Content/js/communication/commMgr.js"&gt;http://global.samsungsmartappliance.com/Content/js/communication/commMgr.js&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://global.samsungsmartappliance.com/Content/js/communication/Device/Device.js"&gt;http://global.samsungsmartappliance.com/Content/js/communication/Device/Device.js&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Looking in firebug/chrome's console, you can see that the device traffic is going back and forth, with an incrementing token continually polling my air conditioner for status.&lt;br /&gt;
&lt;br /&gt;
When you actually execute a command, a fairly simple request is sent:&lt;br /&gt;
&lt;br /&gt;
&lt;span class="webkit-html-tag" style="background-color: white; box-sizing: border-box; font-size: 11px;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ol class="outline-disclosure" style="-webkit-padding-start: 12px; box-sizing: border-box; color: black; list-style-type: none; margin: 0px; outline: none;" tabindex="0"&gt;
&lt;li style="box-sizing: border-box; font-family: 'Lucida Grande', sans-serif; margin-left: -2px; margin-top: 1px; padding: 0px 0px 0px 14px; white-space: normal; word-wrap: break-word;" title=""&gt;&lt;div class="header-name" style="box-sizing: border-box; color: #545454; display: inline-block; font-weight: bold; margin-right: 0.5em; vertical-align: top; white-space: pre-wrap;"&gt;
Request URL:&lt;/div&gt;
&lt;div class="header-value source-code" style="box-sizing: border-box; display: inline; font-family: 'dejavu sans mono', monospace; margin-right: 100px; margin-top: 1px; white-space: pre-wrap; word-break: break-all;"&gt;
http://global.samsungsmartappliance.com/Communication/setControl&lt;/div&gt;
&lt;/li&gt;
&lt;li style="box-sizing: border-box; font-family: 'Lucida Grande', sans-serif; margin-left: -2px; margin-top: 1px; padding: 0px 0px 0px 14px; white-space: normal; word-wrap: break-word;" title=""&gt;&lt;div class="header-name" style="box-sizing: border-box; color: #545454; display: inline-block; font-weight: bold; margin-right: 0.5em; vertical-align: top; white-space: pre-wrap;"&gt;
Request Method:&lt;/div&gt;
&lt;div class="header-value source-code" style="box-sizing: border-box; display: inline; font-family: 'dejavu sans mono', monospace; margin-right: 100px; margin-top: 1px; white-space: pre-wrap; word-break: break-all;"&gt;
POST&lt;/div&gt;
&lt;/li&gt;
&lt;li style="box-sizing: border-box; font-family: 'Lucida Grande', sans-serif; margin-left: -2px; margin-top: 1px; padding: 0px 0px 0px 14px; white-space: normal; word-wrap: break-word;" title=""&gt;&lt;div class="header-name" style="box-sizing: border-box; color: #545454; display: inline-block; font-weight: bold; margin-right: 0.5em; vertical-align: top; white-space: pre-wrap;"&gt;
Status Code:&lt;/div&gt;
&lt;div class="header-value source-code" style="box-sizing: border-box; display: inline; font-family: 'dejavu sans mono', monospace; margin-right: 100px; margin-top: 1px; white-space: pre-wrap; word-break: break-all;"&gt;
200 OK&lt;/div&gt;
&lt;/li&gt;
&lt;li class="parent expanded" style="-webkit-user-select: none; box-sizing: border-box; font-family: 'Lucida Grande', sans-serif; font-weight: bold; margin-left: -12px; margin-top: 1px; padding: 0px 0px 0px 14px; white-space: normal; word-wrap: break-word;" title=""&gt;Request Headers&lt;span class="header-toggle" style="box-sizing: border-box; color: #737373; display: inline; font-weight: normal; margin-left: 30px;"&gt;view source&lt;/span&gt;&lt;/li&gt;
&lt;ol class="children expanded" style="-webkit-padding-start: 12px; box-sizing: border-box; cursor: default; font-family: 'Lucida Grande', sans-serif; list-style-type: none; margin: 0px; min-width: 100%; padding: 2px 6px !important; position: relative; white-space: normal;"&gt;
&lt;li style="box-sizing: border-box; margin-left: -2px; margin-top: 1px; padding: 0px 0px 0px 14px; white-space: nowrap; word-wrap: break-word;" title=""&gt;&lt;div class="header-name" style="box-sizing: border-box; color: #545454; display: inline-block; font-weight: bold; margin-right: 0.5em; vertical-align: top; white-space: pre-wrap;"&gt;
Accept:&lt;/div&gt;
&lt;div class="header-value source-code" style="box-sizing: border-box; display: inline; font-family: 'dejavu sans mono', monospace; margin-right: 100px; margin-top: 1px; white-space: pre-wrap; word-break: break-all;"&gt;
application/xml, text/xml, */*; q=0.01&lt;/div&gt;
&lt;/li&gt;
&lt;li style="box-sizing: border-box; margin-left: -2px; margin-top: 1px; padding: 0px 0px 0px 14px; white-space: nowrap; word-wrap: break-word;" title=""&gt;&lt;div class="header-name" style="box-sizing: border-box; color: #545454; display: inline-block; font-weight: bold; margin-right: 0.5em; vertical-align: top; white-space: pre-wrap;"&gt;
Accept-Charset:&lt;/div&gt;
&lt;div class="header-value source-code" style="box-sizing: border-box; display: inline; font-family: 'dejavu sans mono', monospace; margin-right: 100px; margin-top: 1px; white-space: pre-wrap; word-break: break-all;"&gt;
ISO-8859-1,utf-8;q=0.7,*;q=0.3&lt;/div&gt;
&lt;/li&gt;
&lt;li style="box-sizing: border-box; margin-left: -2px; margin-top: 1px; padding: 0px 0px 0px 14px; white-space: nowrap; word-wrap: break-word;" title=""&gt;&lt;div class="header-name" style="box-sizing: border-box; color: #545454; display: inline-block; font-weight: bold; margin-right: 0.5em; vertical-align: top; white-space: pre-wrap;"&gt;
Accept-Encoding:&lt;/div&gt;
&lt;div class="header-value source-code" style="box-sizing: border-box; display: inline; font-family: 'dejavu sans mono', monospace; margin-right: 100px; margin-top: 1px; white-space: pre-wrap; word-break: break-all;"&gt;
gzip,deflate,sdch&lt;/div&gt;
&lt;/li&gt;
&lt;li style="box-sizing: border-box; margin-left: -2px; margin-top: 1px; padding: 0px 0px 0px 14px; white-space: nowrap; word-wrap: break-word;" title=""&gt;&lt;div class="header-name" style="box-sizing: border-box; color: #545454; display: inline-block; font-weight: bold; margin-right: 0.5em; vertical-align: top; white-space: pre-wrap;"&gt;
Accept-Language:&lt;/div&gt;
&lt;div class="header-value source-code" style="box-sizing: border-box; display: inline; font-family: 'dejavu sans mono', monospace; margin-right: 100px; margin-top: 1px; white-space: pre-wrap; word-break: break-all;"&gt;
en-GB,en-US;q=0.8,en;q=0.6&lt;/div&gt;
&lt;/li&gt;
&lt;li style="box-sizing: border-box; margin-left: -2px; margin-top: 1px; padding: 0px 0px 0px 14px; white-space: nowrap; word-wrap: break-word;" title=""&gt;&lt;div class="header-name" style="box-sizing: border-box; color: #545454; display: inline-block; font-weight: bold; margin-right: 0.5em; vertical-align: top; white-space: pre-wrap;"&gt;
Connection:&lt;/div&gt;
&lt;div class="header-value source-code" style="box-sizing: border-box; display: inline; font-family: 'dejavu sans mono', monospace; margin-right: 100px; margin-top: 1px; white-space: pre-wrap; word-break: break-all;"&gt;
keep-alive&lt;/div&gt;
&lt;/li&gt;
&lt;li style="box-sizing: border-box; margin-left: -2px; margin-top: 1px; padding: 0px 0px 0px 14px; white-space: nowrap; word-wrap: break-word;" title=""&gt;&lt;div class="header-name" style="box-sizing: border-box; color: #545454; display: inline-block; font-weight: bold; margin-right: 0.5em; vertical-align: top; white-space: pre-wrap;"&gt;
Content-Length:&lt;/div&gt;
&lt;div class="header-value source-code" style="box-sizing: border-box; display: inline; font-family: 'dejavu sans mono', monospace; margin-right: 100px; margin-top: 1px; white-space: pre-wrap; word-break: break-all;"&gt;
122&lt;/div&gt;
&lt;/li&gt;
&lt;li style="box-sizing: border-box; margin-left: -2px; margin-top: 1px; padding: 0px 0px 0px 14px; white-space: nowrap; word-wrap: break-word;" title=""&gt;&lt;div class="header-name" style="box-sizing: border-box; color: #545454; display: inline-block; font-weight: bold; margin-right: 0.5em; vertical-align: top; white-space: pre-wrap;"&gt;
Content-Type:&lt;/div&gt;
&lt;div class="header-value source-code" style="box-sizing: border-box; display: inline; font-family: 'dejavu sans mono', monospace; margin-right: 100px; margin-top: 1px; white-space: pre-wrap; word-break: break-all;"&gt;
text/xml&lt;/div&gt;
&lt;/li&gt;
&lt;li style="box-sizing: border-box; margin-left: -2px; margin-top: 1px; padding: 0px 0px 0px 14px; white-space: nowrap; word-wrap: break-word;" title=""&gt;&lt;div class="header-name" style="box-sizing: border-box; color: #545454; display: inline-block; font-weight: bold; margin-right: 0.5em; vertical-align: top; white-space: pre-wrap;"&gt;
Cookie:&lt;/div&gt;
&lt;div class="header-value source-code" style="box-sizing: border-box; display: inline; font-family: 'dejavu sans mono', monospace; margin-right: 100px; margin-top: 1px; white-space: pre-wrap; word-break: break-all;"&gt;
ASP.NET_SessionId=y3akcf55bfxtcnzhd0hyz5ru; Language=en; Country=GB; LoginLanguage=en; iPlanetDirectoryPro=AQIC5wM2LY4Sfcy5aJdOInrRhyDKEyNfWseX44FQLVR9hZI%3D%40AAJTSQACMDIAAlMxAAIwNQ%3D%3D%23; GMT=10.5&lt;/div&gt;
&lt;/li&gt;
&lt;li style="box-sizing: border-box; margin-left: -2px; margin-top: 1px; padding: 0px 0px 0px 14px; white-space: nowrap; word-wrap: break-word;" title=""&gt;&lt;div class="header-name" style="box-sizing: border-box; color: #545454; display: inline-block; font-weight: bold; margin-right: 0.5em; vertical-align: top; white-space: pre-wrap;"&gt;
Host:&lt;/div&gt;
&lt;div class="header-value source-code" style="box-sizing: border-box; display: inline; font-family: 'dejavu sans mono', monospace; margin-right: 100px; margin-top: 1px; white-space: pre-wrap; word-break: break-all;"&gt;
global.samsungsmartappliance.com&lt;/div&gt;
&lt;/li&gt;
&lt;li style="box-sizing: border-box; margin-left: -2px; margin-top: 1px; padding: 0px 0px 0px 14px; white-space: nowrap; word-wrap: break-word;" title=""&gt;&lt;div class="header-name" style="box-sizing: border-box; color: #545454; display: inline-block; font-weight: bold; margin-right: 0.5em; vertical-align: top; white-space: pre-wrap;"&gt;
Origin:&lt;/div&gt;
&lt;div class="header-value source-code" style="box-sizing: border-box; display: inline; font-family: 'dejavu sans mono', monospace; margin-right: 100px; margin-top: 1px; white-space: pre-wrap; word-break: break-all;"&gt;
http://global.samsungsmartappliance.com&lt;/div&gt;
&lt;/li&gt;
&lt;li style="box-sizing: border-box; margin-left: -2px; margin-top: 1px; padding: 0px 0px 0px 14px; white-space: nowrap; word-wrap: break-word;" title=""&gt;&lt;div class="header-name" style="box-sizing: border-box; color: #545454; display: inline-block; font-weight: bold; margin-right: 0.5em; vertical-align: top; white-space: pre-wrap;"&gt;
Referer:&lt;/div&gt;
&lt;div class="header-value source-code" style="box-sizing: border-box; display: inline; font-family: 'dejavu sans mono', monospace; margin-right: 100px; margin-top: 1px; white-space: pre-wrap; word-break: break-all;"&gt;
http://global.samsungsmartappliance.com/&lt;/div&gt;
&lt;/li&gt;
&lt;li style="box-sizing: border-box; margin-left: -2px; margin-top: 1px; padding: 0px 0px 0px 14px; white-space: nowrap; word-wrap: break-word;" title=""&gt;&lt;div class="header-name" style="box-sizing: border-box; color: #545454; display: inline-block; font-weight: bold; margin-right: 0.5em; vertical-align: top; white-space: pre-wrap;"&gt;
User-Agent:&lt;/div&gt;
&lt;div class="header-value source-code" style="box-sizing: border-box; display: inline; font-family: 'dejavu sans mono', monospace; margin-right: 100px; margin-top: 1px; white-space: pre-wrap; word-break: break-all;"&gt;
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17&lt;/div&gt;
&lt;/li&gt;
&lt;li style="box-sizing: border-box; margin-left: -2px; margin-top: 1px; padding: 0px 0px 0px 14px; white-space: nowrap; word-wrap: break-word;" title=""&gt;&lt;div class="header-name" style="box-sizing: border-box; color: #545454; display: inline-block; font-weight: bold; margin-right: 0.5em; vertical-align: top; white-space: pre-wrap;"&gt;
X-Requested-With:&lt;/div&gt;
&lt;div class="header-value source-code" style="box-sizing: border-box; display: inline; font-family: 'dejavu sans mono', monospace; margin-right: 100px; margin-top: 1px; white-space: pre-wrap; word-break: break-all;"&gt;
XMLHttpRequest&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;li class="parent expanded" style="-webkit-user-select: none; box-sizing: border-box; font-family: 'Lucida Grande', sans-serif; font-weight: bold; margin-left: -12px; margin-top: 1px; padding: 0px 0px 0px 14px; white-space: normal; word-wrap: break-word;" title=""&gt;Request Payload&lt;/li&gt;
&lt;ol class="children expanded" style="-webkit-padding-start: 12px; box-sizing: border-box; cursor: default; font-family: 'Lucida Grande', sans-serif; list-style-type: none; margin: 0px; min-width: 100%; padding: 2px 6px !important; position: relative; white-space: normal;"&gt;
&lt;li style="box-sizing: border-box; margin-left: -2px; margin-top: 1px; padding: 0px 0px 0px 14px; white-space: nowrap; word-wrap: break-word;" title=""&gt;&lt;span class="header-value source-code" style="box-sizing: border-box; display: inline; font-family: 'dejavu sans mono', monospace; margin-right: 100px; margin-top: 1px; white-space: pre-wrap; word-break: break-all;"&gt;&lt;controlcommand lastupdatetime="1359030974"&gt;&lt;device&gt;&lt;status convenientmode="Off" power="Off"&gt;&lt;/status&gt;&lt;/device&gt;&lt;/controlcommand&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;li class="parent expanded" style="-webkit-user-select: none; box-sizing: border-box; font-family: 'Lucida Grande', sans-serif; font-weight: bold; margin-left: -12px; margin-top: 1px; padding: 0px 0px 0px 14px; white-space: normal; word-wrap: break-word;" title=""&gt;Response Headers&lt;span class="header-toggle" style="box-sizing: border-box; color: #737373; display: inline; font-weight: normal; margin-left: 30px;"&gt;view source&lt;/span&gt;&lt;/li&gt;
&lt;ol class="children expanded" style="-webkit-padding-start: 12px; box-sizing: border-box; cursor: default; font-family: 'Lucida Grande', sans-serif; list-style-type: none; margin: 0px; min-width: 100%; padding: 2px 6px !important; position: relative; white-space: normal;"&gt;
&lt;li style="box-sizing: border-box; margin-left: -2px; margin-top: 1px; padding: 0px 0px 0px 14px; white-space: nowrap; word-wrap: break-word;" title=""&gt;&lt;div class="header-name" style="box-sizing: border-box; color: #545454; display: inline-block; font-weight: bold; margin-right: 0.5em; vertical-align: top; white-space: pre-wrap;"&gt;
Cache-Control:&lt;/div&gt;
&lt;div class="header-value source-code" style="box-sizing: border-box; display: inline; font-family: 'dejavu sans mono', monospace; margin-right: 100px; margin-top: 1px; white-space: pre-wrap; word-break: break-all;"&gt;
private&lt;/div&gt;
&lt;/li&gt;
&lt;li style="box-sizing: border-box; margin-left: -2px; margin-top: 1px; padding: 0px 0px 0px 14px; white-space: nowrap; word-wrap: break-word;" title=""&gt;&lt;div class="header-name" style="box-sizing: border-box; color: #545454; display: inline-block; font-weight: bold; margin-right: 0.5em; vertical-align: top; white-space: pre-wrap;"&gt;
Content-Length:&lt;/div&gt;
&lt;div class="header-value source-code" style="box-sizing: border-box; display: inline; font-family: 'dejavu sans mono', monospace; margin-right: 100px; margin-top: 1px; white-space: pre-wrap; word-break: break-all;"&gt;
100&lt;/div&gt;
&lt;/li&gt;
&lt;li style="box-sizing: border-box; margin-left: -2px; margin-top: 1px; padding: 0px 0px 0px 14px; white-space: nowrap; word-wrap: break-word;" title=""&gt;&lt;div class="header-name" style="box-sizing: border-box; color: #545454; display: inline-block; font-weight: bold; margin-right: 0.5em; vertical-align: top; white-space: pre-wrap;"&gt;
Content-Type:&lt;/div&gt;
&lt;div class="header-value source-code" style="box-sizing: border-box; display: inline; font-family: 'dejavu sans mono', monospace; margin-right: 100px; margin-top: 1px; white-space: pre-wrap; word-break: break-all;"&gt;
text/html; charset=utf-8&lt;/div&gt;
&lt;/li&gt;
&lt;li style="box-sizing: border-box; margin-left: -2px; margin-top: 1px; padding: 0px 0px 0px 14px; white-space: nowrap; word-wrap: break-word;" title=""&gt;&lt;div class="header-name" style="box-sizing: border-box; color: #545454; display: inline-block; font-weight: bold; margin-right: 0.5em; vertical-align: top; white-space: pre-wrap;"&gt;
Date:&lt;/div&gt;
&lt;div class="header-value source-code" style="box-sizing: border-box; display: inline; font-family: 'dejavu sans mono', monospace; margin-right: 100px; margin-top: 1px; white-space: pre-wrap; word-break: break-all;"&gt;
Thu, 24 Jan 2013 12:40:11 GMT&lt;/div&gt;
&lt;/li&gt;
&lt;li style="box-sizing: border-box; margin-left: -2px; margin-top: 1px; padding: 0px 0px 0px 14px; white-space: nowrap; word-wrap: break-word;" title=""&gt;&lt;div class="header-name" style="box-sizing: border-box; color: #545454; display: inline-block; font-weight: bold; margin-right: 0.5em; vertical-align: top; white-space: pre-wrap;"&gt;
Server:&lt;/div&gt;
&lt;div class="header-value source-code" style="box-sizing: border-box; display: inline; font-family: 'dejavu sans mono', monospace; margin-right: 100px; margin-top: 1px; white-space: pre-wrap; word-break: break-all;"&gt;
Microsoft-IIS/7.5&lt;/div&gt;
&lt;/li&gt;
&lt;li style="box-sizing: border-box; margin-left: -2px; margin-top: 1px; padding: 0px 0px 0px 14px; white-space: nowrap; word-wrap: break-word;" title=""&gt;&lt;div class="header-name" style="box-sizing: border-box; color: #545454; display: inline-block; font-weight: bold; margin-right: 0.5em; vertical-align: top; white-space: pre-wrap;"&gt;
X-AspNet-Version:&lt;/div&gt;
&lt;div class="header-value source-code" style="box-sizing: border-box; display: inline; font-family: 'dejavu sans mono', monospace; margin-right: 100px; margin-top: 1px; white-space: pre-wrap; word-break: break-all;"&gt;
2.0.50727&lt;/div&gt;
&lt;/li&gt;
&lt;li style="box-sizing: border-box; margin-left: -2px; margin-top: 1px; padding: 0px 0px 0px 14px; white-space: nowrap; word-wrap: break-word;" title=""&gt;&lt;div class="header-name" style="box-sizing: border-box; color: #545454; display: inline-block; font-weight: bold; margin-right: 0.5em; vertical-align: top; white-space: pre-wrap;"&gt;
X-AspNetMvc-Version:&lt;/div&gt;
&lt;div class="header-value source-code" style="box-sizing: border-box; display: inline; font-family: 'dejavu sans mono', monospace; margin-right: 100px; margin-top: 1px; white-space: pre-wrap; word-break: break-all;"&gt;
1.0&lt;/div&gt;
&lt;/li&gt;
&lt;li style="box-sizing: border-box; margin-left: -2px; margin-top: 1px; padding: 0px 0px 0px 14px; white-space: nowrap; word-wrap: break-word;" title=""&gt;&lt;div class="header-name" style="box-sizing: border-box; color: #545454; display: inline-block; font-weight: bold; margin-right: 0.5em; vertical-align: top; white-space: pre-wrap;"&gt;
X-Powered-By:&lt;/div&gt;
&lt;div class="header-value source-code" style="box-sizing: border-box; display: inline; font-family: 'dejavu sans mono', monospace; margin-right: 100px; margin-top: 1px; white-space: pre-wrap; word-break: break-all;"&gt;
ASP.NET&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Most of the other status information has included the MAC address of the air conditioner as the "DUID" - it's stripped of colons, but otherwise identical. While we can't tell what's in the session on the samsung side, I would not be surprised if it were a simple variable named DUID, which identifies where the command should be sent.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
More interestingly, the requests can be replayed; so assuming you have a valid cookie that contains the right DUID, you can just send restful requests.&lt;br /&gt;
&lt;br /&gt;
I'm going to assume that there's some kind of ESB or similar taking these requests and distributing them from my phone/browser to the aircon; as the traffic to the aircon is different to the endpoint my phone / browser speaks to.&lt;br /&gt;
There is a delay, perhaps 3-5 seconds, which is about what I would expect if there was a Giant Messaging Queue in use here; and to be honest the site seems to go down regularly - some service faceplanting it seems likely.&lt;br /&gt;
&lt;br /&gt;
The fact it's jquery&amp;nbsp;+ xml being used also suggests there's an Enterprise Service Beast in play - though json is more common, the transformation between formats is a bit easier if you can hit it with an XSLT.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The use of a session would normally make things more secure... but the control to manipulate that value appears to be right out in the open.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ol class="outline-disclosure" style="-webkit-padding-start: 12px; background-color: white; box-sizing: border-box; font-size: 11px; list-style-type: none; margin: 0px; outline: none;" tabindex="0"&gt;
&lt;li style="box-sizing: border-box; font-family: 'Lucida Grande', sans-serif; margin-left: -2px; margin-top: 1px; padding: 0px 0px 0px 14px; word-wrap: break-word;" title=""&gt;&lt;div class="header-name" style="box-sizing: border-box; color: #545454; display: inline-block; font-weight: bold; margin-right: 0.5em; vertical-align: top; white-space: pre-wrap;"&gt;
Request URL:&lt;/div&gt;
&lt;div class="header-value source-code" style="box-sizing: border-box; display: inline; font-family: 'dejavu sans mono', monospace; margin-right: 100px; margin-top: 1px; white-space: pre-wrap; word-break: break-all;"&gt;
&lt;b&gt;http://global.samsungsmartappliance.com/Communication/selectDevice?_=1359032361539&lt;/b&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li style="box-sizing: border-box; font-family: 'Lucida Grande', sans-serif; margin-left: -2px; margin-top: 1px; padding: 0px 0px 0px 14px; word-wrap: break-word;" title=""&gt;&lt;div class="header-name" style="box-sizing: border-box; color: #545454; display: inline-block; font-weight: bold; margin-right: 0.5em; vertical-align: top; white-space: pre-wrap;"&gt;
Request Method:&lt;/div&gt;
&lt;div class="header-value source-code" style="box-sizing: border-box; display: inline; font-family: 'dejavu sans mono', monospace; margin-right: 100px; margin-top: 1px; white-space: pre-wrap; word-break: break-all;"&gt;
GET&lt;/div&gt;
&lt;/li&gt;
&lt;li style="box-sizing: border-box; font-family: 'Lucida Grande', sans-serif; margin-left: -2px; margin-top: 1px; padding: 0px 0px 0px 14px; word-wrap: break-word;" title=""&gt;&lt;div class="header-name" style="box-sizing: border-box; color: #545454; display: inline-block; font-weight: bold; margin-right: 0.5em; vertical-align: top; white-space: pre-wrap;"&gt;
Status Code:&lt;/div&gt;
&lt;div class="header-value source-code" style="box-sizing: border-box; display: inline; font-family: 'dejavu sans mono', monospace; margin-right: 100px; margin-top: 1px; white-space: pre-wrap; word-break: break-all;"&gt;
200 OK&lt;/div&gt;
&lt;/li&gt;
&lt;li class="parent expanded" style="-webkit-user-select: none; box-sizing: border-box; font-family: 'Lucida Grande', sans-serif; font-weight: bold; margin-left: -12px; margin-top: 1px; padding: 0px 0px 0px 14px; word-wrap: break-word;" title=""&gt;Request Headers&lt;span class="header-toggle" style="box-sizing: border-box; color: #737373; display: inline; font-weight: normal; margin-left: 30px;"&gt;view source&lt;/span&gt;&lt;/li&gt;
&lt;ol class="children expanded" style="-webkit-padding-start: 12px; box-sizing: border-box; cursor: default; font-family: 'Lucida Grande', sans-serif; list-style-type: none; margin: 0px; min-width: 100%; padding: 2px 6px !important; position: relative;"&gt;
&lt;li style="box-sizing: border-box; margin-left: -2px; margin-top: 1px; padding: 0px 0px 0px 14px; white-space: nowrap; word-wrap: break-word;" title=""&gt;&lt;div class="header-name" style="box-sizing: border-box; color: #545454; display: inline-block; font-weight: bold; margin-right: 0.5em; vertical-align: top; white-space: pre-wrap;"&gt;
Accept:&lt;/div&gt;
&lt;div class="header-value source-code" style="box-sizing: border-box; display: inline; font-family: 'dejavu sans mono', monospace; margin-right: 100px; margin-top: 1px; white-space: pre-wrap; word-break: break-all;"&gt;
application/xml, text/xml, */*; q=0.01&lt;/div&gt;
&lt;/li&gt;
&lt;li style="box-sizing: border-box; margin-left: -2px; margin-top: 1px; padding: 0px 0px 0px 14px; white-space: nowrap; word-wrap: break-word;" title=""&gt;&lt;div class="header-name" style="box-sizing: border-box; color: #545454; display: inline-block; font-weight: bold; margin-right: 0.5em; vertical-align: top; white-space: pre-wrap;"&gt;
Accept-Charset:&lt;/div&gt;
&lt;div class="header-value source-code" style="box-sizing: border-box; display: inline; font-family: 'dejavu sans mono', monospace; margin-right: 100px; margin-top: 1px; white-space: pre-wrap; word-break: break-all;"&gt;
ISO-8859-1,utf-8;q=0.7,*;q=0.3&lt;/div&gt;
&lt;/li&gt;
&lt;li style="box-sizing: border-box; margin-left: -2px; margin-top: 1px; padding: 0px 0px 0px 14px; white-space: nowrap; word-wrap: break-word;" title=""&gt;&lt;div class="header-name" style="box-sizing: border-box; color: #545454; display: inline-block; font-weight: bold; margin-right: 0.5em; vertical-align: top; white-space: pre-wrap;"&gt;
Accept-Encoding:&lt;/div&gt;
&lt;div class="header-value source-code" style="box-sizing: border-box; display: inline; font-family: 'dejavu sans mono', monospace; margin-right: 100px; margin-top: 1px; white-space: pre-wrap; word-break: break-all;"&gt;
gzip,deflate,sdch&lt;/div&gt;
&lt;/li&gt;
&lt;li style="box-sizing: border-box; margin-left: -2px; margin-top: 1px; padding: 0px 0px 0px 14px; white-space: nowrap; word-wrap: break-word;" title=""&gt;&lt;div class="header-name" style="box-sizing: border-box; color: #545454; display: inline-block; font-weight: bold; margin-right: 0.5em; vertical-align: top; white-space: pre-wrap;"&gt;
Accept-Language:&lt;/div&gt;
&lt;div class="header-value source-code" style="box-sizing: border-box; display: inline; font-family: 'dejavu sans mono', monospace; margin-right: 100px; margin-top: 1px; white-space: pre-wrap; word-break: break-all;"&gt;
en-GB,en-US;q=0.8,en;q=0.6&lt;/div&gt;
&lt;/li&gt;
&lt;li style="box-sizing: border-box; margin-left: -2px; margin-top: 1px; padding: 0px 0px 0px 14px; white-space: nowrap; word-wrap: break-word;" title=""&gt;&lt;div class="header-name" style="box-sizing: border-box; color: #545454; display: inline-block; font-weight: bold; margin-right: 0.5em; vertical-align: top; white-space: pre-wrap;"&gt;
Connection:&lt;/div&gt;
&lt;div class="header-value source-code" style="box-sizing: border-box; display: inline; font-family: 'dejavu sans mono', monospace; margin-right: 100px; margin-top: 1px; white-space: pre-wrap; word-break: break-all;"&gt;
keep-alive&lt;/div&gt;
&lt;/li&gt;
&lt;li style="box-sizing: border-box; margin-left: -2px; margin-top: 1px; padding: 0px 0px 0px 14px; white-space: nowrap; word-wrap: break-word;" title=""&gt;&lt;div class="header-name" style="box-sizing: border-box; color: #545454; display: inline-block; font-weight: bold; margin-right: 0.5em; vertical-align: top; white-space: pre-wrap;"&gt;
Cookie:&lt;/div&gt;
&lt;div class="header-value source-code" style="box-sizing: border-box; display: inline; font-family: 'dejavu sans mono', monospace; margin-right: 100px; margin-top: 1px; white-space: pre-wrap; word-break: break-all;"&gt;
ASP.NET_SessionId=y3akcf55bfxtcnzhd0hyz5ru; Language=en; Country=GB; LoginLanguage=en; iPlanetDirectoryPro=AQIC5wM2LY4Sfcy5aJdOInrRhyDKEyNfWseX44FQLVR9hZI%3D%40AAJTSQACMDIAAlMxAAIwNQ%3D%3D%23; GMT=10.5&lt;/div&gt;
&lt;/li&gt;
&lt;li style="box-sizing: border-box; margin-left: -2px; margin-top: 1px; padding: 0px 0px 0px 14px; white-space: nowrap; word-wrap: break-word;" title=""&gt;&lt;b&gt;&lt;div class="header-name" style="box-sizing: border-box; color: #545454; display: inline-block; margin-right: 0.5em; vertical-align: top; white-space: pre-wrap;"&gt;
duid:&lt;/div&gt;
&lt;div class="header-value source-code" style="box-sizing: border-box; display: inline; font-family: 'dejavu sans mono', monospace; margin-right: 100px; margin-top: 1px; white-space: pre-wrap; word-break: break-all;"&gt;
7825AD103D06&lt;/div&gt;
&lt;/b&gt;&lt;/li&gt;
&lt;li style="box-sizing: border-box; margin-left: -2px; margin-top: 1px; padding: 0px 0px 0px 14px; white-space: nowrap; word-wrap: break-word;" title=""&gt;&lt;div class="header-name" style="box-sizing: border-box; color: #545454; display: inline-block; font-weight: bold; margin-right: 0.5em; vertical-align: top; white-space: pre-wrap;"&gt;
Host:&lt;/div&gt;
&lt;div class="header-value source-code" style="box-sizing: border-box; display: inline; font-family: 'dejavu sans mono', monospace; margin-right: 100px; margin-top: 1px; white-space: pre-wrap; word-break: break-all;"&gt;
global.samsungsmartappliance.com&lt;/div&gt;
&lt;/li&gt;
&lt;li style="box-sizing: border-box; margin-left: -2px; margin-top: 1px; padding: 0px 0px 0px 14px; white-space: nowrap; word-wrap: break-word;" title=""&gt;&lt;div class="header-name" style="box-sizing: border-box; color: #545454; display: inline-block; font-weight: bold; margin-right: 0.5em; vertical-align: top; white-space: pre-wrap;"&gt;
master_duid:&lt;/div&gt;
&lt;div class="header-value source-code" style="box-sizing: border-box; display: inline; font-family: 'dejavu sans mono', monospace; margin-right: 100px; margin-top: 1px; white-space: pre-wrap; word-break: break-all;"&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li style="box-sizing: border-box; margin-left: -2px; margin-top: 1px; padding: 0px 0px 0px 14px; white-space: nowrap; word-wrap: break-word;" title=""&gt;&lt;div class="header-name" style="box-sizing: border-box; color: #545454; display: inline-block; font-weight: bold; margin-right: 0.5em; vertical-align: top; white-space: pre-wrap;"&gt;
Referer:&lt;/div&gt;
&lt;div class="header-value source-code" style="box-sizing: border-box; display: inline; font-family: 'dejavu sans mono', monospace; margin-right: 100px; margin-top: 1px; white-space: pre-wrap; word-break: break-all;"&gt;
http://global.samsungsmartappliance.com/&lt;/div&gt;
&lt;/li&gt;
&lt;li style="box-sizing: border-box; margin-left: -2px; margin-top: 1px; padding: 0px 0px 0px 14px; white-space: nowrap; word-wrap: break-word;" title=""&gt;&lt;div class="header-name" style="box-sizing: border-box; color: #545454; display: inline-block; font-weight: bold; margin-right: 0.5em; vertical-align: top; white-space: pre-wrap;"&gt;
User-Agent:&lt;/div&gt;
&lt;div class="header-value source-code" style="box-sizing: border-box; display: inline; font-family: 'dejavu sans mono', monospace; margin-right: 100px; margin-top: 1px; white-space: pre-wrap; word-break: break-all;"&gt;
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17&lt;/div&gt;
&lt;/li&gt;
&lt;li style="box-sizing: border-box; margin-left: -2px; margin-top: 1px; padding: 0px 0px 0px 14px; white-space: nowrap; word-wrap: break-word;" title=""&gt;&lt;div class="header-name" style="box-sizing: border-box; color: #545454; display: inline-block; font-weight: bold; margin-right: 0.5em; vertical-align: top; white-space: pre-wrap;"&gt;
X-Requested-With:&lt;/div&gt;
&lt;div class="header-value source-code" style="box-sizing: border-box; display: inline; font-family: 'dejavu sans mono', monospace; margin-right: 100px; margin-top: 1px; white-space: pre-wrap; word-break: break-all;"&gt;
XMLHttpRequest&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;span style="font-family: dejavu sans mono, monospace;"&gt;&lt;span style="font-size: 11px; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
I doubt you could hijack someone else's air con if you knew the mac address, but for devices associated with your account...&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
At this point I have two good avenues to explore:&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Local network - I need to fix the IP addresses, and see what's going on after the SSDP phase. I had to authorise my phone, so I suspect that Samsung provides a third party service that verifies allowed MAC addresses prior to opening all of the communication flood gates.&lt;/li&gt;
&lt;li&gt;Pretend to be a browser, and invoke the restful services. If I supply my credentials, I can get the session I need - then the API is just a few POST requests away.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
I'm likely to do the latter, unless I can figure out how to power cycle my aircon properly, and get it understanding its IP address.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/blogspot/GHCgp/~4/62Q6OmzIjJo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://clockwerx.blogspot.com/feeds/3192000026097876513/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9088824&amp;postID=3192000026097876513" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9088824/posts/default/3192000026097876513?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9088824/posts/default/3192000026097876513?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/GHCgp/~3/62Q6OmzIjJo/hacking-samsung-smart-air-conditioners.html" title="How the Samsung SMART Air conditioners/appliances work remotely" /><author><name>Daniel O'Connor</name><uri>https://plus.google.com/114910530124691879879</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-4ol1KKoueXA/AAAAAAAAAAI/AAAAAAAADUM/t9FtFRD-SzU/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-imAatM4zU7c/UQEojXtGALI/AAAAAAAADgA/ecPBncD-CGg/s72-c/Screenshot+from+2013-01-24+22:56:28.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://clockwerx.blogspot.com/2013/01/hacking-samsung-smart-air-conditioners.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0cDSXs_eip7ImA9WhNbGU0.&quot;"><id>tag:blogger.com,1999:blog-9088824.post-2095682698500327511</id><published>2013-01-23T13:12:00.001+10:30</published><updated>2013-01-23T13:14:38.542+10:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-01-23T13:14:38.542+10:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tooltips" /><category scheme="http://www.blogger.com/atom/ns#" term="svg" /><category scheme="http://www.blogger.com/atom/ns#" term="jquery" /><category scheme="http://www.blogger.com/atom/ns#" term="tipsy" /><title>Forking Tipsy</title><content type="html">I like Tipsy, it's a great little plugin that works very well with D3 graphs to add tooltips.&lt;br /&gt;
&lt;br /&gt;
Unfortunately, it's not very maintained - 51 pull requests open, and perhaps 2-3 ever merged.&lt;br /&gt;
&lt;br /&gt;
As a result, I've forked tipsy and applied a good number of those fixes.&lt;br /&gt;
&lt;a href="https://github.com/CloCkWeRX/tipsy"&gt;https://github.com/CloCkWeRX/tipsy&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-neVwRgUHLiY/UP9Oj6QYHUI/AAAAAAAADfw/3nbdPgJzGZI/s1600/pull-requests.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="131" src="http://3.bp.blogspot.com/-neVwRgUHLiY/UP9Oj6QYHUI/AAAAAAAADfw/3nbdPgJzGZI/s320/pull-requests.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Hopefully the original author will just pull the combined changes from my branch back in and continue maintaining it, but if that doesn't happen I'll continue to apply any pull requests sent my way.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/GHCgp/~4/KmHGFvOxxog" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://clockwerx.blogspot.com/feeds/2095682698500327511/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9088824&amp;postID=2095682698500327511" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9088824/posts/default/2095682698500327511?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9088824/posts/default/2095682698500327511?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/GHCgp/~3/KmHGFvOxxog/forking-tipsy.html" title="Forking Tipsy" /><author><name>Daniel O'Connor</name><uri>https://plus.google.com/114910530124691879879</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-4ol1KKoueXA/AAAAAAAAAAI/AAAAAAAADUM/t9FtFRD-SzU/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-neVwRgUHLiY/UP9Oj6QYHUI/AAAAAAAADfw/3nbdPgJzGZI/s72-c/pull-requests.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://clockwerx.blogspot.com/2013/01/forking-tipsy.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0MHQn4_eip7ImA9WhBTF0w.&quot;"><id>tag:blogger.com,1999:blog-9088824.post-6891200666687268993</id><published>2013-01-17T15:41:00.004+10:30</published><updated>2013-02-13T11:00:33.042+10:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-02-13T11:00:33.042+10:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="sql server" /><category scheme="http://www.blogger.com/atom/ns#" term="mysql" /><category scheme="http://www.blogger.com/atom/ns#" term="rails" /><category scheme="http://www.blogger.com/atom/ns#" term="activerecord" /><title>Activerelation, stop being so clever.</title><content type="html">&lt;br /&gt;
I nearly flipped by lid today, when doing what should have been a simple activerelation query to get the &amp;nbsp;'last record'.&lt;br /&gt;
&lt;br /&gt;
Foo.order('column')&lt;br /&gt;
SELECT * FROM foo ORDER BY column ASC;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Foo.order('column &lt;b&gt;ASC&lt;/b&gt;').last&lt;br /&gt;
SELECT TOP 1 * FROM foo ORDER BY column &lt;b&gt;DESC&lt;/b&gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Foo.order('column&amp;nbsp;&lt;b&gt;DESC&lt;/b&gt;').last&lt;br /&gt;
SELECT TOP 1 * FROM foo ORDER BY column&amp;nbsp;&lt;b&gt;ASC&lt;/b&gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Foo.order('column&amp;nbsp;&lt;b&gt;DESC&lt;/b&gt;').first&lt;br /&gt;
SELECT TOP 1 * FROM foo ORDER BY column &lt;b&gt;DESC&lt;/b&gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Foo.order('column&amp;nbsp;&lt;b&gt;ASC&lt;/b&gt;').last&lt;br /&gt;
SELECT TOP 1 * FROM foo ORDER BY column&amp;nbsp;&lt;b&gt;ASC&lt;/b&gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Foo.order('column&amp;nbsp;&lt;b&gt;ASC&lt;/b&gt;').limit(1)&lt;br /&gt;
SELECT TOP 1 * FROM foo ORDER BY column&amp;nbsp;&lt;b&gt;ASC&lt;/b&gt;;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Foo.order('column&amp;nbsp;&lt;b&gt;DESC&lt;/b&gt;').limit(1)&lt;br /&gt;
SELECT TOP 1 * FROM foo ORDER BY column&amp;nbsp;&lt;b&gt;DESC&lt;/b&gt;;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Something tells me I'll &lt;i&gt;never&lt;/i&gt;&amp;nbsp;like SQL server's TOP 1 syntax, as I spent ages just staring at the end of the queries and wondering "why the heck isn't it choosing the last record, I told it to sort DESC!"&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
I miss my LIMITs.&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/GHCgp/~4/KvU-obulqVc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://clockwerx.blogspot.com/feeds/6891200666687268993/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9088824&amp;postID=6891200666687268993" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9088824/posts/default/6891200666687268993?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9088824/posts/default/6891200666687268993?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/GHCgp/~3/KvU-obulqVc/activerelation-stop-being-so-clever.html" title="Activerelation, stop being so clever." /><author><name>Daniel O'Connor</name><uri>https://plus.google.com/114910530124691879879</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-4ol1KKoueXA/AAAAAAAAAAI/AAAAAAAADUM/t9FtFRD-SzU/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://clockwerx.blogspot.com/2013/01/activerelation-stop-being-so-clever.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEQGRnY8cCp7ImA9WhNUGEU.&quot;"><id>tag:blogger.com,1999:blog-9088824.post-1289578412631756360</id><published>2013-01-11T16:02:00.000+10:30</published><updated>2013-01-11T16:02:07.878+10:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-01-11T16:02:07.878+10:30</app:edited><title>I will settle for an Advertiser beat up of the 230 bus</title><content type="html">Everything's coming up Dan!&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.adelaidenow.com.au/south-australias-worst-bus-routes-are-located-in-the-inner-northern-and-southern-suburbs/story-e6frea6u-1226551464579"&gt;http://www.adelaidenow.com.au/south-australias-worst-bus-routes-are-located-in-the-inner-northern-and-southern-suburbs/story-e6frea6u-1226551464579&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/GHCgp/~4/2yXlgfSJmBI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://clockwerx.blogspot.com/feeds/1289578412631756360/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9088824&amp;postID=1289578412631756360" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9088824/posts/default/1289578412631756360?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9088824/posts/default/1289578412631756360?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/GHCgp/~3/2yXlgfSJmBI/i-will-settle-for-advertiser-beat-up-of.html" title="I will settle for an Advertiser beat up of the 230 bus" /><author><name>Daniel O'Connor</name><uri>https://plus.google.com/114910530124691879879</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-4ol1KKoueXA/AAAAAAAAAAI/AAAAAAAADUM/t9FtFRD-SzU/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://clockwerx.blogspot.com/2013/01/i-will-settle-for-advertiser-beat-up-of.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkMMQXg-fSp7ImA9WhNUGE8.&quot;"><id>tag:blogger.com,1999:blog-9088824.post-3730805919168863725</id><published>2013-01-10T22:51:00.001+10:30</published><updated>2013-01-10T22:51:20.655+10:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-01-10T22:51:20.655+10:30</app:edited><title>I can understand a late bus during the cricket...</title><content type="html">... but I really want to know where my no show 230 was at jeffcott st. over ten minutes later than published, no sign.&lt;br /&gt;
&lt;br /&gt;
Caught a taxi. Actually want an apology or even better, recompense for the inconvience.&lt;br /&gt;
&lt;br /&gt;
The shut down of the railway station seems ill timed and ill thought through.&lt;img src="http://feeds.feedburner.com/~r/blogspot/GHCgp/~4/0xuTwunPKjE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://clockwerx.blogspot.com/feeds/3730805919168863725/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=9088824&amp;postID=3730805919168863725" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9088824/posts/default/3730805919168863725?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9088824/posts/default/3730805919168863725?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/GHCgp/~3/0xuTwunPKjE/i-can-understand-late-bus-during-cricket.html" title="I can understand a late bus during the cricket..." /><author><name>Daniel O'Connor</name><uri>https://plus.google.com/114910530124691879879</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-4ol1KKoueXA/AAAAAAAAAAI/AAAAAAAADUM/t9FtFRD-SzU/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://clockwerx.blogspot.com/2013/01/i-can-understand-late-bus-during-cricket.html</feedburner:origLink></entry></feed>
