<?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-1121926833938164830</id><updated>2012-02-16T11:30:58.895+02:00</updated><category term='C++'/><category term='HTC'/><category term='GWT'/><category term='bug'/><category term='security'/><category term='My software'/><category term='concept'/><category term='iPad'/><category term='Android'/><category term='Java'/><category term='Programming'/><category term='ebook'/><category term='Open Source'/><category term='Sync'/><title type='text'>Demosten's Blog (English)</title><subtitle type='html'>A Blog targeting various subjects. Software development, politics and some thought sharing</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://demosten-eng.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1121926833938164830/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://demosten-eng.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>demosten</name><uri>http://www.blogger.com/profile/02216714190261854671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://bp2.blogger.com/_RMhH5HhPyQ4/SIIR3FM-bbI/AAAAAAAAACQ/pq7F5q32hjI/S220/avatar.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>18</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1121926833938164830.post-5078979625977666329</id><published>2011-09-15T06:36:00.000+03:00</published><updated>2011-09-15T06:39:31.696+03:00</updated><title type='text'>Compiling Your Own Version of SQLite for iOS and applying some fixes</title><content type='html'>Adding your own version of sqlite for iOS is fairly easy task.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Go to &lt;a href="http://www.sqlite.org/"&gt;http://www.sqlite.org/&lt;/a&gt; and download the latest sqlite amalgamation archive&lt;/li&gt;&lt;li&gt;Extract it somewhere and add it to your Xcode project. You have several options here. You could copy it to your project folder, or link to it. You could also decide, to put it as a static library target and link it to your main target. It's up to you. You will need only sqlite.c and sqlite.h files.&lt;/li&gt;&lt;li&gt;Apply some #defines you might need. For example:&lt;/li&gt;&lt;/ol&gt;&lt;pre class="c" name="code"&gt;#define SQLITE_ENABLE_FTS3&lt;br /&gt;#define SQLITE_DISABLE_LFS&lt;br /&gt;#define SQLITE_THREADSAFE 0&lt;/pre&gt;Then you can compile!&lt;br /&gt;&lt;br /&gt;If you need more detail about this part of the process, you can find more detailed description &lt;a href="http://longweekendmobile.com/2010/06/16/sqlite-full-text-search-for-iphone-ipadyour-own-sqlite-for-iphone-and-ipad/"&gt;here&lt;/a&gt; and &lt;a href="http://mobileorchard.com/compiling-your-own-version-of-sqlite-for-ios/"&gt;here&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;And then I hit a problem. I was testing on different simulator versions and found out that for some reason SQLite functions returned strange errors ( SQLITE_CORRUPT with number code 11 ) with some versions of the simulator, while with others, everything worked perfectly fine. After hours of debugging, I've found that the problem is in wrong file size, returned by a function called unixFileSize. Here is how it looks in my sqlite version:&lt;br /&gt;&lt;pre class="c" name="code"&gt;/*&lt;br /&gt;** Determine the current size of a file in bytes&lt;br /&gt;*/&lt;br /&gt;static int unixFileSize(sqlite3_file *id, i64 *pSize){&lt;br /&gt;  int rc;&lt;br /&gt;  struct stat buf;&lt;br /&gt;  assert( id );&lt;br /&gt;  rc = osFstat(((unixFile*)id)-&amp;gt;h, &amp;amp;buf);&lt;br /&gt;  SimulateIOError( rc=1 );&lt;br /&gt;  if( rc!=0 ){&lt;br /&gt;    ((unixFile*)id)-&amp;gt;lastErrno = errno;&lt;br /&gt;    return SQLITE_IOERR_FSTAT;&lt;br /&gt;  }&lt;br /&gt;  *pSize = buf.st_size;&lt;br /&gt;&lt;br /&gt;  /* When opening a zero-size database, the findInodeInfo() procedure&lt;br /&gt;  ** writes a single byte into that file in order to work around a bug&lt;br /&gt;  ** in the OS-X msdos filesystem.  In order to avoid problems with upper&lt;br /&gt;  ** layers, we need to report this file size as zero even though it is&lt;br /&gt;  ** really 1.   Ticket #3260.&lt;br /&gt;  */&lt;br /&gt;  if( *pSize==1 ) *pSize = 0;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  return SQLITE_OK;&lt;br /&gt;}&lt;/pre&gt;Here after a successful call to osFstat, buf.st_size contained wrong file size. This is clearly not a bug in SQLite. There might be several reasons for this to happen. Probably struct stat is different in terms of packaging or field sizes from the one compiled with some of the simulators. I don't know and since I cannot fix it in iOS Simulator (the power of closed source in action), I don't really care. What I can fix, is not to use fstat() and struct stat in this function. Here is how I changed the function using other Unix ways and do the job:&lt;br /&gt;&lt;pre class="c" name="code"&gt;/*&lt;br /&gt;** Determine the current size of a file in bytes&lt;br /&gt;*/&lt;br /&gt;static int unixFileSize(sqlite3_file *id, i64 *pSize){&lt;br /&gt;  off_t pos, size;&lt;br /&gt;  pos = lseek(((unixFile*)id)-&amp;gt;h, 0L, SEEK_CUR);&lt;br /&gt;  if (-1 == pos){&lt;br /&gt;    ((unixFile*)id)-&amp;gt;lastErrno = errno;&lt;br /&gt;    return SQLITE_IOERR_SEEK;&lt;br /&gt;  }&lt;br /&gt;  size = lseek(((unixFile*)id)-&amp;gt;h, 0L, SEEK_END);&lt;br /&gt;  if (-1 == size) {&lt;br /&gt;    ((unixFile*)id)-&amp;gt;lastErrno = errno;&lt;br /&gt;    return SQLITE_IOERR_SEEK;&lt;br /&gt;  }&lt;br /&gt;  if (-1 == lseek(((unixFile*)id)-&amp;gt;h, pos, SEEK_SET)) {&lt;br /&gt;    ((unixFile*)id)-&amp;gt;lastErrno = errno;&lt;br /&gt;    return SQLITE_IOERR_SEEK;&lt;br /&gt;  }&lt;br /&gt;  *pSize = size;&lt;br /&gt;&lt;br /&gt;  /* When opening a zero-size database, the findInodeInfo() procedure&lt;br /&gt;  ** writes a single byte into that file in order to work around a bug&lt;br /&gt;  ** in the OS-X msdos filesystem.  In order to avoid problems with upper&lt;br /&gt;  ** layers, we need to report this file size as zero even though it is&lt;br /&gt;  ** really 1.   Ticket #3260.&lt;br /&gt;  */&lt;br /&gt;  if( *pSize==1 ) *pSize = 0;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  return SQLITE_OK;&lt;br /&gt;}&lt;/pre&gt;As you can see I'm using lseek to get the file size and thus avoid the struct stat and fstat() usage. This fixed the problem for me and I hope this could spare some time to others too. Note that this fix is not portable and will not work in non Unix environment.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1121926833938164830-5078979625977666329?l=demosten-eng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://demosten-eng.blogspot.com/feeds/5078979625977666329/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1121926833938164830&amp;postID=5078979625977666329' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1121926833938164830/posts/default/5078979625977666329'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1121926833938164830/posts/default/5078979625977666329'/><link rel='alternate' type='text/html' href='http://demosten-eng.blogspot.com/2011/09/compiling-your-own-version-of-sqlite.html' title='Compiling Your Own Version of SQLite for iOS and applying some fixes'/><author><name>demosten</name><uri>http://www.blogger.com/profile/02216714190261854671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://bp2.blogger.com/_RMhH5HhPyQ4/SIIR3FM-bbI/AAAAAAAAACQ/pq7F5q32hjI/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1121926833938164830.post-2932523624494635899</id><published>2011-08-29T22:46:00.000+03:00</published><updated>2011-08-29T22:46:02.324+03:00</updated><title type='text'>How to have great wait cursor animations for free</title><content type='html'>&lt;br /&gt;&lt;div style="text-align: left;"&gt;While searching for a "trivial" wait animation for one of my AJAX projects I've found a great online solution for the problem. It has been around for years now, but it's new for me and I decided to share it.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;/div&gt;&lt;div style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: left;"&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;Introducing &lt;a href="http://ajaxload.info/"&gt;http://ajaxload.info/&lt;/a&gt; a free AJAX load animation generator. It's great to have it around.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="" style="clear: both; text-align: left;"&gt;Here are some images I've created briefly as a showcase ..... well I guess they already have your attention :)&lt;/div&gt;&lt;div class="" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://4.bp.blogspot.com/-lfvYU-6wo5A/TlvoOnipJhI/AAAAAAAAAWs/UoDXyBl6Z20/s1600/10.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-lfvYU-6wo5A/TlvoOnipJhI/AAAAAAAAAWs/UoDXyBl6Z20/s1600/10.gif" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-pTrTnB5r50Q/TlvoPJ5faeI/AAAAAAAAAWw/_ddUpzJ3zcs/s1600/11.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-pTrTnB5r50Q/TlvoPJ5faeI/AAAAAAAAAWw/_ddUpzJ3zcs/s1600/11.gif" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-vwY8E3ZhwdA/TlvoPx2LcNI/AAAAAAAAAW4/7CR0ovz2bl0/s1600/13.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/-847XW8FPJ2Q/TlvoPYmp2gI/AAAAAAAAAW0/UJAPHGD79ds/s1600/12.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-847XW8FPJ2Q/TlvoPYmp2gI/AAAAAAAAAW0/UJAPHGD79ds/s1600/12.gif" /&gt;&lt;/a&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-vwY8E3ZhwdA/TlvoPx2LcNI/AAAAAAAAAW4/7CR0ovz2bl0/s1600/13.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-vwY8E3ZhwdA/TlvoPx2LcNI/AAAAAAAAAW4/7CR0ovz2bl0/s1600/13.gif" /&gt;&lt;/a&gt;&lt;a href="http://3.bp.blogspot.com/-8FPYaUyUq_w/TlvoQoiwMLI/AAAAAAAAAXA/Ehj6aSDTr3s/s1600/15.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-8FPYaUyUq_w/TlvoQoiwMLI/AAAAAAAAAXA/Ehj6aSDTr3s/s1600/15.gif" /&gt;&lt;/a&gt;&lt;a href="http://3.bp.blogspot.com/-8FPYaUyUq_w/TlvoQoiwMLI/AAAAAAAAAXA/Ehj6aSDTr3s/s1600/15.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/-Y_zNjzQAUx0/TlvoQcRgDDI/AAAAAAAAAW8/V-h53vgH4zw/s1600/14.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-Y_zNjzQAUx0/TlvoQcRgDDI/AAAAAAAAAW8/V-h53vgH4zw/s1600/14.gif" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-vwY8E3ZhwdA/TlvoPx2LcNI/AAAAAAAAAW4/7CR0ovz2bl0/s1600/13.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&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/1121926833938164830-2932523624494635899?l=demosten-eng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://demosten-eng.blogspot.com/feeds/2932523624494635899/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1121926833938164830&amp;postID=2932523624494635899' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1121926833938164830/posts/default/2932523624494635899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1121926833938164830/posts/default/2932523624494635899'/><link rel='alternate' type='text/html' href='http://demosten-eng.blogspot.com/2011/08/how-to-have-great-wait-cursor.html' title='How to have great wait cursor animations for free'/><author><name>demosten</name><uri>http://www.blogger.com/profile/02216714190261854671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://bp2.blogger.com/_RMhH5HhPyQ4/SIIR3FM-bbI/AAAAAAAAACQ/pq7F5q32hjI/S220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-lfvYU-6wo5A/TlvoOnipJhI/AAAAAAAAAWs/UoDXyBl6Z20/s72-c/10.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1121926833938164830.post-7353357923594260059</id><published>2011-08-25T14:51:00.002+03:00</published><updated>2011-08-25T15:13:37.757+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='My software'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Linking to Android Market applications on the web</title><content type='html'>While working on web version of &lt;a href="http://dadictionary.com/"&gt;Da Dictionary&lt;/a&gt; I've decided to add link to Android version. Web links to Android Market looks like this &lt;a href="http://market.android.com/details?id=com.demosten.android.dadict"&gt;http://market.android.com/details?id=com.demosten.android.dadict&lt;/a&gt; where 'com.demosten.android.dadict' is the package name which is unique for Android Market. This seams to work well when opened from PC browser. However opening this link from Android is a different story. The best way to open it is directly in Android Market application which works with different URI scheme. It looks like &lt;a href="market://details?id=com.demosten.android.dadict"&gt;market://details?id=com.demosten.android.dadict&lt;/a&gt; where again we see the same package name mentioned. While built-in Android browser plays it smart and open the link in directly in Market Application alternative browsers like Firefox does not do so and viewing web version of Android Market on an Android phone is far form what users expected to see.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;My solution&lt;/span&gt;&lt;br /&gt;&lt;pre class="javascript" name="code"&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"&amp;gt;&lt;br /&gt;&amp;lt;script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;$(function() {&lt;br /&gt;  updateAndroidMarketLinks();&lt;br /&gt;  // some more core here ... &lt;br /&gt; &lt;br /&gt;  function updateAndroidMarketLinks()&lt;br /&gt;  {&lt;br /&gt;    var ua = navigator.userAgent.toLowerCase();&lt;br /&gt;    if (0 &amp;lt;= ua.indexOf("android")) {&lt;br /&gt;      // we have android&lt;br /&gt;      $("a[href^='http://market.android.com/']").each(function() {&lt;br /&gt;        this.href = this.href.replace(/^http:\/\/market\.android\.com\//,&lt;br /&gt;          "market://");&lt;br /&gt;      });&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;});&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;a href="http://market.android.com/details?id=com.demosten.android.dadict" target="_blank"&amp;gt;Download for Android&amp;lt;/a&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;As you can see my solution is based on JavaScript and &lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt;. The idea is to search for 'android' sub-string inside browser's UserAgent and if that is the case - replace HTTP URI part with Android Market URI part, inside all links.&lt;br /&gt;&lt;br /&gt;I believe a JavaScript only version is not hard to do, but I prefer to use jQuery.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1121926833938164830-7353357923594260059?l=demosten-eng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://demosten-eng.blogspot.com/feeds/7353357923594260059/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1121926833938164830&amp;postID=7353357923594260059' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1121926833938164830/posts/default/7353357923594260059'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1121926833938164830/posts/default/7353357923594260059'/><link rel='alternate' type='text/html' href='http://demosten-eng.blogspot.com/2011/08/linking-to-android-market-applications.html' title='Linking to Android Market applications on the web'/><author><name>demosten</name><uri>http://www.blogger.com/profile/02216714190261854671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://bp2.blogger.com/_RMhH5HhPyQ4/SIIR3FM-bbI/AAAAAAAAACQ/pq7F5q32hjI/S220/avatar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1121926833938164830.post-6613069666810130259</id><published>2011-03-17T02:50:00.000+02:00</published><updated>2011-03-17T02:50:56.011+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPad'/><title type='text'>iPad 2 launch event impressions</title><content type='html'>I've finally found some time to watch Apple's iPad 2 launch event. I liked it. It looks like a great product and as usual, Steve and company presented it very smoothly. Someone should write a book "How to present like Apple" here!&lt;br /&gt;&lt;br /&gt;One thing that puzzles me is why did they mentioned the competition so many times? If you are so convinced, you have the greatest product around, why should you bother even mentioning any competition? The history will probably repeat itself. The first phones that caught up with iPhone appeared 2 years later and the first which were (in my opinion) better, after 3. I believe the same will happen with tablets. Saying that, it looks to me like Apple are starting to feel the pressure now, but I don't think they'll be matched this year. Meanwhile I'm adding iPad 2 to my wish list.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1121926833938164830-6613069666810130259?l=demosten-eng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://demosten-eng.blogspot.com/feeds/6613069666810130259/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1121926833938164830&amp;postID=6613069666810130259' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1121926833938164830/posts/default/6613069666810130259'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1121926833938164830/posts/default/6613069666810130259'/><link rel='alternate' type='text/html' href='http://demosten-eng.blogspot.com/2011/03/ipad-2-launch-event-impressions.html' title='iPad 2 launch event impressions'/><author><name>demosten</name><uri>http://www.blogger.com/profile/02216714190261854671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://bp2.blogger.com/_RMhH5HhPyQ4/SIIR3FM-bbI/AAAAAAAAACQ/pq7F5q32hjI/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1121926833938164830.post-1472522848098679709</id><published>2010-10-10T15:14:00.004+03:00</published><updated>2010-10-12T23:25:49.401+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><title type='text'>Stages of adopting open source mind-set</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_RMhH5HhPyQ4/TLGr_EjpVEI/AAAAAAAAAUk/-W0nzIE7OpQ/s1600/opensource_logo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_RMhH5HhPyQ4/TLGr_EjpVEI/AAAAAAAAAUk/-W0nzIE7OpQ/s1600/opensource_logo.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;These are stages I observed for years from both people and organizations. I might miss something here, but before you think &lt;i&gt;"this is not me/us"&lt;/i&gt; think again. I'll use person's perspective, because it always comes to a person. Be it your friend or some big corporate CTO or architect.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt; &lt;b&gt;Ignorance&lt;/b&gt;: open source doesn't exist. If anyone mentions it, you tell  yourself &lt;i&gt;"there are dragons there"&lt;/i&gt;, &lt;i&gt;"it is not secure"&lt;/i&gt;, &lt;i&gt;"licensing is  viral"&lt;/i&gt;, &lt;i&gt;"I know this guy that once used open source and got sued"&lt;/i&gt; etc.  Also you think, you can do better on your own.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Waking up&lt;/b&gt;: you are doing this great PNG display library for months now  and you have only 20 more known bugs to fix before you can start working  on your great SSL implementation then some friend comes by and asks  &lt;i&gt;"have you tried libPNG and OpenSSL?"&lt;/i&gt;. You try them and they seams to  work. You start reading licenses.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; &lt;b&gt;It's a wonderful world v1.0&lt;/b&gt;: The sun shines again. Now you know much  about open source licenses. You are using as much open source as you  can. In fact it's something like a big well and you can take as much as  you like right? You start to understand some of the ideas behind. You  also have a strong opinion about how those projects should be managed  and what needs to be done next there.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Open your heart&lt;/b&gt;: It's a big well but wouldn't it be great if you add  something to it? You are looking at your own projects and start thinking  - "should I open them?". You decide to try with caution. You open couple  of your most unimportant projects. You select them because no one have  time for them in hope that "it's a big community, there should be  someone willing to add improvements". Now you consider yourself a full  grown open source citizen and so is your company.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;No love for me&lt;/b&gt;: No one wants to work on your open projects. In fact no  one cares. You are wondering what's wrong with the community. Looking at  other open projects and comparing them to your own, you can see some  differences. Maintaining an open source is not an easy task. Getting  support from community comes with a price. And if you don't like and  care for your projects, others won't too.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;It's a wonderful world v2.0&lt;/b&gt;: You start opening only your significant  projects. Selecting those you are sure many people will find useful. It  is important for those projects to have some unique features and/or be  clearly better than similar open source projects. They need to be well  documented, with clear license and build instructions. Some samples are  useful too. Once you have that you will get community support. You  understand that open source doesn't necessarily mean nobody gets paid to  work on it. It just means it is open for others to look at the code and  use it, and they might contribute. Now you can decide should you be the  main contributor or just step out and leave it to the world to handle  from now on.&lt;br /&gt;&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1121926833938164830-1472522848098679709?l=demosten-eng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://demosten-eng.blogspot.com/feeds/1472522848098679709/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1121926833938164830&amp;postID=1472522848098679709' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1121926833938164830/posts/default/1472522848098679709'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1121926833938164830/posts/default/1472522848098679709'/><link rel='alternate' type='text/html' href='http://demosten-eng.blogspot.com/2010/10/stages-of-adopting-open-source-mind-set.html' title='Stages of adopting open source mind-set'/><author><name>demosten</name><uri>http://www.blogger.com/profile/02216714190261854671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://bp2.blogger.com/_RMhH5HhPyQ4/SIIR3FM-bbI/AAAAAAAAACQ/pq7F5q32hjI/S220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_RMhH5HhPyQ4/TLGr_EjpVEI/AAAAAAAAAUk/-W0nzIE7OpQ/s72-c/opensource_logo.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1121926833938164830.post-2492351970990303973</id><published>2010-06-24T21:22:00.001+03:00</published><updated>2010-06-24T21:26:03.831+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='concept'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>A smart phone dream of mine</title><content type='html'>I'm in a smart phone world for 2 years now, changing several phones and platforms, but this dream of mine is older. It's not a smart phone dream, it's a personal computing dream. I dream of having my PC with me wherever I go and a smart phone is a way to achieve it. In my dream there are peripheral stations (PS) consisting of bigger display (monitor, beamer ...), input devices (keyboard, mouse, joystick ...) and some power supply. You come to your home, plug your smart phone to your home peripheral station and work with your PC. You go to work plug your smart phone to your workplace's peripheral station, switch to work profile and work with your work PC. The device is one and the same you could switch profiles and even operating systems if this is needed. In my dream there are also public peripheral stations, where you could plug your smart phone/PC to work more comfortably, while recharging it at the same time. Those stations cannot harm your PC in any way as they don't have any storage to store viruses or any personal data. All storage is with you. Network connection can be provided by your mobile operator or by the station, it is your choice. At some point, when wireless connections become fast enough and power supply is taken from the sun or from your body heat and movement (for example), you could connect to the peripheral station without a wire. And of course you could always use the smart phone screen and keyboard to work with, in case there is no (free) peripheral station around.&lt;br /&gt;&lt;br /&gt;The good news is this is coming closer to reality. Here &lt;a href="http://sven.killig.de/android/N1/2.2/usb_host/"&gt;http://sven.killig.de/android/N1/2.2/usb_host/&lt;/a&gt; you can find a sample of taking the first steps in this direction.&lt;br /&gt;&lt;br /&gt;&lt;object width="560" height="340"&gt;&lt;param name="movie" value="http://www.youtube.com/v/3-bLOc1qnMM&amp;hl=en_US&amp;fs=1&amp;rel=0"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/3-bLOc1qnMM&amp;hl=en_US&amp;fs=1&amp;rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1121926833938164830-2492351970990303973?l=demosten-eng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://demosten-eng.blogspot.com/feeds/2492351970990303973/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1121926833938164830&amp;postID=2492351970990303973' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1121926833938164830/posts/default/2492351970990303973'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1121926833938164830/posts/default/2492351970990303973'/><link rel='alternate' type='text/html' href='http://demosten-eng.blogspot.com/2010/06/smart-phone-dream-of-mine.html' title='A smart phone dream of mine'/><author><name>demosten</name><uri>http://www.blogger.com/profile/02216714190261854671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://bp2.blogger.com/_RMhH5HhPyQ4/SIIR3FM-bbI/AAAAAAAAACQ/pq7F5q32hjI/S220/avatar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1121926833938164830.post-122679375383067917</id><published>2010-05-19T02:45:00.003+03:00</published><updated>2010-06-28T01:11:26.098+03:00</updated><title type='text'>A development learning story...</title><content type='html'>So here I am - trying to learn programming, surrounded by several of my university colleagues who know more about it than I do. I want to be better and I am getting better. Bit by bit. I start creating simple programs from scratch. No internet yet, no google. I’m searching inside several help systems I can get my hands on and I improve myself day after day. Time passes; I start to skip some of my university classes. Instead, I’m staying at home creating from scratch more and more complex programs. My colleagues are helping me. Sometimes with information, sometimes showing off, making me want to be that good and sometimes with words like “I’ve listened to you for the past 30 minutes and didn’t laugh because I know you don’t know things … but you are not right”. And this makes me want to be better again and again. I’m starting to isolate parts of my code making “libraries” of reusable code. Then get better at making libraries. I know how to make it extendable, how to document it and how to reuse it. Now I’m better than most of my colleagues and equal to the rest of them. They accept me, but I accept no one. No one’s code is good enough to be used. I’m creating everything I need and I’m good at it. I believe I can create something like Windows 3.11 for about 3-6 months all by myself and I believe myself. Slowly I’m starting to realize that things are deeper than they look and I have to start trusting other people’s code in order to create complex programs. I’m also starting to understand that more complex doesn’t make it better and now I’m creating simpler code. Make methods and functions smaller, make code blocks as clear as possible and always strive to keep it simple (but not stupid!). Somewhere in between I’ve started switching programming languages. Going from Pascal to Assembly, mixing it back with Pascal, then C, then C++, a little bit of Delphi, then Java, some Perl and the list goes on. With time I’ve switched programming APIs and concepts too: DOS, Windows, Embed development, POSIX. All of them came with their own charms and specifics. At this time better programming books got published, explaining concepts like design patterns. Too late, I’ve already discovered all these patterns by myself. &lt;i&gt;It was funny someone spent time to collect those obvious ideas and give them odd names. I still believe design patterns book made more harm then it helped. People need to discover those things by themselves or they won’t truly understand them and know where to use them and more important when NOT to use them and why.&lt;/i&gt; Then I’m discovering next “library” level – modularity. It is dynamic, it can be switched on and off on the fly, it can be replaced with fixed/newer version without recompiling the rest of the code. After some concept polishing and learning how others do it, I’m starting my own product based on my own modular concept. It is small, it is clean, it is clear. It is a great piece of technology and none of my clients cares about this. Slowly I start realizing, that though modularity is great, it took at least 50% of my development time to plan it, make it that great and support it in the future development. This time doesn’t pay back – really! I also start understanding that I seldom use any piece of my code twice. I’m learning as I go and I almost always know a better way to do it after several months. The way sometimes involves using a new library and sometimes it’s just me knowing more. In either case I get my old code and rip a good part of it creating something new, instead of reusing it.&lt;br /&gt;&lt;br /&gt;So here I am - creating more and more complex software, using the best I can find pieces of other people’s code and creating the rest on my own. Always try to keep it simple (and not stupid). Keep it small and clear. Don’t make a block of code do more than one thing and don’t make it bigger than one screen can display. Use comments sparingly and describe your context, reasons and ideas there. Don’t make reusable code unless you’re creating a library on purpose. And programming languages - they are just a way to express yourself. Programming concepts like functional and object oriented programming too. They don’t really matter. What matters is to understand the core idea behind them in order to use them effectively. Once you understand it, you understand that it is possible to create a complex solution with plain C as easy as you create it using Java, C#, C++ or whatever.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1121926833938164830-122679375383067917?l=demosten-eng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://demosten-eng.blogspot.com/feeds/122679375383067917/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1121926833938164830&amp;postID=122679375383067917' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1121926833938164830/posts/default/122679375383067917'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1121926833938164830/posts/default/122679375383067917'/><link rel='alternate' type='text/html' href='http://demosten-eng.blogspot.com/2010/05/development-learning-story.html' title='A development learning story...'/><author><name>demosten</name><uri>http://www.blogger.com/profile/02216714190261854671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://bp2.blogger.com/_RMhH5HhPyQ4/SIIR3FM-bbI/AAAAAAAAACQ/pq7F5q32hjI/S220/avatar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1121926833938164830.post-5661131659667786062</id><published>2010-03-31T03:12:00.013+03:00</published><updated>2010-06-24T21:33:07.172+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='GWT'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>GWT GroupBox implementation</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_RMhH5HhPyQ4/S7KS0tM_s5I/AAAAAAAAASE/BYvdIJmBiIw/s1600/groupboxpanel.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="110" src="http://2.bp.blogspot.com/_RMhH5HhPyQ4/S7KS0tM_s5I/AAAAAAAAASE/BYvdIJmBiIw/s320/groupboxpanel.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;I was looking for a group box implementation for GWT recently and the only solution I've found was implemented by &lt;a href="http://www.nakov.com/blog/2007/08/23/gwt-groupbox-panel-widget/"&gt;Svetlin Nakov&lt;/a&gt;. However it didn't work out of the box and I had to modify it, to make it compatible with GWT 2.0 (I guess it worked fine with older versions). I've used the same idea, plus most of his code and extended it to work with GWT 2.0. Here is my implementation:&lt;br /&gt;&lt;pre class="java" name="code"&gt;package com.demosten.client;&lt;br /&gt;&lt;br /&gt;import com.google.gwt.user.client.DOM;&lt;br /&gt;import com.google.gwt.user.client.Element;&lt;br /&gt;import com.google.gwt.user.client.ui.ComplexPanel;&lt;br /&gt;import com.google.gwt.user.client.ui.InsertPanel;&lt;br /&gt;import com.google.gwt.user.client.ui.Widget;&lt;br /&gt;&lt;br /&gt;public class GroupBoxPanel extends ComplexPanel implements InsertPanel&lt;br /&gt;{&lt;br /&gt; private Element legend;&lt;br /&gt;&lt;br /&gt; public GroupBoxPanel()&lt;br /&gt; {&lt;br /&gt;  Element fieldset = DOM.createFieldSet();&lt;br /&gt;  this.legend = DOM.createLegend();&lt;br /&gt;  DOM.appendChild(fieldset, legend);&lt;br /&gt;  setElement(fieldset);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; public void add(Widget w)&lt;br /&gt; {&lt;br /&gt;  add(w, getElement());&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void insert(Widget w, int beforeIndex)&lt;br /&gt; {&lt;br /&gt;  insert(w, getElement(), beforeIndex, true);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public String getText()&lt;br /&gt; {&lt;br /&gt;  return DOM.getInnerText(this.legend);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void setText(String text)&lt;br /&gt; {&lt;br /&gt;  DOM.setInnerText(this.legend, text);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;it can be used in UiBinder Templates:&lt;br /&gt;&lt;pre class="xml" name="code"&gt;&amp;lt;!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"&amp;gt;&lt;br /&gt;&amp;lt;ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder'&lt;br /&gt; xmlns:g='urn:import:com.google.gwt.user.client.ui'&lt;br /&gt; xmlns:d='urn:import:com.demosten.client'&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;g:VerticalPanel&amp;gt;&lt;br /&gt;  &amp;lt;d:GroupBoxPanel text="Account data"&amp;gt;&lt;br /&gt;   &amp;lt;g:HorizontalPanel&amp;gt;&lt;br /&gt;    &amp;lt;g:Label&amp;gt;e-mail:&amp;lt;/g:Label&amp;gt;&lt;br /&gt;    &amp;lt;g:TextBox /&amp;gt;&lt;br /&gt;   &amp;lt;/g:HorizontalPanel&amp;gt;&lt;br /&gt;   &amp;lt;g:HorizontalPanel&amp;gt;&lt;br /&gt;    &amp;lt;g:Label&amp;gt;password:&amp;lt;/g:Label&amp;gt;&lt;br /&gt;    &amp;lt;g:PasswordTextBox /&amp;gt;&lt;br /&gt;   &amp;lt;/g:HorizontalPanel&amp;gt;&lt;br /&gt;  &amp;lt;/d:GroupBoxPanel&amp;gt;&lt;br /&gt;  &amp;lt;g:HorizontalPanel&amp;gt;&lt;br /&gt;   &amp;lt;g:Button text='Sign in' /&amp;gt;&lt;br /&gt;   &amp;lt;g:Button text='Register' /&amp;gt;&lt;br /&gt;  &amp;lt;/g:HorizontalPanel&amp;gt;&lt;br /&gt; &amp;lt;/g:VerticalPanel&amp;gt;&lt;br /&gt;&amp;lt;/ui:UiBinder&amp;gt;&lt;/pre&gt;&lt;br /&gt;Use it as you like :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1121926833938164830-5661131659667786062?l=demosten-eng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://demosten-eng.blogspot.com/feeds/5661131659667786062/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1121926833938164830&amp;postID=5661131659667786062' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1121926833938164830/posts/default/5661131659667786062'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1121926833938164830/posts/default/5661131659667786062'/><link rel='alternate' type='text/html' href='http://demosten-eng.blogspot.com/2010/03/gwt-groupbox-implementation.html' title='GWT GroupBox implementation'/><author><name>demosten</name><uri>http://www.blogger.com/profile/02216714190261854671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://bp2.blogger.com/_RMhH5HhPyQ4/SIIR3FM-bbI/AAAAAAAAACQ/pq7F5q32hjI/S220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_RMhH5HhPyQ4/S7KS0tM_s5I/AAAAAAAAASE/BYvdIJmBiIw/s72-c/groupboxpanel.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1121926833938164830.post-8821598264674660002</id><published>2010-02-17T01:50:00.002+02:00</published><updated>2010-02-18T11:21:43.179+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sync'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><category scheme='http://www.blogger.com/atom/ns#' term='HTC'/><title type='text'>HTC Sync wonders</title><content type='html'>Recently I've installed HTC Sync v2.0.18 (PC sync software for Android based phones) and got quite surprised to find out how it works. It runs a process called something like FsynSrvStarter.exe. However here is how it works. It starts the executable mentioned above every few seconds (like every 3-5 seconds). The executable checks something - probably for Android connected device and quits. The version info of HTC Sync manager files, show "Teleca AB" as a company. It's strange HTC, whose products I use and love, is providing such poorly designed software to its users. This is a classical example of how the things should NOT be done. So here is what I have to say to those Teleca AB guys: "Do you have any idea how expensive is for the OS is to run a new process? Did you heard about the wonderful world of &lt;a href="http://en.wikipedia.org/wiki/Inter-process_communication"&gt;inter-process communications&lt;/a&gt; (known also as IPC)? How about using some named &lt;a href="http://msdn.microsoft.com/en-us/library/ms682411%28VS.85%29.aspx"&gt;mutexes&lt;/a&gt; and/or &lt;a href="http://msdn.microsoft.com/en-us/library/ms682396%28VS.85%29.aspx"&gt;events&lt;/a&gt; for a change? Please have some time to do things right and don't get you poor users pay for your lack of knowledge!"&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Update: I've checked it on my work computer. The time between FsynSrvStarter.exe starts there is more like 30 seconds. Still not the right way to do it!&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1121926833938164830-8821598264674660002?l=demosten-eng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1121926833938164830/posts/default/8821598264674660002'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1121926833938164830/posts/default/8821598264674660002'/><link rel='alternate' type='text/html' href='http://demosten-eng.blogspot.com/2010/02/htc-sync-wonders.html' title='HTC Sync wonders'/><author><name>demosten</name><uri>http://www.blogger.com/profile/02216714190261854671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://bp2.blogger.com/_RMhH5HhPyQ4/SIIR3FM-bbI/AAAAAAAAACQ/pq7F5q32hjI/S220/avatar.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-1121926833938164830.post-7678583865476436395</id><published>2010-02-14T19:09:00.002+02:00</published><updated>2010-06-24T21:30:28.079+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sync'/><title type='text'>How to transfer contact between different flavors of smart-phones</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://www.google.com/mobile/images/mgc3/sync48.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://www.google.com/mobile/images/mgc3/sync48.png" /&gt;&lt;/a&gt;&lt;/div&gt;I was having this problem lately when I needed to transfer my contacts between Windows Mobile and &lt;a href="http://forum.xda-developers.com/showthread.php?t=601751"&gt;XANDROID for HTC Touch Diamond&lt;/a&gt;. After a quick search I've found a solution and it appears that this could help others too. It's called &lt;a href="http://www.google.com/mobile/sync/"&gt;Google Sync&lt;/a&gt; and can be used not only for synchronizing, but for transferring contacts and other data between smart-phones too. The good thing is that it support many smart-phone OSes. At the time of writing these are: BlackBerry, iPhone, Nokia S60, SyncML, Windows Mobile. The bad thing is, google now have my name, my contacts, my blog. Now I can only hope that "do no evil" policy is intact and will stay that way!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1121926833938164830-7678583865476436395?l=demosten-eng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1121926833938164830/posts/default/7678583865476436395'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1121926833938164830/posts/default/7678583865476436395'/><link rel='alternate' type='text/html' href='http://demosten-eng.blogspot.com/2010/02/how-to-transfer-contact-between.html' title='How to transfer contact between different flavors of smart-phones'/><author><name>demosten</name><uri>http://www.blogger.com/profile/02216714190261854671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://bp2.blogger.com/_RMhH5HhPyQ4/SIIR3FM-bbI/AAAAAAAAACQ/pq7F5q32hjI/S220/avatar.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-1121926833938164830.post-3078490678394797553</id><published>2010-01-29T14:10:00.006+02:00</published><updated>2010-06-24T21:31:14.448+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPad'/><category scheme='http://www.blogger.com/atom/ns#' term='ebook'/><title type='text'>iPad as an e-book reader? Why?</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_RMhH5HhPyQ4/S2LOmFMAR2I/AAAAAAAAARw/3bM4YwGFrOM/s1600-h/lbook.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_RMhH5HhPyQ4/S2LOmFMAR2I/AAAAAAAAARw/3bM4YwGFrOM/s320/lbook.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span id="goog_1264758652872"&gt;&lt;/span&gt;&lt;span id="goog_1264758652873"&gt;&lt;/span&gt;&lt;span id="goog_1264758652881"&gt;&lt;/span&gt;&lt;span id="goog_1264758652882"&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/_RMhH5HhPyQ4/S2LOvDcVsxI/AAAAAAAAAR4/2awxXeDZzZs/s1600-h/ibooks_20100127.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_RMhH5HhPyQ4/S2LOvDcVsxI/AAAAAAAAAR4/2awxXeDZzZs/s320/ibooks_20100127.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;Just after Apple presented their iPad device, there had been a lot of posts about how this device will revolutionize the e-book reading. Apple are great in making their product simple to use and great looking. They are also great in making fashion out of it. But how many of you will replace an e-book reader for an iPad? I definitely won't. So I just decided to drop here a simple reminder about the advantages of modern e-book readers. If you never used one before, it's tempting to grab this beautiful colorful multitouch display as your first e-book reading device. Well, there are things you need to know before you do so:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Displays: e-ink and e-paper displays are much more gentle to your eyes. They don't have back light. Their look and feel is very close to normal paper. It would be like comparing reading from a laptop or other similar display to reading from paper. Reading from e-ink or e-paper display requires additional light just as reading from a normal book does. And believe me this is good for your eyes! Also since none of them is touch capable, you won't read through the tracks of your fingers.&lt;/li&gt;&lt;li&gt;Battery life of e-ink and e-paper based displays is much better. Depending on usage, I recharge my lBook e-reader from once a month to once per 3 months. I know that for other e-book readers this time is more like once per week (my device don't have WiFi and/or 3G), but it is still far better than 10 hours which iPad promises.&lt;/li&gt;&lt;/ul&gt;If you're planning to use iPad primary as an e-book reader, think carefully before you do so. Otherwise I like the iPad idea. It might be useful.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1121926833938164830-3078490678394797553?l=demosten-eng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://demosten-eng.blogspot.com/feeds/3078490678394797553/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1121926833938164830&amp;postID=3078490678394797553' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1121926833938164830/posts/default/3078490678394797553'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1121926833938164830/posts/default/3078490678394797553'/><link rel='alternate' type='text/html' href='http://demosten-eng.blogspot.com/2010/01/ipad-as-e-book-reader-why.html' title='iPad as an e-book reader? Why?'/><author><name>demosten</name><uri>http://www.blogger.com/profile/02216714190261854671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://bp2.blogger.com/_RMhH5HhPyQ4/SIIR3FM-bbI/AAAAAAAAACQ/pq7F5q32hjI/S220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_RMhH5HhPyQ4/S2LOmFMAR2I/AAAAAAAAARw/3bM4YwGFrOM/s72-c/lbook.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1121926833938164830.post-1666520117313194690</id><published>2009-12-30T22:36:00.007+02:00</published><updated>2010-06-24T21:34:24.962+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='security'/><title type='text'>Security by denial</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_RMhH5HhPyQ4/SzvDLkjAiwI/AAAAAAAAAQw/qz8DM3XlVFU/s1600-h/enigma.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 152px; height: 200px;" src="http://4.bp.blogspot.com/_RMhH5HhPyQ4/SzvDLkjAiwI/AAAAAAAAAQw/qz8DM3XlVFU/s200/enigma.png" alt="" id="BLOGGER_PHOTO_ID_5421141180027013890" border="0" /&gt;&lt;/a&gt;Recently I've stumbled upon the following news &lt;a href="http://www.nytimes.com/2009/12/29/technology/29hack.html?_r=3"&gt;Cellphone Encryption Code Is Divulged&lt;/a&gt;. Look at the great authorities response:&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;The G.S.M. Association, the industry group based in London that devised the algorithm and represents wireless companies, called Mr. Nohl’s efforts illegal and said they overstated the security threat to wireless calls.&lt;/p&gt;&lt;p&gt;“This is theoretically possible but practically unlikely,” said Claire Cranton, an association spokeswoman. She said no one else had broken the code since its adoption. “What he is doing would be illegal in Britain and the United States. To do this while supposedly being concerned about privacy is beyond me.”&lt;/p&gt;&lt;/blockquote&gt;This looks like a classic sample of Security by denial to me. I should feel relieved knowing that this kind of research is illegal in several countries and that we know only one person that managed to break this encryption. Sigh!&lt;br /&gt;&lt;br /&gt;A question to the reader: Do you think it is a good practice for some countries to make illegal the efforts to break those kinds of encryption?&lt;br /&gt;&lt;br /&gt;I believe this leads to false sense of security and give advantage to those, who do not hesitate to break the law over those who do obey it. It also leaves all of us, who uses this technology every day, in the dark.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1121926833938164830-1666520117313194690?l=demosten-eng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://demosten-eng.blogspot.com/feeds/1666520117313194690/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1121926833938164830&amp;postID=1666520117313194690' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1121926833938164830/posts/default/1666520117313194690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1121926833938164830/posts/default/1666520117313194690'/><link rel='alternate' type='text/html' href='http://demosten-eng.blogspot.com/2009/12/security-by-denial.html' title='Security by denial'/><author><name>demosten</name><uri>http://www.blogger.com/profile/02216714190261854671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://bp2.blogger.com/_RMhH5HhPyQ4/SIIR3FM-bbI/AAAAAAAAACQ/pq7F5q32hjI/S220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_RMhH5HhPyQ4/SzvDLkjAiwI/AAAAAAAAAQw/qz8DM3XlVFU/s72-c/enigma.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1121926833938164830.post-3245386097417916300</id><published>2009-12-30T17:38:00.007+02:00</published><updated>2009-12-31T01:43:15.544+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bug'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Old story: funny bug in Windows 9x/ME</title><content type='html'>It's been a while since I've last posted here, but today I'm in a blogging mood and decided to share an old story. It happened around the year of 2002 or 2003 I don't remember exactly.&lt;br /&gt;&lt;br /&gt;I was working together with Georgi Georgiev on a small program called "Visual ISO" (can be found on my site). We've found a serious bug. After the user quits the program ALL windows icons (those on desktop, start menu, windows explorer etc.) disappear. I've started to search for the problem. Several hours and a dozen restarts later I've finally found it. It appears that when you get the System icon list handle with Win32 API call - you could successfully  call the corresponding API method to FREE IT! This worked on Windows 9x/ME but did not work on Windows NT and above. You have no idea how fast Windows becomes, when there are no icons to display!&lt;br /&gt;&lt;br /&gt;Being a good network citizen I've created a small program to reproduce the problem and decided to contact Microsoft about it. However this appeared to be a problem. No contact info could be found on their site. I did several web searches, but still no luck. So I contacted a person known as a security expert, to help me. He replied he is using "security@microsoft.com". I wrote an e-mail with something like: &lt;span style="font-style: italic;"&gt;"I've found a problem in Windows API, but I don't think it is security related. Please point me to non security related e-mail"&lt;/span&gt;. I've got a kind automated reply and the waiting began. More than a month later I've got a reply from some support center in Germany stating something like: &lt;span style="font-style: italic;"&gt;"If you have problems programming please contact ...."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;... and that's how the problem was never reported ...&lt;br /&gt;&lt;br /&gt;That was my story :) and here is my proof of concept code (not tested lately, it's a miracle I've found it at all)&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="cpp"&gt;&lt;br /&gt;#include &amp;lt;windows.h&amp;gt;&lt;br /&gt;#include &amp;lt;shellapi.h&amp;gt;&lt;br /&gt;&lt;br /&gt;int APIENTRY WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpCmdLine, int nCmdShow)&lt;br /&gt;{&lt;br /&gt;   SHFILEINFO shFinfo;&lt;br /&gt;   HIMAGELIST hImgList = (HIMAGELIST)SHGetFileInfo("", 0, &amp;amp;shFinfo, sizeof(shFinfo),    &lt;br /&gt;                       SHGFI_ICON | SHGFI_SMALLICON | SHGFI_SYSICONINDEX);&lt;br /&gt;   if (NULL == hImgList)&lt;br /&gt;       MessageBox(NULL, "Cannot retrieve the Handle of SystemImageList!",&lt;br /&gt;           "Error", MB_OK | MB_ICONSTOP);&lt;br /&gt;   else {&lt;br /&gt;       if (ImageList_Destroy(hImgList))&lt;br /&gt;           MessageBox(NULL, "SystemImageList destroyed!", "Success", MB_OK | MB_ICONINFORMATION);&lt;br /&gt;       else&lt;br /&gt;           MessageBox(NULL, "Cannot destroy SystemImageList!", "Error", MB_OK | MB_ICONSTOP);&lt;br /&gt;   }&lt;br /&gt;   return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1121926833938164830-3245386097417916300?l=demosten-eng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://demosten-eng.blogspot.com/feeds/3245386097417916300/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1121926833938164830&amp;postID=3245386097417916300' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1121926833938164830/posts/default/3245386097417916300'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1121926833938164830/posts/default/3245386097417916300'/><link rel='alternate' type='text/html' href='http://demosten-eng.blogspot.com/2009/12/old-story-funny-bug-in-windows-9xme.html' title='Old story: funny bug in Windows 9x/ME'/><author><name>demosten</name><uri>http://www.blogger.com/profile/02216714190261854671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://bp2.blogger.com/_RMhH5HhPyQ4/SIIR3FM-bbI/AAAAAAAAACQ/pq7F5q32hjI/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1121926833938164830.post-1399844128666295433</id><published>2009-06-15T22:37:00.007+03:00</published><updated>2010-06-24T21:31:52.569+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='concept'/><title type='text'>Concept: Corner and side click in desktop environments</title><content type='html'>There is functionality I always use when working with my desktop. I use them so often, I consider them granted. If the OS takes them away in the next version, I won't be upgrading until I have them back (one way or another).&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Example of such a feature is when I throw the mouse in the upper right corner and click to close the current maximized application without aiming at the cross icon there. This feature got me thinking - "why don't we use this 'throw cursor at the end of the screen and click' functionality in other places too?". To illustrate my point I'll show a simple idea. It's about removing the "Start" button (or the "K" button in KDE)  and use the space there for something more beneficial.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;div style="text-align: center;"&gt;&lt;div style="text-align: center;"&gt;Here is what we have now (in Windows XP):&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_RMhH5HhPyQ4/SjapABzRuuI/AAAAAAAAAKc/jPhwDw4eFww/s1600-h/start_menu_now.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 239px; height: 320px;" src="http://2.bp.blogspot.com/_RMhH5HhPyQ4/SjapABzRuuI/AAAAAAAAAKc/jPhwDw4eFww/s320/start_menu_now.png" alt="" id="BLOGGER_PHOTO_ID_5347647425497643746" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;div style="text-align: justify;"&gt;But why do we need a button taking so much space just to say "Start" or "K"? Here is how a new version might look:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_RMhH5HhPyQ4/SjaroEoSPOI/AAAAAAAAAKk/Dh_UunrnQUU/s1600-h/start_menu_idea.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 239px; height: 320px;" src="http://3.bp.blogspot.com/_RMhH5HhPyQ4/SjaroEoSPOI/AAAAAAAAAKk/Dh_UunrnQUU/s320/start_menu_idea.png" alt="" id="BLOGGER_PHOTO_ID_5347650312474868962" border="0" /&gt;&lt;/a&gt;Note the barely visible green triangle in the lower left corner. This is where you need to click to open the start menu. Even if you are new to this desktop environment, it should not take you more than 2-3 minutes to learn and remember where it is. The benefit is that this way you have more space for your task bar and when you need the start menu just throw the mouse pointer to the lower left corner and click.&lt;br /&gt;&lt;br /&gt;This was just an illustration of this concept. It is not limited just to corners or to single click. Here are some more examples:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Single click in the upper left corner starts your favorite application&lt;/li&gt;&lt;li&gt;Single click somewhere in the first upper screen line (where your mouse stops) minimizes the current application&lt;/li&gt;&lt;li&gt;Single click to the lower right corner (where the clock is) does "Show desktop". I have this as a proof of concept application!&lt;/li&gt;&lt;li&gt;Double click somewhere in the most left screen column starts another application&lt;/li&gt;&lt;/ul&gt;All those are examples of the 'throw mouse cursor and click' concept. The click is important, because it eliminates the nagging of things showing by themselves when all you wanted is to remove the cursor from your desktop.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-style: italic;"&gt;Note about my concepts: You are free to use the ideas represented in my concepts as you like as long as you don't present them as yours. Keep in mind that though those are my ideas, I don't claim (and did not checked), that someone else didn't come with the same ideas first. If you decide to use some of the concept ideas presented here, it's up to you to check for prior art, patents and so on.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&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/1121926833938164830-1399844128666295433?l=demosten-eng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://demosten-eng.blogspot.com/feeds/1399844128666295433/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1121926833938164830&amp;postID=1399844128666295433' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1121926833938164830/posts/default/1399844128666295433'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1121926833938164830/posts/default/1399844128666295433'/><link rel='alternate' type='text/html' href='http://demosten-eng.blogspot.com/2009/06/concept-corner-and-side-click-in.html' title='Concept: Corner and side click in desktop environments'/><author><name>demosten</name><uri>http://www.blogger.com/profile/02216714190261854671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://bp2.blogger.com/_RMhH5HhPyQ4/SIIR3FM-bbI/AAAAAAAAACQ/pq7F5q32hjI/S220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_RMhH5HhPyQ4/SjapABzRuuI/AAAAAAAAAKc/jPhwDw4eFww/s72-c/start_menu_now.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1121926833938164830.post-3742098554815729171</id><published>2009-01-11T23:09:00.008+02:00</published><updated>2010-10-10T15:16:47.022+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='My software'/><title type='text'>Announcing: Diamond SensorScroll</title><content type='html'>&lt;a href="http://4.bp.blogspot.com/_RMhH5HhPyQ4/SWpgPJL_kOI/AAAAAAAAAIU/M44xskPnO60/s1600-h/sensorscroll.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5290146525580595426" src="http://4.bp.blogspot.com/_RMhH5HhPyQ4/SWpgPJL_kOI/AAAAAAAAAIU/M44xskPnO60/s320/sensorscroll.jpg" style="cursor: pointer; float: left; height: 300px; margin: 0pt 10px 10px 0pt; width: 177px;" /&gt;&lt;/a&gt;This Christmas I gave myself a new &lt;a href="http://www.htc.com/www/product/touchdiamond/overview.html"&gt;HTC Touch Diamond&lt;/a&gt; as a present. To be honest I made the present a month earlier, but who needs patience when it comes to hi tech gadgets?&lt;br /&gt;&lt;br /&gt;I played around with it and found some missing features. The most obvious for me was, the phone has a great sensor control which is used only by several HTC applications and Opera (custom version made for HTC).  I decided to fix this and that's how I met Windows Mobile 6.1.&lt;br /&gt;&lt;br /&gt;I spent some time in research and writing simple test applications and found, that though it is "Mobile", it is "Windows" only around 50% (the other 50% came from the Microsoft's marketing department I guess). Don't get me wrong here. It doesn't mean I don't like it. It's just quite different from PC Windows. API is same - but not quite, internal architecture is totally different and this left useless almost half of my Win32 API knowledge. After a month of research and a week of codding I finally brought my idea to life.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Announcing: Diamond SensorScroll&lt;/span&gt;&lt;br /&gt;This is my latest free application. There are several things that happen for the first time because of it.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;It is my first application running on Windows Mobile.&lt;/li&gt;&lt;li&gt;It is my first application published first outside &lt;a href="http://www.demosten.com/"&gt;my site&lt;/a&gt; and then on it.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;It is my first application, about which people wrote comments and blog posts just hours after the initial release (on 1.1.2009).&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;All of this happened because I stepped into the great community of the &lt;a href="http://forum.xda-developers.com/"&gt;http://forum.xda-developers.com/&lt;/a&gt; site! The guys there got me unprepared! All I expected was several downloads and some bug reports. Unstead I got many thanks, Near a 1000 downloads in first 10 days (I released 3 bugfixing versions  in that time and the application doesn't have a 1000 users just yet). Greatly described bug reports with aditional analysis what went wrong. More thanks. Cool feature ideas. Links to blog posts for "spreading the word". Idea to add donations link. And more! All this, made me feel really happy to be part of this community. THANK YOU GUYS!&lt;br /&gt;&lt;br /&gt;Now you know why the primary site for Diamond SensorScroll is &lt;a href="http://forum.xda-developers.com/showthread.php?t=466377"&gt;http://forum.xda-developers.com/showthread.php?t=466377&lt;/a&gt; :)&lt;br /&gt;&lt;br /&gt;Have fun!&lt;br /&gt;&lt;br /&gt;P.S. The picture you see in this post is from &lt;a href="http://gadgetmix.com/index/?p=2314"&gt;another blog post&lt;/a&gt;. I liked it, asked the author, and got a permission to use it from now on. I hope this illustrates my point one more time :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1121926833938164830-3742098554815729171?l=demosten-eng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://demosten-eng.blogspot.com/feeds/3742098554815729171/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1121926833938164830&amp;postID=3742098554815729171' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1121926833938164830/posts/default/3742098554815729171'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1121926833938164830/posts/default/3742098554815729171'/><link rel='alternate' type='text/html' href='http://demosten-eng.blogspot.com/2009/01/announcing-diamond-sensorscroll.html' title='Announcing: Diamond SensorScroll'/><author><name>demosten</name><uri>http://www.blogger.com/profile/02216714190261854671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://bp2.blogger.com/_RMhH5HhPyQ4/SIIR3FM-bbI/AAAAAAAAACQ/pq7F5q32hjI/S220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_RMhH5HhPyQ4/SWpgPJL_kOI/AAAAAAAAAIU/M44xskPnO60/s72-c/sensorscroll.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1121926833938164830.post-6043753219038738121</id><published>2008-09-05T11:50:00.006+03:00</published><updated>2010-10-10T15:17:19.715+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><category scheme='http://www.blogger.com/atom/ns#' term='My software'/><title type='text'>Announcing Demosten's Perl distribution for Win32</title><content type='html'>&lt;a href="http://2.bp.blogspot.com/_RMhH5HhPyQ4/SMEUdU6hfRI/AAAAAAAAAGE/1D073kHxUnA/s1600-h/perl-logo.gif" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5242493935298903314" src="http://2.bp.blogspot.com/_RMhH5HhPyQ4/SMEUdU6hfRI/AAAAAAAAAGE/1D073kHxUnA/s200/perl-logo.gif" style="cursor: pointer; float: left; margin: 0pt 10px 10px 0pt;" /&gt;&lt;/a&gt;Today I published the first version of my Perl distribution for Windows. My idea was to create a distribution which could fully take advantage of CPAN. This means that you need a C/C++ compiler and make program together with some Unix tools like gzip, tar, less etc. I've added a Perl Scripting Engine (thanks to Atanas Kolev).  The distribution also contains several simple scripts to provide a documentation with TOC and to add and remove directories to/from path environment. There is also a simple program written to relocate perl and the compiler to specified directories. The distribution has no additional license limitations and all our code is distributed with the same license as Perl itself.&lt;br /&gt;&lt;br /&gt;Links:&lt;br /&gt;Official homepage: &lt;a href="http://dnperl.sf.net/"&gt;http://dnperl.sf.net/&lt;/a&gt;&lt;br /&gt;Downloads at project home page: &lt;a href="http://sourceforge.net/projects/dnperl/"&gt;http://sourceforge.net/projects/dnperl/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1121926833938164830-6043753219038738121?l=demosten-eng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://demosten-eng.blogspot.com/feeds/6043753219038738121/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1121926833938164830&amp;postID=6043753219038738121' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1121926833938164830/posts/default/6043753219038738121'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1121926833938164830/posts/default/6043753219038738121'/><link rel='alternate' type='text/html' href='http://demosten-eng.blogspot.com/2008/09/announcing-demostens-perl-distribution.html' title='Announcing Demosten&apos;s Perl distribution for Win32'/><author><name>demosten</name><uri>http://www.blogger.com/profile/02216714190261854671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://bp2.blogger.com/_RMhH5HhPyQ4/SIIR3FM-bbI/AAAAAAAAACQ/pq7F5q32hjI/S220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_RMhH5HhPyQ4/SMEUdU6hfRI/AAAAAAAAAGE/1D073kHxUnA/s72-c/perl-logo.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1121926833938164830.post-7307309516135242024</id><published>2008-08-17T13:30:00.007+03:00</published><updated>2010-10-10T15:19:27.060+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><category scheme='http://www.blogger.com/atom/ns#' term='My software'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Designing the next generation of CDRfe</title><content type='html'>&lt;a href="http://2.bp.blogspot.com/_RMhH5HhPyQ4/SKgMQCBzrZI/AAAAAAAAAFc/sKx6sWWWiQc/s1600-h/CDrecord%282%29.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5235448036380093842" src="http://2.bp.blogspot.com/_RMhH5HhPyQ4/SKgMQCBzrZI/AAAAAAAAAFc/sKx6sWWWiQc/s200/CDrecord%282%29.jpg" style="cursor: pointer; float: left; margin: 0pt 10px 10px 0pt;" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;(last updated 17.August.2008)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I've finally found some free time to think about the next version of &lt;a href="http://www.demosten.com/cdrfe/"&gt;CDRfe&lt;/a&gt;. This is one of my favorite own programs, but in time I realized that this way of creating C++ closed source software will lead us nowhere. So I'm thinking about designing the next generation of CDRtools frontend. The planning is on really early stage (like some thoughts on a single sheet of paper) and I decide this time to involve the community. I realize this will take much more time than designing it by myself, but I believe the outcome worth it! So here are my general ideas about it:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;We'll start codding from scratch (will use only knowledge gathered in CDRfe development, but not a single line of code)&lt;/li&gt;&lt;li&gt;We'll use some platform independent language like Java which will allow using CDRfe on other OS-es too.&lt;/li&gt;&lt;li&gt;Next generation version will combine VisualISO with CDRfe into a single program.&lt;/li&gt;&lt;li&gt;I'm planning to include remote recording functionality. This is when you have a single recorder and many clients&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The new project will be an open source and I'll be very careful with licenses this time when it comes to using external source code and/or libraries&lt;/li&gt;&lt;li&gt;We might also select a better name of the project. If you have an idea please post a comment or send me an e-mail.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Now I'll go deeper into the technical part:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I'm planning to use a Rich client platform instead of doing everything  on my own. The best candidates are: &lt;a href="http://www.eclipse.org/"&gt;Eclipse&lt;/a&gt;, &lt;a href="http://www.netbeans.org/"&gt;Netbeans&lt;/a&gt; and &lt;a href="http://www.mozilla.org/"&gt;Mozilla&lt;/a&gt;. If you have other ideas, please post a comment or drop me an e-mail at demosten@gmail.com. At the moment my favorite is Eclipse. Advantages of using such a platform are: you have much work done and tested and we could concentrate on the actual functionality instead of for example user interface. So the software could be delivered faster and better tested. Disadvantage I can think of is that it will be much bigger and in general slower.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;I need your help! I'm looking for:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Fresh ideas what to include inside the next generation version as functionality, usability, code libraries etc.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Codding help. I'll need it at moment a concrete Rich client platform and programming language is selected and the work could start. The project will be hosted probably on sourseforge.net and will have a repository and so on.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Designer's help: this version should look great :)&lt;/li&gt;&lt;/ul&gt;If you can help please do it! Post a comment here or drop me an e-mail at demosten@gmail.com. I'll update this post in time so come and check it from time to time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1121926833938164830-7307309516135242024?l=demosten-eng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://demosten-eng.blogspot.com/feeds/7307309516135242024/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1121926833938164830&amp;postID=7307309516135242024' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1121926833938164830/posts/default/7307309516135242024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1121926833938164830/posts/default/7307309516135242024'/><link rel='alternate' type='text/html' href='http://demosten-eng.blogspot.com/2008/08/designing-next-generation-of-cdrfe.html' title='Designing the next generation of CDRfe'/><author><name>demosten</name><uri>http://www.blogger.com/profile/02216714190261854671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://bp2.blogger.com/_RMhH5HhPyQ4/SIIR3FM-bbI/AAAAAAAAACQ/pq7F5q32hjI/S220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_RMhH5HhPyQ4/SKgMQCBzrZI/AAAAAAAAAFc/sKx6sWWWiQc/s72-c/CDrecord%282%29.jpg' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1121926833938164830.post-6666883313108038114</id><published>2008-08-10T20:49:00.011+03:00</published><updated>2009-12-30T22:23:15.320+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>MinGW and Unicode support?</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_RMhH5HhPyQ4/SJ9UFmC7w2I/AAAAAAAAAFQ/C2LiqsJn7F4/s1600-h/cplusplus.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://3.bp.blogspot.com/_RMhH5HhPyQ4/SJ9UFmC7w2I/AAAAAAAAAFQ/C2LiqsJn7F4/s200/cplusplus.png" alt="" id="BLOGGER_PHOTO_ID_5232993747116737378" border="0" /&gt;&lt;/a&gt;Recently I've been working on a program called &lt;a href="http://www.demosten.com/download.shtml"&gt;RuntimeTester&lt;/a&gt;. And since it is a small and simple C++ program working in Win32 environment, I decided to port it to different C++ compilers. The original was written using Microsoft Visual C++ 2008, it has a &lt;a href="http://www.microsoft.com/express/vc/"&gt;free version&lt;/a&gt; which I believe is using the same optimizing compiler, but my idea was to give a chance to some free compilers and check the results. So I tried the following compilers: &lt;a href="http://www.mingw.org/"&gt;MinGW&lt;/a&gt; (compiler version 3.4.5), &lt;a href="http://www.openwatcom.org/"&gt;OpenWatcom&lt;/a&gt; 1.7a and &lt;a href="http://www.digitalmars.com/"&gt;Digital Mars C++&lt;/a&gt; 8.42n. I've created simple batch files to run the compilers and convert a single source file to a single executable file. All went without problems. And then I remembered my idea was to make it Unicode (I've used "tchar.h" functionality in the source code). I made a copy of my batch files and added both _UNICODE and UNICODE macros, then ran the compilers. Open Watcom and Digital Mars C++ went without a problem but MinGW gave me a strange message stating: "undefined reference to `WinMain@16'". Since I'm using "_tmain(...)" a quick check at MinGW's tchar.h showed the following code when _UNICODE is defined:&lt;pre name="code" class="cpp"&gt;&lt;br /&gt;/*  for porting from other Windows compilers */&lt;br /&gt;#if 0  /* no  wide startup module */&lt;br /&gt;#define _tmain      wmain&lt;br /&gt;#define _tWinMain   wWinMain&lt;br /&gt;#define _tenviron   _wenviron&lt;br /&gt;#define __targv     __wargv&lt;br /&gt;#endif&lt;/pre&gt;I did some Google around and found some ideas about how to fix it. I also found some solutions that worked in the past but not working with the new versions so I did a quick and dirty fix to my code using ANSI startup for MinGW in all environments. Here is how the main(...) function looks like:&lt;pre name="code" class="cpp"&gt;&lt;br /&gt;#ifdef __GNUC__&lt;br /&gt;int main(int argc, char **a_argv)&lt;br /&gt;#else // !__GNUC__&lt;br /&gt;int _tmain(int argc, TCHAR **argv)&lt;br /&gt;#endif // __GNUC__&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;// some variables defined here&lt;br /&gt;// ...&lt;br /&gt;&lt;br /&gt;#ifdef __GNUC__&lt;br /&gt;TCHAR **argv;&lt;br /&gt;#ifdef UNICODE&lt;br /&gt;    // MinGW doesn't support wmain() directly (shame on its CRT!)&lt;br /&gt;    int a_argc;&lt;br /&gt;    argv = CommandLineToArgvW(GetCommandLineW(), &amp;amp;a_argc);&lt;br /&gt;#else // !UNICODE&lt;br /&gt;    argv = a_argv;&lt;br /&gt;#endif // UNICODE&lt;br /&gt;#endif // __GNUC__&lt;/pre&gt;This is quite strange. Why there is no support for Unicode startup code in MinGW? I don't believe this is too hard to achieve!  Here is a patch done in 2003. Looks like it never made it to the official build: &lt;a href="http://osdir.com/ml/gnu.mingw.patches/2003-05/msg00001.html"&gt;http://osdir.com/ml/gnu.mingw.patches/2003-05/msg00001.html&lt;/a&gt; .&lt;br /&gt;&lt;br /&gt;You can &lt;a href="http://www.demosten.com/download.shtml"&gt;get the program&lt;/a&gt; and play with it if you like. There is more info about it inside the readme.txt file.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1121926833938164830-6666883313108038114?l=demosten-eng.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://demosten-eng.blogspot.com/feeds/6666883313108038114/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1121926833938164830&amp;postID=6666883313108038114' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1121926833938164830/posts/default/6666883313108038114'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1121926833938164830/posts/default/6666883313108038114'/><link rel='alternate' type='text/html' href='http://demosten-eng.blogspot.com/2008/08/mingw-and-unicode-support.html' title='MinGW and Unicode support?'/><author><name>demosten</name><uri>http://www.blogger.com/profile/02216714190261854671</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://bp2.blogger.com/_RMhH5HhPyQ4/SIIR3FM-bbI/AAAAAAAAACQ/pq7F5q32hjI/S220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_RMhH5HhPyQ4/SJ9UFmC7w2I/AAAAAAAAAFQ/C2LiqsJn7F4/s72-c/cplusplus.png' height='72' width='72'/><thr:total>0</thr:total></entry></feed>
