<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/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" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0"><id>tag:blogger.com,1999:blog-6471778</id><updated>2012-04-23T23:02:10.773+03: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="alternate" type="text/html" href="http://immitev.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/6471778/posts/default?start-index=26&amp;max-results=25" /><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>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/immitev" /><feedburner:info uri="immitev" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site, subject to copyright and fair use.</feedburner:browserFriendly><entry><id>tag:blogger.com,1999:blog-6471778.post-3761024682921257597</id><published>2011-12-31T18:05:00.001+02:00</published><updated>2012-02-18T18:41:46.331+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 contributing in a much broader scope, but on the other side there are benefits in 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. Most likely we will soon transition to a better version control system (&lt;a href="http://www.plasticscm.com/"&gt;PlasticSCM&lt;/a&gt;) and a more powerful issue tracking system (&lt;a href="http://www.atlassian.com/software/jira/overview"&gt;Jira&lt;/a&gt;). We might also 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;"&gt;&lt;span style="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, and in candidates assessment). I think I am getting pretty good in guessing&amp;nbsp;&lt;/span&gt; &lt;span style="font-size: 12px; line-height: 16px;"&gt;just by looking at a CV&amp;nbsp;a developer's abilities, strengths and weaknesses, (well, the candidate's code still surprise me&amp;nbsp;occasionally, usually unpleasantly ;) ).&lt;/span&gt;&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 returned back for a couple of months to my old duties as a Support manager, but hopefully it was temporary. The next year I don't expect to be involved much in 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 planned and participated in supporting of MSSQL as a backend for our applications (we supported only Oracle until recently). Learned a lot from this - e.g. the differences in the default locking models of Oracle/MSSQL turned out to be interesting. Although new technologies are now introduced in our development at a slower rate, I am trying to keep up-to-date with everything interesting in the software development field. Besides the .NET related stuff, there are so many exciting trends to follow, e.g. NoSQL comes easily to mind. And of course, there's much more than the programming frameworks, libraries and tools, it's a big universe...&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;This pretty much sums it all. Hope that the year 2012 would offer a lot of excitement and positive experiences.&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://feedproxy.google.com/~r/immitev/~3/niMl99Bbpmk/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><feedburner:origLink>http://immitev.blogspot.com/2011/12/summary-of-year-2011.html</feedburner:origLink></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://feedproxy.google.com/~r/immitev/~3/cRK-GcsRz7I/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><feedburner:origLink>http://immitev.blogspot.com/2011/02/on-hiring-entry-leveljunior-devs.html</feedburner:origLink></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://feedproxy.google.com/~r/immitev/~3/IgtDIlWgQVk/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><feedburner:origLink>http://immitev.blogspot.com/2011/01/summary-of-year-2010.html</feedburner:origLink></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://feedproxy.google.com/~r/immitev/~3/x96R92osS1c/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><feedburner:origLink>http://immitev.blogspot.com/2010/12/release-notes-less-or-more-structured.html</feedburner:origLink></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://feedproxy.google.com/~r/immitev/~3/U3H2gHFv9Pg/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><feedburner:origLink>http://immitev.blogspot.com/2010/12/release-notes-whats-and-hows.html</feedburner:origLink></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://feedproxy.google.com/~r/immitev/~3/xUOLumqcI1g/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><feedburner:origLink>http://immitev.blogspot.com/2010/10/devreach-2010.html</feedburner:origLink></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://feedproxy.google.com/~r/immitev/~3/RkFrk8TJ_bo/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><feedburner:origLink>http://immitev.blogspot.com/2008/12/summary-of-year-2008.html</feedburner:origLink></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://feedproxy.google.com/~r/immitev/~3/loLOgegFCZ0/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><feedburner:origLink>http://immitev.blogspot.com/2008/11/helper-for-antlr-grammar.html</feedburner:origLink></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://feedproxy.google.com/~r/immitev/~3/tnxXwpdSsYg/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><feedburner:origLink>http://immitev.blogspot.com/2008/10/my-meta-parser.html</feedburner:origLink></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://feedproxy.google.com/~r/immitev/~3/XZ7quCQFwY8/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><feedburner:origLink>http://immitev.blogspot.com/2008/10/ways-to-compare-net-assemblies.html</feedburner:origLink></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://feedproxy.google.com/~r/immitev/~3/QYOADmbLMXQ/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><feedburner:origLink>http://immitev.blogspot.com/2008/10/vsnet-macro-to-display-all-file.html</feedburner:origLink></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://feedproxy.google.com/~r/immitev/~3/hgA_CpzEMSw/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><feedburner:origLink>http://immitev.blogspot.com/2008/10/devreach-2008.html</feedburner:origLink></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://feedproxy.google.com/~r/immitev/~3/MpXeamdDrPo/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><feedburner:origLink>http://immitev.blogspot.com/2008/03/xmlwriter-design-flaws.html</feedburner:origLink></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://feedproxy.google.com/~r/immitev/~3/W2P9WTU8ikU/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><feedburner:origLink>http://immitev.blogspot.com/2008/01/summary-of-year-2007.html</feedburner:origLink></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://feedproxy.google.com/~r/immitev/~3/HFiazboqcPg/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><feedburner:origLink>http://immitev.blogspot.com/2007/10/devreach-2007-sofia-bulgaria-day-2.html</feedburner:origLink></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://feedproxy.google.com/~r/immitev/~3/5seWr-srLgs/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><feedburner:origLink>http://immitev.blogspot.com/2007/10/devreach-2007-sofia-bulgaria-day-1.html</feedburner:origLink></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://feedproxy.google.com/~r/immitev/~3/3hfTraVEvuI/blindspot-hh-vs-hh.html" title="Blindspot: 'hh' vs 'HH'" /><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><feedburner:origLink>http://immitev.blogspot.com/2007/07/blindspot-hh-vs-hh.html</feedburner:origLink></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://feedproxy.google.com/~r/immitev/~3/-7sMcQg18Yg/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><feedburner:origLink>http://immitev.blogspot.com/2007/06/do-you-like-surprises.html</feedburner:origLink></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://feedproxy.google.com/~r/immitev/~3/HjM4aNDWKBQ/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><feedburner:origLink>http://immitev.blogspot.com/2007/06/becoming-vsnet-keyboard-jedi.html</feedburner:origLink></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://feedproxy.google.com/~r/immitev/~3/DtqZuXR2mFY/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><feedburner:origLink>http://immitev.blogspot.com/2007/04/cool-design-your-t-shirt-online.html</feedburner:origLink></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://feedproxy.google.com/~r/immitev/~3/OZRdR6jA1mM/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><feedburner:origLink>http://immitev.blogspot.com/2007/03/controlling-number-of-active-users-of.html</feedburner:origLink></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://feedproxy.google.com/~r/immitev/~3/VGad5D6K0iY/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><feedburner:origLink>http://immitev.blogspot.com/2007/03/vsnet-2005-macro-for-removing.html</feedburner:origLink></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://feedproxy.google.com/~r/immitev/~3/OE8tnHR0Lp0/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><feedburner:origLink>http://immitev.blogspot.com/2007/01/counting-tools.html</feedburner:origLink></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://feedproxy.google.com/~r/immitev/~3/uEy6Br9vlsE/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><feedburner:origLink>http://immitev.blogspot.com/2007/01/summary-of-year-2006.html</feedburner:origLink></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://feedproxy.google.com/~r/immitev/~3/Ci4TB2TA_2k/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><feedburner:origLink>http://immitev.blogspot.com/2006/11/resharper-25-rulez.html</feedburner:origLink></entry></feed>

