<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;A04CQ3g_eSp7ImA9WhRaE0U.&quot;"><id>tag:blogger.com,1999:blog-2337605720475601257</id><updated>2012-02-16T02:59:22.641-08:00</updated><category term="Chess" /><category term="My Bets" /><category term="Free Tools" /><category term="Mathematics" /><category term="Youth Soccer" /><category term="Cooking" /><category term="Linux" /><category term="Software Development" /><category term="Task Parallel Library" /><category term="SQL Server" /><category term="Test-Driven Development" /><category term="Quote Me" /><category term="About Me" /><category term="Databases" /><category term="Security" /><category term="Big Data" /><category term="Web Identity" /><category term="SQL#" /><title>Zlatko Michailov</title><subtitle type="html">"Good designs come form good designers."
    - Fred Brooks, The Mythical Man Month</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://zlatko.michailov.org/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://zlatko.michailov.org/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/2337605720475601257/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Zlatko Michailov</name><uri>http://www.blogger.com/profile/03852147331967264725</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>32</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/ZlatkoMichailov" /><feedburner:info uri="zlatkomichailov" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;DUMBR3YzeCp7ImA9WhRbE04.&quot;"><id>tag:blogger.com,1999:blog-2337605720475601257.post-4105458008024091142</id><published>2012-02-03T22:37:00.001-08:00</published><updated>2012-02-03T22:37:36.880-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-03T22:37:36.880-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Chess" /><category scheme="http://www.blogger.com/atom/ns#" term="Free Tools" /><title>Free Chess Clock 0.4</title><content type="html">&lt;p&gt;This update introduces support for extra time per move – typically 5 seconds for recording the opponent’s move.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;a href="https://docs.google.com/open?id=0B292DMDQEeWzYjY4MmM3ODktMjJjOC00NWIzLWE5NTctNmVhMjE3YmVhNDFk"&gt;DOWNLOAD&lt;/a&gt;&lt;/strong&gt; the new version, and run it locally for best experience. Alternatively, you may use it &lt;strong&gt;&lt;a href="http://zlatko.michailov.org/p/freechessclock.html"&gt;online&lt;/a&gt;&lt;/strong&gt;. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2337605720475601257-4105458008024091142?l=zlatko.michailov.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/F585Yf_jHot3ye5b50cUPqwB3Dg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/F585Yf_jHot3ye5b50cUPqwB3Dg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/F585Yf_jHot3ye5b50cUPqwB3Dg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/F585Yf_jHot3ye5b50cUPqwB3Dg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ZlatkoMichailov/~4/oNgh25Donz8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://zlatko.michailov.org/feeds/4105458008024091142/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2337605720475601257&amp;postID=4105458008024091142&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2337605720475601257/posts/default/4105458008024091142?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2337605720475601257/posts/default/4105458008024091142?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ZlatkoMichailov/~3/oNgh25Donz8/free-chess-clock-04.html" title="Free Chess Clock 0.4" /><author><name>Zlatko Michailov</name><uri>http://www.blogger.com/profile/03852147331967264725</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://zlatko.michailov.org/2012/02/free-chess-clock-04.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE4MRXgzfSp7ImA9WhRUEE0.&quot;"><id>tag:blogger.com,1999:blog-2337605720475601257.post-5037245262904493817</id><published>2012-01-17T23:44:00.001-08:00</published><updated>2012-01-19T13:03:04.685-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-19T13:03:04.685-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Software Development" /><category scheme="http://www.blogger.com/atom/ns#" term="Task Parallel Library" /><title>Interview about TPL Dataflow</title><content type="html">&lt;p&gt;When &lt;a href="http://www.infoq.com/author/Jonathan-Allen"&gt;Jonathan Allen&lt;/a&gt; of &lt;a href="http://www.infoq.com"&gt;InfoQ&lt;/a&gt; contacted me for an e-interview about &lt;a href="http://msdn.microsoft.com/en-us/library/system.threading.tasks.dataflow(v=vs.110).aspx"&gt;TPL Dataflow&lt;/a&gt;, I immediately searched InfoQ to see what content it had about &lt;a href="http://www.infoq.com/tpl"&gt;TPL&lt;/a&gt; and &lt;a href="http://www.infoq.com/tpl-dataflow"&gt;TPL Dataflow&lt;/a&gt;. Not only did I find content, but I found an &lt;a href="http://www.infoq.com/news/2012/01/Custom-TPL-Blocks"&gt;article&lt;/a&gt; Jonathan had written about my &lt;a href="http://download.microsoft.com/download/1/6/1/1615555D-287C-4159-8491-8E5644C43CBA/Guide%20to%20Implementing%20Custom%20TPL%20Dataflow%20Blocks.pdf"&gt;&lt;strong&gt;Guide to Implementing Custom TPL Dataflow Blocks&lt;/strong&gt;&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;So I did the &lt;a href="http://www.infoq.com/news/2012/01/Zlatko-TPL"&gt;&lt;strong&gt;THE INTERVIEW&lt;/strong&gt;&lt;/a&gt;. Hopefully you find my insights on TPL Dataflow useful.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2337605720475601257-5037245262904493817?l=zlatko.michailov.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/YUcXuwbRuB2XfO8NBUpa8glVgtw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YUcXuwbRuB2XfO8NBUpa8glVgtw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/YUcXuwbRuB2XfO8NBUpa8glVgtw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YUcXuwbRuB2XfO8NBUpa8glVgtw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ZlatkoMichailov/~4/EUd5rtIZm7Q" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://zlatko.michailov.org/feeds/5037245262904493817/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2337605720475601257&amp;postID=5037245262904493817&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2337605720475601257/posts/default/5037245262904493817?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2337605720475601257/posts/default/5037245262904493817?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ZlatkoMichailov/~3/EUd5rtIZm7Q/interview-about-tpl-dataflow.html" title="Interview about TPL Dataflow" /><author><name>Zlatko Michailov</name><uri>http://www.blogger.com/profile/03852147331967264725</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://zlatko.michailov.org/2012/01/interview-about-tpl-dataflow.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0IESH06eSp7ImA9WhRWE0w.&quot;"><id>tag:blogger.com,1999:blog-2337605720475601257.post-4024733232069579943</id><published>2011-12-30T22:05:00.001-08:00</published><updated>2011-12-30T22:05:09.311-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-30T22:05:09.311-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="About Me" /><title>About Me @ Microsoft (part III)</title><content type="html">&lt;p&gt;At the beginning of this month, December 2011, I joined &lt;strong&gt;SharePoint&lt;/strong&gt; and more specifically its &lt;strong&gt;Developer Platform&lt;/strong&gt; team. Our charter is the third-party application model in SharePoint. This is a very interesting domain. I am trying to get up-to-speed as fast as possible.&lt;/p&gt;  &lt;p&gt;I admit I was plain lucky to get this job. It happened after a series of accidents and involved several great managers to whom I am deeply indebted.&lt;/p&gt;  &lt;p&gt;I am eager to start contributing to SharePoint as a modern web development platform.&amp;#160; I am also planning to engage with the SharePoint developer community. I am already getting some rough ideas. Hopefully they will start taking shape soon [and I will not be embarrassed to&amp;#160; share them].&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2337605720475601257-4024733232069579943?l=zlatko.michailov.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/4UF7eP80rwKrXQT5qnK-HaMFDSU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4UF7eP80rwKrXQT5qnK-HaMFDSU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/4UF7eP80rwKrXQT5qnK-HaMFDSU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4UF7eP80rwKrXQT5qnK-HaMFDSU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ZlatkoMichailov/~4/BSafj500Uzw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://zlatko.michailov.org/feeds/4024733232069579943/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2337605720475601257&amp;postID=4024733232069579943&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2337605720475601257/posts/default/4024733232069579943?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2337605720475601257/posts/default/4024733232069579943?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ZlatkoMichailov/~3/BSafj500Uzw/about-me-microsoft-part-iii.html" title="About Me @ Microsoft (part III)" /><author><name>Zlatko Michailov</name><uri>http://www.blogger.com/profile/03852147331967264725</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://zlatko.michailov.org/2011/12/about-me-microsoft-part-iii.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0QASXc8cCp7ImA9WhRXEko.&quot;"><id>tag:blogger.com,1999:blog-2337605720475601257.post-6244248463902130825</id><published>2011-12-18T22:15:00.001-08:00</published><updated>2011-12-18T22:15:48.978-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-18T22:15:48.978-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Chess" /><category scheme="http://www.blogger.com/atom/ns#" term="Free Tools" /><title>Free Chess Clock 0.3</title><content type="html">&lt;p&gt;This update adds mouse support to my HTML-based Free Chess Clock to make it suitable for keyboard-less devices like phones and tablets.&lt;/p&gt;  &lt;p&gt;You can try the new version &lt;a href="/p/freechessclock.html"&gt;&lt;strong&gt;online&lt;/strong&gt;&lt;/a&gt;, but you’ll have a better experience if you &lt;a href="https://docs.google.com/open?id=0B292DMDQEeWzNDA5MmViNTgtYjlhNi00YmQ0LWJhYWYtNjI1M2Y0ZTQ1NGNl"&gt;&lt;strong&gt;DOWNLOAD&lt;/strong&gt;&lt;/a&gt; the HTML page and run it locally.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2337605720475601257-6244248463902130825?l=zlatko.michailov.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/2iPXk9oz7HzYtG62Y5rsgOzYdK4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2iPXk9oz7HzYtG62Y5rsgOzYdK4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/2iPXk9oz7HzYtG62Y5rsgOzYdK4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2iPXk9oz7HzYtG62Y5rsgOzYdK4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ZlatkoMichailov/~4/hk31UURWcrw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://zlatko.michailov.org/feeds/6244248463902130825/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2337605720475601257&amp;postID=6244248463902130825&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2337605720475601257/posts/default/6244248463902130825?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2337605720475601257/posts/default/6244248463902130825?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ZlatkoMichailov/~3/hk31UURWcrw/free-chess-clock-03.html" title="Free Chess Clock 0.3" /><author><name>Zlatko Michailov</name><uri>http://www.blogger.com/profile/03852147331967264725</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://zlatko.michailov.org/2011/12/free-chess-clock-03.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUAMQXk-fSp7ImA9WhRRFk4.&quot;"><id>tag:blogger.com,1999:blog-2337605720475601257.post-3741415920678354864</id><published>2011-11-26T23:52:00.001-08:00</published><updated>2011-11-29T22:16:20.755-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-29T22:16:20.755-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="My Bets" /><category scheme="http://www.blogger.com/atom/ns#" term="Software Development" /><category scheme="http://www.blogger.com/atom/ns#" term="Big Data" /><category scheme="http://www.blogger.com/atom/ns#" term="Databases" /><title>My Bets on Scalable Databases</title><content type="html">&lt;p&gt;For those who don’t follow the database industry closely, here is the problem: Relational database servers clearly dominated the market for the last 15-20 years, but today they render inadequate for&amp;#160; &lt;a href="http://en.wikipedia.org/wiki/Big_data"&gt;Big Data&lt;/a&gt;. There are sectors of the industry where relational databases have never been able to perform - web indexing, bio research, etc. &lt;a href="http://en.wikipedia.org/wiki/Mapreduce"&gt;MapReduce&lt;/a&gt; has emerged to serve those sectors. While the MapReduce pattern is no match for SQL in terms of functionality, the distributed storage architecture on which MapReduce is based has a great potential for scalable processing. &lt;/p&gt;  &lt;p&gt;Now the question is: &lt;strong&gt;Which approach will produce a rich, yet scalable, data processing engine first?&lt;/strong&gt;&amp;#160;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;a) Enabling relational databases to operate over distributed storage, or &lt;/li&gt;    &lt;li&gt;b) Expanding the processing functionality over distributed storage? &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I bet on the latter approach:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Scalable databases will emerge from distributed storage.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;It may seem that I am betting against the odds, because relational database vendors already have both the code and the people for the job. However, those codebases are about 20 years old and thus they are&amp;#160; barely modifiable. The assumption that data is locally, yet exclusively, available is spread out everywhere. So I don’t believe those codebases will be of much help. Even if database vendors abandon their existing codebases, and try to solely leverage their people to build a new data processing technology from scratch, there are ecosystems grown around those legacy database engines that will keep randomizing the development process and will hold back progress. So those developers will be much less efficient then developers who don’t have to deal with such a legacy baggage.&lt;/p&gt;  &lt;p&gt;If the above bet comes true, it will trail the following consequence:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;There will be new companies who will play significant roles in the database industry.&lt;/p&gt;&lt;/blockquote&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2337605720475601257-3741415920678354864?l=zlatko.michailov.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Ogi42k4iv3Xb8NPXuvBBwe5GibM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Ogi42k4iv3Xb8NPXuvBBwe5GibM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Ogi42k4iv3Xb8NPXuvBBwe5GibM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Ogi42k4iv3Xb8NPXuvBBwe5GibM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ZlatkoMichailov/~4/HRpsKeRyh_U" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://zlatko.michailov.org/feeds/3741415920678354864/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2337605720475601257&amp;postID=3741415920678354864&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2337605720475601257/posts/default/3741415920678354864?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2337605720475601257/posts/default/3741415920678354864?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ZlatkoMichailov/~3/HRpsKeRyh_U/my-bets-on-scalable-databases.html" title="My Bets on Scalable Databases" /><author><name>Zlatko Michailov</name><uri>http://www.blogger.com/profile/03852147331967264725</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://zlatko.michailov.org/2011/11/my-bets-on-scalable-databases.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk8GQH4_fyp7ImA9WhRREUw.&quot;"><id>tag:blogger.com,1999:blog-2337605720475601257.post-6168087221971975931</id><published>2011-11-23T16:13:00.001-08:00</published><updated>2011-11-23T22:07:01.047-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-23T22:07:01.047-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="About Me" /><title>Rest in Peace, PFX</title><content type="html">&lt;p&gt;This is a milestone in my career at Microsoft that marks the end of &lt;a href="http:/2010/02/about-me-microsoft-part-ii.html"&gt;About Me @ Microsoft (part II)&lt;/a&gt;, but it doesn’t yet mark the beginning of “Part III”. Part III is unclear at this moment. (I hope there will be such a part). I should know more in about a week or two.&lt;/p&gt;  &lt;p&gt;Briefly, without disclosing any details: &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;The PFX team (Parallel .NET Framework Extensions) no longer exists. &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;By “the PFX team” I mean the people, not the products. The codebase still exists. There is another team that is chartered to maintain it, but no PFX developer is on that team. I don’t know what the future of those products will be, and I doubt there is anybody who knows that at this point. So please don’t ask me. I can only hope innovation in .NET parallelism will continue.&lt;/p&gt;  &lt;p&gt;Looking back, I feel lucky that I’ve had the rare chance to be part of the PFX team. The knowledge I’ve gained during these two years is priceless. I came with a few ideas I wanted to explore, and now I’m leaving with a lot more. &lt;/p&gt;  &lt;p&gt;While I’m sad about how abruptly things ended, I’m looking at it positively – it’s the trigger I needed to take the next step in my career. I am looking ahead empowered for new adventures. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2337605720475601257-6168087221971975931?l=zlatko.michailov.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/_xrYpFwNyq9l-Zgh07E65kMtZys/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_xrYpFwNyq9l-Zgh07E65kMtZys/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/_xrYpFwNyq9l-Zgh07E65kMtZys/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_xrYpFwNyq9l-Zgh07E65kMtZys/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ZlatkoMichailov/~4/mxDXcNL2w8s" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://zlatko.michailov.org/feeds/6168087221971975931/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2337605720475601257&amp;postID=6168087221971975931&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2337605720475601257/posts/default/6168087221971975931?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2337605720475601257/posts/default/6168087221971975931?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ZlatkoMichailov/~3/mxDXcNL2w8s/rest-in-peace-pfx.html" title="Rest in Peace, PFX" /><author><name>Zlatko Michailov</name><uri>http://www.blogger.com/profile/03852147331967264725</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://zlatko.michailov.org/2011/11/rest-in-peace-pfx.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0IGRHozeSp7ImA9WhdUEks.&quot;"><id>tag:blogger.com,1999:blog-2337605720475601257.post-4763871243578865103</id><published>2011-09-28T21:07:00.001-07:00</published><updated>2011-09-28T21:12:05.481-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-28T21:12:05.481-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Software Development" /><category scheme="http://www.blogger.com/atom/ns#" term="Databases" /><category scheme="http://www.blogger.com/atom/ns#" term="SQL#" /><category scheme="http://www.blogger.com/atom/ns#" term="SQL Server" /><title>SQL# - First Draft</title><content type="html">&lt;p&gt;I recently drafted a specification of a new database language - SQL# (pronounced &amp;quot;es-kju-el sharp&amp;quot;). It is available on &lt;a href="http://sqlsharp.zlatko.michailov.org"&gt;http://sqlsharp.zlatko.michailov.org&lt;/a&gt; where I plan to publish future updates as well as samples and tools.&lt;/p&gt;  &lt;p&gt;As far as the name is concerned - I really like it despite of the problems the # sign creates for file names and URLs. This name doesn't seem to be used yet - neither &lt;a href="http://www.google.com/#sclient=psy-ab&amp;amp;hl=en&amp;amp;source=hp&amp;amp;q=sql%23&amp;amp;pbx=1&amp;amp;oq=sql%23&amp;amp;aq=f&amp;amp;aqi=g4&amp;amp;aql=1&amp;amp;gs_sm=e&amp;amp;gs_upl=0l0l1l2290l0l0l0l0l0l0l0l0ll0l0&amp;amp;bav=on.2,or.r_gc.r_pw.&amp;amp;fp=8b39c7b95b72b1c1&amp;amp;biw=1553&amp;amp;bih=948"&gt;Google&lt;/a&gt; nor &lt;a href="http://www.bing.com/search?q=sql%23&amp;amp;go=&amp;amp;qs=n&amp;amp;sk=&amp;amp;sc=8-4&amp;amp;form=QBLH"&gt;Bing&lt;/a&gt; find any literal matches. So until someone claims ownership of the name, SQL# it is.&lt;/p&gt;  &lt;p&gt;Where did this come from? The programmability of Transact-SQL has been a pin in my eye for more than 10 years. My previous creature, &lt;a href="http://sourceforge.net/projects/zsql/"&gt;Z-SQL&lt;/a&gt;, was a modest attempt to make T-SQL look and feel more like PL/SQL, but at the end of the day it was still SQL. I've grown to realize that the SQL legacy, in whatever flavor it comes, is what repells application developers. Even I started catching myself staring at seemingly valid SQL code that SQL Server was rejecting. When I realized I was writing in C# inside SQL Server Management Studio, I decided to take a more radical approach - to replace all the awkward SQL constructs with something that comes naturally - C#.&lt;/p&gt;  &lt;p&gt;Of course, there are constructs like the data manipulation statements, SELECT/INSERT/UPDATE/DELETE, that only exist in SQL and cannot be replaced. We'll have to live with those for now, but for a large set of commonly used constructs like object definitions, variable declarations, loops, cursor traversals, etc. there is no reason why we should continue suffering. On top of this I add one of my favorite C/C++ features that is unfortunately missing in C# - preprocessor directives. While I only provision a limited preprocessor functionality, I believe I have captured the key use cases.&lt;/p&gt;  &lt;p&gt;The most common question people have asked me is: Why SQL# when there is already LINQ? LINQ and SQL target two completely different classes of applications. I don't want to spark yet another discussion on which one is better. I would only say one doesn't exclude the other - LINQ did not (and will not) obsolete SQL especially in these times when the volumes of data organizations deal with grow faster than ever. Just like SQL made its way up to C# in the form of LINQ, I push C# down to SQL. I hope to find a similar reception from the SQL developer community.&lt;/p&gt;  &lt;p&gt;What are the next steps? At this point I am seeking feedback on the overall usefulness of SQL# as well as on individual features - either proposed or missing. I am in no rush to start implementing any tooling that translates SQL# to Transact-SQL at least not until I am confident I've captured the right feature set. Even then, I will be looking for volunteers to write a compiler, a language service, and other tools. My goal is to continue driving the specification forward and to create an ecosystem of tool vendors.&lt;/p&gt;  &lt;p&gt;So, if you are a SQL developer and you are interested in shifting your development experience in this direction, please read the spec and log your feedback here. It will be greatly appreciated.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2337605720475601257-4763871243578865103?l=zlatko.michailov.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/-dMEW_nvOXKz4sT0OX3Zs_K1mnk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-dMEW_nvOXKz4sT0OX3Zs_K1mnk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/-dMEW_nvOXKz4sT0OX3Zs_K1mnk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-dMEW_nvOXKz4sT0OX3Zs_K1mnk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ZlatkoMichailov/~4/eEls_ORPZlQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://zlatko.michailov.org/feeds/4763871243578865103/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2337605720475601257&amp;postID=4763871243578865103&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2337605720475601257/posts/default/4763871243578865103?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2337605720475601257/posts/default/4763871243578865103?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ZlatkoMichailov/~3/eEls_ORPZlQ/sql-first-draft.html" title="SQL# - First Draft" /><author><name>Zlatko Michailov</name><uri>http://www.blogger.com/profile/03852147331967264725</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://zlatko.michailov.org/2011/09/sql-first-draft.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEYCRX85eip7ImA9Wx9UFk4.&quot;"><id>tag:blogger.com,1999:blog-2337605720475601257.post-8996072245697095969</id><published>2011-02-13T14:29:00.001-08:00</published><updated>2011-02-13T14:29:24.122-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-13T14:29:24.122-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Chess" /><category scheme="http://www.blogger.com/atom/ns#" term="Free Tools" /><title>Free Chess Clock 0.2</title><content type="html">&lt;p&gt;I found and fixed some awkward behavior in &lt;a href="http://zlatko.michailov.org/2011/02/free-chess-clock-01.html"&gt;Chess Clock 0.1&lt;/a&gt;.&lt;/p&gt;  &lt;h4&gt;Symptom&lt;/h4&gt;  &lt;p&gt;It is possible to accidentally reset the clock. In fact, it was too easy to do that - by hitting Enter instead of right Shift while the focus was still on the Reset button.&lt;/p&gt;  &lt;h4&gt;Solution&lt;/h4&gt;  &lt;p&gt;Do not reset the clock if a game is in progress. In order to reset the clock once a game has started, the page has to be reloaded. As a side effect, the clock could be paused (while the alert is being displayed.)&lt;/p&gt;  &lt;h4&gt;Availability&lt;/h4&gt;  &lt;ol&gt;   &lt;li&gt;A new standalone version is available for &lt;a href="https://docs.google.com/leaf?id=0B292DMDQEeWzNjQ5YzhiMTQtYzA3Yi00YWEzLTgwODctOWZjOThjMzZjNjJh&amp;amp;hl=en&amp;amp;authkey=CJvExLkH"&gt;&lt;strong&gt;download&lt;/strong&gt;&lt;/a&gt;. &lt;/li&gt;    &lt;li&gt;The &lt;a href="http://zlatko.michailov.org/p/freechessclock.html"&gt;&lt;strong&gt;online page&lt;/strong&gt;&lt;/a&gt; has also been updated. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Enjoy!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2337605720475601257-8996072245697095969?l=zlatko.michailov.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/dC8v6YIQi04DhA-k71RmZKAxuAg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dC8v6YIQi04DhA-k71RmZKAxuAg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/dC8v6YIQi04DhA-k71RmZKAxuAg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dC8v6YIQi04DhA-k71RmZKAxuAg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ZlatkoMichailov/~4/qZgJmgotmQo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://zlatko.michailov.org/feeds/8996072245697095969/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2337605720475601257&amp;postID=8996072245697095969&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2337605720475601257/posts/default/8996072245697095969?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2337605720475601257/posts/default/8996072245697095969?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ZlatkoMichailov/~3/qZgJmgotmQo/free-chess-clock-02.html" title="Free Chess Clock 0.2" /><author><name>Zlatko Michailov</name><uri>http://www.blogger.com/profile/03852147331967264725</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://zlatko.michailov.org/2011/02/free-chess-clock-02.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEIMQnkyeSp7ImA9Wx9UEk8.&quot;"><id>tag:blogger.com,1999:blog-2337605720475601257.post-8069297766346708616</id><published>2011-02-08T20:41:00.001-08:00</published><updated>2011-02-08T20:43:03.791-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-08T20:43:03.791-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Chess" /><category scheme="http://www.blogger.com/atom/ns#" term="Free Tools" /><title>Free Chess Clock 0.1</title><content type="html">&lt;p&gt;If you have shopped around for chess clocks, you may have noticed those things are not cheap - &lt;a href="http://www.amazon.com/s?ie=UTF8&amp;amp;tag=amznsearch.ms-20&amp;amp;index=aps&amp;amp;link%5Fcode=qs&amp;amp;field-keywords=chess+clock#/ref=nb_sb_ss_i_0_19?url=search-alias%3Daps&amp;amp;field-keywords=chess+clock+digital&amp;amp;sprefix=chess+clock+digital&amp;amp;rh=i%3Aaps%2Ck%3Achess+clock+digital"&gt;starting from $30 and going up to $150&lt;/a&gt;. This inspired me to write a simple program that acts as a chess clock. &lt;/p&gt;  &lt;h4&gt;Software Chess Clock&lt;/h4&gt;  &lt;p&gt;My objective was to make the program available on as many platforms as possible - PC, tablet, phone, etc. - running various operating systems. I chose to implement it as a single, static, HTML page with JavaScript. As long as you have a web browser with JavaScript enabled, you can enjoy my &lt;em&gt;free&lt;/em&gt; software chess clock. And yes, it is completely free (within the limits of the &lt;a href="http://en.wikipedia.org/wiki/BSD_licenses"&gt;BSD license&lt;/a&gt;).&lt;/p&gt;  &lt;h4&gt;How to Use It&lt;/h4&gt;  &lt;p&gt;Enter the names of the players as well as the number of minutes per player. Click the &lt;em&gt;Start/Reset&lt;/em&gt; button. The clock will start ticking the first time you press the &lt;em&gt;Shift&lt;/em&gt; key on your keyboard. &lt;/p&gt;  &lt;p&gt;For best experience, launch the page under &lt;strong&gt;Internet Explorer&lt;/strong&gt; since that is the only browser out of the ones I tested with that distinguishes between the left Shift key and the right Shift key. When the page is launched under any other web browser, pressing either Shift key switches the side.&lt;/p&gt;  &lt;h4&gt;Where to Find It&lt;/h4&gt;  &lt;ol&gt;   &lt;li&gt;Since this is a standalone HTML page, you can &lt;a href="https://docs.google.com/leaf?id=0B292DMDQEeWzYTgxMWM0ODctOGMwYS00YzFiLTg0ZTItNGI4MjQ0ZDAwNjcw&amp;amp;hl=en&amp;amp;authkey=CIbTxtcN"&gt;&lt;strong&gt;download&lt;/strong&gt;&lt;/a&gt; it once and then use it locally from your computer/device. &lt;/li&gt;    &lt;li&gt;Alternatively, you can browse it &lt;a href="http://zlatko.michailov.org/p/freechessclock.html"&gt;&lt;strong&gt;directly&lt;/strong&gt;&lt;/a&gt; from my website. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Enjoy my free chess clock, and enjoy playing chess! &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2337605720475601257-8069297766346708616?l=zlatko.michailov.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/hvHfx6mMZd7yiDsyf9WfU7x5nM4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hvHfx6mMZd7yiDsyf9WfU7x5nM4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/hvHfx6mMZd7yiDsyf9WfU7x5nM4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hvHfx6mMZd7yiDsyf9WfU7x5nM4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ZlatkoMichailov/~4/8n7j5XXDESs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://zlatko.michailov.org/feeds/8069297766346708616/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2337605720475601257&amp;postID=8069297766346708616&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2337605720475601257/posts/default/8069297766346708616?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2337605720475601257/posts/default/8069297766346708616?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ZlatkoMichailov/~3/8n7j5XXDESs/free-chess-clock-01.html" title="Free Chess Clock 0.1" /><author><name>Zlatko Michailov</name><uri>http://www.blogger.com/profile/03852147331967264725</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://zlatko.michailov.org/2011/02/free-chess-clock-01.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE4MRng5eip7ImA9Wx9VF0Q.&quot;"><id>tag:blogger.com,1999:blog-2337605720475601257.post-5545854910243149184</id><published>2011-02-03T20:19:00.000-08:00</published><updated>2011-02-03T20:16:27.622-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-03T20:16:27.622-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Software Development" /><category scheme="http://www.blogger.com/atom/ns#" term="About Me" /><title>US Patent No. 7,818,311</title><content type="html">&lt;p&gt;&lt;a href="http://lh5.ggpht.com/_Bg29dxKxFmY/TUOfpiu_80I/AAAAAAAAG7g/bXy3inYoSCE/s1600-h/touched%5B9%5D.jpg"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="" border="0" alt="" src="http://lh4.ggpht.com/_Bg29dxKxFmY/TUOfrD3gC4I/AAAAAAAAG7k/39xPWUFdJJM/touched_thumb%5B7%5D.jpg?imgmax=800" width="408" height="595" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;This idea came to me while I was writing the original version of my popular &lt;a href="http://code.msdn.microsoft.com/esql"&gt;eSqlBlast&lt;/a&gt; tool. (Special thanks to my buddy &lt;a href="http://jkowalski.com/"&gt;Jarek Kowalski&lt;/a&gt; for maintaining it after I left the Entity Framework team.) I needed to parse batches of Entity SQL statements and I didn’t want to spend too much time on that. I figured regular expressions would suffice, but I needed a gigantic regex that I couldn’t write correctly. So I came up with this simple preprocessor that can build gigantic regexes out of many simple ones.&lt;/p&gt;  &lt;p&gt;The full details are publically available at the &lt;a href="http://patft.uspto.gov/netacgi/nph-Parser?Sect1=PTO2&amp;amp;Sect2=HITOFF&amp;amp;p=1&amp;amp;u=%2Fnetahtml%2FPTO%2Fsearch-bool.html&amp;amp;r=1&amp;amp;f=G&amp;amp;l=50&amp;amp;co1=AND&amp;amp;d=PTXT&amp;amp;s1=7,818,311.PN.&amp;amp;OS=PN/7,818,311&amp;amp;RS=PN/7,818,311"&gt;US Patent and Trade Office web site&lt;/a&gt;.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2337605720475601257-5545854910243149184?l=zlatko.michailov.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/zX8QRpWLMAI_F2xjaxCI0hBgxO8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zX8QRpWLMAI_F2xjaxCI0hBgxO8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/zX8QRpWLMAI_F2xjaxCI0hBgxO8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zX8QRpWLMAI_F2xjaxCI0hBgxO8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ZlatkoMichailov/~4/geZm7Cc3p_k" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://zlatko.michailov.org/feeds/5545854910243149184/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2337605720475601257&amp;postID=5545854910243149184&amp;isPopup=true" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2337605720475601257/posts/default/5545854910243149184?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2337605720475601257/posts/default/5545854910243149184?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ZlatkoMichailov/~3/geZm7Cc3p_k/us-patent-no-7818311.html" title="US Patent No. 7,818,311" /><author><name>Zlatko Michailov</name><uri>http://www.blogger.com/profile/03852147331967264725</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/_Bg29dxKxFmY/TUOfrD3gC4I/AAAAAAAAG7k/39xPWUFdJJM/s72-c/touched_thumb%5B7%5D.jpg?imgmax=800" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://zlatko.michailov.org/2011/01/us-patent-no-7818311.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0cCQ3c6fCp7ImA9Wx9VEko.&quot;"><id>tag:blogger.com,1999:blog-2337605720475601257.post-7550736039353856880</id><published>2011-01-21T22:12:00.000-08:00</published><updated>2011-01-28T20:24:22.914-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-28T20:24:22.914-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Linux" /><title>How to Make Your Linux Desktop Look Better than a Mac - Update</title><content type="html">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;My post on &lt;a href="http://zlatko.michailov.org/2010/02/how-to-make-your-linux-desktop-look.html"&gt;How to Make Your Linux Desktop Look Better than a Mac&lt;/a&gt; has been maintaining the highest hit count on my blog ever since I published it. So I feel obliged to keep the information up-to-date.     &lt;br /&gt;I've updated my Linux distribution to &lt;a href="http://en.opensuse.org/Portal:11.3"&gt;openSUSE 11.3&lt;/a&gt; - the latest openSUSE distribution as of today (I see &lt;a href="http://en.opensuse.org/Portal:11.4"&gt;openSUSE 11.4&lt;/a&gt; is coming soon.) As I did that, I noticed a breaking change to the procedure I outlined in my original post. Fortunately, there is a workaround, and I dare say things are getting better.&amp;#160; &lt;br /&gt;&lt;/div&gt;  &lt;h4 xmlns="http://www.w3.org/1999/xhtml"&gt;Breaking Change    &lt;br /&gt;&lt;/h4&gt;  &lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;The most significant change between openSUSE 11.0 and openSUSE 11.3 with regard to the desktop view is that Emerald is no longer distributed. That is the component that renders the window decorations, the Mac-like decorations in particular. The discontinuation of Emerald leaves a ton of themes &lt;a href="http://kde-look.org"&gt;out there&lt;/a&gt; useless, but I don't really miss it. There used to be bugs that I no longer see. For instance, my task bar would disappear, or my windows would leave decorations. So, move on.     &lt;br /&gt;&lt;/div&gt;  &lt;h4 xmlns="http://www.w3.org/1999/xhtml"&gt;Workaround    &lt;br /&gt;&lt;/h4&gt;  &lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;Step 1 of the original procedure remains virtually unchanged - install Compiz, enable desktop effects, make Compiz your window manager. The only caveat in this step is that there are now three competing tools for configuring desktop effects. I stick with the &lt;i&gt;CompizConfig Settings Manager&lt;/i&gt; and try not use the other two.     &lt;br /&gt;    &lt;br /&gt;Step 2 changes since it was relying on Emerald, but not too much. Where you were setting Emerald to be your window decorator in CompizConfig Settings Manager's &lt;i&gt;Window Decoration&lt;/i&gt; plug-in, now you have to set '&lt;i&gt;&lt;b&gt;kde4-window-decorator --replace&lt;/b&gt;&lt;/i&gt;' as shown below:     &lt;br /&gt;&lt;a href="http://lh5.ggpht.com/_Bg29dxKxFmY/TUOWFA1FvLI/AAAAAAAAG7E/ZZqpjmvH8v0/s1600-h/CCSM_WindowDecoration%5B7%5D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="CCSM_WindowDecoration" border="0" alt="CCSM_WindowDecoration" src="http://lh3.ggpht.com/_Bg29dxKxFmY/TTym8p-UxHI/AAAAAAAAG7I/LRDcXKkBi5o/CCSM_WindowDecoration_thumb%5B6%5D.png?imgmax=800" width="450" height="275" /&gt;&lt;/a&gt;&lt;/div&gt;  &lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&amp;#160;&lt;/div&gt;  &lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;Now you have to enable a decoration engine supported by KDE4. Open your &lt;i&gt;Configure Desktop&lt;/i&gt; tool and enable the &lt;em&gt;Aurorae Theme Decoration Engine&lt;/em&gt; as shown below:     &lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_Bg29dxKxFmY/TTym-enq_SI/AAAAAAAAG7M/8x08TcWCqKw/s1600-h/AuroraeDecorationThemeEngine%5B2%5D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="AuroraeDecorationThemeEngine" border="0" alt="AuroraeDecorationThemeEngine" src="http://lh4.ggpht.com/_Bg29dxKxFmY/TTym_AVXVcI/AAAAAAAAG7Y/ptca-j7Lp24/AuroraeDecorationThemeEngine_thumb%5B1%5D.png?imgmax=800" width="451" height="248" /&gt;&lt;/a&gt;     &lt;br /&gt;&lt;/div&gt;  &lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&amp;#160;&lt;/div&gt;  &lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;Now you can click on the &lt;i&gt;Get New Themes&lt;/i&gt;... button and install the window decoration theme of your choice. The number of the Aurorae themes is a tiny fraction of the number of Emerald themes, but I was able to find two Mac-like themes. I use &lt;i&gt;Auromac&lt;/i&gt;. I like it even better than the Emerald theme I was using previously.     &lt;br /&gt;&lt;/div&gt;  &lt;h4 xmlns="http://www.w3.org/1999/xhtml"&gt;Finally &lt;/h4&gt;  &lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;Remember to log out and log back in in order for the GUI components to load properly.    &lt;br /&gt;Enjoy your desktop view!     &lt;br /&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2337605720475601257-7550736039353856880?l=zlatko.michailov.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/huYl2jlLZB2o2zB1MTeY0KuKo9Q/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/huYl2jlLZB2o2zB1MTeY0KuKo9Q/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/huYl2jlLZB2o2zB1MTeY0KuKo9Q/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/huYl2jlLZB2o2zB1MTeY0KuKo9Q/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ZlatkoMichailov/~4/xYaRmaPFCkg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://zlatko.michailov.org/feeds/7550736039353856880/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2337605720475601257&amp;postID=7550736039353856880&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2337605720475601257/posts/default/7550736039353856880?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2337605720475601257/posts/default/7550736039353856880?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ZlatkoMichailov/~3/xYaRmaPFCkg/how-to-make-your-linux-desktop-look.html" title="How to Make Your Linux Desktop Look Better than a Mac - Update" /><author><name>Zlatko Michailov</name><uri>http://www.blogger.com/profile/03852147331967264725</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/_Bg29dxKxFmY/TTym8p-UxHI/AAAAAAAAG7I/LRDcXKkBi5o/s72-c/CCSM_WindowDecoration_thumb%5B6%5D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://zlatko.michailov.org/2011/01/how-to-make-your-linux-desktop-look.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE4DQn04eyp7ImA9Wx9bEU0.&quot;"><id>tag:blogger.com,1999:blog-2337605720475601257.post-545081042796733543</id><published>2011-01-06T21:57:00.001-08:00</published><updated>2011-02-19T00:09:33.333-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-19T00:09:33.333-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Mathematics" /><title>Integrals Tutorial</title><content type="html">I hadn’t seen an integral for nearly 20 years until last week when my niece called for help. Here I am posting my solutions to the problems she sent me. The integrals seem quite typical. That’s why I hope these solutions show the methodology to solve such integrals. I kept the transitions very simple, so although the&amp;nbsp; explanations (wherever I’ve added any) are in Bulgarian, you can still figure out what I’ve had in mind.&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
Problems&lt;/h4&gt;
&lt;a href="http://lh5.ggpht.com/_Bg29dxKxFmY/TSaq5-6zMmI/AAAAAAAAGvk/yOYh7blFLMg/s1600-h/Integrals-01%5B6%5D.jpg"&gt;&lt;img alt="Integrals-01" border="0" height="484" src="http://lh3.ggpht.com/_Bg29dxKxFmY/TSaq6ye5TDI/AAAAAAAAGvs/jV1hEhxRGYI/Integrals-01_thumb%5B4%5D.jpg?imgmax=800" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="Integrals-01" width="353" /&gt;&lt;/a&gt;&lt;a href="http://lh5.ggpht.com/_Bg29dxKxFmY/TSaq8OguXbI/AAAAAAAAGtM/RViAe5VyD_0/s1600-h/Integrals-02%5B3%5D.jpg"&gt;&lt;img alt="Integrals-02" border="0" height="484" src="http://lh3.ggpht.com/_Bg29dxKxFmY/TSaq83d1ayI/AAAAAAAAGtQ/hpNlJzTjWR0/Integrals-02_thumb%5B1%5D.jpg?imgmax=800" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="Integrals-02" width="353" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
Solutions&lt;/h4&gt;
&lt;a href="http://lh4.ggpht.com/_Bg29dxKxFmY/TSa5_owf8ZI/AAAAAAAAGxw/xDMyBe0Zoe0/s1600-h/zlatko0101%5B19%5D.jpg"&gt;&lt;img alt="zlatko0101" border="0" height="484" src="http://lh3.ggpht.com/_Bg29dxKxFmY/TSa6B3TFoPI/AAAAAAAAGx4/MTjOISLFBss/zlatko0101_thumb%5B13%5D.jpg?imgmax=800" style="background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="zlatko0101" width="377" /&gt;&lt;/a&gt;&lt;a href="http://lh4.ggpht.com/_Bg29dxKxFmY/TSarA9sanpI/AAAAAAAAGyA/no-bR02Ywjg/s1600-h/zlatko0102%5B10%5D.jpg"&gt;&lt;img alt="zlatko0102" border="0" height="484" src="http://lh6.ggpht.com/_Bg29dxKxFmY/TSarCJNHoYI/AAAAAAAAGyI/JpTc7ZR5YyE/zlatko0102_thumb%5B6%5D.jpg?imgmax=800" style="background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="zlatko0102" width="377" /&gt;&lt;/a&gt;&lt;a href="http://lh4.ggpht.com/_Bg29dxKxFmY/TSarDBGd2WI/AAAAAAAAGyQ/djkw3bwcl_E/s1600-h/zlatko0103%5B8%5D.jpg"&gt;&lt;img alt="zlatko0103" border="0" height="484" src="http://lh6.ggpht.com/_Bg29dxKxFmY/TSarEHLrBKI/AAAAAAAAGyY/inpWGF5AD8c/zlatko0103_thumb%5B4%5D.jpg?imgmax=800" style="background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="zlatko0103" width="377" /&gt;&lt;/a&gt;&lt;a href="http://lh3.ggpht.com/_Bg29dxKxFmY/TSarF0uJ3BI/AAAAAAAAGyg/v9qyd-c_uSs/s1600-h/zlatko0104%5B4%5D.jpg"&gt;&lt;img alt="zlatko0104" border="0" height="484" src="http://lh5.ggpht.com/_Bg29dxKxFmY/TSarG65z-1I/AAAAAAAAGyo/Sw8V9UUEO6s/zlatko0104_thumb%5B2%5D.jpg?imgmax=800" style="background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="zlatko0104" width="377" /&gt;&lt;/a&gt;&lt;a href="http://lh5.ggpht.com/_Bg29dxKxFmY/TSarIfgxLpI/AAAAAAAAGyw/3XsMT_vZgko/s1600-h/zlatko0105%5B4%5D.jpg"&gt;&lt;img alt="zlatko0105" border="0" height="484" src="http://lh5.ggpht.com/_Bg29dxKxFmY/TSarJvokCTI/AAAAAAAAGy4/TsqcWHlXIbw/zlatko0105_thumb%5B2%5D.jpg?imgmax=800" style="background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="zlatko0105" width="377" /&gt;&lt;/a&gt;&lt;a href="http://lh5.ggpht.com/_Bg29dxKxFmY/TSarK1hPFoI/AAAAAAAAGzA/CqT3QWV2VOs/s1600-h/zlatko0106%5B4%5D.jpg"&gt;&lt;img alt="zlatko0106" border="0" height="484" src="http://lh6.ggpht.com/_Bg29dxKxFmY/TSarL9dUYQI/AAAAAAAAGzI/CvKtt8JV4jY/zlatko0106_thumb%5B2%5D.jpg?imgmax=800" style="background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="zlatko0106" width="377" /&gt;&lt;/a&gt;&lt;a href="http://lh3.ggpht.com/_Bg29dxKxFmY/TSarNt6msxI/AAAAAAAAGzQ/V-aM174J8no/s1600-h/zlatko0107%5B4%5D.jpg"&gt;&lt;img alt="zlatko0107" border="0" height="484" src="http://lh5.ggpht.com/_Bg29dxKxFmY/TSarPLgmESI/AAAAAAAAGzY/T-C3Lm6cUD0/zlatko0107_thumb%5B2%5D.jpg?imgmax=800" style="background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="zlatko0107" width="377" /&gt;&lt;/a&gt;&lt;a href="http://lh3.ggpht.com/_Bg29dxKxFmY/TSarQIDQvEI/AAAAAAAAGzc/aFEqUIr9Cbk/s1600-h/zlatko0108%5B4%5D.jpg"&gt;&lt;img alt="zlatko0108" border="0" height="484" src="http://lh4.ggpht.com/_Bg29dxKxFmY/TSarQzAeyDI/AAAAAAAAGzg/vAnjpx10nRc/zlatko0108_thumb%5B2%5D.jpg?imgmax=800" style="background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="zlatko0108" width="377" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2337605720475601257-545081042796733543?l=zlatko.michailov.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/BX84rSl5yioV9Pks-2OrDsPYY7Y/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BX84rSl5yioV9Pks-2OrDsPYY7Y/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/BX84rSl5yioV9Pks-2OrDsPYY7Y/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BX84rSl5yioV9Pks-2OrDsPYY7Y/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ZlatkoMichailov/~4/Io9o7dxoxtY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://zlatko.michailov.org/feeds/545081042796733543/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2337605720475601257&amp;postID=545081042796733543&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2337605720475601257/posts/default/545081042796733543?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2337605720475601257/posts/default/545081042796733543?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ZlatkoMichailov/~3/Io9o7dxoxtY/integrals-tutorial.html" title="Integrals Tutorial" /><author><name>Zlatko Michailov</name><uri>http://www.blogger.com/profile/03852147331967264725</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/_Bg29dxKxFmY/TSaq6ye5TDI/AAAAAAAAGvs/jV1hEhxRGYI/s72-c/Integrals-01_thumb%5B4%5D.jpg?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://zlatko.michailov.org/2011/01/integrals-tutorial.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0QBQHY4fyp7ImA9Wx9SF0U.&quot;"><id>tag:blogger.com,1999:blog-2337605720475601257.post-3727926208401004467</id><published>2010-12-07T22:22:00.001-08:00</published><updated>2010-12-07T22:22:31.837-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-07T22:22:31.837-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Free Tools" /><title>Free Google Apps Mail Notifier (version 0.1)</title><content type="html">&lt;p&gt;If you have a Google Apps mail account, you may need a desktop tool that periodically checks your mailbox and notifies you when there are new messages. Keeping a browser window open at all times and manually refreshing it is really annoying. &lt;/p&gt;  &lt;p&gt;Google has a such a tool, &lt;a href="http://toolbar.google.com/gmail-helper/notifier_windows.html"&gt;Gmail Notifier&lt;/a&gt;, but unfortunately it only works for regular Gmail accounts (@gmail.com) and not for Google Apps accounts (@yourdomain.com). Search engines find several independent implementations of such tools, but I have two main problems with all the tools I have seen:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;None of those tools is free. (I don’t pay for the mail service itself. It’s ridiculous to have to pay for the notifications.) &lt;/li&gt;    &lt;li&gt;None of those tools has its source code available, i.e. I cannot be sure what the tool does with my credentials &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Therefore, I decided to write a Google Apps mail notification tool that is free of any charge and that is distributed as source code, so you can see what it does before you start using it. Feel free to adjust the source code (within the limits of the &lt;a href="http://en.wikipedia.org/wiki/BSD_licenses"&gt;BSD license&lt;/a&gt;) to suit your needs better. Here is how to build the tool:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Make sure you have .NET 4 installed. &lt;/li&gt;    &lt;li&gt;&lt;a href="https://docs.google.com/leaf?id=0B292DMDQEeWzOGQ4YTJhZmItMmI5OS00ZjQ4LTljM2UtYzExOGMyNWFjZDA0&amp;amp;hl=en&amp;amp;authkey=CMmd-PAH"&gt;&lt;strong&gt;Download the source file&lt;/strong&gt;&lt;/a&gt;. Review the code to make sure it doesn’t do something you don’t like. &lt;/li&gt;    &lt;li&gt;The tool needs two icon (.ico) files – &lt;strong&gt;your_alarm_icon.ico&lt;/strong&gt; and &lt;strong&gt;your_quiet_icon.ico&lt;/strong&gt;. The former icon is shown when you have unread messages and the latter one is shown when there are no unread messages. You have to provide these two files yourself. That is not as scary as it sounds – just search your system drive for ‘.ico’ and you’ll find plenty. Copy the two you like best and name them as required above. You will be able to replace them later if you want to without having to recompile the .exe, because they are loaded dynamically. &lt;strong&gt;Note&lt;/strong&gt;: These two .ico files must reside in the same folder with the .exe.&amp;#160; &lt;/li&gt;    &lt;li&gt;To compile the source code, run the following command in a plain &lt;strong&gt;cmd&lt;/strong&gt; window from the same directory where you saved the source file. (The entire command and arguments must be on one line): &lt;/li&gt; &lt;/ol&gt;  &lt;blockquote&gt;   &lt;p&gt;%windir%\microsoft.net\framework\v4.0.30319\csc /t:winexe /o      &lt;br /&gt;/r:mscorlib.dll /r:System.dll /r:System.Drawing.dll /r:System.Windows.Forms.dll /r:System.Xml.dll&amp;#160; &lt;br /&gt;FreeGoogleAppsMailNotifier-0.1.cs &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Now you may run &lt;strong&gt;FreeGoogleAppsMailNotifier-0.1.exe&lt;/strong&gt;. If you decide to copy it somewhere, remember either to copy the two .ico files along with it or to supply alternative ones. &lt;/p&gt;  &lt;p&gt;Since this is the very first version of the tool, it is possible that there are some bugs. If you find one, please report it here as a comment. Thanks. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2337605720475601257-3727926208401004467?l=zlatko.michailov.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/j7vaN2F9fBR_kzwGrOJYZztLSBU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/j7vaN2F9fBR_kzwGrOJYZztLSBU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/j7vaN2F9fBR_kzwGrOJYZztLSBU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/j7vaN2F9fBR_kzwGrOJYZztLSBU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ZlatkoMichailov/~4/Lq0_bJxBjG8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://zlatko.michailov.org/feeds/3727926208401004467/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2337605720475601257&amp;postID=3727926208401004467&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2337605720475601257/posts/default/3727926208401004467?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2337605720475601257/posts/default/3727926208401004467?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ZlatkoMichailov/~3/Lq0_bJxBjG8/free-google-apps-mail-notifier-version.html" title="Free Google Apps Mail Notifier (version 0.1)" /><author><name>Zlatko Michailov</name><uri>http://www.blogger.com/profile/03852147331967264725</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://zlatko.michailov.org/2010/12/free-google-apps-mail-notifier-version.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak4DSXo7eSp7ImA9Wx9SFE0.&quot;"><id>tag:blogger.com,1999:blog-2337605720475601257.post-5353877318000865308</id><published>2010-12-03T12:42:00.001-08:00</published><updated>2010-12-03T12:42:58.401-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-03T12:42:58.401-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Quote Me" /><title>Everybody Is a Programmer</title><content type="html">&lt;blockquote&gt;   &lt;p&gt;When I was a young developer, I used to treat my programs as kids. Now that I am an old developer, I treat my kids as programs.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Oftentimes we don’t realize we are programming our kids by how we act, how we speak, how we interact with other people, or even by not being with our kids. Kids compile the code they receive from us and (God forbid) from other sources, and start executing it. &lt;/p&gt;  &lt;p&gt;As it is with computers, we don’t really know what we’ve programmed them to do until we let them run. Also as it is with computers, finding and fixing bugs is a long and painful process that is not always successful. Unlike it is with computers, you cannot scrap the project and start over. &lt;/p&gt;  &lt;p&gt;Therefore, remember that you are a programmer. And be a good one.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2337605720475601257-5353877318000865308?l=zlatko.michailov.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ziUR64WCrBNLYKKORZbhkBpckhw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ziUR64WCrBNLYKKORZbhkBpckhw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ziUR64WCrBNLYKKORZbhkBpckhw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ziUR64WCrBNLYKKORZbhkBpckhw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ZlatkoMichailov/~4/i3aDBqPXN3g" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://zlatko.michailov.org/feeds/5353877318000865308/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2337605720475601257&amp;postID=5353877318000865308&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2337605720475601257/posts/default/5353877318000865308?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2337605720475601257/posts/default/5353877318000865308?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ZlatkoMichailov/~3/i3aDBqPXN3g/everybody-is-programmer.html" title="Everybody Is a Programmer" /><author><name>Zlatko Michailov</name><uri>http://www.blogger.com/profile/03852147331967264725</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://zlatko.michailov.org/2010/12/everybody-is-programmer.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUcMQX06eyp7ImA9Wx5UEk0.&quot;"><id>tag:blogger.com,1999:blog-2337605720475601257.post-746303087135733042</id><published>2010-10-15T22:31:00.001-07:00</published><updated>2010-10-15T22:31:20.313-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-15T22:31:20.313-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Youth Soccer" /><title>Meet the Coach</title><content type="html">&lt;p&gt;As my third season as a recreational soccer coach is wrapping up, I am starting to prepare for the next season. It is time to record what I provide and what I expect as a coach, so parents can read it in advance.&lt;/p&gt;  &lt;h4&gt;My Motivation&lt;/h4&gt;  &lt;p&gt;I am a volunteer. I am not paid by the association, nor do I get any discount. As a parent I pay as much as every other parent does.&lt;/p&gt;  &lt;p&gt;I do this, because I want my kid to advance in the game. We spend a lot of time practicing one-on-one, but soccer is a team sport. A player should ultimately practice as part of a team competing against another team. Furthermore, the better a team is, the more individual players are challenged, and the more they advance. That is why I want to build a good team.&lt;/p&gt;  &lt;h4&gt;What I Provide&lt;/h4&gt;  &lt;p&gt;I teach. And I am serious about it. I value our time together. I do not waste my time trying to entertain kids who are not motivated. I teach kids who want to learn.&lt;/p&gt;  &lt;p&gt;I teach both individual skills and team tactics with roughly equal emphasis. I also promote physical fitness and proper warming practices. The first half of each practice consist of a warm up and drills, and the second half – of a short game. If a kid is late for practice, he may skip a drill, but he will not skip the warm up. Running is not a punishment – it is a prerequisite.&lt;/p&gt;  &lt;p&gt;Lastly, I set the number of practices to the maximum allowed by the association in order to maximize the value for kids.&lt;/p&gt;  &lt;h4&gt;What I Expect&lt;/h4&gt;  &lt;p&gt;My expectations are not from the kids I coach, but from their parents. &lt;/p&gt;  &lt;p&gt;I expect parents to be interested in the advancement of their own kid, and to actively participate in the practices. I greatly appreciate help.&lt;/p&gt;  &lt;p&gt;I expect parents to bring their kids on time for practice and especially on game days. Please allocate at least 10-15 minutes for warming up before games.&lt;/p&gt;  &lt;p&gt;I expect parents to tie their kid’s shoes before practices and games. I understand this is the age when we teach our kids to tie their shows, but there are occasions when we have to make exceptions. &lt;/p&gt;  &lt;p&gt;I expect parents to bring their kid’s ball to practices. If you bring your kid without a ball, you are not leaving me too many options how to keep him busy.&lt;/p&gt;  &lt;h4&gt;Game Days&lt;/h4&gt;  &lt;p&gt;A roster has twice as many kids as there may be on the filed at the same time. The association has a rule that each kid is entitled to 50% of the game. I interpret that rule as: each kid is entitled to 50% of the game while the kid is present at the field. That means if a kid shows up for the second half, he will still play 50% of that second half, not the entire half.&lt;/p&gt;  &lt;p&gt;I let kids play in the order of their arrival at the field. If you want your kid to start, come early. &lt;/p&gt;  &lt;p&gt;Games are more intense then practices. Therefore kids need to warm up both physically and technically. Allocate 10-15 minutes for that and bring their ball. &lt;/p&gt;  &lt;h4&gt;Play with Your Kid&lt;/h4&gt;  &lt;p&gt;My observation is that the kids whose parents commit time to play with them, advance most. You need not have played soccer in order to help your kid make progress. Even taking your kid to the park to watch a live game between older kids or adult amateurs will inspire him to learn. Try it.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2337605720475601257-746303087135733042?l=zlatko.michailov.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/KjwQEgF8YY1J3E6-FFAJBTpR540/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KjwQEgF8YY1J3E6-FFAJBTpR540/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/KjwQEgF8YY1J3E6-FFAJBTpR540/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KjwQEgF8YY1J3E6-FFAJBTpR540/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ZlatkoMichailov/~4/k2W5wAQl3aE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://zlatko.michailov.org/feeds/746303087135733042/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2337605720475601257&amp;postID=746303087135733042&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2337605720475601257/posts/default/746303087135733042?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2337605720475601257/posts/default/746303087135733042?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ZlatkoMichailov/~3/k2W5wAQl3aE/meet-coach.html" title="Meet the Coach" /><author><name>Zlatko Michailov</name><uri>http://www.blogger.com/profile/03852147331967264725</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://zlatko.michailov.org/2010/10/meet-coach.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkAFQnk5eip7ImA9Wx5XEks.&quot;"><id>tag:blogger.com,1999:blog-2337605720475601257.post-3717180631901397181</id><published>2010-09-11T22:23:00.000-07:00</published><updated>2010-09-11T22:18:33.722-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-09-11T22:18:33.722-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Software Development" /><category scheme="http://www.blogger.com/atom/ns#" term="Test-Driven Development" /><title>Active Software Specification (a.k.a. Test-Driven Development)</title><content type="html">&lt;p&gt;I used to ignore Test-Driven Development (TDD) for years. For some reason it sounded to me like “test development” which was not cool. Just recently I started suspecting that my view of how software products should be developed might be inline with TDD. So I took a formal class and not only was I happy to discover I had come up with the same concept independently but I also got my view clarified and taken forward. &lt;/p&gt;  &lt;p&gt;The reason why I am writing this article is to share this knowledge with my fellow developers, because it has become evident from my interactions with other developers in my organization that while the term &amp;quot;test-driven development” is quite popular, its philosophy is largely misunderstood. My goal is to get the people involved in software development to rethink who should do what in the software development process.&lt;/p&gt;  &lt;h4&gt;Specification Driven Development&lt;/h4&gt;  &lt;p&gt;A typical software organization has its product development driven by some sort of a &lt;em&gt;specification&lt;/em&gt;. That could be a text document, a prototype, a slideshow of screenshots, or a mix of those. Whatever form the specification takes, its function is to &lt;em&gt;project&lt;/em&gt; what the product should look like. The main problem with this approach is that the specification is &lt;em&gt;passive&lt;/em&gt; and it must be interpreted by humans. First, a developer must interpret the spec and implement his interpretation in source code. Then, the specification is interpreted by a tester who verifies the developer’s interpretation and implementation. Wherever those two interpretations differ, there is a bug filed, and wherever they don’t, it is assumed the specification is correctly implemented. Now we have two, more concrete, problems: 1) the organization churns on aligning interpretations, and 2) the fact a developer and a tester share the same interpretation doesn’t mean that matches the author’s intent.&lt;/p&gt;  &lt;p&gt;Things get even worse with time. Towards the end of the release cycle, both the developer and the tester have a pretty good understanding of what the product should look like and specification authors tend to neglect keeping their specifications in sync with the products. The endgame is the time when the public surface endures many small tweaks that are too small to be worth updating the specification, but that are enough for somebody looking at the specification to consider it outdated. So when the next release cycle starts, the team has the dilemma: should they spend the time to put the specification in sync with the product, or should they focus on the incremental difference and specify only that? The latter option is much more attractive is is the typical winner. One more release cycle and the original specification will be forgotten for good. Along with the original spec is lost the ability to track use cases that may get broken broken.&lt;/p&gt;  &lt;h4&gt;Active Software Specification&lt;/h4&gt;  &lt;p&gt;Specification-driven development somewhat works for v1, but it gradually falls apart in subsequent releases. The main reason for that is the passiveness of the specification. The alternative would be to write the specification in a different form – one that need not be interpreted and that would not get out of sync with the product. One such form is a suite of tests. A test is not a projection of a product feature – it is an active verification of the feature’s implementation. Notice there is nothing to be interpreted any more. &lt;/p&gt;  &lt;p&gt;More specifically, these tests a check-in tests, i.e. any attempt to check in a source code change would be rejected unless all those tests pass. Permissions to modify those tests should be restricted to the architect who authored them and a manager responsible for the final product. If this sounds too rigid, let me remind you this: a broken test means one thing – a broken use case. That should be approved by both a technical and a business owner. As long as these tests live along with the source code, they will remain in sync for many releases. That is the philosophy of Test-Driven Development.&lt;/p&gt;  &lt;h4&gt;Some Clarifications on Test-Driven Development&lt;/h4&gt;  &lt;p&gt;My observation is developers tend to avoid TDD due to a fear of “test first”. “Test first” is an &lt;em&gt;assumption&lt;/em&gt; that all tests must be written before product development may start. In reality, some tests will indeed be written before any product code is checked in, and the more tests are in place the better. However, it is unrealistic to expect to have the complete test suite ready before any product development may start. Most likely tests will show up shortly before their corresponding product features.&lt;/p&gt;  &lt;p&gt;The next controversy is who should write those check-in tests? My answer is: the same person who would otherwise write the specification. After all, these check-in tests specify the product. This doesn’t mean our industry has the tools to aid check-in test writers and reviewers to make a test suit look like a specification, but I hope will get there.&lt;/p&gt;  &lt;p&gt;Then what would today’s software testers do? Let me clarify the meaning of this question: if a product satisfy all its check-in tests, then it is in full conformance with its architect’s intent; is there anything further to be verified? Yes, there is – the overall usability of the product, i.e. what applications can be implemented on top of this product (if the product is a component), or what operations can be performed using this (if this is an end-user product?) That is what today’s software testers should do. And I would call those people “application developers”. The result of the their work should be made available to customers either as free (but supported) utilities, or as commercial products. &lt;/p&gt;  &lt;h4&gt;Conclusion&lt;/h4&gt;  &lt;p&gt;I have authored specifications, and I have experienced the difficulty with keeping a specification current. I can point to a large number of outdated specifications, and I believe anybody can too. I continue searching for an alternative to specification-driven development. Regarding Test-Driven Development, it seems very promising - I have not practiced it as part of a whole organization, but I have adopted it in my own micro world and it works for me. What I find missing is tools to make a check-in test suite look like a specification, or the other way around – to extract tests from a textual specification (with extra visual content), but I remain optimistic textual specifications will start yielding to check-in tests.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2337605720475601257-3717180631901397181?l=zlatko.michailov.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/HJGMmoeMJoZH7PPXoJrpyOiCKiU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HJGMmoeMJoZH7PPXoJrpyOiCKiU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/HJGMmoeMJoZH7PPXoJrpyOiCKiU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HJGMmoeMJoZH7PPXoJrpyOiCKiU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ZlatkoMichailov/~4/XlFeqkrmDk8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://zlatko.michailov.org/feeds/3717180631901397181/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2337605720475601257&amp;postID=3717180631901397181&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2337605720475601257/posts/default/3717180631901397181?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2337605720475601257/posts/default/3717180631901397181?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ZlatkoMichailov/~3/XlFeqkrmDk8/active-software-specification-aka-test.html" title="Active Software Specification (a.k.a. Test-Driven Development)" /><author><name>Zlatko Michailov</name><uri>http://www.blogger.com/profile/03852147331967264725</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://zlatko.michailov.org/2010/09/active-software-specification-aka-test.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkENSX46cCp7ImA9Wx5RFUU.&quot;"><id>tag:blogger.com,1999:blog-2337605720475601257.post-4194893233999510718</id><published>2010-08-20T23:47:00.001-07:00</published><updated>2010-08-23T09:24:58.018-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-23T09:24:58.018-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Software Development" /><category scheme="http://www.blogger.com/atom/ns#" term="Security" /><title>Don’t log me in. Let me do things only I can do, instead.</title><content type="html">&lt;p&gt;How do you feel when you log in to an online service – protected or vulnerable? If you feel protected, this article is for you. Read it, and then answer the question again. If you don’t feel logging is a correct way to interact with a system, join me in my quest to educate people to demand better security mechanisms from online service providers.&lt;/p&gt;&lt;h4&gt;How a system logs in a user&lt;/h4&gt;&lt;p&gt;The login process consist of two steps: 1) authentication, and 2) session fabrication. The outcome of the authentication step is a mere true/false bit reflecting whether the user is who they claim to be. The outcome of the session fabrication step is a session object representing the authenticated user. Let me highlight a few things here: the system can fabricate a session for any user account. (Otherwise there would be users who could not log in.) The system does not need the authentication bit in order to fabricate a session – technically speaking it is only a matter of courtesy - the system contains code and resources sufficient to impersonate any user with or without the authentication bit. &lt;/p&gt;&lt;p&gt;Several things are scary here. First and foremost, password storage - while some systems store only numeric hashes of the passwords, other systems may store the actual passwords. Passwords may be encrypted or may be stored as plain text. If they are encrypted, the system must have the key to retrieve any password (for the authentication step). You can count on the fact that there is a system administrator who can read all passwords.&lt;/p&gt;&lt;p&gt;The second scary thing is the existence of the session fabrication functionality. It is possible that the session fabrication functionality is accessible without going through authentication. Then a person with local access, e.g. a system administrator, can launch a program that fabricates sessions, i.e. impersonates users.&lt;/p&gt;&lt;p&gt;Third, the system performs all the actions. A user places a request for a particular action, but it is the system that carries it forward. That requires the system to be able to process all the data in store, i.e. the system can read anybody’s data regardless of who the session user is. This is scary, because there are users with permissions to see other users’ data, e.g. customer support, management, administrators, etc. They can read your data without doing any hacks.&lt;/p&gt;&lt;p&gt;So far I’ve only mentioned employees of service provider organizations. Consider the millions of professional crackers as well as enthusiasts throughout the world. Once an attacker gets into such a system, they have all of it.&lt;/p&gt;&lt;h4&gt;How to solve this&lt;/h4&gt;&lt;p&gt;Whatever route the online industry takes to solve this problem, it will take decades to become noticeable. That is mainly due to the fact that online service providers are not impacted as deeply as consumers are. And consumers are hard to unite. &lt;/p&gt;&lt;p&gt;Anyway, is there an alternative to login? I dare say yes. I have not worked out the details, but here is the general idea. It is based on public key authentication - instead of storing a password at the system, a user shares their public key when they create their user account. There are no sessions – each request is authenticated individually. The authentication consist of verifying that the subject request has been signed with the user’s private key. User data is stored as units each of which has entered the system encrypted with the user’s private key. If there is any unencrypted metadata associated with actual data blobs, the system may utilize it in any way it needs to.&lt;/p&gt;&lt;p&gt;Here is how an online email system will look like. A user sends a signed request to view their mailbox. (Notice there is no need of a login.) The system verifies the request is signed with the user’s key. It pulls the list of metadata items – subject, sender, receive date, message size, etc., encrypts it with user’s public key and sends it back to the user. The user’s web browser sees a properly tagged encrypted blob, pulls the user’s private key (the browser may ask the user for the key’s location), decrypts the blob and renders it nicely for the user. When the user clicks on a specific email message, another signed request is sent to the system. In this case the system sends back the already encrypted body of the requested email message. The system can provide additional value by verifying whether each message has been signed with a key of a trusted sender and treat all unsigned messages as spam.&lt;/p&gt;&lt;p&gt;The first step towards that futuristic system is for consumers to start valuing their own privacy – create a private-public key pair, give the public key to potential recipients and demand their public keys in return, start signing all outgoing messages, and start reminding senders of unsigned messages to start signing. Only when a momentum toward user privacy is built, online service providers will consider giving up on their ability to spy on people’s private data.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2337605720475601257-4194893233999510718?l=zlatko.michailov.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/GIxYTuTTyyB7ugxzMAlbl45pGN0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/GIxYTuTTyyB7ugxzMAlbl45pGN0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/GIxYTuTTyyB7ugxzMAlbl45pGN0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/GIxYTuTTyyB7ugxzMAlbl45pGN0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ZlatkoMichailov/~4/_rj-0GAu_3w" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://zlatko.michailov.org/feeds/4194893233999510718/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2337605720475601257&amp;postID=4194893233999510718&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2337605720475601257/posts/default/4194893233999510718?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2337605720475601257/posts/default/4194893233999510718?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ZlatkoMichailov/~3/_rj-0GAu_3w/dont-log-me-in-let-me-do-things-only-i.html" title="Don’t log me in. Let me do things only I can do, instead." /><author><name>Zlatko Michailov</name><uri>http://www.blogger.com/profile/03852147331967264725</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://zlatko.michailov.org/2010/08/dont-log-me-in-let-me-do-things-only-i.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0AEQHs6fSp7ImA9WxFXE04.&quot;"><id>tag:blogger.com,1999:blog-2337605720475601257.post-3392951079096922649</id><published>2010-05-15T22:01:00.001-07:00</published><updated>2010-05-19T22:01:41.515-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-19T22:01:41.515-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="My Bets" /><category scheme="http://www.blogger.com/atom/ns#" term="Software Development" /><category scheme="http://www.blogger.com/atom/ns#" term="Databases" /><title>My Bets on SQL</title><content type="html">&lt;p&gt;I intentionally separated my bets on SQL, the language, from &lt;a href="http://zlatko.michailov.org/2010/04/my-bets-on-relational-databases.html"&gt;my bets on relational databases&lt;/a&gt;. These two are well decoupled and that’s why I believe they will start evolving separately. Let me address the obvious first:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;SQL will become the COBOL of the 21st century. &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;When I started learning programming in the mid/late 80’s, I heard of COBOL, but I never got to know anyone who was programming in it, nor had I seen any COBOL code. So I, like the majority of my generation, thought COBOL was something ancient that no longer existed. My perception of COBOL turned around in the late 90’s during the Y2K bug madness when large corporations, banks in particular, were recruiting COBOL programmers offering insane wages. It appeared that critical products written in COBOL existed and their customers were not looking to retire them. Now that more than 10 years have passed since then, I still keep hearing about organizations using mainframe computers and running software products written in COBOL.&lt;/p&gt;  &lt;p&gt;Given that schools have not trained students how to program in COBOL for at least 20 years, I assume the wages offered to the “COBOL dinosaurs” who are still on the job have only gone up. SQL is slightly different – schools do teach it and developers are aware of its importance to customers, but for some unknown reason the majority of them choose to ignore it as a career path. One may argue that the number of qualified SQL developers is much larger than the number of qualified COBOL developers and therefore a shortage is unlikely. However, data acquisition and data processing are critical for every mid-size and large organization. As the volumes of data that organizations acquire and process grow, so does the need of innovation in this area – the software products that do that are constantly upgraded and refactored. My prediction is that the shortage of SQL developers 20 years from now will be bigger than the shortage of COBOL developers through this past decade.&amp;#160; &lt;/p&gt;  &lt;p&gt;My second bet is on the form in which SQL will exist. I see SQL as an early branch in the evolution of functional languages. It is probably the most widely used language where the programmer specifies the desired result and not how to get to it. SQL’s concept is very simple – sets and set operations. If SQL was to be designed today, it would have about 20 operators. &lt;a href="http://msdn.microsoft.com/en-us/library/bb394939.aspx"&gt;That’s what LINQ has&lt;/a&gt;. Unfortunately, when SQL was designed over 30 years ago, it was meant to be used by non-programmers. That’s why its operators are combined into a single, verbose, [SELECT] statement. Well, non-programmers never picked SQL. The uniqueness of its syntax made it difficult for programmers too. I admit that having actively programmed in SQL for the last 12 years, I still rarely get away without looking up the documentation. Lastly, each database vendor maintains its own dialect and it is even possible to mix standard and vendor-specific options in the same statement. Given the importance of data processing for our modern civilization, it is time to introduce a new generation of a data query language: &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;A true &lt;u&gt;functional&lt;/u&gt; query language will get adopted by database vendors which database engines will implement &lt;u&gt;natively&lt;/u&gt;. &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The first keyword here is “functional”. Functional programming and functional languages have evolved dramatically ever since SQL branched off. So a functional language could easily be adapted to sets and set operations. The excitement among .NET programmers about LINQ confirms that. The problem with LINQ is that it is a small band-aid to a big wound – it is a client-side translation of functional expressions to plain old SQL statements. The database servers still expect loosely-typed textual queries. I’m predicting a disruptive change in database connectivity where database servers will expect compiled expressions that represent functional queries.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2337605720475601257-3392951079096922649?l=zlatko.michailov.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/wCD8PSre_GoncVh46jd6U5ytOXI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wCD8PSre_GoncVh46jd6U5ytOXI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/wCD8PSre_GoncVh46jd6U5ytOXI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wCD8PSre_GoncVh46jd6U5ytOXI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ZlatkoMichailov/~4/a_uvQkxDoYc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://zlatko.michailov.org/feeds/3392951079096922649/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2337605720475601257&amp;postID=3392951079096922649&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2337605720475601257/posts/default/3392951079096922649?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2337605720475601257/posts/default/3392951079096922649?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ZlatkoMichailov/~3/a_uvQkxDoYc/my-bets-on-sql.html" title="My Bets on SQL" /><author><name>Zlatko Michailov</name><uri>http://www.blogger.com/profile/03852147331967264725</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://zlatko.michailov.org/2010/05/my-bets-on-sql.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkQARHg_fSp7ImA9WxFREEU.&quot;"><id>tag:blogger.com,1999:blog-2337605720475601257.post-1634550353142242797</id><published>2010-04-16T23:21:00.000-07:00</published><updated>2010-04-23T22:52:25.645-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-23T22:52:25.645-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="My Bets" /><category scheme="http://www.blogger.com/atom/ns#" term="Software Development" /><category scheme="http://www.blogger.com/atom/ns#" term="Databases" /><title>My Bets on Relational Databases</title><content type="html">&lt;p&gt;Relational database engines emerged because they could process &lt;em&gt;large and&lt;/em&gt; &lt;em&gt;complex&lt;/em&gt; data sets faster than &lt;a href="http://en.wikipedia.org/wiki/ISAM"&gt;ISAM&lt;/a&gt; engines. Notice the subtle qualification – &lt;em&gt;large and&lt;/em&gt; &lt;em&gt;complex&lt;/em&gt; data sets. Today relational engines scale down and compete well on small and flat data sets as well, but that wasn’t always the case. For years we, who wanted to use database servers in our work, had to prove to our management that we would deal with data sets large enough to justify the purchase of database software as well as appropriate hardware for it. Younger software developers probably don’t understand that since they can download &lt;a href="http://www.microsoft.com/express/Database/"&gt;SQL Server Express&lt;/a&gt; or &lt;a href="http://www.oracle.com/technology/products/database/sql_developer/index.html"&gt;Oracle SQL Developer&lt;/a&gt; for free, not to mention the open source database servers. Briefly, database servers have become commodity.&lt;/p&gt;&lt;p&gt;ISAM engines are extinct today, because the pioneers of the database industry foresaw the continuous growth of the data volumes that would need to be processed. While that growth has been steady in absolute measures, it has reached a tipping point relative to the capacity of a single [computing] box. For the first 25 years of their existence database engines were predominantly single-box, because data could fit on a single hard disk and a single CPU was sufficient to process it. About 10 years ago RAID controllers multiplied disk capacity several times and &lt;a href="http://en.wikipedia.org/wiki/Storage_area_network"&gt;SAN&lt;/a&gt;s became popular shortly after. At that same time multi-processor architectures increased the processing power of the machines. While that extended the life of single box architectures by another decade, it revealed that the end was approaching. &lt;/p&gt;&lt;p&gt;About 5 years ago a new pattern emerged – &lt;a href="http://en.wikipedia.org/wiki/Map_Reduce"&gt;Map Reduce&lt;/a&gt;. It gives up the ability to execute arbitrary relational queries in favor of the ability to distribute storage across a large number of machines as well as to process those large data sets in parallel. Both &lt;a href="http://labs.google.com/papers/mapreduce.html"&gt;proprietary&lt;/a&gt; and &lt;a href="http://hadoop.apache.org/"&gt;community&lt;/a&gt; implementations of the Map Reduce pattern have been growing and improving their feature sets. The first question that arises is: will relational databases continue to exist?&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Relational databases will not go away. They will continue serving their mission which is to execute complex relational queries against large data sets.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;The main factor in my bet is the demand for executing complex queries. Our civilization is complex and so it has complex needs. The Map Reduce pattern seems to represent the next generation of ISAM. We’ve already witnessed ISAM yielding to relational databases. In fact, both Google’s and Hadoop’s implementations of Map Reduce include relational engines – &lt;a href="http://labs.google.com/papers/bigtable.html"&gt;Big Table&lt;/a&gt; and &lt;a href="http://hadoop.apache.org/hbase/"&gt;HBase&lt;/a&gt; respectively. The next question is: what would relational database servers look like?&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Relational database servers will become relational database clusters with &lt;em&gt;hundreds&lt;/em&gt; of storage and relational nodes. Those relational clusters are likely to employ a non-uniform architecture with regard to storage, i.e. each storage node is likely to have a set of dedicated relational nodes that will execute queries against data form that storage node eventually joining it with data from other nodes.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Here are some clarifications. I assume that if a system can scale out to 200 nodes, it can scale out to 2,000 nodes. I cannot guess whether today’s relational database servers will evolve incrementally or whether they will be rewritten from scratch based on a scalable pattern like Map Reduce.&lt;/p&gt;&lt;p&gt;P.S. My bet on the SQL language will follow.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2337605720475601257-1634550353142242797?l=zlatko.michailov.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/zuINpqqFNyYwjN8-BiYZnnovD68/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zuINpqqFNyYwjN8-BiYZnnovD68/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/zuINpqqFNyYwjN8-BiYZnnovD68/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zuINpqqFNyYwjN8-BiYZnnovD68/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ZlatkoMichailov/~4/NMem90PmgFE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://zlatko.michailov.org/feeds/1634550353142242797/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2337605720475601257&amp;postID=1634550353142242797&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2337605720475601257/posts/default/1634550353142242797?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2337605720475601257/posts/default/1634550353142242797?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ZlatkoMichailov/~3/NMem90PmgFE/my-bets-on-relational-databases.html" title="My Bets on Relational Databases" /><author><name>Zlatko Michailov</name><uri>http://www.blogger.com/profile/03852147331967264725</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://zlatko.michailov.org/2010/04/my-bets-on-relational-databases.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0cERnc7eyp7ImA9WxFSE00.&quot;"><id>tag:blogger.com,1999:blog-2337605720475601257.post-2518082665933339711</id><published>2010-04-14T22:23:00.001-07:00</published><updated>2010-04-14T22:23:27.903-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-14T22:23:27.903-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Software Development" /><title>How to Share a Local Installation of Visual Studio 2010 Help</title><content type="html">&lt;p&gt;I don’t want to debate whether you should use a local Visual Studio 2010 Help installation or the &lt;a href="http://msdn.microsoft.com/en-us/library/ms123401(v=MSDN.10).aspx"&gt;MSDN web site&lt;/a&gt;. If you have already decided to use a local Help installation, you may want to access it from multiple machines, because it doesn’t make much sense to install the exact same content on every machine you use to develop software. &lt;/p&gt;  &lt;p&gt;Why is this use case problematic? With the launch of Visual Studio 2010 and .NET 4, the formats of the local Help and the MSDN have been unified. So the user experience is very similar whichever way one chooses to use help. The local Help installation consists of a static file store exposed through an http agent. The user interface is the default web browser. The problem is that the http agent rejects requests unless they reference the host as ‘127.0.0.1’ or ‘localhost’.&lt;/p&gt;  &lt;p&gt;The most obvious solution would be to install a web proxy on the machine where you have the local Help installation. That web proxy should simply redirect all the incoming traffic to the Help http agent. If IIS (Internet Information Server) had a built-in proxy module, I’d probably use it. Unfortunately, IIS only has a redirection module which is not the same and doesn’t solve the problem. So you have to install a standalone proxy. You could probably find a one-screen sample from &lt;a href="http://msdn.microsoft.com/en-us/library/ms735119.aspx"&gt;WCF&lt;/a&gt; (Windows Communication Foundation), but you’ll still have to customize it and maintain it. I wouldn’t sign up for that.&lt;/p&gt;  &lt;p&gt;What I recommend is a quick and easy way to point a local Help agent to a remote Help sore:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Find a drive letter that is available on all machines that will share the same Help installation. Let’s say that’s &lt;strong&gt;H:&lt;/strong&gt;. &lt;/li&gt;    &lt;li&gt;Share the root folder where you installed the Help content. &lt;/li&gt;    &lt;li&gt;Map the &lt;strong&gt;&lt;font color="#ff0000"&gt;H:&lt;/font&gt;&lt;/strong&gt; drive letter to that folder on all machines from where you want to access that Help installation.       &lt;ul&gt;       &lt;li&gt;If you want to access it from the machine where you installed the Help, you should map the &lt;strong&gt;H:&lt;/strong&gt; drive letter on that machine too. &lt;/li&gt;        &lt;li&gt;Make sure you check the &lt;strong&gt;Reconnect at Logon&lt;/strong&gt; checkbox. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Modify the &lt;strong&gt;manifest\queryManifest.3.xml&lt;/strong&gt; file of the local Help store as follows: &lt;/li&gt; &lt;/ul&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;lt;queryManifest version=&amp;quot;1.0&amp;quot;&amp;gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;catalogs&amp;gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;catalog productId=&amp;quot;VS&amp;quot; productVersion=&amp;quot;100&amp;quot; productLocale=&amp;quot;EN-US&amp;quot; productDisplayName=&amp;quot;&amp;quot; sourceType=&amp;quot;index&amp;quot;&amp;gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;catalogPath&amp;gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;H:&lt;/font&gt;&lt;/strong&gt;\catalogs\VS\100\EN-US&amp;lt;/catalogPath&amp;gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;contentPath&amp;gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;H:&lt;/font&gt;&lt;/strong&gt;\content&amp;lt;/contentPath&amp;gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;ul&gt;   &lt;li&gt;Set the &lt;strong&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Help\v1.0&lt;/strong&gt;\&lt;strong&gt;LocalStore&lt;/strong&gt; registry key to “&lt;strong&gt;&lt;font color="#ff0000"&gt;H:&lt;/font&gt;&lt;/strong&gt;” on each machine from where you want to access the Help installation. &lt;/li&gt; &lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2337605720475601257-2518082665933339711?l=zlatko.michailov.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Zu40mRXnbrNygTO6d9CAHU-2qMk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Zu40mRXnbrNygTO6d9CAHU-2qMk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Zu40mRXnbrNygTO6d9CAHU-2qMk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Zu40mRXnbrNygTO6d9CAHU-2qMk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ZlatkoMichailov/~4/K5j32Nm-1Hk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://zlatko.michailov.org/feeds/2518082665933339711/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2337605720475601257&amp;postID=2518082665933339711&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2337605720475601257/posts/default/2518082665933339711?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2337605720475601257/posts/default/2518082665933339711?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ZlatkoMichailov/~3/K5j32Nm-1Hk/how-to-share-local-installation-of.html" title="How to Share a Local Installation of Visual Studio 2010 Help" /><author><name>Zlatko Michailov</name><uri>http://www.blogger.com/profile/03852147331967264725</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://zlatko.michailov.org/2010/04/how-to-share-local-installation-of.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0UGQ38zeyp7ImA9WxFTGEk.&quot;"><id>tag:blogger.com,1999:blog-2337605720475601257.post-7407226623055103128</id><published>2010-04-07T21:24:00.001-07:00</published><updated>2010-04-09T13:33:42.183-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-09T13:33:42.183-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Cooking" /><title>My Low-Sodium No Sugar Flax Bread Recipe</title><content type="html">&lt;p&gt;I’ve been making bread at home for about 10 years. I began experimenting with my own recipes a couple of years ago. Now I can consistently produce a delicious bread. My objective has been to find the optimal balance between healthiness and taste. In particular, I’ve been trying to use minimum refined carbohydrates and salt. Below is my “optimum” recipe followed by some variations with reinforced and with relaxed constraints. &lt;/p&gt;  &lt;h4&gt;Ingredients&lt;/h4&gt;  &lt;ul&gt;   &lt;li&gt;2 1/4 cups water &lt;/li&gt;    &lt;li&gt;1/2 tsp salt &lt;/li&gt;    &lt;li&gt;1/2 cup ground flax seed &lt;/li&gt;    &lt;li&gt;2 cups all-purpose unbleached flour &lt;/li&gt;    &lt;li&gt;2 cups whole wheat flour &lt;/li&gt;    &lt;li&gt;1 1/2 tsp yeast &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I recommend using broad and shallow cups as opposed to narrow and deep ones. My experience shows that while water easily fills out a cup of any shape, that is not true for flour. Using narrow and deep cups may result in an overwatered dough that will have to be baked further. &lt;/p&gt;  &lt;p&gt;I use a bread machine for both knitting and baking. Feel free to bake it in the stove. The bread will come out better. &lt;/p&gt;  &lt;h4&gt;Steps&lt;/h4&gt;  &lt;ol&gt;   &lt;li&gt;If you keep the yeast in the refrigerator, put 1 1/2 tsp of yeast into a larger container, e.g. in a tbsp, and let it warm up to room temperature. &lt;/li&gt;    &lt;li&gt;Pour 2 1/4 cups of water in a larger bowl and microwave it for 1 minute. It should be just warm, not hot. Pour that warm water into the bread machine’s bucket. &lt;/li&gt;    &lt;li&gt;Add 1/2 tsp of salt. &lt;/li&gt;    &lt;li&gt;Add 1/2 cup of ground flax seed. &lt;/li&gt;    &lt;li&gt;Add 2 cups of all-purpose unbleached flour. &lt;/li&gt;    &lt;li&gt;Spread about a third of the yeast over the flour. Make sure you don’t drop it in the water - that would be a waste. &lt;/li&gt;    &lt;li&gt;Add 1 cup of whole wheat flour. &lt;/li&gt;    &lt;li&gt;Spread about half of the remaining yeast over the flour. Make sure you don’t drop it in the water. &lt;/li&gt;    &lt;li&gt;Add 1 cup of whole wheat flour. &lt;/li&gt;    &lt;li&gt;Spread the rest of the yeast over the flour. Make sure you don’t drop it in the water. &lt;/li&gt;    &lt;li&gt;Use the longest program on your bread machine. That’s usually “French Bread” and it takes about 4 hours. &lt;/li&gt; &lt;/ol&gt;  &lt;h4&gt;Deviations&lt;/h4&gt;  &lt;h5&gt;More Whole Wheat Flour&lt;/h5&gt;  &lt;p&gt;To make the bread healthier, replace 1 cup of white flour with 1 cup of whole wheat flour. The bread will not rise as much. It will also need a little bit (1/16 cup) more water. If you still like the bread, you can replace the remaining cup of white flour with whole wheat flour following the same rule. In that case you may also need to increase the salt to 1 tsp to make it rise a bit more and to improve its taste. &lt;/p&gt;  &lt;h5&gt;More White Flour&lt;/h5&gt;  &lt;p&gt;If you like puffy bread, you can replace 1 cup of whole wheat flour with white flour. When I did that, my bread got out of the bucket. So if you want to use white flour exclusively, you should bake it in the stove. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2337605720475601257-7407226623055103128?l=zlatko.michailov.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/LPdwsueTaYEKqx5ECB66DwZoIX4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LPdwsueTaYEKqx5ECB66DwZoIX4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/LPdwsueTaYEKqx5ECB66DwZoIX4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LPdwsueTaYEKqx5ECB66DwZoIX4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ZlatkoMichailov/~4/HdLpeKjjmPc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://zlatko.michailov.org/feeds/7407226623055103128/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2337605720475601257&amp;postID=7407226623055103128&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2337605720475601257/posts/default/7407226623055103128?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2337605720475601257/posts/default/7407226623055103128?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ZlatkoMichailov/~3/HdLpeKjjmPc/my-low-sodium-no-sugar-flax-bread.html" title="My Low-Sodium No Sugar Flax Bread Recipe" /><author><name>Zlatko Michailov</name><uri>http://www.blogger.com/profile/03852147331967264725</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://zlatko.michailov.org/2010/04/my-low-sodium-no-sugar-flax-bread.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0EER3g6eCp7ImA9WxFTGEk.&quot;"><id>tag:blogger.com,1999:blog-2337605720475601257.post-3500768260519342242</id><published>2010-02-18T23:02:00.000-08:00</published><updated>2010-04-09T13:40:06.610-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-09T13:40:06.610-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Linux" /><title>How to Make Your Linux Desktop Look Better than a Mac</title><content type="html">&lt;p&gt;The Linux distribution I use is &lt;a href="http://www.opensuse.org/en/"&gt;openSUSE&lt;/a&gt; 11.0 with a &lt;a href="http://kde.org/"&gt;KDE&lt;/a&gt; 3.x shell, but the procedure below should work on any modern Linux distribution with either KDE or GNOME shell. As a matter of fact, I was reading posts from the Ubuntu forums while I was trying to enable it on my openSUSE. I was also able to reproduce the procedure on KDE 4.x.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_Bg29dxKxFmY/S343P06BvvI/AAAAAAAAFO4/HErAaoLqv-U/s1600-h/EnableEffects-Shake%5B3%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="EnableEffects-Shake" border="0" alt="EnableEffects-Shake" src="http://lh6.ggpht.com/_Bg29dxKxFmY/S343Ut3ltbI/AAAAAAAAFO8/pw-EA84y0g0/EnableEffects-Shake_thumb%5B1%5D.png?imgmax=800" width="400" height="300" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h4&gt;Background: What Is What&lt;/h4&gt;  &lt;h5&gt;Compiz and Compiz Fusion&lt;/h5&gt; &lt;p&gt;&lt;a href="http://www.compiz.org/"&gt;Compiz&lt;/a&gt; is a low-level platform that enables the desktop effects we’ll be leveraging. Compiz Fusion is an upgrade on top of Compiz that implements a large variety of effects. While Compiz Fusion has merged into Compiz, the tools that manage them are still separate. I encourage you to read the &lt;a href="http://wiki.compiz.org/"&gt;Compiz wiki&lt;/a&gt; if you want to get the best out of your desktop.&lt;/p&gt;  &lt;h5&gt;Emerald&lt;/h5&gt; &lt;p&gt;&lt;a href="http://wiki.compiz.org/Decorators/Emerald"&gt;Emerald&lt;/a&gt; is a window decorator that works on top of Compiz Fusion. The Compiz wiki claims it is no longer supported, and Compiz Fusion itself should be used instead, but Emerald seems to be working better then the default Compiz’ default window decorator. Besides, the Mac themes I’ve found require Emerald.&lt;/p&gt;  &lt;h5&gt;KDE/GNOME&lt;/h5&gt; &lt;p&gt;For everything else – dialog box controls, scroll bars, icons, etc., you still need your existing GUI shell to do the ground work.&lt;/p&gt;  &lt;h4&gt;Step 1: Enable Compiz Effects&lt;/h4&gt; &lt;p&gt;Use the &lt;a href="http://wiki.compiz.org/Distributions"&gt;Distribution&lt;/a&gt; page on the Compiz wiki as a roadmap. It references the corresponding pages on the most popular distributions’ web sites that explain how to enable Compiz effects on each of those distributions. Following is my digestion of those procedures. Make sure you understand each step and perform it successfully.&lt;/p&gt;  &lt;h5&gt;Update your video driver&lt;/h5&gt; &lt;p&gt;Before you start messing with graphics, make sure you have the latest driver for you graphics card. For openSUSE, there are one-click installs for both &lt;a href="http://en.opensuse.org/NVIDIA_drivers"&gt;NVIDIA drivers&lt;/a&gt; and &lt;a href="http://en.opensuse.org/ATI_drivers"&gt;ATI drivers&lt;/a&gt;.&lt;/p&gt;  &lt;h5&gt;Install Compiz packages&lt;/h5&gt; &lt;p&gt;Go to your software management tool. On openSUSE that is YaST. You’ll find it at: &lt;em&gt;Start menu &amp;gt; Utilities &amp;gt; System &amp;gt; Administrator Settings&lt;/em&gt;. Within YaST click on &lt;em&gt;Software &amp;gt; Software Management&lt;/em&gt;. Search for ‘&lt;em&gt;compiz&lt;/em&gt;’. Read the descriptions and add all the packages that seem to be runtime our themes. Skip the ‘…&lt;em&gt;-devel&lt;/em&gt;’ packages.&lt;/p&gt;  &lt;h5&gt;Enable Compiz effects&lt;/h5&gt; &lt;p&gt;On openSUSE you’ll find this tool at: &lt;em&gt;Start menu &amp;gt; Utilities &amp;gt;&amp;#160; Desktop &amp;gt; Desktop Effects&lt;/em&gt;. On other distributions, search the Start menu for ‘&lt;em&gt;Desktop Effects&lt;/em&gt;’. You’ll see a dialog box where the only control you can change is an &lt;em&gt;Enable desktop effects&lt;/em&gt; checkbox. Check it. Now you can choose a pre-built configuration from the drop-down list. I’ve chosen &lt;em&gt;Hollywood got nothing&lt;/em&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_Bg29dxKxFmY/S343VRFAEYI/AAAAAAAAFPA/fPZI3KL_M9U/s1600-h/EnableEffects%5B8%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="EnableEffects" border="0" alt="EnableEffects" src="http://lh6.ggpht.com/_Bg29dxKxFmY/S343WSlqO8I/AAAAAAAAFPE/2cgWOQG3o_8/EnableEffects_thumb%5B6%5D.png?imgmax=800" width="259" height="320" /&gt;&lt;/a&gt;&lt;/p&gt;   &lt;p&gt;You will see some effects, but your desktop may become a little messy - window control buttons may not get drawn, and if you logout, desktop effects will get disabled again. So don’t stop here. Keep going.&lt;/p&gt;  &lt;h5&gt;Choose Compiz as a window manager&lt;/h5&gt; &lt;p&gt;On KDE 3.x, open &lt;em&gt;Personal Settings&lt;/em&gt;. (Search for it in the Start menu.) Navigate to &lt;em&gt;KDE Components &amp;gt; Session Manager&lt;/em&gt;. Select &lt;em&gt;Compiz&lt;/em&gt; from the &lt;em&gt;Window Manager&lt;/em&gt; drop-down list.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_Bg29dxKxFmY/S343X9skJVI/AAAAAAAAFPI/sBAv2iPCsY8/s1600-h/WindowManager%5B4%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="WindowManager" border="0" alt="WindowManager" src="http://lh6.ggpht.com/_Bg29dxKxFmY/S343Z5wA5cI/AAAAAAAAFPM/xzFdEhjicTg/WindowManager_thumb%5B2%5D.png?imgmax=800" width="400" height="276" /&gt;&lt;/a&gt; &lt;p&gt;  &lt;u&gt;Log out and log back in&lt;/u&gt;.  &lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: If your task bar disappears, don’t panic. The task bar exists but for some reason it doesn’t get drawn. What fixes it is this procedure: right-click where the task bar is supposed to be and select &lt;em&gt;Configure Panel&lt;/em&gt; from the context menu.Change task bar’s location on the screen and click Apply. Then put it back where you want it to be and click Apply again. &lt;u&gt;Log out and log back in&lt;/u&gt;. If this didn’t work the first time, try it again without putting the task bar back to its place. You’ll do that separately.&lt;/p&gt;  &lt;h5&gt;Enable and configure Compiz Fusion effects&lt;/h5&gt; &lt;p&gt;On openSUSE you’ll find this tool at: &lt;em&gt;Start menu &amp;gt; Utilities &amp;gt;&amp;#160; Desktop &amp;gt; CompizConfig Settings Manager&lt;/em&gt;. On other distributions, search the Start menu for ‘CompizConfig Settings Manager’. You will see many icons with checkboxes next to them. You enable an effect through the checkbox and configure it through clicking on the icon. For additional help, use the &lt;a href="http://wiki.compiz.org/CCSM"&gt;CCSM&lt;/a&gt; page on the Compiz wiki.&lt;/p&gt;  &lt;p&gt;The important step here is to navigate to &lt;em&gt;Preferences&lt;/em&gt; and to set &lt;em&gt;Backend and Integration&lt;/em&gt; to &lt;em&gt;Flat-File&lt;/em&gt;. Logout and log back in after setting this.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Some Compiz Fusion effects may conflict with base Compiz effects. In those cases a message pops up to warn you. I haven’t tried to override base Compiz effects with Compiz Fusion effects. Feel free to try it at your own risk.&lt;/p&gt;  &lt;h4&gt;Step 2: Make Your Desktop Look Like a Mac&lt;/h4&gt; &lt;p&gt;At this point you should have a desktop with Compiz effects and the windows should be decorated according to your existing KDE/GNOME theme. (Actually, my windows weren’t properly decorated.)&lt;/p&gt;  &lt;h5&gt;Install Emerald&lt;/h5&gt; &lt;p&gt;Just like you installed Compiz packages, search your software management tool for ‘&lt;em&gt;emerald&lt;/em&gt;’ and install anything that seems to be either runtime or themes. Skip ‘&lt;em&gt;…-develop’&lt;/em&gt; packages.&lt;/p&gt;  &lt;h5&gt;Enable Emerald&lt;/h5&gt; &lt;p&gt;Open &lt;em&gt;CompizConfig Settings Manager&lt;/em&gt;. Click on the &lt;em&gt;Window Decoration&lt;/em&gt; plug-in. In the &lt;em&gt;Command&lt;/em&gt; box, enter ‘&lt;em&gt;emerald --replace&lt;/em&gt;’. Logout and log back in. Now you should have a default Emerald theme enabled and all windows should be properly decorated.&lt;/p&gt;  &lt;h5&gt;Download Emerald themes&lt;/h5&gt; &lt;p&gt;Go to &lt;a href="http://kdelook.org/"&gt;http://kdelook.org/&lt;/a&gt; and search for ‘&lt;em&gt;OS X&lt;/em&gt;’. Alternatively, you may search &lt;a href="http://gnome-look.org/"&gt;http://gnome-look.org/&lt;/a&gt; or &lt;a href="http://compiz-themes.org/"&gt;http://compiz-themes.org/&lt;/a&gt;. (I believe those three sites share the same repository.) I have downloaded these two themes:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.kde-look.org/content/show.php/Mac+OS+X+Ubuntu+Air?content=101050"&gt;Mac OS X Ubuntu Air&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.kde-look.org/content/show.php/Belgrade+OS+X+theme?content=99967"&gt;Belgrade OS X theme 2.4.3&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Feel fee to download and try more themes. Emerald theme files are gzip archives with a &lt;em&gt;.emerald&lt;/em&gt; extension.&lt;/p&gt;  &lt;h5&gt;Manage Emerald themes&lt;/h5&gt; &lt;p&gt;On openSUSE you’ll find this tool at: &lt;em&gt;Start menu &amp;gt; Utilities &amp;gt;&amp;#160; Desktop &amp;gt; Emerald Theme Manager&lt;/em&gt;. On other distributions, search the Start menu for ‘&lt;em&gt;Emerald Theme Manager&lt;/em&gt;’. Click on &lt;em&gt;Import&lt;/em&gt; and select a downloaded theme file. The new theme should show up on the list immediately. &lt;/p&gt;  &lt;p&gt;To select a theme, simply click on it on the list and it will take effect immediately. I’ve chosen &lt;a href="http://www.kde-look.org/content/show.php/Mac+OS+X+Ubuntu+Air?content=101050"&gt;Mac OS X Ubuntu Air&lt;/a&gt;. When you are done, click on &lt;em&gt;Quit&lt;/em&gt;.&lt;/p&gt;  &lt;h4&gt;Conclusion&lt;/h4&gt; &lt;p&gt;There are still components of your desktop that Emerald doesn’t touch – buttons, icons, scroll bars, splash screen, etc. Keep searching &lt;a href="http://kdelook.org/"&gt;http://kdelook.org/&lt;/a&gt;, &lt;a href="http://gnome-look.org/"&gt;http://gnome-look.org/&lt;/a&gt;, and &lt;a href="http://compiz-themes.org/"&gt;http://compiz-themes.org/&lt;/a&gt; for KDE/GNOME/Compiz themes that make those components look better.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2337605720475601257-3500768260519342242?l=zlatko.michailov.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Ih4AxVm4Na8oX-DLaKSMgsseD68/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Ih4AxVm4Na8oX-DLaKSMgsseD68/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Ih4AxVm4Na8oX-DLaKSMgsseD68/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Ih4AxVm4Na8oX-DLaKSMgsseD68/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ZlatkoMichailov/~4/4Ye3Z-lz2Ns" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://zlatko.michailov.org/feeds/3500768260519342242/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2337605720475601257&amp;postID=3500768260519342242&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2337605720475601257/posts/default/3500768260519342242?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2337605720475601257/posts/default/3500768260519342242?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ZlatkoMichailov/~3/4Ye3Z-lz2Ns/how-to-make-your-linux-desktop-look.html" title="How to Make Your Linux Desktop Look Better than a Mac" /><author><name>Zlatko Michailov</name><uri>http://www.blogger.com/profile/03852147331967264725</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_Bg29dxKxFmY/S343Ut3ltbI/AAAAAAAAFO8/pw-EA84y0g0/s72-c/EnableEffects-Shake_thumb%5B1%5D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://zlatko.michailov.org/2010/02/how-to-make-your-linux-desktop-look.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUAFRnw_eip7ImA9WxFTGEg.&quot;"><id>tag:blogger.com,1999:blog-2337605720475601257.post-6953248339088856492</id><published>2010-02-16T21:07:00.000-08:00</published><updated>2010-04-09T15:55:17.242-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-09T15:55:17.242-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Quote Me" /><title>Quote Me: You Can Only Become So Good</title><content type="html">&lt;blockquote&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160; You can only become as good as your mentors have taught you&lt;/em&gt;.&lt;/blockquote&gt;  &lt;p&gt;I don’t deny that genetics play a role in how much and how fast a person can learn. But in order for a person to learn, they need some &lt;em&gt;outside&lt;/em&gt; material to learn from. And it is the quality of that outside material that develops the brain. I emphasize on the word &lt;em&gt;outside&lt;/em&gt;, because one can hardly challenge himself without a spark from the outside. That outside environment is primarily the people you learn from as well as the problems you are challenged with. &lt;/p&gt;  &lt;p&gt;So keep asking yourself: Are you learning enough? Are you being mentored by good people? Can you improve the quality of your learning environment? &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2337605720475601257-6953248339088856492?l=zlatko.michailov.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/w-sBb6X4_MeCpZGCytueysI-T9g/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/w-sBb6X4_MeCpZGCytueysI-T9g/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/w-sBb6X4_MeCpZGCytueysI-T9g/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/w-sBb6X4_MeCpZGCytueysI-T9g/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ZlatkoMichailov/~4/E41CJZard-8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://zlatko.michailov.org/feeds/6953248339088856492/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2337605720475601257&amp;postID=6953248339088856492&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2337605720475601257/posts/default/6953248339088856492?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2337605720475601257/posts/default/6953248339088856492?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ZlatkoMichailov/~3/E41CJZard-8/quote-me-you-can-only-become-so-good.html" title="Quote Me: You Can Only Become So Good" /><author><name>Zlatko Michailov</name><uri>http://www.blogger.com/profile/03852147331967264725</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://zlatko.michailov.org/2010/02/quote-me-you-can-only-become-so-good.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUUCQnw7fip7ImA9WxBVEkQ.&quot;"><id>tag:blogger.com,1999:blog-2337605720475601257.post-5135046601350704329</id><published>2010-02-15T21:12:00.001-08:00</published><updated>2010-02-15T21:14:23.206-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-15T21:14:23.206-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="About Me" /><title>About Me @ Microsoft (part II)</title><content type="html">&lt;p&gt;Since November 2009 I’ve become a software development engineer (again) on the Parallel Computing Platform. I work on the .NET side of the platform, a.k.a. PFX. Our &lt;a href="http://blogs.msdn.com/pfxteam/"&gt;team blog&lt;/a&gt; is the most extensive source of information on PFX. I recently contributed a post there - &lt;a href="http://blogs.msdn.com/pfxteam/archive/2010/02/09/9960735.aspx"&gt;Maintaining a Consistent Application State with TPL&lt;/a&gt;. If you are interested in the subject, please take a look and let me know what you think.&lt;/p&gt;  &lt;p&gt;If you want to get started with Parallel Computing or you want to find a structured reference of the current state of PFX, please visit the &lt;a href="http://msdn.microsoft.com/en-us/library/dd460693(VS.100).aspx"&gt;Parallel Programming in the .NET Framework&lt;/a&gt; page on MSDN.&lt;/p&gt;  &lt;p&gt;If you have questions on PFX, please post them on the &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/parallelextensions/threads"&gt;PFX forum&lt;/a&gt; and we’ll be happy to answer them.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2337605720475601257-5135046601350704329?l=zlatko.michailov.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/iLE7IKHGxLcAVf1KTM1KKgFLEmI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/iLE7IKHGxLcAVf1KTM1KKgFLEmI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/iLE7IKHGxLcAVf1KTM1KKgFLEmI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/iLE7IKHGxLcAVf1KTM1KKgFLEmI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ZlatkoMichailov/~4/fqeNEsJdKGk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://zlatko.michailov.org/feeds/5135046601350704329/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2337605720475601257&amp;postID=5135046601350704329&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2337605720475601257/posts/default/5135046601350704329?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2337605720475601257/posts/default/5135046601350704329?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ZlatkoMichailov/~3/fqeNEsJdKGk/about-me-microsoft-part-ii.html" title="About Me @ Microsoft (part II)" /><author><name>Zlatko Michailov</name><uri>http://www.blogger.com/profile/03852147331967264725</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://zlatko.michailov.org/2010/02/about-me-microsoft-part-ii.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0QCSHoycCp7ImA9WxFSE00.&quot;"><id>tag:blogger.com,1999:blog-2337605720475601257.post-8436207142791104219</id><published>2009-11-09T22:04:00.001-08:00</published><updated>2010-04-14T22:29:29.498-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-14T22:29:29.498-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Software Development" /><category scheme="http://www.blogger.com/atom/ns#" term="Quote Me" /><title>Quote Me: Plan to Fail</title><content type="html">&lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;When you launch the development of a new product release, plan to fail because you &lt;u&gt;will&lt;/u&gt; fail, and plan to recover&lt;/em&gt;.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Nothing is impossible. Thus envisioning and designing the right feature set the right way from the first attempt is not impossible. But chances are your first shot will be off target. It will take you several iterations to get close. So if you don’t plan to fail and adjust your course during development, you’ll fail during production where you’ll be leaving an unwanted trail of legacy behind.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2337605720475601257-8436207142791104219?l=zlatko.michailov.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/9GsXZUCa3pyB8ZZMaqs3GqdBNGM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9GsXZUCa3pyB8ZZMaqs3GqdBNGM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/9GsXZUCa3pyB8ZZMaqs3GqdBNGM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9GsXZUCa3pyB8ZZMaqs3GqdBNGM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ZlatkoMichailov/~4/DD0a2kwwXP4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://zlatko.michailov.org/feeds/8436207142791104219/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2337605720475601257&amp;postID=8436207142791104219&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2337605720475601257/posts/default/8436207142791104219?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2337605720475601257/posts/default/8436207142791104219?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ZlatkoMichailov/~3/DD0a2kwwXP4/quote-me-plan-to-fail.html" title="Quote Me: Plan to Fail" /><author><name>Zlatko Michailov</name><uri>http://www.blogger.com/profile/03852147331967264725</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://zlatko.michailov.org/2009/11/quote-me-plan-to-fail.html</feedburner:origLink></entry></feed>

