<?xml version="1.0" encoding="UTF-8"?>
<!--Generated by Squarespace Site Server v5.11.5 (http://www.squarespace.com/) on Sat, 31 Jul 2010 01:47:03 GMT--><feed xmlns="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/"><title>mtelligent</title><subtitle>Journal</subtitle><id>http://www.mtelligent.com/journal/</id><link rel="alternate" type="application/xhtml+xml" href="http://www.mtelligent.com/journal/"/><link rel="self" type="application/atom+xml" href="http://www.mtelligent.com/journal/atom.xml"/><updated>2010-04-14T13:32:51Z</updated><generator uri="http://www.squarespace.com/" version="Squarespace Site Server v5.11.5 (http://www.squarespace.com/)">Squarespace</generator><entry><title>Mumbai Dreams</title><id>http://www.mtelligent.com/journal/2010/4/14/mumbai-dreams.html</id><link rel="alternate" type="text/html" href="http://www.mtelligent.com/journal/2010/4/14/mumbai-dreams.html"/><author><name>David San Filippo</name></author><published>2010-04-14T13:27:55Z</published><updated>2010-04-14T13:27:55Z</updated><content type="html" xml:lang="en-US"><![CDATA[<p>I know I haven't posted in a while, but I've been busy on my current project.</p>
<p>I soon will&nbsp;acutally be&nbsp;visiting India for the first time, leaving NYC&nbsp;for Mumbai on Saturday and will be there through May 5th working with our offshore development team.</p>
<p>I'll try to more actively post with some of my impressions and experiences.</p>]]></content></entry><entry><title>Another Usability Feature Update</title><category term="Snip-It Pro"/><id>http://www.mtelligent.com/journal/2010/2/14/another-usability-feature-update.html</id><link rel="alternate" type="text/html" href="http://www.mtelligent.com/journal/2010/2/14/another-usability-feature-update.html"/><author><name>David San Filippo</name></author><published>2010-02-14T15:26:07Z</published><updated>2010-02-14T15:26:07Z</updated><content type="html" xml:lang="en-US"><![CDATA[<p>Just added a new feature to Snip-It Pro. I added right click context menus to all the text editing fields in the snippet explorer that allow you to easily Undo, Cut, Copy, Paste, Delete and Select all without the keyboard.</p>
<p>It's a very minor feature, but one that I personally wanted as I found myself storing user names and passwords in a single snippet and had to frequently select it out of the snippet explorer window.</p>
<p>This brings the current version number to 2.5.1.0. You can download the latest from <a class="offsite-link-inline" href="http://www.snipitpro.com/" target="_blank">http://www.snipitpro.com/</a></p>]]></content></entry><entry><title>Method get_XXX from assembly YYYY does not have an implementation</title><category term="SharePoint 2007"/><id>http://www.mtelligent.com/journal/2010/1/24/method-get_xxx-from-assembly-yyyy-does-not-have-an-implement.html</id><link rel="alternate" type="text/html" href="http://www.mtelligent.com/journal/2010/1/24/method-get_xxx-from-assembly-yyyy-does-not-have-an-implement.html"/><author><name>David San Filippo</name></author><published>2010-01-24T14:47:48Z</published><updated>2010-01-24T14:47:48Z</updated><content type="html" xml:lang="en-US"><![CDATA[<p>I just spent way too much time trying to figure out why a particular unit test was failing after a round of refactoring.</p>
<p>I kept getting an error that basically said "Method get_XXX from assembly YYYY does not have an implementation" and the test wouldn't even load. I couldn't even attach the debugger to it.</p>
<p>What made it equally confusing was that the code in question was really just a stub class I created for testing purposes.</p>
<p>Somewhat related was the fact that the assemblies I was testing were used in SharePoint, and I was running Visual Studio in my test SharePoint environment, so even though I updated the code and everything compiled fine, what I didn't realize was that the test was getting an old version of the dll from the GAC, hence the error.</p>
<p>I&nbsp;removed the dll from the gac&nbsp;and the test ran fine.</p>
<p>&nbsp;</p>]]></content></entry><entry><title>Painless SharePoint Web Config Modifications with Custom Features</title><category term="SharePoint 2007"/><id>http://www.mtelligent.com/journal/2010/1/23/painless-sharepoint-web-config-modifications-with-custom-fea.html</id><link rel="alternate" type="text/html" href="http://www.mtelligent.com/journal/2010/1/23/painless-sharepoint-web-config-modifications-with-custom-fea.html"/><author><name>David San Filippo</name></author><published>2010-01-23T15:50:40Z</published><updated>2010-01-23T15:50:40Z</updated><content type="html" xml:lang="en-US"><![CDATA[<p>One of the challenging aspects of custom development when working with MOSS is dealing with changes needed for the Web.config file. If you do it manually, you risk MOSS blowing away your changes whenever it feels like, as certain administrative actions will do this if you&rsquo;re not careful.</p>
<p>If you instead create a feature that uses the object model and SPWebConfigModification, you have to deal with several layers of quirkiness. For example, the &ldquo;Name&rdquo; property isn&rsquo;t just descriptive, it&rsquo;s an XPath Selector. &nbsp;Another example is that any mistakes you make with your XPath selectors will cause the feature to fail, but not roll back your changes (the faulty web config mod is still in the collection), so you need to ensure that you manually write code that removes the modification.</p>
<p>But with the right approach, you can get around those limitations and use SPWebConfigModification to update web config files for a given web application and not have to worry about SharePoint blowing things away. The biggest problem of all is how tedious it is to create these modifications for each and every node you want to add to the Web.config. It makes it extremely painful to update the web config for complex configurations needed to support IoC containers, Enterprise Library blocks or other time saving libraries.</p>
<p>For example, to get this simple configuration for the Enterprise Library Exception and Logging blocks we would need to create 22 separate SPWebConfigModification objects, each with its own xpath selectors for specifying where in the config file each node goes:</p>
<p style="padding-left: 30px;">&lt;loggingConfiguration tracingEnabled="true"<br />&nbsp;&nbsp;&nbsp; defaultCategory="General" logWarningsWhenNoCategoriesMatch="true"&gt;<br />&nbsp;&nbsp;&nbsp; &lt;listeners&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;add source="Enterprise Library Logging" formatter="Text Formatter"&nbsp;log="Application" machineName="" listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.FormattedEventLogTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"traceOutputOptions="None" filter="All" /&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/listeners&gt;<br />&nbsp;&nbsp;&nbsp; &lt;formatters&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;add template="Timestamp: {timestamp}&amp;#xD;&amp;#xA;Message: {message}&amp;#xD;&amp;#xA;Category: {category}&amp;#xD;&amp;#xA;Priority: {priority}&amp;#xD;&amp;#xA;EventId: {eventid}&amp;#xD;&amp;#xA;Severity: {severity}&amp;#xD;&amp;#xA;Title:{title}&amp;#xD;&amp;#xA;Machine: {machine}&amp;#xD;&amp;#xA;Application Domain: {appDomain}&amp;#xD;&amp;#xA;Process Id: {processId}&amp;#xD;&amp;#xA;Process Name: {processName}&amp;#xD;&amp;#xA;Win32 Thread Id: {win32ThreadId}&amp;#xD;&amp;#xA;Thread Name: {threadName}&amp;#xD;&amp;#xA;Extended Properties: {dictionary({key} - {value}&amp;#xD;&amp;#xA;)}" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/formatters&gt;<br />&nbsp;&nbsp;&nbsp; &lt;categorySources&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;add switchValue="All"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;listeners&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;add /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/listeners&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/add&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/categorySources&gt;<br />&nbsp;&nbsp;&nbsp; &lt;specialSources&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;allEvents switchValue="All" /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;notProcessed switchValue="All" /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;errors switchValue="All"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;listeners&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;add /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/listeners&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/errors&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/specialSources&gt;<br />&nbsp; &lt;/loggingConfiguration&gt;<br />&nbsp; &lt;exceptionHandling&gt;<br />&nbsp;&nbsp;&nbsp; &lt;exceptionPolicies&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;add&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;exceptionTypes&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&lt;add<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; postHandlingAction="None"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;exceptionHandlers&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;add logCategory="General" eventId="100" severity="Error" title="Enterprise Library Exception Handling" formatterType="Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.TextExceptionFormatter, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" priority="0" useDefaultLogger="false"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name="Logging Handler" /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/exceptionHandlers&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/add&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/exceptionTypes&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/add&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/exceptionPolicies&gt;<br />&nbsp; &lt;/exceptionHandling&gt;</p>
<p>I always had a love/hate relationship with this approach, and always thought of building something to make it easier. I ended up creating an abstract base class for &ldquo;FeatureReceivers&rdquo; that makes it easy to convert Xml Strings with configuration data in it, to a collection of SPWebConfigModification objects (with EnsureChildControls) that can be then applied to merge those configuration changes into the MOSS Web.config file.</p>
<p>Then to painlessly create a feature that updates the Web Config modification, inherit from the provided base class and use the following code, passing in your own config string, owner string, and collection of nodes to ignore.</p>
<p style="padding-left: 30px;">public override void FeatureActivated(SPFeatureReceiverProperties properties)<br />{<br />&nbsp; //Custom Function in the base class to get the Web App despite the feature scope<br />&nbsp; SPWebApplication application = GetCurrentWebApplication(properties);<br />&nbsp; if (application != null)<br />&nbsp; {<br />&nbsp; &nbsp;&nbsp;//Clean out any old ones first, in case we had an issue previously. Should also be called on<br />&nbsp;&nbsp;&nbsp; //feature deactivate.<br />&nbsp;&nbsp;&nbsp; RemoveWebConfigModificationsByOwner(application, SPWebConfigModificationOwner);<br /><br />&nbsp;&nbsp;&nbsp; //This will parse the string and convert to all spwebmods with EnsureChildNode as the type.<br />&nbsp;&nbsp;&nbsp; List&lt;SPWebConfigModification&gt; mods = CreateModifications(ConfigXML, SPWebConfigModificationOwner, NodesToIgnore);<br />&nbsp;&nbsp;&nbsp; AddWebConfigModifications(application, mods); <br />&nbsp; }<br />}</p>
<p>The Nodes to ignore&nbsp;parameter&nbsp;is there to create a collection of strings that if the node matches on of them, the base class won't create a SPWebConfigModification for it. This is useful if you don't want to add an extra node for appSettings, or othe types of nodes which you know are already in the web config.</p>
<p>The base class itself, turns your configuration string into an XMLDocument and iterates through each node creating SPWebConfigModifications as long as the node name isn&rsquo;t in the IgnoreCollection. Keep in mind, the WebConfigModifications are all of type &ldquo;EnsureChildControls&rdquo; which works very well for adding new nodes to the web config, but don&rsquo;t work well if the config node already exists. For this type of requirement (for example updating the CustomErrors to off, you need a modification of type &ldquo;EnsureAttribute&rdquo; and will have to roll this on your own.)</p>
<p>I haven&rsquo;t tested every situation, so I&rsquo;m sure this code will need to be tweaked to meet specific needs, but it should give you a nice head start for creating a clean feature. For example, keep in mind for Xpath selectors, it will use the node name alone if there is one or less attributes, otherwise it will use the &ldquo;Name&rdquo; attribute if it exists, otherwise the first attribute found for the node.</p>
<p>Once you create your custom class, you&rsquo;ll need to specify it as the receiver class in a custom feature xml that gets deployed via wsp or manually, and then activate it. I recommend giving the feature the Web Application scope, and creating separate features for each environment you want to deploy (dev, staging, production), this way you can integrate the stsadm call to activate the environment specific feature in your build scripts.</p>
<p>I know it&rsquo;s a shameless plug, but I&rsquo;ve packaged all the code (for the base class, sample feature xml and sample inherited class) into a Snip-It Pro import file. So if you don&rsquo;t have it, you can install a thirty day <a class="offsite-link-inline" href="http://www.snipitpro.com/tryItFree.html" target="_blank">trial here</a>. Then you can download and import this Snippet Library (by creating a snippet collection, right clicking the folder and selecting &ldquo;Import&rdquo; and then navigating to the file). Each file&nbsp;provided is a parameterized snippet which will allow you to customize class names,&nbsp;namespaces and values in the Configure Snippet area&nbsp;(bottom of the docking bar)&nbsp;before drag/dropping into Visual Studio.</p>
<p>&nbsp;&gt;&nbsp;<a href="http://www.snipitpro.com/Snippets/WebConfigModificationFeature.snips">Download the&nbsp;code snippets</a>. (Snip-It Pro snippet archive)</p>]]></content></entry><entry><title>Converting to Snip-It Pro's ".snip" format</title><category term="Snip-It Pro"/><id>http://www.mtelligent.com/journal/2010/1/16/converting-to-snip-it-pros-snip-format.html</id><link rel="alternate" type="text/html" href="http://www.mtelligent.com/journal/2010/1/16/converting-to-snip-it-pros-snip-format.html"/><author><name>David San Filippo</name></author><published>2010-01-16T14:20:36Z</published><updated>2010-01-16T14:20:36Z</updated><content type="html" xml:lang="en-US"><![CDATA[<p>One of my goals in creating Snip-It Pro was to make it very easy to export your snippets to another format, so that using a proprietary format was not an excuse for not using Snip-It Pro. The latest release of Snip-It Pro introduces two additional export features: the ability to export folders to a single text file and the ability to define an export template and export all the snippets in a folder using that template. This feature effectively enables you to convert your snippets into any other text based format. I even included an example in the help file of defining a template for converting to the Visual Studio &ldquo;.snippet&rdquo; format.</p>
<p>But just as important as the ability to export, is the ability to import. Sure you can drag and drop text right into Snip-It Pro, but then you would still need to set a description and other properties. And there is also the ability to publish and retrieve favorite snippets from <a class="offsite-link-inline" href="http://snipplr.com" target="_blank">Snipplr</a>, but then again you might not be using Snipplr, or you&rsquo;re trying to import from a local format.</p>
<p>I thought about creating a similar import feature by allowing users to define regular expressions, but thought that would probably not be such a great feature, since as the old saying goes &ldquo;if you have a problem that requires you to use regular expressions, then you have two problems.&rdquo;</p>
<p>So until I crack this nut of a problem, I figured the best thing I could do, would be to write a post explaining the XML based &ldquo;.snip&rdquo; format that Snip-It Pro uses. &nbsp;After all, most Snip-It Pro users are programmers, and writing scripts to convert between formats is just the sort of problem we like to solve.</p>
<p>Here is a guide to the nodes/fields within the format, with tips if you are going to populate these yourself:</p>
<p><strong>Description</strong> &ndash; The title/description of the snippet. This is what is displayed as the name of the snippet in the toolbar and folder view.</p>
<p><strong>Content</strong> &ndash; The actual contents of the snippet. In version 1, this field actually contained RTF. In version 2 and above, plain text is used since we began to support Syntax Highlighting.</p>
<p><strong>FileVersion</strong> &ndash; If you are using RTF for your content field, set this to 1, otherwise set it to 2. If you do set it to 1, keep in mind the next time the snippets is edited, Snip-It Pro automatically converts it to 2, stripping any RTF from your content.</p>
<p><strong>Order</strong>&ndash; Used to order the snippets in a folder. We don&rsquo;t do any validation on this other than the fact that it has to be an integer. Once we load all the snippets in a folder, we use this to sort them before displaying in the UI</p>
<p><strong>PreviewText</strong>&ndash; This is used to populate the tool tip that displays when you hover over the snippet. It was much more useful in version 1, as the tool tips couldn&rsquo;t display RTF, but normally this is just set to the content.</p>
<p><strong>Notes</strong> &ndash; This field can have any notes you want and can include RTF text.</p>
<p><strong>Category</strong>&ndash; The Display Name of the category the snippet is in. Snip-It Pro does a lookup in the categories file located in the &ldquo;AppData\Roaming\Snip-It Pro&rdquo; folder. That file has info about how to comment it, what the internal Snipplr category is and which &ldquo;.syn&rdquo; file to load from the lib directory in the installation directory to get syntax highlight rules for that language.</p>
<p><strong>ReferenceUrl</strong>&ndash; Here you should put any reference url as the UI gives you the ability to right click and navigate to the url, but you can put any string in here if you wanted to.</p>
<p><strong>Tags</strong> &ndash; Put each Tag in a string node as this is a collection of strings.</p>
<p><strong>ID</strong>&ndash; A guid that can serve as the ID of the snippet. If you don&rsquo;t want to generate these, leave off the entire Node, as Snip-It Pro will complain if the node is there with no value. This is only used in the &ldquo;auto commenting&rdquo; feature, so leaving it off isn&rsquo;t an issue. Snip-It Pro will actually generate a new Guid if you leave it off next time you save the snippet.</p>
<p><strong>DisableAutoComments</strong> &ndash; Set to true or false. Controls whether to override the global application setting of inserting auto comments for this particular snippet.</p>
<p><strong>LastUpdated</strong> &ndash; Put the last updated date time, or better yet, just leave off this node as well as it&rsquo;s not required.</p>
<p>Here is a sample &ldquo;.snip&rdquo; file :</p>
<p style="padding-left: 30px;">&lt;?xml version="1.0" encoding="utf-8"?&gt;<br />&lt;Snippet xmlns:xsi="<a href="http://www.w3.org/2001/XMLSchema-instance">http://www.w3.org/2001/XMLSchema-instance</a>" xmlns:xsd="<a href="http://www.w3.org/2001/XMLSchema">http://www.w3.org/2001/XMLSchema</a>"&gt;<br />&nbsp; &lt;Description&gt;C# Property&lt;/Description&gt;<br />&nbsp; &lt;Order&gt;2&lt;/Order&gt;<br />&nbsp; &lt;PreviewText&gt;private [[Data Type]] _[[Property Name]];<br />public [[Data Type]] [[Property Name]]<br />{<br />&nbsp;get { return _[[Property Name]]; }<br />&nbsp;set { _[[Property Name]] = value; }<br />}&lt;/PreviewText&gt;<br />&nbsp; &lt;FileVersion&gt;2&lt;/FileVersion&gt;<br />&nbsp; &lt;Notes&gt;{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fnil\fcharset0 Verdana;}}<br />\viewkind4\uc1\pard\f0\fs17 Use configure snippet to configure\par<br />}<br />&lt;/Notes&gt;<br />&nbsp; &lt;Category&gt;C#&lt;/Category&gt;<br />&nbsp; &lt;ReferenceUrl&gt;http://snipplr.com/view/14656/templated-property&lt;/ReferenceUrl&gt;<br />&nbsp; &lt;Tags&gt;<br />&nbsp;&nbsp;&nbsp; &lt;string&gt;property&lt;/string&gt;<br />&nbsp;&nbsp;&nbsp; &lt;string&gt;getter&lt;/string&gt;<br />&nbsp;&nbsp;&nbsp; &lt;string&gt;setter&lt;/string&gt;<br />&nbsp; &lt;/Tags&gt;<br />&nbsp; &lt;Content&gt;private [[Data Type]] _[[Property Name]];<br />public [[Data Type]] [[Property Name]]<br />{<br />&nbsp;get { return _[[Property Name]]; }<br />&nbsp;set { _[[Property Name]] = value; }<br />}&lt;/Content&gt;<br />&nbsp; &lt;ID&gt;22033523-1561-4d9a-96ec-29d44b4b3a26&lt;/ID&gt;<br />&nbsp; &lt;DisableAutoComments&gt;false&lt;/DisableAutoComments&gt;<br />&nbsp; &lt;LastUpdated&gt;2009-05-16T11:52:40.824-04:00&lt;/LastUpdated&gt;<br />&lt;/Snippet&gt;</p>
<p>Something to keep in mind, is that Snip files are just .Net objects (Snip-it Pro is written in C#) that are serialized using the default XML serializer. They are deserialized using the same serializer. If you're a dot net developer, you actually can add references to the Service.File assembly and create your own instances of FileSnippet (Inherits from an abstract snippet class in the Infrastructure.Interface assembly). You can even call the SaveSnippet method of the FileSnippetService in the same assembly to save it once you've populated the fields instead of writing your own serialization code.</p>
<p>If you have any issues creating this format, send me an email or leave a comment.</p>]]></content></entry><entry><title>Minor Tweaks</title><category term="Snip-It Pro"/><id>http://www.mtelligent.com/journal/2010/1/7/minor-tweaks.html</id><link rel="alternate" type="text/html" href="http://www.mtelligent.com/journal/2010/1/7/minor-tweaks.html"/><author><name>David San Filippo</name></author><published>2010-01-08T02:59:25Z</published><updated>2010-01-08T02:59:25Z</updated><content type="html" xml:lang="en-US"><![CDATA[<p>One of my Snip-It Pro&nbsp;users gave me three suggestions that I thought were very good and were easy for me to implement. I was able to get them done and I re-released Snip-It Pro officially as version 2.5.0.2<span style="font-size: x-small; color: #a31515;"><span style="font-size: x-small; color: #a31515;"><span style="font-size: x-small; color: #a31515;"><span style="font-size: x-small; color: #a31515;"> </span></span></span></span></p>
<p><span style="font-size: x-small; color: #a31515;"><span style="font-size: x-small; color: #a31515;"></span></span>Here's what was changed:</p>
<ul>
<li>Now you can set a default category for new snippets. I Added a default checkbox to the Categories page of the advanced options dialog. Just check the checkbox (and click add or change).</li>
<li>Description Text box is now a combo box with auto complete. If you're creating a bunch of similarly named snippets, this will make it easy to fill in the description. The combo box list items are only saved in memory, so restarting the application clears the selectable items.</li>
<li>Warn Users of Unsaved work. Now when you click "New Snippet" anywhere in the interface, you will get a warning message asking you if you want to discard your changes if you had previously modified a snippet.</li>
</ul>
<p>Nothing huge, but nice usability improvements none the less.</p>
<p>You can download the latest from <a href="http://www.snipitpro.com/">http://www.snipitpro.com/</a></p>
<p>Enjoy!</p>]]></content></entry><entry><title>Snip-It Pro is On Twitter</title><category term="Snip-It Pro"/><id>http://www.mtelligent.com/journal/2010/1/3/snip-it-pro-is-on-twitter.html</id><link rel="alternate" type="text/html" href="http://www.mtelligent.com/journal/2010/1/3/snip-it-pro-is-on-twitter.html"/><author><name>David San Filippo</name></author><published>2010-01-03T17:02:06Z</published><updated>2010-01-03T17:02:06Z</updated><content type="html" xml:lang="en-US"><![CDATA[<p>Just created a twitter account for Snip-It Pro to promote the 2.5 release.</p>
<p>I am using <a href="http://twuffer.com" target="_blank">Twuffer</a> to schedule daily Tip of the Day and Feature Mention Tweets.</p>
<p><a href="https://twitter.com/snipitpro" target="_blank">Follow me</a>.</p>]]></content></entry><entry><title>Snip-It Pro 2.5 Released</title><category term="Snip-It Pro"/><id>http://www.mtelligent.com/journal/2010/1/1/snip-it-pro-25-released.html</id><link rel="alternate" type="text/html" href="http://www.mtelligent.com/journal/2010/1/1/snip-it-pro-25-released.html"/><author><name>David San Filippo</name></author><published>2010-01-01T16:05:19Z</published><updated>2010-01-01T16:05:19Z</updated><content type="html" xml:lang="en-US"><![CDATA[<p>I just finished updating <a href="http://www.snipitpro.com/">http://www.snipitpro.com/</a> with the Snip-It Pro 2.5, along with various updates to the site including the <a class="offsite-link-inline" href="http://www.snipitpro.com/latestFeatures.html" target="_blank">Latest Features</a> page which describes what's new in the latest release.</p>
<p>If you haven't already, try it free for 30 days.</p>
<p>Happy New Year!</p>]]></content></entry><entry><title>Snip-It Pro 2.5 Preview</title><category term="Snip-It Pro"/><id>http://www.mtelligent.com/journal/2009/12/29/snip-it-pro-25-preview.html</id><link rel="alternate" type="text/html" href="http://www.mtelligent.com/journal/2009/12/29/snip-it-pro-25-preview.html"/><author><name>David San Filippo</name></author><published>2009-12-29T20:42:09Z</published><updated>2009-12-29T20:42:09Z</updated><content type="html" xml:lang="en-US"><![CDATA[<p>I just finished building the Snip-It Pro 2.5 release candidate. I didn't want to increment the version to 3.0, but still wanted to signify the fact that there are many new features that have been added. Besides general bug fixes, these enhancements include:</p>
<ul>
<li>Snippet Queue &ndash; Queue Snippets in a folder to paste one after the other using hot keys. Includes a queue preview window so you know what&rsquo;s next.</li>
<li>Template Export &ndash; Easily convert Snip-It Pro formatted snippets to snippets of any format using this useful feature (The help file even describes a sample setup that exports Snip-It Pro snippets to the&nbsp;Visual Studio Snippet format).</li>
<li>Export to a Single Text File &ndash; Export all your snippets to a single text file for archival purposes or to send to a friend who doesn&rsquo;t have Snip-It Pro. </li>
<li>Hot Keys are integrated with templates &ndash; Now Hot Keys will replace place holders with cached template values from the snippet toolbar.</li>
<li>Folders in the Snippet Toolbar now display a Tooltip with the path to their physical location.</li>
<li>Enhancements to the Snippet Explorer including: <br />
<ul>
<li>Support for drag and drop.</li>
<li>Enhanced Context Menu that supports Renaming, deleting and viewing properties of folders and snippets.</li>
</ul>
</li>
<li>
<p>Advanced Options for the following: Edit and add the categories list</p>
<ul>
<li>Configure Tabs vs. Spaces</li>
<li>Change Auto Comment Formatting</li>
<li>Configure Template Export settings.</li>
<li>Change Search Settings to specify whether the Clipboard History should be included in search results.</li>
<li>Change how global hot keys insert snippets. (paste through the clipboard, or &ldquo;Send Keys&rdquo; for each character)</li>
</ul>
</li>
</ul>
<p>All these as well as an updated help file are in the current build, which can be downloaded <a href="http://www.mtelligent.com/storage/SnipItProSetup.exe">here</a>. I am planning on having the web site updated with this build by the weekend.</p>]]></content></entry><entry><title>A List of FxCop/Code Analysis Rules with MSDN Details</title><id>http://www.mtelligent.com/journal/2009/12/5/a-list-of-fxcopcode-analysis-rules-with-msdn-details.html</id><link rel="alternate" type="text/html" href="http://www.mtelligent.com/journal/2009/12/5/a-list-of-fxcopcode-analysis-rules-with-msdn-details.html"/><author><name>David San Filippo</name></author><published>2009-12-05T15:44:43Z</published><updated>2009-12-05T15:44:43Z</updated><content type="html" xml:lang="en-US"><![CDATA[<p>I am starting a fairly large project that will involve many developers. As part of the ramp up, I wanted to review all the code analysis/FxCop rules and choose which one we want to enforce as a check in policy for TFS. To help with the analysis, what I really wanted was a spreadsheet that listed all the rules and their descriptions that I can use to guide a meeting with a few other stakeholders.</p>
<p>Unfortunately, I couldn&rsquo;t really find such a list. The closest I came was this <a class="offsite-link-inline" href="http://code.msdn.microsoft.com/codeanalysis/Release/ProjectReleases.aspx?ReleaseId=556" target="_blank">list</a>&nbsp;that had the rule type names and listed whether they were supported in a couple of versions of FxCop and Visual Studio Code Analysis 2005 and 2008. This list was good, but only had the pascal cased rule type names. These names weren&rsquo;t always enough to really understand what the rule did.</p>
<p>What I really wanted was a list that had enough information to sit down and go through all the rules in a group so we could decide whether we wanted to enforce it as policy. The closest I was able to find was the msdn documentation located located <a class="offsite-link-inline" href="http://msdn.microsoft.com/en-us/library/ee1hzekz.aspx" target="_blank">here</a>.</p>
<p>The msdn documentation was great. Each rule has its own page with a description, cause and how to fix instructions with other information. But visiting a page for over 200 rules is way too tedious. What I really wanted was a spreadsheet with all that information.</p>
<p>To get that list, I decided to write a program to scrape all the details from the MSDN documentation into a single list. To do so I navigate the main page to each category, then for each category, I navigate each of the rules and scrape all the relevant details by parsing the HTML. The code is written in C#, and leverages a codeplex project, the <a class="offsite-link-inline" href="http://www.codeplex.com/htmlagilitypack" target="_blank">HTML Agility pack</a> to allow me to use XPath to navigate the HTML returned via WebClient.</p>
<p>The code itself generates a pipe delimited file, which I then used Excel to import and save as an Excel 2007 Workbook.</p>
<p><a href="http://www.mtelligent.com/storage/MSDNCodeAnalysisScraper.zip">Here</a> is a link to a zipped version of the source code if you want to write something similar. And <a href="http://www.mtelligent.com/storage/Code%20Analysis%20Rules.xlsx">here</a> is a link to the full spreadsheet (includes cause and how to fix columns)&nbsp;if you just want to have the output list of Rules with full detail.</p>]]></content></entry></feed>