<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1217940212044267912</id><updated>2011-12-29T07:40:38.745+11:00</updated><category term='AJAX'/><category term='wordnet'/><category term='semantic'/><category term='semantic search'/><category term='genetic algorithm'/><category term='cloud'/><category term='architecture'/><category term='dog blue software'/><category term='dictionary'/><category term='azure'/><title type='text'>Jack Dermody</title><subtitle type='html'>Software aficionado, sometime coffee addict and founder of Ask Bluey.  Father to a "Pupi" and happy resident of Bondi.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.jackdermody.net/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1217940212044267912/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://www.jackdermody.net/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Jack Dermody</name><uri>http://www.blogger.com/profile/16818266186067526483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://1.bp.blogspot.com/__edOJxPil9I/SU_SuuMZOCI/AAAAAAAAAMc/07vMOxRVNXs/S220/jack.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>17</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1217940212044267912.post-2879451104057280926</id><published>2011-10-11T07:51:00.001+11:00</published><updated>2011-10-11T07:51:14.981+11:00</updated><title type='text'>Winter Blues Good for Ask Bluey</title><content type='html'>&lt;p&gt;It's been a long winter here in Sydney.&amp;nbsp; Just as spring seemed certain to arrive, winter instead resumed with a vengeance - biting southerly winds, temperatures down to (gasp) 7 at night, and otherwise all round misery.&amp;nbsp; It's back to Ugg boots and heavy winter doonas and hot chai lattes.&amp;nbsp; Even Masterchef is back on TV – that unfortunate dreary bastion of cold winter nights. &lt;p&gt;However it’s also meant that I have had plenty of time for &lt;a href="http://askbluey.com/"&gt;Ask Bluey&lt;/a&gt; and have been making good progress on getting the second beta version out the door.&amp;nbsp; This version has been about polish, simplification and stability and I think these goals have been met.&lt;/p&gt; &lt;p&gt;If you haven’t visited in a while then feel free to &lt;a href="http://askbluey.com/"&gt;take a look&lt;/a&gt; – after all, who doesn’t want their own private search engine, scouring the internet 24/7 for personally relevant pages?&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1217940212044267912-2879451104057280926?l=www.jackdermody.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jackdermody.net/feeds/2879451104057280926/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1217940212044267912&amp;postID=2879451104057280926' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1217940212044267912/posts/default/2879451104057280926'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1217940212044267912/posts/default/2879451104057280926'/><link rel='alternate' type='text/html' href='http://www.jackdermody.net/2011/10/winter-blues-good-for-ask-bluey.html' title='Winter Blues Good for Ask Bluey'/><author><name>Jack Dermody</name><uri>http://www.blogger.com/profile/16818266186067526483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://1.bp.blogspot.com/__edOJxPil9I/SU_SuuMZOCI/AAAAAAAAAMc/07vMOxRVNXs/S220/jack.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1217940212044267912.post-3671251301055385286</id><published>2011-08-05T09:55:00.001+10:00</published><updated>2011-08-05T10:00:48.608+10:00</updated><title type='text'>Data Storage, Caching and Retrieval in Azure</title><content type='html'>&lt;p&gt;Both web and worker roles have a variety of places to store data in the Azure cloudscape.&amp;#160; Since processing large amounts of data is likely the &lt;em&gt;raison d’etre&lt;/em&gt; of cloud applications in the first place, understanding all the possible places that data might be stored (and their trade-offs) is of some benefit when designing cloud applications.&lt;/p&gt;  &lt;p&gt;What follows is more of my personal brain dump based on my experience with Azure.&amp;#160; I don’t include performance metrics because I suppose them to be continually changing and subject to variability based on the application in question.&amp;#160; I recommend collecting performance metrics in the design phase to give further weight to your own design choices.&lt;/p&gt;  &lt;h2&gt;LOCAL Memory (per Instance)&lt;/h2&gt;  &lt;p&gt;Obviously the fastest place to cache your data, but sadly quite limited in size (depending on the size of the Azure instances that you choose (and pay for)).&lt;/p&gt;  &lt;p&gt;Also sadly not shareable between multiple instances running in the same web role.&amp;#160; Storing session state on one machine helps you very little when the next request lands on the next machine in your web farm.&lt;/p&gt;  &lt;h2&gt;LOCAL STORAGE (PER INSTANCE)&lt;/h2&gt;  &lt;p&gt;Storing to disk has exactly the same benefits and trade-offs that one might expect – a far greater capacity than local memory but far longer read and write speeds.&amp;#160; Where possible, asynchronous&amp;#160; writes may be possible to ameliorate some of the performance penalty.&amp;#160; Again, not shareable between instances.&lt;/p&gt;  &lt;h2&gt;SQL Azure&lt;/h2&gt;  &lt;p&gt;Since web roles with multiple instances often &lt;em&gt;do&lt;/em&gt; need a place to share session data, the database represents a logical place.&amp;#160; The &lt;a href="http://en.wikipedia.org/wiki/ACID"&gt;ACID&lt;/a&gt; properties of a relational database mean that even when individual instances of your application die and are recycled, the user should see no difference in their session from the remaining instances that are still serving requests.&lt;/p&gt;  &lt;p&gt;However the size constraints of SQL Azure databases (and expense involved) mean that not every piece of data should simply be bundled into the database.&amp;#160; Large blobs of data are certainly a good candidate for blob storage, but their timestamps and other meta information might be stored in the database to aid retrieval time and to integrate with stored procedure logic.&lt;/p&gt;  &lt;h2&gt;Blob Storage&lt;/h2&gt;  &lt;p&gt;Blob storage is the cheapest way to store large amounts of data “in the cloud”, although the current offering is not especially compelling, performance wise.&amp;#160; Since you pay per transaction it also represents a poor choice to put things that you will be frequently accessing.&lt;/p&gt;  &lt;p&gt;Blob storage is like the “stack” at your local library – non frequently accessed things can be stored at low cost for large amounts of time, and brought into the forward caches as appropriate.&lt;/p&gt;  &lt;h2&gt;Windows Azure AppFabric Caching&lt;/h2&gt;  &lt;p&gt;An alternative place to share session state between instances, AppFabric caching sounds good in theory but suffers a little in practise.&amp;#160; The idea is that it represents a high speed storage location that is easily shared between instances.&amp;#160; The reality is that it will shut you off if you use it too much, and the performance does not seem especially compelling.&amp;#160; It is however, considerably faster than blob storage.&lt;/p&gt;  &lt;h2&gt;Putting it all together&lt;/h2&gt;  &lt;p&gt;A well designed Azure application will take into account all the strengths and weaknesses of the storage options available and work with each accordingly.&lt;/p&gt;  &lt;p&gt;Often data seems to move like a waterfall across the different tiers.&amp;#160; If an application might require some particular data it might check first with a centralised and reliable store such as the SQL database as to where that data is located and its latest timestamp.&amp;#160; Then it might check its various caches for the blob’s handle and timestamp – first in local memory, then local storage, then the AppFabric cache and finally from blob storage.&amp;#160; When it finds its data it might refresh the other (empty or invalidated) caches that failed it along the way.&lt;/p&gt;  &lt;p&gt;Other times a backend process might invalidate some piece of non-SQL data, update both blob and cache storages and then send a message to each role instance that the data has changed.&amp;#160; Each role instance in turn can then query the cache service for the data, and fall back on blob storage if the cache drops the ball.&amp;#160; The role instance might store that data in local memory and local storage and simply assume that the data remains valid until a notification to the contrary is received.&lt;/p&gt;  &lt;p&gt;But as with all advice, your mileage will vary ; )&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1217940212044267912-3671251301055385286?l=www.jackdermody.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jackdermody.net/feeds/3671251301055385286/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1217940212044267912&amp;postID=3671251301055385286' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1217940212044267912/posts/default/3671251301055385286'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1217940212044267912/posts/default/3671251301055385286'/><link rel='alternate' type='text/html' href='http://www.jackdermody.net/2011/08/data-storage-caching-and-retrieval-in.html' title='Data Storage, Caching and Retrieval in Azure'/><author><name>Jack Dermody</name><uri>http://www.blogger.com/profile/16818266186067526483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://1.bp.blogspot.com/__edOJxPil9I/SU_SuuMZOCI/AAAAAAAAAMc/07vMOxRVNXs/S220/jack.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1217940212044267912.post-1042029311005243716</id><published>2011-08-05T08:46:00.001+10:00</published><updated>2011-09-06T17:20:03.714+10:00</updated><title type='text'>Getting the Redirected Url from a WebClient</title><content type='html'>&lt;p&gt;&lt;em&gt;WebClient&lt;/em&gt; in .NET is a handy class for network access, but sometimes you need things that it doesn’t expose “out of the box”.&amp;#160; Fortunately it’s quite simple to extend.&lt;/p&gt;  &lt;p&gt;One of the handy features of the class is that it automatically handles redirects on your behalf.&amp;#160; Suppose that you make a request to some URI that returns an HTTP status code of 301 – if the &lt;em&gt;AllowAutoRedirect&lt;/em&gt; property on &lt;em&gt;WebClient&lt;/em&gt; is set, it will automatically parse the HTTP response and make a subsequent call to the redirected URL all by itself.&amp;#160; Nice.&lt;/p&gt;  &lt;p&gt;In my case however I wanted to find out the actual URL that it had redirected to, so I extended &lt;em&gt;WebClient&lt;/em&gt; as below to always save the Uri that it was last getting a response from. This Uri would be different from the request Uri if the server had returned an HTTP status code indicating redirection.&lt;/p&gt;  &lt;pre class="brush: c#"&gt;public class MyWebClient : WebClient&lt;br /&gt;{&lt;br /&gt;    Uri _responseUri;&lt;br /&gt;&lt;br /&gt;    public Uri ResponseUri&lt;br /&gt;    {&lt;br /&gt;        get { return _responseUri; }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    protected override WebRequest GetWebRequest(Uri address)&lt;br /&gt;    {&lt;br /&gt;        HttpWebRequest request = base.GetWebRequest(address) as HttpWebRequest;&lt;br /&gt;        request.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;&lt;br /&gt;        request.AllowAutoRedirect = true;&lt;br /&gt;        return request;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    protected override WebResponse GetWebResponse(WebRequest request, IAsyncResult result)&lt;br /&gt;    {&lt;br /&gt;        WebResponse response = base.GetWebResponse(request, result);&lt;br /&gt;        _responseUri = response.ResponseUri;&lt;br /&gt;        return response;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    protected override WebResponse GetWebResponse(WebRequest request)&lt;br /&gt;    {&lt;br /&gt;        WebResponse response = base.GetWebResponse(request);&lt;br /&gt;        _responseUri = response.ResponseUri;&lt;br /&gt;        return response;&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1217940212044267912-1042029311005243716?l=www.jackdermody.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jackdermody.net/feeds/1042029311005243716/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1217940212044267912&amp;postID=1042029311005243716' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1217940212044267912/posts/default/1042029311005243716'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1217940212044267912/posts/default/1042029311005243716'/><link rel='alternate' type='text/html' href='http://www.jackdermody.net/2011/08/my-web-client.html' title='Getting the Redirected Url from a WebClient'/><author><name>Jack Dermody</name><uri>http://www.blogger.com/profile/16818266186067526483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://1.bp.blogspot.com/__edOJxPil9I/SU_SuuMZOCI/AAAAAAAAAMc/07vMOxRVNXs/S220/jack.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1217940212044267912.post-3832429001963270395</id><published>2011-08-04T09:25:00.001+10:00</published><updated>2011-08-04T09:51:46.558+10:00</updated><title type='text'>Azure Table Storage Helper Classes</title><content type='html'>&lt;p&gt;Before I discovered that working with Azure’s table storage was not the be all and end all that I had once thought (see &lt;a href="http://jackdermody.blogspot.com/2011/07/to-cloud.html"&gt;previous post&lt;/a&gt;), I put together some base classes that implement the key recommendations from the &lt;a href="http://download.microsoft.com/download/3/B/1/3B170FF4-2354-4B2D-B4DC-8FED5F838F6A/Windows%20Azure%20Table%20-%20Dec%202008.docx"&gt;Whitepaper for Programming Table Storage&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;These classes make working with &lt;em&gt;Microsoft.WindowsAzure.StorageClient&lt;/em&gt; a little easier and less verbose, and means that you can use the following class to define a log table for your Azure cloud application.&amp;#160; (You need to create the empty table first with something like &lt;a href="http://azurestorageexplorer.codeplex.com/"&gt;Azure Storage Explorer&lt;/a&gt;.&amp;#160; Note that Azure table names need to be lowercase or strange things might happen!)&lt;/p&gt;  &lt;p&gt;The constructor defines the table name “log”, the account credentials to use (here as a static variable ABB, and whether to use https in connecting to the table (in this case false).&lt;/p&gt;  &lt;p&gt;The second part of the class definition defines the structure of the table row, including the partition and row keys. In this case the partition key is the type of log message (error, warning, etc) and the row key is the timestamp of the message (in descending order). The message column contains the actual log message.&lt;/p&gt;  &lt;p&gt;Note that the partition key and row key are always required for each table and together form the primary key for that row.&lt;/p&gt;  &lt;pre class="brush: c#;"&gt;internal class LogTable : TableBase&amp;lt;LogTable.TableContext&amp;gt;&lt;br /&gt;{&lt;br /&gt;    public LogTable() : base((baseAddress, credentials) =&amp;gt; new TableContext(&amp;quot;log&amp;quot;, baseAddress, credentials), AccountCredentials.ABB, false) { }&lt;br /&gt;&lt;br /&gt;    public class Row : TableServiceEntity&lt;br /&gt;    {&lt;br /&gt;        public Row(string message, LogType type)&lt;br /&gt;        {&lt;br /&gt;            PartitionKey = type.ToString();&lt;br /&gt;            RowKey = (DateTime.MaxValue.Ticks - DateTime.UtcNow.Ticks).ToString();&lt;br /&gt;            Message = message;&lt;br /&gt;        }&lt;br /&gt;        public Row()&lt;br /&gt;        {&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public string Message { get; set; }&lt;br /&gt;    }&lt;br /&gt;    public class TableContext : ContextBase&amp;lt;Row&amp;gt;&lt;br /&gt;    {&lt;br /&gt;        public TableContext(string tableName, string baseAddress, StorageCredentials credentials) : base(tableName, baseAddress, credentials) { }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public static void AddMessage(string message, LogType type = LogType.Error)&lt;br /&gt;    {&lt;br /&gt;        try {&lt;br /&gt;            var context = new LogTable().Context;&lt;br /&gt;            context.Add(new Row(message, type));&lt;br /&gt;            context.SaveAsync();&lt;br /&gt;        }&lt;br /&gt;        catch {&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Adding a new log message&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: c#;"&gt;LogTable.AddMessage(“some message”);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: c#;"&gt;LogTable.AddMessage(“some message”, LogType.Warning);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Getting a list of all log messages&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: c#;"&gt;var logMessages = new LogTable().ReadOnlyContext.Query.Select(r =&amp;gt; r.Message);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Download&lt;/h3&gt;&lt;br /&gt;&lt;iframe style="padding-bottom: 0px; background-color: #fcfcfc; padding-left: 0px; width: 98px; padding-right: 0px; height: 115px; padding-top: 0px" title="Preview" marginheight="0" src="https://skydrive.live.com/embedicon.aspx/.Public/TableStorageBase?cid=3060ef55e2e14240&amp;amp;sc=documents" frameborder="0" marginwidth="0" scrolling="no"&gt;&lt;/iframe&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1217940212044267912-3832429001963270395?l=www.jackdermody.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jackdermody.net/feeds/3832429001963270395/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1217940212044267912&amp;postID=3832429001963270395' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1217940212044267912/posts/default/3832429001963270395'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1217940212044267912/posts/default/3832429001963270395'/><link rel='alternate' type='text/html' href='http://www.jackdermody.net/2011/08/azure-table-storage-helper-classes.html' title='Azure Table Storage Helper Classes'/><author><name>Jack Dermody</name><uri>http://www.blogger.com/profile/16818266186067526483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://1.bp.blogspot.com/__edOJxPil9I/SU_SuuMZOCI/AAAAAAAAAMc/07vMOxRVNXs/S220/jack.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1217940212044267912.post-7248084932224516649</id><published>2011-07-30T08:52:00.002+10:00</published><updated>2011-07-30T08:57:15.901+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cloud'/><category scheme='http://www.blogger.com/atom/ns#' term='azure'/><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><title type='text'>To The Cloud!</title><content type='html'>&lt;p&gt;First of all, what a great job Marketing has done with The Cloud.&amp;#160; Nobody knows what the hell it means, but everyone seems motivated to get on the cloud, somehow, anyhow.&amp;#160; At the heart of the cloud is a big secret that is easily glossed over&amp;#160; – the cloud is nothing new at all, just more of the same - big servers, centralised access, the same ideas that computing has been using from day one (there used to be mainframes that took up an entire office suite, now modern computers live in giant &lt;a href="http://cloud5.windows7news.com/wp-content/uploads/2011/06/Azure-datacente3r.jpg?d68ee5"&gt;warehouses out in the sticks&lt;/a&gt;.&amp;#160; That right there is 50 years of Progress).&lt;/p&gt;  &lt;p&gt;Aside from the brief and increasingly irrelevant “PC revolution” (the idea that large clusters of small machines would be cheaper than one large mainframe – an idea carefully promulgated by Microsoft and other interested parties), computing has always been a big business kind of thing to do, with big business efficiency gains of centralization and commodification the driving forces behind the push for cloud services.&lt;/p&gt;  &lt;p&gt;Anyway, I too partook the cool aid and moved &lt;a href="http://askbluey.com/"&gt;Ask Bluey&lt;/a&gt; to the cloud this year, from it’s previous home on shared hosting.&amp;#160; Shared hosting was actually surprisingly efficient and cost effective – it was able to accommodate thousands of visitors a day, but it was most definitely grinding to a halt when you threw in web crawlers, which accounted for around half of the traffic to the website).&lt;/p&gt;  &lt;p&gt;The premise of being able to scale out Ask Bluey as traffic ebbed and flowed was hard to resist, but the reality is that architecting for the cloud really quite difficult to get right (although the end result is “better”, in the same way that truly cross platform C++ code feels “better” than code with implicit assumptions about bit alignment, or god forbid, non standard compiler extensions).&lt;/p&gt;  &lt;p&gt;The first big mistake I made was buying into the NO SQL movement’s claim that the future of databases lay in non relational databases.&amp;#160; The idea is that you still have tables to put your structured data into, but that you have to manage the keyed links between these tables yourself (while a SQL database enforces referential integrity on your behalf).&amp;#160; What you gain is that these tables can be partitioned across machines, which means that they scale out better.&amp;#160; Maybe.&lt;/p&gt;  &lt;p&gt;What I didn’t realise is that the “table storage” that the cloud providers offer is not NO SQL, but some weird hybrid of blob storage with two keys rather than one.&amp;#160; While it would certainly be possible to use table storage instead of a SQL database, it is not a good idea for two reasons.&amp;#160; First of all, the performance is not very good.&amp;#160; I found a table based lookup to take twice as long compared to a blob based lookup, which is an order of magnitude slower than a local disk based retrieval.&amp;#160; When you have to retrieve from multiple tables and deal with “upsert” semantics, the performance penalties are cumulative and prohibitive.&lt;/p&gt;  &lt;p&gt;The second reason to use SQL over table storage is that you have to pay for each transaction.&amp;#160; They are billed in blocks of 10,000 per cent, so they sound so cheap that you don’t have to think too hard about them.&amp;#160; But they can add up!&amp;#160; In one month my “table storage” architecture blew $250 on these seemingly insignificant transactions.&amp;#160; Once I had moved back to SQL, the same usage pattern cost $10 per month, as SQL databases are billed on instance size rather than per transaction.&lt;/p&gt;  &lt;p&gt;Table storage still has a place in a cloud based architecture, but it only really makes sense in a few limited scenarios.&amp;#160; An ideal usage would be an archive of tweets on a per user basis.&amp;#160; The partition key is on the user, and the row key is the date.&amp;#160; Buy keeping these large wads of data out of the database the SQL instance size is kept down, and the performance penalty becomes less important because of the “archive” aspects.&amp;#160; Obviously nobody wants their entire twitter history every single day, but it might be useful to get once or twice a year (the most recent tweets could be in the SQL database).&lt;/p&gt;  &lt;p&gt;In this the way table storage becomes ancillary to a good old fashioned SQL database and again nothing has really changed in any aspect of computing, despite the hype.&amp;#160; In some ways this is reassuring ; )&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1217940212044267912-7248084932224516649?l=www.jackdermody.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jackdermody.net/feeds/7248084932224516649/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1217940212044267912&amp;postID=7248084932224516649' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1217940212044267912/posts/default/7248084932224516649'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1217940212044267912/posts/default/7248084932224516649'/><link rel='alternate' type='text/html' href='http://www.jackdermody.net/2011/07/to-cloud.html' title='To The Cloud!'/><author><name>Jack Dermody</name><uri>http://www.blogger.com/profile/16818266186067526483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://1.bp.blogspot.com/__edOJxPil9I/SU_SuuMZOCI/AAAAAAAAAMc/07vMOxRVNXs/S220/jack.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1217940212044267912.post-5973546780438467973</id><published>2011-07-04T09:45:00.001+10:00</published><updated>2011-07-04T10:03:04.521+10:00</updated><title type='text'>First post in a Long Time</title><content type='html'>&lt;p&gt;This is the obligatory – wow, it’s been years since I last posted.&amp;#160; In the last two (2!) years I have gotten married, become the father of a rather lovely daughter, moved closer to the beach, and launched a large and ambitious&amp;#160; project (&lt;a href="http://askbluey.com"&gt;Ask Bluey&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;I feel it’s time to pause, reflect and record - and blogging seems a perfect way to approach that.&lt;/p&gt;  &lt;p&gt;So stay posted…&lt;/p&gt;  &lt;p&gt;; )&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1217940212044267912-5973546780438467973?l=www.jackdermody.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jackdermody.net/feeds/5973546780438467973/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1217940212044267912&amp;postID=5973546780438467973' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1217940212044267912/posts/default/5973546780438467973'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1217940212044267912/posts/default/5973546780438467973'/><link rel='alternate' type='text/html' href='http://www.jackdermody.net/2011/07/testing.html' title='First post in a Long Time'/><author><name>Jack Dermody</name><uri>http://www.blogger.com/profile/16818266186067526483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://1.bp.blogspot.com/__edOJxPil9I/SU_SuuMZOCI/AAAAAAAAAMc/07vMOxRVNXs/S220/jack.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1217940212044267912.post-9054614334031479375</id><published>2009-05-19T17:00:00.003+10:00</published><updated>2009-05-19T17:04:14.483+10:00</updated><title type='text'>New Article on CodeProject - Search3D</title><content type='html'>In &lt;a href="http://www.codeproject.com/KB/smart/Search3D.aspx"&gt;this article&lt;/a&gt; I talk about how you can use Singular Value Decomposition and Latent Semantic Analysis to cluster documents and to reduce multi-dimensional data down to three dimensions, which is visualisable in a 3D viewer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1217940212044267912-9054614334031479375?l=www.jackdermody.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jackdermody.net/feeds/9054614334031479375/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1217940212044267912&amp;postID=9054614334031479375' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1217940212044267912/posts/default/9054614334031479375'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1217940212044267912/posts/default/9054614334031479375'/><link rel='alternate' type='text/html' href='http://www.jackdermody.net/2009/05/new-article-on-codeproject-search3d.html' title='New Article on CodeProject - Search3D'/><author><name>Jack Dermody</name><uri>http://www.blogger.com/profile/16818266186067526483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://1.bp.blogspot.com/__edOJxPil9I/SU_SuuMZOCI/AAAAAAAAAMc/07vMOxRVNXs/S220/jack.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1217940212044267912.post-5342588668883501943</id><published>2009-05-15T11:59:00.003+10:00</published><updated>2009-05-15T12:09:20.675+10:00</updated><title type='text'>Back Button in RIA (Rich Internet Applications)</title><content type='html'>There is an inherent problem with the technologies that herald the advance of the internet from static text to "rich" applications (applications built using AJAX, Flash, Silverlight, etc) - they all "break" the back button.&lt;br /&gt;&lt;br /&gt;No longer can a user naturally go back to the previous page (or state) unless RIA applications do a lot of work to enable this seemingly simple interaction.&lt;br /&gt;&lt;br /&gt;I just wrote &lt;a href="http://www.codeproject.com/KB/silverlight/SilverBrowserNavigation.aspx"&gt;an article on codeproject&lt;/a&gt; that describes one way of getting this done, using the YUI JavaScript library.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1217940212044267912-5342588668883501943?l=www.jackdermody.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jackdermody.net/feeds/5342588668883501943/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1217940212044267912&amp;postID=5342588668883501943' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1217940212044267912/posts/default/5342588668883501943'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1217940212044267912/posts/default/5342588668883501943'/><link rel='alternate' type='text/html' href='http://www.jackdermody.net/2009/05/back-button-in-ria-rich-internet.html' title='Back Button in RIA (Rich Internet Applications)'/><author><name>Jack Dermody</name><uri>http://www.blogger.com/profile/16818266186067526483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://1.bp.blogspot.com/__edOJxPil9I/SU_SuuMZOCI/AAAAAAAAAMc/07vMOxRVNXs/S220/jack.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1217940212044267912.post-39149494509168065</id><published>2009-04-23T08:00:00.006+10:00</published><updated>2011-05-25T16:42:15.320+10:00</updated><title type='text'>Vector Spaces</title><content type='html'>&lt;a href="http://4.bp.blogspot.com/__edOJxPil9I/SbD4S9KubsI/AAAAAAAAARo/bjf8r699PNk/s1600-h/boat2.jpg"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5310016965210697410" src="http://4.bp.blogspot.com/__edOJxPil9I/SbD4S9KubsI/AAAAAAAAARo/bjf8r699PNk/s200/boat2.jpg" style="cursor: hand; cursor: pointer; float: right; height: 155px; margin: 0 0 10px 10px; width: 200px;" /&gt;&lt;/a&gt;I was at a semantic conference last year and for me one of the standout presentations was&amp;nbsp;&lt;a href="http://nlp.cs.nyu.edu/sk-symposium/slides/PeterTurney.pdf"&gt;Peter Turney&lt;/a&gt; talking about the application of vectors to semantics and how they represent a kind of analog signal versus the digital crispness of AI logic and how you can use both kinds of logic and kind of move between the two to overcome the limitations associated with either one.&lt;br /&gt;&lt;br /&gt;I've been using &lt;a href="http://en.wikipedia.org/wiki/Latent_semantic_analysis"&gt;vector space techniques&lt;/a&gt; a lot since then and it turns out that they are indeed a useful tool to keep around.&lt;br /&gt;&lt;br /&gt;Vectors provide a means to compare multivariate data in a relative way.  Sorting on one variable at a time is easy with computers, but to sort by many at once requires some thought.  Linear algebra provides some creative techniques to manipulate and gain other insights into your multivariate data, such as singular value decomposition, which leads to &lt;a href="http://en.wikipedia.org/wiki/Latent_semantic_analysis"&gt;latent semantic analysis&lt;/a&gt;, wherein a reduction of dimensions can create insight into the data itself.&lt;br /&gt;&lt;br /&gt;The other great thing about vector spaces is how imaginative you can be with how you use them.  They essentially lend themselves to any kind of comparison or computation.  All you need to do is stick your data into the matrix, normalise it intelligently and you can derive patterns and relationships from that data that you wouldn't have seen otherwise.&lt;br /&gt;&lt;br /&gt;I started playing around with vector spaces with term/document or document/term matrices - generated by counting the words in a list of documents and putting the counts of each word per document in a row or column of your matrix.  Then, so that long documents don't rank higher than shorter documents (with smaller word counts) the values are normalised with a &lt;a href="http://en.wikipedia.org/wiki/Tf%E2%80%93idf"&gt;term frequency/inverse document frequency&lt;/a&gt; (tf-idf). &amp;nbsp;At which point we can start comparing documents based on the &lt;a href="http://en.wikipedia.org/wiki/Cosine_similarity"&gt;cosine similarity&lt;/a&gt; of the document vectors.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1217940212044267912-39149494509168065?l=www.jackdermody.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jackdermody.net/feeds/39149494509168065/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1217940212044267912&amp;postID=39149494509168065' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1217940212044267912/posts/default/39149494509168065'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1217940212044267912/posts/default/39149494509168065'/><link rel='alternate' type='text/html' href='http://www.jackdermody.net/2009/04/vector-spaces.html' title='Vector Spaces'/><author><name>Jack Dermody</name><uri>http://www.blogger.com/profile/16818266186067526483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://1.bp.blogspot.com/__edOJxPil9I/SU_SuuMZOCI/AAAAAAAAAMc/07vMOxRVNXs/S220/jack.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/__edOJxPil9I/SbD4S9KubsI/AAAAAAAAARo/bjf8r699PNk/s72-c/boat2.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1217940212044267912.post-5515635800740778382</id><published>2009-03-24T12:03:00.002+11:00</published><updated>2009-05-15T12:08:46.885+10:00</updated><title type='text'>Search Result Clustering with Non Negative Matrix Factorisation</title><content type='html'>Non negative matrix factorisation. Wow, what a mouthful! Simply put, it's a technique to find two matrices (a features and weights matrix) that when multiplied together will reasonably approximate the original matrix.&lt;br /&gt;&lt;br /&gt;Conveniently, the features matrix can be used to group or cluster rows in the original matrix that relate to terms or documents.&lt;br /&gt;&lt;br /&gt;An &lt;a href="http://www.codeproject.com/KB/WPF/NNMFSearchResultClusterin.aspx"&gt;article on codeproject&lt;/a&gt; explains it all in graphic detail...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1217940212044267912-5515635800740778382?l=www.jackdermody.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jackdermody.net/feeds/5515635800740778382/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1217940212044267912&amp;postID=5515635800740778382' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1217940212044267912/posts/default/5515635800740778382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1217940212044267912/posts/default/5515635800740778382'/><link rel='alternate' type='text/html' href='http://www.jackdermody.net/2009/03/search-result-clustering-with-non.html' title='Search Result Clustering with Non Negative Matrix Factorisation'/><author><name>Jack Dermody</name><uri>http://www.blogger.com/profile/16818266186067526483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://1.bp.blogspot.com/__edOJxPil9I/SU_SuuMZOCI/AAAAAAAAAMc/07vMOxRVNXs/S220/jack.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1217940212044267912.post-6967552185038144940</id><published>2009-03-01T09:48:00.005+11:00</published><updated>2009-03-06T21:18:25.039+11:00</updated><title type='text'>Whole Earth Catalog</title><content type='html'>&lt;a href="http://4.bp.blogspot.com/__edOJxPil9I/SbD4JxIq8HI/AAAAAAAAARg/TgPPJfg075Q/s1600-h/france2.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 200px; height: 180px;" src="http://4.bp.blogspot.com/__edOJxPil9I/SbD4JxIq8HI/AAAAAAAAARg/TgPPJfg075Q/s200/france2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5310016807362031730" /&gt;&lt;/a&gt;I found a copy of this in my parents house yesterday dating back to 1972 and was it a blast from the past! Definitely a pre-cursor to the semi rambling nature of the internet today, but shaped by a definite editorial bias that is never really made explicit but of certain primary interest to people living in communes, nomads and hippies.&lt;br /&gt;&lt;br /&gt;In case you haven't seen one first hand, it is a BIG catalog that reviews products and tells you how to get mail order catalogs from "recommended suppliers" to enable a self-sufficient lifestyle, outside the flow of big bad business entities. I guess that was a very self-empowering concept before the internet existed - that you could live your life without ever dealing with any perceived awful tackiness of malls, of bland advertising, of empty promises.&lt;br /&gt;&lt;br /&gt;The "tools" that it recommends are seemingly random, and joined with strange short stories, (or is it a novel?) that tie the pages together. It's one of those things that you either say "genius!" or "what rubbish!" depending on your personal proclivities.&lt;br /&gt;&lt;br /&gt;I wonder if the internet has really replaced the notion of a "Whole Earth Catalog" or if there is still a need for an editorialised lense, a sense of common purpose and ideology amidst the unfathomable scale of the internet today?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1217940212044267912-6967552185038144940?l=www.jackdermody.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jackdermody.net/feeds/6967552185038144940/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1217940212044267912&amp;postID=6967552185038144940' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1217940212044267912/posts/default/6967552185038144940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1217940212044267912/posts/default/6967552185038144940'/><link rel='alternate' type='text/html' href='http://www.jackdermody.net/2009/03/whole-earth-catalog.html' title='Whole Earth Catalog'/><author><name>Jack Dermody</name><uri>http://www.blogger.com/profile/16818266186067526483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://1.bp.blogspot.com/__edOJxPil9I/SU_SuuMZOCI/AAAAAAAAAMc/07vMOxRVNXs/S220/jack.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/__edOJxPil9I/SbD4JxIq8HI/AAAAAAAAARg/TgPPJfg075Q/s72-c/france2.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1217940212044267912.post-5152156120293710892</id><published>2009-02-14T16:49:00.001+11:00</published><updated>2011-05-25T16:51:26.706+10:00</updated><title type='text'></title><content type='html'>Ice Blue Digital has released &lt;a href="http://worldtcg.net/wordnet/"&gt;Wordnet 3.0 Search&lt;/a&gt;, a free online dictionary.&lt;br /&gt;&lt;br /&gt;There is an obvious paradox to the concept of a dictionary - single words can have multiple meanings and dictionaries use words to define the definition of other words.  For example, the humble word "word" has at least ten definitions:&lt;br /&gt;&lt;br /&gt;1. a unit of language that native speakers can identify; "words are the blocks from which sentences are made"; "he hardly said ten words all morning"&lt;br /&gt;2. a brief statement; "he didn't say a word about it"&lt;br /&gt;3. new information about specific and timely events; "they awaited news of the outcome"&lt;br /&gt;4. the divine word of God; the second person in the Trinity (incarnate in Jesus)&lt;br /&gt;5. a promise; "he gave his word"&lt;br /&gt;6. a secret word or phrase known only to a restricted group; "he forgot the password"&lt;br /&gt;7. an exchange of views on some topic; "we had a good discussion"; "we had a word or two about it"&lt;br /&gt;8. the sacred writings of the Christian religions; "he went to carry the Word to the heathen"&lt;br /&gt;9. a verbal command for action; "when I give the word, charge!"&lt;br /&gt;10. a word is a string of bits stored in computer memory; "large computers use words up to 64 bits long"&lt;br /&gt;&lt;br /&gt;It is only through context that we can understand these definitions, a contextual awareness that has taken years and years for all of us to develop and that depends on everyone reaching more or less the same set of contextual word meanings.&lt;br /&gt;&lt;br /&gt;From the perspective of a computer or a non-native speaker, this web of associations can seem arbitary and not immediately apparent.  But today arrives a solution!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://wordnet.princeton.edu/"&gt;Wordnet 3.0&lt;/a&gt;, combined with the &lt;a href="http://wordnet.princeton.edu/glosstag"&gt;Princeton Wordnet Gloss Corpus&lt;/a&gt; has created an exact mapping between each word in the dictionary's definition with the exact semantic definition of the word &lt;i&gt;used in that context&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://worldtcg.net/wordnet/t"&gt;Try it out&lt;/a&gt; and decide for yourself if this free, ad-free dictionary is better than the other dictionaries out there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1217940212044267912-5152156120293710892?l=www.jackdermody.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jackdermody.net/feeds/5152156120293710892/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1217940212044267912&amp;postID=5152156120293710892' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1217940212044267912/posts/default/5152156120293710892'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1217940212044267912/posts/default/5152156120293710892'/><link rel='alternate' type='text/html' href='http://www.jackdermody.net/2009/02/dog-blue-software-has-released-wordnet.html' title=''/><author><name>Jack Dermody</name><uri>http://www.blogger.com/profile/16818266186067526483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://1.bp.blogspot.com/__edOJxPil9I/SU_SuuMZOCI/AAAAAAAAAMc/07vMOxRVNXs/S220/jack.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1217940212044267912.post-8657628413808334116</id><published>2009-02-09T08:54:00.001+11:00</published><updated>2009-02-27T08:16:19.334+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AJAX'/><category scheme='http://www.blogger.com/atom/ns#' term='wordnet'/><category scheme='http://www.blogger.com/atom/ns#' term='dictionary'/><title type='text'>Wordnet 3.0 Web Interface</title><content type='html'>For those that don't know about it (which usually means people not active in the NLP/Semantic space) &lt;a href="http://wordnet.princeton.edu/"&gt;Wordnet&lt;/a&gt; is a free dictionary created by Princeton that is based on a theory of how the brain organises words.  There are numerous semantic links between words, and nouns and verbs are arranged in an ontology that ranges from abstract ideas at the top through to specific ideas at the bottom.&lt;br /&gt;&lt;br /&gt;While not really intended as an NLP resource, it has become useful in semantic applications exactly due this hierachy of concepts (if it is known that "a beach house can catch fire" an AI program with wordnet can effortlessly produce the generalisation that "houses can catch fire").&lt;br /&gt;&lt;br /&gt;Recently, the same group at Princeton have created a "semantically annotated gloss corpus" (SACG) in which the definitions of each word are cross-linked to the exact semantic definition of each word.  This has long been considered a useful exercise as semantically tagged data is in a woefully short supply, and moreover, such a cross-linked semantic dictionary should in theory aid in semantic disambiguation tasks.&lt;br /&gt;&lt;br /&gt;Both Wordnet 3.0 and the SACG &lt;a href="http://dogbluesoftware.com/wordnet"&gt;are now available from a web based interface&lt;/a&gt; that combines wordnet lookups and definitions with the full range of semantic links and the SACG, whereby the parts of speech and semantic defintion of each word in the definitions (or gloss) are expressed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1217940212044267912-8657628413808334116?l=www.jackdermody.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jackdermody.net/feeds/8657628413808334116/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1217940212044267912&amp;postID=8657628413808334116' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1217940212044267912/posts/default/8657628413808334116'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1217940212044267912/posts/default/8657628413808334116'/><link rel='alternate' type='text/html' href='http://www.jackdermody.net/2009/02/wordnet-30-web-interface.html' title='Wordnet 3.0 Web Interface'/><author><name>Jack Dermody</name><uri>http://www.blogger.com/profile/16818266186067526483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://1.bp.blogspot.com/__edOJxPil9I/SU_SuuMZOCI/AAAAAAAAAMc/07vMOxRVNXs/S220/jack.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1217940212044267912.post-6011068671287813726</id><published>2008-11-17T00:38:00.001+11:00</published><updated>2009-02-27T08:16:38.230+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='semantic'/><title type='text'>Semantic Symposium at NYU</title><content type='html'>Since I was in Manhattan at the time, I attended &lt;a href="http://nlp.cs.nyu.edu/sk-symposium/index.html"&gt;this really cool event&lt;/a&gt;, which featured lots of really smart people basically knocking their heads against the (intractable) problem of AI reasoning based on doing entailment from semantic knowledge, obtained from texts.&lt;br /&gt;&lt;br /&gt;It was fascinating to see the attacks that everyone was using to try to slay the dragon. Just about every approach you could imagine was presented. Everyone with something concrete was susceptible to questions - how do you deal with temporality, what about metaphor, etc - to which they would say, "I haven't thought about that yet", or even better, "well we haven't considered these issues yet, but we are about to field test out system with a large company and so we will soon know if it works".&lt;br /&gt;&lt;br /&gt;The emperor truly has no clothes.&lt;br /&gt;&lt;br /&gt;Still, for someone with lesser goals (a tool to support human reasoning) the mechanics that were presented were fascinating.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1217940212044267912-6011068671287813726?l=www.jackdermody.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jackdermody.net/feeds/6011068671287813726/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1217940212044267912&amp;postID=6011068671287813726' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1217940212044267912/posts/default/6011068671287813726'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1217940212044267912/posts/default/6011068671287813726'/><link rel='alternate' type='text/html' href='http://www.jackdermody.net/2008/11/semantic-symposium-at-nyu.html' title='Semantic Symposium at NYU'/><author><name>Jack Dermody</name><uri>http://www.blogger.com/profile/16818266186067526483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://1.bp.blogspot.com/__edOJxPil9I/SU_SuuMZOCI/AAAAAAAAAMc/07vMOxRVNXs/S220/jack.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1217940212044267912.post-2738418952649487350</id><published>2008-10-31T05:54:00.000+11:00</published><updated>2008-10-31T05:56:30.389+11:00</updated><title type='text'>Currently Travelling</title><content type='html'>My blog posts have transmogrified into travel entries as I am currently circumnavigating the globe.  &lt;a href="http://www.jackjannie.blogspot.com"&gt;Here&lt;/a&gt; for more details...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1217940212044267912-2738418952649487350?l=www.jackdermody.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jackdermody.net/feeds/2738418952649487350/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1217940212044267912&amp;postID=2738418952649487350' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1217940212044267912/posts/default/2738418952649487350'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1217940212044267912/posts/default/2738418952649487350'/><link rel='alternate' type='text/html' href='http://www.jackdermody.net/2008/10/currently-travelling.html' title='Currently Travelling'/><author><name>Jack Dermody</name><uri>http://www.blogger.com/profile/16818266186067526483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://1.bp.blogspot.com/__edOJxPil9I/SU_SuuMZOCI/AAAAAAAAAMc/07vMOxRVNXs/S220/jack.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1217940212044267912.post-6230600520442766414</id><published>2008-09-03T09:54:00.001+10:00</published><updated>2009-02-27T08:16:58.956+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='genetic algorithm'/><title type='text'>A Vision of Life</title><content type='html'>There's an &lt;a href="http://www.codeproject.com/KB/game/AI_Life.aspx"&gt;article on CodeProject&lt;/a&gt; that shows a genetic algorithm tuning a neural network to simulate "ants" finding food. The ants start out kind of dumb, just milling around aimlessly (or more accurately, randomly). But some ants randomly have better food collection strategies (small direction changes, fast velocity) that means they collect more food than the other ants. At the end of each "generation" the low scoring ants are unceremoniously removed from the gene pool and the high scoring ants spread their successful food gathering strategies to their ancestors.&lt;br /&gt;&lt;br /&gt;It's a grim view of life really. Are we all nothing more than the bearers of a successful food gathering strategy that has been passed down through the generations? Apart from the random droppings of food in the simulation and the ants' disturbing mechanical persistence at finding more and more of it, there is only darkness.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1217940212044267912-6230600520442766414?l=www.jackdermody.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jackdermody.net/feeds/6230600520442766414/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1217940212044267912&amp;postID=6230600520442766414' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1217940212044267912/posts/default/6230600520442766414'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1217940212044267912/posts/default/6230600520442766414'/><link rel='alternate' type='text/html' href='http://www.jackdermody.net/2008/09/vision-of-life.html' title='A Vision of Life'/><author><name>Jack Dermody</name><uri>http://www.blogger.com/profile/16818266186067526483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://1.bp.blogspot.com/__edOJxPil9I/SU_SuuMZOCI/AAAAAAAAAMc/07vMOxRVNXs/S220/jack.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1217940212044267912.post-5337339941342994959</id><published>2008-09-02T17:43:00.001+10:00</published><updated>2009-02-27T08:17:28.418+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='semantic'/><category scheme='http://www.blogger.com/atom/ns#' term='semantic search'/><category scheme='http://www.blogger.com/atom/ns#' term='dog blue software'/><title type='text'>Semantics and Search</title><content type='html'>Right now I am working on different projects at &lt;a href="http://www.dogbluesoftware.com/"&gt;Dog Blue Software&lt;/a&gt; that revolve around natural language processing and applying it to Internet search. Natural language processing looks at how all the words on a page are used in sentences and giving the computer some idea about what all those words mean (the semantics).&lt;br /&gt;&lt;br /&gt;Working with information from the Internet is challenging on a number of levels. There is the amount of data. There are the limitations of the interface. There are the multiple languages and idioms.&lt;br /&gt;&lt;br /&gt;Some people talk about "The Semantic Web" as some kind of saviour to the problem of sifting through large amounts of unstructured data. &lt;a href="http://www.shirky.com/writings/semantic_syllogism.html"&gt;Clay Shirky neatly critiques&lt;/a&gt; the limitations of such a concept, even if it were to coalesce into being.&lt;br /&gt;&lt;br /&gt;Rather than a simplistic solution - "we'll just ask everyone to become an Internet librarian" - or Google's needle in the haystack solution - "we'll give you ten needles that everybody already knows about, you can forget about all the other ones" - the solution to navigating large information spaces will probably require a level of sophistication bordering on artificial intelligence.&lt;br /&gt;&lt;br /&gt;But until then, letting the computer find the meaning of text rather than its representation is an idea that seems to have promise.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1217940212044267912-5337339941342994959?l=www.jackdermody.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.jackdermody.net/feeds/5337339941342994959/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1217940212044267912&amp;postID=5337339941342994959' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1217940212044267912/posts/default/5337339941342994959'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1217940212044267912/posts/default/5337339941342994959'/><link rel='alternate' type='text/html' href='http://www.jackdermody.net/2008/09/semantics-and-search.html' title='Semantics and Search'/><author><name>Jack Dermody</name><uri>http://www.blogger.com/profile/16818266186067526483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://1.bp.blogspot.com/__edOJxPil9I/SU_SuuMZOCI/AAAAAAAAAMc/07vMOxRVNXs/S220/jack.jpg'/></author><thr:total>0</thr:total></entry></feed>
