<?xml version='1.0' encoding='utf-8' ?>
<!--  If you are running a bot please visit this policy page outlining rules you must respect. http://www.livejournal.com/bots/  -->
<rss version='2.0' xmlns:lj='http://www.livejournal.org/rss/lj/1.0/' xmlns:media='http://search.yahoo.com/mrss/'>
<channel>
  <title>This is Not a Brain Surgery</title>
  <link>http://notbrainsurgery.livejournal.com/</link>
  <description>This is Not a Brain Surgery - LiveJournal.com</description>
  <lastBuildDate>Wed, 08 Apr 2009 18:28:01 GMT</lastBuildDate>
  <generator>LiveJournal / LiveJournal.com</generator>
  <lj:journal>notbrainsurgery</lj:journal>
  <lj:journalid>1461624</lj:journalid>
  <lj:journaltype>personal</lj:journaltype>
  <image>
    <url>http://l-userpic.livejournal.com/21198071/1461624</url>
    <title>This is Not a Brain Surgery</title>
    <link>http://notbrainsurgery.livejournal.com/</link>
    <width>100</width>
    <height>78</height>
  </image>

<item>
  <guid isPermaLink='true'>http://notbrainsurgery.livejournal.com/35925.html</guid>
  <pubDate>Wed, 08 Apr 2009 18:28:01 GMT</pubDate>
  <title>contemplative debugging</title>
  <link>http://notbrainsurgery.livejournal.com/35925.html</link>
  <description>After reading &lt;a href=&quot;http://asserttrue.blogspot.com/2009/04/turn-off-your-step-thru-debugger.html&quot; target=&quot;_new&quot;&gt;this post&lt;/a&gt;, I want to share with you my take on the subject:&lt;br /&gt;&lt;br /&gt;More than a decade ago I was using &lt;a href=&quot;http://en.wikipedia.org/wiki/SGI_Indigo2&quot; target=&quot;_new&quot;&gt;SGI Indigo II&lt;/a&gt; as my primary development workstation. We were writing in C++ and I have quickly discovered that SGI C++ compiler (&lt;a href=&quot;http://en.wikipedia.org/wiki/Cfront&quot; target=&quot;_new&quot;&gt;cfront&lt;/a&gt; based) is pretty bad. To give you idea how bad it was - you can actually compile code which invokes pure virtual function, which, of course, was causing a crash during execution. So, we decided to switch to GCC, which was also not very mature back then in C++ department but was certainly a step ahead of SGI C++. The problem with G++ on SGI platform at that time was that for some reason it could not generate debug information in Irix executables. I think it has something to do with COFF executable format used by Irix 4.x, or something like that. So I had to  learn to live without debugger. I was relatively immature programmer without set work habits and I did not yet have preference to particular debugging technique. I worked like this for about a year, and then I switched to some other Unix platform after this, the &quot;damage&quot; have been done: I never had a need to use debugger ever since.&lt;br /&gt;&lt;br /&gt;This custom helped me several times during my career:&lt;br /&gt;&lt;br /&gt;1. Debugging PROLOG code where step-through debugging techniques are not applicable&lt;br /&gt;2. Programming mobile devices. (I remember we used to change a colour of a pixel in a upper right screen corner or emitting series of beeps as debugging techniques)&lt;br /&gt;3. Debugging Haskell programs (lazy evaluation, etc.)&lt;br /&gt;4. Debugging a distributed systems&lt;br /&gt;5. Diagnosing a problem reported by a customer, when you do not have access to actual device&lt;br /&gt;&lt;br /&gt;My friends and I were joking that we have invented a new debugging technique which we called &quot;&lt;i&gt;contemplative debugging&lt;/i&gt;&quot; (&quot;&lt;i&gt;созерцательная отладка&lt;/i&gt;&quot; in Russian). We used to practice a &lt;a href=&quot;http://en.wikipedia.org/wiki/Pair_programming&quot; target=&quot;_new&quot;&gt;pair programming&lt;/a&gt;. It was before &quot;&lt;a href=&quot;http://en.wikipedia.org/wiki/Extreme_programming&quot; target=&quot;_new&quot;&gt;extreme programming&lt;/a&gt;&quot; become poplular, and was mostly because we just do not have enough workstations. So, once the bug was reported, my partner and I intensively stared into suspect code until one of us emits cry of joy, discovering the problem. This technique, in many cases, turned out to be quite efficient, compared to firing up debugger and stepping through the code to get to the problem.&lt;br /&gt;&lt;br /&gt;P.S. I am not religious about not using debugger. I use it occasionally if need arise (which is not very often).</description>
  <comments>http://notbrainsurgery.livejournal.com/35925.html</comments>
  <category>debugging</category>
  <category>gcc</category>
  <category>irix</category>
  <category>sgi</category>
  <category>debugger</category>
  <category>c++</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://notbrainsurgery.livejournal.com/35666.html</guid>
  <pubDate>Wed, 03 Dec 2008 19:39:01 GMT</pubDate>
  <title>How to stop IM spam</title>
  <link>http://notbrainsurgery.livejournal.com/35666.html</link>
  <description>The amount of IM spam is growing steadily. Even if you can set up your email client to reject messages from unknown senders, still you have to look at request to add you as a friend, which are could be used as a spam media.&lt;br /&gt;&lt;br /&gt;There is a very elegant solution to this problem. It is based on &lt;a href=&quot;http://hashcash.org/&quot; target=&quot;_new&quot;&gt;hashcash&lt;/a&gt; idea. Whenever somebody contacts you on IM first time his as part of handshake protocol he must invest some CPU time. Let us call your IM client a &quot;server&quot; and an IM client which attempts to connect to you a &quot;client&quot;. Server presents a client with a challenge. Client does some calculations based on this challenge and sends back a response. The server then validates if response is correct, and only then shows the client&apos;s message to the you. If response is not correct, the message is silently discarded. The &lt;a href=&quot;http://hashcash.org/papers/hashcash.pdf&quot; target=&quot;_new&quot;&gt;hash cash paper&lt;/a&gt; presents some examples of so-called &quot;&lt;i&gt;non-parallelizable cost functions&lt;/i&gt;&quot; which could be used in &lt;i&gt;interactive&lt;/i&gt; (challenge/response) mode. &lt;br /&gt;&lt;br /&gt;Why wold it work? Spammers are making their money by volume. They send millions of messages. While it is not a problem for your desktop to invest few CPU cycles for each connection, for spammers this number will multiplies by millions of connections they are initiating and the required CPU resources will hopefully make their operation not profitable.&lt;br /&gt;&lt;br /&gt;If you run your IM client in &quot;friends-only&quot; mode, this mechanism should be applied on &quot;add friend&quot; requests. People need to invest CPU time before you will see their &quot;add friend&quot; request.  if you accept messages from anybody (not using &quot;friends-only&quot; mode), then this mechanism should be used on beginning on new conversation (first message). An example of similar mechanism was recently implemented as a &lt;a href=&quot;http://adiumx.com/blog/2008/11/working-on-stopping-spam/&quot; target=&quot;_new&quot;&gt;plugin&lt;/a&gt; for Adium IM client. Their challenge-response mechanism is human-powered.&lt;br /&gt;&lt;br /&gt;UPDATE: there is a Jabber Protocol Extension &lt;a href=&quot;http://xmpp.org/extensions/attic/jep-0158-0.1.html#captcha-hashcash&quot;&gt;JEP-0158&lt;/a&gt; which suggests to use hashcash.</description>
  <comments>http://notbrainsurgery.livejournal.com/35666.html</comments>
  <category>im</category>
  <category>xmpp</category>
  <category>adium</category>
  <category>jep</category>
  <category>hashcash</category>
  <category>spam</category>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://notbrainsurgery.livejournal.com/35518.html</guid>
  <pubDate>Sun, 30 Nov 2008 19:08:42 GMT</pubDate>
  <title>3G vs WiFi power consumtion</title>
  <link>http://notbrainsurgery.livejournal.com/35518.html</link>
  <description>Interestingly, Apple site &lt;a href=&quot;http://www.apple.com/batteries/iphone.html&quot; target=&quot;_new&quot;&gt;says&lt;/a&gt; that iPhone can offer:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;5&lt;/b&gt; hours of Internet use on 3G&lt;br /&gt;&lt;br /&gt;vs.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;6&lt;/b&gt; hours of Internet use on Wi-Fi&lt;br /&gt;&lt;br /&gt;So 3G actully consumes &lt;b&gt;more&lt;/b&gt; power that WiFi.</description>
  <comments>http://notbrainsurgery.livejournal.com/35518.html</comments>
  <category>wifi</category>
  <category>battery</category>
  <category>3g</category>
  <category>mobile</category>
  <category>iphone</category>
  <category>apple</category>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://notbrainsurgery.livejournal.com/35306.html</guid>
  <pubDate>Fri, 28 Nov 2008 22:58:24 GMT</pubDate>
  <title>Push Email on iPhone with ActiveSync</title>
  <link>http://notbrainsurgery.livejournal.com/35306.html</link>
  <description>If you want to get “push” email on your iPhone you have now just two options. You can either go with Apple MobileMe service or with Microsoft Exchange account. I will discuss MobileMe push implementation in a later post. Let us today review how push is implemented with Exchange mail accounts on iPhone.&lt;br /&gt;&lt;br /&gt;The fundamental problem with “push” email is a battery life. In order to get notified about new email one needs to keep a connection to server open, so server can notify your phone about new messages as they arrive. However in mobile environment as you move, your IP change. Also to work reliably on various WiFi hotspots one can rely only one one protocol to be working: HTTP. The latter is not a problem, since ActiveSync protocol (used by MS Exchange) is using HTTP transport. The issue with HTTP is that is not designed to send data from a server to a client. Client always need to send a request and only then, the server can respond. To get notified about new message within, say, 10 seconds, client needs to poll server doing HTTP request every 10 seconds. This would eat your battery pretty fast.&lt;br /&gt;&lt;br /&gt;The ActiveSync solution to this problem is so-called “long pull”. The client does HTTP request to the server (PING protocol command). If there is no new data, instead of responding to the server’s request right away, the client hangs on there as long as possible, delaying the answer. If new data arrives while client is waiting for PING response, the server sends it back right away. If not, after some time the PING is completed, and new one is immediately sent by the client. For example is a server can delay his response to PING connection for up to 900 seconds, in the absence of new mail HTTP requests will be sent once in 900 seconds. At the same time, if new message arrives, the client will be notified immediately. The key point, is that on packet switched radio network like GPRS, a connection which is waiting for response without sending any data does not use additional battery power compared to a regular device standby power consumption. So with this clever trick not only almost instant new message notification could be provided, but the battery consumption is significantly better compared to just polling.&lt;br /&gt;&lt;br /&gt;￼&lt;img src=&quot;http://img510.imageshack.us/img510/889/15612120bq3.jpg&quot; alt=&quot;iPhone Push Settings&quot; align=&quot;left&quot;&gt; Now, let us look closer at iPhone. iPhone have 2 radios: WiFi and 3G (which also can do EDGE or good old GPRS). The phone could be in active mode (the screen is on) and asleep (the screen is off). Interestingly, even if a known WiFi network is present and available, iPhone will still be using 3G to poll server for new mail. This is done presumably because 3G radio by design have lower battery consumption compared to WiFi. Once a new messages are detected using PING command, iPhone will beep and fetch them using SYNC command. Here it behaves differently depending on the mode it is on: if it is ON and WiFi connection is available, it will use this connection to fetch new messages. Presumably this is done because messages could be quite big and WiFi generally speaking is faster than 3G. However, if the phone is asleep, even if WiFi connectivity is available, it will use 3G to fetch new messages. Here, preserving a battery power have a priority over the speed of download. To sum it up: PING is always done over 3G, while SYNC may use WiFi if the phone is active and known WiFi network is available.&lt;br /&gt;&lt;br /&gt;What about iPhone little brother, iPod Touch? It also has a Mail client and WiFi radio (but not 3G). So it has to use energy inefficient WiFi connection for both PING and SYNC commands. To avoid draining the battery, it just stops PINGing your Exchange server in approximately 12 minutes after it goes to sleep. At this point, depending on user settings for regular (non-push) fetching, it will either will switch to polling ever 15 or 30 minutes (using SYNC command) or will just stop checking for email is &quot;Manually&quot; is selected as polling schedule. This is little misleading, since settings screen for mail retrieval schedule clearly states that schedule is used only if Push is disable or not supported. &lt;br /&gt;&lt;br /&gt;I have not tested how iPhone behaves if 3G not available but WiFi is. I just could not find such spot neither at my home nor at my office. I suspect that it will behave exactly like iPod touch.&lt;br /&gt;&lt;br /&gt;P.S. Described above iPhone and iPod touch behaviour applies to firmware version 2.2. It might work differently with other versions.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://digg.com/apple/How_iPhone_Push_Email_works&quot;&gt;&lt;br /&gt;&lt;img src=&quot;http://digg.com/img/badges/100x20-digg-button.gif&quot; width=&quot;100&quot; height=&quot;20&quot; alt=&quot;Digg!&quot; /&gt;&lt;br /&gt;&lt;/a&gt;</description>
  <comments>http://notbrainsurgery.livejournal.com/35306.html</comments>
  <category>activesync</category>
  <category>email</category>
  <category>ipod</category>
  <category>mail</category>
  <category>wifi</category>
  <category>3g</category>
  <category>exchange</category>
  <category>mobile</category>
  <category>push</category>
  <category>iphone</category>
  <category>apple</category>
  <lj:security>public</lj:security>
  <lj:reply-count>12</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://notbrainsurgery.livejournal.com/35038.html</guid>
  <pubDate>Mon, 11 Aug 2008 18:35:18 GMT</pubDate>
  <title>iPhone developer program</title>
  <link>http://notbrainsurgery.livejournal.com/35038.html</link>
  <description>One week ago I have applied for iPhone developer program and have not heard from them since. That makes me wondering, what they are doing all this time, considering my application. They have not asked me anything specific besides my company name, address and number of employees. &lt;br /&gt;&lt;br /&gt;I could not help imagining huge room at Cupertino,CA full of Apple employees (young, well groomed, in black t-shirts) working hard, approving iPhone developer applications. I cam see them sitting in their cubicles and intensively starring at their iMac LCD screens: &lt;i&gt;&quot;Hmm, XYZ Co.  with 20 employees located at Palm Street in San Francisco. Should we let them in? Hmm. Tough decision. Need to think!&quot;.&lt;/i&gt;</description>
  <comments>http://notbrainsurgery.livejournal.com/35038.html</comments>
  <category>developer program</category>
  <category>mobile</category>
  <category>iphone</category>
  <category>apple</category>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://notbrainsurgery.livejournal.com/34605.html</guid>
  <pubDate>Sat, 10 May 2008 02:06:46 GMT</pubDate>
  <title>desktop mentality</title>
  <link>http://notbrainsurgery.livejournal.com/34605.html</link>
  <description>The first versions of Windows Mobile (called back then Windows CE) were quite terrible. The problem is that designing software for mobile devices requires special thinking, and just shrinking desktop software into smaller screen space is hardly sufficient. For example, the whole Windows START button metaphor does not fit very well into tiny screen, because it is an extremely tedious task to navigate of 2-3 levels of popup menus just to start an application. And taking the stylus out each time to do so takes valuable second or two of user time.&lt;br /&gt;&lt;br /&gt;Another example: having one fixed time zone on device is maybe OK for desktop, but it is not acceptable for mobile phone or laptop. People do travel across time zones! So, making it easy to change your time zone without screwing up your calendar events is important. Both iPhone and Windows Mobile went this far. But it takes few more years of trial and error in mobile words to realize, like Nokia did, that after their travels people do come back home, and it is most convenient to have TWO time zones: home and visiting, and give a user easy way to switch between them.&lt;br /&gt;&lt;br /&gt;Now, to the problem that really irks me right now: SMTP servers. There is abundance of free WiFi hotspots available. Most of them, however, block SMTP traffic on port 25, except to their dedicated SMTP server. That&apos;s done to fight SPAM. The problem is that SMTP server settings on iPhone (and most other email clients I&apos;ve seen on mobile devices) are not dependant from the access point you are using right now. So, AT&amp;T has nothing better than &lt;a href=&quot;http://www.wireless.att.com/support/knowledgeBase.do?content=KB72769.html&quot; target=&quot;_new&quot;&gt;suggest&lt;/a&gt; their customers to go and manually change SMTP settings whenever they switch between using their EDGE network and their own WiFi Hotspots! I think it is obvious, that user should be able to override SMTP server settings on mobile devices depending on his current access point ( as it is done for HTTP proxy WiFi network details screen under Settings). Or even better,this information should be obtained automatically, perhaps via DHCP.</description>
  <comments>http://notbrainsurgery.livejournal.com/34605.html</comments>
  <category>desktop</category>
  <category>at&amp;t</category>
  <category>wifi</category>
  <category>smtp</category>
  <category>mobile</category>
  <category>iphone</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://notbrainsurgery.livejournal.com/34356.html</guid>
  <pubDate>Fri, 18 Apr 2008 18:14:59 GMT</pubDate>
  <title>Importing audio books into iTunes</title>
  <link>http://notbrainsurgery.livejournal.com/34356.html</link>
  <description>I have worked out a procedure to import audio books into iTunes. Below you will find a link to &lt;a href=&quot;http://en.wikipedia.org/wiki/Automator_(software)&quot; target=&quot;_new&quot;&gt;Automator&lt;/a&gt; script which automates the following steps:&lt;br /&gt;&lt;br /&gt;1. Convert files to AAC: some older iPods could not remember playback position in MP3 files. For new ones you may want to use this step anyway to adjust bit rate to save space. I am using following import settings in my iTunes:&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://img72.imageshack.us/img72/1338/picture1ig8.png&quot; border=&quot;0&quot; alt=&quot;Image Hosted by ImageShack.us&quot; /&gt;&lt;br /&gt;&lt;br /&gt;2.  Adjust volume by 30%. Some books are just not loud enough and I could not crank volume any more in my car. So as precaution I always adjust a volume by 30% - it always possible to bring it down while listening.&lt;br /&gt;&lt;br /&gt;3. Pre-set equalizer to &quot;&lt;i&gt;Spoken Word&lt;/i&gt;&quot;&lt;br /&gt;&lt;br /&gt;4. Set options song: &quot;&lt;i&gt;Remember Playback Position&lt;/i&gt;&quot; and &quot;&lt;i&gt;Skip When Shuffling&lt;/i&gt;&quot;. Unset options &quot;&lt;i&gt;Part of a Gapless Album&lt;/i&gt;&quot; and &quot;&lt;i&gt;Part of a Compilation&lt;/i&gt;&quot;.&lt;br /&gt;&lt;br /&gt;5. Set Genre to &quot;&lt;i&gt;Audiobooks&lt;/i&gt;&quot;&lt;br /&gt;&lt;br /&gt;I am using these steps for few years now and very happy with results. Additionally, if your chapter names have numbers at the beggning (e.g. &quot;&lt;i&gt;01. Intrduction&lt;/i&gt;&quot;, &quot;&lt;i&gt;02. First Chapter&lt;/i&gt;&quot;) you may want to use &lt;a href=&quot;http://henrik.nyh.se/2007/01/set-id3-track-numbers-from-filename-prefixes-in-itunes&quot; target=&quot;_new&quot;&gt;this iTunes script&lt;/a&gt; to conver them to track numbers.&lt;br /&gt;&lt;br /&gt;Now, as promised, an Automator workflow which performs steps 1-5 on a collection of audio files selected in Finder and adds them to iTunes as a new Playlist, called &quot;&lt;i&gt;&lt;b&gt;New Audio Book&lt;/b&gt;&lt;/i&gt;&quot;. Download &quot;&lt;a href=&quot;http://www.crocodile.org/lord/software/Import%20Audio%20Book.workflow.zip&quot; target=&quot;_new&quot;&gt;Import Audio Book.workflow.zip&lt;/a&gt;&quot; and unzip it into &quot;&lt;i&gt;~/Documents/Workflows&lt;/i&gt;&quot;. Now you can select files, start Automator and run this workflow. Alternatively, you can open it in Automator, choose &quot;&lt;i&gt;Save As Plug-In&lt;/i&gt;&quot;  menu and select &quot;&lt;i&gt;Finder Plugin&lt;/i&gt;&quot; format. After that you can right click on selected files in Finder and select &quot;&lt;i&gt;More-&amp;gt;Automator-&amp;gt;Import Audio Book&lt;/i&gt;&quot; to run this workflow on selected files.</description>
  <comments>http://notbrainsurgery.livejournal.com/34356.html</comments>
  <category>mp3</category>
  <category>itunes</category>
  <category>aac</category>
  <category>audiobooks</category>
  <category>mac</category>
  <category>automator</category>
  <category>import</category>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://notbrainsurgery.livejournal.com/34079.html</guid>
  <pubDate>Tue, 29 Jan 2008 06:48:46 GMT</pubDate>
  <title>how to develop a killer facebook application</title>
  <link>http://notbrainsurgery.livejournal.com/34079.html</link>
  <description>Facebook applications are the latest trend. Now everybody has to have one. Unfortunately, many people do not understand how to design a good facebook application. The usual approach is to take their web site and squeeze as much as possible of its functionality into facebook application. This is usually a very bad idea.&lt;br /&gt;&lt;br /&gt;Let us take as an example FlightStats. They have a pretty good &lt;a href=&quot;http://www.flightstats.com/&quot; target=&quot;_new&quot;&gt;web site&lt;/a&gt; with useful tools. They know how to track flights and seems to be doing it well. Now let us look at &lt;a href=&quot;http://www.facebook.com/apps/application.php?id=7442750869&quot; target=&quot;_new&quot;&gt;their facebook application&lt;/a&gt;. It is just a scaled down version of a web site.&lt;br /&gt;&lt;br /&gt;When you design Facebook application you need to aim to please two audiences. The first is obviously a user who has installed the application. He will see it on his profile page and can use it to access some information or to do something. The second, the most important audience, is his &quot;friends&quot; - people who visit his profile page.&lt;br /&gt;&lt;br /&gt;The value of putting every piece of information which user might ever need to his facebook page is dubious. You have to be seriously addicted to Facebook to make it your main window into the world and prefer feature-stripped and scaled-down facebook applications to real web sites, which are just one click away in the very same browser which you are using to access facebook. Call me old-fashioned, but I would rather go to google.com than install and use Google search widget on my face book page. So the first question to ask yourself is:  what are the reasons for profile owner to keep your application on his profile page? How it is useful to him or her?&lt;br /&gt;&lt;br /&gt;When we are talking about profile owner &quot;friends&quot; we should consider, whenever they are interested to see the application on somebody else profile page. For example, if I am to add Flight Stats application, would my friends be interested to track my mover flying to visit me for Christmas? Thus, the second question one should ask yourself is whenever the facebook application you are developing will be interesting or useful for other people to see on user profile.&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://img149.imageshack.us/img149/320/picture1rn5.png&quot; alt=&quot;Image Hosted by ImageShack.us&quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;By now you can probably figure out how to design good facebook application. Keeping these two audiences in mind and trying to present useful functionality to both of them (which does not have to be the same! The application could look and behave differently depending who is using it - a profile owner or a visitor).&lt;br /&gt;&lt;br /&gt;If you are serious about developing not just good but great applications you should find a way to explore unique advantages of the facebook platform. Ask yourself, what it is you can do on facebook which you could not do on your regular web site? Most obvious thing is to explore users social graph. For example, you can try to build features engaging user friends. Take a closer look at the most popular applications out there. They all engage users in this manner: leave a message on somebody&apos;s wall, send somebody a virtual gift, take a compatibility test together, challenge your friend to a game or quiz, compare tastes, etc. This gives users a chance to interact with each other and this is what really makes facebook applications viral (the holy grail of all web marketing people nowadays).&lt;br /&gt;&lt;br /&gt;Speaking about viral aspect: it feeds on something called &lt;a href=&quot;http://en.wikipedia.org/wiki/Network_effects&quot; target=&quot;_new&quot;&gt;netowork effects.&lt;/a&gt; To exploit that, you need our application to become even more useful with more users adding it. This way the value of application for each user grows with the number of users who have also added it. Let users help to distribute your application. For example taking a movie quiz and putting results on your page could be interesting. But allowing user to challenge one of his friends to take a movie and compare results makes your application viral.&lt;br /&gt;&lt;br /&gt;All of this might sound obvious, but as part of my consulting business, I have to explain these things regularly to customers coming to us for help facebook applications development.</description>
  <comments>http://notbrainsurgery.livejournal.com/34079.html</comments>
  <category>applications</category>
  <category>rant</category>
  <category>facebook</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://notbrainsurgery.livejournal.com/33991.html</guid>
  <pubDate>Mon, 21 Jan 2008 22:24:00 GMT</pubDate>
  <title>Google, Yahoo, Microsoft and MapReduce</title>
  <link>http://notbrainsurgery.livejournal.com/33991.html</link>
  <description>1. &lt;a href=&quot;http://en.wikipedia.org/wiki/MapReduce&quot; target=&quot;_new&quot;&gt;MapReduce&lt;/a&gt; is a software framework invented by &lt;b&gt;Google&lt;/b&gt;.&lt;br /&gt;2. &lt;a href=&quot;http://en.wikipedia.org/wiki/Hadoop&quot; target=&quot;_new&quot;&gt;Hadoop&lt;/a&gt; is open source implementation of MapReduce, &lt;a href=&quot;http://radar.oreilly.com/archives/2007/08/yahoos_bet_on_h.html&quot; target=&quot;_new&quot;&gt;supported&lt;/a&gt; (in part) by &lt;b&gt;Yahoo&lt;/b&gt;.&lt;br /&gt;3. The most coherent description of MapReduce I read so far, could be found in the &lt;a href=&quot;http://www.cs.vu.nl/~ralf/MapReduce/paper.pdf&quot; target=&quot;_new&quot;&gt;paper&lt;/a&gt; from &lt;b&gt;Microsoft&lt;/b&gt;.</description>
  <comments>http://notbrainsurgery.livejournal.com/33991.html</comments>
  <category>algorithms</category>
  <category>microsoft</category>
  <category>mapreduce</category>
  <category>yahoo</category>
  <category>haskell</category>
  <category>google</category>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://notbrainsurgery.livejournal.com/33718.html</guid>
  <pubDate>Fri, 07 Dec 2007 02:40:19 GMT</pubDate>
  <title>OpenID, SecurdID</title>
  <link>http://notbrainsurgery.livejournal.com/33718.html</link>
  <description>Looks like &lt;a href=&quot;http://openid.net/&quot; target=&quot;_new&quot;&gt;OpenID&lt;/a&gt; is finally becoming popular (can&apos;t wait for blogger to &lt;a href=&quot;http://bloggerindraft.blogspot.com/2007/11/new-feature-openid-commenting.html&quot; target=&quot;_new&quot;&gt;enable&lt;/a&gt; it). If you want ot have secure OpenID, protected by RSA SecurID hardware token, &lt;a href=&quot;http://cavemonkey50.com/2007/08/paypals-new-security-key-opens-a-world-of-possibilities/&quot; target=&quot;_new&quot;&gt;here is how&lt;/a&gt; to get one for just $5 (requires PayPal account).&lt;br /&gt;&lt;br /&gt;Speaking about PayPal and SecurID: why on the earth they do not allow to use one token with multiple accounts? I happen to have two (personal and business) and I hate the idea of carrying two tokens.</description>
  <comments>http://notbrainsurgery.livejournal.com/33718.html</comments>
  <category>securid</category>
  <category>openid</category>
  <category>paypal</category>
  <category>rsa</category>
  <lj:security>public</lj:security>
  <lj:reply-count>9</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://notbrainsurgery.livejournal.com/33317.html</guid>
  <pubDate>Sun, 04 Nov 2007 01:54:40 GMT</pubDate>
  <title>GMail as spam filter, using IMAP</title>
  <link>http://notbrainsurgery.livejournal.com/33317.html</link>
  <description>One of non-obvious implications of Gmail &lt;a href=&quot;http://gmailblog.blogspot.com/2007/10/sync-your-inbox-across-devices-with.html&quot;&gt;offering IMAP interface&lt;/a&gt;, is that now you can easily access from outside your SPAM folder. It might sound like not such a big deal, but it opens access to Gmail spam filtering technology, which seems to be very good.&lt;br /&gt;&lt;br /&gt;One obvious use is to use Gmail account as honey pot, and train your local spam filter using corpus of spam, caught by Gmail. I can see a cron task, fetching new spam from Gmail via IMAP and training &lt;a href=&quot;http://spamassassin.apache.org/&quot;&gt;spamassassin&lt;/a&gt; with it via &lt;i&gt;&apos;sa-learn&apos;&lt;/i&gt; command.&lt;br /&gt;&lt;br /&gt;Another use would be to build a plugin for &lt;i&gt;spamassassin&lt;/i&gt;, which sends a copy of each new message to gmail account with SMTP, when waits for it to appear either in INBOX or in SPAM folder. Thus, one could use Gmail as a spam filter.</description>
  <comments>http://notbrainsurgery.livejournal.com/33317.html</comments>
  <category>imap</category>
  <category>gmail</category>
  <category>spam</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://notbrainsurgery.livejournal.com/33060.html</guid>
  <pubDate>Wed, 31 Oct 2007 05:39:05 GMT</pubDate>
  <title>broadband internet speed statictics</title>
  <link>http://notbrainsurgery.livejournal.com/33060.html</link>
  <description>For one of my projects, I needed data on average upload and download speeds for broadband users. Here is what I found:&lt;br /&gt;&lt;br /&gt;According to &lt;a href=&quot;http://speedtest.net/&quot;&gt;speedtest.net&lt;/a&gt; as of today global average download speed is &lt;b&gt;3602 kb/s&lt;/b&gt; and upload speed is &lt;b&gt;796 kb/s&lt;/b&gt;. Quick tabulation of &lt;a href=&quot;http://www.dslreports.com/archive&quot;&gt;dslreports.com data&lt;/a&gt; (in spreadsheet form &lt;a href=&quot;http://spreadsheets.google.com/pub?key=pO-QEOV01WVMw78obfzl2bA&quot;&gt;here&lt;/a&gt;) gives us &lt;b&gt;2409 kbps&lt;/b&gt; and &lt;b&gt;571 kbps&lt;/b&gt; respectively.&lt;br /&gt;&lt;br /&gt;This is little higher when I anticipated. Especially I was surprised by upload speeds.</description>
  <comments>http://notbrainsurgery.livejournal.com/33060.html</comments>
  <category>speed</category>
  <category>dslreports</category>
  <category>broadband</category>
  <category>speedtest</category>
  <category>dsl</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://notbrainsurgery.livejournal.com/32929.html</guid>
  <pubDate>Fri, 19 Oct 2007 18:22:39 GMT</pubDate>
  <title>Apple Mail and Broken URLs</title>
  <link>http://notbrainsurgery.livejournal.com/32929.html</link>
  <description>I am using Apple mail and love it. Except many people complained to me repeatedly that sometimes when I send long URLs they break into several lines and they could not click on them. Today I finally decided to investigate what&apos;s goind on.&lt;br /&gt;&lt;br /&gt;Apple Mail sends plain text messages with the following Content-Type headers:&lt;br /&gt;&lt;br /&gt;Content-Type: text/plain;&lt;br /&gt;	charset=US-ASCII;&lt;br /&gt;	delsp=yes;&lt;br /&gt;	format=flowed&lt;br /&gt;&lt;br /&gt;This is perfectly legal, per &lt;a href=&quot;http://www.rfc-editor.org/rfc/rfc3676.txt&quot;&gt;RFC-3676&lt;/a&gt;. It does break long lines, but in a manner, that other mail client which undertand this format could reconstruct them back. For example if another Apple Mail is used to read the message, it looks perfectly OK:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.flickr.com/photos/vzaliva/1638695334/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://farm3.static.flickr.com/2411/1638695334_5e0063cee1_o.png&quot; width=&quot;696&quot; height=&quot;165&quot; alt=&quot;AppleMail.png&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Unfortunately,  other popular clients do not understand this, as of today. Gmail:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.flickr.com/photos/vzaliva/1637821733/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://farm3.static.flickr.com/2053/1637821733_ba8c94223b_o.png&quot; width=&quot;350&quot; height=&quot;169&quot; alt=&quot;Gmail.png&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Outlook 2003:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.flickr.com/photos/vzaliva/1638695544/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://farm3.static.flickr.com/2031/1638695544_6f55bb65c7_o.png&quot; width=&quot;660&quot; height=&quot;202&quot; alt=&quot;Outlook 2003.png&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In examples above, I also tried to enclose the long URL in angle brackets, as recommended by &lt;a href=&quot;http://www.macosxhints.com/article.php?story=20070112124954101&quot;&gt;some sources&lt;/a&gt;. This format is defined in &lt;a href=&quot;http://www.ietf.org/rfc/rfc2396.txt&quot;&gt;RFC 2396&lt;/a&gt;, Appledix E: &quot;Recommendations for Delimiting URI in Context&quot;. As you can see, this did not help either.&lt;br /&gt;&lt;br /&gt;It looks like that as of right now there is no sure way to put long URLs in messages send by Apple Mail without a risk of them being broken down, when displayed by popular mail clients. Common workardound is to use services like &lt;a href=&quot;http://tinyurl.com/&quot;&gt;TinyURL&lt;/a&gt; to map them to shorter URLs.</description>
  <comments>http://notbrainsurgery.livejournal.com/32929.html</comments>
  <category>delsp</category>
  <category>wrapping</category>
  <category>outlook</category>
  <category>url</category>
  <category>gmail</category>
  <category>mail</category>
  <category>flowed</category>
  <category>apple</category>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://notbrainsurgery.livejournal.com/32626.html</guid>
  <pubDate>Wed, 03 Oct 2007 18:43:47 GMT</pubDate>
  <title>hashcash, Outlook Postmark</title>
  <link>http://notbrainsurgery.livejournal.com/32626.html</link>
  <description>Without much fanfare Microsoft have included in OutLook 2007 a &lt;a href=&quot;http://www.microsoft.com/mscorp/safety/technologies/antispam/default.mspx#4&quot;&gt;Postmark feature&lt;/a&gt; which is using &quot;Math Puzzle&quot; for SPAM control:&lt;br /&gt;&lt;br /&gt;&lt;blockquote cite=&quot;http://www.windowsitpro.com/Articles/ArticleID/50050/50050.html?Ad=1&quot;&gt;&lt;i&gt;&quot;A new Outlook E-mail Postmark feature aims to make it easier for other Outlook 2007 users to receive legitimate messages that might otherwise be classified as spam. When a user sends a “spammy” message, Outlook performs the calculations necessary to solve a simple computational puzzle and adds information about the puzzle and the solution to the SMTP message header. Because that computation takes only a little time for one message or a few messages but would take a very long time for a spammer sending millions of messages, the presence of an Outlook E-mail Postmark in the message header is a strong indication that the message isn’t spam.&quot;&lt;/i&gt;&lt;/blockquote&gt;&lt;a href=&quot;http://www.windowsitpro.com/Articles/ArticleID/50050/50050.html?Ad=1&quot;&gt;[1]&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is basically an implementation of old good &lt;a href=&quot;http://hashcash.org/&quot;&gt;HashCash&lt;/a&gt; idea. I think this is great that they are doing this. This is one of few ways which allows to combat zombie computers sending spam email. I wish this implementation become more mainstream in other mail clients.&lt;br /&gt;&lt;br /&gt;However, there are several problems with Microsoft approach. The first is that a Postmark feature is switched off my default &lt;a href=&quot;http://office.microsoft.com/en-us/outlook/HA100625921033.aspx&quot;&gt;[2]&lt;/a&gt;. The second is that according to some reports&lt;a href=&quot;http://www.ferris.com/2006/06/30/outlook_2007_sp/&quot;&gt;[3]&lt;/a&gt;, Microsoft owns a patent on this technology, which could stop its adoption by other email software vendors. I also have not found a clear technical specficaiton of Postmark implementation, which could be used, for example, to add postmark checking to SpamAssassin.</description>
  <comments>http://notbrainsurgery.livejournal.com/32626.html</comments>
  <category>antispam</category>
  <category>outlook</category>
  <category>microsoft</category>
  <category>patent</category>
  <category>puzzle</category>
  <category>spamassassin</category>
  <category>spam</category>
  <category>hashcash</category>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://notbrainsurgery.livejournal.com/32470.html</guid>
  <pubDate>Fri, 06 Jul 2007 21:22:02 GMT</pubDate>
  <title>2050 - The Year of the Linux Desktop</title>
  <link>http://notbrainsurgery.livejournal.com/32470.html</link>
  <description>2008: &lt;a href=&quot;http://www.maximumpc.com/article/2008_year_of_the_linux_desktop&quot;&gt;2008: Year of the Linux Desktop&lt;/a&gt;&lt;br /&gt;2007: &lt;a href=&quot;http://mywheel.net/blog/index.php/2007/04/23/2007-the-year-of-the-linux-desktop/&quot;&gt;2007 - The year of the Linux desktop?&lt;/a&gt;&lt;br /&gt;2006: &lt;a href=&quot;http://www.linuxtoday.com/it_management/2006040800626RVSW&quot;&gt;Government Computer News: 2006: The Year of Desktop Linux?&lt;/a&gt;&lt;br /&gt;2005: &lt;a href=&quot;http://www.expresscomputeronline.com/20050307/market07.shtml&quot;&gt;“2005 will be the year of the Linux desktop”&lt;/a&gt;&lt;br /&gt;2004: &lt;a href=&quot;http://linux.slashdot.org/article.pl?sid=04/01/15/1531237&quot;&gt; Linus Says 2004 is the Year for Desktop Linux&lt;/a&gt;&lt;br /&gt;2003: &lt;a href=&quot;http://www.linux-mag.com/id/1351/&quot;&gt;The Year of the Linux Desktop:&lt;/a&gt;&lt;br /&gt;2002: &lt;a href=&quot;http://news.zdnet.co.uk/software/0,1000000121,2127602,00.htm&quot;&gt;The Year Ahead: Linux continues to push for the desktop&lt;/a&gt;</description>
  <comments>http://notbrainsurgery.livejournal.com/32470.html</comments>
  <category>web20</category>
  <category>widgets</category>
  <category>widgetbox</category>
  <category>gadgets</category>
  <category>store</category>
  <category>gadget</category>
  <category>web</category>
  <category>linking</category>
  <category>widget</category>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://notbrainsurgery.livejournal.com/32150.html</guid>
  <pubDate>Tue, 26 Jun 2007 23:48:09 GMT</pubDate>
  <title>Widget Web</title>
  <link>http://notbrainsurgery.livejournal.com/32150.html</link>
  <description>&lt;a href=&quot;http://en.wikipedia.org/wiki/Web_widget&quot;&gt;Widgets&lt;/a&gt; have become very popular recently. First, they appeared on Myspace as a way for users to spice-up their profiles. There are small companies living off widgets hosted on Myspace. Then Yahoo &lt;a href=&quot;http://widgets.yahoo.com/&quot;&gt;adopted&lt;/a&gt; them. Then the concept spread to Desktop: &lt;a href=&quot;http://www.apple.com/downloads/dashboard/&quot;&gt;Mac Widgets&lt;/a&gt;, &lt;a href=&quot;http://desktop.google.com/plugins/&quot;&gt;Google Desktop Gadgets&lt;/a&gt;, &lt;a href=&quot;http://microsoftgadgets.com/&quot;&gt;Microsoft Gadgets&lt;/a&gt;. Facebook officially embraced them, calling them &quot;&lt;a href=&quot;http://developers.facebook.com/&quot;&gt;applications&lt;/a&gt;&quot; and making them a key building block of their platform. Why widgets are so popular and where it is all heading?&lt;br /&gt;&lt;br /&gt;Let us start from pre-web days. We had disjoined information in various formats. The main mantra of Web 1.0 was &quot;link link link....&quot; Web 2.0 was about data sharing. The message changed - not just link, but share data in machine readable format, plus provide APIs in form of  web services. I think the next logical step after data sharing is sharing functionality. You build your web site putting together pieces from other sites in form of widgets, gadgets, blocks, applications... whatever they will end up being called. &lt;br /&gt;&lt;br /&gt;&lt;i&gt;pre-Web days:&lt;/i&gt; CD with songs&lt;br /&gt;&lt;i&gt;Web 1.0:&lt;/i&gt; collection of MP3 files on the web with linked from different sites.&lt;br /&gt;&lt;i&gt;Web 2.0:&lt;/i&gt; podcast&lt;br /&gt;&lt;i&gt;Widget Web:&lt;/i&gt; embedded player widget&lt;br /&gt;&lt;br /&gt;There are also some early &lt;a href=&quot;http://www.widgetbox.com/&quot;&gt;standardization efforts&lt;/a&gt; aiming at making widgets portable between Web and Desktop platforms. While many companies are concentrating on small flash and Javascript widgets, I think the future lies in more comprehensive embedded application platforms -  the direction Facebook is heading right now.&lt;br /&gt;&lt;br /&gt;Let us look at another example: web ads. It started in Web 1.0 days with simple banner ads, which were usually individually negotiated between advertisers and web sites owners. Now, in Web 2.0 days it a serious, well-developed business. There are web advertisement networks which are exchanging XML streams of advertisement requests to which comsumer-facing web sites subscribe to and then select and display ads based on keywords, user profile, going rates, budget, etc. But still, at the end user have to click on the ad and go to the advertiser&apos;s web site to make a purchase. In Widget Web days, I can imaging ads becoming mini-stores embedded in the pages. It shows you product ad, and if you like it, you can click on it and buy it right there, without leaving web page. This way instead of bringing users to your store you bring your store to them instead.</description>
  <comments>http://notbrainsurgery.livejournal.com/32150.html</comments>
  <category>web20</category>
  <category>widgets</category>
  <category>widgetbox</category>
  <category>gadgets</category>
  <category>store</category>
  <category>gadget</category>
  <category>web</category>
  <category>linking</category>
  <category>widget</category>
  <lj:security>public</lj:security>
  <lj:reply-count>3</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://notbrainsurgery.livejournal.com/31822.html</guid>
  <pubDate>Tue, 15 May 2007 04:58:42 GMT</pubDate>
  <title>One year later: programming languages and google trends</title>
  <link>http://notbrainsurgery.livejournal.com/31822.html</link>
  <description>About one year ago I wrote about &lt;a href=&quot;http://notbrainsurgery.livejournal.com/28620.html&quot; target=&quot;_new&quot;&gt;Java being on decline&lt;/a&gt;, according to Google Trends. Today I decided to revisit this subject. However something far more interesting caught my eye. I think as technlogy matures it becomes a commodity and eventualy moves from drawing boards of early adopters (Silicon Valley) to vast production factories of the outsourcing word (India, China). Let us test this hypothesis:&lt;br /&gt;&lt;br /&gt;Group 1: &lt;a href=&quot;http://www.flickr.com/photos/vzaliva/499030412/&quot; target=&quot;_new&quot;&gt;Cobol&lt;/a&gt;, &lt;a href=&quot;http://www.flickr.com/photos/vzaliva/499078889/in/photostream/&quot; target=&quot;_new&quot;&gt;Oracle&lt;/a&gt;, &lt;a href=&quot;http://www.flickr.com/photos/vzaliva/499078861/in/photostream/&quot; target=&quot;_new&quot;&gt;C++&lt;/a&gt;, &lt;a href=&quot;http://www.flickr.com/photos/vzaliva/499078835/in/photostream/&quot; target=&quot;_new&quot;&gt;java&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Group 2: &lt;a href=&quot;http://www.flickr.com/photos/vzaliva/499030308/in/photostream/&quot; target=&quot;_new&quot;&gt;Web 2.0&lt;/a&gt;, &lt;a href=&quot;http://www.flickr.com/photos/vzaliva/499030278/in/photostream/&quot; target=&quot;_new&quot;&gt;Python&lt;/a&gt;, &lt;a href=&quot;http://www.flickr.com/photos/vzaliva/499078761/in/photostream/&quot; target=&quot;_new&quot;&gt;Ruby&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Can you see the trend?</description>
  <comments>http://notbrainsurgery.livejournal.com/31822.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>6</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://notbrainsurgery.livejournal.com/31581.html</guid>
  <pubDate>Sat, 14 Apr 2007 05:34:41 GMT</pubDate>
  <title>Fast4</title>
  <link>http://notbrainsurgery.livejournal.com/31581.html</link>
  <description>I have produced &lt;a href=&quot;http://www.accelkey.com/AccelKeyWhitepaper.pdf&quot; target=&quot;_new&quot;&gt;a paper&lt;/a&gt; on my  idea about search method using 4-directional input device, like joystick or a trackball. Besides the obvious uses like mobile phone address book search, it could be also used in car navigation systems, portable music players, game consoles, etc.&lt;br /&gt;&lt;br /&gt;There is a demo for J2ME phones as well as Blackberry app which could be downloaded &lt;a href=&quot;http://www.accelkey.com/&quot; target=&quot;_new&quot;&gt;here&lt;/a&gt;.</description>
  <comments>http://notbrainsurgery.livejournal.com/31581.html</comments>
  <category>idea</category>
  <category>paper</category>
  <category>selection</category>
  <category>input</category>
  <category>joystick</category>
  <category>accelkey</category>
  <category>mobile</category>
  <category>trackball</category>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://notbrainsurgery.livejournal.com/31447.html</guid>
  <pubDate>Tue, 20 Feb 2007 18:13:49 GMT</pubDate>
  <title>Using UsernameToken Authentication with Blogger and MetaWebLog APIs</title>
  <link>http://notbrainsurgery.livejournal.com/31447.html</link>
  <description>I have drafted a small note for one of the projects I am involved in. Here it is: &quot;&lt;a href=&quot;http://www.crocodile.org/lord/metaweblog-wsse.pdf&quot; target=&quot;_new&quot;&gt;Using UsernameToken Authentication with Blogger and MetaWebLog APIs&lt;/a&gt;&quot; - In case you ever need something like this :)</description>
  <comments>http://notbrainsurgery.livejournal.com/31447.html</comments>
  <category>metaweblog</category>
  <category>api</category>
  <category>authentication</category>
  <category>blogger</category>
  <category>paper</category>
  <category>usernametoken</category>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://notbrainsurgery.livejournal.com/31150.html</guid>
  <pubDate>Fri, 02 Feb 2007 05:44:29 GMT</pubDate>
  <title>I hate Smalltalk!</title>
  <link>http://notbrainsurgery.livejournal.com/31150.html</link>
  <description>A friend of mine sent me today a link to a Smalltalk-based web framework. That reminded me that I talked to my landlord last week. He is raising my rent because he lost his job. He could not find a job for 3 months. I asked what are his skills, and he told that he was doing Smalltalk programming last 5 years. He looked at some job-seekers web sites, and everybody wants some web stuff (big surprise!) which he have no clue about. He is considering taking some HTML and PHP classes. I am sure there is a morale here. There must be one, because my rent went up, and I feel that Smalltalk (or rather its demise) is responsible for that.</description>
  <comments>http://notbrainsurgery.livejournal.com/31150.html</comments>
  <category>rent</category>
  <category>job</category>
  <category>smalltalk</category>
  <lj:security>public</lj:security>
  <lj:reply-count>3</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://notbrainsurgery.livejournal.com/30805.html</guid>
  <pubDate>Sun, 21 Jan 2007 02:19:04 GMT</pubDate>
  <title>tags hierarchies</title>
  <link>http://notbrainsurgery.livejournal.com/30805.html</link>
  <description>Tags assigned by user to given set of objects often tends to have hidden implicit structure. Let us try to explore it:&lt;br /&gt;&lt;br /&gt;The first, the most obvious relationship is generalization. If all objects with the tag &quot;A&quot; always tagged with &quot;B&quot; (but not vice versa) then the tag &quot;B&quot; is more generic. (One can also describe this in terms of sets: a set of objects tagged with &quot;B&quot; is a superset of objects tagged with &quot;A&quot;). Examples of graphs depicting this type of relationship for two users (taken from real-life data) can be seen &lt;a target=&quot;_new&quot; href=&quot;http://www.flickr.com/photo_zoom.gne?id=501439396&amp;amp;size=o&quot;&gt;here&lt;/a&gt; and &lt;a target=&quot;_new&quot; href=&quot;http://www.flickr.com/photo_zoom.gne?id=501473713&amp;amp;size=o&quot;&gt;here&lt;/a&gt;. The arrow is pointing in direction on more &lt;i&gt;generic&lt;/i&gt; tag.&lt;br /&gt;&lt;br /&gt;Another interesting relationship I would call &lt;i&gt;&quot;closeness&quot;&lt;/i&gt;. On fixed data set this property shows how often a pair of tags happens to appear together on the same object. An example of graphs depicting this type of relationship can be seen &lt;a target=&quot;_new&quot; href=&quot;http://www.flickr.com/photo_zoom.gne?id=501473813&amp;amp;size=l&quot;&gt;here&lt;/a&gt; and &lt;a target=&quot;_new&quot; href=&quot;http://www.flickr.com/photo_zoom.gne?id=501439202&amp;amp;size=l&quot;&gt;here&lt;/a&gt;. The numbers above lines show absolute number of occurrences of two tags it link appearing together assigned to the same object. (It is probably makes sense to normalize them, for example by dividing by total number of tags assignments by given user.) This relationship is bidirectional.&lt;br /&gt;&lt;br /&gt;How this information could be used? First of all, it could be used for navigation in UI. One can devise navigation controls which allow users to traverse this hierarchy. Also this kind of relationship information could be used in various &lt;a target=&quot;_new&quot; href=&quot;http://en.wikipedia.org/wiki/Data_clustering&quot;&gt;clustering algorithms&lt;/a&gt;. Probably this information could also be used also in some collaborative filtering algorithms.</description>
  <comments>http://notbrainsurgery.livejournal.com/30805.html</comments>
  <category>hierarchies</category>
  <category>grpahs</category>
  <category>closeness</category>
  <category>tags</category>
  <category>generalization</category>
  <category>clusering</category>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://notbrainsurgery.livejournal.com/30713.html</guid>
  <pubDate>Sun, 14 Jan 2007 02:01:35 GMT</pubDate>
  <title>MacOS, CIFS (Samba), WebDAV</title>
  <link>http://notbrainsurgery.livejournal.com/30713.html</link>
  <description>In order to backup some files from my Macbook to &lt;a href=&quot;http://www.openfiler.com/&quot; target=&quot;_new&quot;&gt;OpenFiler&lt;/a&gt; server I did quick and very unscientific test: I have copied approximately 1.6Gb (iMovie project folder with 75 files) using &apos;cp -r&apos; command first to disk mounted with &lt;a href=&quot;http://en.wikipedia.org/wiki/CIFS&quot; target=&quot;_new&quot;&gt;Samba&lt;/a&gt; and then with &lt;a href=&quot;http://en.wikipedia.org/wiki/WebDAV&quot; target=&quot;_new&quot;&gt;WebDAV&lt;/a&gt;.  SMB copy took 6.2 seconds and WebDAV took 5.3.</description>
  <comments>http://notbrainsurgery.livejournal.com/30713.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://notbrainsurgery.livejournal.com/30303.html</guid>
  <pubDate>Sun, 14 Jan 2007 00:43:42 GMT</pubDate>
  <title>changing OpenID provider</title>
  <link>http://notbrainsurgery.livejournal.com/30303.html</link>
  <description>I am using &lt;a href=&quot;http://www.crocodile.org/&quot; target=&quot;_new&quot;&gt;www.crocodile.org&lt;/a&gt; as my &lt;a href=&quot;http://openid.net/&quot; target=&quot;_new&quot;&gt;OpenID&lt;/a&gt; URI. Since I am not running OpenID server of my own, the actual authentication was until recently delegated to &lt;a href=&quot;http://www.livejournal.com/&quot; target=&quot;_new&quot;&gt;LiveJournal&lt;/a&gt;. Yesterday I switched to &lt;a href=&quot;https://www.myopenid.com/&quot; target=&quot;_new&quot;&gt;MyOpenID.com&lt;/a&gt; as my identity server. Mainly because it supports &lt;a href=&quot;http://openid.net/specs/openid-simple-registration-extension-1_0.html&quot; target=&quot;_new&quot;&gt;Simple Registration Extension&lt;/a&gt; and overall have very nice interface for managing trusted sites and &quot;personas&quot;. This is what I like about OpenID design: it takes just couple of lines of HTML code to turn URL into OpenID URI and you can change backend server easily anytime.</description>
  <comments>http://notbrainsurgery.livejournal.com/30303.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://notbrainsurgery.livejournal.com/29773.html</guid>
  <pubDate>Fri, 29 Dec 2006 02:49:07 GMT</pubDate>
  <title>Poor Man Video Thumbnail Generation</title>
  <link>http://notbrainsurgery.livejournal.com/29773.html</link>
  <description>If you are building yet another &lt;a href=&quot;http://youtube.com/&quot; target=&quot;_new&quot;&gt;YouTube&lt;/a&gt;-like service, eventually, you will be facing the problem of generating thumbnails for video clips. The simplest solution would be to get some random or fixed frame, and use is a thumb. Unfortunately, this does not always produce best results. You can try to implement more sophisticated algorithms, like described &lt;a href=&quot;http://ieeexplore.ieee.org/xpl/freeabs_all.jsp?arnumber=899354&quot; target=&quot;_new&quot;&gt;here&lt;/a&gt; (Quote:&lt;i&gt; &quot;The shot and key frame are selected based on measures of motion and spatial activity and the likeliness to include people. The latter is determined by skin-color detection and face detection.&quot;&lt;/i&gt;). I did not have time and patience to implement such complex algorithms, so I came up with one of my own, which is really simple, could be implemented in couple of hundreds lines of code and works pretty well.&lt;br /&gt;&lt;br /&gt;The main idea is very simple: we analyze first few seconds of a clip and build histograms of color distribution per frame. Then, we average them, building an averaged color distribution histogram. Then we find a frame, which is closest to the average value (I am using &lt;a href=&quot;http://en.wikipedia.org/wiki/Mean_square_error&quot; target=&quot;_new&quot;&gt;RMSE&lt;/a&gt; to estimate &quot;closeness&quot;). We select a frame close to beginning of the video, which makes selection process faster (less frames to examine) and less likely to include spoilers. Selected picture is similar in color distribution to the overall video theme, making it more likely to display typical frame.&lt;br /&gt;&lt;br /&gt;I run it on few hundreds video clips, and it shows pretty good &lt;a href=&quot;http://www.crocodile.org/lord/thumbextraction/&quot; target=&quot;_new&quot;&gt;results&lt;/a&gt;. Of course, these results are not representative, I&apos;ve selected most interesting ones but generally I think it is very usable. You can grab the &lt;a href=&quot;http://www.crocodile.org/lord/thumbextraction/vthumb.py&quot; target=&quot;_new&quot;&gt;source code&lt;/a&gt; and try it yourself.</description>
  <comments>http://notbrainsurgery.livejournal.com/29773.html</comments>
  <category>thumbnail</category>
  <category>python</category>
  <category>algorithm</category>
  <category>video</category>
  <category>image</category>
  <lj:security>public</lj:security>
  <lj:reply-count>6</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://notbrainsurgery.livejournal.com/29454.html</guid>
  <pubDate>Mon, 27 Nov 2006 01:17:42 GMT</pubDate>
  <title>proprietary encryption</title>
  <link>http://notbrainsurgery.livejournal.com/29454.html</link>
  <description>Whenever I am hearing about somebody implementing their own proprietary encryption, in the most cases it turns out to be combinations of bitwise exclusive disjunction operations plus some trivial data mangling.&lt;br /&gt;&lt;br /&gt;My interpretation of this observation is that the kind of people who do not understand why proprietary encryption algorithms are not good idea are usually could not come up with anything better than XORs.</description>
  <comments>http://notbrainsurgery.livejournal.com/29454.html</comments>
  <category>proprietary</category>
  <category>encryption</category>
  <category>xor</category>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
</channel>
</rss>
