<?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-3902784927093335627</id><updated>2012-02-16T09:06:19.160Z</updated><title type='text'>Between My Ears</title><subtitle type='html'>Unfinished Thoughts, Saving the World, and Other Noise</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://andothernoise.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3902784927093335627/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://andothernoise.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Alexandros Marinos</name><uri>https://profiles.google.com/102444151383927290867</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-ZAcdFHVCst8/AAAAAAAAAAI/AAAAAAAAAAA/gX8EqUFM7oA/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>12</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3902784927093335627.post-4398442853151764446</id><published>2012-01-29T09:47:00.000Z</published><updated>2012-01-31T19:27:44.624Z</updated><title type='text'>Solving Causes' Levenshtein Distance challenge in Python, the Sequel</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;br /&gt;The 3 faithful readers of this blog have probably seen my previous attempt at cracking Causes' Levenshtein distance challenge. It all went well until Adam Derewecki of Causes commented with the following:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;...Pretty good solution though, about 15s on our benchmark machine. Record is 11.3s if you're up to the challenge :)&lt;/blockquote&gt;At first I was like "Yeah right, mate, you're not roping -me- in with that one, I have a startup to run." But the predictable engineer's mind just couldn't let it go. How could someone have done about 30% better in Python? What was I missing? So, I started hacking at the code again. Turns out (surprise!) I was missing quite a bit. Let's start with putting the original code up for you to see:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: python"&gt;import string&lt;br /&gt;w = set(open("00wordlist.txt").read().splitlines())&lt;br /&gt;f, nf = set(), set(["causes"])&lt;br /&gt;&lt;br /&gt;#from b, yield all unused words where levdist==1&lt;br /&gt;def nextgen(b):&lt;br /&gt;&amp;nbsp; &amp;nbsp; for i in range(len(b)): #for each index in b&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for c in string.ascii_lowercase: #for letters [a..z]&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if c != b[i]:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; #substitute b[i] with c&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if b[:i] + c + b[i+1:] in w:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; yield b[:i] + c + b[i+1:]&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; #inject c before b[i]&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if b[:i] + c + b[i:] in w:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; yield b[:i] + c + b[i:]&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; #remove b[i]&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if b[:i] + b[i+1:] in w: yield b[:i] + b[i+1:]&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; for c in string.ascii_lowercase: #for letters [a..z]&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if b + c in w: yield b + c #append c after b&lt;br /&gt;&lt;br /&gt;while len(nf):&lt;br /&gt;&amp;nbsp; &amp;nbsp; cf = nf&lt;br /&gt;&amp;nbsp; &amp;nbsp; nf = set([j for i in cf for j in nextgen(i) if j not in f])&lt;br /&gt;&amp;nbsp; &amp;nbsp; w -= nf&lt;br /&gt;&amp;nbsp; &amp;nbsp; f |= nf&lt;br /&gt;&lt;br /&gt;print len(f)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;First, Adam's suggestion was very good by itself. Why write this:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: python"&gt;nf = set([j for i in cf&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for j in nextgen(i) &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if j not in f])&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;when you can omit the intermediate array and just write this:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: python"&gt;nf = set(j for i in cf &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for j in nextgen(i) &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if j not in f)&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;But it gets better. Since I subtract nf from w, from where the values are sourced, why even check if j not in f? No reason. So, we end up with the much more palatable:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: python"&gt;nf = set(j for i in cf for j in nextgen(i))&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;After improving that line, I noticed that I had a line above that was doing absolutely nothing whatsoever:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: python"&gt;cf = nf&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This line simply betrays my uncertainty about how python's comprehensions work. It turns out the next line can be simply written as follows, with no need to ever declare cf at all.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: python"&gt;nf = set(j for i in nf for j in nextgen(i))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Next up, let's look at the little optimisation I had in line 9:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: python"&gt;if c != b[i]:&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Here I used a whole line to check that I wasn't going to be doing any useless checks. Even though I was aiming for small code. Even though Python has O(1) membership testing. When I looked again at the code and doubted my own premature optimisation, the results were damning: The test cost more time than it saved. Removing that line yields a speed improvement.&lt;br /&gt;&lt;br /&gt;All these improvements were small. They saved 1-2 seconds over the total of 25 seconds it takes on my laptop. The big improvement came when I tried the technique seen in this stackoverflow answer. Interrupting the program while running for a few times indicated the culprit. The constant use of the slicing operation was not doing me any favours. For every given letter and every position in a string I did operations like this:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: python"&gt;if b[:i] + c + b[i+1:] in w:&lt;br /&gt;&amp;nbsp; &amp;nbsp; yield b[:i] + c + b[i+1:]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;That's 4 slice operations, and actually this is done twice for a total of 8 per letter. So I decided to do the slicing only once per position, assign the results to variables and use those for each letter. That sped things up enormously. It brought runtime from slightly under 23 to well under 17 seconds.&lt;br /&gt;&lt;br /&gt;UPDATE: After some impromptu after-work tinkering with my co-founder Pagan, we realised Python iterates over lists faster than over strings, which means that adding the line&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: python"&gt;letters = list(string.ascii_lowercase)&lt;/pre&gt;&lt;br /&gt;to the setup part of the code speeds things up by a cool 4%.&lt;br /&gt;&lt;br /&gt;All these improvements add up to 1/3 of the total running time. Since Adam said that my programme ran for 15 seconds on the benchmark machine, while the best Python they had ran at 11.3, I suspect this may be enough to beat the frontrunner. Now I just have to get Adam to test this one again.&lt;br /&gt;&lt;br /&gt;Another change I did is improve the horrible variable naming I had last time around, and also add a few more comments. I also was very strict about keeping lines under 65 characters in length. So here is the resulting program:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: python"&gt;import string&lt;br /&gt;words = set(open("00wordlist.txt").read().splitlines())&lt;br /&gt;frnds, newfrnds = set(), set(["causes"])&lt;br /&gt;letters = list(string.ascii_lowercase)&lt;br /&gt;&lt;br /&gt;#from word wd, yield all unused words where levdist==1&lt;br /&gt;def freefrnds(wd):&lt;br /&gt;&amp;nbsp; &amp;nbsp; for i in range(len(wd)): #for each index in wd&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; wd_upto_i,wd_from_i,wd_after_i = wd[:i],wd[i:],wd[i+1:]&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for char in letters: #for letters [a..z]&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; #substitute wd[i] with char&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if wd_upto_i + char + wd_after_i in words:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; yield wd_upto_i + char + wd_after_i&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; #inject char before wd[i]&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if wd_upto_i + char + wd_from_i in words:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; yield wd_upto_i + char + wd_from_i&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; #remove wd[i] from word&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if wd_upto_i + wd_after_i in words:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; yield wd_upto_i + wd_after_i&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; for char in letters: #for letters [a..z]&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; #append char after word&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if wd + char in words: yield wd + char&lt;br /&gt;&lt;br /&gt;while len(newfrnds):&lt;br /&gt;&amp;nbsp; &amp;nbsp; newfrnds = set(j for i in newfrnds for j in freefrnds(i))&lt;br /&gt;&amp;nbsp; &amp;nbsp; frnds |= newfrnds #add newfrnds to the frnds set&lt;br /&gt;&amp;nbsp; &amp;nbsp; words -= newfrnds #remove list of newfrnds from words&lt;br /&gt;&lt;br /&gt;print len(frnds)&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3902784927093335627-4398442853151764446?l=andothernoise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andothernoise.blogspot.com/feeds/4398442853151764446/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3902784927093335627&amp;postID=4398442853151764446' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3902784927093335627/posts/default/4398442853151764446'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3902784927093335627/posts/default/4398442853151764446'/><link rel='alternate' type='text/html' href='http://andothernoise.blogspot.com/2012/01/solving-causes-levenshtein-distance.html' title='Solving Causes&apos; Levenshtein Distance challenge in Python, the Sequel'/><author><name>Alexandros Marinos</name><uri>https://profiles.google.com/102444151383927290867</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-ZAcdFHVCst8/AAAAAAAAAAI/AAAAAAAAAAA/gX8EqUFM7oA/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3902784927093335627.post-2049065509178726280</id><published>2011-11-03T16:28:00.002Z</published><updated>2011-11-04T12:39:24.729Z</updated><title type='text'>A 3-rectangle 17x17 grid</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;I've made no secret of my obsession with the &lt;a href="http://blog.computationalcomplexity.org/2009/11/17x17-challenge-worth-28900-this-is-not.html"&gt;17x17&lt;/a&gt; &lt;a href="http://bit-player.org/2009/the-17x17-challenge"&gt;challenge&lt;/a&gt;. I started working on it in November 2009 and went straight at it for six months. At that point I had to stop to code/write up my PhD but started working on it again as soon as I was done. This problem has given me a reason to learn so many amazing things in both math and programming, that I would be happy to have worked on it even if I never produced anything worthwhile. It's now a weekend project given that I run a startup, but, after almost 2 years, I have something to show the world: A grid with 3 rectangles.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;To be clear, this is not a solution. It would need to have 0 rectan&lt;span class="Apple-style-span" style="background-color: white;"&gt;gles to be a solution. But it is the least broken solution I know of. Bill Gasarch posted with the problem a 4-rectangle grid by&amp;nbsp;&lt;span class="Apple-style-span" style="color: #191919; line-height: 19px;"&gt;Rohan Puttagunta, but this has not been improved on since. &lt;a href="http://linbaba.wordpress.com/17x17-challenge/"&gt;Here&lt;/a&gt; is a leader board of the best grids known so far.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="background-color: white;"&gt;&lt;span class="Apple-style-span" style="color: #191919; font-family: Arial, Helvetica, sans-serif; line-height: 19px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="background-color: white;"&gt;&lt;span class="Apple-style-span" style="color: #191919; font-family: Arial, Helvetica, sans-serif; line-height: 19px;"&gt;This solution is less impressive than that one in that it's missing two cells rather than one, but it does have fewer rectangles when extended to a full colouring, which is what makes it interesting. Without further ado, the solution, with the rectangles marked out:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="background-color: white;"&gt;&lt;span class="Apple-style-span" style="color: #191919; font-family: Arial, Helvetica, sans-serif; line-height: 19px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-_Bj9JK3ukPk/TrLABUxbpWI/AAAAAAAAANQ/6_Ng9YEZOaY/s1600/Untitled.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/-_Bj9JK3ukPk/TrLABUxbpWI/AAAAAAAAANQ/6_Ng9YEZOaY/s320/Untitled.png" width="318" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="background-color: white;"&gt;&lt;span class="Apple-style-span" style="color: #191919; font-family: Arial, Helvetica, sans-serif; line-height: 19px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="background-color: white;"&gt;&lt;span class="Apple-style-span" style="color: #191919; font-family: Arial, Helvetica, sans-serif; line-height: 19px;"&gt;If anyone has code they want to use to analyse this, here it is again in a machine-friendlier format:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="background-color: white; font-family: Arial, Helvetica, sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: #191919;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; line-height: 19px;"&gt;4,2,1,3,1,2,3,4,4,1,2,4,2,1,4,3,3&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: #191919;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; line-height: 19px;"&gt;2,4,2,1,3,2,1,4,1,4,1,2,4,3,3,4,3&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: #191919;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; line-height: 19px;"&gt;1,2,4,1,3,1,3,4,3,1,4,2,3,4,2,2,4&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: #191919;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; line-height: 19px;"&gt;3,1,1,4,3,1,4,3,4,2,3,2,2,4,1,4,2&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: #191919;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; line-height: 19px;"&gt;1,3,3,3,3,3,4,2,2,4,1,4,2,1,1,2,4&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: #191919;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; line-height: 19px;"&gt;2,2,1,1,3,4,4,1,2,3,4,3,4,2,4,3,1&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: #191919;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; line-height: 19px;"&gt;3,1,3,4,4,4,3,4,1,1,2,3,1,2,3,2,2&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: #191919;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; line-height: 19px;"&gt;4,4,4,3,2,1,4,3,3,3,1,2,1,2,3,1,1&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: #191919;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; line-height: 19px;"&gt;4,1,3,4,2,2,1,3,2,4,4,1,3,1,2,3,1&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: #191919;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; line-height: 19px;"&gt;1,4,1,2,4,3,1,3,4,1,4,3,2,2,2,1,3&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: #191919;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; line-height: 19px;"&gt;2,1,4,3,1,4,2,1,4,4,3,3,3,3,2,1,2&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: #191919;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; line-height: 19px;"&gt;4,2,2,2,4,3,3,2,1,3,3,1,4,4,1,1,2&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: #191919;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; line-height: 19px;"&gt;2,4,3,2,2,4,1,1,3,2,3,4,1,4,1,2,3&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: #191919;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; line-height: 19px;"&gt;1,3,4,4,1,2,2,2,1,2,3,4,4,2,3,3,1&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: #191919;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; line-height: 19px;"&gt;4,3,2,1,1,4,3,3,2,2,2,1,1,3,2,4,4&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: #191919;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; line-height: 19px;"&gt;3,4,2,4,2,3,2,1,3,1,1,1,2,3,4,3,4&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: #191919;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; line-height: 19px;"&gt;3,3,4,2,4,1,2,1,1,3,2,2,3,1,4,4,3&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #191919; line-height: 19px;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #191919; line-height: 19px;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;In case anyone hasn't noticed, this solution is symmetric, i.e. colour(x,y) = colour(y,x) if you start numbering from the top left.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #191919; line-height: 19px;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #191919; line-height: 19px;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;I have a lot more to write about the solution and method, and I'm not yet done with this approach, but if I start writing up I may never publish this, so I'll just stop here for the moment.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #191919; line-height: 19px;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #191919; line-height: 19px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3902784927093335627-2049065509178726280?l=andothernoise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andothernoise.blogspot.com/feeds/2049065509178726280/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3902784927093335627&amp;postID=2049065509178726280' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3902784927093335627/posts/default/2049065509178726280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3902784927093335627/posts/default/2049065509178726280'/><link rel='alternate' type='text/html' href='http://andothernoise.blogspot.com/2011/11/3-rectangle-17x17-grid.html' title='A 3-rectangle 17x17 grid'/><author><name>Alexandros Marinos</name><uri>https://profiles.google.com/102444151383927290867</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-ZAcdFHVCst8/AAAAAAAAAAI/AAAAAAAAAAA/gX8EqUFM7oA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-_Bj9JK3ukPk/TrLABUxbpWI/AAAAAAAAANQ/6_Ng9YEZOaY/s72-c/Untitled.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3902784927093335627.post-8881109890309198115</id><published>2011-10-02T22:33:00.000+01:00</published><updated>2011-10-02T22:38:50.664+01:00</updated><title type='text'>An accidental survey of the Hacker News ecosystem</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;So my little &lt;a href="http://andothernoise.blogspot.com/2011/09/why-facebooks-frictionless-sharing.html"&gt;rant&lt;/a&gt; a week ago made a bit of a splash, briefly occupying the top of &lt;a href="http://news.ycombinator.com/"&gt;Hacker News&lt;/a&gt;. Looking at the inbound traffic, what surprised me was the variety in the HN ecosystem, particularly the alternative front ends that people use to access the HN stream.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Writing a HN front-end is an uncertain proposition: You only get to talk to your audience once - at launch. You don't have a viral loop, so users will most likely be within that initial spike, plus whatever you can get from word of mouth. There are a few &lt;a href="http://gilesbowkett.blogspot.com/2009/11/hacker-news-mashups.html"&gt;online&lt;/a&gt; &lt;a href="http://jacquesmattheij.com/The+Unofficial+HN+FAQ#altuis"&gt;listings&lt;/a&gt;, but then the question is how many will get to see those without a static link from HN. This is my attempt to bring a little more attention to these very cool but underappreciated projects.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;What I saw in the logs, is that at least 3% of the HN traffic came from alternative front ends. The number may seem small, but zooming into those visits reveals the surprising variety of ways people consume Hacker News. At this point I'd like to apologize to the coders of native apps: I can't see you in my logs, because there is no referrer in the traffic you sent my way. I know that 20%+ of the traffic I got is unaccounted for (and it damn sure wasn't 3600 people dropping in to see what's on my blog), but I can only guess where it came from. With that said, here's the situation, if my analytics dataset is to be trusted:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;The most popular alternative HN front-end is&amp;nbsp;&lt;a href="http://hckrnews.com/"&gt;hckrnews&lt;/a&gt;&amp;nbsp;by&amp;nbsp;&lt;a href="http://twitter.com/#!/wvl"&gt;@wvl&lt;/a&gt;, sending 69 visitors over.&amp;nbsp;hckrnews competes with the default front end head-to-head by offering multiple convenient ways to access the submissions. It is also well integrated with the Hacker News plugins made by the same author for Chrome and Safari.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; margin-left: 1em; margin-right: 1em;"&gt;&lt;a href="http://3.bp.blogspot.com/-uLvK4b_67T8/ToiLxIvjHqI/AAAAAAAAALY/XbvbLJ7kS1w/s1600/hckrnews.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="148" src="http://3.bp.blogspot.com/-uLvK4b_67T8/ToiLxIvjHqI/AAAAAAAAALY/XbvbLJ7kS1w/s320/hckrnews.png" width="320" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;a href="http://ihackernews.com/"&gt;iHackerNews&lt;/a&gt;&amp;nbsp;targets an unmet need, namely the lack of an official mobile website. iHackerNews is built by&amp;nbsp;&lt;a href="http://twitter.com/#!/ronnieroller"&gt;@ronnieroller&lt;/a&gt;&amp;nbsp;and also offers something else much requested of HN: an API. 51 visitors were iHackerNewsers.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; margin-left: 1em; margin-right: 1em;"&gt;&lt;a href="http://1.bp.blogspot.com/-u1xLUbj1fm8/ToiMrJkXGnI/AAAAAAAAALg/yx8I8JcMD5E/s1600/ihackernews.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="244" src="http://1.bp.blogspot.com/-u1xLUbj1fm8/ToiMrJkXGnI/AAAAAAAAALg/yx8I8JcMD5E/s320/ihackernews.png" width="320" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;The hardest to measure HN-alternative of sorts is&amp;nbsp;&lt;a href="http://twitter.com/#!/cperciva"&gt;@cperciva&lt;/a&gt;'s&amp;nbsp;&lt;a href="http://www.daemonology.net/hn-daily/"&gt;Hacker News Daily&lt;/a&gt;. The idea is simple: A feed with each day's 10 most upvoted submissions. It covers the need to know that even if you're gone for a day or two, you can still see the best posts when you come back. The reason it's hard to measure is that only a fraction of people go through the website, that sent 31 visits. I would expect most to consume this through the feed (as I do too). Google Reader tells me that Hacker News Daily has 1061 subscribers. That's significantly lower than the 36.564 subscribers to the main HN feed, but I suspect readers are much more likely to be engaged, since they get only one feed item per day.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; margin-left: 1em; margin-right: 1em;"&gt;&lt;a href="http://1.bp.blogspot.com/-728M9G-y3-c/ToiNDCRk_pI/AAAAAAAAALk/QC59Ut3Jjqg/s1600/hndaily.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="163" src="http://1.bp.blogspot.com/-728M9G-y3-c/ToiNDCRk_pI/AAAAAAAAALk/QC59Ut3Jjqg/s320/hndaily.png" width="320" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Another mobile-friendly front end is&amp;nbsp;&lt;a href="http://hn.gethifi.com/"&gt;hn.gethifi.com&lt;/a&gt;. As far as I can tell it's been made by&amp;nbsp;&lt;a href="http://twitter.com/#!/JoelSutherland"&gt;@JoelSutherland&lt;/a&gt;,&amp;nbsp;&lt;a href="http://twitter.com/#!/krisjordan"&gt;@KrisJordan&lt;/a&gt;&amp;nbsp;and the&amp;nbsp;&lt;a href="http://gethifi.com/"&gt;gethifi.com&lt;/a&gt;&amp;nbsp;team. While not as feature-complete as iHackerNews, I do prefer the look and feel which looks more tailored to a mobile device.&amp;nbsp;13 visitors came that way.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-uqfHGl27BpE/ToiOqUpVfHI/AAAAAAAAALo/XPvq1NToZXk/s1600/hngethifi.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-uqfHGl27BpE/ToiOqUpVfHI/AAAAAAAAALo/XPvq1NToZXk/s320/hngethifi.png" width="247" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman';"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;12 more visitors came through another mobile-optimized site,&amp;nbsp;&lt;a href="http://icombinator.net/"&gt;iCombinator.com&lt;/a&gt;. The selling point is the instapaper integration as well as its optimization for iPhones by using iUI.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; margin-left: 1em; margin-right: 1em;"&gt;&lt;a href="http://3.bp.blogspot.com/-q2jd4JB0eSY/ToiPaIs3bSI/AAAAAAAAALs/I9p60BNqUz4/s1600/icombinator.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-q2jd4JB0eSY/ToiPaIs3bSI/AAAAAAAAALs/I9p60BNqUz4/s320/icombinator.png" width="248" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;For the fans of a more traditional reading experience there is&amp;nbsp;&lt;a href="http://hacker-newspaper.gilesb.com/"&gt;Hacker Newspaper&lt;/a&gt;&amp;nbsp;by&amp;nbsp;&lt;a href="http://gilesbowkett.com/"&gt;Giles Bowkett&lt;/a&gt;. As you might expect, it renders the stories of the HN front page in a newspaper format. I imagine this would work quite well with a tablet. Hacker Newspaper sent 10 readers.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; margin-left: 1em; margin-right: 1em;"&gt;&lt;a href="http://4.bp.blogspot.com/-TupEMYovMnA/ToiQogWEM4I/AAAAAAAAALw/6Vl0SmryDfo/s1600/hackernewspaper.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://4.bp.blogspot.com/-TupEMYovMnA/ToiQogWEM4I/AAAAAAAAALw/6Vl0SmryDfo/s320/hackernewspaper.png" width="320" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&amp;nbsp;An interesting take on the HN frontpage is&amp;nbsp;&lt;a href="http://hnsort.com/"&gt;hnsort.com&lt;/a&gt;, which allows you to sort by points, comments, domain, submitter, and age amongst other things. 4 hnsorters showed up.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; margin-left: 1em; margin-right: 1em;"&gt;&lt;a href="http://2.bp.blogspot.com/-GI7XGlDpqjo/ToiRJ7C_cXI/AAAAAAAAAL0/4zWx8Ptj7pI/s1600/hnsort.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="116" src="http://2.bp.blogspot.com/-GI7XGlDpqjo/ToiRJ7C_cXI/AAAAAAAAAL0/4zWx8Ptj7pI/s320/hnsort.png" width="320" /&gt;&lt;/a&gt;&lt;/span&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;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Another 3 came via one of my favorites, &lt;a href="http://project.mahemoff.com/hn/"&gt;Hacker News Reader&lt;/a&gt;, which is a serverless app. This means that you download a static file that when executed on your browser, fetches the HN frontpage, parses it, and presents it in a different way. No server is involved, which means that if login was implemented, your credentials would never need to touch the developer's server. HN Reader is also installable as a Chrome Web App. While feature-limited, it looks optimized for mobile and also rocks instapaper integration.&amp;nbsp;Definitely one to keep an eye on.&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; margin-left: 1em; margin-right: 1em;"&gt;&lt;a href="http://1.bp.blogspot.com/-QZnw-EXYRWM/ToiR4GlyUtI/AAAAAAAAAL4/A6xd7ilzyzE/s1600/hnreader.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="142" src="http://1.bp.blogspot.com/-QZnw-EXYRWM/ToiR4GlyUtI/AAAAAAAAAL4/A6xd7ilzyzE/s320/hnreader.png" width="320" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Then there is the long tail: The alternative front ends that barely registered by sending a single user my way. Since there are so many projects in this list, I am sure I may have missed as many if not more that didn't send a user to my post.&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;There's&amp;nbsp;&lt;a href="http://fuhn.tk/"&gt;fuhn.tk&lt;/a&gt;, the only project that explains its mission with a&amp;nbsp;&lt;a href="http://fuhn.tk/ragecomic.png"&gt;rage comic&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; margin-left: 1em; margin-right: 1em;"&gt;&lt;a href="http://3.bp.blogspot.com/-z6JR1SIgmM4/Toijhnpk4EI/AAAAAAAAAL8/_Mq4dmENLCk/s1600/fuhn.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="280" src="http://3.bp.blogspot.com/-z6JR1SIgmM4/Toijhnpk4EI/AAAAAAAAAL8/_Mq4dmENLCk/s320/fuhn.png" width="320" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Then there’s &amp;nbsp;&lt;a href="http://hackernewsoverload.appspot.com/"&gt;HN overload&lt;/a&gt;, which nicely organizes each day's top links in a clean format. It scores by aggregating hn points, reddit karma, and number of retweets. Definitely tempted to use this one more.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; margin-left: 1em; margin-right: 1em;"&gt;&lt;a href="http://2.bp.blogspot.com/-XwJ_YzNwcew/TojFeXHvHZI/AAAAAAAAAMA/t6x7ybhG3r4/s1600/hnoverload.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="206" src="http://2.bp.blogspot.com/-XwJ_YzNwcew/TojFeXHvHZI/AAAAAAAAAMA/t6x7ybhG3r4/s320/hnoverload.png" width="320" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;There's&amp;nbsp;&lt;a href="http://hackerslide.com/"&gt;Hackerslide.com&lt;/a&gt;, which organises hourly snapshots of the HN front page using an etherpad-style timeline. Genius.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; margin-left: 1em; margin-right: 1em;"&gt;&lt;a href="http://2.bp.blogspot.com/-NHtZJO-ydZo/TojG9F-AhaI/AAAAAAAAAME/WC59xoKZhKU/s1600/hackerslide.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="181" src="http://2.bp.blogspot.com/-NHtZJO-ydZo/TojG9F-AhaI/AAAAAAAAAME/WC59xoKZhKU/s320/hackerslide.png" width="320" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;a href="http://hnvue.com/"&gt;hnvue.com&lt;/a&gt;&amp;nbsp;promises to optimize your HN reading experience by allowing you to see both the front page on the left, the article page on top, as well as the comments page at the bottom. A very interesting experiment.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; margin-left: 1em; margin-right: 1em;"&gt;&lt;a href="http://1.bp.blogspot.com/-n4jNRuvHdkk/TojKrJHkiGI/AAAAAAAAAMI/1HYf6eZguxg/s1600/hnvue.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="126" src="http://1.bp.blogspot.com/-n4jNRuvHdkk/TojKrJHkiGI/AAAAAAAAAMI/1HYf6eZguxg/s320/hnvue.png" width="320" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Another very clean and mobile-friendly site can be found at&amp;nbsp;&lt;a href="http://yhack.net/"&gt;yhack.net&lt;/a&gt;. I like the minimalist well spaced layout as well as the refreshing blue colour scheme in a sea of orange competition.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; margin-left: 1em; margin-right: 1em;"&gt;&lt;a href="http://3.bp.blogspot.com/-aEcNnZHOSIA/TojLSflXpTI/AAAAAAAAAMM/HWlvXul2UGI/s1600/yhack.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="191" src="http://3.bp.blogspot.com/-aEcNnZHOSIA/TojLSflXpTI/AAAAAAAAAMM/HWlvXul2UGI/s320/yhack.png" width="320" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;As is obvious there is a lot of variety in the HN ecosystem. I hope at least one of these apps convinced you to give it a try, even if just for a day.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Besides the dedicated HN front-ends, I really should also mention the aggregators: websites that pull together an HN feed with feeds from other relevant sites. The main ones are &lt;a href="http://jimmyr.com/"&gt;jimmyr.com&lt;/a&gt;, &lt;a href="http://popurls.com/"&gt;popurls.com&lt;/a&gt;, and &lt;a href="http://hackurls.com/"&gt;hackurls.com&lt;/a&gt;, in this order. Aggregators sent 94 user agents this way.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Another benefit of being able to dive into the referrer logs, is to see from what part of HN people came through. If you're wondering what that means, read on. There's /best, where articles rise and fall much more slowly, giving you access to great articles you may have missed over a few days of absence. There's /classic, which applies a different sorting algorithm. I believe it has something to do with usng only veteran users' votes. Then there's one I didn't know existed: It's /over. This allows you to set the threshold of points you want to see articles, well, over. Going to /over?points=100 will show you the latest(?) articles that have over 100 points. As for the two people who came with news.ycombinator.com/rss as the referrer, you sirs, are gentlemen and hackers.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Since we're talking data, another lesson I learned is that these 'follow me on Twitter' links you see at the end of some blog posts? They get clicked. I added one to my previous post a few hours after the initial spike, and I estimate it brought about 1.5 new followers per 1000 reads. Not earth shattering, but not too bad, either.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;What do those links look like? Well, something like this:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;hr /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;If you read this far, why not follow me on Twitter &lt;a href="http://twitter.com/#!/alexandrosm"&gt;here&lt;/a&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3902784927093335627-8881109890309198115?l=andothernoise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andothernoise.blogspot.com/feeds/8881109890309198115/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3902784927093335627&amp;postID=8881109890309198115' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3902784927093335627/posts/default/8881109890309198115'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3902784927093335627/posts/default/8881109890309198115'/><link rel='alternate' type='text/html' href='http://andothernoise.blogspot.com/2011/10/accidental-survey-of-hacker-news.html' title='An accidental survey of the Hacker News ecosystem'/><author><name>Alexandros Marinos</name><uri>https://profiles.google.com/102444151383927290867</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-ZAcdFHVCst8/AAAAAAAAAAI/AAAAAAAAAAA/gX8EqUFM7oA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-uLvK4b_67T8/ToiLxIvjHqI/AAAAAAAAALY/XbvbLJ7kS1w/s72-c/hckrnews.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3902784927093335627.post-6577774443442594834</id><published>2011-09-25T16:40:00.000+01:00</published><updated>2011-09-25T18:33:49.595+01:00</updated><title type='text'>Why Facebook's 'Frictionless Sharing' violates HTTP</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Facebook has this &lt;a href="http://www.theregister.co.uk/2011/09/22/facebook_sharing_everything/"&gt;new feature&lt;/a&gt;, whereby the act of simply reading a web page, under certain conditions, gets it posted to your news feed, for your friends to see. Here's how ReadWriteWeb &lt;a href="http://www.readwriteweb.com/archives/read_in_facebook_social_news_apps.php"&gt;puts it&lt;/a&gt;:&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;blockquote class="" style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;With these apps you're &lt;b&gt;automatically sending anything you read into your Facebook news feed. &lt;/b&gt;No "read" button. No clicking a "like" or "recommend" button. As soon as you click through to an article you are deemed to have "read" it and all of your Facebook friends and subscribers will hear about it. That could potentially cause you embarrassment and it will certainly add greatly to the noise of your Facebook experience.&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Facebook calls this 'frictionless sharing'. This has raised all sorts of ‘&lt;a href="http://scripting.com/stories/2011/09/24/facebookIsScaringMe.html"&gt;creepy&lt;/a&gt;’ flags, and rightfully so. A big reason for this is that it breaks a fundamental contract of web interaction, in place since the beginnings of the web, that users have come to rely upon.This contract is the fact that merely browsing a webpage (Executing a GET in HTTP talk) should not cause effects that you, the visitor, are responsible for. Posting to your news feed is a side-effect, is a direct side-effect of your reading the article. You take no extra step to authorize this.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;This violates a convention that is not there by accident. The HTTP Specification defines GET as a ‘safe’ operation, with certain guarantees. This line has been skirted for a very long time, but never by a company of this size, so publicly, and so blatantly.This is what the &lt;a href="http://www.faqs.org/rfcs/rfc2616.html"&gt;HTTP Spec&lt;/a&gt; has to say on the matter:&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;blockquote class="" style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;9.1.1 Safe Methods&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote class="" style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Implementors should be aware that the software represents the user in   their interactions over the Internet, and should be careful to allow the user to be aware of any actions they might take which may have an unexpected significance to themselves or others. In particular, the convention has been established that the GET and HEAD methods SHOULD NOT have the significance of taking an action   other than retrieval. These methods ought to be considered "safe".&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote class="" style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;[…] Naturally, it is not possible to ensure that the server does not generate side-effects as a result of performing a GET request; in fact, some dynamic resources consider that a feature. &lt;b&gt;The important distinction here is that the user did not request the side-effects, so therefore cannot be held accountable for them.&lt;/b&gt;(emphasis mine)&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;I don’t think it gets any clearer than that. It’s as if the HTTP committee had looked into the future and was personally addressing Mr. Zuckerberg. Now, the HTTP spec has no teeth. There is no enforcement body that goes around and metes out fines and punishment to the violators. It is a gentlemen’s agreement and the contract that good citizens of the web should keep. As such, I think it merits at least a mention when large companies find new and ‘frictionless’ ways to undermine the foundation upon which they (and everyone else) is building on.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Update: A number of people are pointing out the fact that the user authorizes the side effects by installing the app on facebook. However, I assume Facebook also agrees to the HTTP Spec by implementing it. Does getting user authorization allow you to violate HTTP? I don't see any such language in the spec. I think the safeness of GET is one of those rights that you shouldn't be able to give away, even if you wanted to, as doing so undermines the web for everyone else.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;hr/&gt;If you read this far, consider following me on &lt;a href='http://twitter.com/#!/alexandrosM'&gt;twitter&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3902784927093335627-6577774443442594834?l=andothernoise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andothernoise.blogspot.com/feeds/6577774443442594834/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3902784927093335627&amp;postID=6577774443442594834' title='17 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3902784927093335627/posts/default/6577774443442594834'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3902784927093335627/posts/default/6577774443442594834'/><link rel='alternate' type='text/html' href='http://andothernoise.blogspot.com/2011/09/why-facebooks-frictionless-sharing.html' title='Why Facebook&apos;s &apos;Frictionless Sharing&apos; violates HTTP'/><author><name>Alexandros Marinos</name><uri>https://profiles.google.com/102444151383927290867</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-ZAcdFHVCst8/AAAAAAAAAAI/AAAAAAAAAAA/gX8EqUFM7oA/s512-c/photo.jpg'/></author><thr:total>17</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3902784927093335627.post-4744330609378576400</id><published>2011-09-18T21:34:00.000+01:00</published><updated>2011-09-18T21:37:53.788+01:00</updated><title type='text'>Three times Google’s ‘strategy’ got in the way of success: Skype, GDrive, Google+</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;I just finished reading Sriram Krishnan’s excellent post '&lt;a href="http://blog.sriramk.com/post/10352374326/dont-be-so-f-king-strategic"&gt;Don’t be so f*king strategic&lt;/a&gt;' and couldn’t stop thinking that this must have infected Google as it had Microsoft.&lt;br /&gt;&lt;br /&gt;Here are three times when the public learned of missteps of Google that were somehow related to a grand strategy of the company:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Skype&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;This is documented in Steven Levy’s book ‘In The Plex’ and the author has a more specific &lt;a href="http://www.stevenlevy.com/index.php/05/10/why-google-does-not-own-skype"&gt;blog post&lt;/a&gt; on the issue. What is comes down to is this: Someone at Google thought, and was able to convince the higher-ups, that peer-to-peer is old technology, not consistent with their cloud model, so Skype was worthless to them. The fact that this someone was from a product group that would have to compete with Skype internally goes unmentioned, but what is important is to see that Google in 2009 passed up the opportunity to buy Skype for a fraction of what Microsoft paid for it in 2011. Skype is now integrated with Facebook.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;GDrive / Dropbox&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Drew Houston worried in his &lt;a href="http://dl.dropbox.com/u/27532820/app.html"&gt;YCombinator application&lt;/a&gt; that Google would launch GDrive any day. It turns out Google didn’t and Dropbox is a billion dollar company today. Why? In The Plex has this to say (http://googlesystem.blogspot.com/2011/05/how-google-docs-killed-gdrive.html): The Google Docs team was able to convince the higher ups that files didn’t make sense in the cloud. File systems were a thing of the past and so GDrive was abandoned almost complete, the engineers sent to work on Chrome. It turns out that files aren’t quite as dead yet, and Google Docs itself now allows you to upload them. Recent rumours say that GDrive may have been resurrected and is getting launched, this time in a much more crowded space with credible independent competition.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Google+&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The latest news is that Google+ is showing &lt;a href="http://www.blogger.com/(http://89n.com/blog/manageflitter/google-public-posts-decrease-41-over-past-two-months)"&gt;signs of decline&lt;/a&gt;. The causality here is not as strongly established, but the early demographic has &lt;a href="http://my.nameis.me/"&gt;not been happy&lt;/a&gt; with their real names policy. When I found out they were enforcing this policy, I was in disbelief. Surely when you’re entering a new market, you want to be &lt;i&gt;friendlier&lt;/i&gt; than the competition, you want to be welcoming to those who were disenfranchised from your competitor. Google proceeded to shoot itself in the foot by affecting other services that the blocked users were on, shutting out ethnic groups that did not have names with a western structure, people who are known by a name that is not their legal name, as well as those who preferred to remain anonymous for security reasons. The statements coming out of the GooglePlex were to the effect that 'Google+ is not for everyone', and that they can't fight all the battles all the time. This is bizarre behaviour on its face, and I've learned that when smart people behave in ways which appear outright incompetent, there's usually higher level considerations at play. It turns out that Google sees Plus as an&lt;a href="http://www.theregister.co.uk/2011/08/31/google_plus_identity_service/"&gt; ‘identity service’&lt;/a&gt;, a part in a grand strategy we’re not privy to (but can make guesses about). To put this in plain terms, Google is jeopardizing their bet-the-company move to attack a competitor because they have some masterplan that may or may not be what users want in the long run.&lt;br /&gt;&lt;br /&gt;This is three times when Google let their ‘strategy’ get in the way of success as far as we know. I’m sure more are known to the insiders. I hope this has documented what I’ve been seeing watching one of my&amp;nbsp;favourite&amp;nbsp;companies display a fondness for footguns. Here's my unsolicited advice to Google: &lt;a href="http://blog.sriramk.com/post/10352374326/dont-be-so-f-king-strategic"&gt;Stop being so f*cking strategic&lt;/a&gt; and just focus on building the world’s coolest technology, what people love you for, before you end up &lt;a href="http://www.theatlanticwire.com/technology/2011/09/facebooks-newest-challenge-being-boring/42595/"&gt;boring like facebook&lt;/a&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3902784927093335627-4744330609378576400?l=andothernoise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andothernoise.blogspot.com/feeds/4744330609378576400/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3902784927093335627&amp;postID=4744330609378576400' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3902784927093335627/posts/default/4744330609378576400'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3902784927093335627/posts/default/4744330609378576400'/><link rel='alternate' type='text/html' href='http://andothernoise.blogspot.com/2011/09/three-times-googles-strategy-got-in-way.html' title='Three times Google’s ‘strategy’ got in the way of success: Skype, GDrive, Google+'/><author><name>Alexandros Marinos</name><uri>https://profiles.google.com/102444151383927290867</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-ZAcdFHVCst8/AAAAAAAAAAI/AAAAAAAAAAA/gX8EqUFM7oA/s512-c/photo.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3902784927093335627.post-561928844241361630</id><published>2011-08-22T12:20:00.012+01:00</published><updated>2011-08-27T20:15:27.217+01:00</updated><title type='text'>Solving Causes' Levenshtein Distance challenge in 28 seconds. (Python)</title><content type='html'>&lt;a href="http://www.causes.com/"&gt;Causes&lt;/a&gt; has recently put up a &lt;a href="http://exchange.causes.com/jobs/software-engineer/"&gt;coding challenge&lt;/a&gt; for prospective engineers who want to work with them. Here is their description, short and sweet:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Two words are friends if they have a &lt;a href="http://en.wikipedia.org/wiki/Levenshtein_distance"&gt;Levenshtein distance&lt;/a&gt; of 1. That is, you can add, remove, or substitute exactly one letter in word X to create word Y. A word’s social network consists of all of its friends, plus all of their friends, and all of their friends’ friends, and so on. Write a program to tell us how big the social network for the word “causes” is, using this &lt;a href="http://github.com/causes/puzzles/raw/master/word_friends/word.list"&gt;word list&lt;/a&gt;. Have fun!&lt;/blockquote&gt;&lt;br /&gt;The corpus size is 264061 words. A friend wrote a C solution that solved it in sub-300 seconds and challenged me to do better. Looking at it, it seemed like it would benefit from using Python's amazing set() data structure, so I gave it a shot. After some horrible bugs, I got the right answer: 78482 (including the original word 'causes').&lt;br /&gt;&lt;br /&gt;My Python solution is in 28 lines, including comments. It also runs in 28 seconds on my antiquated Core Duo. &lt;a href="http://news.ycombinator.com/item?id=2922258"&gt;Someone on Hacker News&lt;/a&gt; found that pypy also speeds this up by 70%. Not bad at all.&lt;br /&gt;&lt;br /&gt;Other solutions I saw online take longer, which is why I decided to put this on here. Other attempts, (claimed runtime in parentheses): &lt;a href="https://github.com/nel/Puzzle-Levenshtein"&gt;Ruby (50 sec)&lt;/a&gt;, &lt;a href="https://github.com/purplejacket/Levenshtein"&gt;Ruby again (?)&lt;/a&gt;, &lt;a href="http://yoavgivati.com/causes/causesPuzzle.php.txt"&gt;PHP (1.5 hours)&lt;/a&gt;, &lt;a href="http://fnord.phfactor.net/2011/02/04/a-tasty-programming-morsel/"&gt;Python (4 hours, 1 hour)&lt;/a&gt;, &lt;a href="http://pastebin.com/RsrbKHcc"&gt;Python again(?)&lt;/a&gt;, &lt;a href="http://pastebin.com/WmQ1iHWi"&gt;Python redux(?)&lt;/a&gt;, &lt;a href="http://scruffythinking.com/journal/tag/newlisp"&gt;newlisp (?)&lt;/a&gt;, &lt;a href="http://avi-programming-blog.blogspot.com/2011/07/programming-puzzle-social-network-of.html"&gt;C++ (1 min)&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The secret behind my version's performance is Python's incredible set(), which does membership testing in O(1). I suppose the approach of generating all possible Levenshtein distance 1 strings and testing for membership also helped performance while keeping code size down. It's much easier to generate the small number of next steps rather than testing each of 260,000 options to see if they are a next step.&lt;br /&gt;&lt;br /&gt;Without further ado, the code:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: python"&gt;import string&lt;br /&gt;w = set(open("00wordlist.txt").read().splitlines())&lt;br /&gt;f, nf = set(), set(["causes"])&lt;br /&gt;&lt;br /&gt;#from b, yield all unused words where levdist==1&lt;br /&gt;def nextgen(b):&lt;br /&gt;	for i in range(len(b)): #for each index in b&lt;br /&gt;		for c in string.ascii_lowercase: #for letters [a..z]&lt;br /&gt;			if c != b[i]:&lt;br /&gt;				#substitute b[i] with c&lt;br /&gt;				if b[:i] + c + b[i+1:] in w: &lt;br /&gt;					yield b[:i] + c + b[i+1:]&lt;br /&gt;				#inject c before b[i]&lt;br /&gt;				if b[:i] + c + b[i:] in w: &lt;br /&gt;					yield b[:i] + c + b[i:]&lt;br /&gt;		#remove b[i]&lt;br /&gt;		if b[:i] + b[i+1:] in w: yield b[:i] + b[i+1:]&lt;br /&gt;	&lt;br /&gt;	for c in string.ascii_lowercase: #for letters [a..z]&lt;br /&gt;		if b + c in w: yield b + c #append c after b&lt;br /&gt;&lt;br /&gt;while len(nf):&lt;br /&gt;	cf = nf&lt;br /&gt;	nf = set([j for i in cf for j in nextgen(i) if j not in f])&lt;br /&gt;	w -= nf &lt;br /&gt;	f |= nf&lt;br /&gt;&lt;br /&gt;print len(f)&lt;/pre&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3902784927093335627-561928844241361630?l=andothernoise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andothernoise.blogspot.com/feeds/561928844241361630/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3902784927093335627&amp;postID=561928844241361630' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3902784927093335627/posts/default/561928844241361630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3902784927093335627/posts/default/561928844241361630'/><link rel='alternate' type='text/html' href='http://andothernoise.blogspot.com/2011/08/solving-causes-levenshtein-distance.html' title='Solving Causes&apos; Levenshtein Distance challenge in 28 seconds. (Python)'/><author><name>Alexandros Marinos</name><uri>https://profiles.google.com/102444151383927290867</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-ZAcdFHVCst8/AAAAAAAAAAI/AAAAAAAAAAA/gX8EqUFM7oA/s512-c/photo.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3902784927093335627.post-2936572304543613414</id><published>2009-05-01T21:18:00.004+01:00</published><updated>2011-09-27T07:21:10.612+01:00</updated><title type='text'>Using Dropbox as a Host for Static Websites.</title><content type='html'>I have been a huge fan of &lt;a href="http://getdropbox.com/"&gt;dropbox&lt;/a&gt; for a while. What they have acheived is nothing short of amazing. I recently had an epiphany that may make the implications of their synchronization paradigm even more interesting.&lt;br /&gt;&lt;br /&gt;What if I could use dropbox as a host for a static website?&lt;br /&gt;&lt;br /&gt;Dropbox has a feature that allows you to make some files public simply by dropping them on your 'public' folder. It turns out, that placing interlinked html files works just fine. Case in point:&lt;br /&gt;&lt;br /&gt;&lt;span style="text-decoration: underline;"&gt;&lt;a href="http://dl.getdropbox.com/u/117449/page1.html"&gt;http://dl.getdropbox.com/u/117449/page1.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;I presume images, etc. would work just fine as well.&lt;br /&gt;&lt;br /&gt;What makes this observation interesting is that combined with the synchronization infrastructure of Dropbox, this means that you can keep your static website right in your desktop, edit it with your favourite editor (WYSIWYG if you have to), and have it instantly available online. It may not be the best idea for everything, but for a number of basic uses, it might just be a massive step forward. One of the most difficult steps for beginers to master, is the need for FTP. Dropbox-as-a-host completely sidesteps that and lets new users easily build their websites.&lt;br /&gt;&lt;br /&gt;Of course, once a nice little hack is found, the next thought is to consider what can be improved and streamlined:&lt;br /&gt;&lt;br /&gt;Can we incorporate dynamic elements to this scheme?&lt;br /&gt;Can the ugly URL be replaced with something better?&lt;br /&gt;&lt;br /&gt;I gave myself very little time to write this post, opting to write it now rather than postpone, so these and many other potential questions, my dear readers, I leave as excercises for you.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3902784927093335627-2936572304543613414?l=andothernoise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andothernoise.blogspot.com/feeds/2936572304543613414/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3902784927093335627&amp;postID=2936572304543613414' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3902784927093335627/posts/default/2936572304543613414'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3902784927093335627/posts/default/2936572304543613414'/><link rel='alternate' type='text/html' href='http://andothernoise.blogspot.com/2009/05/using-dropbox-as-host-for-static.html' title='Using Dropbox as a Host for Static Websites.'/><author><name>Alexandros Marinos</name><uri>https://profiles.google.com/102444151383927290867</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-ZAcdFHVCst8/AAAAAAAAAAI/AAAAAAAAAAA/gX8EqUFM7oA/s512-c/photo.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3902784927093335627.post-8069322888172752631</id><published>2008-09-10T03:54:00.003+01:00</published><updated>2008-09-10T04:10:12.598+01:00</updated><title type='text'>The Open Business - An Oxymoron or The Future?</title><content type='html'>I routinely hear that businesses are not open enough. Even companies that were once  renowned for their openness, say, Google, bump up to accusations of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;intransparency&lt;/span&gt; eventually. Then again, in a world where the openness poster child named &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;Wikipedia&lt;/span&gt; is accused of being run by a secretive elite, who can be safe?  &lt;br /&gt;&lt;br /&gt;I happen to believe that these accusations have merit. Google is not as open as it should be. It withholds its search algorithm and its advertising revenue distribution formula. Is this for a good reason? Perhaps. But if you were to &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;grade&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;google&lt;/span&gt; on openness, these would be black marks on the score chart. How about &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;Wikipedia&lt;/span&gt;? Well, its secret discussions in unofficial &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;IRC&lt;/span&gt; rooms and mailing lists are no longer rumours. They are real. Are they serving a real survival purpose? Who knows. That is the problem with &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;intransparency&lt;/span&gt;. Nobody knows what happens behind closed doors.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3007/2681435168_bffd1b9d96_b.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px;" src="http://farm4.static.flickr.com/3007/2681435168_bffd1b9d96_b.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;  There are many voices that claim openness is a solution to many of the world's problems. The claim is that by increasing openness, all kinds of creativity are released and 'the community' provides solutions. On the other hand, attempts to build businesses on top of open foundations invariably bump up against a &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_7"&gt;trade off&lt;/span&gt;. How much openness can we sacrifice without losing the community? How much do we need to sacrifice in order to become profitable? It seems the trade-off is exchanging profit for openness.   &lt;br /&gt;&lt;br /&gt;So my question is the following: Can there really be a completely open/transparent business or is this a contradiction in terms?  &lt;br /&gt;&lt;br /&gt;In order to answer this question, we need to answer some &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;more&lt;/span&gt; elementary questions. What does an open business look like? Let's take things to extremes. Let's say all conversations between founders are &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_9"&gt;publicly&lt;/span&gt; available. Let's say that all company e-mails are also available to the public, along with all chat logs etc. All employees are encouraged to have a blog and of course have no restrictions on what they can say. All code is of course open-source. (&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;AGPL&lt;/span&gt; v3 or BSD?) Essentially everything the business does and thinks is out in the open. Anything anyone could imagine to ask about the company is already available. Every involved party of the business has active conversation with the community. It feels a bit like a reality show, but this is how a business designed with transparency as the #1 goal would look like. Nothing more for anyone to ask. Of course, while the past and present are open for anyone to see, future actions are still the monopoly of the owners. We are not discussing a democratic or &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_11"&gt;crowd-sourced&lt;/span&gt; business. The public can communicate with the owners and contribute in ideas and code, but ultimately the leverage of initiative belongs to the owners. This of course is just my idea of an open business and not something complete or final. Let's consider it a working hypothesis.  &lt;br /&gt;&lt;br /&gt;The next questions are: What are the &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_12"&gt;pluses&lt;/span&gt; and what are the minuses of a business like this? This is a much larger discussion. I would assume community &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_13"&gt;input&lt;/span&gt; and support as well as trust would be much greater. Assuming the employees and owners are competent, this would be obvious to everyone who follows the dealings. The drawbacks are also many: Inability to surprise the competition, a lot of pressure by the community at all stages of development of an idea, difficulty in communication when everyone feels watched, etc etc.   &lt;br /&gt;&lt;br /&gt;However the killer question is this: Is there even one, small, tiny, extremely slim niche that a business like this could be successful and even advantageous? Remember, this is a for-profit business so profitability is still the goal. The open business just tries to accomplish this without maintaining the secrecy requirements. If a single idea, with a single business model can be found, where an open business could be successful, then the open business concept has a lot to teach us.   &lt;br /&gt;&lt;br /&gt;The concept is still in its infancy, it has just been expressed for the first time, so it will probably go through a lot of evolution. I am eager to hear your feedback. What is your definition of an open business? Would you become its customer? Do you believe it could ever be profitable?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3902784927093335627-8069322888172752631?l=andothernoise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andothernoise.blogspot.com/feeds/8069322888172752631/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3902784927093335627&amp;postID=8069322888172752631' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3902784927093335627/posts/default/8069322888172752631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3902784927093335627/posts/default/8069322888172752631'/><link rel='alternate' type='text/html' href='http://andothernoise.blogspot.com/2008/09/open-business-oxymoron-or-future.html' title='The Open Business - An Oxymoron or The Future?'/><author><name>Alexandros Marinos</name><uri>https://profiles.google.com/102444151383927290867</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-ZAcdFHVCst8/AAAAAAAAAAI/AAAAAAAAAAA/gX8EqUFM7oA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3007/2681435168_bffd1b9d96_t.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3902784927093335627.post-4352252305341645814</id><published>2008-07-08T00:09:00.004+01:00</published><updated>2008-07-09T20:31:06.895+01:00</updated><title type='text'>Tribute to Alan Turing</title><content type='html'>There are few people I would consider myself a fan of. The &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_0"&gt;Beatles&lt;/span&gt; are great but it is demeaning to call myself a fan. Ditto &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;Radiohead&lt;/span&gt;. I just can't see it happening. But there is one person whose fan I can easily declare myself to be.&lt;br /&gt;&lt;br /&gt;What if I told you that someone laid the foundations for all modern computers, set the stage for artificial intelligence and also was the most important scientist in breaking the &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_2"&gt;German&lt;/span&gt; cryptography in WWII? Doing any one of these things would surely be an accomplishment beyond the imagination of us mortals. But all three? Where do I sign up and get the t-shirt?&lt;br /&gt;&lt;br /&gt;Unfortunately his life was not all fun and games. Convicted of having sex with a man, he was asked to choose between imprisonment and probation conditional on undergoing 'hormone therapy', which caused him several side effects including breast enlargement. As homosexuals were considered a danger for entrapment by the soviets, he was also stripped of his security clearance and therefore his ability to do the work he loved. He was found dead at the age of 42, apparently poisoned by a cyanide-laced apple.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_JNGx3h-DQ6o/SHURreqEYQI/AAAAAAAAAFE/kidjjDufmog/s1600-h/DSC02343.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_JNGx3h-DQ6o/SHURreqEYQI/AAAAAAAAAFE/kidjjDufmog/s320/DSC02343.JPG" alt="" id="BLOGGER_PHOTO_ID_5221098781667516674" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Some say he was reenacting his favourite fairy tale, Snow White. Others say he was making a reference to the forbidden fruit. Others still, say he wanted an ambiguous way to kill himself so his mother would not believe he did. I just see the parallel with another great man who was led to suicide for the crime of being too far ahead of his own society, Socrates. Yet this being so close to our time, I cannot contain the level of ingratitude he received. The thoughts of his last moments, abandoned and disgraced, pondering his last moments touch some string deep inside me, one not commonly vulnerable in everyday life. This tragic failure of human society is so shameful that i cannot help but be filled with pessimism for this ungrateful race of ours.&lt;br /&gt;&lt;br /&gt;This scar and thought and picture will always be with me, to what end I do not know.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3902784927093335627-4352252305341645814?l=andothernoise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andothernoise.blogspot.com/feeds/4352252305341645814/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3902784927093335627&amp;postID=4352252305341645814' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3902784927093335627/posts/default/4352252305341645814'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3902784927093335627/posts/default/4352252305341645814'/><link rel='alternate' type='text/html' href='http://andothernoise.blogspot.com/2008/07/tribute-to-alan-turing.html' title='Tribute to Alan Turing'/><author><name>Alexandros Marinos</name><uri>https://profiles.google.com/102444151383927290867</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-ZAcdFHVCst8/AAAAAAAAAAI/AAAAAAAAAAA/gX8EqUFM7oA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_JNGx3h-DQ6o/SHURreqEYQI/AAAAAAAAAFE/kidjjDufmog/s72-c/DSC02343.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3902784927093335627.post-961828498756462613</id><published>2008-06-03T01:58:00.000+01:00</published><updated>2008-06-03T18:32:16.669+01:00</updated><title type='text'>The Advertising Immunity is upon us</title><content type='html'>So the BBC ran an &lt;a href="http://news.bbc.co.uk/1/hi/technology/7417496.stm"&gt;article&lt;/a&gt; recently claiming that web surfers are getting more 'selfish and ruthless'. In disbelief, I read the article in search of the proof of our increased/increasing selfishness. Apparently we click on less ads. And we do what we want faster. I kid you not. Being efficient, immune to distractions (such as ads) as well as being more aware of how the web works and hence wasting less time is proof of our selfishness. Next thing you know, we will be clicking on the bloody banners as an act of charity to prove our selfless nature. Now, I wanted to write this article for a while, but then I saw &lt;a href="http://datacharmer.blogspot.com/2008/06/can-you-see-advertising.html"&gt;this post&lt;/a&gt; in a blog somewhere which put things into perspective. Aside from the silly title of the BBC article, it seems to be pointing to a reality. Advertising is based on the assumption that we cannot control our focus, that if you put something in front of us users/viewers/passers-by, we will pay attention to it, even if it is not what we were looking for initially. However besides the tools that we can use to block advertising on the web, it seems that ads on social networks are not having much success selling ads either.&lt;br /&gt;&lt;br /&gt;So what happens when in this arms race, the human brain responds with improved focus? It seems that whenever a flaw in the mind is found and exploited to death, the next generation grows up with a predisposition to avoid this pitfall. There will always be a vulnerable minority, but the mainstream masses seem to handle themselves against narcotics, gambling and other shortfalls in human perception, if not by pure genetic ability, then by learned cultural means.&lt;br /&gt;&lt;br /&gt;So, will the advertisers simply increase their dosage on more potent ingredients such as, say, sex? Oh I wish they do.&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;No, no, you misunderstand me. I mean, I wish they do so we can finally develop an immunity to sex advertising as well. Given a few years of course. Objectification of women and men as a means of increasing sales is simply classless. But if it can be done, someone will do it. It is the way of the market, and the way it should be. The good thing is that our brains and culture will also similarly evolve to distinguish commercial sexuality from the real thing and dismiss the former as mere noise, which it is. In a way, for some people, it already has. I am hoping in more of that for more of us.&lt;br /&gt;&lt;br /&gt;What about personalization? That's the next big thing, right? The premise is simple: If they sell us ads that we _want_ to see, we will _want_ to see them. The catch is that in order to judge what we want to see, they have to learn quite a bit about each one of us individually. And that reveals the ugly twin of personalization, which is &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_0"&gt;surveillance&lt;/span&gt;. And these twins are joined at the hip. In order to personalize, they have to know who we are and to know that, they have to keep an eye on us. Now, assuming people may not mind some &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_1"&gt;surveillance&lt;/span&gt; by a commercial entity, even disregarding that too personal can become creepy, there is another problem with the core argument for personalized advertising. When the advertisers say "Advertisements you want to see are almost like actual content", they are missing the part where someone has paid to have their advertisement displayed. If that was the best thing for me to see, I would have found it myself. I would have paid to have it found for me even. The fact that someone is making an expenditure means that there is some distortion happening. And this distortion will be corrected itself by the same mechanisms that have dealt with the other distortions mentioned previously. If these hypotheses hold, then the advertising game is a dead end.&lt;br /&gt;&lt;br /&gt;What next you ask? Well, it just so happens that advertising is the engine of the professional web. Most professional websites are competing for what they call 'eyeballs' which is what they sell to &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;advertisees&lt;/span&gt;. Even subscription based publications are abandoning that model and turning to ads. But it is not just content that depends on advertising. Google itself is a company that is built on advertising, which brings in 99% of their revenue. Take the advertising away and the world is back to a very primitive web, one that either has no &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_3"&gt;professional&lt;/span&gt; input, or one that depends on subscriptions, or &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;micropayments&lt;/span&gt;. Surprisingly, Google seems to be &lt;a href="http://blogs.guardian.co.uk/greenslade/2008/06/wan_2008_google_says_people_wi.html"&gt;aware&lt;/a&gt;. Of course it should be noted that it is not the only option. Organizations such as &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;Wikimedia&lt;/span&gt; (parent of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;Wikipedia&lt;/span&gt; and other wonderful ventures) are surviving just fine without advertising so that should be a very viable model as well. For the ones that are not charitable foundations though, there is one very good avenue to replacing them: &lt;a href="http://andothernoise.blogspot.com/2008/05/bane-of-my-existence-part-1.html"&gt;decentralization&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Here is where I of course offer the usual disclaimer: Take my words with a grain of salt. This is what I want to see, so calling me biased is an understatement. Take my words only as seriously as my arguments permit you to. I welcome you to challenge me in the comments. If you have an element of knowledge that I do not, if you have noticed a flaw in the arguments or if you have attained an insight that eludes me, do not leave me in darkness, I beg of you.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3902784927093335627-961828498756462613?l=andothernoise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andothernoise.blogspot.com/feeds/961828498756462613/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3902784927093335627&amp;postID=961828498756462613' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3902784927093335627/posts/default/961828498756462613'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3902784927093335627/posts/default/961828498756462613'/><link rel='alternate' type='text/html' href='http://andothernoise.blogspot.com/2008/06/advertising-immunity-is-upon-us.html' title='The Advertising Immunity is upon us'/><author><name>Alexandros Marinos</name><uri>https://profiles.google.com/102444151383927290867</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-ZAcdFHVCst8/AAAAAAAAAAI/AAAAAAAAAAA/gX8EqUFM7oA/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3902784927093335627.post-2033181018387788289</id><published>2008-05-24T18:58:00.000+01:00</published><updated>2008-05-24T20:02:25.336+01:00</updated><title type='text'>My Content Mess</title><content type='html'>So, I was  making a diagram of all the services I use online, just to help myself better understand how things are connected. To start with the fact that I need a diagram to make sense should be cause for concern. I am a programmer and that should mean I am quite good at holding things and connections in my head. Still, I needed a diagram, so here it is:&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_JNGx3h-DQ6o/SDhXXL1TCxI/AAAAAAAAADo/C5oK5m7Hb-g/s1600-h/content+mess.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_JNGx3h-DQ6o/SDhXXL1TCxI/AAAAAAAAADo/C5oK5m7Hb-g/s320/content+mess.jpg" alt="" id="BLOGGER_PHOTO_ID_5204005425251552018" border="0" /&gt;&lt;/a&gt;Now, while making the diagram, I made a number of observations:&lt;br /&gt;&lt;br /&gt;For one thing, I use more services than I thought I was. There are 13 services listed here, and this is not everything.&lt;br /&gt;&lt;br /&gt;Also, their interconnections change relatively fast. I repeatedly had to update the connections in the days I was making this, so I don't expect it to stay current for a very long time.&lt;br /&gt;&lt;br /&gt;Another observation: I have followers in many of these services. Aside from my blog readers, my Google reader friends can see my shared Items, I also publish my starred items feed, I have a lot of connections in &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Facebook&lt;/span&gt; that can see my activity there, and also some connections in &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;Friendfeed&lt;/span&gt;. In fact, since all these services offer open feeds, there are people who could be following me on any of them. There may also be overlap in these sets of people, and I try to maximize it by sharing content between services as much as possible.&lt;br /&gt;&lt;br /&gt;Although this all seems a bit complicated, it is better than having one provider do everything for me. Yes, I could do most of these things with a combination of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;Facebook&lt;/span&gt; and Google Reader but it would not be nearly as easy, effective or enjoyable as it is now that I use the best of breed tools in each category. I do have a number of problems though:&lt;br /&gt;&lt;br /&gt;1. Too many passwords and accounts. Please someone start using &lt;a href="http://visitmix.com/blogs/Joshua/Introduction-to-OpenID/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;OpenID&lt;/span&gt;&lt;/a&gt; so I can log in everywhere with  single set of credentials. I know it's &lt;a href="http://www.codinghorror.com/blog/archives/001121.html"&gt;not perfect&lt;/a&gt;, but it's the best we have.&lt;br /&gt;&lt;br /&gt;2. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;Facebook&lt;/span&gt; is selfish. What can I say? In the diagram, you can see the little arrows going in, but nothing going out. Why? Because &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;Fb&lt;/span&gt; does not let me take my data out of their walled garden. Apparently, what happens in &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;Facebook&lt;/span&gt;, stays in &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;Facebook&lt;/span&gt;. That's their choice, but that's also the reason I am moving my activity elsewhere. For me, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;Facebook&lt;/span&gt; is turning into a place where stuff gets posted automatically for my old-fashioned friends to see. I avoid posting original content inside &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;Facebook&lt;/span&gt;. My cool friends are moving to &lt;a href="http://friendfeed.com/alexandros"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;Friendfeed&lt;/span&gt;&lt;/a&gt;, that apparently trusts its users more and traps them less.&lt;br /&gt;&lt;br /&gt;3. Overlap. What if I write a blog entry and then share and star it on Google Reader, and Facebook, and FriendFeed? Well since I have linked all these together, It may end up 3 times on FriendFeed and 5 times on Facebook. But it is the only way it can get to the widest possible audience, all the people who are following me on all these services. Someone want to do a smart filter that merges all the identical entries? I have heard talk about something like this on Friendfeed, let's see.&lt;br /&gt;&lt;br /&gt;4. Not only can I not merge overlapping articles, I also cannot aggregate comments. So what if I post something here, then share it inside &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;Facebook&lt;/span&gt; and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;Friendfeed&lt;/span&gt;? There is a possibility that independent comment threads will start and I will have to follow them in three places. There are a number of &lt;a href="http://disqus.com/"&gt;new ideas&lt;/a&gt; coming up in this area, I will look into using them and I hope they generally catch on. (Of course, keep in mind #2)&lt;br /&gt;&lt;br /&gt;5. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;Friendfeed&lt;/span&gt; and &lt;a href="http://feeds.feedburner.com/%7Er/readwriteweb/%7E3/297247947/facebook_mainstream_everything.php"&gt;recently&lt;/a&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;Facebook&lt;/span&gt;, are acting like &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;aggregators&lt;/span&gt;. This is cool. I like it. But they don't let me integrate with any site I want. They offer me a choice. For the moment, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;FriendFeed&lt;/span&gt; offers everything &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;Fb&lt;/span&gt; offers and more, but this may change. My problem is that I have other websites where I am or could be active. Examples are &lt;a href="http://www.zotero.org/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;Zotero&lt;/span&gt;&lt;/a&gt;, &lt;a href="http://www.threadless.com/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_19"&gt;Threadless&lt;/span&gt;&lt;/a&gt; and &lt;a href="http://www.deviantart.com/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_20"&gt;DeviantArt&lt;/span&gt;&lt;/a&gt;. The first website that makes it easy for its users to write the adapters themselves, is the winner. Less work for them, more capabilities for us. My money is on &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_21"&gt;Friendfeed&lt;/span&gt;, but we'll see.&lt;br /&gt;&lt;br /&gt;6. Status messages: there are just too many! I have status on &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_22"&gt;Facebook&lt;/span&gt;, Twitter and Google Talk. They generally offer me the same utility. Someone make it easy for me to keep them synchronized? (Of course, keep in mind #2)&lt;br /&gt;&lt;br /&gt;7. Bookmark managers. Del.icio.us and Google bookmarks each have their own advantages. &lt;a href="http://del.icio.us/"&gt;Del.icio.us&lt;/a&gt; has a great &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_23"&gt;firefox&lt;/span&gt; &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_24"&gt;plug in&lt;/span&gt; and a nice social aspect, but &lt;a href="http://www.google.com/bookmarks/"&gt;Google Bookmarks&lt;/a&gt; makes my Google searches more relevant. So I want them both to have access to my favourites. I have found a way to transfer data from the one to the other, more or less, but I would like them to be synchronized. I also would like them to be synchronized with &lt;a href="http://www.foxmarks.com/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_25"&gt;foxmarks&lt;/span&gt;&lt;/a&gt; which I use to keep my browsers at work and at home synchronized. Any ideas?&lt;br /&gt;&lt;br /&gt;8. And now for my favourite complaint: Everything is &lt;a href="http://andothernoise.blogspot.com/2008/05/bane-of-my-existence-part-1.html"&gt;centralized&lt;/a&gt;. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_26"&gt;Waaaaa&lt;/span&gt;h! Why doesn't anyone build something where I can keep doing my work as I like without being tied to a single entity? Or many single entities for that matter. Perhaps then all the other problems would be moot since I would be able to solve them myself. Oh well, I guess my PhD work is relevant here, in the long-long term.&lt;br /&gt;&lt;br /&gt;Overall my little content network is complicated but works mostly Ok. I wonder how many of these will be solved by next year. Maybe there is a ray of light on the conventional horizon called&lt;a href="http://www.scripting.com/stories/2008/05/15/switchingToSwitchabit.html"&gt; SwitchABit&lt;/a&gt;. It's still in development but sounds interesting.&lt;br /&gt;&lt;br /&gt;Yet another blog post that I thought would be small but turned out huge. Oh well. I need more experience blogging.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3902784927093335627-2033181018387788289?l=andothernoise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andothernoise.blogspot.com/feeds/2033181018387788289/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3902784927093335627&amp;postID=2033181018387788289' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3902784927093335627/posts/default/2033181018387788289'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3902784927093335627/posts/default/2033181018387788289'/><link rel='alternate' type='text/html' href='http://andothernoise.blogspot.com/2008/05/my-content-mess.html' title='My Content Mess'/><author><name>Alexandros Marinos</name><uri>https://profiles.google.com/102444151383927290867</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-ZAcdFHVCst8/AAAAAAAAAAI/AAAAAAAAAAA/gX8EqUFM7oA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_JNGx3h-DQ6o/SDhXXL1TCxI/AAAAAAAAADo/C5oK5m7Hb-g/s72-c/content+mess.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3902784927093335627.post-8228397065078497520</id><published>2008-05-20T16:02:00.000+01:00</published><updated>2008-05-20T16:05:46.454+01:00</updated><title type='text'>A Spam-less e-mail system</title><content type='html'>The last two posts have been quite different to each other. While the first one was an organized, principle-establishing and mature but rather basic article, the second one was more of a &lt;span id="zhj:1" class="misspell" suggestions="brain dump,brain-dump"&gt;braindump&lt;/span&gt;, thinking out loud kind of post. Seeing this pattern that is forming, today I would like to introduce yet another category of posts I want to make: Ideas. When I say ideas, I mean technical concepts that can be turned into products or services. You may ask why I do not use these ideas myself, to make these products and profit. Why publish them in the open web to be 'stolen' by anyone? The truth is, and I don't mean to be pretentious, I have far too many of them for the amount of time I can expend on developing them. So while I am working on a big one for my PhD, I might as well hand the other ones out for adoption and hope to get visiting rights once in a while. And of course there is valuable discussion that can be made, and technical points that can be raised and a great educational experience for me all around. I do not pretend that all my ideas are valuable or that they do not need any correction. So without further ado, I present to you, thespam-less e-mail system, let's call it v-mail.  &lt;br /&gt;&lt;br /&gt;To set the mood, let me talk about the social network messaging systems. Many prefer them over e-mail. Why? because they have verified everyone who can send me a message and therefore have a very high signal to noise ratio. In fact, almost all the messages that reach my inbox are valuable and directed towards me personally. So it is easy to see why people may prefer this method of messaging. What are the problems with this system? Well there are quite a few. For one thing, centralization. Everyone needs to have a facebook orwhatever-book account in order to send me a message. Another is the difficulty in adding people on the go. If I meet someone and tell them to mail me, I do not want to have to go home and add them to my social network first. Also, I may have my mail address published somewhere and people I have never met before may want to e-mail me. This is impossible if I require prior approval for someone to send me e-mail. So how do we exit this seeming catch-22?&lt;br /&gt;&lt;br /&gt;My answer is, by applying the best of breed solutions to each problemseparately. What I mean:   Let's start with the social networking messaging system. So we have a mail provider, let's call them v-mail.com, that allows you to create an account and add a list of other addresses that you accept messages from. They may give you a standard e-mail address (say, alexandros@v-mail.com) but any e-mail from a source you have not added to your list gets dropped and never reaches you. So this would be an implementation of the basic social networking messaging system. In fact it is one step further, since it allows for multiple servers to communicate, much like the current e-mail system. All you need is an account with any provider of this new mail system. It does not have to be the same as mine, in fact, nobody is stopping you from hosting your own provider and becoming completely self-sufficient.&lt;br /&gt;&lt;br /&gt;Next problem: Adding people is hard work, especially if you have to remember to add people later. For this we can use an sms-service that you can use your mobile phone to add people with. So when you add a new person, you may send a simple text message (e.g. add someguy@x-mail.com) to your provider. This would instantly solve that problem. This person can now send a message that will get through. Of course to start your list off you could import contacts from various social networks, address books and e-mail applications. &lt;br /&gt;&lt;br /&gt;How about anonymous people that want to send you messages? Well, this has been solved already. Go to any website that wants to get contacted by its readers. They will not publish an e-mail address for fear of spammers. What they do is expose a contact form with a CAPTCHA (these strange numbers you have to type in so that they know you are a human). This contact form could be available at my mail provider's website so that anyone can contact me as long as they provide a valid v-mail ID and prove that they are humans by typing the CAPTCHA. This could also be used to request that someone adds you to their allowed list.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_JNGx3h-DQ6o/SDLoZ0XjeTI/AAAAAAAAADg/S700FJ6wFZ8/s1600-h/spamless+mail+system.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_JNGx3h-DQ6o/SDLoZ0XjeTI/AAAAAAAAADg/S700FJ6wFZ8/s320/spamless+mail+system.gif" alt="" id="BLOGGER_PHOTO_ID_5202476049818155314" border="0" /&gt;&lt;/a&gt;So by merging social networks, e-mail, mobile phones and the web, we can create a composite system that guarantees we only get verified e-mail. Let's go over some of the benefits: &lt;ul id="xwzh0"&gt;&lt;li id="xwzh1"&gt;    You could use a typical e-mail program and e-mail standards. Additional functionality such as list management would be nice but notnecessary to start with. In fact you could use this new e-mail program to communicate with traditional e-mail addresses, as long as you add the people you correspond with to your allowed list, which could be done automatically when you send an email to someone. In a sense, it's backwards compatible.  &lt;/li&gt;&lt;li id="xwzh2"&gt;    The user is back in control. If someone on your list starts spamming, you can simply remove them and never receive another e-mail from them.&lt;/li&gt;&lt;li id="xwzh3"&gt;    Leaking your email is no longer a problem. The information of your e-mail address is useless to a spammer since they cannot send automated anonymous messages anymore.&lt;/li&gt;&lt;li id="xwzh4"&gt;    This solution can work well in a decentralized environment. no need for the massive processing power required by spam filters, anyone can do it on their home computers.&lt;/li&gt;&lt;li id="xwzh5"&gt;    It's good for the Internet since spam is a massive waste of bandwidth.&lt;/li&gt;&lt;/ul&gt; &lt;span id="bad_word" class="misspell" suggestions="OK,OJ,Oak,Oik,KO"&gt;Ok&lt;/span&gt;, have to admit I enjoy creating all these scenarios and exploring the ideas in my head. So here it is, for your viewing pleasure. Let's think about it: Would such a service be useful to you? What downsides can you think of?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3902784927093335627-8228397065078497520?l=andothernoise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andothernoise.blogspot.com/feeds/8228397065078497520/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3902784927093335627&amp;postID=8228397065078497520' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3902784927093335627/posts/default/8228397065078497520'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3902784927093335627/posts/default/8228397065078497520'/><link rel='alternate' type='text/html' href='http://andothernoise.blogspot.com/2008/05/spam-less-e-mail-system.html' title='A Spam-less e-mail system'/><author><name>Alexandros Marinos</name><uri>https://profiles.google.com/102444151383927290867</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-ZAcdFHVCst8/AAAAAAAAAAI/AAAAAAAAAAA/gX8EqUFM7oA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_JNGx3h-DQ6o/SDLoZ0XjeTI/AAAAAAAAADg/S700FJ6wFZ8/s72-c/spamless+mail+system.gif' height='72' width='72'/><thr:total>0</thr:total></entry></feed>
