<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6471778</id><updated>2011-12-31T18:05:40.438+02:00</updated><category term='vs.net'/><category term='.net'/><category term='ASP.NET'/><title type='text'>Ivan Mitev In The Software Trenches</title><subtitle type='html'>Technology weblog on .NET development and other things that make the world go round</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default?start-index=101&amp;max-results=100'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>263</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6471778.post-3761024682921257597</id><published>2011-12-31T18:05:00.000+02:00</published><updated>2011-12-31T18:05:40.445+02:00</updated><title type='text'>Summary of the year 2011</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;span style="background-color: white; color: #555544; font-family: tahoma, 'Bitstream Vera Sans', 'Trebuchet MS', 'Lucida Grande', lucida, helvetica, sans-serif; font-size: 12px; line-height: 16px;"&gt;I am continuing my series of annual retrospectives from &lt;a href="http://immitev.blogspot.com/2011/01/summary-of-year-2010.html"&gt;2010&lt;/a&gt;,&amp;nbsp;&lt;/span&gt;&lt;a href="http://immitev.blogspot.com/2008/12/summary-of-year-2008.html" style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; color: #669922; font-family: tahoma, 'Bitstream Vera Sans', 'Trebuchet MS', 'Lucida Grande', lucida, helvetica, sans-serif; font-size: 12px; font-weight: bold; line-height: 16px; text-decoration: none;"&gt;2008&lt;/a&gt;&lt;span style="background-color: white; color: #555544; font-family: tahoma, 'Bitstream Vera Sans', 'Trebuchet MS', 'Lucida Grande', lucida, helvetica, sans-serif; font-size: 12px; line-height: 16px;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;a href="http://immitev.blogspot.com/2008/01/summary-of-year-2007.html" style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; color: #669922; font-family: tahoma, 'Bitstream Vera Sans', 'Trebuchet MS', 'Lucida Grande', lucida, helvetica, sans-serif; font-size: 12px; font-weight: bold; line-height: 16px; text-decoration: none;"&gt;2007&lt;/a&gt;&lt;span style="background-color: white; color: #555544; font-family: tahoma, 'Bitstream Vera Sans', 'Trebuchet MS', 'Lucida Grande', lucida, helvetica, sans-serif; font-size: 12px; line-height: 16px;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;a href="http://immitev.blogspot.com/2007/01/summary-of-year-2006.html" style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; color: #669922; font-family: tahoma, 'Bitstream Vera Sans', 'Trebuchet MS', 'Lucida Grande', lucida, helvetica, sans-serif; font-size: 12px; font-weight: bold; line-height: 16px; text-decoration: none;"&gt;2006&lt;/a&gt;&lt;span style="background-color: white; color: #555544; font-family: tahoma, 'Bitstream Vera Sans', 'Trebuchet MS', 'Lucida Grande', lucida, helvetica, sans-serif; font-size: 12px; line-height: 16px;"&gt;&amp;nbsp;and&amp;nbsp;&lt;/span&gt;&lt;a href="http://immitev.blogspot.com/2006/01/summary-of-year-2005.html" style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; color: #669922; font-family: tahoma, 'Bitstream Vera Sans', 'Trebuchet MS', 'Lucida Grande', lucida, helvetica, sans-serif; font-size: 12px; font-weight: bold; line-height: 16px; text-decoration: none;"&gt;2005&lt;/a&gt;&lt;span style="background-color: white; color: #555544; font-family: tahoma, 'Bitstream Vera Sans', 'Trebuchet MS', 'Lucida Grande', lucida, helvetica, sans-serif; font-size: 12px; line-height: 16px;"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: #555544; font-family: tahoma, 'Bitstream Vera Sans', 'Trebuchet MS', 'Lucida Grande', lucida, helvetica, sans-serif; font-size: 12px; line-height: 16px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #555544; font-family: tahoma, 'Bitstream Vera Sans', 'Trebuchet MS', 'Lucida Grande', lucida, helvetica, sans-serif;"&gt;&lt;span style="font-size: 12px; line-height: 16px;"&gt;There just a couple of things that probably deserve a brief mention about the year 2011:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;span style="color: #555544; font-family: tahoma, 'Bitstream Vera Sans', 'Trebuchet MS', 'Lucida Grande', lucida, helvetica, sans-serif; font-size: 12px; line-height: 16px;"&gt;I've been given recently a new role in the company I work for - to lead the development of one of our products. It's an interesting challenge. I am a bit reluctant to get overly specialized, since till now&amp;nbsp;I've been contributed&amp;nbsp;in a much broader scope, but there are obviously benefits of thinking and working in a more narrow context.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #555544; font-family: tahoma, 'Bitstream Vera Sans', 'Trebuchet MS', 'Lucida Grande', lucida, helvetica, sans-serif; font-size: 12px; line-height: 16px;"&gt;In the last month or so, I've been active in improving the company development process - mainly by assessing our current tools and practices and searching/evaluating others. It seems that we will soon transition to a better version control system (&lt;a href="http://www.plasticscm.com/"&gt;PlasticSCM&lt;/a&gt;). Also we might adopt various other tools to improve our productivity in different parts of the development process.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #555544; font-family: tahoma, 'Bitstream Vera Sans', 'Trebuchet MS', 'Lucida Grande', lucida, helvetica, sans-serif; font-size: 12px; line-height: 16px;"&gt;As the previous year, I continued to participate in our developers hiring process (helping with the job ads text, interviewing and assessing candidates). I think I am getting very good in guessing what are developer's abilities, pros and cons, just looking at a CV (though the candidate's code gives a much more precise picture).&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #555544; font-family: tahoma, 'Bitstream Vera Sans', 'Trebuchet MS', 'Lucida Grande', lucida, helvetica, sans-serif; font-size: 12px; line-height: 16px;"&gt;Mid-year I've returned back for a couple of months to my old duties as a Support manager, but this was temporary. The next year, I don't expect to do much of this type of work.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #555544; font-family: tahoma, 'Bitstream Vera Sans', 'Trebuchet MS', 'Lucida Grande', lucida, helvetica, sans-serif; font-size: 12px; line-height: 16px;"&gt;Technology-wise, there were not that many novelties worth mentioning, besides me getting to know MS SQL Server much better. I participated in the endeavor of adding support for MSSQL for our applications (we supported only Oracle as a backend until this year). Learned a lot from this - the differences in the default locking models of Oracle/MSSQL were interesting. Although new technologies are now rarely introduced in our development, I am trying to keep up-to-date with everything interesting in our field. Besides the .NET related stuff, there are so many interesting things to follow, e.g. NoSQL. And of course, there's much more than the programming frameworks, libraries and tools, so a lot more to learn...&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span style="color: #555544; font-family: tahoma, 'Bitstream Vera Sans', 'Trebuchet MS', 'Lucida Grande', lucida, helvetica, sans-serif;"&gt;&lt;span style="font-size: 12px; line-height: 16px;"&gt;So this pretty much sums it all. Hope that the year 2012 would offer a lot of excitement and positive emotions.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-3761024682921257597?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/3761024682921257597/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=3761024682921257597&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/3761024682921257597'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/3761024682921257597'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2011/12/summary-of-year-2011.html' title='Summary of the year 2011'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-5464095875652964888</id><published>2011-02-12T19:59:00.001+02:00</published><updated>2011-02-12T20:01:22.925+02:00</updated><title type='text'>On hiring entry-level/junior devs</title><content type='html'>&lt;p&gt;I was recently asked about my opinion on adding some young &amp;amp; not-experienced people to our dev team, and after I emailed my analysis, I decided the topic is worthy of a blog post.&lt;/p&gt;  &lt;p&gt;I’ll first start with the &lt;b&gt;possible&lt;/b&gt; &lt;b&gt;disadvantages &lt;/b&gt;of hiring junior devs:&lt;/p&gt;  &lt;p&gt;· Might be very ineffective compared to more experienced devs, due to lack of necessary knowledge, skills &amp;amp; habits. Of course, attitudes &amp;amp; motivation also affect productivity. Btw, productivity b/n developers might vary &lt;a href="https://mx.validata.co.uk/redir.aspx?C=07e009dca93e4155b01117fdcf57251c&amp;amp;URL=http%3a%2f%2fforums.construx.com%2fblogs%2fstevemcc%2farchive%2f2011%2f01%2f09%2forigins-of-10x-how-valid-is-the-underlying-research.aspx"&gt;significantly&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;· Might require significant time (usually the time of senior devs) to train them &amp;amp; supervise them continuously (especially in the first several months)&lt;/p&gt;  &lt;p&gt;· More people equals increased time for communication &amp;amp; coordination. &lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;NOTE&lt;/b&gt;: When I speak of skills, I guess I should be more specific. Here are a few categories of &lt;strong&gt;skills&lt;/strong&gt; that would determine how effective a developer would be at his work:&lt;/p&gt;  &lt;p&gt;· &lt;b&gt;Programming skills&lt;/b&gt; – ability to write/understand/debug/modify code efficiently (those include skills working with tools like the IDE, the source control + basic skills like touch-typing) &lt;/p&gt;  &lt;p&gt;· &lt;b&gt;Problems solving and design skills&lt;/b&gt; – ability to analyze (and redefine) problems, to come up with several solutions and evaluate what’s the best, etc.&lt;/p&gt;  &lt;p&gt;· &lt;b&gt;Learning skills&lt;/b&gt; – how fast can he learn new things and adopt beneficial practices&lt;/p&gt;  &lt;p&gt;· &lt;b&gt;Communication skills&lt;/b&gt; – how well the developer expresses his ideas (via code/documentation/e-mails/verbal discussions etc) + how well does he cooperate with others from the team + how willing is he to ask for help when stuck&lt;/p&gt;  &lt;p&gt;· &lt;b&gt;“Get into the others shoes” skills &lt;/b&gt;– how well he can understand what the client needs + how well he understands how his work is affecting the work of the team.&lt;/p&gt;  &lt;p&gt;· &lt;b&gt;Leadership skills &lt;/b&gt;– those are probably not software-specific.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Though most young people have probably not had the time and the opportunity to develop those skills, there are still probably several &lt;b&gt;advantages&lt;/b&gt; in hiring them:&lt;/p&gt;  &lt;p&gt;· Easier to find on the market (and cheaper)&lt;/p&gt;  &lt;p&gt;· Motivated and energetic (hopefully)&lt;/p&gt;  &lt;p&gt;· Free of bad habits – developers with experience are more or less shaped by their experience, and might have accumulated many bad habits that they’ll need to unlearn. Newbies can be molded into good programmers, if given appropriate tasks, attention, training &amp;amp; feedback.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;I have a feeling that the best mix is with predominantly senior devs and ~20% junior devs, but I’m sure that other combinations could work fine too.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-5464095875652964888?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/5464095875652964888/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=5464095875652964888&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/5464095875652964888'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/5464095875652964888'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2011/02/on-hiring-entry-leveljunior-devs.html' title='On hiring entry-level/junior devs'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-315422785397451229</id><published>2011-01-02T22:01:00.001+02:00</published><updated>2011-01-02T22:01:28.770+02:00</updated><title type='text'>Summary of the year 2010</title><content type='html'>&lt;p&gt;I somehow missed to write anything about 2009, but I am continuing my series from &lt;a href="http://immitev.blogspot.com/2008/12/summary-of-year-2008.html"&gt;2008&lt;/a&gt;, &lt;a href="http://immitev.blogspot.com/2008/01/summary-of-year-2007.html"&gt;2007&lt;/a&gt;, &lt;a href="http://immitev.blogspot.com/2007/01/summary-of-year-2006.html"&gt;2006&lt;/a&gt; and &lt;a href="http://immitev.blogspot.com/2006/01/summary-of-year-2005.html"&gt;2005&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;The most noteworthy change for me this year was my new role as &lt;strong&gt;support manager&lt;/strong&gt; that I undertook for the last nine months of 2010. Initially the plan was just to substitute for a couple of months the person who recently got in charge of the customer support activities, but who had to go on-site to an important project. But I ended up doing this kind of a job for such an extended period of time. I was all the time trying to keep up with my work as developer as much as I can, though there were days when I couldn’t write code even for a minute.&lt;/p&gt;  &lt;p&gt;It was a very different type of work. Definitely more stressful, especially in the begining. Unlike my dev work, it required often switching between tasks, quickly prioritizing where to put effort and where not. There were times I worked overtime by answering support tickets from home (before going to work or in non-working days), but the worse part is that often my mind continued to go back to the problems at work, even when I was trying to get rid of such thoughts.&lt;/p&gt;  &lt;p&gt;The nature of this type of work was pretty demanding, as well:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;It required deep and broad knowledge of many aspects of our products (I guess only a developer can have both).&lt;/li&gt;    &lt;li&gt;It required knowing which of my colleagues to ask for assistance for particular customer issues (I admit I initially hated to delegate work that I though I would finish more quickly than anybody, but soon I realized that this is not always as effective as it seems). &lt;/li&gt;    &lt;li&gt;It required an ability to quickly find out what is the customer really wanting and help him get it (either by directly solving his issue or thinking of clever workaround to get the job done in another way). &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Often it felt very rewarding to help people solve their problems, and as an additional benefit my support work gave me a better understanding of how our products were getting used. This lead to better clarity what matters and what not, so I could concentrate on the truly important things.&lt;/p&gt;  &lt;p&gt;Being the person responsible for the support, I strived to improve the process in several ways: by customizing the help desk software that we use, by educating our staff and our customers how to use it effectively, by trying to setup proper expectations and attitudes. There were numerous challenges and even several mini-crisis during those nine months. They definitely gave me a better understanding of the bigger picture. They also shaped my vision how things should be done in order to things to go smoothly. It was a valuable experience, but I am happy that I will be handing it back to my colleague, since I think that I would be more valuable in other areas of the product development. My passion for being a developer is stiill strong, but additionally I think I’m a person whose understanding of the product, the technlogies and the customer needs, could be used for architecting proper solutions for the areas that will make a difference for the company and its customers.&lt;/p&gt;  &lt;p&gt;Besides this role of the support manager, there were other experiences that were new to me:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Going on a two-week on-site project&lt;/strong&gt; – I went to Poland for an on-site work at our client there. I am not used to such type of work, but I think it went very well. Besides answering questions and troubleshooting issues, I also coded a few simple tools that help them solved some problems. The work was diverse and interesting, and it kept me busy all day. It was pretty exhausting too, so I am grateful that my lovely fiancé (now my wife) came for the second week to make my stay in Poland much more pleasant. It really helped me get my work-leasure balance back.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Interviewing candidates for a developer position&lt;/strong&gt; – the last month I participated in several interviews (I’ve used to be only from the other side of the table). I was responsible for evaluating their technical abilities. Although the CVs gave hints about what the candidate knows and is capable of, asking proper questions sometimes revealed unexpected voids in the knowledge of people. Btw, in my first interview I was totally unprepared and didn’t know what to ask, but after some research on the topic I became more adequate to the task, though I guess I could be more creative. In addition to the interview questions, I also prepared a simple coding homework assignment that we were giving to the candidates. I am happy we used this approach since it showed pretty well how people approach code and what their skills are. It was also interesting to notice how differently people could try to code their way through such a simple problem.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Looking towards 2011&lt;/strong&gt; – I already mentioned what are my preferences about my career development for the new year. I hope that it will be a great year for everyone I work with. I wish my colleagues all the best, to keep it cool and to their best to maintain a friendly and supportive work environment.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-315422785397451229?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/315422785397451229/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=315422785397451229&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/315422785397451229'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/315422785397451229'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2011/01/summary-of-year-2010.html' title='Summary of the year 2010'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-2669693973832707489</id><published>2010-12-27T09:24:00.001+02:00</published><updated>2011-01-02T19:48:20.204+02:00</updated><title type='text'>Release notes – less or more structured approaches</title><content type='html'>&lt;p&gt;Continuing my &lt;a href="http://immitev.blogspot.com/2010/12/release-notes-whats-and-hows.html"&gt;post&lt;/a&gt; from last week, I’ll briefly explain how we maintained a change log in my company for about an year (this was back in 2009) and what were the the things we liked and disliked about it.&lt;/p&gt;  &lt;p&gt;We used a shared OneNote notebook that had a page per each internal build. After a developer had checked-in a bugfix or some new functionality, he had to describe the change in a free text format, Pasting screenshots was encouraged too, when applicable. The OneNote looked like that:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_wuDhHfQy0oA/TSC6YSn0RYI/AAAAAAAAHXA/zG_4fRjfyLA/s1600-h/oneNoteChangeLog%5B4%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="oneNoteChangeLog" border="0" alt="oneNoteChangeLog" src="http://lh3.ggpht.com/_wuDhHfQy0oA/TRg_N8HL0cI/AAAAAAAAHXE/1vQ_NHx7MKg/oneNoteChangeLog_thumb%5B3%5D.jpg?imgmax=800" width="401" height="145" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;We chose OneNote because of its several conveniences:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Easy to setup and use. &lt;/li&gt;    &lt;li&gt;Allows concurrent editing. &lt;/li&gt;    &lt;li&gt;Easily searchable. &lt;/li&gt;    &lt;li&gt;Allows WYSIWYG rich text formatting (including pasting screenshots) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Actually we didn’t use many OneNote features. It was just a visually appealing and easy-to-setup wiki. I think it was pretty useful for devs and QAs in terms of shedding more light in the product development. People could quickly got a good idea how features were evolving and be kept up-to-date with the changes in a non-obtrusive way.&lt;/p&gt;  &lt;p&gt;But there were several things that were not that great about this process:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Some developers complained that it was getting too difficult to commit changes: first they had to write checkin comments, then they had to write a resolution in the issue tracking system, and finally they had to update the change log. Though the comment text could slightly differ, sometimes it seemed like a duplication. &lt;/li&gt;    &lt;li&gt;It was not that easy assemble all the changes for the official release notes from the changelog. One of the reasons was that changes were organzied by date, while it made more sense to have them finally grouped by component and sorted by importance. Also the writing style of developers differs, so it was necessary to rephrase many of the changes. &lt;/li&gt;    &lt;li&gt;Since the log has loose structure, it was not possible to query the changes, e.g. “find me the fixes by developer X made in the past 2 weeks”. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;So I was thinking why not capture all release notes information in the issue tracking system itself. The advantages of such approach are obvious, but the system has to meet several requirements for this to work well:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Support &lt;strong&gt;custom fields&lt;/strong&gt; (for a text field “&lt;em&gt;DescriptionForReleaseNotes&lt;/em&gt;” and probably another one “&lt;em&gt;ImportanceForReleaseNotes&lt;/em&gt;”) &lt;/li&gt;    &lt;li&gt;Support specifying in which &lt;strong&gt;release&lt;/strong&gt; was the change made. &lt;/li&gt;    &lt;li&gt;Support specifying the &lt;strong&gt;component&lt;/strong&gt; that changed. &lt;/li&gt;    &lt;li&gt;Support generating a custom &lt;strong&gt;report&lt;/strong&gt; that for any selected release(s) outputs the non-empty changes, grouped by component and sorted by importance. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;I guess that most popuplar issue tracking systems would support the first three features. I have my doubts only for the report, but some systems might offer powerful enough reporting out of the box. And even if they don’t, exporting the result to Excel and doing some data manipulation there, is an option, too.&lt;/p&gt;  &lt;p&gt;Another challenge is that this approach assumes that each item in the release notes should describe only one issue in the system, which is not always the case. You might want to group several small changes in one area in a single item. Well, you can just put a value in &lt;em&gt;DescriptionForReleaseNotes&lt;/em&gt; for only one of them, but it will be difficult to manage this, unless there is a support for linking the other related issues to the one that contains the description. So linking issues is probably another requirement for this approach to work well.&lt;/p&gt;  &lt;p&gt;So is it worth commiting to such a highly structured approach of storing release notes? I am not sure. If your issue tracking system can handle such process well, it might be relatively painless to adopt it. But if you have to use another tool just for managing release notes, it might be an overkill. What do you think?&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-2669693973832707489?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/2669693973832707489/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=2669693973832707489&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/2669693973832707489'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/2669693973832707489'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2010/12/release-notes-less-or-more-structured.html' title='Release notes – less or more structured approaches'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_wuDhHfQy0oA/TRg_N8HL0cI/AAAAAAAAHXE/1vQ_NHx7MKg/s72-c/oneNoteChangeLog_thumb%5B3%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-3863061716308339236</id><published>2010-12-19T23:55:00.001+02:00</published><updated>2011-01-02T19:49:17.532+02:00</updated><title type='text'>Release notes – whats and hows</title><content type='html'>&lt;p&gt;So you are asked to prepare a detailed list of changes in the last N months that would be the basis for creating the release notes for the brand new shiny version of your product. Unfortunately you have not been maintaining a change log throughout the product development. Naturally you can’t come up with a detailed list from the top of the head (even for the stuff you developed yourself). In order to do a decent job, several people have to invest hours (or days) to dig out stuff from various sources: the SCM system, the help desk, design documents, e-mails. Under time pressure they have to formulate the changes in a way that they make sense for the target audience. And if the deadline is tight, you might sacrifice the quality of the release notes. That’s stressful and inefficient. But before digging deeper on how to take preventive measures, let’s first take a look at what’s the purpose of release notes/change log and how to prepare them.&lt;/p&gt;  &lt;p&gt;&lt;font size="3"&gt;What is the target audience of a change log/release notes? &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;I initially planned to use the terms “change log”, “release notes” and “revision history” as synonims. But I have a subtle feeling that a change log is for internal audiences, while release notes/revision history are targetted to the end users. A change log also seems to have a connotation of an on-going effort, while release notes are often created just before the release as a one-time effort.&lt;/p&gt;  &lt;p&gt;It’s clear that not only the end users (current and prospecitve clients) are interested in what’s fixed/ehnahnced/added. A lot of people involved in the product development need such information and they surely need it on a much more regular basis. The list of the internal stakeholders includes QAs, technical writers, developers, customer support, consultants, trainers, management. Probably everyone is interested in slightly different subset (or aspect) of the changes, but to keep things simple let’s examine for now only the differences b/n internal and external change logs.&lt;/p&gt;  &lt;p&gt;&lt;font size="3"&gt;Targeting external vs internal audience&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;The purpose of an &lt;strong&gt;external&lt;/strong&gt; release notes (i.e. publicly visible &amp;amp; easily discoverable) is not only to inform, but most importantly (from the business perspective) is to:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;em&gt;Advertise what goodness the new release brings&lt;/em&gt; – how does it empower the user (or at least alleviate some of his pain) &lt;/li&gt;    &lt;li&gt;&lt;em&gt;Increase the confidence in the product and the company behind it&lt;/em&gt; - by demonstrating that serious efforts are put in its development and that there is a significant progress on many fronts. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The purpose of the &lt;strong&gt;internal&lt;/strong&gt; change log is to make sure that everyone knows what is going on in the development and to take this in consideration while doing their job. It’s necessary to have additional information about the circumstances of the change (e.g. who was the developer behind the change, so he can be contacted later). The purpose here is just to inform (not to persuade), but still the description of each change should be done concisely from the perspective of the product evolution.&lt;/p&gt;  &lt;p&gt;&lt;font size="3"&gt;How release notes should be written? &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;I was looking for an answer of this question myself before deciding to write this post. I found several good answers &lt;a href="http://stackoverflow.com/questions/638423/how-should-release-notes-be-written"&gt;at stackoverflow&lt;/a&gt; and in a &lt;a href="http://blog.davingranroth.com/2010/03/how-to-write-release-notes/"&gt;blog post&lt;/a&gt;. But let’s first take a look at some sample release notes to have some background.&lt;/p&gt;  &lt;p&gt;I spent a few hours looking at the release notes of a dozen of products (some of which I’ve used, some I’ve just been interested in). Here are a few links of various product types:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;.NET control suites&lt;/em&gt;&lt;/strong&gt;: &lt;a href="http://www.telerik.com/products/winforms/whats-new/release-history/q3-2010-version-2010-3-10-1109.aspx"&gt;Telerik&lt;/a&gt; , &lt;a href="http://help.infragistics.com/NetAdvantage/WinForms/2010.3"&gt;Infragistics&lt;/a&gt;, &lt;a href="http://www.devexpress.com/Subscriptions/DXperience/WhatsNew2010v2/index.xml"&gt;DevExpress&lt;/a&gt;, &lt;a href="http://www.componentone.com/SuperProducts/StudioWinForms/Release+History/"&gt;ComponentOne&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;VS.NET addins&lt;/em&gt;&lt;/strong&gt;: &lt;a href="http://www.jetbrains.net/jira/secure/ReleaseNote.jspa?projectId=10241&amp;amp;styleName=Html&amp;amp;version=11685"&gt;ReSharper&lt;/a&gt;, &lt;a href="http://www.testdriven.net/downloads/releasenotes.html"&gt;TestDriven.Net&lt;/a&gt;, &lt;a href="http://docs.typemock.com/isolator/Default.aspx##typemock.chm/Documentation/ReleaseNotes60.html"&gt;Typemock&lt;/a&gt;, &lt;a href="http://entrian.com/blog/category/ChangeLog/"&gt;Entrian Source Search&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;SCM systems&lt;/em&gt;&lt;/strong&gt;: &lt;a href="http://mercurial.selenic.com/wiki/WhatsNew"&gt;Mercurial&lt;/a&gt;, &lt;a href="http://www.plasticscm.com/download/releasenotes.aspx"&gt;PlasticSCM&lt;/a&gt;, &lt;a href="http://subversion.apache.org/docs/release-notes/1.5.html"&gt;Subversion&lt;/a&gt;, &lt;a href="http://www.sourcegear.com/vault/releases/index.html"&gt;Vault&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;If you looked at the release notes, you’ve probably noticed that they differ both in terms of content and presentation:&lt;/p&gt;  &lt;p&gt;&lt;font size="3" face="Times New Roman"&gt;&lt;strong&gt;Content&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Highlights &lt;/em&gt;:&lt;/strong&gt; more often than not, release notes start with an overview of the most important changes&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Leaving out the bugs&lt;/em&gt;:&lt;/strong&gt; some release notes don’t include list of fixes, but only improvements (or at least the list of fixes can be found in other not as easily accessible location). Since there is no bug-free software that I know of, I guess the this information filtering is geared mostly towards attracting new customers.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;strong&gt;Level of detail&lt;/strong&gt;:&lt;/em&gt; some vendors prefer to describe changes in the most laconic way possible, some are more descriptive&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Automatically generated&lt;/em&gt;:&lt;/strong&gt; some changelogs appear to be generated directly from the issue tracking system (or even from the source control system), but most of them look hand-crafted (especially in cases when rich output formats are used, e.g. pictures :) )&lt;/p&gt;  &lt;p&gt;&lt;font size="3" face="Times New Roman"&gt;&lt;strong&gt;Presentation&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Output Format&lt;/em&gt;&lt;/strong&gt;: plain text vs richer format (HTML, PDF, etc.). Rich formats are more expressive &amp;amp; more visually appealing, but for some types of products a plain text change log might be just good enough.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Organization of the list of changes&lt;/em&gt;&lt;/strong&gt;: usually the changes are grouped/sorted by component and/or by change type. The change types can be as basic as &lt;em&gt;ADDED, IMPROVED, FIXED&lt;/em&gt; (see &lt;a href="http://www.telerik.com/products/winforms/whats-new/release-history/q3-2010-version-2010-3-10-1109.aspx"&gt;Telerik&lt;/a&gt;), though some vendors like JetBrains use more detailed types: &lt;em&gt;Bug, Cosmetics, Exception, New Feature, Performance Problem, Usability Problem, Meta Issue, Task&lt;/em&gt; (as &lt;a href="http://www.jetbrains.net/jira/secure/ReleaseNote.jspa?projectId=10241&amp;amp;styleName=Html&amp;amp;version=11685"&gt;ReSharper&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;&lt;font size="3"&gt;Continued…&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;This post got rather lengthy, so I am continuing this topis in &lt;a href="http://immitev.blogspot.com/2010/12/release-notes-less-or-more-structured.html"&gt;my next post&lt;/a&gt; with a brief analysis of what kinds of tools you could use for manageing change logs. I’ll share some of my experience and will discuss the pros/cons of different approaches.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-3863061716308339236?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/3863061716308339236/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=3863061716308339236&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/3863061716308339236'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/3863061716308339236'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2010/12/release-notes-whats-and-hows.html' title='Release notes – whats and hows'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-1070871797396451782</id><published>2010-10-20T00:51:00.001+03:00</published><updated>2010-10-20T00:51:52.832+03:00</updated><title type='text'>Devreach 2010</title><content type='html'>&lt;p&gt;The 5th edition of Devreach was again excellent - so many world-class speakers, who are passionate about development. &lt;/p&gt;  &lt;p&gt;I visited the following sessions:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.devreach.com/Event/Sessions.aspx#Anti-Corruption-Layers"&gt;Anti-Corruption Layers&lt;/a&gt;&amp;#160;&lt;em&gt;by &lt;a href="http://www.devreach.com/Event/Speakers.aspx#Philip Japikse"&gt;Donlad Belcham&lt;/a&gt;, &lt;a href="http://www.devreach.com/Event/FAQ.aspx#1609f821-fefc-46b2-9283-c3ea408e4812"&gt;Level200&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.devreach.com/Event/Sessions.aspx#WCF-4.0"&gt;What's New in WCF 4&lt;/a&gt;&amp;#160;&lt;em&gt;by &lt;a href="http://www.devreach.com/Event/Speakers.aspx#MiguelCastro"&gt;Miguel Castro&lt;/a&gt;, &lt;a href="http://www.devreach.com/Event/FAQ.aspx#1609f821-fefc-46b2-9283-c3ea408e4812"&gt;Level 200&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.devreach.com/Event/Sessions.aspx#kanban-scrumban"&gt;Kanban and Scrumban&lt;/a&gt;&amp;#160;&lt;em&gt;by Joel Semeniuk, &lt;a href="http://www.devreach.com/Event/FAQ.aspx#1609f821-fefc-46b2-9283-c3ea408e4812"&gt;Level 200&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.devreach.com/Event/Sessions.aspx#client-jQuery-visual-studio"&gt;Leveraging Client Capabilities with jQuery in Visual Studio&lt;/a&gt;&amp;#160;&lt;em&gt;by &lt;a href="http://www.devreach.com/Event/Speakers.aspx#RobertBoedigheimer"&gt;Robert Boedigheimer&lt;/a&gt;, &lt;a href="http://www.devreach.com/Event/FAQ.aspx#1609f821-fefc-46b2-9283-c3ea408e4812"&gt;Level 300&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.devreach.com/Event/Sessions.aspx#ASP.NET-provider-model"&gt;Dynamic State Storage Using the ASP.NET Provider Model&lt;/a&gt;&amp;#160;&lt;em&gt;by &lt;a href="http://www.devreach.com/Event/Speakers.aspx#MiguelCastro"&gt;Miguel Castro&lt;/a&gt;, &lt;a href="http://www.devreach.com/Event/FAQ.aspx#1609f821-fefc-46b2-9283-c3ea408e4812"&gt;Level 300&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.devreach.com/Event/Sessions.aspx#Team-Foundation-Server"&gt;Customizing TFS to Your Needs&lt;/a&gt;&amp;#160;&lt;em&gt;by &lt;a href="http://www.devreach.com/Event/Speakers.aspx#Joelsemeniuk"&gt;Joel Semeniuk&lt;/a&gt;, &lt;a href="http://www.devreach.com/Event/FAQ.aspx#1609f821-fefc-46b2-9283-c3ea408e4812"&gt;Level 300&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.devreach.com/Event/Sessions.aspx#visual-studio-2010"&gt;Deep dive into Load Testing features in Visual Studio 2010&lt;/a&gt;&amp;#160;&lt;em&gt;by &lt;a href="http://www.devreach.com/Event/Speakers.aspx#MartinKulov"&gt;Martin Kulov&lt;/a&gt;, &lt;a href="http://www.devreach.com/Event/FAQ.aspx#1609f821-fefc-46b2-9283-c3ea408e4812"&gt;Level 300&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.devreach.com/Event/Sessions.aspx#development"&gt;Worst Practices and Anti-Patterns of Software&lt;/a&gt;&amp;#160;&lt;em&gt;by &lt;a href="http://www.devreach.com/Event/Speakers.aspx#StevenSmith"&gt;Steven Smith&lt;/a&gt;, &lt;a href="http://www.devreach.com/Event/FAQ.aspx#1609f821-fefc-46b2-9283-c3ea408e4812"&gt;Level 200&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.devreach.com/Event/Sessions.aspx#automated-testing"&gt;Automated Testing in the Agile Environment&lt;/a&gt;&amp;#160;&lt;em&gt;by &lt;a href="http://www.devreach.com/Event/Speakers.aspx#ChristopherEyhorn"&gt;Christopher Eyhorn&lt;/a&gt;, &lt;a href="http://www.devreach.com/Event/FAQ.aspx#1609f821-fefc-46b2-9283-c3ea408e4812"&gt;Level 300&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;I have to say that none disappointed me – most of them were both informative and entertaining. Altough there were 5 parallel streams of lectures for each time slot (Presentation Layer, Data Layer, Business Layer, Best Practices, Architecture) the titless that grabbed my interest were usually just one or two. &lt;/p&gt;  &lt;p&gt;I am not sure how much value the information from this conference would bring to my work, but at least it is refreshing to hear (or get remineded) about various practices, approaches, technologies and fantasize how they might help you in you everyday job.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-1070871797396451782?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/1070871797396451782/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=1070871797396451782&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/1070871797396451782'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/1070871797396451782'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2010/10/devreach-2010.html' title='Devreach 2010'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-3087419394849787698</id><published>2008-12-25T15:47:00.002+02:00</published><updated>2008-12-25T16:06:44.244+02:00</updated><title type='text'>Summary of the year 2008</title><content type='html'>Another quite year of blogging, though the last quarter this blog was somewhat resurrected.&lt;br /&gt;&lt;br /&gt;It has been 2.5 years since I started working on &lt;a href="http://www.validata.co.uk/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Validata&lt;/span&gt;&lt;/a&gt; product. The last year was moderately interesting one,. I worked on various staff, the most notable of which are an HTTP load testing tool (pretty challenging task) and a language parser using &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;ANTLR&lt;/span&gt; (just for a week). I also continued to work on our web application and a couple of desktop applications. I feel good that some my ideas finally were implemented and went in production. Also I think my efforts to improve our development process start to pay off...&lt;br /&gt;&lt;br /&gt;Unfortunately my pet project with  &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;ActiveRecord&lt;/span&gt;, Monorail, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;MySql&lt;/span&gt;, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;JQuery&lt;/span&gt; that I got started was put on hold in &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;february&lt;/span&gt;, but still it was a good learning experience. After getting to know Monorail, now I quickly got was ASP.NET &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;MVC&lt;/span&gt; all about.&lt;br /&gt;&lt;br /&gt;Next year, I plan to become an &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;MCTS&lt;/span&gt; (I think my company finds more value in those certifications, than I do), so I am starting with &lt;a href="http://www.microsoft.com/learning/en/us/exams/70-536.aspx"&gt;70-536&lt;/a&gt;. As a matter of fact, this morning I finally took a practice test from the training kit. I expected to top it without reading a word from the training book, but wishful thinking did not suffice :) I realized that there are areas of the .NET Framework that I don't know enough about i.e. .NET Security, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;WMI&lt;/span&gt;, Interoperability. I wonder if I concentrate only on those areas, will this be enough to pass the exam. Having solid 4 years experience in the .NET world should be a good starting point, so reading a few chapters for a couple of days might be exactly what I need.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-3087419394849787698?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/3087419394849787698/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=3087419394849787698&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/3087419394849787698'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/3087419394849787698'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2008/12/summary-of-year-2008.html' title='Summary of the year 2008'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-3534584873528561062</id><published>2008-11-05T11:36:00.001+02:00</published><updated>2008-11-05T11:36:37.326+02:00</updated><title type='text'>Helper for ANTLR Grammar</title><content type='html'>&lt;p&gt;So I mentioned I am working on a ANTLR grammar (though not for long). And the experience with it was not always smooth.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;The problem&lt;/strong&gt;&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;We are trying to define a grammar for an existing language which is pretty complex (several hundreds of statements). Every new parser rule had the potential to break the grammar. After inputting several rules, we had difficulty identifying the problematic one. It required a lot of discipline to compile the grammar after each change.&lt;/li&gt;    &lt;li&gt;Two developers are preparing the grammar together. Once or twice a day, we are merging the .g file. The merging proved to be quite error-prone.&lt;/li&gt;    &lt;li&gt;The ANTLRWorks IDE is not always stable. In some scenarios it freezes and has to be restarted.&lt;/li&gt;    &lt;li&gt;The errors and warnings were displayed together, so we had no way of filtering only errors (and we had many warnings).&lt;/li&gt;    &lt;li&gt;The C# code generation is buggy in some scenarios - we got an error of a duplicate identifier.&lt;/li&gt;    &lt;li&gt;After each compilations we had to overwrite the lexer and parser CS file in our C# project.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;strong&gt;The solution&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;So I wrote an desktop application that monitors the ANTLR grammar file and on each change, it compiles it and does some post-processing to fix the C# code using a simple regex.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Other features&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&amp;#183; Specify settings in .config file (grammar file, working folder, antllr install dir)&lt;/p&gt;  &lt;p&gt;&amp;#183; View compilation output - complete output, and only errors&lt;/p&gt;  &lt;p&gt;&amp;#183; View history of compilation attempts and results&lt;/p&gt;  &lt;p&gt;&amp;#183; View notifications as balloon tips (displayed only on significant changes &amp;#8211; broken grammar and fixed grammar)&lt;/p&gt;  &lt;p&gt;&amp;#183; Automatically save the last successful build in a subfolder of the working folder&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Was it worth it?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Yes, automating error-prone operations is always a good idea. We had problems with merging a few times and this continuous compilation enabled us to quickly find the problematic rules. The tool took me initially 3 hours to develop and additional 50% to maintain and bug fix.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;How could we extend it?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Generating the C# files from the grammar is not enough. Its output should be included in the project. Then compile successfully. Then pass some unit tests. We have not reached this stage yet.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Points of interest&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;There is a good discussion &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/csharpide/thread/ab359140-36e5-440b-a1ea-5fc64c4ca435/"&gt;here&lt;/a&gt; about how to change the .g file, save, hit F5 in Visual Studio and have it use the most recent version of the generated files. Apparently you need a custom tool to do so. A custom tool as a managed assembly that contains a class that implements the IvsSingleFileGenerator interface. Here is a link to an &lt;a href="http://www.codeproject.com/KB/cs/VsMultipleFileGenerator.aspx "&gt;article&lt;/a&gt; how to create such a custom tool.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;P.S.&lt;/strong&gt; If you are interested in the code, let me know. I would have uploaded it on CodePlex, but currently it has a dependency to a third-party grid, so I should better use a normal grid, instead.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-3534584873528561062?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/3534584873528561062/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=3534584873528561062&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/3534584873528561062'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/3534584873528561062'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2008/11/helper-for-antlr-grammar.html' title='Helper for ANTLR Grammar'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-9200106473738520973</id><published>2008-10-29T16:41:00.001+02:00</published><updated>2008-10-29T16:41:04.019+02:00</updated><title type='text'>My Meta Parser</title><content type='html'>&lt;p&gt;This is fun... I am working now on a task related to ANTLR and its grammar files. Since the grammar file got big and a bit messy, I wrote a small utility to parse the grammar file (.g file) and to sort the parser rules by name. So there it is: a parser of the parser... my meta parser&lt;/p&gt;  &lt;p&gt;NOTE: Well, it was not a full-blown parser, but having the parser rules more strictly structured, made it easy enough to implement.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-9200106473738520973?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/9200106473738520973/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=9200106473738520973&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/9200106473738520973'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/9200106473738520973'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2008/10/my-meta-parser.html' title='My Meta Parser'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-961923310087665057</id><published>2008-10-27T09:37:00.001+02:00</published><updated>2008-10-27T09:37:38.567+02:00</updated><title type='text'>Ways to Compare .NET Assemblies</title><content type='html'>&lt;p&gt;Sometimes comparing source code is not a viable option, and one has to resort to comparing assemblies (hopefully not obfuscated) to find out what is new, what has changed and what is removed. This kind of activity can be useful in many ways:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Determine what amount of work was done between two releases &lt;/li&gt;    &lt;li&gt;Estimate the impact of the changes (e.g. what is needed to be retested). &lt;/li&gt;    &lt;li&gt;Spend some work time doing playing with such amusing stuff :)&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;But how could you do it:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Commercial Tools&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.ndepend.com/"&gt;NDepend&lt;/a&gt; - I have only watched their &lt;a href="http://s3.amazonaws.com/NDependOnlineDemos/BuildComparison_viewlet_swf.html"&gt;video&lt;/a&gt; and it is impressive. Unfortunately the trial version does not support build comparison, so you should buy the product to try it for yourself. It is a pretty feature rich product that you can use for a variety of reasons.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.bitwidgets.com/"&gt;Bitdiffer&lt;/a&gt; - This sole purpose of this tool is comparing assemblies. It lacks some of the NDepend visualizations goodness, but is nevertheless an excellent tool. You might use its GUI application as well as its command line version to automate your work.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Poor Man's Tools&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.codingsanity.com/diff.htm"&gt;Reflector Diff AddIn&lt;/a&gt; - We all love Reflector and this is one of its useful addins. You can either view the differences or you can have a XML report.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://code.msdn.microsoft.com/fds"&gt;Framework Design Studio&lt;/a&gt; - There is a short review &lt;a href="http://blogs.microsoft.co.il/blogs/bursteg/archive/2008/04/17/compare-net-assemblies-with-framework-design-studio.aspx"&gt;here&lt;/a&gt;. Unfortunately the tool does not work with all assemblies and I can't report good results with it.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-961923310087665057?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/961923310087665057/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=961923310087665057&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/961923310087665057'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/961923310087665057'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2008/10/ways-to-compare-net-assemblies.html' title='Ways to Compare .NET Assemblies'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-5770094388969057609</id><published>2008-10-23T14:31:00.001+03:00</published><updated>2008-10-23T14:31:39.799+03:00</updated><title type='text'>VS.NET Macro To Display All File References in a VS.NET Solution</title><content type='html'>&lt;p&gt;&lt;strong&gt;The problem&lt;/strong&gt;: You have a large solution (mine is with 154 projects) and you want to quick find if you use file references and to what assemblies are they).&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;The solution:&lt;/strong&gt; see the files below. Add the following module and class and execute ShowAllFileReferencesGroupedByProject()&lt;/p&gt;  &lt;p&gt;Module:&lt;/p&gt;  &lt;div style="font-size: 12pt; background: #202020; color: #eeeeee; font-family: calibri"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #90ee90"&gt;Imports&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;System&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #90ee90"&gt;Imports&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;EnvDTE&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #90ee90"&gt;Imports&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;EnvDTE80&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #90ee90"&gt;Imports&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;System&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Collections&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Generic&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #90ee90"&gt;Imports&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;System&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Diagnostics&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #90ee90"&gt;Imports&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;System&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Text&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #90ee90"&gt;Imports&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;System&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Windows&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Forms&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #90ee90"&gt;Public&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Module&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;VsProjectsManagement&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;Public&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Sub&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;ShowAllFileReferencesGroupedByProject&lt;/span&gt;()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;Dim&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;sb&lt;/span&gt; &lt;span style="color: #90ee90"&gt;As&lt;/span&gt; &lt;span style="color: #90ee90"&gt;New&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;StringBuilder&lt;/span&gt;()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;Dim&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;finder&lt;/span&gt; &lt;span style="color: #90ee90"&gt;As&lt;/span&gt; &lt;span style="color: #90ee90"&gt;New&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;FileReferencesFinder&lt;/span&gt;()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;Dim&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;fileReferences&lt;/span&gt; &lt;span style="color: #90ee90"&gt;As&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;Dictionary&lt;/span&gt;(&lt;span style="color: #90ee90"&gt;Of&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;VSLangProj&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;VSProject&lt;/span&gt;, &lt;span style="color: #f2f0df"&gt;List&lt;/span&gt;(&lt;span style="color: #90ee90"&gt;Of&lt;/span&gt; &lt;span style="color: #90ee90"&gt;String&lt;/span&gt;)) = &lt;span style="color: #f2f0df"&gt;finder&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;GetAllFileReferencesInSolution&lt;/span&gt;(&lt;span style="color: #90ee90"&gt;True&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;Dim&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;sortedProject&lt;/span&gt; &lt;span style="color: #90ee90"&gt;As&lt;/span&gt; &lt;span style="color: #90ee90"&gt;New&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;List&lt;/span&gt;(&lt;span style="color: #90ee90"&gt;Of&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;VSLangProj&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;VSProject&lt;/span&gt;)(&lt;span style="color: #f2f0df"&gt;fileReferences&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Keys&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #f2f0df"&gt;sortedProject&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Sort&lt;/span&gt;(&lt;span style="color: #90ee90"&gt;AddressOf&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;FileReferencesFinder&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;CompareProjectsByName&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;For&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Each&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;proj&lt;/span&gt; &lt;span style="color: #90ee90"&gt;As&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;VSLangProj&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;VSProject&lt;/span&gt; &lt;span style="color: #90ee90"&gt;In&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;fileReferences&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Keys&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #f2f0df"&gt;sb&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Append&lt;/span&gt;(&lt;span style="color: #f2f0df"&gt;proj&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Project&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Name&lt;/span&gt;).&lt;span style="color: #f2f0df"&gt;Append&lt;/span&gt;(&lt;span style="font-weight: bold; color: aqua"&gt;&amp;quot; : &amp;quot;&lt;/span&gt;).&lt;span style="color: #f2f0df"&gt;AppendLine&lt;/span&gt;()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;For&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Each&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;reference&lt;/span&gt; &lt;span style="color: #90ee90"&gt;As&lt;/span&gt; &lt;span style="color: #90ee90"&gt;String&lt;/span&gt; &lt;span style="color: #90ee90"&gt;In&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;fileReferences&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Item&lt;/span&gt;(&lt;span style="color: #f2f0df"&gt;proj&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&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; &lt;span style="color: #f2f0df"&gt;sb&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;AppendLine&lt;/span&gt;(&lt;span style="color: #f2f0df"&gt;reference&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;Next&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #f2f0df"&gt;sb&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;AppendLine&lt;/span&gt;()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;Next&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #f2f0df"&gt;Debug&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Write&lt;/span&gt;(&lt;span style="color: #f2f0df"&gt;sb&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;ToString&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #f2f0df"&gt;MessageBox&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Show&lt;/span&gt;(&lt;span style="color: #f2f0df"&gt;sb&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;ToString&lt;/span&gt;, &lt;span style="font-weight: bold; color: aqua"&gt;&amp;quot;File references&amp;quot;&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;End&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Sub&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;Class FileReferencesFinder:&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="font-size: 12pt; background: #202020; color: #eeeeee; font-family: calibri"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #90ee90"&gt;Imports&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;System&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #90ee90"&gt;Imports&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;EnvDTE&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #90ee90"&gt;Imports&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;EnvDTE80&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #90ee90"&gt;Imports&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;System&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Collections&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Generic&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #90ee90"&gt;Imports&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;System&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Diagnostics&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #90ee90"&gt;Imports&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;System&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Text&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #90ee90"&gt;Imports&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;System&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Windows&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Forms&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #90ee90"&gt;Public&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Class&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;FileReferencesFinder&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;Private&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Function&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;GetAllSolutionVsProjects&lt;/span&gt;()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;Dim&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;vsProjects&lt;/span&gt; &lt;span style="color: #90ee90"&gt;As&lt;/span&gt; &lt;span style="color: #90ee90"&gt;New&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;List&lt;/span&gt;(&lt;span style="color: #90ee90"&gt;Of&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;VSLangProj&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;VSProject&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;For&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Each&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;proj&lt;/span&gt; &lt;span style="color: #90ee90"&gt;As&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;Project&lt;/span&gt; &lt;span style="color: #90ee90"&gt;In&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;DTE&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Solution&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Projects&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;If&lt;/span&gt; &lt;span style="color: #90ee90"&gt;TypeOf&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;proj&lt;/span&gt;.Object &lt;span style="color: #90ee90"&gt;Is&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;VSLangProj&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;VSProject&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Then&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&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; &lt;span style="color: #f2f0df"&gt;vsProjects&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Add&lt;/span&gt;(&lt;span style="color: #f2f0df"&gt;proj&lt;/span&gt;.Object)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;End&lt;/span&gt; &lt;span style="color: #90ee90"&gt;If&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;Next&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;Return&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;vsProjects&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;End&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Function&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;Public&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Shared&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Function&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;CompareProjectsByName&lt;/span&gt;(&lt;span style="color: #90ee90"&gt;ByVal&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;prj1&lt;/span&gt; &lt;span style="color: #90ee90"&gt;As&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;VSLangProj&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;VSProject&lt;/span&gt;, &lt;span style="color: #90ee90"&gt;ByVal&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;prj2&lt;/span&gt; &lt;span style="color: #90ee90"&gt;As&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;VSLangProj&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;VSProject&lt;/span&gt;) &lt;span style="color: #90ee90"&gt;As&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Integer&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;Dim&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;name1&lt;/span&gt; &lt;span style="color: #90ee90"&gt;As&lt;/span&gt; &lt;span style="color: #90ee90"&gt;String&lt;/span&gt; = &lt;span style="color: #f2f0df"&gt;prj1&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Project&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Name&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;Dim&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;name2&lt;/span&gt; &lt;span style="color: #90ee90"&gt;As&lt;/span&gt; &lt;span style="color: #90ee90"&gt;String&lt;/span&gt; = &lt;span style="color: #f2f0df"&gt;prj2&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Project&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Name&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;Return&lt;/span&gt; &lt;span style="color: #90ee90"&gt;String&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Compare&lt;/span&gt;(&lt;span style="color: #f2f0df"&gt;name1&lt;/span&gt;, &lt;span style="color: #f2f0df"&gt;name2&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;End&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Function&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;Public&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Function&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;GetAllFileReferencesInSolution&lt;/span&gt;(&lt;span style="color: #90ee90"&gt;ByVal&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;ignoreNetFrameworkAssemgblies&lt;/span&gt; &lt;span style="color: #90ee90"&gt;As&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Boolean&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;Dim&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;fileReferences&lt;/span&gt; &lt;span style="color: #90ee90"&gt;As&lt;/span&gt; &lt;span style="color: #90ee90"&gt;New&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;Dictionary&lt;/span&gt;(&lt;span style="color: #90ee90"&gt;Of&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;VSLangProj&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;VSProject&lt;/span&gt;, &lt;span style="color: #f2f0df"&gt;List&lt;/span&gt;(&lt;span style="color: #90ee90"&gt;Of&lt;/span&gt; &lt;span style="color: #90ee90"&gt;String&lt;/span&gt;))&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;For&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Each&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;vsProj&lt;/span&gt; &lt;span style="color: #90ee90"&gt;As&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;VSLangProj&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;VSProject&lt;/span&gt; &lt;span style="color: #90ee90"&gt;In&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;GetAllSolutionVsProjects&lt;/span&gt;()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;Dim&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;references&lt;/span&gt; &lt;span style="color: #90ee90"&gt;As&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;List&lt;/span&gt;(&lt;span style="color: #90ee90"&gt;Of&lt;/span&gt; &lt;span style="color: #90ee90"&gt;String&lt;/span&gt;) = &lt;span style="color: #f2f0df"&gt;GetProjectFileReferences&lt;/span&gt;(&lt;span style="color: #f2f0df"&gt;vsProj&lt;/span&gt;, &lt;span style="color: #f2f0df"&gt;ignoreNetFrameworkAssemgblies&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;If&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;references&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Count&lt;/span&gt; &amp;gt; &lt;span style="color: aqua"&gt;0&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Then&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&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; &lt;span style="color: #f2f0df"&gt;fileReferences&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Add&lt;/span&gt;(&lt;span style="color: #f2f0df"&gt;vsProj&lt;/span&gt;, &lt;span style="color: #f2f0df"&gt;references&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;End&lt;/span&gt; &lt;span style="color: #90ee90"&gt;If&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;Next&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;Return&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;fileReferences&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;End&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Function&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;Private&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Function&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;GetProjectFileReferences&lt;/span&gt;(&lt;span style="color: #90ee90"&gt;ByVal&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;vsProj&lt;/span&gt; &lt;span style="color: #90ee90"&gt;As&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;VSLangProj&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;VSProject&lt;/span&gt;, &lt;span style="color: #90ee90"&gt;ByVal&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;ignoreNetFrameworkAssemgblies&lt;/span&gt; &lt;span style="color: #90ee90"&gt;As&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Boolean&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;Dim&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;fileReferences&lt;/span&gt; &lt;span style="color: #90ee90"&gt;As&lt;/span&gt; &lt;span style="color: #90ee90"&gt;New&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;List&lt;/span&gt;(&lt;span style="color: #90ee90"&gt;Of&lt;/span&gt; &lt;span style="color: #90ee90"&gt;String&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;For&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Each&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;objReference&lt;/span&gt; &lt;span style="color: #90ee90"&gt;As&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;VSLangProj&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Reference&lt;/span&gt; &lt;span style="color: #90ee90"&gt;In&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;vsProj&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;References&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;If&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;objReference&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Type&lt;/span&gt; = &lt;span style="color: #f2f0df"&gt;VSLangProj&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;prjReferenceType&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;prjReferenceTypeAssembly&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Then&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&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; &lt;span style="color: #90ee90"&gt;If&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;objReference&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;SourceProject&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Is&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Nothing&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Then&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&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;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;If&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;ignoreNetFrameworkAssemgblies&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Then&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&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;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;If&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;objReference&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Path&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;StartsWith&lt;/span&gt;(&lt;span style="font-weight: bold; color: aqua"&gt;&amp;quot;C:\Windows\Microsoft.NET\Framework\&amp;quot;&lt;/span&gt;) &lt;span style="color: #90ee90"&gt;Then&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&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;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;Continue&lt;/span&gt; &lt;span style="color: #90ee90"&gt;For&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&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;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;End&lt;/span&gt; &lt;span style="color: #90ee90"&gt;If&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&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;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;If&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;objReference&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Path&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;StartsWith&lt;/span&gt;(&lt;span style="font-weight: bold; color: aqua"&gt;&amp;quot;C:\Program Files\Reference Assemblies\Microsoft\Framework\&amp;quot;&lt;/span&gt;) &lt;span style="color: #90ee90"&gt;Then&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&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;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;Continue&lt;/span&gt; &lt;span style="color: #90ee90"&gt;For&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&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;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;End&lt;/span&gt; &lt;span style="color: #90ee90"&gt;If&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&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;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;End&lt;/span&gt; &lt;span style="color: #90ee90"&gt;If&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&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;#160;&amp;#160; &lt;span style="color: #f2f0df"&gt;fileReferences&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Add&lt;/span&gt;(&lt;span style="color: #f2f0df"&gt;objReference&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Path&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&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; &lt;span style="color: #90ee90"&gt;End&lt;/span&gt; &lt;span style="color: #90ee90"&gt;If&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;End&lt;/span&gt; &lt;span style="color: #90ee90"&gt;If&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;Next&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #f2f0df"&gt;fileReferences&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Sort&lt;/span&gt;()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;Return&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;fileReferences&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;End&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Function&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #90ee90"&gt;End&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Class&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-5770094388969057609?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/5770094388969057609/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=5770094388969057609&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/5770094388969057609'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/5770094388969057609'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2008/10/vsnet-macro-to-display-all-file.html' title='VS.NET Macro To Display All File References in a VS.NET Solution'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-207966519196534448</id><published>2008-10-20T16:53:00.001+03:00</published><updated>2008-10-20T16:53:55.840+03:00</updated><title type='text'>DevReach 2008</title><content type='html'>&lt;p&gt;A week after the event, I am writing a short review of some of the presentations on DevReach conference&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Key Note - &lt;em&gt;by &lt;/em&gt;&lt;a href="http://www.devreach.com/Event/Speakers.aspx#StephenForte"&gt;&lt;em&gt;Stephen Forte &lt;/em&gt;&lt;/a&gt;&lt;em&gt;-&lt;/em&gt; very funny keynote. Also a great historical overview of Microsoft strategy for the data access. Steohen showed good examples that Microsoft is a reactive (not a proactive) company.&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.devreach.com/Event/Sessions.aspx#hall1_2"&gt;To AJAX or Not to AJAX &lt;/a&gt;&lt;em&gt;by &lt;/em&gt;&lt;a href="http://www.devreach.com/Event/Speakers.aspx#AlainTadros"&gt;&lt;em&gt;Lino Tadros &lt;/em&gt;&lt;/a&gt;&lt;em&gt;-&lt;/em&gt; Ajax sometimes can be slower, really. Good talk and demos.&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.devreach.com/Event/Sessions.aspx#hall4_3"&gt;Introduction to Test-Driven Development &lt;/a&gt;&lt;em&gt;by &lt;/em&gt;&lt;a href="http://www.devreach.com/Event/Speakers.aspx#StephenForte"&gt;&lt;em&gt;Stephen Forte &lt;/em&gt;&lt;/a&gt;&lt;em&gt;-&lt;/em&gt; An introduction in TDD, One gem from it was Stephen telling us how to sell TDD to managers - just create regression bugs. Unfortunately Stephen did not tell that TDD is more about about design than testing but another presenter did that in a later session.&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.devreach.com/Event/Sessions.aspx#hall4_4"&gt;Pragmatic ASP.NET Tips, Tricks, and Tools, Part 1 &lt;/a&gt;and &lt;a href="http://www.devreach.com/Event/Sessions.aspx#hall4_5"&gt;Pragmatic ASP.NET Tips, Tricks, and Tools, Part 2 &lt;/a&gt;&lt;i&gt;by &lt;/i&gt;&lt;a href="http://www.devreach.com/Event/Speakers.aspx#JoelSemeniuk"&gt;&lt;em&gt;Steven Smith &lt;/em&gt;&lt;/a&gt;&lt;em&gt;-&lt;/em&gt; some useful tips here. This was actually the most practical talk I attended.&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.devreach.com/Event/Sessions.aspx#hall4_6"&gt;Designing for Testability &lt;/a&gt;&lt;em&gt;by &lt;/em&gt;&lt;a href="http://www.devreach.com/Event/Speakers.aspx#HadiHariri"&gt;&lt;em&gt;Hadi Hariri &lt;/em&gt;&lt;/a&gt;&lt;em&gt;-&lt;/em&gt; very good lecture, though it did not turn as interactive as the presenter expected. I am becoming increasingly interested in inversion of control.&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.devreach.com/Event/Sessions.aspx#hall2_8"&gt;SQL Reporting Services 2005 and What's New in 2008 &lt;/a&gt;&lt;em&gt;by &lt;/em&gt;&lt;a href="http://www.devreach.com/Event/Speakers.aspx#RemiCaron"&gt;&lt;em&gt;Remi Caron &lt;/em&gt;&lt;/a&gt;&lt;em&gt;- I&lt;/em&gt; had used RS 2005, but this talk was not for me. SQLRS is not the best tool at the market, but I guess it is popular in Microsoft shops.&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.devreach.com/Event/Sessions.aspx#hall4_8"&gt;Effective Risk Management With and Without Team Foundation Server 2008 &lt;/a&gt;&lt;em&gt;by &lt;/em&gt;&lt;a href="http://www.devreach.com/Event/Speakers.aspx#TadeuszGolonka"&gt;&lt;em&gt;Tadeusz Golonka &lt;/em&gt;&lt;/a&gt;&lt;em&gt;-&lt;/em&gt; the presenter English was really unique. There were a few good ideas how to measure and manage risk.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: I am pleased that for the first time I saw presenters who used ReSharper in their demos &lt;a href="http://www.devreach.com/Event/Speakers.aspx#JoelSemeniuk"&gt;&lt;em&gt;Steven Smith &lt;/em&gt;&lt;/a&gt; and &lt;a href="http://www.devreach.com/Event/Speakers.aspx#HadiHariri"&gt;&lt;em&gt;Hadi Hariri&lt;/em&gt;&lt;/a&gt;. Both of them used a dark scheme for VS.NET. Unfortunately people complained and they had to switch to the default colors.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-207966519196534448?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/207966519196534448/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=207966519196534448&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/207966519196534448'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/207966519196534448'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2008/10/devreach-2008.html' title='DevReach 2008'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-242568183634053713</id><published>2008-03-12T14:09:00.002+02:00</published><updated>2008-03-12T14:54:13.369+02:00</updated><title type='text'>XmlWriter design flaws</title><content type='html'>I was very surprised to see an &lt;span style="font-weight: bold;"&gt;XmlException &lt;/span&gt;(hexadecimal value... is invalid character) when using a &lt;span style="font-weight: bold;"&gt;XmlReader &lt;/span&gt;on a XML file that was generated using a &lt;span style="font-weight: bold;"&gt;XmlTextWriter&lt;/span&gt;. It turned out that the method &lt;span style="font-weight: bold;"&gt;WriteString&lt;/span&gt;(String) does not check for some special characters and an invalid XML document might get generated. See details &lt;a href="http://msdn2.microsoft.com/en-us/library/k1y7hyy9%28VS.71%29.aspx?topic=306132"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The recommended workaround was subclassing &lt;span style="font-weight: bold;"&gt;XmlTextWriter &lt;/span&gt;and overriding &lt;span style="font-weight: bold;"&gt;WriteString&lt;/span&gt;() to handle this characters (remove or substitute the invalid characters). &lt;span style="font-weight: bold;"&gt;XmlTextWriter &lt;/span&gt;constructors accept parameters like &lt;span style="font-weight: bold;"&gt;Stream&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;TextWriter&lt;/span&gt;, but there is also a static factory method &lt;span style="font-weight: bold;"&gt;XmlWriter.Create()&lt;/span&gt;, which has overloads that accept an optional &lt;span style="font-weight: bold;"&gt;XmlWriterSettings &lt;/span&gt;parameter. The weird thing is that if no &lt;span style="font-weight: bold;"&gt;XmlWriterSettings &lt;/span&gt;is specified, then the &lt;span style="font-weight: bold;"&gt;Settings &lt;/span&gt;property of the &lt;span style="font-weight: bold;"&gt;XmlWriter &lt;/span&gt;is null and can not be instantiated, since it is readonly. This means that there is no way to create a subclass (e.g. &lt;span style="font-weight: bold;"&gt;SafeXmlTextWriter&lt;/span&gt;), with initialized &lt;span style="font-weight: bold;"&gt;Settings &lt;/span&gt;property. So, if the default settings are not applicable to your situation... well, tough luck, you can not apply the easy fix using the override:&lt;br /&gt;&lt;br /&gt;public override void WriteString(String value)&lt;br /&gt;{&lt;br /&gt;    value = FixInvalidCharacters(value);&lt;br /&gt;    base.WriteString(value);&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-242568183634053713?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/242568183634053713/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=242568183634053713&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/242568183634053713'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/242568183634053713'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2008/03/xmlwriter-design-flaws.html' title='XmlWriter design flaws'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-4107330518429896697</id><published>2008-01-01T19:00:00.000+02:00</published><updated>2008-01-01T19:01:23.021+02:00</updated><title type='text'>Summary of the year 2007</title><content type='html'>&lt;p&gt;2007 seems a rather quiet year in my career (at least blogging-wise). But it  was quiet in a good way :)&lt;/p&gt; &lt;p&gt;It has been 1.5 years since I started working on &lt;a href="http://www.validata.co.uk/"&gt;Validata&lt;/a&gt; product and it continues to be  mentally stimulating and fun. The diverse technologies in the project and the  interesting problems keep me excited about my job. My company has joined a few  projects in the Balkans, so the week before Christmas, I had my first business  trip, ever. I went for Romania and next week I am going again.&lt;/p&gt; &lt;p&gt;I also have started a pet project that requires learning new stuff like  ActiveRecord, Monorail, MySql, JQuery and other good stuff. I really hope to  kick it off to a good start, while I am still on vacation. The more challenging  thing is to make it a habit to have progress each day, no matter how little it  is. I was somewhat unpleasantly surprised when I realized that it has been  almost 3 months of inactivity from my last refining of the project idea. But now  the project has stable foundations, there are no pending major technology  decisions, so the work might just flow...&lt;/p&gt; &lt;p&gt;I have been keeping up with the new .NET stuff mostly from reading my daily  doze of weblogs. I also attended a great seminar in Sofia in October, so the saw  is still being sharpened :)&lt;/p&gt; &lt;p&gt;I have continued to refine my toolbox and programming techniques. I find that  it's worth the temporary discomfort in learning how to use a new tool or  technique.&lt;/p&gt; &lt;p&gt;I have a good feeling about the new year. And I will try to make this a  self-fulfilling prophecy :)&lt;/p&gt;Have a great new year!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-4107330518429896697?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/4107330518429896697/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=4107330518429896697&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/4107330518429896697'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/4107330518429896697'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2008/01/summary-of-year-2007.html' title='Summary of the year 2007'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-1048303984343561747</id><published>2007-10-02T23:13:00.000+03:00</published><updated>2007-10-02T23:47:36.111+03:00</updated><title type='text'>DevReach 2007, Sofia, Bulgaria (Day 2)</title><content type='html'>Just a few quick notes about the session I visited in the Day 2 of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;DevReach&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://devreach.com/Event/Sessions.aspx#hall1_5"&gt;Why Partial Rendering Is Not AJAX&lt;/a&gt;&lt;br /&gt;&lt;em&gt;by Dino &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;Esposito&lt;/span&gt;, Level 300&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Another excellent talk by Dino. I finally cleared some misconceptions in my head about AJAX, partial rendering, update panels and all this stuff. This was a practical talk that will help me a lot when I do AJAX again (the first attempt was a bit unsuccessful, but you know AJAX is not for the faint-hearted).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://devreach.com/Event/Sessions.aspx#hall1_6"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;Silverlight&lt;/span&gt;, Flash on Steroids&lt;/a&gt;&lt;br /&gt;&lt;em&gt;by Lino &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;Tadros&lt;/span&gt;, Level 200&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;An excellent talk, by an honest and humorous speaker. Lino's &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;SL&lt;/span&gt; demo app was simple and well chosen. But &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;Silverlight&lt;/span&gt; is still nor ready for prime time, since the tools are lacking and there are some basic controls missing etc.. (well, when 1.1 is ready, I might take a look at it again).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://devreach.com/Event/Sessions.aspx#hall2_7"&gt;Being Smart About Database Design&lt;/a&gt;&lt;br /&gt;&lt;em&gt;by &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;Vladi&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;Tchalkov&lt;/span&gt;, Level 300&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Very interesting talk about database design considerations:  normalization, domain tables, keys, temporal tables, optimizations.  One of the concepts I found very useful was one idea of how to implement temporal tables with a single table for the whole DB. One repeating thread in the talk was "know the rules so that you know how to break them properly".&lt;br /&gt;&lt;br /&gt;&lt;a href="http://devreach.com/Event/Sessions.aspx#hall4_8"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;RSS&lt;/span&gt;, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;Podcasting&lt;/span&gt;, and Syndication&lt;/a&gt;&lt;br /&gt;&lt;em&gt;by Carl Franklin, Level 200&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;A nice talk by the .NET Rocks host Carl Franklin. I learned about the &lt;a href="http://www.codeplex.com/Argotic/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;Argotic&lt;/span&gt; &lt;/a&gt;.NET library. And Carl was very proud that his .NET rocks feed was valid, while the NY times was not (see &lt;a href="http://feedvalidator.org/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;FeedValidator&lt;/span&gt;&lt;/a&gt;) :)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://devreach.com/Event/Sessions.aspx#hall2_9"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;LINQ&lt;/span&gt; - Deep Dive&lt;/a&gt;&lt;br /&gt;&lt;em&gt;by &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;Branimir&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;Giurov&lt;/span&gt;, Level 400&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;Branimir&lt;/span&gt; covered in detail all types of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;LINQ&lt;/span&gt; (for objects, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;datasets&lt;/span&gt;, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;SQL&lt;/span&gt;, Entities, XML). He showed the cool debugging support. Good stuff, looking forward to using &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_19"&gt;LINQ&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://devreach.com/Event/Sessions.aspx#hall3_10"&gt;A Busy Developer's Guide to Building Windows &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_20"&gt;PowerShell&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_21"&gt;Cmdlets&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;em&gt;by &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_22"&gt;Hristo&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_23"&gt;Deshev&lt;/span&gt;, Level 200&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;My friend &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_24"&gt;Hristo&lt;/span&gt; gave a very interesting talk about &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_25"&gt;PowerShell&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_26"&gt;Cmdlets&lt;/span&gt; (he is also writing a book on &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_27"&gt;PowerShell&lt;/span&gt;, so he knows his stuff). Those &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_28"&gt;Cmdlets&lt;/span&gt; are very fast to build and really powerful. I would like to play with them in case I have to do BAT commands or something more complex.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-1048303984343561747?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/1048303984343561747/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=1048303984343561747&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/1048303984343561747'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/1048303984343561747'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2007/10/devreach-2007-sofia-bulgaria-day-2.html' title='DevReach 2007, Sofia, Bulgaria (Day 2)'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-6936142049336376609</id><published>2007-10-01T18:57:00.000+03:00</published><updated>2007-10-02T23:13:30.344+03:00</updated><title type='text'>DevReach 2007, Sofia, Bulgaria (Day 1)</title><content type='html'>I missed the first DevReach in 2006, but this year I made it to the conference. All of the speakers on Day 1 were really good and they captivated me till the end of each of the sessions. Here is a quick recap of the talks, that I visited.&lt;br /&gt;&lt;br /&gt;Side note: I don't know if it was just for the presentation, but none of the speakers that showed code in VS.NET had ReSharper installed. Just weird! :)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://devreach.com/Event/Sessions.aspx#hall4_1"&gt;Developers are from Mars, Managers are from Venus&lt;/a&gt;&lt;br /&gt;&lt;em&gt;by Chad Hower, Level 200&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;I decided to start with a light and entertaining talk. I definitely got what I came for. Great slides, very humorous presentation... At one point in the presentation Chad asked his audience how many of us work for in a team of more than 10 people and only one guy (out of the fifty in the room) raised his hand. So, yes, there are very few projects that need heavyweight  methodologies meant for building the software analog of aircrafts. Chad said that giving names such as &lt;span style="font-style: italic;"&gt;lightweight &lt;/span&gt;vs &lt;span style="font-style: italic;"&gt;heavyweight &lt;/span&gt;is not very fair, so he used the terms &lt;span style="font-style: italic;"&gt;project-based&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;product-based &lt;/span&gt;methodologies (those were new ones for me).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://devreach.com/Event/Sessions.aspx#hall4_2"&gt;Creating a billion dollar ERP system - case study of Velocity&lt;/a&gt;&lt;br /&gt;&lt;em&gt;by John Waters, Level 300&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;I didn't read the abstract of this talk and was a bit surprised (but in a pleasant way) that it was a very practical talk using a real code base. I finally understood what was the difference between ajax postbacks and ajax call. It was also useful to see how ajax works in practice, where does it make sense to use it and what is the cost of doing so.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://devreach.com/Event/Sessions.aspx#hall1_3"&gt;Challenging ASP.NET/AJAX for Braveheart Developers&lt;/a&gt;&lt;br /&gt;&lt;em&gt;by Dino Esposito, Level 300&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Again I didn't read the abstract carefully and was surprised that the talk was about: HTTP handlers and modules. But this was a very interesting topic that I knew very little about (only ELMAH sounds familiar). Dino gave his talk very passionately and went without hesitation 10 minutes in the coffee break. One cool thing he showed was a HttpModule, that I think it was called ASPExlorer). It got activated by appending a parameter in the querystring "source=true" and it made the HTTP response return useful information about the requested page: its assembly file path, its dependencies, its source code, etc... Pretty cool way for troubleshooting in production environment.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://devreach.com/Event/Sessions.aspx#hall1_4"&gt;Scaling Habits of ASP.NET Applications&lt;/a&gt;&lt;br /&gt;&lt;em&gt;by Richard Campbell, Level 300&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Richard (whom I have listened to a lot in .NET Rocks) was probably the most eloquent and artistic speaker. He definitely knew his stuff, too. His session was definitely useful since I was unaware about a lot of stuff concerning ASP.NET scalability and performance. One quote worth remembering: "Computers are amplifiers - they just amplify the developer's intelligence or stupidity!"&lt;br /&gt;&lt;br /&gt;I am sure that the session in Day 2 will bring more good sessions (just like the ones today)...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-6936142049336376609?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/6936142049336376609/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=6936142049336376609&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/6936142049336376609'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/6936142049336376609'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2007/10/devreach-2007-sofia-bulgaria-day-1.html' title='DevReach 2007, Sofia, Bulgaria (Day 1)'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-6455624275733593253</id><published>2007-07-06T17:18:00.000+03:00</published><updated>2007-09-23T23:43:57.296+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><title type='text'>Blindspot: 'hh' vs 'HH'</title><content type='html'>This is maddening! After working with .NET for more than 3 years, I just realized that I should be using &lt;span style="font-weight: bold;"&gt;HH &lt;/span&gt;(and not &lt;span style="font-weight: bold;"&gt;hh&lt;/span&gt;)&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;to show 0-24 hours in a formatted &lt;span style="font-style: italic;"&gt;DateTime&lt;/span&gt;. It is weird how I held this misconception for such a long time. If my workdays were from 00:00 to 12:00, then this could be justified, but that's definitely not the case...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-6455624275733593253?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/6455624275733593253/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=6455624275733593253&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/6455624275733593253'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/6455624275733593253'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2007/07/blindspot-hh-vs-hh.html' title='Blindspot: &apos;hh&apos; vs &apos;HH&apos;'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-4492047259361574550</id><published>2007-06-29T14:37:00.000+03:00</published><updated>2007-06-29T15:32:56.492+03:00</updated><title type='text'>Do you like surprises?</title><content type='html'>Tony Robbins asked his audience in &lt;a href="http://www.ted.com/index.php/talks/view/id/96"&gt;a TED talk&lt;/a&gt; if they like surprises. He received a resounding "YEAH", but he continued with the comment: "BULL****, people like only the surprises they expect". Let me tell you about two developer's surprises from yesterday (I guess, I didn't like those much):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Javascript Surprise:&lt;/span&gt; In a ASP.NET project I had to implement a client-side filtering of table rows. I registered a javascript array with values to be compared. Since it was very slow I decided to sort the array server-side and use binary search client-side. The script ran much faster, but in some cases it didn't work as expected. The surprise factor turned out to be that .NET and javascript did string comparison in different way, so the array was not sorted correctly ("A" &lt; "b" in .NET but"A" &gt; "b" in Javascript).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Oracle Surprise:&lt;/span&gt; I use &lt;span style="font-style: italic;"&gt;tnsnames.ora&lt;/span&gt; to connect to Oracle and &lt;span style="font-style: italic;"&gt;tnsping.exe&lt;/span&gt; tells me to what service I am currently connected to. It turned out that this is not always reliable if you have multiple tnsnames.ora. So, I have been working for quite a long time on a database that was not the one I expected. More info on the topic &lt;a href="http://catherinedevlin.blogspot.com/2006/10/oracle-net-unaccountability.html"&gt;here &lt;/a&gt;and &lt;a href="http://www.dbforums.com/archive/index.php/t-1298850.html"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The developer's job is not short of surprises, so better approach them with eagerness or join a club like &lt;a href="http://forums.worsethanfailure.com/forums/thread/25910.aspx"&gt;this one&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-4492047259361574550?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/4492047259361574550/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=4492047259361574550&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/4492047259361574550'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/4492047259361574550'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2007/06/do-you-like-surprises.html' title='Do you like surprises?'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-4842018777537587243</id><published>2007-06-22T18:18:00.001+03:00</published><updated>2007-07-06T15:39:26.011+03:00</updated><title type='text'>Becoming VS.NET Keyboard Jedi</title><content type='html'>After improving my general typing speed, getting more comfortable with the keybaord and obtaining a MS Natural Ergo 4000 keyboard, the next step to increase my productivity at work is to do more in VS.NET without using the mouse device.&lt;br /&gt;&lt;br /&gt;I will need some discipline to leave the mouse navigation habit behind, but I think it will be worth it. The preconditions for a successful migration are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Roy's &lt;a href="http://weblogs.asp.net/rosherove/archive/2007/06/03/train-to-be-a-keyboard-master-with-keyboard-jedi.aspx"&gt;Keyboard Jedi&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Learning the shortcuts: VS.NET and &lt;a href="http://www.jetbrains.com/resharper/documentation/20_DefaultKeymap.pdf"&gt;Resharper&lt;/a&gt;&lt;/li&gt;&lt;li&gt;One week commitment - if I don't feel comfortable in a week with the keys, I don't plan to be extra stubborn&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;I will report on my progress next Friday :)&lt;br /&gt;&lt;br /&gt;UPDATE: Next Friday's report: It turned out that I found it impractical to abandon the mouse completely. In a lot of cases reaching to the mouse was easier: navigating through various VS.NET windows, running rarely-used commands, etc. On the bright side, I succeeded to replace some mouse movements with the corresponding key strokes both in VS.NET and in other applications. Now I find it natural to navigate through text and select text with the keyboard.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-4842018777537587243?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/4842018777537587243/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=4842018777537587243&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/4842018777537587243'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/4842018777537587243'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2007/06/becoming-vsnet-keyboard-jedi.html' title='Becoming VS.NET Keyboard Jedi'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-294270749015428170</id><published>2007-04-01T01:08:00.000+03:00</published><updated>2007-04-01T01:23:38.047+03:00</updated><title type='text'>Cool: Design Your T-Shirt Online</title><content type='html'>I just stumbled upon a great site &lt;a href="http://www.click-shirt.com/"&gt;http://www.click-shirt.com/&lt;/a&gt; where you can design your own T-Shirt online with an amazing Flash &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_0"&gt;interface&lt;/span&gt; - it puts you in a creative mood, right away.&lt;br /&gt;&lt;br /&gt;I could not help it and started with a standard template. In 10 minutes came up with this crazy T-Shirt design...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_wuDhHfQy0oA/Rg7cTsC4iBI/AAAAAAAAAAM/BYKfT2jHpac/s1600-h/myT-Shirt.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 357px; height: 208px;" src="http://3.bp.blogspot.com/_wuDhHfQy0oA/Rg7cTsC4iBI/AAAAAAAAAAM/BYKfT2jHpac/s320/myT-Shirt.JPG" alt="" id="BLOGGER_PHOTO_ID_5048214463127783442" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Don't ask what all of this means! There is a deep and profound explanation for each of the symbols, letters, graphics you see, but I am yet to figure it out... &lt;br /&gt;&lt;br /&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;Hmm&lt;/span&gt;, I better get some sleep and in the morning I may censor this post, since it is way off topic. But on the other hand it supports may intention to start adding more visual elements to my posts, so I'll better leave it here as a reminder.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-294270749015428170?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/294270749015428170/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=294270749015428170&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/294270749015428170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/294270749015428170'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2007/04/cool-design-your-t-shirt-online.html' title='Cool: Design Your T-Shirt Online'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_wuDhHfQy0oA/Rg7cTsC4iBI/AAAAAAAAAAM/BYKfT2jHpac/s72-c/myT-Shirt.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-4133812849541185024</id><published>2007-03-24T12:02:00.000+02:00</published><updated>2007-03-24T12:42:01.346+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>Controlling the number of active users of an ASP.NET application</title><content type='html'>Last week out team had to implement a requirement that limits the number of concurrent active users of an ASP.NET application. In order to deal with concurrent users, there should be a continuous interaction between the user and the &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_0"&gt;application&lt;/span&gt;, which does not match very well the essence of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;web&lt;/span&gt; applications: request-response. Since our app is meant to be an intranet application (used mostly like a desktop app), such a &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_2"&gt;licensing&lt;/span&gt; scheme makes some sense. And the concept of an ASP.NET session denotes a continuous communication, so it provided a good way of determining who is an active user and who is not.&lt;br /&gt;&lt;br /&gt;I was surprised that I could not find a way to directly control the active ASP.NET sessions - e.g. kill a session (by its &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;SessionID&lt;/span&gt;), get the session data, etc. As a workaround, we used a two-step process: keep the IDs of the active sessions in a "session manager" and when some event occurs (e.g. the max number of concurrent users is reached) mark a session "to be killed". That's how the next request from a "to be killed" session, forces the session to be abandoned.&lt;br /&gt;&lt;br /&gt;This schema worked nicely, until we noticed that closing the browser and reopening it again caused a new session to be registered in our "session manager". The previous one remained alive since the ASP.NET application did not know that the user had closed his browser (ASP.NET session ID cookie is stored only in browser memory, so it gets lost). So we came up with another workaround and used a persistent cookie to identify that the user has finished a session and started a new one.&lt;br /&gt;&lt;br /&gt;The thing that I don't quite like, is that we started with a simple problem and developed a pretty complex solution. I wonder if there was a more elegant way to deal with the concurrent users issue.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-4133812849541185024?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/4133812849541185024/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=4133812849541185024&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/4133812849541185024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/4133812849541185024'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2007/03/controlling-number-of-active-users-of.html' title='Controlling the number of active users of an ASP.NET application'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-117371554999849111</id><published>2007-03-12T19:05:00.000+02:00</published><updated>2007-03-15T12:27:00.441+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vs.net'/><title type='text'>VS.NET 2005 Macro For Removing Unnecessary Projects From A Solution</title><content type='html'>&lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="color:#000000;"&gt;I usually work with a pretty large VS.NET solution. Currently It contains 60 projects and I don't need them all of the time. To ease the solution loading and help VS.NET add-ins like ReSharper load and function faster, it is a good idea to split this solution into several smaller ones. Since the projects interdependencies are not that simple, I decided to automate the process of creating the smaller solutions. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="color:#000000;"&gt;The macro below finds all projects referenced of the selected ones and removes the other projects from the solution. Then you one can do "Save as" and use the shrinked solution. U&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="color:#000000;"&gt;se &lt;strong&gt;ShowAllReferencedProjects&lt;/strong&gt;() for displaying the projects that will remain after the operation and &lt;strong&gt;RemoveAllProjectsUnusedByActiveProjects&lt;/strong&gt;() for the actual removal (you will be asked if you are sure you want to do that).&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="color:#000000;"&gt;&lt;strong&gt;Note&lt;/strong&gt;: Excuse my VB, I have not exercised my VB skills, since doing some VB6 coding more than two years ago. The part that was most fun and challenging was not VB, but exploring the VS.NET object model - surprisingly the resources on this topic were a little scarce.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="color:#000000;"&gt;&lt;strong&gt;Disclaimer&lt;/strong&gt;: Use the code at your own risk! (well, it can't really do much harm, since it does not save the solution automatically).&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="color:#000000;"&gt;&lt;span style="color:#ff0000;"&gt;&lt;strong&gt;UPDATE&lt;/strong&gt;&lt;/span&gt;: Well, actually  &lt;strong&gt;RemoveAllProjectsUnusedByActiveProjects() &lt;/strong&gt;can affect some of  the project files, since the order of removal turned out to be important  (removing a referenced projects, shortens the reference lists of other project).  This issue is fixable, but currently I don't have the time to fix it :) Moreover  the operation is very slow so it might be easier to add projects to a blank  solution instead of removing them from existing solution. Actually, the best way to handle  this task is on a file level, where you need a parser for solution and  project files. Parsing those files will not be that trivial and I had not  been able to find such parsers online. Looks like a good idea for a pet project :)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;Imports&lt;/span&gt; System&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;Imports&lt;/span&gt; EnvDTE&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;Imports&lt;/span&gt; EnvDTE80&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;Imports&lt;/span&gt; System.Collections.Generic&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;Imports&lt;/span&gt; System.Diagnostics&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;Imports&lt;/span&gt; System.Windows.Forms&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;Public&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Module&lt;/span&gt; VsProjectsManagement&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;Public&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Sub&lt;/span&gt; RemoveAllProjectsUnusedByActiveProjects()&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Dim&lt;/span&gt; unusedProjects &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; List(&lt;span style="color: rgb(0, 0, 255);"&gt;Of&lt;/span&gt; VSLangProj.VSProject) = FindAllProjectsUnusedByActiveProjects()&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;If&lt;/span&gt; unusedProjects.Count = 0 &lt;span style="color: rgb(0, 0, 255);"&gt;Then&lt;br /&gt;&lt;/span&gt;            MessageBox.Show(&lt;span style="color: rgb(128, 0, 0);"&gt;"There are no unused projects for the current project selection"&lt;/span&gt;)&lt;br /&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;Exit&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Sub&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;End&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;If&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Dim&lt;/span&gt; s &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;String&lt;br /&gt;&lt;/span&gt;        s = &lt;span style="color: rgb(128, 0, 0);"&gt;"Do you want to remove the following "&lt;/span&gt; &amp; unusedProjects.Count &amp;amp; &lt;span style="color: rgb(128, 0, 0);"&gt;" projects from the solution: "&lt;/span&gt; _&lt;br /&gt;            &amp; GetProjectNames(unusedProjects) &amp;amp; &lt;span style="color: rgb(128, 0, 0);"&gt;"?"&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;If&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Not&lt;/span&gt; DialogResult.Yes = MessageBox.Show(s, &lt;span style="color: rgb(128, 0, 0);"&gt;"Unused projects removal"&lt;/span&gt;, MessageBoxButtons.YesNo, MessageBoxIcon.Question) &lt;span style="color: rgb(0, 0, 255);"&gt;Then&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;Exit&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Sub&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;End&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;If&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;        RemoveProjectsFromSolution(unusedProjects)&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;End&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Sub&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;Public&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Sub&lt;/span&gt; ShowAllReferencedProjects()&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Dim&lt;/span&gt; usedProjects &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; List(&lt;span style="color: rgb(0, 0, 255);"&gt;Of&lt;/span&gt; VSLangProj.VSProject)&lt;br /&gt;        usedProjects = FindAllProjectsReferencedByActiveProjects()&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Dim&lt;/span&gt; s &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;String&lt;br /&gt;&lt;/span&gt;        s = &lt;span style="color: rgb(128, 0, 0);"&gt;"The selected project(s) reference total of "&lt;/span&gt; &amp; &lt;span style="color: rgb(0, 0, 255);"&gt;CStr&lt;/span&gt;(usedProjects.Count) _&lt;br /&gt;             &amp; &lt;span style="color: rgb(128, 0, 0);"&gt;" projects in the solution: "&lt;/span&gt; &amp; GetProjectNames(usedProjects)&lt;br /&gt;&lt;br /&gt;        MessageBox.Show(s, &lt;span style="color: rgb(128, 0, 0);"&gt;"Referenced projects"&lt;/span&gt;)&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;End&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Sub&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;Sub&lt;/span&gt; RemoveProjectsFromSolution(&lt;span style="color: rgb(0, 0, 255);"&gt;ByVal&lt;/span&gt; projects &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; List(&lt;span style="color: rgb(0, 0, 255);"&gt;Of&lt;/span&gt; VSLangProj.VSProject))&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;For&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Each&lt;/span&gt; vsProject &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; VSLangProj.VSProject &lt;span style="color: rgb(0, 0, 255);"&gt;In&lt;/span&gt; projects&lt;br /&gt;            DTE.Solution.Remove(vsProject.Project)&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Next&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;End&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Sub&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;Function&lt;/span&gt; GetProjectNames(&lt;span style="color: rgb(0, 0, 255);"&gt;ByVal&lt;/span&gt; projects &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; List(&lt;span style="color: rgb(0, 0, 255);"&gt;Of&lt;/span&gt; VSLangProj.VSProject)) &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;String&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Dim&lt;/span&gt; projectNames &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; List(&lt;span style="color: rgb(0, 0, 255);"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;String&lt;/span&gt;) = &lt;span style="color: rgb(0, 0, 255);"&gt;New&lt;/span&gt; List(&lt;span style="color: rgb(0, 0, 255);"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;String&lt;/span&gt;)(projects.Count)&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;For&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Each&lt;/span&gt; vsProject &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; VSLangProj.VSProject &lt;span style="color: rgb(0, 0, 255);"&gt;In&lt;/span&gt; projects&lt;br /&gt;            projectNames.Add(&lt;span style="color: rgb(128, 0, 0);"&gt;"'"&lt;/span&gt; &amp; vsProject.Project.Name &amp;amp; &lt;span style="color: rgb(128, 0, 0);"&gt;"'"&lt;/span&gt;)&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Next&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;        projectNames.Sort()&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Return&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;String&lt;/span&gt;.Join(&lt;span style="color: rgb(128, 0, 0);"&gt;", "&lt;/span&gt;, projectNames.ToArray())&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;End&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Function&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;Function&lt;/span&gt; FindAllProjectsUnusedByActiveProjects() &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; List(&lt;span style="color: rgb(0, 0, 255);"&gt;Of&lt;/span&gt; VSLangProj.VSProject)&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Dim&lt;/span&gt; allVsProjects &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; List(&lt;span style="color: rgb(0, 0, 255);"&gt;Of&lt;/span&gt; VSLangProj.VSProject)&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Dim&lt;/span&gt; vsProject &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; VSLangProj.VSProject&lt;br /&gt;&lt;br /&gt;        allVsProjects = FindAllVsProjectsInSolution()&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;If&lt;/span&gt; (allVsProjects.Count = 0) &lt;span style="color: rgb(0, 0, 255);"&gt;Then&lt;br /&gt;&lt;/span&gt;            Debug.WriteLine(&lt;span style="color: rgb(128, 0, 0);"&gt;"There are no Projects In Solution"&lt;/span&gt;)&lt;br /&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;Exit&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Function&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;End&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;If&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Dim&lt;/span&gt; allActiveAndReferencedProject &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; List(&lt;span style="color: rgb(0, 0, 255);"&gt;Of&lt;/span&gt; VSLangProj.VSProject)&lt;br /&gt;        allActiveAndReferencedProject = FindAllProjectsReferencedByActiveProjects()&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Return&lt;/span&gt; DifferenceProjects(allVsProjects, allActiveAndReferencedProject)&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;End&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Function&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;Function&lt;/span&gt; DifferenceProjects(&lt;span style="color: rgb(0, 0, 255);"&gt;ByVal&lt;/span&gt; mainSet &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; List(&lt;span style="color: rgb(0, 0, 255);"&gt;Of&lt;/span&gt; VSLangProj.VSProject), &lt;span style="color: rgb(0, 0, 255);"&gt;ByVal&lt;/span&gt; setToRemove &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; List(&lt;span style="color: rgb(0, 0, 255);"&gt;Of&lt;/span&gt; VSLangProj.VSProject)) &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; List(&lt;span style="color: rgb(0, 0, 255);"&gt;Of&lt;/span&gt; VSLangProj.VSProject)&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Dim&lt;/span&gt; resultSet &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;New&lt;/span&gt; List(&lt;span style="color: rgb(0, 0, 255);"&gt;Of&lt;/span&gt; VSLangProj.VSProject)&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;For&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Each&lt;/span&gt; vsProject &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; VSLangProj.VSProject &lt;span style="color: rgb(0, 0, 255);"&gt;In&lt;/span&gt; mainSet&lt;br /&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;If&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Not&lt;/span&gt; setToRemove.Contains(vsProject) &lt;span style="color: rgb(0, 0, 255);"&gt;Then&lt;br /&gt;&lt;/span&gt;                resultSet.Add(vsProject)&lt;br /&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;End&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;If&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Next&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Return&lt;/span&gt; resultSet&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;End&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Function&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;Function&lt;/span&gt; FindAllProjectsReferencedByActiveProjects() &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; List(&lt;span style="color: rgb(0, 0, 255);"&gt;Of&lt;/span&gt; VSLangProj.VSProject)&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Dim&lt;/span&gt; activeVSProjects &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; List(&lt;span style="color: rgb(0, 0, 255);"&gt;Of&lt;/span&gt; VSLangProj.VSProject)&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Dim&lt;/span&gt; allActiveAndReferencedProject &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;New&lt;/span&gt; List(&lt;span style="color: rgb(0, 0, 255);"&gt;Of&lt;/span&gt; VSLangProj.VSProject)&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Dim&lt;/span&gt; vsProject &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; VSLangProj.VSProject&lt;br /&gt;&lt;br /&gt;        activeVSProjects = FindAllActiveVsProjects()&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;If&lt;/span&gt; (activeVSProjects.Count = 0) &lt;span style="color: rgb(0, 0, 255);"&gt;Then&lt;br /&gt;&lt;/span&gt;            Debug.WriteLine(&lt;span style="color: rgb(128, 0, 0);"&gt;"Please select one or more projects in the solution"&lt;/span&gt;)&lt;br /&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;Exit&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Function&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;End&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;If&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 128, 0);"&gt;' fill first the initial selected projects&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;For&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Each&lt;/span&gt; vsProject &lt;span style="color: rgb(0, 0, 255);"&gt;In&lt;/span&gt; activeVSProjects&lt;br /&gt;            allActiveAndReferencedProject.Add(vsProject)&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Next&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 128, 0);"&gt;' find all referenced projects recursively&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;For&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Each&lt;/span&gt; vsProject &lt;span style="color: rgb(0, 0, 255);"&gt;In&lt;/span&gt; activeVSProjects&lt;br /&gt;            FindAndFillReferencedProjects(vsProject, allActiveAndReferencedProject)&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Next&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Return&lt;/span&gt; allActiveAndReferencedProject&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;End&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Function&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;Function&lt;/span&gt; FindAllVsProjectsInSolution() &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; List(&lt;span style="color: rgb(0, 0, 255);"&gt;Of&lt;/span&gt; VSLangProj.VSProject)&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Dim&lt;/span&gt; usedVSProjects &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;New&lt;/span&gt; List(&lt;span style="color: rgb(0, 0, 255);"&gt;Of&lt;/span&gt; VSLangProj.VSProject)&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;For&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Each&lt;/span&gt; proj &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; Project &lt;span style="color: rgb(0, 0, 255);"&gt;In&lt;/span&gt; DTE.Solution.Projects&lt;br /&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;If&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;TypeOf&lt;/span&gt; proj.Object &lt;span style="color: rgb(0, 0, 255);"&gt;Is&lt;/span&gt; VSLangProj.VSProject &lt;span style="color: rgb(0, 0, 255);"&gt;Then&lt;br /&gt;&lt;/span&gt;                usedVSProjects.Add(proj.Object)&lt;br /&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;End&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;If&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Next&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Return&lt;/span&gt; usedVSProjects&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;End&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Function&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;Function&lt;/span&gt; FindAllActiveVsProjects() &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; List(&lt;span style="color: rgb(0, 0, 255);"&gt;Of&lt;/span&gt; VSLangProj.VSProject)&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Dim&lt;/span&gt; usedVSProjects &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;New&lt;/span&gt; List(&lt;span style="color: rgb(0, 0, 255);"&gt;Of&lt;/span&gt; VSLangProj.VSProject)&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;For&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Each&lt;/span&gt; proj &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; Project &lt;span style="color: rgb(0, 0, 255);"&gt;In&lt;/span&gt; DTE.ActiveSolutionProjects()&lt;br /&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;If&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;TypeOf&lt;/span&gt; proj.Object &lt;span style="color: rgb(0, 0, 255);"&gt;Is&lt;/span&gt; VSLangProj.VSProject &lt;span style="color: rgb(0, 0, 255);"&gt;Then&lt;br /&gt;&lt;/span&gt;                usedVSProjects.Add(proj.Object)&lt;br /&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;End&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;If&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Next&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Return&lt;/span&gt; usedVSProjects&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;End&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Function&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;Sub&lt;/span&gt; FindAndFillReferencedProjects(&lt;span style="color: rgb(0, 0, 255);"&gt;ByVal&lt;/span&gt; objVSProject &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; VSLangProj.VSProject, &lt;span style="color: rgb(0, 0, 255);"&gt;ByVal&lt;/span&gt; usedVSProjects &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; List(&lt;span style="color: rgb(0, 0, 255);"&gt;Of&lt;/span&gt; VSLangProj.VSProject))&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Dim&lt;/span&gt; referencedVSProject &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; VSLangProj.VSProject&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Dim&lt;/span&gt; proj &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; Project&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;For&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Each&lt;/span&gt; objReference &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; VSLangProj.Reference &lt;span style="color: rgb(0, 0, 255);"&gt;In&lt;/span&gt; objVSProject.References&lt;br /&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;If&lt;/span&gt; objReference.Type = VSLangProj.prjReferenceType.prjReferenceTypeAssembly &lt;span style="color: rgb(0, 0, 255);"&gt;Then&lt;br /&gt;&lt;/span&gt;                proj = objReference.SourceProject&lt;br /&gt;                &lt;span style="color: rgb(0, 0, 255);"&gt;If&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Not&lt;/span&gt; proj &lt;span style="color: rgb(0, 0, 255);"&gt;Is&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Nothing&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Then&lt;br /&gt;&lt;/span&gt;                    &lt;span style="color: rgb(0, 0, 255);"&gt;If&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;TypeOf&lt;/span&gt; proj.Object &lt;span style="color: rgb(0, 0, 255);"&gt;Is&lt;/span&gt; VSLangProj.VSProject &lt;span style="color: rgb(0, 0, 255);"&gt;Then&lt;br /&gt;&lt;/span&gt;                        referencedVSProject = proj.Object&lt;br /&gt;                        &lt;span style="color: rgb(0, 0, 255);"&gt;If&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Not&lt;/span&gt; referencedVSProject &lt;span style="color: rgb(0, 0, 255);"&gt;Is&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Nothing&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Then&lt;br /&gt;&lt;/span&gt;                            &lt;span style="color: rgb(0, 0, 255);"&gt;If&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Not&lt;/span&gt; usedVSProjects.Contains(referencedVSProject) &lt;span style="color: rgb(0, 0, 255);"&gt;Then&lt;br /&gt;&lt;/span&gt;                                &lt;span style="color: rgb(0, 128, 0);"&gt;' Add current and recursively add the others&lt;br /&gt;&lt;/span&gt;                                usedVSProjects.Add(referencedVSProject)&lt;br /&gt;                                FindAndFillReferencedProjects(referencedVSProject, usedVSProjects)&lt;br /&gt;                            &lt;span style="color: rgb(0, 0, 255);"&gt;End&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;If&lt;br /&gt;&lt;/span&gt;                        &lt;span style="color: rgb(0, 0, 255);"&gt;End&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;If&lt;br /&gt;&lt;/span&gt;                    &lt;span style="color: rgb(0, 0, 255);"&gt;End&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;If&lt;br /&gt;&lt;/span&gt;                &lt;span style="color: rgb(0, 0, 255);"&gt;End&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;If&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;End&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;If&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Next&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;End&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Sub&lt;br /&gt;&lt;br /&gt;End&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Module&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-117371554999849111?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/117371554999849111/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=117371554999849111&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/117371554999849111'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/117371554999849111'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2007/03/vsnet-2005-macro-for-removing.html' title='VS.NET 2005 Macro For Removing Unnecessary Projects From A Solution'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-116835522659706002</id><published>2007-01-09T17:07:00.000+02:00</published><updated>2007-02-01T19:38:56.706+02:00</updated><title type='text'>Counting Tools</title><content type='html'>&lt;p&gt;At work, I&amp;nbsp;employ a myriad of tools to get my job done, and I&amp;nbsp;am always trying to&amp;nbsp;add new goodies to my toolbox.&amp;nbsp;Naturally&amp;nbsp;some of the programs I try just don't prove useful enough&amp;nbsp;to stay around for long. To keep my system tidy (mission impossible), occasionally I run &lt;a href="http://www.nirsoft.net/"&gt;MyUninstaller&lt;/a&gt;&amp;nbsp;to remind myself what applications I have installed and eventually&amp;nbsp;remove&amp;nbsp;the ones that I will never use. Recently I noticed&amp;nbsp;that there are 300 installed items (but excluding the security updates there are about&amp;nbsp;200 applications). Since those are only the tools that had been&amp;nbsp;installed using MSI, I guess, that the actual app count is actually greater than 300 (most likely about 400).&lt;/p&gt; &lt;p&gt;But if this post can be useful for anybody, I better include links to&amp;nbsp;some of my recent additions to my toolbox:&lt;/p&gt; &lt;p&gt;Today I liked a&amp;nbsp;bunch of tiny useful apps from &lt;a href="http://www.donationcoder.com/Software/Skrommel/"&gt;donationcoder&lt;/a&gt;&amp;nbsp;(the list on the site is huge, but only a few apps have a chance to prove useful):&lt;/p&gt; &lt;ul&gt; &lt;li&gt;CAPshift - Ever hit caps lock by accident and not found out until half a page later? CAPshift extends the Caps Lock key by slowing it down, and shows a menu to change the selected text to lowercase, UPPERCASE, TitleCase, iNVERTEDcASE, RaNDoMCaSE or to Replace user defined characters.&lt;/li&gt; &lt;li&gt;StartClock - Shows the current time in the start button.&lt;/li&gt; &lt;li&gt;OpeningHours - Runs a program when inside a certain time interval, and closes it when outside.&lt;/li&gt; &lt;li&gt;LabelControl - Overlays buttons and other controls with a Number for direct access via Ctrl-Number.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Other great tools that deserve&amp;nbsp;mentioning are:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://tools.tortoisesvn.net/StExBar"&gt;StExBar&lt;/a&gt; - The StExBar provides many useful commands for your everyday use of Windows explorer.&amp;nbsp;&lt;em&gt;The best feature&amp;nbsp;is having&amp;nbsp;Ctl+Shift+C for copying path of the selected file.&lt;/em&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://windirstat.info/"&gt;WinDirStat&lt;/a&gt; - WinDirStat is a disk usage statistics viewer and cleanup tool for Microsoft Windows. &lt;em&gt;It is just the best free tool I have tried and it helped me make some space on my disk.&lt;/em&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;And let's throw in&amp;nbsp;some good recent additions to my ever-growing&amp;nbsp;list of killer&amp;nbsp;Firefox extensions:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://roachfiend.com"&gt;ErrorZilla&lt;/a&gt; 0.2 - Implements useful error pages.&lt;/li&gt; &lt;li&gt;&lt;a href="http://conlan89.googlepages.com/"&gt;Link Alert&lt;/a&gt; 0.6.2 - Changes the cursor to indicate the target of a link.&lt;/li&gt; &lt;li&gt;&lt;a href="http://yellow5.us/firefox/linkification/"&gt;Linkification&lt;/a&gt; 1.3.1 - Converts text links into genuine, clickable links.&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.cusser.net"&gt;Disable Targets For Downloads&lt;/a&gt; 1.0.1 - Prevents download links opening a blank window.&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/6471778-116835522659706002?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/116835522659706002/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=116835522659706002&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/116835522659706002'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/116835522659706002'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2007/01/counting-tools.html' title='Counting Tools'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-116765878464969517</id><published>2007-01-01T15:39:00.000+02:00</published><updated>2007-01-03T18:36:05.210+02:00</updated><title type='text'>Summary of the year 2006</title><content type='html'>&lt;p&gt;It is already a &lt;a href="http://immitev.blogspot.com/2006/01/summary-of-year-2005.html"&gt;tradition&lt;/a&gt; to do an opening post that sums up what I have been up to in my professional development in the past year. &lt;/p&gt; &lt;p&gt;It was a pretty interesting year! Finishing off my first project for my (not so new) company, completing another &lt;a href="http://immitev.blogspot.com/2006/03/surprise-project.html"&gt;small one&lt;/a&gt;, and joining a long-term &lt;a href="http://immitev.blogspot.com/2006/05/first-impressions-of-new-project.html"&gt;challenging project&lt;/a&gt; (the biggest one in my career). And some &lt;a href="http://immitev.blogspot.com/2006/02/coding4fun-scheduled-wav-player.html"&gt;coding 4 fun&lt;/a&gt; :)&lt;/p&gt; &lt;p&gt;The biggest change for me this year was entering the world of web programming. ASP.NET made the transition from desktop to web programming pretty smooth, but still there is so much too learn. Using .NET 2.0 and VS.NET 2005 for nearly a full year was valuable experience as well and a pretty enjoyable one, as well.&lt;/p&gt; &lt;p&gt;My skill improvements program this year included learning &lt;a href="http://immitev.blogspot.com/2006/02/touch-typing-week-9-overview.html"&gt;touch typing&lt;/a&gt;. I think that the hours invested in it already paid off pretty well.&lt;/p&gt; &lt;p&gt;A couple of computer books that I read and found interesting were &lt;a href="http://immitev.blogspot.com/2006/01/working-effectively-with-legacy-code.html"&gt;Working Effectively With Legacy Code&lt;/a&gt; and &lt;a href="http://immitev.blogspot.com/2006/01/balancing-agility-and-discipline-book.html"&gt;Balancing Agility And Discipline&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;I also kept investing a lot of time to improve my tools at work (see &lt;a href="http://immitev.blogspot.com/2006/02/launchers-revisited-again.html"&gt;here&lt;/a&gt;, &lt;a href="http://immitev.blogspot.com/2006/05/vsnet-productivity-add-ins-revisited.html"&gt;here&lt;/a&gt;, &lt;a href="http://immitev.blogspot.com/2006/05/replacing-windows-programs.html"&gt;here&lt;/a&gt; and &lt;a href="http://immitev.blogspot.com/2006/06/desktop-search-tools_29.html"&gt;here&lt;/a&gt;).&lt;/p&gt; &lt;p&gt;I have neglected blogging recently since I am prefer to focus on other activities, but this blog is by no means dead. Reducing the fluff and getting to the stuff. Still, I am still an avid blog reader.&lt;/p&gt; &lt;p&gt;I wish everyone a happy, fun, prosperous new year!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-116765878464969517?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/116765878464969517/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=116765878464969517&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/116765878464969517'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/116765878464969517'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2007/01/summary-of-year-2006.html' title='Summary of the year 2006'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-116291925761612658</id><published>2006-11-07T19:07:00.000+02:00</published><updated>2006-11-07T19:07:37.766+02:00</updated><title type='text'>ReSharper 2.5 rulez</title><content type='html'>&lt;p&gt;I am very impressed with the latest ReSharper EAP build, and the &lt;a href="http://www.jetbrains.net/confluence/display/ReSharper/ReSharper+2.5+Roadmap"&gt;roadmap&lt;/a&gt; looks very promising. I especially like the:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Improved find results view  &lt;li&gt;Improved Control+F12 behaviour (I was a fan of Visual Assist Alt + M , but this is even better).  &lt;li&gt;Enhanced context actions and quickfixes (I took a picture of numerous context actions in a single &amp;lt;pretty awful&amp;gt;&amp;nbsp;.cs file)&lt;/li&gt;&lt;/ul&gt;&lt;a href="http://img293.imageshack.us/my.php?image=resharper25contextsn1.png" target="_blank"&gt;&lt;img alt="Free Image Hosting at www.ImageShack.us" src="http://img293.imageshack.us/img293/5520/resharper25contextsn1.th.png" border="0"&gt;&lt;/a&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;More goodies to come! The planned&amp;nbsp;performance improvements are good news since this is the single reason I sometimes turn Resharpet off.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-116291925761612658?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/116291925761612658/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=116291925761612658&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/116291925761612658'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/116291925761612658'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/11/resharper-25-rulez.html' title='ReSharper 2.5 rulez'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-116147347113319627</id><published>2006-10-22T02:31:00.000+03:00</published><updated>2006-10-22T02:31:11.276+03:00</updated><title type='text'>Unimaginable, stupid bug</title><content type='html'>Yesterday I had a crazy debugging session on a simple code that just refused to work. I had a listbox which I wanted to databind to a list of objects. I set its DataSource, but the listbox remained empty. So I began thinking and experimenting:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Maybe the data binding code is somehow wrong? I searched and tried at least four other approaches to databind the list - still empty.&lt;/li&gt;&lt;li&gt;I added the objects to the listbox items collection one by one (no databinding) - still empty.&lt;/li&gt;&lt;li&gt;I added a few random strings to the items collection (the simplest case) - still empty.&lt;/li&gt;&lt;/ol&gt;Debugging the code revealed that the listbox had the proper items, but somehow they were not displayed. Pure evil! I inspected every reference to the listbox to see if I messed up something without intention. I also looked at all properties related to its visual behaviour. Everything seemed OK.&lt;br /&gt;&lt;br /&gt;In desperation I did a little experiment to try to isolate the problem - binding another listbox to another array of object. It worked fine, so I realized that the cause of the problem should be something really stupid. You bet, I was right. &lt;i&gt;&lt;br /&gt;&lt;br /&gt;There was another listbox above mine, which I had accidentally added to the form, and it was hiding it completely&lt;/i&gt;. &lt;br /&gt;&lt;br /&gt;Those evil listbox was never filled with items, so no wonder it was empty. Spending more than an hour on something like this can really be a pain when you you are racing against a deadline, as it was in this case...&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-116147347113319627?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/116147347113319627/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=116147347113319627&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/116147347113319627'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/116147347113319627'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/10/unimaginable-stupid-bug.html' title='Unimaginable, stupid bug'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-116117545934170271</id><published>2006-10-18T15:44:00.000+03:00</published><updated>2006-10-18T15:44:25.540+03:00</updated><title type='text'>A Closer NUnit Relationship</title><content type='html'>&lt;p&gt;I had used NUnit in all of my .NET projects so far, but now I have the chance to become a superuser. We plan to add NUnit integration in our product. I won't go into much detail here, but the idea is that our application will execute NUnit test cases and the results will be saved in a format that is used in our app.&lt;/p&gt; &lt;p&gt;The problem that I face right now is that I hoped that I could use nunit-console to run a test case, but there is no such an option.&amp;nbsp;The atomic unit for execution is a test fixture. Argh, why is this option missing? I doubt it that it was much difficult, since &lt;a href="http://www.adapdev.com/zanebug/1.6.0/ar01s03.html#d0e867"&gt;Zanebug console runner&lt;/a&gt; already has such a feature. So what are my options now:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Use Zanebug (it claims to have NUnit 2.2.7 support)  &lt;li&gt;Search for a better nunit-console replacement (if anybody knows about one, please let me know, btw &lt;a href="http://www.mertner.com/confluence/display/MbUnit/TestExecutionUsingConsoleApplication"&gt;MbUnit console app&lt;/a&gt; options are very limited, too)  &lt;li&gt;Develop a custom nunit-console replacement that fits our needs (probably based on&amp;nbsp;nunit-console code).&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;I hoped I could use the standard nunit-console app, since I would not have to learn the API intricacies and deal with breaking changes in future NUnit versions, but it seems that I am screwed :) &lt;/p&gt; &lt;p&gt;Another problem that I can foresee, is that running multiple test cases one by one, can cause a performance problem if the assembly is loaded and unloaded on each execution. Might be a good idea to come up with a workaround.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-116117545934170271?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/116117545934170271/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=116117545934170271&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/116117545934170271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/116117545934170271'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/10/closer-nunit-relationship.html' title='A Closer NUnit Relationship'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-116003496288697556</id><published>2006-10-05T10:56:00.000+03:00</published><updated>2006-10-05T10:56:02.930+03:00</updated><title type='text'>What I have been doing for a month</title><content type='html'>As I mentioned in a previous &lt;a href="http://immitev.blogspot.com/2006/09/spying-on-myself.html"&gt;post&lt;/a&gt;, I use &lt;a href="http://www.workingprogram.com/qlockwork.html"&gt;QlockWork &lt;/a&gt;to track my activities at work. They had just released version 1.2.0 that fixed a problem that prevented me doing reports. So the first thing I did, after I installed the newest version, was to the a report by application for the last month. Here are the results:&lt;br /&gt;&lt;br /&gt;50% Microsoft Visual Studio 2005&lt;br /&gt;15% Microsoft Outlook&lt;br /&gt;8% Mozilla Firefox&lt;br /&gt;6% Trillian&lt;br /&gt;3% RSS Bandit&lt;br /&gt;3% Windows Explorer&lt;br /&gt;15% Various applications (about 30 of them)&lt;br /&gt;&lt;br /&gt;Am I surprised? Well, I expected VS.NET to have a little more share (though it is defiinitely not my only development tool - the other 30 apps in the various section are a part of my toolbox). Spending 15% in Outlook (10% of which writing) has surpassed my estimations a little - I was expecting 5% less. And spending just 3% in RSS Bandit look like maybe I am not investing enough time on staying up current and well-informed.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-116003496288697556?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/116003496288697556/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=116003496288697556&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/116003496288697556'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/116003496288697556'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/10/what-i-have-been-doing-for-month.html' title='What I have been doing for a month'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-115960906060045886</id><published>2006-09-30T12:37:00.000+03:00</published><updated>2006-10-01T22:05:40.290+03:00</updated><title type='text'>Refactoring Code - How Do You Know You Are Not Breaking It</title><content type='html'>UPDATE: The title of the post should have been "The Cost and Benefits of Emotion-Driven Code Improvements", but since this was an emotional and not well prepared post, I screwed it :) This is the third draft, and finally it looks understandable...&lt;br /&gt;&lt;br /&gt;Last Saturday I felt a strange urge to go to the office and to finish what I had started the previous day. Basically I was frustrated by working with poorly formatted and commented code, that did not follow naming conventions and other good practices. I had also noticed a few flaws in some parts of the code, such as not guarding for exception between IDataReader's Open() and Close() methods (which was easily fixed by enclosing the reader within a &lt;i&gt;using &lt;/i&gt;region) and other exception handling problems.&lt;br /&gt;&lt;br /&gt;I thought that (in the long run) me and the whole team will be spending much more time and energy understanding such code, than the time and energy I wanted to spend to fix it. Yeah, &lt;a href="http://www.codinghorror.com/blog/archives/000684.html"&gt;most of the developer's time is spent reading the code&lt;/a&gt;. With the help of my beloved ReSharper, I reformatted all the code in one of the projects in the solution by fixing spacing, shortening references, removing unnecessary &lt;i&gt;this &lt;/i&gt;qualifiers, removing unused code. Then I did some manual whitespace formatting and finally applied the functional fixes in the code. I did all those things in a single session intending to perform a single checking-in. And you better believe that later it turned out that it is impossible to quickly find what the functional changes were.  No diff tool is that clever to show only the differences that can affect the behaviour of the program.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-weight: bold;"&gt;Lesson learned&lt;/span&gt;:&lt;/i&gt; Separate concerns, do one thing at a time, and checkin after it is completed.&lt;br /&gt;&lt;br /&gt;I waited till Monday for the check-in, in order to get the approval of my PM, since this was not a planned operation. I was not surprised to hear that he was not very enthusiastic about such major code changes - every single file of a project with about 60 files was modified. He asked one of my colleagues to do a review of the changes. I had to explain that this is not as easy as it sounds and I offered an approach that would eliminate the non functional code changes altogether, by looking directly at the generated IL. Well, not the ugly IL itself, but better the output of its decompilation (of course, using Reflector).&lt;br /&gt;&lt;br /&gt;I remembered that there is a Reflector addin, called &lt;a href="http://www.codingsanity.com/diff.htm"&gt;Reflector Diff&lt;/a&gt;. It works very well, but only on per method basis, so it was virtually impossible to inspect all functional changes in a reasonable amount of time. We ended up using a statistical approach, examining just a couple of files and generalizing about the quality of the changes, heh :) Later I got some better ideas, but it was too late: (a) Decompile the old version and the new version of the assembly in separate folders with &lt;a href="http://www.denisbauer.com/NETTools/FileDisassembler.aspx"&gt;Reflector.FileDisassembler &lt;/a&gt;and diff them with a tool that supports folder diffs (like my favorite &lt;a href="http://winmerge.org/"&gt;WinMerge&lt;/a&gt;). (b) Automatically reformat the old code with Resharper and then diff all the files in the folder.&lt;br /&gt;&lt;br /&gt;&lt;i style="font-weight: bold;"&gt;Lesson learned:&lt;/i&gt; After making a mistake, there is often still a chance to find a good enough workaround.  So know your tools and use them creatively.&lt;br /&gt;&lt;br /&gt;After my code changes got approved, I tried to check-in them. Surprisingly it turned out that 3 of the files were already modified by other people and I was faced with the difficult task of merging them. I am not sure how this happened, I am pretty sure that when starting editing a non checked out file, VS.NET takes care to get its latest version before checking it out.&lt;br /&gt;&lt;br /&gt;Unfortunately these were one of the files with the most functional changes in them. The automatic VSS merge naturally could not handle such major changes, so I had to perform it manually. What I did was to find out what the other people's changes were and apply them one by one. I had to be extra careful, so it took two more hours to get it done.&lt;br /&gt;&lt;br /&gt;But there were more surprises in store. During the checkin process I was shown the default VSS merging screen to merge the changes. I knew that the current state of the files was already up-to-date so I chose to Apply all the changes from the right pane. Argh, hete it get very confusing, because it turns out that this operation does not copy the whole file to the merge result. It appears to do something different, so I ended up having a few unused methods in the result files, that were deleted in my version.&lt;br /&gt;&lt;br /&gt;&lt;i style="font-weight: bold;"&gt;Lesson learned:&lt;/i&gt; Know in detail  the behaviour of the tools you use, unless you like surprises :)  When starting a major refactoring make sure that noone else is editing the code.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Aftermath&lt;/span&gt;: I think the mission was a success. Why?&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I can now work on a codebase that makes me feel comfortable and productive.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;I learned a few things along the way that could help do better the next time I have to clean bad looking code. &lt;/li&gt;&lt;li&gt;I had a chance to show my colleagues the power of ReSharper, my standards for good code, and what was the state of our code base (btw, this was one of the best designed and documented parts in the solution). I guess that I should have done that a while ago. In fact I proposed such a course of action few months ago, but I don't think that I pointed clearly what the benefits were. But when people dwell in clean code for some time and see how good code feels, they realize that they don't have to work in the mess, so they are ready to make the necessary effort to do so. &lt;/li&gt;&lt;li&gt;Finally, I was really amazed how productive and energetic I was, when working on something I thought would make a difference.&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/6471778-115960906060045886?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/115960906060045886/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=115960906060045886&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/115960906060045886'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/115960906060045886'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/09/refactoring-code-how-do-you-know-you.html' title='Refactoring Code - How Do You Know You Are Not Breaking It'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-115868197359580020</id><published>2006-09-19T19:06:00.000+03:00</published><updated>2006-09-27T01:19:10.016+03:00</updated><title type='text'>Atlas Woes</title><content type='html'>&lt;p&gt;Today was my second attempt to employ Atlas in the ASP.NET project at work. The first attempt was before my summer vacation when I tried to modify the Login page to use &lt;a href="http://atlas.asp.net/atlastoolkit/CascadingDropDown/CascadingDropDown.aspx"&gt;CascadingDropDown&lt;/a&gt; which is a part of the Atlas Toolkit. For a day and a half I could not get it to work, but at least I got acquainted with Atlas. I eventually figured out what the problem was and it was not Atlas-related. While filling the drpdown for the login info, I was trying calling a web service that redirected me again to the start of the login process :) No wonder I couldn't get it to work.&lt;/p&gt; &lt;p&gt;Today was my second battle with Atlas - again using the CascadingDropDown, but on a different page. This experiment was meant to be simpler than the previous one but it was actually harder. Unfortunately I was getting the cryptic error "Unknown Error" in IE6. I had no idea what it meant, but after some googling and numerous experiments, it revealed to be Atlas related issue (if the EnablePartialRendering is set to false, the problem does not occur).&lt;/p&gt; &lt;p&gt;After more googling I found &lt;a href="http://weblogs.asp.net/hpreishuber/archive/2006/08/23/ATLAS_3A00_-unknown-error-popup-issue.aspx"&gt;this post&lt;/a&gt; and in the comments I noticed a few good tips how to deal with such a problem. I better copy&amp;paste them (with a little rewording to clarify them):&lt;/p&gt; &lt;p&gt;1) Replace Response.Write() with this.Page.RegisterClientScriptBlock(function)&lt;br /&gt;2) Put complex javascript functions in CDATA sections.&lt;br /&gt;3) Check syntax of html, css, javascript&lt;br /&gt;4) Remove characters that cause invalid XML output&lt;br /&gt;5) Try to build pages sometimes with UpdatePanel or sometimes with web methods in aspx page with the use of atlas.js file &amp;amp; javascript functions to call those web method without page refresh. &lt;/p&gt;&lt;p&gt;I am still not able to find the exact place where the error occurs in the page, but now at least I know where I should focus. UPDATE: After spending another half a day trying to resolve the issue, there was no progress at all. We decided to postpone Atlas adoption in the project (probably until the release of an official version). I actually feel good about such course of action. Now we can spend more time on other areas of the product that will make greater difference than a few eliminated postbacks :)&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-115868197359580020?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/115868197359580020/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=115868197359580020&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/115868197359580020'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/115868197359580020'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/09/atlas-woes.html' title='Atlas Woes'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-115858769707311637</id><published>2006-09-18T16:54:00.000+03:00</published><updated>2006-09-18T16:55:05.800+03:00</updated><title type='text'>Question: How Do You Know Your Windows Is Getting Overwhelmed?</title><content type='html'>&lt;p&gt;Answer: When the Start menu fits in 4 columns (I wonder how 5 columns can be displayed on the screen).&lt;/p&gt; &lt;p&gt;P.S. My relief is that I almost never start programs from the Start menu - Launchy and Slickrun are really helpful.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-115858769707311637?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/115858769707311637/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=115858769707311637&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/115858769707311637'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/115858769707311637'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/09/question-how-do-you-know-your-windows.html' title='Question: How Do You Know Your Windows Is Getting Overwhelmed?'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-115823470406735444</id><published>2006-09-14T14:51:00.000+03:00</published><updated>2006-09-14T14:51:44.180+03:00</updated><title type='text'>Spying on myself</title><content type='html'>&lt;p&gt;In the last two months I have been trying out a few programs to record my activities at my computer at work.&amp;nbsp;The first one is&amp;nbsp;&lt;a href="http://www.timesnapper.com/"&gt;TimeSnapper&lt;/a&gt; -&amp;nbsp;which takes snapshots continuously while I am working. &lt;a href="http://www.timesprite.com/index.html"&gt;TimeSprite&lt;/a&gt; and &lt;a href="http://www.workingprogram.com/qlockwork.html"&gt;Qlockwork&lt;/a&gt; are applications for recording&amp;nbsp;the active application&amp;nbsp;and&amp;nbsp;document each N seconds. Later the data can be grouped and&amp;nbsp;visualized as a list, charts,&amp;nbsp;calendar activities.&lt;/p&gt; &lt;p&gt;These tools proved invaluable today when I noticed that I have not been filling in my daily report for about a month (oops!).&amp;nbsp;I quickly&amp;nbsp;turned back time (this reminds me about the &lt;a href="http://www.apple.com/macosx/leopard/timemachine.html"&gt;Time Machine&lt;/a&gt; feature in the upcoming new Mac OS)&amp;nbsp;to find out how I was spending these days. In less than 15 minutes may report was done and was actually pretty accurate. Another benefit for me&amp;nbsp;in using such applications is to become more aware of my working habits and to track where my time goes.&lt;/p&gt; &lt;p&gt;I would recommend using a combination of TimeSnapper (see why/how Jon Galloway is using it &lt;a href="http://weblogs.asp.net/jgalloway/archive/2006/09/11/_5B00_tool_5D00_-TimeSnapper-_2D00_-Never-lose-work-again.aspx"&gt;here&lt;/a&gt;)&amp;nbsp;plus one of the two other applications. I am currently using a beta version Qlockwork, which&amp;nbsp;has some rough edges, but its&amp;nbsp;MS Outlook integration is pretty slick and useful.&amp;nbsp;The good thing is that those apps require non of your attention, unless you want to&amp;nbsp;track not just the active documents, but also the current project you are working on (then you have to set it when switching projects).&lt;/p&gt; &lt;p&gt;P.S. Ha, I didn't know there was a &lt;a href="http://www.imdb.com/title/tt0497309/"&gt;movie&lt;/a&gt; with the same title as my post.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-115823470406735444?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/115823470406735444/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=115823470406735444&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/115823470406735444'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/115823470406735444'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/09/spying-on-myself.html' title='Spying on myself'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-115660247853030873</id><published>2006-08-26T17:27:00.000+03:00</published><updated>2006-08-26T17:27:58.683+03:00</updated><title type='text'>What a work-week</title><content type='html'>&lt;p&gt;This week was a very untypical week. Just back from a one-week vacation, I was faced with the opportunity to work on two projects in parallel.&amp;nbsp;I was continuing my commitment to &lt;a href="http://immitev.blogspot.com/2006/05/first-impressions-of-new-project.html"&gt;the big ongoing project&lt;/a&gt; I am working on and I was also asked to enhance &lt;a href="http://immitev.blogspot.com/2006/03/surprise-project.html"&gt;the little surprise project&lt;/a&gt; that I did a few months ago. When I had to make an&amp;nbsp;estimation, I gave a 8 workdays figure.&lt;/p&gt; &lt;p&gt;This week I was having 2 hours overtime each day and now I am&amp;nbsp;spending the&amp;nbsp;Saturday at the work place. The good thing is that the job is almost done. The funny thing is obviously that it got done for&amp;nbsp;8x2 hours instead&amp;nbsp;of 8x8 hours.&amp;nbsp;Am&amp;nbsp;I such&amp;nbsp;a bad estimator or&amp;nbsp;was I overly cautious about unexpected difficulties (well,&amp;nbsp; they happen in nearly every single project). I guess when you work on your own code only, when the tools are right, when you understand your objectives and the client is responsive and well-meaning, when you are motivated to make it work, it doesn't take that much time.&lt;/p&gt; &lt;p&gt;Generally I don't like doing overtime. And no, that's not because the &lt;a href="http://www.theherald.co.uk/news/68354.html"&gt;Pope says its wrong&lt;/a&gt;&amp;nbsp;-&amp;nbsp;it just feels wrong at the end of the day, or at the end of the week. Hopefully at my job this doesn't happen often, so&amp;nbsp;I can live with it. But if I decide to do it,&amp;nbsp;I find it helpful to shift my focus on how I am making the lives of the project stakeholders better (the client and my boss) and about the opportunity to entertain myself switching tasks and last but not least the financial rewards. And finally it gives me a topic to write about and clear the cobwebs from my blog&amp;nbsp;and to test the wonderful &lt;a href="http://windowslivewriter.spaces.live.com/"&gt;Windows Live Writer&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/6471778-115660247853030873?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/115660247853030873/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=115660247853030873&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/115660247853030873'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/115660247853030873'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/08/what-work-week.html' title='What a work-week'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-115399609614059267</id><published>2006-07-27T16:53:00.000+03:00</published><updated>2006-07-27T16:53:32.723+03:00</updated><title type='text'>Tweaking Performance - Magic Moments</title><content type='html'>Every once in while a developer experiences magic moments. Yesterday I had one. A colleague of mine and I were struggling to improve the performance of a data exporting module of the system. First we tried to measure how bad it is, to give us a baseline. With small amount of data the export took 5 minutes, but with 10 times larger (real world volume) it took forever. On the first attempt after 14 hours of running it had not yet finished and we had to stop it. On the second attempt (on a more powerful machine) it exited within a few hours with OutOfMemoryException. So, our first priority was to reduce the memory demand of the application. &lt;br /&gt;&lt;br /&gt;Initially we started with memory profiling, trying out several commercial profilers. Unfortunately we didn't achieve any clarity (I wonder whose fault is it). So we decided first to think about the code for a while, to analyze what was going on. We refactored parts of it to understand it better and see the big picture.  While doing so, we spotted and fixed a few little annoyances, that caught my eye, and then we concentrated on the big issues. We tried to reach a common understanding about the bottlenecks and the ways to remove them, but I think we got caught in analysis paralysis. None of the ideas seemed worthwhile and the more crazy ideas needed big codebase rework. So in order to reach better clarity, I proposed to get away from it for awhile, and to check how the little fixes we did, affected the performance. My guess was that we had made minor memory and speed improvements. When we executed the small volume data test, it took not 5 minutes, but 20 seconds. Then we tried the real-world test and instead of running for many hours (14+) it completed in just 3 minutes. We stared in amazement and wondered whether we could start celebrating. It seemed too good to be true. &lt;br /&gt;&lt;br /&gt;Today, first thing in the morning, I started a performance profiler on the old version to find out what was slowing it down (I know, I should have started from there). I found that the 90% of the processing time went for concatenating numerous big strings. This was done the wrong way (i.e. s1 += s2).&amp;nbsp; Switching to StringBuilder made a huge difference, but we could actually do without it: the strings just had to be written in a file and there was no need  at all to keep their concatenation in memory. There were a few more things we did to reduce memory, but still trying data that is 3 times the size of the expected real-world volumes gives an OutOfMemoryException. Let's see if we could tweak it more.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-115399609614059267?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/115399609614059267/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=115399609614059267&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/115399609614059267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/115399609614059267'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/07/tweaking-performance-magic-moments.html' title='Tweaking Performance - Magic Moments'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-115323719319837265</id><published>2006-07-19T11:53:00.000+03:00</published><updated>2006-07-22T00:01:10.256+03:00</updated><title type='text'>Improving .NET application performance</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;The last two days I was involved in a somewhat unusual activity - detecting, measuring and clearing performance bottlenecks. I have no real experience in this area (well, recently I diagnosed a performance problem, but it was too obvious - excessive logging in a file, while opening and closing it on each call). So it took some time to familiraize myself with the topic and to try some .NET profilers - &lt;a href="http://www.jetbrains.net/confluence/display/NetProf/Home"&gt;JetBrains DotTrace&lt;/a&gt; and &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=a362781c-3870-43be-8926-862b40aa0cd0&amp;amp;DisplayLang=en"&gt;CLR Profiler.&lt;/a&gt; Unfortunately JetBrains  DotTrace (EAP version) did not help me much - I was having difficult time trying to understand how it works, since the documentation is really scarce at this point. It also crashed while trying to make huge memory dumps (1 GB), so I gave up on it. I looked at &lt;a href="http://www.red-gate.com/products/ants_profiler/ANTSProfilerv2/ANTS_Profiler.html"&gt;Red Ants Profiler video&lt;/a&gt; and it seems a bit better for a newbie, but I have not used it for real, so I can't tell. The CLR Profiler is not a gold-plated tool, but it worked fine and was actually somewhat helpful.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Today I was trying to find out which worked better: &lt;i&gt;(a) &lt;/i&gt;File.ReadAllText() or &lt;i&gt;(b) &lt;/i&gt;calling first File.ReadAllBytes() and then converting them to char[] and then encoding them as UTF8 string. Interestingly, inspecting WorkingSet and GC.GetTotalMemory(false) indicated that the used memory was less after File.ReadAllText(). But the CLR Profiler showed that it has allocated more memory. I wonder how this is possible? Am I measuring the wrong thing or maybe some garbage collection takes place within File.ReadAllText(). The (b) approach is a bit faster than (a), so I ended up using (b). &lt;br /&gt;&lt;br /&gt;UPDATE: actually the (b) approach will not work that easily. There are a few marker bytes in the beginning of some text files that indicate the encoding, so you need an extra processing to make it work.&lt;br /&gt;&lt;br /&gt;Btw, it appears that it is not a good idea to profile .NET application memory using just the the TaskManager. More details &lt;a href="http://www.itwriting.com/dotnetmem.php"&gt;here&lt;/a&gt;.&lt;br /&gt;&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/6471778-115323719319837265?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/115323719319837265/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=115323719319837265&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/115323719319837265'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/115323719319837265'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/07/improving-net-application-performance.html' title='Improving .NET application performance'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-115192735566983385</id><published>2006-07-03T18:59:00.000+03:00</published><updated>2006-07-13T14:39:32.520+03:00</updated><title type='text'>Code Complexity Fun</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;I am starting working on a class that looks cute. Especially two of its functions are especially nice:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Func1 - 9 arguments, 300 LOC&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Func2 - 15 arguments, 1000 LOC&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;I had not met a 1000 LOC function for a few years, so it is fun to see one again :) It even has a parameter about the GuiMode, which tells if it is called in a GUI context or not :) They don't come often better than that :)&lt;br /&gt;&lt;br /&gt;UPDATE: This gets even funnier: Func1 actually used only 2 of its 9 arguments. Func2 had only 4 unused parameters... :) &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/6471778-115192735566983385?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/115192735566983385/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=115192735566983385&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/115192735566983385'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/115192735566983385'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/07/code-complexity-fun.html' title='Code Complexity Fun'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-115174509360182218</id><published>2006-07-01T12:11:00.000+03:00</published><updated>2006-07-04T05:10:55.196+03:00</updated><title type='text'>XML Serialization</title><content type='html'>In the recent days I have been trying out .NET XML serialization with the XmlSerializer class. It has a plenty of limitations (such as not supporting Hashtables, serializing only public properties, etc.), so I find it useful only for simple scenarios. There are available other custom-made alternatives as &lt;a href="http://www.codeproject.com/useritems/CustomXmlSerializer.asp"&gt;CustomXmlSerializer&lt;/a&gt; that look useful. In fact, the default xml serialization can be customized using the interface&amp;nbsp; IXmlSerializable. Unfortunately the xml serialization that is implemented throughout the codebase makes it hard to work seamlessly with the .NET default serialization. And I guess it is not worth the effort (plus there surely is a little performance penalty using reflection).&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-115174509360182218?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/115174509360182218/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=115174509360182218&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/115174509360182218'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/115174509360182218'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/07/xml-serialization.html' title='XML Serialization'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-115152945396040390</id><published>2006-06-29T00:17:00.000+03:00</published><updated>2006-08-01T17:23:58.390+03:00</updated><title type='text'>Desktop search tools</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;It seems that I will be switching to a new desktop search tool. X1 has &lt;a href="http://www.infotoday.com/newsbreaks/nb060619-2.shtml"&gt;released&lt;/a&gt; their &lt;a href="http://www.x1.com/download/"&gt;enterprise client&lt;/a&gt; for free and it looks pretty useful. It is similar to &lt;a href="http://desktop.yahoo.com/"&gt;Yahoo Desktop Search&lt;/a&gt; that I had used for a while (it was built on top of X1) but the original X1 tool has several advantages. It is more customizable and powerful than any of the tools I have tried (MSN Desktop Search, Google Desktop Search). The only things that I don't like about it are:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;missing full unicode/cyrillic support (I can't see any Bulgarian filenames in the results grid)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;missing the standart Explorer context menus on files in search results &lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;missing integration with other tools (e.g. with MSN Desktop Search + FolderShare I can search my computer from any internet-connected computer)&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;But the powerful search capabilities, the great GUI, the ability to search network shares (oops, the network shares are available in the commercial version only) are too compelling reasons to change. &lt;br /&gt;&lt;br /&gt;Btw, a good resource on desktop search tools can be found &lt;a href="http://www.desktopsearchguide.com/reviews.html"&gt;here&lt;/a&gt;. It seems to be regularly updated and can help you decide which tool  &lt;br /&gt;best suits your needs.&lt;br /&gt;&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/6471778-115152945396040390?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/115152945396040390/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=115152945396040390&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/115152945396040390'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/115152945396040390'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/06/desktop-search-tools_29.html' title='Desktop search tools'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-115099103134209267</id><published>2006-06-22T18:43:00.000+03:00</published><updated>2006-06-22T18:43:51.403+03:00</updated><title type='text'>Microsoft DevDays 2006</title><content type='html'>These couple of days I went to Microsoft DevDays 2006. The topics of the lectures I attended were pretty interesting - Windows Vista, .NET 3.0 (WCF, WPF, WWF), Software Factories, MSF 4, VSTS for Testers. &lt;br /&gt;&lt;ul&gt;&lt;li&gt;Windows Vista is pretty exciting, offering a lot of improvements in many areas (well, and some potential annoyances, too).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;VSTS for Testers was an interesting lecture for me, since the project I am currently working on, offers similar functionality. My team even attended a QA seminar last week to get a better feel of the problems of automating testing and the tools available.&lt;br /&gt; &lt;/li&gt;&lt;li&gt;MSF 4 looks interesting, too, especially the Agile part. I think that the practices are more important than the tools, but good tools can definitely help (although VSTS is a bit awkward on demos).&lt;/li&gt;&lt;li&gt;WCF, WPF, WWF - all these things are pretty exciting and definitely have potential. I especially liked the lecture discussing building www.msbgregistration.com using these latest technologies. It was probably the best talk, since it covered a real world example with new technologies and inspired a good Q&amp;amp;A session.&lt;/li&gt;&lt;/ul&gt;Overall the event was nice, though there were a few organizational aspects that were not very well thought of. I guess I would go the next year, too. And I will definietly go back to Arena cinema, where the conference was held, having two movie tickets to spend :)&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-115099103134209267?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/115099103134209267/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=115099103134209267&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/115099103134209267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/115099103134209267'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/06/microsoft-devdays-2006.html' title='Microsoft DevDays 2006'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-115037930081545400</id><published>2006-06-15T16:48:00.000+03:00</published><updated>2006-06-15T16:48:20.840+03:00</updated><title type='text'>I knew the project would be fun</title><content type='html'>When I started working on my new project a month ago, I &lt;a href="http://blogs.msdn.com/andypennell/archive/2006/06/14/631836.aspx"&gt;noted&lt;/a&gt; that it uses great variety of technologies, so I wouldn't be bored to death. Now I know I was right. The first month I did mostly ASP.NET development, which was interesting since my experience with it was very little. In the begining there were a lot of small frustrations here and there, while figuring out why some things misbehave, but those moments are now very rare. &lt;br /&gt;&lt;br /&gt;In the last two days I did some totally new things for me. Yesterday it was XSL transformation (VS.NET 2005 helped a lot there) and today it was Ajax. The Ajax thing was powered by &lt;a href="http://www.autosuggestbox.com/"&gt;AutoSuggestBox&lt;/a&gt; and even though it was not a rocket science it felt refreshing. I was implementing a search-as-you-type functionality. It was of the simplest kind: just find those names who start with the input letters. I wonder if we should make it powerful like &lt;a href="http://blogs.jetbrains.com/dotnet/2006/06/what-is-your-favorite-feature-in-resharper/"&gt;Resharper's Ctrl+N&lt;/a&gt; but since the product is not intented for developers, it might be better to stick to a simple way.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-115037930081545400?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/115037930081545400/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=115037930081545400&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/115037930081545400'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/115037930081545400'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/06/i-knew-project-would-be-fun.html' title='I knew the project would be fun'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-114962711585325032</id><published>2006-06-11T21:58:00.000+03:00</published><updated>2007-03-13T22:42:21.701+02:00</updated><title type='text'>VS.NET too clever</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;VS.NET 2003 has a bit confusing feature in the Solution Explorer. It groups three files as one : the asp.net page, the code-behind file and the .resx file. I have not found a way to turn off that clever option (UPDATE: actually there is an option "Show All Files", which I will be definitely using, see a picture &lt;a href="http://weblogs.asp.net/scottgu/archive/2005/08/26/423730.aspx"&gt;here&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;So I got burnt today by this feature when I was editing a code-behind file. I was not sure what I had checked in, so I wanted to see if the local version was different from the VSS version by clicking "Compare versions". I was informed that there are no changes and I did an undo checkout operation. Then I realized that I have been comparing thes .aspx file and not the .cs file. Argh! I spent another 30 minutes or so redoing the edits. On the good side: the edits turned out even better than the first time. It is a good practice to throw away some code after it is initially written and start it all over.&lt;br /&gt;&lt;br /&gt;P.S. I wonder why I can't find a tool that backups all the pending checkins in VS.NET. This is definitely something my colleagues and I would like to use, since a little mistake with VSS can lead to loss of code. I have the feeling that a simple macro might do the job, but I am not sure if this functionality is covered in the extensibility. Also, the Pending Checkins window could become a lot more useful, if the context menu on its files, included all the options that are available in the Solution Explorer (VS.NET 2005 seems to solve at least partially this problem).&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/6471778-114962711585325032?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/114962711585325032/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=114962711585325032&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114962711585325032'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114962711585325032'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/06/vsnet-too-clever.html' title='VS.NET too clever'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-114897005650508033</id><published>2006-05-30T09:20:00.000+03:00</published><updated>2006-05-30T20:22:58.990+03:00</updated><title type='text'>ASP.NET chapter completed</title><content type='html'>Yesterday I did the last revision of the ASP.NET chapter of the &lt;a href="http://devbg.org/dotnetbook/"&gt;Bulgarian .NET book&lt;/a&gt;. It turned out to be about 100 pages and I guess it could well be 10 times bigger. I realize that we can cover only the basics of ASP.NET development, but I think that the chapter gives a good overview of the topic. Since the chapter was developed in parallel by four people before I took over for the final edits, there were a lot of stylistic inconsistencies and repetitions and so on. It took several revisions to take care of them, but now that the content is pretty consistent and the information flows in a way that makes sense most of the time. Well, there are still some rough edges, but better release something now than wait forever. The second volume of the book could have been out a few months earlier. Now .NET 2.0 has gained a lot of momentum and writing about .NET 1.1 will have very short-term value, though in reality a lot of projects that were started with .NET 1.1 might never transition to .NET 2.0. I am pretty happy with volunteering for this chapter, since now the second volume can be at least uploaded online and sooner or later the printed edition will be released.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-114897005650508033?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/114897005650508033/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=114897005650508033&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114897005650508033'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114897005650508033'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/05/aspnet-chapter-completed.html' title='ASP.NET chapter completed'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-114884871930261987</id><published>2006-05-28T23:38:00.000+03:00</published><updated>2006-05-28T23:38:39.313+03:00</updated><title type='text'>Firefox Configuration Revisited</title><content type='html'>It has been a while since I &lt;a href="http://immitev.blogspot.com/2006/02/my-firefox-configuration.html"&gt;posted &lt;/a&gt;my Firefox configuration, so let's do it again (btw, this is might config at home, which is slightly more crowded than the one at work). &lt;br /&gt;&lt;br /&gt;&lt;span class="GeneratedHeader"&gt;Generated:&lt;/span&gt; Sun May 28 2006 23:31:24 GMT+0300 (FLE Standard Time)&lt;br /&gt;&lt;br /&gt;&lt;span class="UserAgentHeader"&gt;User Agent:&lt;/span&gt; Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.3) Gecko/20060426 Firefox/1.5.0.3&lt;br /&gt;&lt;br /&gt;&lt;span class="BuildIDHeader"&gt;Build ID:&lt;/span&gt; 2006042618&lt;br /&gt;&lt;br /&gt;&lt;span class="ExtensionHeader"&gt;Enabled Extensions:&lt;/span&gt; [32]&lt;ul&gt;&lt;li&gt; &lt;a href="http://adblock.mozdev.org" target="_blank"&gt;Adblock&lt;/a&gt; 0.5.3.042&lt;/li&gt;&lt;br /&gt;&lt;li&gt; &lt;a href="http://addneditcookies.mozdev.org/" target="_blank"&gt;Add N Edit Cookies&lt;/a&gt; 0.2.1.0&lt;/li&gt;&lt;br /&gt;&lt;li&gt; &lt;a href="http://firefox.exxile.net/aios/" target="_blank"&gt;All-In-One Sidebar&lt;/a&gt; 0.6.4&lt;/li&gt;&lt;br /&gt;&lt;li&gt; &lt;a href="http://bluefrog.mozdev.org/" target="_blank"&gt;Blue Frog SRT&lt;/a&gt; 0.722&lt;/li&gt;&lt;br /&gt;&lt;li&gt; &lt;a href="http://roachfiend.com" target="_blank"&gt;BugMeNot&lt;/a&gt; 1.3&lt;/li&gt;&lt;br /&gt;&lt;li&gt; &lt;a href="http://customsoftwareconsult.com/extensions" target="_blank"&gt;Compact Library Extension Organizer (CLEO)&lt;/a&gt; Beta 1&lt;/li&gt;&lt;br /&gt;&lt;li&gt; &lt;a href="http://www.customizegoogle.com/" target="_blank"&gt;CustomizeGoogle&lt;/a&gt; 0.48&lt;/li&gt;&lt;br /&gt;&lt;li&gt; &lt;a href="http://del.icio.us/" target="_blank"&gt;del.icio.us&lt;/a&gt; 1.1&lt;/li&gt;&lt;br /&gt;&lt;li&gt; &lt;a href="http://www.downthemall.net" target="_blank"&gt;DownThemAll!&lt;/a&gt; 0.9.9.3&lt;/li&gt;&lt;br /&gt;&lt;li&gt; &lt;a href="http://percro.sssup.it/%7Epit/mozilla/dragdropupload/" target="_blank"&gt;dragdropupload&lt;/a&gt; 1.5.11&lt;/li&gt;&lt;br /&gt;&lt;li&gt; &lt;a href="http://fasterfox.mozdev.org/" target="_blank"&gt;Fasterfox&lt;/a&gt; 1.0.3&lt;/li&gt;&lt;br /&gt;&lt;li&gt; &lt;a href="http://customsoftwareconsult.com/extensions" target="_blank"&gt;Firefox Extension Backup Extension (FEBE)&lt;/a&gt; 2.0.1&lt;/li&gt;&lt;br /&gt;&lt;li&gt; &lt;a href="http://www.longfocus.com/firefox/gmanager" target="_blank"&gt;Gmail Manager&lt;/a&gt; 0.4.3.6&lt;/li&gt;&lt;br /&gt;&lt;li&gt; &lt;a href="http://greasemonkey.mozdev.org/" target="_blank"&gt;Greasemonkey&lt;/a&gt; 0.6.4&lt;/li&gt;&lt;br /&gt;&lt;li&gt; &lt;a href="http://ietab.mozdev.org/" target="_blank"&gt;IE Tab&lt;/a&gt; 1.0.9&lt;/li&gt;&lt;br /&gt;&lt;li&gt; &lt;a href="http://www.mousegestures.org/" target="_blank"&gt;Mouse Gestures&lt;/a&gt; 1.5&lt;/li&gt;&lt;br /&gt;&lt;li&gt; &lt;a href="http://spellbound.sourceforge.net/" target="_blank"&gt;Mozilla SpellCheck Libraries&lt;/a&gt; 1.0.1.0&lt;/li&gt;&lt;br /&gt;&lt;li&gt; &lt;a href="http://www.mrtech.com/extensions/local_install/" target="_blank"&gt;MR Tech Local Install&lt;/a&gt; 5.0.3&lt;/li&gt;&lt;br /&gt;&lt;li&gt; &lt;a href="http://www.cs.stevens.edu/%7Edlong/software/paragrasp/index.html" target="_blank"&gt;Paragrasp&lt;/a&gt; 1.10&lt;/li&gt;&lt;br /&gt;&lt;li&gt; &lt;a href="http://tecwizards.de/mozilla/" target="_blank"&gt;Paste and Go&lt;/a&gt; 0.4.3&lt;/li&gt;&lt;br /&gt;&lt;li&gt; &lt;a href="http://www.rabotat.org/firefox/" target="_blank"&gt;PDF Download&lt;/a&gt; 0.6&lt;/li&gt;&lt;br /&gt;&lt;li&gt; &lt;a href="http://performancing.com/" target="_blank"&gt;Performancing&lt;/a&gt; 1.2&lt;/li&gt;&lt;br /&gt;&lt;li&gt; &lt;a href="http://xeen.reversestudios.com/?page=autosizer" target="_blank"&gt;Searchbar Autosizer&lt;/a&gt; 1.1&lt;/li&gt;&lt;br /&gt;&lt;li&gt; &lt;a href="http://spellbound.sourceforge.net/" target="_blank"&gt;SpellBound&lt;/a&gt; 0.7.3&lt;/li&gt;&lt;br /&gt;&lt;li&gt; &lt;a href="http://www.stumbleupon.com/" target="_blank"&gt;StumbleUpon&lt;/a&gt; 2.77&lt;/li&gt;&lt;br /&gt;&lt;li&gt; &lt;a href="http://tmp.garyr.net" target="_blank"&gt;Tab Mix Plus&lt;/a&gt; 0.3.0.5&lt;/li&gt;&lt;br /&gt;&lt;li&gt; &lt;a href="http://talkback.mozilla.org/" target="_blank"&gt;Talkback&lt;/a&gt; 1.5.0.3&lt;/li&gt;&lt;br /&gt;&lt;li&gt; &lt;a href="http://www.benya.com/cyrillic/tocyrillic/" target="_blank"&gt;ToCyrillic&lt;/a&gt; 0.5.5&lt;/li&gt;&lt;br /&gt;&lt;li&gt; &lt;a href="http://www.longfocus.com/firefox/updatenotifier" target="_blank"&gt;Update Notifier&lt;/a&gt; 0.1.2&lt;/li&gt;&lt;br /&gt;&lt;li&gt; &lt;a href="http://viamatic.com/firefox" target="_blank"&gt;Viamatic foXpose&lt;/a&gt; 0.3&lt;/li&gt;&lt;br /&gt;&lt;li&gt; &lt;a href="http://www.hypercubed.com/projects/firefox/" target="_blank"&gt;Xinha Here (Firefox 1.5 edition)&lt;/a&gt; 0.4&lt;/li&gt;&lt;br /&gt;&lt;li&gt; &lt;a href="http://ymnotifier.mozdev.org" target="_blank"&gt;Yahoo! Mail Notifier&lt;/a&gt; 0.9.9.2&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;span class="ExtensionDisabledHeader"&gt;Disabled Extensions:&lt;/span&gt; [2]&lt;ul&gt;&lt;li&gt; &lt;a href="http://dbaron.org/mozilla/leak-monitor/" target="_blank"&gt;Leak Monitor&lt;/a&gt; 0.2.0&lt;/li&gt;&lt;br /&gt;&lt;li&gt; &lt;a href="http://aluminum.sourmilk.net/reveal/" target="_blank"&gt;Reveal&lt;/a&gt; 1.0.6&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span class="ExtensionHeader"&gt;Total Extensions: 34&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="ThemeHeader"&gt;Installed Themes:&lt;/span&gt; [2]&lt;ul&gt;&lt;li&gt; &lt;a href="http://www.mozilla.org/" target="_blank"&gt;Firefox (default)&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt; &lt;b&gt;&lt;a href="http://quadrone.org/" target="_blank"&gt;Qute&lt;/a&gt; 3.1&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;span class="PluginHeader"&gt;Installed Plugins:&lt;/span&gt; (13)&lt;ul&gt;&lt;li&gt; Adobe Acrobat&lt;/li&gt;&lt;br /&gt;&lt;li&gt; Java(TM) 2 Platform Standard Edition 5.0 Update 6&lt;/li&gt;&lt;br /&gt;&lt;li&gt; LogMeIn Inc. Remote Access Components 1.0.0.236&lt;/li&gt;&lt;br /&gt;&lt;li&gt; Microsoft® DRM&lt;/li&gt;&lt;br /&gt;&lt;li&gt; Mozilla Default Plug-in&lt;/li&gt;&lt;br /&gt;&lt;li&gt; PCMan's IE Tab Plug-in for Mozilla/Firefox&lt;/li&gt;&lt;br /&gt;&lt;li&gt; QuickTime Plug-in 7.1&lt;/li&gt;&lt;br /&gt;&lt;li&gt; RealJukebox NS Plugin&lt;/li&gt;&lt;br /&gt;&lt;li&gt; RealPlayer Version Plugin&lt;/li&gt;&lt;br /&gt;&lt;li&gt; RealPlayer(tm) G2 LiveConnect-Enabled Plug-In (32-bit) &lt;/li&gt;&lt;br /&gt;&lt;li&gt; Shockwave Flash&lt;/li&gt;&lt;br /&gt;&lt;li&gt; Shockwave for Director&lt;/li&gt;&lt;br /&gt;&lt;li&gt; Windows Media Player Plug-in Dynamic Link Library&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-114884871930261987?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/114884871930261987/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=114884871930261987&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114884871930261987'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114884871930261987'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/05/firefox-configuration-revisited.html' title='Firefox Configuration Revisited'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-114812279713738754</id><published>2006-05-23T19:23:00.000+03:00</published><updated>2006-05-23T19:23:33.123+03:00</updated><title type='text'>ASP.NET gotchas</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;Yesterday I was hit by two gotchas in ASP.NET. &lt;br /&gt;&lt;br /&gt;The first one was about the Visible property of a control in a UserControl. I wanted to switch between showing a grid and a label with text "no data available", depending upon the number of records extracted. So I just typed:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;grdXXX.Visible = (records.Count &amp;gt; 0);&lt;br /&gt;lblNoRecords.Visible = ! grdXXX.Visible;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;But the visibility  &lt;i&gt;lblNoRecords&lt;/i&gt; never changed when testing with and without records. First, I made sure I don't change it any place else. Then I debugged it and it appeared that when &lt;i&gt;grdXXX.Visible&lt;/i&gt; was false, after setting&lt;i&gt; lblNoRecords.Visible = true&lt;/i&gt;, the debugger showed that  &lt;i&gt;lblNoRecords.Visible &lt;/i&gt;is still &lt;i&gt;false&lt;/i&gt;. I was really intrigued, and after some futile experiments I fired up Reflector to see what the Setter and the Getter did. I realized that even though I set the Visible, the label was not visible, since the UserControl container was not yet visible. Then I figured out that &lt;i&gt;grdXXX.Visible&lt;/i&gt; returned always false, so that's why the label was always visible. The simple fix was to change the second line to: &lt;i&gt;lblNoRecords.Visible = (records.Count == 0);&lt;br /&gt;&lt;br /&gt;&lt;/i&gt;The second gotcha problem was when I wanted to populate a data grid dynamically when handling the EditCommand. I succeeded to add a few textboxes for the user input in one of the cells of the edited DataItem. Unfrotunately in the UpdateCommand handler method none of those were available in the Controls property. I realize this has to do with them not getting in the UserControl's ViewState, but I am not quite sure how to put them there, so that I can access their propertes later. I wonder if it is possible to add them to the ViewState, or do I have to use some client-side code for a workaround?&lt;i&gt;&lt;br /&gt;&lt;br /&gt;&lt;/i&gt;UPDATE: The second problem had a pretty simple workaround with this excellent &lt;a href="http://www.denisbauer.com/ASPNETControls/DynamicControlsPlaceholder.aspx"&gt;DynamicControlsPlaceholder&lt;/a&gt; control. For those like me who don't understand control lifecycle well enough, this is an excellent time saver.&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/6471778-114812279713738754?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/114812279713738754/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=114812279713738754&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114812279713738754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114812279713738754'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/05/aspnet-gotchas.html' title='ASP.NET gotchas'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-114798617847798573</id><published>2006-05-19T00:02:00.000+03:00</published><updated>2006-05-19T09:00:42.363+03:00</updated><title type='text'>Review of JustCode 1.1</title><content type='html'>Roy Osherove &lt;a href="http://weblogs.asp.net/rosherove/articles/ReviewJustCode.aspx"&gt;reviewed&lt;/a&gt; JustCode 1.0 about half an year ago. I think most of the pros and cons of JustCode described in Roy's review are still valid for the 1.1 release. I have a few comments to add, but have in mind that 30 minutes of working with the product are definitely not enough to give it a fair evaluation. And my point of view is that of a ReSharper addict, who wants to keep all of the goodies of the JetBrains' product and eager to have more.&lt;br /&gt;&lt;br /&gt;My overall opinion is that JustCode is good product, but in many ways it can't compete with ReSharper. &lt;br /&gt;&lt;ul&gt;&lt;li&gt;One of the good things about it is that it seamlessly integrates in VS.NET 2003 (so seamlessly that it is not in the Add-Ins list, so you have to go to the general Options dialog to turn it off/on and tweak its options). &lt;/li&gt;&lt;li&gt;First thing I noticed after starting it is that its memory demands are close to those of ReSharper, sigh... It showed a lot of errors in the solution after parsing it, but most of them were definitely not real errors. Those fake errors included some HTML ones, some concerning types defined in referenced assemblies, etc. Hopefully one can ignore all the errors that he decides, so they don't show up in the IDE. &lt;/li&gt;&lt;li&gt;The refactoring support is good enough. It covers the most common scenarios and I liked the dialogless approach. I can't say that it is very reliable though. I tried a rename on a Web control and it worked the second time (the first it asked about opening files that will be edited, but did not applied the refactoring only to the codebehind class). &lt;/li&gt;&lt;li&gt;The navigation functions are pretty good, especially "go to symbol by name" might be very useful, though the UI is not very slick. &lt;/li&gt;&lt;li&gt;The code templates were not very impressive, but there are some useful ones. &lt;/li&gt;&lt;li&gt;I liked the feature "learn code style from file", though the C# code styles options are more limited than ReSharper's ones. But the valuable thing about code style is that it is not only about C#, but also VB.NET, HTML, ASP, Javascript and automatic formatting of the code can be applied&lt;/li&gt;&lt;/ul&gt;JustCode gives VS.NET a nice boost, and if you are not ReSharper junkie, you might enjoy it quite a lot. Unfortunately, using them side-by-side is really not a viable option... so ReSharper wins (again).&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-114798617847798573?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/114798617847798573/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=114798617847798573&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114798617847798573'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114798617847798573'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/05/review-of-justcode-11.html' title='Review of JustCode 1.1'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-114790044730848608</id><published>2006-05-18T00:14:00.000+03:00</published><updated>2006-05-25T09:15:40.750+03:00</updated><title type='text'>VS.NET Productivity Add-Ins Revisited</title><content type='html'>I &lt;a href="http://immitev.blogspot.com/2005/09/vsnet-productivity-add-ins.html"&gt;posted&lt;/a&gt; some links to VS.NET 2003 productivity add-ins a while ago and now I need to catch up.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.jetbrains.com/resharper/"&gt;ReSharper&lt;/a&gt; has continued to be my tool of choice and I have become quite profficient using its numerous features. Well, it is not perfect - its memory consumption is high and some operations are really slow, but it makes my coding very hassle-free.&lt;br /&gt;&lt;br /&gt;I found that &lt;a href="http://www.wholetomato.com/"&gt;Visual Assist X&lt;/a&gt; is a good complement to ReSharper. The nice things about it are that it has great intellisense (fast and powerful, though a bit hard to get accustomed to), it offers spellcheck, and supports not just C#, but C++ and VB.NET too. Its requirements  are not heavy, so it is great for big solutions. The syntax coloring is also interesting, though I have get used to ReSharper's way. The dark side is that sometimes VisualAssist gets unstable and misbehaves, but such are the risks of the trade.&lt;br /&gt;&lt;br /&gt;I just saw that JustCode has released a new version 1.1. The &lt;a href="http://www.omnicore.com/justcode_comparison.htm"&gt;feature comparison&lt;/a&gt; between it, ReSharper and CodeRush looks very promising and it makes me think that Resharper could have been even better. I had given a look at the Omicore IDE (&lt;a href="http://www.omnicore.com/xdevelop.htm"&gt;X-develop&lt;/a&gt;) a few months ago and it made good first look impression, though it had a few rough edges. So JustCode might be worth a try. I don't think that it would be reasonable for me to try to replace ReSharper, but if JustCode is faster and reliable, I might be converted.&lt;br /&gt;&lt;br /&gt;I notice that the number of refactoring add-ins increase with &lt;a href="http://submain.com/?nav=products.cio"&gt;CodeIt.Once. &lt;/a&gt;After seeing a few screenshots in the documentation area, I cannot say that I am not hooked up. It has some nice wizards, that might be very helpful for those who are not quite familiar with refactoring practices. In the comments section I added a few more comments after I tried it for real.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.syntaxia.com/Syntaxia/HomePage.php"&gt;Visual Sidekick&lt;/a&gt; has recently released a new version but it is all about navigation, and there &lt;a href="http://www.wholetomato.com/"&gt;Visual Assist X&lt;/a&gt; offers similar features like Symbol Search, so I am not really despearte about such a tool.&lt;br /&gt;&lt;br /&gt;UPDATE: I did a quick review on JustCode in a &lt;a href="http://immitev.blogspot.com/2006/05/review-of-justcode-11.html"&gt;new post&lt;/a&gt; and in CodeIt.Once in the &lt;a href="http://www.blogger.com/comment.g?blogID=6471778&amp;postID=114790044730848608&amp;amp;isPopup=false"&gt;comments section&lt;/a&gt;. Both seem to be good products, especially if you are not coding just in C#, but I will stick to ReSharper for now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-114790044730848608?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/114790044730848608/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=114790044730848608&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114790044730848608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114790044730848608'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/05/vsnet-productivity-add-ins-revisited.html' title='VS.NET Productivity Add-Ins Revisited'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-114769525023898528</id><published>2006-05-15T15:14:00.000+03:00</published><updated>2006-05-15T22:41:53.843+03:00</updated><title type='text'>ASP.NET components on DNR TV</title><content type='html'>The DotNetRocks TV &lt;a href="http://dnrtv.com/default.aspx?showID=17"&gt;show&lt;/a&gt; featuring &lt;a href="http://www.ssw.com.au/SSW/Employees/employeesprofile.aspx?EmpID=AC"&gt;Adam Cogan &lt;/a&gt;talking about ASP.NET components was pretty cool. I am relatively new to ASP.NET development, so I have little (nearly none) experience with third-party controls. Adam did a great job demoing and evaluating various components from the major vendors like telerik, Infragistics, ComponentArt etc.. If you are planning to use advanced controls in you ASP.NET development you should watch it. I don't think that his review was 100% thorough and accurate, but it was definitely interesting. One of Adam's observation was definetly inaccurate. He said that telerik radTreeView did not offer context menus, which might have been true a long ago. But if it didn't offer such menus, last week I would not have hunted for a bug concerning the rigth way to use its context menus. I have to thank &lt;a href="http://blogs.telerik.com/blogs/twisted_asp_net/"&gt;a friend of mine&lt;/a&gt;, who works at telerik and was eager to assist me into solving the problem quickly. It turned out that I was looking at a piece of an outdated documentation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-114769525023898528?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/114769525023898528/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=114769525023898528&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114769525023898528'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114769525023898528'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/05/aspnet-components-on-dnr-tv.html' title='ASP.NET components on DNR TV'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-114728115481037735</id><published>2006-05-10T20:12:00.000+03:00</published><updated>2006-05-19T05:07:40.006+03:00</updated><title type='text'>Replacing Windows Programs</title><content type='html'>I am pretty big on replacing default programs that come with Windows with better ones. Many of everyday frustrations disappear with a proper replacement.&lt;br /&gt;&lt;br /&gt;I just replaced my notepad.exe with &lt;a href="http://notepad-plus.sourceforge.net/"&gt;notepad++&lt;/a&gt;. I have been using this editor for a few months and it is definitely the best notepad replacement I have found so far. It is amazingly light and powerful and I use it for text files, xml files, code files (c#, asp) etc. The newest version 3.5 got some cool facelift, so it looks pretty nice.&lt;br /&gt;&lt;br /&gt;I was also researching a couple of weeks ago an Explorer replacement. I mean Windows Explorer, not Internet Explorer (I hadn't used IE for ages, but currently my role is a webdev so I have no choice). WinExplorer sucks very much indeed, it is missing numerous functions and is really slow (because of IE integration and extensions). I stumbled upon a great discussion which is its best &lt;a href="http://www.alexking.org/blog/2005/01/27/windows-explorer-replacement/"&gt;replacement&lt;/a&gt;. Many people are fond of &lt;a href="http://www.ghisler.com/"&gt;TotalCommander&lt;/a&gt; but it is very ugly. The better replacement IMHO is &lt;a href="http://www.xyplorer.com/"&gt;XYPlorer&lt;/a&gt; and I am trying its trial. Though it had recently become commercial, there is a still an old &lt;a href="http://www.xyplorer.com/forum/viewtopic.php?t=611"&gt;free version&lt;/a&gt; available. Unfortunately I don't think it is possible for any third party program to complete replace Explorer. I mean, when an external program tries to open a directory to run something else instead of WinExplorer.&lt;br /&gt;&lt;br /&gt;What else? Hmm, yeah, the default unistaller "Add/Remove Programs" of Windows is terrible. I have tried a trial of &lt;a href="http://www.ursoftware.com/"&gt;Your Uninstaller&lt;/a&gt; which was great, and I currently use the free &lt;a href="http://www.nirsoft.net/utils/myuninst.html"&gt;MyUninstaller&lt;/a&gt; which is not that great, but is way better than the windows default.&lt;br /&gt;&lt;br /&gt;Well, I can think of many other replacements I have made in the quest for the perfect computer environment. But those were the most recent and noteworthy ones. Worth taking a look!&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-114728115481037735?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/114728115481037735/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=114728115481037735&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114728115481037735'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114728115481037735'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/05/replacing-windows-programs.html' title='Replacing Windows Programs'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-114725503425738598</id><published>2006-05-10T12:57:00.000+03:00</published><updated>2006-05-18T01:34:38.530+03:00</updated><title type='text'>Speeding Up Development In a Big Solution</title><content type='html'>Yeah, it is nice to speed the build from 100 seconds to 5 seconds, and that's what I did by moving from project references to file references in an ASP.NET 1.1 web application project. I created a copy of the project file, manually edited it and set a W: drive as a hint path for the file refernces. Then created put it in a new empty solution and that's it. You can see some more best practices &lt;a href="http://www.ssw.com.au/ssw/Standards/Rules/RulesToBetterLargedotNETProjects.aspx%20"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;But what is the hidden cost:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;No easy way to navigate and view the source of the referenced libraries. While investigating code and debugging this is a real issue.&lt;/li&gt;&lt;li&gt;If the libraries beneath change, the update is a several-step process instead of 2-step (Get Latest Version and Build).&lt;/li&gt;&lt;li&gt;There is a need to sync the files in the project references project and the file references project. That seems trivial cipy&amp;amp;paste, but one can easily forget about it.&lt;/li&gt;&lt;/ul&gt;The good part is that everyone can choose which solution to work on. I was thinking of the idea to have to instances of vs.net side-by-side and choosing the one that is more appropriate for the task at hand, but that defies one of the positive impacts of having lower RAM consumption.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-114725503425738598?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/114725503425738598/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=114725503425738598&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114725503425738598'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114725503425738598'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/05/speeding-up-development-in-big.html' title='Speeding Up Development In a Big Solution'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-114684543964987967</id><published>2006-05-05T19:10:00.000+03:00</published><updated>2006-05-05T20:58:28.703+03:00</updated><title type='text'>Ideas for speeding up work</title><content type='html'>I complained yesterday that working in a large solution and in a large asp.net project is pretty slow. The initial time for loading of the solution is negligable compared to the time to build, which is more than 2 minutes. I am used to really fast builds and immediate feedback and I want to make as fast as possible. I wonder if it is a good idea to separate the web project from the solution (and use file references instead of project references). I guess that it will be much more easier for the build and for Resharper. Well, there are some shortcomings:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I lose the ability to quickly move around all code - not good, but I may just navigate to individual files, outside the solution.&lt;/li&gt;&lt;li&gt;I can't do solution-wide refactoring - well, I am not supposed to do such things while I am a noob in the project. &lt;/li&gt;&lt;/ul&gt;Still, it might prove worthwhile, I just have to test it.&lt;br /&gt;&lt;br /&gt;Another problem is that I am used to make small changes and immediately check in the modified code. But the workflow in the project is not always that simple. Apparently sometimes we are not supposed to do check ins for extended period of time. This brings some risk, though, because I might lose code if VS.NET crashes or my harddrive fails. Hmm, I wonder if it is a good idea to use another intermediate-stage source code repository and to sync it every few days with the main VSS repository. I am thinking of using Subversion for this task, since it has definite advantages over VSS (I just hope that AnkhSvn is more stable in VS.NET 2003 than it is in VS.NET 2005).&lt;br /&gt;&lt;br /&gt;Another related issue is what VS.NET 2003 addins to stick to. I really need Resharper for a lot of routine tasks, but I seemed to like VisualAssist too. Unfortunately they don't play perfectly with each other so I might have to switch between the two. The problem is that VisualAssist misbehaves when I try to load/unload it and I don't understand why its menus remain inactive when I manually activate it.&lt;br /&gt;&lt;br /&gt;It will be nice to set up a very productive environment, since I will work on this project for a long time. Environment alone will not solve all the problems, since my web development skills are not very strong and I have a lot to catch up in the project. But progress is made a step in a time, so why not start with the environment.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-114684543964987967?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/114684543964987967/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=114684543964987967&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114684543964987967'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114684543964987967'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/05/ideas-for-speeding-up-work.html' title='Ideas for speeding up work'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-114677239188272540</id><published>2006-05-04T22:53:00.000+03:00</published><updated>2006-05-04T22:53:11.913+03:00</updated><title type='text'>First Impressions Of The New Project</title><content type='html'>Well, I finally am working on software that fits in the category of &lt;i&gt;enterprise &lt;/i&gt;solutions. The codebase consists of 40+ projects written in C#, VB.NET and C++. There is desktop, web, remoting stuff - vast breadth of technologies. It look like it can not be boring!&lt;br /&gt;&lt;br /&gt;I am starting with the ASP.NET application which is pretty huge. There are bunch of third party controls that we use and a lot to learn. After two days of acquainting with the codebase I notice that a part of it is very well documented (in particular the API libraries). Some thought has definitely gone in the design, but I am can't tell how usable the API is, I don't make fast progress with my first attempts. There are a lot of concepts in the system and it is hard to understand the big picture.&lt;br /&gt;&lt;br /&gt;The quality of the source code varies a lot. I have seen some very good looking code (meaningful names, well-documented, well structured), but I have seen some a lot of fragile code, especially in the web application. I have met instances of code dupliication, copy&amp;amp;paste programming, over-reliance on strings, bad english, unhelpful naming, magic numbers, inconsistent coding conventions. There were some good WTF gems here, heh. But it could be much worse.&lt;br /&gt;&lt;br /&gt;The size of the codebase gives me some uneasiness. It gives ReSharper some tough time and devenv.exe memory reaches 300-400 Mb. I decided to give &lt;a href="http://www.wholetomato.com/"&gt;VisualAssist&lt;/a&gt; a try, since it supports  C#, C/C++ and Visual Basic .NET. Although I liked many of its features and its performance, there are some issues/bugs, that makes it a bit untrustworthy. I realize my addiction to ReSharper is overwhelming, when I work without it, there is something missing. I have to come up with a workaround, otherwise my productivity and enjoyment will drop significantly.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-114677239188272540?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/114677239188272540/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=114677239188272540&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114677239188272540'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114677239188272540'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/05/first-impressions-of-new-project.html' title='First Impressions Of The New Project'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-114675800675967163</id><published>2006-05-04T18:53:00.000+03:00</published><updated>2006-05-04T18:53:26.766+03:00</updated><title type='text'>Consolas fonts for programmers</title><content type='html'>I have been following for months a lot of online conversations and rants about the value of progammer fonts, but I had not bother to try them. Today I proved to myself that I am a programmer by installing &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=22e69ae4-7e40-4807-8a86-b3d36fab68d3&amp;amp;displaylang=en"&gt;Consolas&lt;/a&gt; and setting it as the font for VS.NET and ReSharper. It looks pretty good. I really needed such a programming-identity-boost, since today I could not get any code to a functional state, heh. Why? Well, this is a topic of another post, coming soon...&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-114675800675967163?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/114675800675967163/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=114675800675967163&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114675800675967163'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114675800675967163'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/05/consolas-fonts-for-programmers.html' title='Consolas fonts for programmers'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-114642338353788631</id><published>2006-04-30T21:47:00.000+03:00</published><updated>2006-04-30T21:56:23.553+03:00</updated><title type='text'>ASP.NET In Action</title><content type='html'>It seems that my &lt;a href="http://immitev.blogspot.com/2006/03/preparing-for-aspnet.html"&gt;preparations&lt;/a&gt; from ASP.NET will not be pointless. Next week it is highly likely for me to start in a long awaited ASP.NET project.&lt;br /&gt;&lt;br /&gt;The last few days I also had a chance to use my (limited) knowledge in this area to become an editor of the last pending chapter of the &lt;a href="http://www.devbg.org/dotnetbook/"&gt;Bulgarian .NET book&lt;/a&gt; (part one of the huge ASP.NET topic). The document was at a pretty rough draft stage when I got it and although I made a lot of progress in a couple of days, there are still a lot of incompleteness and rough edges. I hope to finish it quickly, since it has been the bottleneck for the release of the second volume of the book.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-114642338353788631?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/114642338353788631/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=114642338353788631&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114642338353788631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114642338353788631'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/04/aspnet-in-action.html' title='ASP.NET In Action'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-114615091208588931</id><published>2006-04-27T18:15:00.000+03:00</published><updated>2006-04-27T18:15:12.093+03:00</updated><title type='text'>Touch Typing From a Two Months Perspective</title><content type='html'>I last &lt;a href="http://immitev.blogspot.com/2006_02_01_immitev_archive.html"&gt;blogged&lt;/a&gt; about touch typing more than two months ago when I completed my training in it. This week, while listening to some podcasts in front of the computer, I decided to fill in the time with a bit multitasking. I could not do anything else that involved thinking so I fired Stamina to test my typing speed. I wondered how will it compare to my scores two months ago. Has it become a habit? It appeared that it has and all my scores were in the 305 range (+/- 10). Today I even topped my personal best doing 324 CPM with 4.8 % errors, while not concentrating fully on the practice. It seems that I have fully embraced this skill and I no longer have to look at the keyboard.&lt;br /&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-114615091208588931?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/114615091208588931/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=114615091208588931&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114615091208588931'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114615091208588931'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/04/touch-typing-from-two-months.html' title='Touch Typing From a Two Months Perspective'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-114604600240119332</id><published>2006-04-26T13:06:00.000+03:00</published><updated>2006-04-28T20:04:00.570+03:00</updated><title type='text'>Killing processes is not that easy</title><content type='html'>I am having a weird problem. I cannot kill a process (in fact two of them, sigh).&lt;br /&gt;&lt;ol&gt;&lt;li&gt;I see them in the &lt;b&gt;TaskManager&lt;/b&gt;, I choose 'end process' and ... nothing happens. &lt;/li&gt;&lt;li&gt;I run &lt;b&gt;ProcessExplorer&lt;/b&gt; from SysInternals, click 'kill' and.. nothing happens. &lt;/li&gt;&lt;li&gt;I use &lt;b&gt;taskkill&lt;/b&gt; from the command line and ... nothing happens. (even with the \F parameter)&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Come on, ain't there any other ways to kill a process? Those are not some special system processes, these are my own creation. Just two simple apps that talk to each other via a (virtual) serialport. Actually, they are in one and the same assembly, that has copies in two locations. I start them with different command line parameters, but these facts don't make them special in any way. I wonder if the problem is with the .NET framework (I use .NET 2.0)? It might be some finalization stuff? But since they are processes, I should be able to kill them with all the common tools. &lt;br /&gt;&lt;br /&gt;Who should I ask for advice? Probably the &lt;a href="http://askaninja.com/"&gt;Ninja Master&lt;/a&gt; might do a little show on the question "Do ninjas kill processes that common people and tools can't?". I am sure he will end his rant with his usual "Thanks for the question Ivan, I am looking forward to killing you soon!" :)&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-114604600240119332?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/114604600240119332/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=114604600240119332&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114604600240119332'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114604600240119332'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/04/killing-processes-is-not-that-easy.html' title='Killing processes is not that easy'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-114563341358245220</id><published>2006-04-21T18:19:00.000+03:00</published><updated>2006-04-21T18:30:13.700+03:00</updated><title type='text'>Some Pointless Blog Reading Stats</title><content type='html'>I was wondering what and how I have been reading in my RSS aggregator, so here are the stats:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Feeds - about 130 (the list is in a constant state of changing)&lt;/li&gt;&lt;li&gt;Posts - about 50 daily (65 on workdays and 25 on weekends)&lt;/li&gt;&lt;li&gt;Signal-To-Noise-Ratio - I guess between 15% and 25%&lt;/li&gt;&lt;li&gt;Hours - 30-60 minutes per day (on busy days they might be zero)&lt;/li&gt;&lt;/ul&gt;The moral? To Be Determined! :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-114563341358245220?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/114563341358245220/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=114563341358245220&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114563341358245220'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114563341358245220'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/04/some-pointless-blog-reading-stats.html' title='Some Pointless Blog Reading Stats'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-114554693272480034</id><published>2006-04-20T18:49:00.000+03:00</published><updated>2006-04-20T18:49:50.203+03:00</updated><title type='text'>Subversion-AnkhSvn problem</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;As I have been happily using subversion for 3 weeks, today I was hit by an unexpected error. AnkhSvn complained something about "subversion reported an error", "xml parser failed", "unclosed token". I fairly quickly tracked the problem down to a corruption of the &lt;a href="http://svnbook.red-bean.com/en/1.1/ch08s03.html"&gt;entries file&lt;/a&gt; in one of the subdirectories. TortoisseSvn confirmed my assumptions by not showing a special icon on the folder (apparently it could not find out it was a version-controlled folder).&lt;br /&gt;&lt;br /&gt;It seems that AnkhSvn has copied a part of a resx file in the entries file (I have noone else to blame, and I would not have done by myself) .&lt;wc-entries&gt;&lt;entry&gt; I know, I know, I have been warned that AnkhSvn is a bit buggy at this stage of its development, but it is so nice to do everything without having to leave the VS.NET IDE. Next, I wanted to recover the entries file, but I could not find any online resources on how to do so, so I decided I might be able to handle it by myself.&lt;br /&gt;&lt;br /&gt;I tried to "Svn Checkout" the problematic directory but it failed. It appeared to contain two files with the same name differing only in the case of a single letter. Well, I renamed the older one and got a good version of the entries file. Now I wonder if it is safe to just replace the corrupted file. This might not work so smoothly because some of the entries will have incorrect statuses and timestamps. So I have to backup before trying to work again with AnkhSvn. Let's see what comes up!&lt;br /&gt;&lt;br /&gt;&lt;/entry&gt;&lt;/wc-entries&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-114554693272480034?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/114554693272480034/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=114554693272480034&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114554693272480034'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114554693272480034'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/04/subversion-ankhsvn-problem.html' title='Subversion-AnkhSvn problem'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-114554338229477931</id><published>2006-04-20T17:29:00.000+03:00</published><updated>2006-04-20T17:29:42.376+03:00</updated><title type='text'>SerialPort troubles</title><content type='html'>I had some hard time recently while trying to find the source of a problem with serial port communication. When the other side sent a few bytes (e.g. 55-11-22) an event was raised and the AvailableBytes count was 3. But the Read(...) method read only the first byte and the others were zero. And this happened only on the customer's site who used a USB-RS232 adapter, so I could not reproduce it on my machine. And there was a simple solution: give up reading all availble bytes at once, and instead call N times ReadByte(). I suppose that the USB-RS232 adapter was buggy, but I am not quite sure why the workaroung works, maybe it was a caching problem.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-114554338229477931?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/114554338229477931/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=114554338229477931&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114554338229477931'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114554338229477931'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/04/serialport-troubles.html' title='SerialPort troubles'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-114493208376396809</id><published>2006-04-20T17:15:00.000+03:00</published><updated>2006-04-25T21:30:38.273+03:00</updated><title type='text'>Looking for a good free .NET charting library</title><content type='html'>I was looking for a free .NET charting library and I stumbled upon &lt;a href="http://nplot.com/"&gt;NPlot&lt;/a&gt;, which wiki looked promising. There was sufficient documentation to get me started, but unfortunately many problems appeared while using it for real.&lt;br /&gt;&lt;br /&gt;The download of NPlot included a demo project which demonstrates some very interesting features of the library. But the code quality was not very high and unfortunately this applies to the library itself. ReSharper did not need more than a second to show plenty of warnings and later I investigated some methods which were pretty long and the variable naming was not very helpful.&lt;br /&gt;&lt;br /&gt;I needed to use a StepPlot class to draw a step-looking chart and I had a few surprises. The first thing was how to set data. Until I looked at the source I could not figure this out because the property was of a generic &lt;span style="font-style: italic;"&gt;object &lt;/span&gt;type. Next I had some strange problems when some parts of the chart were not drawn (possibly a bug). Next I succeeded to reproduce a bug when trying to add a single value to the chart and I submitted it &lt;a href="http://sourceforge.net/tracker/index.php?func=detail&amp;amp;aid=1469760&amp;amp;group_id=161868&amp;amp;atid=821568"&gt;here&lt;/a&gt;. There I saw another bad sign - the bugtracking system was empty. All widely used projects have bugs, while no one bothered to submit any for NPlot (and it is definitely not bug-free).&lt;br /&gt;&lt;br /&gt;Now I am wondering if I should continue with NPlot or seek for another solution. My next choice should be probably &lt;span style="text-decoration: underline;"&gt;&lt;/span&gt;&lt;a href="http://zedgraph.org/"&gt;ZedGraph &lt;/a&gt;- it's wiki is more content rich and it was promoted in a &lt;a href="http://www.codeproject.com/csharp/ZedGraph.asp"&gt;CodeProject article&lt;/a&gt;, but I don't think it has built-in Step-chart functionality, though I think I could easily simulate one using a linear chart.&lt;br /&gt;&lt;br /&gt;I could also plot something by hand, but I don't think I should be reinventing the wheel. In my previous project, one colleague of mine did so. His code was very easy to understand and extend but at least there was no need to learn a framework (well, you may want to learn GDI+ first, which is not an easy task either).&lt;br /&gt;&lt;br /&gt;UPDATE: Actually I continued to use NPlot and though I gave up on the StepPlot, it was no brainer to simulate it using a LinePlot.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-114493208376396809?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/114493208376396809/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=114493208376396809&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114493208376396809'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114493208376396809'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/04/looking-for-good-free-net-charting.html' title='Looking for a good free .NET charting library'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-114424577005613940</id><published>2006-04-05T16:49:00.000+03:00</published><updated>2006-04-06T12:16:22.890+03:00</updated><title type='text'>VS.NET 2005 Woes</title><content type='html'>To be honest there is a lot one could like about VS.NET 2005, but I had a few experiences with it recently that were not very pleasant. Today I was surprised to see Configuration Manager disappear and I could only build release assemblies targeted for the wrong platform :) Some settings got somehow messed up so I had to erase all my customizations to see the desired dialogbox again (I was lucky I stumbled quickly to this workaround) and get things back to normal. The VS.NET addins aren't mature and stable enough:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;ReSharper still has some minor problems (nevertheless I can't live without it)&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;AnkhSvn is a still a bit buggy (I am lucky I need it only for very simple scenarios, since I am working solo)&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;strike&gt;TestDriven.Net busted the IDE a few times when debugging TCP sockets (It might not be the TestDriven.Net but the very IDE, who knows)&lt;/strike&gt;. UPDATE: The problem was maybe completely different. Initially the project I wanted to debug was a class library (now it is a console app) and when I started it with TestDriven.NET, TD.Net had updated some project settings (test with an external program with specific command parameters). Later when I tried to debug the project with the standart  'Debug' -&gt; 'Start new instance' the IDE tried to launch TD.Net and something was causing a crash. Now I changed the settings in 'Project Properties' -&gt; 'Debug' it seems to work fine.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;The good things about the VS.NET are definitely the better debug experience and a few useful enhancements here and there, that I got quickly used to.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-114424577005613940?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/114424577005613940/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=114424577005613940&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114424577005613940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114424577005613940'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/04/vsnet-2005-woes.html' title='VS.NET 2005 Woes'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-114354630635810684</id><published>2006-03-28T13:14:00.000+03:00</published><updated>2006-03-28T15:13:11.170+03:00</updated><title type='text'>Source Control for VS.NET 2005 Project</title><content type='html'>I am not keen on using Visual SourceSafe for my new VS.NET 2005 project, but I don't see any better alternatives for the moment. I really wanted to try subversion with the support of &lt;a href="http://ankhsvn.tigris.org/screenshots.html"&gt;AnkhSvn&lt;/a&gt;, but Scott Hanselman's comments about the current version of Ankh as "&lt;a href="http://www.hanselman.com/blog/AnkhSVNAndAMonadSVNProvider.aspx"&gt;scary alpha stuff, use at your own risk&lt;/a&gt;" and I am not eager to try it. A bad omen was that when I created a new VSS database and tried to connect to it, the VSS client complained that the um.dat file is corrupted. Another viable option is a single-user &lt;a href="http://www.sourcegear.com/vault/"&gt;Vault&lt;/a&gt;, but I read the source-control integration is a bit slow, and there is the overhead of installing a MS SQL Server database on the server, which is currently a bit problematic.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-114354630635810684?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/114354630635810684/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=114354630635810684&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114354630635810684'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114354630635810684'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/03/source-control-for-vsnet-2005-project.html' title='Source Control for VS.NET 2005 Project'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-114354053873545798</id><published>2006-03-28T13:07:00.000+03:00</published><updated>2007-01-15T01:21:23.663+02:00</updated><title type='text'>Logging for .NET 2.0</title><content type='html'>In my last few .NET projects I didn't use any logging libraries. I just employed Debug and Trace classes to the information/warning type of logging and for the exception logging I implemented a simple file and database logging. This approach worked fine, but now I think about using a logging library to make the process more flexible and easy. I consider using &lt;a href="http://logging.apache.org/log4net/"&gt;log4net&lt;/a&gt; or &lt;a href="http://www.nlog-project.org/"&gt;NLog&lt;/a&gt;. The strange thing is that I don't see anywhere in their documentation if they support .NET 2.0, (I guess they do, but I would rather see it written down). Log4net is far more mature framework, but NLog seems nice too. It actually resembles log4net a lot. These are the only &lt;a href="http://www.codeproject.com/csharp/nlog.asp?forumid=188721&amp;select=1139520&amp;amp;df=100&amp;amp;msg=1139520#xx1139520xx"&gt;differences&lt;/a&gt;, according to the NLog author:&lt;br /&gt;&lt;br /&gt;* no object renderers (I believe this is needed in Java, not in .NET)&lt;br /&gt;* no custom layouts (only layout-renderer based)&lt;br /&gt;* no custom loglevels (you get some sort of standardization and library interoperability)&lt;br /&gt;* no cross-thread-serializable logeventinfo - I believe this isn't needed&lt;br /&gt;* no plugins (actually the architecture is very pluggable, but not this way)&lt;br /&gt;* no logging repositories (there's only one, which brings less confusion)&lt;br /&gt;* no need to use any configuration assembly-level attributes (NLog uses auto-configuration)&lt;br /&gt;* no need to remember class names for targets, filters and layout renderers (uses "File" instead of "log4net.Appender.FileAppender")&lt;br /&gt;* very simple and readable configuration schema&lt;br /&gt;* only two configuration languages to memorize: xml configuration language   &lt;rule&gt; and layout renderer sublanguage ${message:uppercase=true}&lt;br /&gt;* less abstraction at the logger interface (log4net.ILog is an abstract interface while NLog.Logger is a concrete, highly optimized class which improves non-logging speed down to 8 nanoseconds per non-logging call (on my Centrino 1.6 GHz laptop - thanks to the kind Anonymous for making me clarify this))&lt;br /&gt;* support for many common overloads in the logger API (to eliminate memory garbage wherever possible)&lt;br /&gt;* a File target which is multiprocess-safe by default&lt;br /&gt;* mixed-mode API for C/C++ and COM Interop API&lt;br /&gt;* asynchronous targets (write to file, network in a separate thread - available in Subversion, not in the 0.9 release)&lt;br /&gt;* one binary distribution that works for Mono 1.x, .NET 1.0, .NET 1.1 and (probably) .NET 2.0&lt;br /&gt;* support for ASP and ASP.NET layout renderers&lt;/rule&gt;&lt;br /&gt;&lt;br /&gt;It sounds that NLog is a bit simpler than log4net and this might be actually a good thing, since my current project is short and sweet. I will try it and if I get it to work smooth quickly, I will stick to it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-114354053873545798?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/114354053873545798/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=114354053873545798&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114354053873545798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114354053873545798'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/03/logging-for-net-20.html' title='Logging for .NET 2.0'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-114321527027122978</id><published>2006-03-24T17:32:00.000+02:00</published><updated>2006-03-26T20:32:23.196+03:00</updated><title type='text'>A Surprise Project</title><content type='html'>&lt;p class="MsoNormal"&gt;&lt;span lang="BG"&gt;As I was preparing to join an ASP.NET project this week, there came a chance to do another little project. It is about monitoring and sending commands to an embedded device through a serial port. I estimated the work hours and if we reach an agreement with the client, I will start coding next week. The cool thing is that I will get some experience with .NET 2.0, since it introduces a new class &lt;a href="http://msdn2.microsoft.com/en-us/library/system.io.ports.serialport.aspx"&gt;System.IO.Ports.SerialPort &lt;/a&gt;(which hopefully is going to make the task pretty trivial).&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="BG"&gt;In my preparation for the job I searched what's new or changed in .NET 2.0. I don't want unpleasant surprises and I like to try some new things like generics, anonymous delegates etc. I found a great summary &lt;a href="http://www.codeproject.com/books/net2_cs2_newfeatures.asp"&gt;here &lt;/a&gt; and you might also check &lt;a href="http://www.codeproject.com/script/articles/list_articles.asp?userid=2364136"&gt;all free excerpts&lt;/a&gt; of Patrick Smacchia's book &lt;a href="http://www.codeproject.com/books/www.PracticalDOT.NET"&gt;Practical .NET2 and C#2&lt;/a&gt;. A great resource on the .NET class SerialPort is this &lt;a href="http://blogs.msdn.com/noahc/"&gt;Noah Coad&lt;/a&gt;'s &lt;a href="http://msmvps.com/blogs/coad/archive/2005/03/23/39466.aspx"&gt;post&lt;/a&gt;. In the meantime I got acquainted with some serial port theory and tried a few useful tools to monitor, sniff or emulate serial port communication. I found &lt;a href="http://www.hw-group.com/products/hw_vsp/index_en.html"&gt;a cool tool&lt;/a&gt; that creates a virtual COM port and forwards all its communication to TCP port, so I wrote a simple TCP server to log the data received at the virtual port and I will also write a simple TCP client to send data.&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="BG"&gt;Another interesting thing I tried today was an alternative .NET 2.0 enabled IDE. VS.NET 2005 has its problems and one of them is that it is slow. Unfortunately the machine, I am working currently on, can't tolerate much CPU and memory pressure. I searched for a more lightweight IDE and stumbled upon &lt;a href="http://www.omnicore.com/xdevelop.htm"&gt;X-develop&lt;/a&gt;, which looks superb. It is feature-rich (actually in a few ways it's better than VS.NET, even when powered by ReSharper) and it seems a little less CPU and memory hungry. I can evaluate it for free for 20 days, which is enough for the task, but I might stick to VS.NET 2005.&lt;br /&gt;&lt;br /&gt;The estimating part is what bothered me a bit. I had a chance to test my skills in this area a few monts ago and it didn't work out very well. I had a list of another developer's estimates that seemed too conservative to me. I thought that I could implement the features twice or thrice faster, but at the end the other's guy estimates were more closer to reality. But since it was not a greenfield development and the code was not easily maintainable, probably &lt;/span&gt;&lt;span lang="BG"&gt;that's &lt;/span&gt;&lt;span lang="BG"&gt;why it took so long.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="BG"&gt;Now I am starting from scratch, I have a good idea what is to be done and all the implementation details are pretty clear. Let's see if I get it right this time. The not so obvious time-consuming activities that I tried not to ignore included: communication, writing testing and logging code, takling unpredicted problems, etc. Some people recommend that you multiply your estimated coding time by three and you are likely to come close to reality. But it depends on the project scope and the people involved. In my case I should multiply probably just by two, since I will do it solo and it looks pretty straightforward.&lt;/span&gt; &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-114321527027122978?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/114321527027122978/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=114321527027122978&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114321527027122978'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114321527027122978'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/03/surprise-project.html' title='A Surprise Project'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-114285587981757215</id><published>2006-03-20T13:57:00.000+02:00</published><updated>2006-03-20T13:57:59.866+02:00</updated><title type='text'>Preparing for ASP.NET</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;Since it is very likely that this week I will start working on an ASP.NET project, I took some training recently. I've had some experience with ASP.NET last year when I was developing a sample &lt;a href="http://immitev.blogspot.com/2005/10/bugtracktor.html"&gt;bug tracking app&lt;/a&gt; for about a month. It was a good warm-up exercise and it gave me a good feel about web development with ASP.NET, but I can't say I grok it. Aside from not grokking ASP.NET, I don't really know enough about JavaScript, CSS and even HTML to be a (super)effective web developer, but I think I am a quick learner so it is just a question of time to catch up.&lt;br/&gt;&lt;br/&gt;If you are starting with ASP.NET I highly recommend to look at the &lt;a href="http://pluralsight.com/fritz/webcasts.aspx"&gt;webcasts &lt;/a&gt;(presentations and labs) by &lt;a href="http://pluralsight.com/blogs/fritz/"&gt;Fritz Onion&lt;/a&gt;. I watched three of his four introductory ASP.NET webcasts. He presents his stuff in a logical and easy to understand way, and the Q sessions are also often worthwhile listening. I feel that video content is a great media for effective learning and sometimes I prefer it over books. Also the &lt;a href="http://samples.gotdotnet.com/quickstart/aspplus/"&gt;quick start tutorials&lt;/a&gt; are a nice way to learn, but I guess that working on the real thing coutns most.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-114285587981757215?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/114285587981757215/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=114285587981757215&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114285587981757215'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114285587981757215'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/03/preparing-for-aspnet.html' title='Preparing for ASP.NET'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-114267759078511445</id><published>2006-03-18T11:51:00.000+02:00</published><updated>2006-03-18T12:26:30.833+02:00</updated><title type='text'>Influenced by Writings</title><content type='html'>I can't resist to share how much I enjoy &lt;a href="http://www.cabochon.com/%7Estevey/blog-rants/"&gt;the writings of Steve Yegge,&lt;/a&gt; that I stumbled upon recently. It feels like discovering a gem, when you have not been looking for one. I've already read about eight of his rants and all of them are very thought provoking. While I don't necessarily buy on everything that he is saying, he always has an interesting point to make.&lt;br /&gt;&lt;br /&gt;After I discovered &lt;a href="http://www.joelonsoftware.com/"&gt;Joel Spolsky's website&lt;/a&gt; a few years ago, I was so stunned by several of his articles like &lt;a href="http://www.joelonsoftware.com/articles/fog0000000043.html"&gt;The Joel Test: 12 Steps to Better Code&lt;/a&gt; and &lt;a href="http://www.joelonsoftware.com/articles/fog0000000073.html"&gt;The Guerrilla Guide to Interviewing&lt;/a&gt;, that in the next few months I managed to read all the articles in his archive. It was definitely an eye-opener for me about many aspects of software development. Then it was &lt;a href="http://www.martinfowler.com/"&gt;Martin Fowler&lt;/a&gt; and his &lt;a href="http://www.martinfowler.com/articles.html"&gt;articles&lt;/a&gt; and &lt;a href="http://www.martinfowler.com/bliki"&gt;bliki&lt;/a&gt;. Then there was &lt;a href="http://software.ericsink.com/"&gt;Eric Sink&lt;/a&gt;'s writings and after him no online reading stood out to impress me that much. Well, there were quite a few good books that were eye openers in some areas, but nothing mind-blowing for me, they just gave more depth in fields about which I had a good enough idea. And now Steve Yegge offers high quality original content, that I definitely will not be content until I read it all.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-114267759078511445?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/114267759078511445/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=114267759078511445&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114267759078511445'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114267759078511445'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/03/influenced-by-writings.html' title='Influenced by Writings'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-114250565135143756</id><published>2006-03-16T11:38:00.000+02:00</published><updated>2006-03-16T12:40:51.416+02:00</updated><title type='text'>Software Books</title><content type='html'>&lt;p&gt; Yesterday, I asked my boss to get some books for our library. Hopefully, the company will purchase some of them, but what's interesting for me is how many people are going to read them (me included, heh). I wonder why so few developers actually read books to improve their skills. Well, it is not just about skills. Books can make you see things in an entirely new light. They can illuminate a way out of seemingly difficult problems. They can motivate you and take you out of your routine way of perceiving and thinking about problems. They can open your eyes to new patterns and help dissolve your old patterns. They can stretch your mind.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Well, there are myriad of software books covering areas like: methodologies and management, programming techniques and practices, programming concepts and patterns, languages and frameworks, bits and bytes. So the next step is to identify what kind of books really matter - in the short term and in the long term. After you decide what's your current priority, you just pick the best one and read it, and take notes and apply what you read. Well, the picking a priority and a good book is not always that easy - you can't really estimate what you are going to get, before you get it. And you don't want to skip the note taking and the process of applying the learned, if you want to the concepts to get in your long-term memory. But even if you don't do it, you at least will have a clue where to look when you identify issues that are addressed in the book. But as I said unless you play enough with what you are learning and internalize this knowledge, it will vaporize in a week or two (I can't recall the exact percent from some research studies, but it is about 60%). So play with it, discuss it, blog about it.&lt;br /&gt;&lt;/p&gt;&lt;p&gt; I recently read Steve Yegge's article &lt;a href="http://www.cabochon.com/%7Estevey/blog-rants/ten-great-books.html"&gt;Ten Great Books&lt;/a&gt; and the follow-up &lt;a href="http://www.cabochon.com/%7Estevey/blog-rants/ten-challenges.html"&gt;Ten Challenges&lt;/a&gt;. Out of the essential 10 books he listed in the first article, I have read the top three, and I really feel great about them. Well, I can not say that I benefited much from the &lt;a href="http://www.amazon.com/gp/product/0201633612/qid=1142504798/sr=2-1/ref=pd_bbs_b_2_1/002-5071073-6346403?s=books&amp;v=glance&amp;amp;n=283155"&gt;Design Patterns&lt;/a&gt; book (maybe I should check if &lt;a href="http://www.amazon.com/gp/product/0596007124/ref=wl_itt_dp/002-5071073-6346403?%5Fencoding=UTF8&amp;amp;amp;colid=1KXM129ZN0NMC&amp;coliid=I6ODJAF9YV76B&amp;amp;v=glance&amp;n=283155"&gt;Head First Design Patterns &lt;/a&gt;is more easy reading). So if you are interested on which books for which I aled (those are ones I have not read, only heard good things about), here are the notable six:&lt;br /&gt;&lt;/p&gt;&lt;span class="small"&gt;&lt;b&gt;&lt;span style="font-weight: bold;"&gt;&lt;a title="http://www.amazon.com/exec/obidos/tg/detail/-/0131857258/ref=wl_it_dp/002-5071073-6346403?_encoding=UTF8&amp;coliid=I1QS0SP75L10TL&amp;amp;amp;amp;amp;v=glance&amp;colid=1KXM129ZN0NMC" href="http://www.amazon.com/exec/obidos/tg/detail/-/0131857258/ref=wl_it_dp/002-5071073-6346403?%5Fencoding=UTF8&amp;amp;coliid=I1QS0SP75L10TL&amp;v=glance&amp;amp;colid=1KXM129ZN0NMC"&gt;Agile Principles, Patterns, and Practices in C#&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt; - (to be released in may)&lt;br /&gt;&lt;span class="small"&gt;&lt;b&gt;&lt;span style="font-weight: bold;"&gt;&lt;a title="http://www.amazon.com/exec/obidos/tg/detail/-/0735619670/ref=wl_it_dp/002-5071073-6346403?_encoding=UTF8&amp;coliid=I3JFTWMEG73SRO&amp;amp;amp;amp;amp;v=glance&amp;colid=1KXM129ZN0NMC" href="http://www.amazon.com/exec/obidos/tg/detail/-/0735619670/ref=wl_it_dp/002-5071073-6346403?%5Fencoding=UTF8&amp;amp;coliid=I3JFTWMEG73SRO&amp;v=glance&amp;amp;colid=1KXM129ZN0NMC"&gt;Code Complete, Second Edition&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="small"&gt;&lt;b&gt;&lt;span style="font-weight: bold;"&gt;&lt;a title="http://www.amazon.com/exec/obidos/tg/detail/-/0596007124/ref=wl_it_dp/002-5071073-6346403?_encoding=UTF8&amp;amp;coliid=I6ODJAF9YV76B&amp;v=glance&amp;amp;colid=1KXM129ZN0NMC" href="http://www.amazon.com/exec/obidos/tg/detail/-/0596007124/ref=wl_it_dp/002-5071073-6346403?%5Fencoding=UTF8&amp;amp;coliid=I6ODJAF9YV76B&amp;v=glance&amp;amp;colid=1KXM129ZN0NMC"&gt;Head First Design Patterns&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span class="small"&gt;&lt;b&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;a title="http://www.amazon.com/exec/obidos/tg/detail/-/0201699699/ref=wl_it_dp/002-5071073-6346403?_encoding=UTF8&amp;coliid=I2QYS5EG03IEZ8&amp;amp;amp;amp;amp;v=glance&amp;colid=1KXM129ZN0NMC" href="http://www.amazon.com/exec/obidos/tg/detail/-/0201699699/ref=wl_it_dp/002-5071073-6346403?%5Fencoding=UTF8&amp;amp;coliid=I2QYS5EG03IEZ8&amp;v=glance&amp;amp;colid=1KXM129ZN0NMC"&gt;Agile Software Development&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span class="small"&gt;&lt;b&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;a title="http://www.amazon.com/exec/obidos/tg/detail/-/0596007868/ref=wl_it_dp/002-5071073-6346403?_encoding=UTF8&amp;coliid=I1OS8STMMA3W2&amp;amp;amp;amp;amp;v=glance&amp;colid=1KXM129ZN0NMC" href="http://www.amazon.com/exec/obidos/tg/detail/-/0596007868/ref=wl_it_dp/002-5071073-6346403?%5Fencoding=UTF8&amp;amp;coliid=I1OS8STMMA3W2&amp;v=glance&amp;amp;colid=1KXM129ZN0NMC"&gt;The Art of Project Management&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span class="small"&gt;&lt;b&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;a title="http://www.amazon.com/exec/obidos/tg/detail/-/096139210X/ref=wl_it_dp/002-5071073-6346403?_encoding=UTF8&amp;amp;coliid=I1C9Y3QA23XAMD&amp;v=glance&amp;amp;colid=263H951FP64Q9" href="http://www.amazon.com/exec/obidos/tg/detail/-/096139210X/ref=wl_it_dp/002-5071073-6346403?%5Fencoding=UTF8&amp;amp;coliid=I1C9Y3QA23XAMD&amp;v=glance&amp;amp;colid=263H951FP64Q9"&gt;The Visual Display of Quantitative Information&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-114250565135143756?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/114250565135143756/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=114250565135143756&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114250565135143756'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114250565135143756'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/03/software-books.html' title='Software Books'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-114234875145092227</id><published>2006-03-14T15:05:00.000+02:00</published><updated>2006-03-14T17:05:51.533+02:00</updated><title type='text'>Website Update - Make it del.icio.us friendly</title><content type='html'>Since I have been an active &lt;a href="http://del.icio.us/immitev"&gt;del.icio.us user&lt;/a&gt; for a few months, I thought it is a nice idea to add to my weblog some stuff, that I tag. Now, there are (1) a tag cloud and (2) recent links &lt;a href="http://del.icio.us/immitev/programming"&gt;tagged 'programming' &lt;/a&gt;(which is currently my most used tag).&lt;br /&gt;&lt;br /&gt;Of course, you can always subscribe to &lt;a href="http://del.icio.us/rss/immitev"&gt;my del.icio.us feed&lt;/a&gt;. Why would you like to do that? Well, actually is not likely you want to. What's new and interesting for me, might be boring and off-topic for you. Probably only my twin from a parallel universe will find this stuff 100% valuable and can't live without it (unfortunately he won't have access to this internet). And you don't want to spend too much time reading crazy programming articles, trying cool tools, or paying attention to whatever I tag (not strictly computers). After all, though this can be fun and sometimes even useful, following links can take you hours and prevent you from doing more important tasks.&lt;br /&gt;&lt;br /&gt;I feel a bit confused about  the tagging system that del.icio.us and look-alikes use. On one hand, it is simple and useful in many cases, but I still want to have some hierarchical relationships between tags:  'software' includes 'programming' includes 'languages' includes 'ruby' - you get the point. I don't find a way to do this now. And the motif &lt;a href="http://www.jwz.org/doc/worse-is-better.html"&gt;Worse is Better&lt;/a&gt; does not appeal to me much. I hope that this issue will be addressed soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-114234875145092227?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/114234875145092227/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=114234875145092227&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114234875145092227'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114234875145092227'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/03/website-update-make-it-delicious.html' title='Website Update - Make it del.icio.us friendly'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-114191987263797351</id><published>2006-03-09T17:43:00.000+02:00</published><updated>2006-03-09T18:01:10.663+02:00</updated><title type='text'>More Reasons To Learn Ruby</title><content type='html'>&lt;p&gt; After &lt;a href="http://immitev.blogspot.com/2006/02/language-considerations-ruby-and-lisp.html"&gt;thinking&lt;/a&gt; about what language should I learn, I &lt;a href="http://immitev.blogspot.com/2006/02/it-will-be-ruby.html"&gt;decided&lt;/a&gt; that it will be Ruby, but I actually did not commit myself immediately to this endeavor. I continued to search for resources and to prepare for the learning. It was not until this week that I started reading the fascinating &lt;a href="http://poignantguide.net/ruby/"&gt;Poignant Guide To Ruby&lt;/a&gt; and I definitely will finish it.&lt;/p&gt;&lt;p&gt;I also gathered more evidence that there are pragmatic reasons to learn Ruby, except as a brain exercise. I stumbled upon some very interesting &lt;a href="http://www.cabochon.com/%7Estevey/blog-rants/index.html"&gt;Stevey's rants&lt;/a&gt; and I can't help myself to recommend his articles &lt;a href="http://www.cabochon.com/%7Estevey/blog-rants/tour-de-babel.html"&gt;Tour de Babel&lt;/a&gt;, &lt;a href="http://www.cabochon.com/%7Estevey/blog-rants/anti-anti-hype.html"&gt;A little anti-anti-hype&lt;/a&gt; and &lt;a href="http://www.cabochon.com/%7Estevey/blog-rants/bambi-meets-godzilla.html"&gt;Bambi meets Godzilla&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;There is also this &lt;a href="http://wtr.rubyforge.org/"&gt;WATIR&lt;/a&gt; web application testing tool that's for Ruby, that seems cool. Today I heard of another very interesting way to use Ruby. A bridge between CLR and Ruby is being developed by &lt;a href="http://www.iunknown.com/"&gt;John Lam&lt;/a&gt; and you can read all about it &lt;a href="http://www.iunknown.com/articles/search?q=RubyCLR"&gt;here&lt;/a&gt;. Fascinating stuff!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-114191987263797351?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/114191987263797351/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=114191987263797351&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114191987263797351'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114191987263797351'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/03/more-reasons-to-learn-ruby.html' title='More Reasons To Learn Ruby'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-114165613184818873</id><published>2006-03-06T16:26:00.000+02:00</published><updated>2006-03-12T22:21:57.983+02:00</updated><title type='text'>Collaborating on PowerPoint</title><content type='html'>If you need to collaborate on creating and refining a MS PowerPoint presentation, you might be surprised that this Office product lacks most of the great reviewing features you've used to in MS Word. There is no way to see what has been changed, deleted or added. You just can insert comments, which is useful, but rarely sufficient.&lt;br /&gt;&lt;br /&gt;I wondered what can be done about this problem. I came up with a simple solution:&lt;br /&gt;(1) export to MS Word ('Save as RTF'  or 'Send to MS Word') the original and edited versions and (2) use the Compare function of MS Word, to get a detailed view of the changes.&lt;br /&gt;&lt;br /&gt;I thought of automating these steps, but I first consulted with Google for an alternative solution. And there was this great (but commercial) tool to diff PPTs and other types of formats, called &lt;span style="text-decoration: underline;"&gt;&lt;/span&gt;&lt;a href="http://www.softinterface.com/MD/MD.htm"&gt;Diff Doc&lt;/a&gt;. It is really cool and makes it easy for you to get a good understanding exactly what changes were made. Just what I expected from such a tool. So, if you are doing powerpoint reviewing, don't hesitate to try the trial version (it seems that it is not functionality constrained).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-114165613184818873?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/114165613184818873/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=114165613184818873&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114165613184818873'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114165613184818873'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/03/collaborating-on-powerpoint.html' title='Collaborating on PowerPoint'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-114130609748840403</id><published>2006-03-02T15:07:00.000+02:00</published><updated>2006-03-02T15:28:17.573+02:00</updated><title type='text'>Dumb Moments</title><content type='html'>I guess that every developer has had moments when he had a problem, that seemed impossible to occur, and spent hours trying to find its cause. And then suddenly he has an epiphany and says to himself "Oh, how can I failed to seen such an obvious thing, am I dumb or what!".&lt;br /&gt;&lt;br /&gt;I just had a dumb moment. I was working on a WindowsForms app, and experimented with displaying hierarchical data in a grid. To speed my testing I create a method were I filled a dataset and then bound the grid to it. I'm using TestDriven.NET so in my form I made a temporary method to open the form after loading the data. The form showed up and the grid was empty.&lt;br /&gt;&lt;br /&gt;I tried to verify that I actually filled the dataset and that I bound the data correctly. Everything looked great but it didn't work. Then I realized that in the project, we have many times used hierarchical dataset bound to a grid, so I just had to duplicate what worked. Incrementally, I did everything to duplicate the existing working behaviour, and each step tested if it worked. I finally had 100% identical way of filling data and the grid was still empty.&lt;br /&gt;&lt;br /&gt;And then I realized what I have done. My method for displaying the form was initializing the members in the current instance, but I was creating and showing another instance of the form. No wonder it was empty! Argh, I suppose that if I did pair programming this wouldn't even become an issue.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-114130609748840403?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/114130609748840403/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=114130609748840403&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114130609748840403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114130609748840403'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/03/dumb-moments.html' title='Dumb Moments'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-114129189306731610</id><published>2006-03-02T11:00:00.000+02:00</published><updated>2006-03-02T11:31:33.160+02:00</updated><title type='text'>A Podcast Cocktail of Apple Pie and Lexicons</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Podcast &lt;/span&gt;has been a buzzword for the last couple of years, and if somebody hasn't acquainted himself with its mysterious nature, it is time to catch up. I promise, I will quote only the highest authorities, so you can't be misguided.&lt;br /&gt;&lt;br /&gt;There is a legendary &lt;a href="http://askaninja.blogspot.com/2006/02/ask-ninja-special-delivery-1-what-is.html"&gt;podcast on podcasting&lt;/a&gt; from the &lt;span style="font-weight: bold;"&gt;mysterious &lt;/span&gt;&lt;a href="http://askaninja.blogspot.com/"&gt;ninja master.&lt;/a&gt; If you are under 12 or by some mysterious circumstances you don't want to watch, I'll seduce you with a teaser. In this podcast the Ninja master revealed (btw, in a very articulate way) that:&lt;br /&gt;&lt;blockquote&gt;Podcasting is a factory for producing apple pie for whales.&lt;/blockquote&gt;For the complete archive of his words of wisdom look &lt;a href="http://askaninja.blogspot.com/2006/02/ask-ninja-question-archive.html"&gt;here&lt;/a&gt;. If you take the ninja way, you will never be the same man again.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;And a &lt;a href="http://www.thebestpageintheuniverse.net/c.cgi?u=banish"&gt;word&lt;/a&gt; from the &lt;span style="font-weight: bold;"&gt;owner &lt;/span&gt;of the &lt;a href="http://www.thebestpageintheuniverse.net/"&gt;Best Page of the Universe&lt;/a&gt;&lt;br /&gt;&lt;blockquote&gt;Someone had the revolutionary idea of taking a compressed audio file and putting it online. Yeah, doesn't sound so sexy when I describe it for what it is, does it you morons? It would have been a great idea if streaming audio wasn't already around for over a decade before the word "podcast" entered the lexicon. Man, I can't stand the word "lexicon." Talking about all these shitty words has made me start using shitty words. I'm so pissed, I just slammed the door shut on some kid's nuts.&lt;/blockquote&gt;You are beginning to understand the true and mysterious nature of podcasting. Now, it is time to take the red pill and dive into the podcasting ocean. The pill is big so you might need a GPL &lt;a href="http://juicereceiver.sourceforge.net/index.php"&gt;fresh lemon juice&lt;/a&gt; to help you along the way. I took the juice today. Though I didn't feel that I needed it desperately, it was not a pain either.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-114129189306731610?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/114129189306731610/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=114129189306731610&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114129189306731610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114129189306731610'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/03/podcast-cocktail-of-apple-pie-and.html' title='A Podcast Cocktail of Apple Pie and Lexicons'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-114111804062598424</id><published>2006-02-28T10:58:00.000+02:00</published><updated>2007-02-01T19:35:02.800+02:00</updated><title type='text'>Launchers Revisited (Again)</title><content type='html'>I blogged about launchers &lt;a href="http://immitev.blogspot.com/2006/02/launchers-revisited.html"&gt;here&lt;/a&gt; and &lt;a href="http://immitev.blogspot.com/2005/12/quick-launch-utilities.html"&gt;here&lt;/a&gt;, but recently I found another excellent tool - called Qliner Hotkeys, that deserves mentioning. Pretty good looking, innovative and cool. It can even make your CapsLock key do something useful, heh.&lt;br /&gt;&lt;br /&gt;In the meantime I dropped out &lt;a href="http://colibri.leetspeak.org/"&gt;Collibri&lt;/a&gt; because it was trying to be more inteligent than it should and had inconsistent behaviour. I turned back to  &lt;a href="http://launchy.sourceforge.net/"&gt;Launchy&lt;/a&gt;, which in new version has added icons support and fixed its combobox peculiarities.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-114111804062598424?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/114111804062598424/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=114111804062598424&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114111804062598424'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114111804062598424'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/02/launchers-revisited-again.html' title='Launchers Revisited (Again)'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-114062464982642128</id><published>2006-02-22T17:58:00.000+02:00</published><updated>2006-02-28T11:18:28.086+02:00</updated><title type='text'>Coding4Fun - Scheduled WAV Player</title><content type='html'>I needed an assistance for my morning exercises - a reminder when I have to start/stop an exercise and move to the next one. So when I want to time things perfectly I don't need to look at the watch all the time.&lt;br /&gt;&lt;br /&gt;I couldn't find an app that does this, so naturally I decided to write one. It's pretty simple and it does only what I need it to do. Take a look at its (not very polished) GUI, which hopefully is self explanatory [click to view larger image]:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://img57.imageshack.us/my.php?image=022220061813076wo.png" border="0" target="_blank"&gt;&lt;img src="http://img57.imageshack.us/img57/1180/022220061813076wo.th.png" alt="The ultimate app" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It took me a little longer to build it, than I initially estimated. I guess it is always like this. I am a bit sorry that I didn't try TDD while developing it, because I need to get some experience with this technique. But, nevertheless, I learned some new things along the way - how to play WAV sounds, how to use DataGridTableStyle. I also reminded myself how useful might a log window be (the one on the right).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-114062464982642128?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/114062464982642128/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=114062464982642128&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114062464982642128'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114062464982642128'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/02/coding4fun-scheduled-wav-player.html' title='Coding4Fun - Scheduled WAV Player'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-114053813680479579</id><published>2006-02-21T17:44:00.000+02:00</published><updated>2006-02-21T22:40:46.583+02:00</updated><title type='text'>How do you know when your classes get overweight?</title><content type='html'>Unless you refactor your code regularly, your classes will tend to grow bigger in terms of LOC and responsibilities. This is just the inertia of adding a little bit here and there without considering the need to separate concerns and apply the principles of "&lt;a href="http://en.wikipedia.org/wiki/Single_responsibility_principle"&gt;single responsibility&lt;/a&gt;" or "&lt;a href="http://en.wikipedia.org/wiki/Divide_and_conquer"&gt;divide and conquer&lt;/a&gt;".&lt;br /&gt;&lt;br /&gt;These days, I am working on a form with 5000 LOC (well, 2000 are designer generated code, so they don't count) and about 100 methods. These numbers are a good indicator that it might be time to consider doing some reorganizations (here, I am using the mildest language, I am capable of, heh). Another hint your class has gotten way too big, is the time it takes ReSharper to process it - about 10 seconds in my case.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-114053813680479579?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/114053813680479579/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=114053813680479579&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114053813680479579'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114053813680479579'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/02/how-do-you-know-when-your-classes-get.html' title='How do you know when your classes get overweight?'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-114045081210090504</id><published>2006-02-20T17:18:00.000+02:00</published><updated>2006-02-20T17:53:32.150+02:00</updated><title type='text'>DataBinding - a Blessing or a Curse</title><content type='html'>I was doing some WindowsForms coding today and had to deal with the concept of data binding. I am not a big fan of databinding. I am not an expert in it, either. But, I know it can save a few of stupid lines of code and I appreciate its declarative nature. On the other hand it has too many caveats that make me run away from it. If you are doing anything a bit complex, you have to understand in detail &lt;a href="http://www.freeweb.hu/noiseehc/databind.html"&gt;how databinding really works,&lt;/a&gt; what are &lt;a href="http://noiseehc.freeweb.hu/CurrencyManager.html"&gt;BindingContext and CurrencyManager&lt;/a&gt; and probably a lot more. I ran into a &lt;a href="http://www.petedavis.net/MySite/DynPageView.aspx?pageid=19"&gt;two&lt;/a&gt; &lt;a href="http://www.petedavis.net/MySite/DynPageView.aspx?pageid=22"&gt;part&lt;/a&gt; article on CurrencyManager that cleared some of my confusion, but did not won me on the databinding side.&lt;br /&gt;&lt;br /&gt;Some months ago I had to track a magic bug with simple databinding of columns to textbox and after wasting half a day in various experiments and searching the net for any clues, I finally had to give up. I just changed the code to skip the databinding altogether and did it in the straight forward way. Today it took me another hour to get clear why some simple things didn't work as expected and I don't think that databinding is worth all those troubles. Some people are convinced that databinding in .NET is just not usable. I think they are right to some extent, though I really would like to know how the design would look like when done right.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-114045081210090504?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/114045081210090504/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=114045081210090504&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114045081210090504'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114045081210090504'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/02/databinding-blessing-or-curse.html' title='DataBinding - a Blessing or a Curse'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-114019973154764106</id><published>2006-02-17T20:08:00.000+02:00</published><updated>2006-02-17T20:15:23.560+02:00</updated><title type='text'>Touch typing (week 9 overview)</title><content type='html'>&lt;p&gt; This was my last week of intensive &lt;a href="http://typingsoft.com/stamina.htm"&gt;Stamina&lt;/a&gt; practice and I think I finished it with style, heh. I beat my previous best of 288 CPM when today I passed the 300 CPM barrier scoring twice above it – &lt;b&gt;316 CPM (5.9% errors) &lt;/b&gt;and &lt;b&gt;311 CPM (4.6% errors)&lt;/b&gt;. Another very interesting score was &lt;b&gt;272 CPM (2.0% errors)&lt;/b&gt;. It was a great example of low error rate, but such low error rates are exception for my typing (on average I type with 7% errors on the exercises).&lt;br /&gt;&lt;/p&gt;&lt;p&gt;So let me give the links that log the progress of this learning experience: &lt;a href="http://immitev.blogspot.com/2005/12/fast-typing.html"&gt;Starting on Dec 21 2005&lt;/a&gt;, &lt;a href="http://immitev.blogspot.com/2005/12/touch-typing-week-1-overview.html"&gt;week 1&lt;/a&gt;, &lt;a href="http://immitev.blogspot.com/2005/12/touch-typing-week-2-overview.html"&gt;week 2&lt;/a&gt;, &lt;a href="http://immitev.blogspot.com/2006/01/touch-typing-week-3-overview.html"&gt;week 3&lt;/a&gt;, &lt;a href="http://immitev.blogspot.com/2006/01/touch-typing-week-4-overview.html"&gt;week 4&lt;/a&gt;, &lt;a href="http://immitev.blogspot.com/2006/01/touch-typing-week-5-overview.html"&gt;week 5&lt;/a&gt;, &lt;a href="http://immitev.blogspot.com/2006/01/touch-typing-week-6-overview.html"&gt;week 6&lt;/a&gt;, &lt;a href="http://immitev.blogspot.com/2006/02/touch-typing-week-7-overview.html"&gt;week 7&lt;/a&gt;, &lt;a href="http://immitev.blogspot.com/2006/02/touch-typing-week-8-overview.html"&gt;week 8&lt;/a&gt;. And &lt;a href="http://immitev.blogspot.com/2005/12/think-big.html"&gt;a bonus link&lt;/a&gt;, heh.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;So what the numbers say: Initial leap from 115 CPM to 196 CPM in week 2, 237 CPM in week 3, 254 CPM in week 4, 280 CPM in week 5, 288 CPM in week 7, and finally 316 CPM today. Beware, that these scores do not include the error rate, which is a crucial component. It was reduced from average of 12% to average of 7% (one of my mistakes along the way was probably, that I didn’t concentrate on reducing errors earlier in my training).&lt;br /&gt;&lt;/p&gt;&lt;p&gt;I just retook &lt;a title="" target="" href="http://www.typingtest.com"&gt;the test&lt;/a&gt; that I had taken in the beginning of my training (the old scores are crossed out). The improvements are not that spectacular, but this is due partly to the nature of the scoring and partly due to lack of training in this specific type of test.&lt;br /&gt;&lt;/p&gt;&lt;table style="width: 100%;" border="1" cellpadding="1" cellspacing="1"&gt;&lt;tbody&gt;&lt;br /&gt; &lt;tr&gt;&lt;br /&gt;   &lt;td style="width: 25%;"&gt;&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;   &lt;/td&gt;&lt;br /&gt;   &lt;td style="width: 25%;" align="center"&gt;&lt;b&gt; Fishing in Finland&lt;br /&gt;    &lt;br /&gt;&lt;/b&gt;&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;   &lt;/td&gt;&lt;br /&gt;   &lt;td style="width: 25%;" align="center"&gt;&lt;b&gt; Wonderful Wizard of OZ&lt;br /&gt;    &lt;br /&gt;&lt;/b&gt;&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;   &lt;/td&gt;&lt;br /&gt;   &lt;td style="width: 25%;" align="center"&gt;&lt;b&gt; Tigers in the Wild&lt;br /&gt;    &lt;br /&gt;&lt;/b&gt;&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;   &lt;/td&gt;&lt;br /&gt; &lt;/tr&gt;&lt;br /&gt; &lt;tr&gt;&lt;br /&gt;   &lt;td style="width: 25%;"&gt;&lt;b&gt; Gross speed (CPM)&lt;/b&gt;&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;   &lt;/td&gt;&lt;br /&gt;   &lt;td style="width: 25%;" align="center"&gt;&lt;strike&gt; 1&lt;/strike&gt;&lt;strike&gt;96 &lt;/strike&gt;242&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;   &lt;/td&gt;&lt;br /&gt;   &lt;td style="width: 25%;" align="center"&gt; &lt;strike&gt;220 &lt;/strike&gt;254&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;   &lt;/td&gt;&lt;br /&gt;   &lt;td style="width: 25%;" align="center"&gt;&lt;strike&gt; 218&lt;/strike&gt; 245&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;   &lt;/td&gt;&lt;br /&gt; &lt;/tr&gt;&lt;br /&gt; &lt;tr&gt;&lt;br /&gt;   &lt;td style="width: 25%;"&gt;&lt;b&gt; Errors (words)&lt;br /&gt;    &lt;br /&gt;&lt;/b&gt;&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;   &lt;/td&gt;&lt;br /&gt;   &lt;td style="width: 25%;" align="center"&gt;&lt;strike&gt; 17&lt;/strike&gt; 15&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;   &lt;/td&gt;&lt;br /&gt;   &lt;td style="width: 25%;" align="center"&gt;&lt;strike&gt; 17&lt;/strike&gt; 20&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;   &lt;/td&gt;&lt;br /&gt;   &lt;td style="width: 25%;" align="center"&gt;&lt;strike&gt; 22&lt;/strike&gt; 11&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;   &lt;/td&gt;&lt;br /&gt; &lt;/tr&gt;&lt;br /&gt; &lt;tr&gt;&lt;br /&gt;   &lt;td style="width: 25%;"&gt;&lt;b&gt; Net speed (CPM)&lt;br /&gt;    &lt;br /&gt;&lt;/b&gt;&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;   &lt;/td&gt;&lt;br /&gt;   &lt;td style="width: 25%;" align="center"&gt;&lt;strike&gt; 167&lt;/strike&gt; 217&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;   &lt;/td&gt;&lt;br /&gt;   &lt;td style="width: 25%;" align="center"&gt;&lt;strike&gt; 1&lt;/strike&gt;&lt;strike&gt;92&lt;/strike&gt; 222&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;   &lt;/td&gt;&lt;br /&gt;   &lt;td style="width: 25%;" align="center"&gt;&lt;strike&gt; 182&lt;/strike&gt; 228&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;   &lt;/td&gt;&lt;br /&gt; &lt;/tr&gt;&lt;br /&gt; &lt;tr&gt;&lt;br /&gt;   &lt;td style="width: 25%;"&gt;&lt;b&gt; Accuracy (%)&lt;br /&gt;    &lt;br /&gt;&lt;/b&gt;&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;   &lt;/td&gt;&lt;br /&gt;   &lt;td style="width: 25%;" align="center"&gt;&lt;strike&gt; 85 &lt;/strike&gt;89&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;   &lt;/td&gt;&lt;br /&gt;   &lt;td style="width: 25%;" align="center"&gt;&lt;strike&gt; 87&lt;/strike&gt; 86&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;   &lt;/td&gt;&lt;br /&gt;   &lt;td style="width: 25%;" align="center"&gt;&lt;strike&gt; 85&lt;/strike&gt; 92&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;   &lt;/td&gt;&lt;br /&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;br /&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-114019973154764106?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/114019973154764106/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=114019973154764106&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114019973154764106'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114019973154764106'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/02/touch-typing-week-9-overview.html' title='Touch typing (week 9 overview)'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-114018596750295933</id><published>2006-02-17T16:02:00.000+02:00</published><updated>2006-02-17T16:19:27.580+02:00</updated><title type='text'>Visual Feedback</title><content type='html'>Jeff Atwood has posted about the importance of &lt;a href="http://www.codinghorror.com/blog/archives/000518.html"&gt;Colorization&lt;/a&gt;. That's funny because I was just starting a rant how bad I feel when I work without ReSharper's highlighting in VS.NET (I had to turn it off temporarily, because of a monster class which took forever to be processed). It is amazing how less efficient I was, when staring at the traditional black and blue letters. Even though I missed the error highlighting on the fly, I realized that the proper colorization of code elements was just as important to me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-114018596750295933?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/114018596750295933/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=114018596750295933&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114018596750295933'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114018596750295933'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/02/visual-feedback.html' title='Visual Feedback'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-114010017005915829</id><published>2006-02-16T15:42:00.000+02:00</published><updated>2006-02-21T06:12:06.083+02:00</updated><title type='text'>LinkBlogs and Social Bookmarks</title><content type='html'>I wonder about the value of linkblogs. Basically these are daily/weekly lists of links that a blogger shares, because he finds them interesting or important. The links are usually accompanied with a brief description and commentary. Some linkblogs I read (or at least used to read when I had more time to do so) include:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://larkware.com/"&gt;"The Daily Grind" at Larkware.com&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codebetter.com/blogs/sam.gentile/archive/category/1221.aspx"&gt;Sam Gentile's "New And Notable" category&lt;br /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://jasonhaley.com/blog/default.aspx"&gt;Jason Haley's "Interesting Finds"&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.peterprovost.org/archive/2006/01/29/11162.aspx"&gt;Peter Provost's "Geek Notes" category&lt;br /&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Usually about half of the links I've already seen. Naturally, some links are irrelevant to me, but there are always ones that I find interesting. I wonder where the noise-to-value ratio is less: in linkblogs or in social bookmarks sites like &lt;a href="http://del.icio.us/"&gt;del.icio.us &lt;/a&gt;or &lt;a href="http://www.digg.com/"&gt;digg&lt;/a&gt;? Last week I spent some time to look at &lt;a href="http://www.digg.com/"&gt;digg&lt;/a&gt; and after investigating more than 50 links in &lt;span style="text-decoration: underline;"&gt;its &lt;/span&gt;&lt;a href="http://www.digg.com/programming"&gt;"programming" category&lt;/a&gt; there were just 5 that were interesting enough to be read diligently.&lt;br /&gt;&lt;br /&gt;The noise in linkblogs  is usually slightly lower. Linkblogs  also have the advantage that once you get to know what the blogger is interested in, you can decide whether to continue reading them.&lt;br /&gt;&lt;br /&gt;Having a rich enough subscriptions list, I was reluctant to try any social bookmarking sites, but they surely have some advantages. You can keep your favourite links organized and later find them very easily. And when you have a decent browser/aggregator integration it is almost effortless. So I am becoming a more and more active &lt;a href="http://del.icio.us/immitev"&gt;del.icio.us user&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-114010017005915829?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/114010017005915829/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=114010017005915829&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114010017005915829'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/114010017005915829'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/02/linkblogs-and-social-bookmarks.html' title='LinkBlogs and Social Bookmarks'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-113999445650517055</id><published>2006-02-15T10:50:00.000+02:00</published><updated>2006-02-15T11:07:37.593+02:00</updated><title type='text'>On "Mark Miller works the DXCore" dnrTV show</title><content type='html'>I would highly recommend watching &lt;a href="http://www.dnrtv.com/default.aspx?showID=5"&gt;Mark Miller works the DXCore &lt;/a&gt;on dnrtv.com. This is a great show, demonstrating the things you can do with the free &lt;a href="http://www.devexpress.com/Downloads/NET/DXCore/"&gt;DxCore&lt;/a&gt; VS.NET add-in. In less than an hour Mark built a pretty sniffy VS.NET extension, while simultaneously demonstrating the productivity features of &lt;a href="http://www.devexpress.com/Products/NET/CodeRush/"&gt;CodeRush&lt;/a&gt; and &lt;a href="http://www.devexpress.com/Products/NET/Refactor/"&gt;Refactor!&lt;/a&gt;. These two products look pretty cool, especially for demos (there are animated arrows flying around telling you what clever feature you are using). Well, I find ReSharper to be a bit more practical tool, but that's probably just because I've got used to using it.&lt;br /&gt;&lt;br /&gt;So if you have a clever idea for a VS.NET extension you will save a lot of efforts if you take a look at DxCore and some of the &lt;a href="http://codebetter.com/blogs/jay.kimble/archive/2005/08/11/130595.aspx"&gt;available addins &lt;/a&gt;built on it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-113999445650517055?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/113999445650517055/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=113999445650517055&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/113999445650517055'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/113999445650517055'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/02/on-mark-miller-works-dxcore-dnrtv-show.html' title='On &quot;Mark Miller works the DXCore&quot; dnrTV show'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-113991674323914902</id><published>2006-02-14T13:25:00.000+02:00</published><updated>2006-02-15T05:56:33.940+02:00</updated><title type='text'>It will be Ruby</title><content type='html'>After my recent ruminations about &lt;a href="http://immitev.blogspot.com/2006/02/language-considerations-ruby-and-lisp.html"&gt;LISP and Ruby&lt;/a&gt;,  I listened to an interesting &lt;a href="http://www.theserverside.com/talks/videos/DaveThomas/interview.tss?bandwidth=dsl"&gt;interview with David Thomas&lt;/a&gt; and I ran into a fascinating comparison of &lt;a href="http://www.dmh2000.com/cjpr/index.shtml"&gt;C++ vs Java vs Python vs Ruby&lt;/a&gt;. I am becoming more and more convinced that if I decide to invest time in learning a new computer language, it has got to be Ruby. I should get a good (preferably short) book on the topic (maybe &lt;a href="http://www.rubycentral.com/book/"&gt;this one&lt;/a&gt;), but I wonder where to practice Ruby programming. Let's hope that there will be some tasks at work, suited it. I may also start a pet project with Ruby if I got hooked very much, but that's not much likely.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-113991674323914902?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/113991674323914902/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=113991674323914902&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/113991674323914902'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/113991674323914902'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/02/it-will-be-ruby.html' title='It will be Ruby'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-113969129485832694</id><published>2006-02-11T22:42:00.000+02:00</published><updated>2006-02-11T22:54:54.933+02:00</updated><title type='text'>Touch typing (week 8 overview)</title><content type='html'>Another week of eased touch typing practice passed and I missed a few days of practise. But today I had a few seesions and did some progress on lowering error rate. For example I did 279 CPM with 4.7% errors and I just made 253 CPM with 2.5% errors. I liked the 2.5% errors session better and I feel I can further improve it. I wonder why is it so hard for me to type completely error-free?&lt;br /&gt;&lt;br /&gt;But, you know, 8 weeks of touch typing seem enough time investiment to me, and I plan the next week to be my last one with this practice (to sum up 2 completet months). I may refresh my skills once or twice a week with 15 mnutes practise, but this skill acquisition process will not be that active after next Friday. I also plan to retake the exam I took in the beginning of this endeavour to see how much I improved (though I don't think it's scoring is very objective).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-113969129485832694?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/113969129485832694/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=113969129485832694&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/113969129485832694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/113969129485832694'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/02/touch-typing-week-8-overview.html' title='Touch typing (week 8 overview)'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-113958689916417589</id><published>2006-02-10T17:49:00.000+02:00</published><updated>2006-02-10T21:55:41.313+02:00</updated><title type='text'>My Firefox Configuration</title><content type='html'>Firefox has been my default browser &lt;a href="http://immitev.blogspot.com/2005/12/another-firefox-convert.html"&gt;for a few months, &lt;/a&gt;and I have been experimenting with some extensions for power users. Today I find &lt;a href="http://www.mrtech.com/extensions/local_install/"&gt;the ultimate extension&lt;/a&gt; that can help me cope with the other extensions I have installed, heh. Take a look at what HTML file it generated automatically.  Nice!&lt;br /&gt;&lt;br /&gt;&lt;style type="text/css"&gt;&lt;br /&gt;body { background: #FFFFFF; color: #1F007F; font-family:Arial; font-size: 12px;} .ExtensionHeader {font-weight: bold; } .ExtensionDisabledHeader  {font-weight: bold; } .ThemeHeader {font-weight: bold; } .PluginHeader {font-weight: bold; }.GeneratedHeader {font-weight: bold; } .UserAgentHeader {font-weight: bold; } .BuildIDHeader {font-weight: bold; }&lt;br /&gt;&lt;/style&gt;&lt;br /&gt;&lt;span class="GeneratedHeader"&gt;Generated:&lt;/span&gt; Fri Feb 10 2006 17:52:00 GMT+0200 (FLE Standard Time)&lt;br /&gt;&lt;br /&gt;&lt;span class="UserAgentHeader"&gt;User Agent:&lt;/span&gt; Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.1) Gecko/20060111 Firefox/1.5.0.1&lt;br /&gt;&lt;br /&gt;&lt;span class="BuildIDHeader"&gt;Build ID:&lt;/span&gt; 2006011112&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="ExtensionHeader"&gt;Enabled Extensions:&lt;/span&gt; [16]&lt;br /&gt;&lt;br /&gt;&lt;li&gt; &lt;a href="http://adblock.mozdev.org"&gt;Adblock&lt;/a&gt; 0.5.3.042&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; &lt;a href="http://roachfiend.com"&gt;BugMeNot&lt;/a&gt; 1.3&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; &lt;a href="http://www.customizegoogle.com/"&gt;CustomizeGoogle&lt;/a&gt; 0.41&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; &lt;a href="http://del.icio.us/"&gt;del.icio.us&lt;/a&gt; 1.0.2&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; &lt;a href="http://extensions.aeruder.net"&gt;Download Embedded&lt;/a&gt; 0.2&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; &lt;a href="http://downthemall.mozdev.org"&gt;DownThemAll!&lt;/a&gt; 0.9.8.7&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; &lt;a href="http://www.longfocus.com/firefox/gmanager"&gt;Gmail Manager&lt;/a&gt; 0.4.3.2&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; &lt;a href="http://ietab.mozdev.org/"&gt;IE Tab&lt;/a&gt; 1.0.7&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; &lt;a href="http://optimoz.mozdev.org/gestures/"&gt;Mouse Gestures&lt;/a&gt; 1.0.4&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; &lt;a href="http://www.mrtech.com/extensions/local_install/"&gt;MR Tech Local Install&lt;/a&gt; 4.1.1&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; &lt;a href="http://tecwizards.de/mozilla/"&gt;Paste and Go&lt;/a&gt; 0.4.3&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; &lt;a href="http://www.rabotat.org/firefox/"&gt;PDF Download&lt;/a&gt; 0.6&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; &lt;a href="http://aluminum.sourmilk.net/reveal/"&gt;Reveal&lt;/a&gt; 1.0.5&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; &lt;a href="http://adblock.ethereal.net/alchemy.cgi/SessionSaver"&gt;SessionSaver .2&lt;/a&gt; 0.2.1.031&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; &lt;a href="http://tmp.garyr.net"&gt;Tab Mix Plus&lt;/a&gt; 0.3.0.2&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; &lt;a href="http://www.hypercubed.com/projects/firefox/"&gt;Xinha Here!&lt;/a&gt; 0.7&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="ExtensionDisabledHeader"&gt;Disabled Extensions:&lt;/span&gt; [2]&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; &lt;a href="http://spellbound.sourceforge.net/"&gt;Mozilla SpellCheck Libraries&lt;/a&gt; 1.0.1.0&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; &lt;a href="http://spellbound.sourceforge.net/"&gt;SpellBound&lt;/a&gt; 0.7.3&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="ExtensionHeader"&gt;Total Extensions: 18&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="ThemeHeader"&gt;Installed Themes:&lt;/span&gt; [1]&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; &lt;b&gt;&lt;a href="http://www.mozilla.org/"&gt;Firefox (default)&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="PluginHeader"&gt;Installed Plugins:&lt;/span&gt; (6)&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; Microsoft® DRM&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; Mozilla Default Plug-in&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; PCMan's IE Tab Plug-in for Mozilla/Firefox&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; QuickTime Plug-in 7.0.3&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; Shockwave Flash&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; Windows Media Player Plug-in Dynamic Link Library&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-113958689916417589?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/113958689916417589/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=113958689916417589&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/113958689916417589'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/113958689916417589'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/02/my-firefox-configuration.html' title='My Firefox Configuration'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-113958233675932586</id><published>2006-02-10T16:03:00.000+02:00</published><updated>2006-02-10T16:38:56.826+02:00</updated><title type='text'>ReSharper EAP</title><content type='html'>I have been using build 215 and 216 of &lt;a href="http://www.jetbrains.net/confluence/display/ReSharper/Download"&gt;Resharper 2.0 EAP &lt;/a&gt;with VS.NET 2003 (and a little with VS.NET 2005) for about two weeks and I have been very happy with all the new features that it offers. It is still quite buggy, but the new features are so compelling that I have decided to live with it. There are some little problems with graphics and sometimes the internal parser's state gets messed up, but I have not experienced no extremely bad consequence. Today was the first time my IDE crashed completely, but I just saw that there is a new bugfix build 217, that might have addressed this problem.&lt;br /&gt;&lt;br /&gt;It is interesting how tools influence the way you work. Now I am doing somewhat strange refactorings such as replacing unnecessary &lt;span style="font-style: italic;"&gt;static readonly&lt;/span&gt; with &lt;span style="font-style: italic;"&gt;const&lt;/span&gt;, in order to take advantage of Resharper's ability to show me a tooltip with the value of the constant. That is quite useful when you have texts as const variables. I don't have to navigate to them to see their value and that's how I am saving two keystrokes :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-113958233675932586?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/113958233675932586/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=113958233675932586&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/113958233675932586'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/113958233675932586'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/02/resharper-eap.html' title='ReSharper EAP'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-113948689492599310</id><published>2006-02-09T14:05:00.000+02:00</published><updated>2006-02-10T23:49:39.163+02:00</updated><title type='text'>Language considerations Ruby and LISP</title><content type='html'>&lt;span lang="EN-US"&gt;I often wonder if all the talk about programming languages is worth. Really, there are lot of articles and dicussions on this issue - just visit the popular programming related topics at &lt;a href="http://del.icio.us/"&gt;del.icio.us&lt;/a&gt;. Each day you will see plenty of links to programming languages, and Ruby and LISP are currently leading the field.&lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;span lang="EN-US"&gt;I was reading a lot of &lt;a href="http://www.paulgraham.com/"&gt;Paul Graham&lt;/a&gt; articles lately and I was a bit perplexed how devoted LISP fanatic he is. And he is &lt;/span&gt;&lt;span lang="EN-US"&gt;definitely &lt;/span&gt;&lt;span lang="EN-US"&gt;not the only one. I just finished an interesting (and somewhat funny) article &lt;a href="http://opal.cabochon.com/%7Estevey/blog-rants/tin-foil-hats.html"&gt;Tin Foil Hats and Rubber Ducks&lt;/a&gt; which basically said that LISP is the answer (read it to understand what the question was). I also stumbled upon an excellent post by Sriram Krishnan &lt;a href="http://blogs.msdn.com/sriram/archive/2006/01/15/lisp_is_sin.aspx"&gt;LISP Is Sin&lt;/a&gt;. There I saw claims like the one that&lt;/span&gt; Peter Norvig's &lt;a href="http://www.amazon.com/gp/product/1558601910/002-6413815-3000828?v=glance&amp;n=283155"&gt;Paradigms of Artificial Intelligence Programming - Case Studies in Common Lisp&lt;/a&gt;&lt;span lang="EN-US"&gt; is “&lt;/span&gt;the best book on programming ever&lt;span lang="EN-US"&gt;”. Sounds interesting?&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span lang="EN-US"&gt;So if you read those articles, you might take LISP really seriously. There are some newly emerging anguages in the Lisp family &lt;span style="text-decoration: underline;"&gt;like &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;a href="http://www.dirkgerrits.com/programming/erlisp/"&gt;Erlisp&lt;/a&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt; which will add threading support and distributed features. My personal experience with functional programming is from the university where I took the regular Scheme course. I can’t say I was that impressed, though having the possibility to the some more high-level programming was interesting. I wonder how LISP would feel on a real project, will it scale well and how easy will be to test and maintain the codebase.&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;span lang="EN-US"&gt;The Ruby language is really getting more and more popular and it looks like it may become mainstream sooner or later, being promoted by &lt;a href="http://www.amazon.com/gp/product/0974514055/002-5071073-6346403?v=glance&amp;amp;n=283155"&gt;the pragmatic programmers&lt;/a&gt; and many other influential figures in the industry. I have note really tried to do anything in Ruby, except playing for 15 minutes with it &lt;a href="http://tryruby.hobix.com/"&gt;online&lt;/a&gt;. Can’t say much about it! You might check the post &lt;a href="http://randomhacks.net/articles/2005/12/03/why-ruby-is-an-acceptable-lisp"&gt;Why Ruby is an acceptable LISP&lt;/a&gt; - it makes some really good points.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;These language discussions make me think about whether being focused entirely on C# &lt;/span&gt;&lt;span lang="EN-US"&gt;and .NET &lt;/span&gt;&lt;span lang="EN-US"&gt;in the last dew years was a good decision. I actually think it was, though it might not ahve been the best one. In retrospect, it took me about two years to become a decent C# developer (I thought I was good a lot earlier, but this was selfdillusionment, heh). There are just a lot of best practices to learn, not only in coding but also in the broader topic of object-oriented design. If I have let myself be distracted by languages like Ruby and LISP, I would not have been that proficient and productive with C# now.&lt;br /&gt;&lt;br /&gt;Well, many authorities say that in the long run it is wise to learn a new language each year, but I don’t really think that’s true, unless you have it as a hobby. You might be preparing for solving problems that never really show up. Maybe the agile approach to attack the current problems at hand is more effective, but if you are doing it only for fun, it is a different story.&lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;span lang="EN-US"&gt;I find a parallel between reading weblogs and learning languages. You might learn something new (I learned a lot from weblogs) but sooner or later you get stopped by the law of diminishing returns. In the recent months there were progresively less things that I found valuable in the weblogs I read, so I had to unsubscribe from some and subscribe to others. Maybe it is time for me to drop some of my .NET blogs and to focus on something else for a while? If I knew that I would use in the coming months .NET 2.0, I would probably not have thought about it. But it doesn’t seem likely, so I might give Ruby a shot. &lt;a href="http://www.ruby-doc.org/whyruby"&gt;Why Ruby&lt;/a&gt; or &lt;a href="http://weblog.hypotheticalabs.com/?p=59"&gt;why not&lt;/a&gt;?&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-113948689492599310?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/113948689492599310/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=113948689492599310&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/113948689492599310'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/113948689492599310'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/02/language-considerations-ruby-and-lisp.html' title='Language considerations Ruby and LISP'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-113933127964722999</id><published>2006-02-07T18:24:00.000+02:00</published><updated>2006-03-07T03:24:49.326+02:00</updated><title type='text'>Launchers - revisited</title><content type='html'>&lt;p&gt;Since my last &lt;a href="http://immitev.blogspot.com/2005/12/quick-launch-utilities.html"&gt;post &lt;/a&gt;about launchers, I had the chance to try a few others, just for the fun of it.&lt;br /&gt;&lt;/p&gt;I liked &lt;a href="http://colibri.leetspeak.org/"&gt;Collibri&lt;/a&gt;, which is pretty much like &lt;a href="http://launchy.sourceforge.net/"&gt;Launchy&lt;/a&gt;, but its GUI is far superior (well, the price you pay is a few more megabytes of your RAM). It can even do things like Google search and a few other goodies, but I don't find those that useful. I just noticed, that Launchy has gotten a recent update and has some new features, but for right now, I'll use Colibri (it is better in impressing my co-workers, too).&lt;br /&gt;&lt;p&gt;Another cool app is &lt;a href="http://www.cowonamerica.com/products/jettoolbar/"&gt;JetToolBar&lt;/a&gt; succeeds to improve the experience with starting things in Windows by creating a toolbar with categories where you put your shortcuts. It does its job in a pretty nice way. You can move the toolbar in any position on the screen, it can autohide and come again with a hotkey.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;I accidently tried a commercial app called &lt;a href="http://www.codesector.com/jetstart.asp"&gt;JetStart&lt;/a&gt;, which combines nearly all the features I expect from such type of software. It has very well thought GUI and integrates seamlessly with Windows (some might say that it is even too intelligent, heh). In fact, it has a free version, which only major limitation is that you can't add your own categories.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-113933127964722999?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/113933127964722999/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=113933127964722999&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/113933127964722999'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/113933127964722999'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/02/launchers-revisited.html' title='Launchers - revisited'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-113906983859431519</id><published>2006-02-04T18:17:00.000+02:00</published><updated>2006-02-04T18:17:20.863+02:00</updated><title type='text'>Touch typing (week 7 overview)</title><content type='html'>This week I eased my touch typing training and had two days without Stamina practice. The next week I will concentrate solely on errorless typing. Till now, I have never reached less than 3.5% errors and I wonder how it feels to do with 1% errors or less. I will try to do it, even if that means I have to type with 60 CPM for a while. I have a feeling that error-free typing can create some kind of a flow that may increase speed substantially.&lt;br/&gt;&lt;br/&gt;Actually, this week I beat my personal best, scoring 288 CPM today (7.1% error rate). I also did some other good session like 275 with 6.3% error rate and similar. I pretty consistently type with speeds between 270 and 285 CPM, though there are sessions I settle for 240 CPM.&lt;br/&gt;&lt;br/&gt;I try to analyze what my greatest difficulties in typing are. When I see an uppercase letter coming, I lose a lot of time, coordinating my movements. I know I should hit the key with one hand while the other hands reaches for the Shift key, but often I do a mirrored move, which gives me, for example, T instead of I, heh. I also have some problems with the punctuation and with the symbols like $#&amp;*. I better turn back to “lesson” mode to memorize these character positions better.&lt;br/&gt;&lt;br/&gt;This week my typing companion piece of writing was Richard Hamming’s talk &lt;a href="http://www.paulgraham.com/hamming.html"&gt;You and Your Research&lt;/a&gt;, that Paul Graham highly recommended in his essay &lt;a href="http://www.paulgraham.com/procrastination.html"&gt;Good And Bad Procrastination&lt;/a&gt;. It is a very insightful talk and if one wants to become great in the area he works in (even if it is not science), it is a recommended reading. Well, it is rather lengthy (I had to hit about 30 times PgDn to get to its end in my browser) but still I think it’s worth.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-113906983859431519?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/113906983859431519/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=113906983859431519&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/113906983859431519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/113906983859431519'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/02/touch-typing-week-7-overview.html' title='Touch typing (week 7 overview)'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-113854627636640689</id><published>2006-01-29T16:51:00.000+02:00</published><updated>2006-01-29T16:51:16.430+02:00</updated><title type='text'>Setting up my work computer</title><content type='html'>Yesterday I set up my work computer, which had its hard drive finally replaced after the &lt;a href="http://immitev.blogspot.com/2006/01/computer-misfortunes.html"&gt;crash&lt;/a&gt;. The good news was that the data in the D: drive was rescued (unfortunately, that was the less important data for me, because I had recently made a backup). I started with already installed Windows XP and MS Office plus the essential development tools for my current project VS.NET 2003 and SQL Server 2000.&lt;br/&gt;&lt;br/&gt;In the following five hours I installed (after downloading the latest version if necessary) about 40 tools (I was somewhat conservative, heh) . Setting Firefox with about 10 extensions, installing 7 essential VS.NET addins, tweaking numerous options of Windows XP, VS.NET and of a bunch of other programs.&lt;br/&gt;&lt;br/&gt;But after a good deal of installation and customizations I realized that I was working in another profile, used by our sys-admin. Fortunately, I always tend install programs for all user of the computer, so this was not a big problem. A manual moving of a few customizations files from one profile to the other worked quite OK and interestingly nothing messed up. Nearly everything went smooth except setting up the MS Outlook account, which took me about half an hour to figure out the right way to do it. But apparently I got it wrong since there are no longer items in my Inbox when now I connect with the web access to our Exchange server.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-113854627636640689?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/113854627636640689/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=113854627636640689&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/113854627636640689'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/113854627636640689'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/01/setting-up-my-work-computer.html' title='Setting up my work computer'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-113853489150140417</id><published>2006-01-29T13:41:00.000+02:00</published><updated>2006-01-29T13:41:31.563+02:00</updated><title type='text'>Touch typing (week 6 overview)</title><content type='html'>This week I couldn’t beat my personal best of 280 CPM, but I decreased my error rate significantly. My first attempt on putting accuracy as a higher priority than speed gave me 277 CPM with 4.8% error rate which is apparently more effective than 280 CPM with 10.5% error rate. It is remarkable that such a little shift of attention gave such unexpected results. I continued to practice accuracy and scored 255 CPM with 4.1% error rate and 225 CPM with 3.1%. I definitely have to improve on this. It actually felt pretty hard to keep focus on accuracy when for 5 weeks I had concentrated solely on speed. When I get bored and anxious of errors I unconsciously tend to increase my speed.&lt;br/&gt;&lt;br/&gt;It is interesting to try to estimate how error rate affects the effectiveness of typing. There are several factors that need to be considered. The most important is the demand for accuracy. When chatting, for example, speed solely is equal to effectiveness, but for any other type of writing, accuracy is a must. But when I type in MS Word, some of my errors get corrected on the fly (i.e. “whehter” is fixed to “whether”) without me even noticing, which decreases the importance of making errors.&lt;br/&gt;&lt;br/&gt;Some writings also require a revision in which I can fix the mistakes along of making other improvements like rewording or elaborating my ideas. On the other hand password input is an example of typing requiring accuracy. But though in theory I can always go back and correct my mistakes after I am finished with the initial typing, in practice I usually spot my errors very soon (often immediately after I hit the wrong key) and I tend to Backspace and retype in order to get it fixed right away. That means that if I am making a lot of mistakes, my effective typing rate is greatly affected by my error rate. Probably one percent error rate results in at least 3-5 percent decrease of gross efficiency, since one has to switch to correction mode and interrupt his flow.&lt;br/&gt;&lt;br/&gt;Another thing I realized is how important keyboard position is. &lt;a href="http://ergo.human.cornell.edu/AHTutorials/typingposture.html"&gt;Studies&lt;/a&gt; show that the keyboard should better be lower than your elbows and wrists so that you don’t have strains. Also the keyboard should have a negative slope so that your fingers can move more easily to the numeric keys and the functional keys. My keyboard at home was laying above my elbows so I had to put a pillow on which I can sit in order to deal with this problem. I tried it and I no longer feel a tension or tiredness after a long period of typing. Try it yourself, you will see a difference!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-113853489150140417?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/113853489150140417/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=113853489150140417&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/113853489150140417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/113853489150140417'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/01/touch-typing-week-6-overview.html' title='Touch typing (week 6 overview)'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-113845849915613473</id><published>2006-01-28T16:13:00.000+02:00</published><updated>2006-01-28T16:28:19.166+02:00</updated><title type='text'>Catching Up With Audio Content</title><content type='html'>Last week I had the chance to catch up with some great audio content. Recommended listening:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://hanselminutes.com/"&gt;Hansel Minutes &lt;/a&gt;- Scott Hanselman is one my favourite bloggers and his 3 audio shows were great listening too.&lt;/li&gt;&lt;li&gt;&lt;a href="http://weblogs.asp.net/rosherove/archive/2006/01/22/436154.aspx"&gt;Johanna Rothman: Moving Towards Agile Project Management&lt;/a&gt; - Johanna is definitely one of the notable woman in the industry and she does another great presentation&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span id="ShowLatest1_lblDescription"&gt;&lt;a href="http://dotnetrocks.com/default.aspx?showID=163"&gt;Adam Cogan on DotNetRocks&lt;/a&gt; - This is a must hear. Adam is the most active contributor to the comprehensive &lt;a href="http://ssw.com.au/SSW/Standards/Default.aspx"&gt;SSW Rules to Better...&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span id="ShowLatest1_lblDescription"&gt;&lt;a href="http://dotnetrocks.com/default.aspx?showID=162"&gt;Shawn Wildermuth on Decomposing ADO.NET &lt;/a&gt;(again on &lt;a href="http://dotnetrocks.com"&gt;DotNetRocks&lt;/a&gt;) - entertaining  conversation about various .NET and other projects Shawn have participated in&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span id="ShowLatest1_lblDescription"&gt;&lt;a href="http://perlcast.com/2006/01/27/interview-with-chad-fowler/"&gt;Chad Fowler interview on Perlcast.com &lt;/a&gt;- Interesting talk about outsourcing and on software development in India&lt;/span&gt;&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/6471778-113845849915613473?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/113845849915613473/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=113845849915613473&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/113845849915613473'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/113845849915613473'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/01/catching-up-with-audio-content.html' title='Catching Up With Audio Content'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-113828251070196576</id><published>2006-01-26T15:35:00.000+02:00</published><updated>2006-01-26T15:35:10.773+02:00</updated><title type='text'>Using Computers Painlessly and Productively</title><content type='html'>Being a computer user for a pretty long time and probably for much more time to come, I am becoming interestingly interested in how to make my computer interaction maximally enjoyable and productive. Since I have been training to become a fast typist for the last six week (or at least to learn the QWERTY keyboard by heart so skip the hunt and peck searching of keys), a logical accompanying step for me is to use the mouse less often, and use the keyboard instead. Everyone has been saying that you can’t be much productive being a clicker, and they are right. &lt;br/&gt;&lt;br/&gt;In the last 6 months I have becoming increasingly fond of keyboard shortcuts, starting with &lt;a href="http://www.codinghorror.com/blog/archives/000315.html"&gt;VS.NET 2003 shortcuts&lt;/a&gt;, then learning more of the &lt;a href="http://www.theeldergeek.com/keyboard_shortcuts_for_xp.htm"&gt;Windows XP shortcuts&lt;/a&gt; and some of the &lt;a href="http://www.personal-computer-tutor.com/officeshortcuts.htm"&gt;MS Office shortcuts&lt;/a&gt;. If you are already a power user of any tool you better do yourself the favor of learning the shortcuts. As I blogged about few weeks ago I also use &lt;a href="http://immitev.blogspot.com/2005/12/quick-launch-utilities.html"&gt;three tools&lt;/a&gt; for fast launching programs and documents. Well, sometimes this might gets confusing, remembering such magic keys. I often hit F5 instead of F9 in MS Outlook as if I want not to check mail, but to compile it, heh.&lt;br/&gt;&lt;br/&gt;Another thing I have not given enough attention is ergonomics (this is a whole new science). Being about 8 hours a day in front of the computer, surely, affects various aspects of my body. There are numerous examples of people having developed pains due to bad habits when using the computer. I found a great &lt;a href="http://eeshop.unl.edu/rsi.html"&gt;very comprehensive resource&lt;/a&gt; that tells you what these problems are and how to avoid them. It has lot of links to additional information in case you want to dig deeper in any specific area. &lt;br/&gt;&lt;br/&gt;My own experience is that I have difficulties doing simple proven healthy things like resting my eyes regularly and doing exercises each hour or less. I tried to remind myself to do it by using a cool program called &lt;a href="http://www.workrave.org/download/"&gt;Workrave&lt;/a&gt;, but after awhile I conditioned myself to ignore it. And I uninstalled it when it became an annoyance rather than a helper. I have tried other tools as well but they worked for even less time, and I think a way for such a program to be more effective is to be adaptive and change its ways of attracting your attention. On the other hand I often prefer not to be distracted in the middle of something I do. There are not many occasions when one really is in the flow and it is very ineffective to get interrupted. &lt;br/&gt;&lt;br/&gt;I am now thinking of some other way, instead of a distracting, to get a tool that just records my behavior in front of the computer. I can then analyze its log and figure out when I take breaks and how much time I spent on a task. The tool has to be able to let me start and stop task recording very quickly. I have not succeeded to find the right tool for the job yet, but I can extend one &lt;a href="http://msdn.microsoft.com/coding4fun/inthebox/timetrack/default.aspx"&gt;sample program&lt;/a&gt; that I found in the Coding4fun articles. Its simple and that’s what I need but I don’t see why you have to start and stop tasks. At any moment of your day you are doing something. It is OK to have activities like “taking a break” and “watching the wall dumbly”. Hmm, and an important requirement is that the current activity should be always visible on the screen so maybe a toolbar in the system tray is the best place to put it. Oh, I can imagine so many handy features for such a tool, but the focus should be on simplicity.&lt;br/&gt;&lt;br/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-113828251070196576?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/113828251070196576/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=113828251070196576&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/113828251070196576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/113828251070196576'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/01/using-computers-painlessly-and.html' title='Using Computers Painlessly and Productively'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-113821072690801190</id><published>2006-01-25T19:38:00.000+02:00</published><updated>2006-01-25T19:38:46.953+02:00</updated><title type='text'>Targeting .NET 1.1 in VS.NET 2005</title><content type='html'>Last week I have been struggling with the strange idea of mine to use VS.NET 2005 with&amp;nbsp;&amp;nbsp;a project that should target .NET 1.1. To make a long story short it didn’t go smooth. I had especially huge troubles with strongly typed datasets. During the conversion a bunch of new files got added, and now there are all these .xsc, .xsd, .xsx files. I can’t view and edit my .xsd in simple XML. I had to manually add the generated .cs file to the solution in order to have them built in the assembly (probably a problem with &lt;a href="http://blogs.msdn.com/jomo_fisher/articles/410896.aspx"&gt;the MSBuild target for .NET 1.1&lt;/a&gt; I found). So if you are thinking to continue targeting only .NET 1.1, I don’t recommend using VS.NET 2005 unless you have plenty of time to fight your way thorough it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-113821072690801190?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/113821072690801190/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=113821072690801190&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/113821072690801190'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/113821072690801190'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/01/targeting-net-11-in-vsnet-2005.html' title='Targeting .NET 1.1 in VS.NET 2005'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-113819982807062656</id><published>2006-01-25T16:37:00.000+02:00</published><updated>2006-01-25T16:37:08.120+02:00</updated><title type='text'>Managing Dependencies Instead of Avoiding Them</title><content type='html'>Jeff Atwood has blogged about &lt;a href="http://www.codinghorror.com/blog/archives/000497.html"&gt;Avoiding Dependencies&lt;/a&gt; and links there to an &lt;a href="http://www.joelonsoftware.com/articles/fog0000000007.html"&gt;old article&lt;/a&gt; by Joel Spolsky, defending the &lt;a href="http://en.wikipedia.org/wiki/Not_Invented_Here"&gt;Not-Invented-Here Syndrome&lt;/a&gt;. I think that Joel has made his point well. He emphasizes on “If it's a core business function -- do it yourself, no matter what.” But I cannot agree with all of what Jeff is saying (and that’s not just because I am one of those developers “trolling downloads and experimenting with every tool listed on &lt;a href="http://www.larkware.com/"&gt;The Daily Grind&lt;/a&gt;”, ha-ha). &lt;br/&gt;&lt;br/&gt;It is just a matter of trustworthiness. I trust in most things Microsoft produces, but I also trust on many of the third party software vendors – many of them have proven that their quality is superb. I also trust in many open source projects. You just don’t have to dive in them blindly, but you should develop evaluation skills and start with looking not only the current state but also predicting the future of the project. I can fairly quickly decide if a library looks reliable by looking at its code and by searching what other people say about it (well, I confess I have been tricked about a POP3/MIME component &lt;a href="http://immitev.blogspot.com/2005/11/cpsphere-net-e-mail-components.html"&gt;recently&lt;/a&gt;). &lt;br/&gt;&lt;br/&gt;But Jeff talks here not about OSS, but rather about commercial third party tools where you can be overwhelmed with licensing problems and patches. There is definitely a cost of getting those right, but IMHO the benefits are often greater.&lt;br/&gt;&lt;br/&gt;Let’s say that you are developing a desktop app that has to look professional. I really don’t think you can do it in a reasonable amount of time with the standard WinForms controls. They were pretty primitive in .NET 1.1 and have slightly improved in .NET 2.0 (there are some very nice new ones). But no wonder there are hundreds of third party replacements of the classical &lt;a href="http://msdn.microsoft.com/library/en-us/cpref/html/frlrfsystemwindowsformsdatagridclasstopic.asp"&gt;DataGrid&lt;/a&gt;. I have used a DataGrid in a real app and had to dig into Google just to complete somewhat trivial tasks. In my next project I had used third party controls which where very nice and required little or no coding for my part. Well, they have a learning curve and had some quirks here and there, but I find this acceptable. Since I have never written complex UI controls myself, I am sure that I would have spent months trying to get things the way I wanted them and the GUI would have been very hard to tweak and improve on later stages. And if you write business apps like me, your core competencies should include deciding wisely what dependencies to choose and how to manage them well. I often wonder if my coding is mostly making components and libraries play together nicely, but actually there is a lot more than it.&lt;br/&gt;&lt;br/&gt;Even if one of your dependencies fails you consistently and you can get it fixed, you can replace any time with your self-made solution or another vendor’s. It will not be always easy but it won’t be impossible either. Just ensure that you have have covered your code with tests and that you have isolated dependencies in a way that makes it easy to drop them anytime.&lt;br/&gt;&lt;br/&gt;Jeff also gave the MSFT Patterns as example of a &lt;a href="http://msdn.microsoft.com/practices/"&gt;giant, complex frameworks&lt;/a&gt;. And probably he is right that the &lt;a href="http://workspaces.gotdotnet.com/entlib"&gt;Enterprise Library&lt;/a&gt; should be used on truly enterprise solutions, where it will pay off. The downside in using it is that you have to learn a lot. You have to get good in discovering functionality and the right way to use APIs. Another potential downside is that the next version may have breaking changes, but that pretty much sums the negatives. But while using it, you learn about good design and that will definitely pay off in the long run. You will also end up with a code that will be easily extendable, because this library is designed by pretty smart people and surely it has some desirable qualities such as orthogonality and extensibility. Actually in my current project we considered using it, but we didn’t find enough reasons to do so, and I think this was the right decision. The only problematic area in which we struggled a bit was our data access layer code, which was a legacy from another system. We should have started clean and do it by probably using the ideas and code by the &lt;a href="http://msdn.microsoft.com/library/en-us/dnpag2/html/daab.asp"&gt;Data Access Block.&lt;/a&gt; But I got some refactoring practice and I feel great about it.&lt;br/&gt;&lt;br/&gt;OK, I am going very much off topic, so if I have to sum it: &lt;strong&gt;Manage dependencies wisely instead of avoiding them. &lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;P.S. You may also like to read &lt;a href="http://weblogs.asp.net/jgalloway/archive/2006/01/25/436377.aspx"&gt;Jon Galloway&lt;/a&gt; on the topic.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-113819982807062656?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/113819982807062656/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=113819982807062656&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/113819982807062656'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/113819982807062656'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/01/managing-dependencies-instead-of.html' title='Managing Dependencies Instead of Avoiding Them'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-113802833373178320</id><published>2006-01-23T16:58:00.000+02:00</published><updated>2006-01-23T16:58:53.783+02:00</updated><title type='text'>God Damn Exception</title><content type='html'>Heh, accidently in a batch file instead of printing the names of several hundreds files, I opened them. I have (.sql) extension associated to &lt;a href="http://notepad-plus.sourceforge.net/"&gt;Notepad++,&lt;/a&gt; (which is a great replacement of Notepad). Of course the OS has some limits for the number of open files, so I got a dialog with&amp;nbsp;&amp;nbsp;title &lt;strong&gt;“int exception” &lt;/strong&gt;and the nice message &lt;strong&gt;”God Damn Exception -1”&lt;/strong&gt;. &lt;br/&gt;&lt;br/&gt;I like that kind of messages! In my previous company a developer put errors in a dialog titled “грешка човешка” which in English sounds something like „error of a human”. He just didn’t specify if the human was the user or the programmer!&lt;br/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-113802833373178320?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/113802833373178320/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=113802833373178320&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/113802833373178320'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/113802833373178320'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/01/god-damn-exception.html' title='God Damn Exception'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-113801486925433017</id><published>2006-01-23T13:14:00.000+02:00</published><updated>2006-01-23T13:14:29.293+02:00</updated><title type='text'>Playing with TSQL</title><content type='html'>We keep all our TSQL setup code in a VSS generally on a statement per file basis. This includes code for creating stored procedures, user-defined functions, views, and some data initialization scripts for nomenclature tables and other immutable data. The standard stored procs are auto generated using the database schema thanks to CodeSmith, and we also auto-generate triggers to fill audit tables.&lt;br/&gt;&lt;br/&gt;The DB generation process looks pretty straightforward, with the exception of figuring in what order to issues CREATE statements, since some of the stored procedures and user functions have dependencies on others. We have used until now a pretty simplistic solution, where we manually set some kind of order for the calling the CREATE statements. The files that contain TSQL using dependencies have a numerical prefix that determines when they should be called. This is definitely feels a bit strange, because you have to think of some unique, somewhat random number to prefix the file, but so far this has worked. An obvious better way to handle it is to store directly the relationships which file depends on which other files. So let’s see what I can come up with:&lt;br/&gt;&lt;br/&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Brute force solution &lt;/strong&gt;– issue the commands in any order and reissue those that fail until they pass (or until N unsuccessful attempts are made). Ha, I bet this would work quite well in practice, but it’s somewhat hacky.&lt;/li&gt;&lt;br/&gt;&lt;li&gt;&lt;strong&gt;Manual dependency declaration &lt;/strong&gt;– for each TSQL file with dependencies, have a file with (.dep) extension, listing the files it depends on. Then it should be fairly easy to issue the commands to osql in the proper order.&lt;/li&gt;&lt;br/&gt;&lt;li&gt;&lt;strong&gt;Automatic dependencies extraction &lt;/strong&gt;– it should be possible to find automatically for a stored procs and user-defined functions the entities on which they depend. If those entites are already in the DB, I think that’s quite easy - I had stumbled upon an article describing how to do it. But when you are working simply with text files, this gets harder. The TSQL code should be parsed and the entities identified. A simple regex might work in some cases but it will have quirks (we should have in mind that the entities might be also table and views). But since in our DB we use a strict naming convention for our entities it should be easy for us. Just search for ones having cp_ or cf_ prefix. I wonder how hard it will be to build a more general solution. Then we will definitely need a powerful TSQL parser. I found an SQL parser, which was once &lt;a href="http://www.dirfile.com/general_sql_parser.htm"&gt;free&lt;/a&gt; and now is &lt;a href="http://www.sqlparser.com/"&gt;commercial&lt;/a&gt;, but unfortunately when it was free it didn’t support TSQL specific things like stored procedures. I think a good way to write such a parser is by using &lt;a href="http://www.antlr.org/"&gt;ANTLR&lt;/a&gt; and generate probably C# code (some people &lt;a href="ttp://maria-praveen.blog-city.com/tsql_parser.htm"&gt;are doing this&lt;/a&gt;).&amp;nbsp;&amp;nbsp;I couldn’t find other resources on the web, and this seems strange, I can see a lot of scenarios where such an SQL parser will be useful.&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/6471778-113801486925433017?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/113801486925433017/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=113801486925433017&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/113801486925433017'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/113801486925433017'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/01/playing-with-tsql.html' title='Playing with TSQL'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-113784942672872660</id><published>2006-01-21T15:17:00.000+02:00</published><updated>2006-01-21T15:17:10.603+02:00</updated><title type='text'>Touch typing (week 5 overview)</title><content type='html'>I hit 280 CPM yesterday which is close to my original 300 CPM target for the week. When I type consistently with 300 CPM and less than 5% errors I will be more than satisfied with my results. Last Sunday I had an interesting session where I decreased my error rates in 9 consecutive 5-minute typing sessions. I started from 13.9 and reached 8.9, but that is still far from my target. I finished practicing on the article &lt;a href="http://www.martinfowler.com/articles/newMethodology.html"&gt;The New Methodology&lt;/a&gt; which was a very good reading. But I decided that there is no real value in translating it as I mentioned &lt;a href="http://immitev.blogspot.com/2006/01/touch-typing-week-4-overview.html"&gt;last week&lt;/a&gt; – the Bulgarians interested in agile methods surely know English well enough. &lt;br/&gt;&lt;br/&gt;One thing I noticed is that when I concentrate my attention to my fingers rather than the text, my results tend to improve. As if I am thinking with my fingers ( I also realized that the position of the hands is very important. You get tired after awhile if your fingers don’t rest on the home keys. The way I touch the keys still varies, I can’t yet settle on a method, that is somehow the best. Sometimes energetic big movements feel right, but if I want to be really fast I probably have to make the least amount of effort possible and keep my fingers as immobile as possible. When I make unnecessary movements, that shows that my goals are confusing. Probably that’s why my error rate is so high, I keep hitting keys because of guessing, while I should be knowing their right position by now. I guess, with a bit more practice I will finally persuade myself that I know perfectly the keys and will get more flow in typing. At rare occasions my fingers just fly over the keyboard as if that’s the most natural thing for them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-113784942672872660?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/113784942672872660/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=113784942672872660&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/113784942672872660'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/113784942672872660'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/01/touch-typing-week-5-overview.html' title='Touch typing (week 5 overview)'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-113777445236256611</id><published>2006-01-20T18:27:00.000+02:00</published><updated>2006-01-20T18:27:32.423+02:00</updated><title type='text'>Computer Misfortunes</title><content type='html'>On Wednesday I had the misfortune my hard disk of my work computer blowing up. It didn’t crash instantly, though. First I got some corrupted files and directories warnings that told me to run chkdsk. And when I decided to listen to them chkdsk fixed the errors by removing a lot of indexes and files that resulted in failure to start my Windows XP. The OS install disk didn’t not help and the hard disk made strange sounds. Later it was verified that it had died.&lt;br/&gt;&lt;br/&gt;I was lucky though that no significant work was lost – the VSS database is on our server. I thought that I even have not lost my personal files, because a month ago I made a full backup at my home machine hard-drive, but now I can’t find my old documents. I verified that in the .BAT file that I used for replication, there was xcopy command for those documents, but now I can’t find the destination folder at my home machine. Argh! Hopefully the most important items I have online while mailing them to some people or to myself. &lt;br/&gt;&lt;br/&gt;Since there is currently no available substitute machine at the office with the software I use in my day-to-day activities, yesterday I worked from home. Well, it was not exactly efficient work, because it proved that to set up the perfect development environment was not that easy. I actually have VS.NET 2005 at home (got a free license on the &lt;a href="http://immitev.blogspot.com/2005/11/launch-tour-2005.html"&gt;Launch Day&lt;/a&gt; in November), and the project targets .NET Framework 1.1, so I played a lot with the conversion and trying &lt;a href="http://blogs.msdn.com/jomo_fisher/archive/2005/04/22/410903.aspx"&gt;this workaround&lt;/a&gt; for the build. It worked with at least one project, but I did something wrong while editing project files by hand, messed up one project badly and had to start all over again. At least I get more experience with VS.NET 2005, but I think I like VS.NET 2003 + the &lt;a href="http://immitev.blogspot.com/2005/09/vsnet-productivity-add-ins.html"&gt;right addins&lt;/a&gt; better.&lt;br/&gt;&lt;br/&gt;Today I also worked from home, but it was not a productive day either. First thing I realized I had to do was to make a full DVD backup of my projects and other stuff and I burned 6 DVDs in a row. I also used the occasion to reorganize my data, so that when my work comp gets ready I can just copy the data from the DVDs and get started. When I was finished with this operation, I fired up the IDE. It appeared that my SourceSafe installation was messed up. I reinstalled it but VS.NET said that the source control provider is corrupt. &lt;br/&gt;&lt;br/&gt;OK, if I could not get working on the code, at least I should be able to set up the DB. I saw that I had a copy of the MSDE instance that I used, so I tried somehow to use it with SQL Server 2005. I could not, so I decided to install MSDE and see if I can do something with it. I refreshed my memory about its installation parameters and created a new instance with it. Then I realized that what I had was not a copy of the instance, but a copy of the desktop engine, which was perfectly useless. Oh, gee, that’s too much for a Friday. I hope that the new week will start more positively.&lt;br/&gt;&lt;br/&gt;The silver lining:Actually there is something good about my hard-disk failure – I will start with a fresh OS and not have my start menu hide my desktop completely ( I had not reinstalled for a whole year and my machine was overloaded with a lot of unused programs. I now believe that each 6 or 12 months I should reinstall to keep my system healthy. And I might want to do complete backups at least one a month.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-113777445236256611?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/113777445236256611/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=113777445236256611&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/113777445236256611'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/113777445236256611'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/01/computer-misfortunes.html' title='Computer Misfortunes'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-113751152109519174</id><published>2006-01-17T16:44:00.000+02:00</published><updated>2006-01-17T17:25:21.166+02:00</updated><title type='text'>Comparing Datasets</title><content type='html'>If you have been working with ADO.NET datasets probably you have needed at some point to compare two datasets to see if they are different and how they are different. I was writing some unit tests and I wanted to make sure that a dataset has not changed after the operation. So I first cloned the dataset and after completing the calculations, I had to compare the initial copy with the possibly modified original.&lt;br /&gt;&lt;br /&gt;The simplest think I thought of was to export both of them to XML and to compare the result with &lt;span style="font-style: italic;"&gt;Assert.AreEqual(...)&lt;/span&gt;. Well, the funny thing is that the first time I did it, the call failed because of whitespace differences. OK, I googled for a quick workaround. I knew about the free &lt;a href="http://apps.gotdotnet.com/xmltools/xmldiff/"&gt;MS XML Diff&lt;/a&gt;, but I didn't want to use an external program for this silly thing.&lt;br /&gt;&lt;br /&gt;Then I found &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=23187&amp;release_id=201538"&gt;XmlUnit for .NET&lt;/a&gt; which has a method called &lt;span style="font-style: italic;"&gt;XmlAssertion.AssertXmlIdentical(...) &lt;/span&gt; that seemed appropriate. I added the reference, made the call and it appeared that the assembly could not find NUnit assemblies. I had to recompile the dozen of C# files and there was a NAnt build configuration along with them. Unfortunately I couldn't get the NAnt compile target working right away though I think I supplied the correct parameters. I realized that probably XmlUnit is also an overkill, so I began to search for other possibilities.&lt;br /&gt;&lt;br /&gt;And not long after, I realized I could use &lt;span style="font-style: italic;"&gt;Merge() &lt;/span&gt; and &lt;span style="font-style: italic;"&gt;HasChanges()&lt;/span&gt;  to find if something has changed. I should have thought of that earlier, but while it is good for detecting that anything has changed, there is a way to get changes. For more detailed differences I guess I could use &lt;span style="font-style: italic;"&gt;GetChanges()&lt;/span&gt;  and process those in some appropriate way.&lt;br /&gt;&lt;br /&gt;The moral of the story: When you get tired and weary of finding complex solution to simple problems, then you open yourself to more simple solutions :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-113751152109519174?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/113751152109519174/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=113751152109519174&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/113751152109519174'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/113751152109519174'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/01/comparing-datasets.html' title='Comparing Datasets'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-113750070481177392</id><published>2006-01-17T14:11:00.000+02:00</published><updated>2006-01-17T14:25:04.826+02:00</updated><title type='text'>Working Effectively with Legacy Code - Book Review</title><content type='html'>Finally I have finished reading &lt;a href="http://www.amazon.com/gp/product/0131177052/104-8261883-4878367?v=glance&amp;n=283155"&gt;Working Effectively with Legacy Code&lt;/a&gt; by &lt;a href="http://www.objectmentor.com/aboutUs/bios/Michael%20Feathers"&gt;Michael Feathers&lt;/a&gt;. I should have completed it a lot earlier but the weeks around the New Year were more appropriate for other types of reading and activities. This is a hell of a book, and if you are working currently on some legacy code, you will definitely get a breath of fresh air if you read it.&lt;br /&gt;&lt;p&gt;I have been working with legacy code for about two months and initially I was quite frustrated since I was mostly used to do greenfield development. I tried to apply the same approach that I am usually using when cranking fresh code, but numerous times I just broke the code though I was increasingly careful.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The single most important thing that I learned from the book is that if you put safety first (and in real-world preserving the existing behaviour of the code is always a top priority), the best way to deal with legacy code is to put it into a test-harness and use TDD to add new features. In reality putting code under test is rarely easy, unless it was developed that way (and wont feel like legacy). It might be design issues, terrible dependencies and whole lot more, but the author succeeds to describe numerous alternatives to tackle all these kinds of problems.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;When you alter code, do it in small steps, so that each mechanical change has a single purpose. It is often very tempting to do two or three steps at once if you can envision where you want to get, but you should resist it (I often cant, but I am working on my habits J ). First you make the smallest steps possible that you can to put the code under test. You first use dependency breaking techniques (there is a list of about 25 of them in the third part of the book), then you write the tests and after that you can start with the real refactoring. Sometimes you have to do things that you wont normally do, but keep in mind that this is just a temporary step towards taming the legacy code.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;I just scratched on the myriads of ideas and techniques that are in the book. You can read more reviews by &lt;a href="http://weblogs.asp.net/rosherove/archive/2005/04/16/401003.aspx"&gt;Roy Osherove&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/ericgu/archive/2005/09/30/475888.aspx"&gt;Eric Gunnerson&lt;/a&gt;, &lt;a href="http://blogs.telerik.com/blogs/twisted_asp_net/archive/2005/10/27/45.aspx"&gt;Hristo Deshev&lt;/a&gt;, but you better get the book anyway. And I have to repeat what &lt;a href="http://www.objectmentor.com/aboutUs/bios/Robert%20C.%20Martin"&gt;Robert Martin&lt;/a&gt; says in the forward:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;blockquote&gt;"Before you get too excited, I warn you; reversing rot is not easy, and it's not quick. The techniques, patterns, and tools that Michael presents in this book are effective, but they take work, time, endurance, and care."&lt;/blockquote&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-113750070481177392?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/113750070481177392/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=113750070481177392&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/113750070481177392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/113750070481177392'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/01/working-effectively-with-legacy-code.html' title='Working Effectively with Legacy Code - Book Review'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-113725157621607303</id><published>2006-01-14T17:12:00.000+02:00</published><updated>2007-01-15T22:04:07.016+02:00</updated><title type='text'>Touch typing (week 4 overview)</title><content type='html'>I reached 250 CPM milestone this week as expected, but after that for a few days my results were in the 240 range. Yesterday night, after returning from a party at about 3:30 am, I realized I missed my daily training so I launched Stamina. For my astonishment I reached 254 CPM with just 10.5% error rate on my first attempt. &lt;br/&gt;&lt;br/&gt;For the end of the next week I am targeting 300 CPM though with my current progress rate this seems a bit over optimistic. I hope I will make a quantum leap soon in decreasing my error rate. I guess I do something wrong – probably my attention is wandering or my fingers are not moving in an effective way or something else. I have to discover it and nail it down. I know two pretty fast typists – one was piano player and the other one accordion player. Probably this helped them to get to speed for far less time than me, but surely this is not an excuse for me to stop training.&lt;br/&gt;&lt;br/&gt;In order to keep my interest in speed typing, I decided to do something more meaningful instead of typing the default phrases of Stamina. Well, they are sometimes entertaining but sometimes not very useful. Today I tried the feature of exercising with an external text and I put in the recently updated Martin Fowler’s article &lt;a href="http://www.martinfowler.com/articles/newMethodology.html"&gt;The New Methodology&lt;/a&gt;. I realized I can type even without thinking about the text I see, but why not combine the typing with some pleasant and beneficial reading. I actually think of translating this article in Bulgarian (it is already available in 8 languages). Its size is about 20 pages, so it will take me a week if I do 3 pages a day. This will be also a typing practice with in a real-world situation. Hmm, let’s do it!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-113725157621607303?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/113725157621607303/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=113725157621607303&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/113725157621607303'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/113725157621607303'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/01/touch-typing-week-4-overview.html' title='Touch typing (week 4 overview)'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-113717050524615263</id><published>2006-01-13T18:40:00.000+02:00</published><updated>2006-01-13T18:42:22.226+02:00</updated><title type='text'>Legacy code is amazing</title><content type='html'>Legacy code doesn’t stop to amaze me (sometimes even my code makes me wonder what was I thinking when I wrote it). Ayende Rahien had recently put up an excellent list of &lt;a href="http://www.ayende.com/Blog/2006/01/06/25GoodThingsAboutLegacyCode.aspx"&gt;25 good things about legacy code&lt;/a&gt;. I don’t think my experience covers all of this goodness but I can see his point.&lt;br /&gt;&lt;br /&gt;In the past week I have been working on a various pieces of code but predominately reworking a form that was initially 6000 LOC. Some of its methods where with absurd cyclomatic complexity, length and somewhat illogical organization. I succeeded to pull some of the logic in separate classes and put them under tests but some of the functions are so entwined that it seems nearly impossible to get control over them. Even if that is the case I strive to improve the readability of the code and after a series of small safe refactorings with Resharper in most of the code I reached the point when reading the code made sense without stopping at each line to analyze it. This, of course, lead to revealing some subtle bugs.&lt;br /&gt;&lt;br /&gt;I sometimes wonder what is more cruicial for the code – to be readable or to be covered by tests. Apparently, both are important, but if you really have to choose a priority, what would it be? I think readable, well organized code is much easier to achieve. It requires just a bit of discipline and common sense, so I vote for this option. Just the habit of naming things appropriately is a very powerful technique and I wonder why so many developers are in love with short highly encoded names of variables and functions.&lt;br /&gt;&lt;br /&gt;I have seen also a tendency to keep the number of classes to a minimum and to add various responsibilities to existing classes until they become unmanageable. No, there is no limit of classes that the IDE supports. Just when some new functionality doesn’t fit in the existing classes find how to incorporate it in the code base, see the big picture. You may have to change some existing things that worked, but it can’t be any other way. When a system is only just patched and patched and patched sooner or later it becomes so unmentionable that you can’t hold in your head all its peculiarities. The moral: write good code and free some mental RAM for the person who’s reading it and maintaining it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-113717050524615263?l=immitev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://immitev.blogspot.com/feeds/113717050524615263/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6471778&amp;postID=113717050524615263&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/113717050524615263'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6471778/posts/default/113717050524615263'/><link rel='alternate' type='text/html' href='http://immitev.blogspot.com/2006/01/legacy-code-is-amazing.html' title='Legacy code is amazing'/><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_wuDhHfQy0oA/ScC354YrBEI/AAAAAAAADqI/z_-H38u8018/S220/winter_profile_pic.jpg'/></author><thr:total>0</thr:total></entry></feed>
