<?xml version="1.0" encoding="UTF-8"?> <rss
version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
> <channel><title>MattButton.com</title> <atom:link href="http://www.mattbutton.com/feed/" rel="self" type="application/rss+xml" /><link>http://www.mattbutton.com</link> <description>Developers! Developers! Developers!</description> <lastBuildDate>Thu, 05 Apr 2012 04:17:57 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=3.3.1</generator> <item><title>Using Mercurial with a SVN repository in a production environment without any drama</title><link>http://www.mattbutton.com/2012/04/05/using-mercurial-with-a-svn-repository-in-a-production-environment-without-any-drama/</link> <comments>http://www.mattbutton.com/2012/04/05/using-mercurial-with-a-svn-repository-in-a-production-environment-without-any-drama/#comments</comments> <pubDate>Thu, 05 Apr 2012 04:17:57 +0000</pubDate> <dc:creator>Matt</dc:creator> <category><![CDATA[Uncategorized]]></category> <guid
isPermaLink="false">http://www.mattbutton.com/?p=177</guid> <description><![CDATA[Why would I want to use Mercurial or any other DVCS client with a Subversion repository? It lets us keep SVN as our central repository Some team members prefer not to use a DVCS for whatever reason so it lets them carry on using SVN without interruption. It allows me to work and commit changes [...]]]></description> <content:encoded><![CDATA[<h3>Why would I want to use Mercurial or any other DVCS client with a Subversion repository?</h3><ul><li>It lets us keep SVN as our central repository</li><li>Some team members prefer not to use a DVCS for whatever reason so it lets them carry on using SVN without interruption.</li><li>It allows me to work and commit changes (but not push!), search history and switch between branches completely disconnected. I can continue to work during network outages or while traveling when I don&#8217;t have connectivity.</li><li>You get full, fast history search.</li><li>Switching between branches is easy and fast.</li><li>Any automated processes which use SVN (i.e. automated builds and deployments) can continue to operate while everyone moves to DVCS.</li><li>It&#8217;s much easier to perform merges than regular SVN (via export/import patch queues &#8211; which I detail later)</li></ul><h3>Why not use git-svn?</h3><p>I personally prefer Mercurial with hgsubversion since, in my mind, the tooling in Windows is currently much more mature and I already have a hgsubversion workflow which is simple, robust and effective.</p><p>That being said, many people are happy with using git-svn and if you&#8217;re evaluating options, it may be worth giving it a go too!</p><h3>General Overview</h3><p>My local Mercurial repo contains the full history of the project with a full graph of branches &#8211; I use it to search full history, switch between branches, export/import patches, commit and push. I keep everything in a single C:\Source\my-project folder. no need for \trunk or \branches. There are many ways which you can use Mercurial with a SVN repository, each has it&#8217;s own caveats and edge-cases. This article is intended to record a way which I have found to be robust and hassle free.</p><p>I use TortoiseHg which you can get from <a
href="http://tortoisehg.bitbucket.org/">http://tortoisehg.bitbucket.org/</a></p><p>TortoiseHg includes the command line client, so you don&#8217;t need to install it separately.</p><p>This guide assumes knowledge of Mercurial and SVN concepts and workflows and is intended to be a kind of a summary of things to keep in mind when using Mercurial to work with a SVN repository.</p><p>To interact with the SVN repository, I only need to use TortoiseHG&#8217;s hg workbench http://tortoisehg.bitbucket.org/manual/2.3/workbench.html . Generally I&#8217;ll keep the window open at all times on my second monitor, minimizing it when not needed.</p><p>More reading: <a
href="http://tortoisehg.bitbucket.org/manual/2.3/workbench.html">http://tortoisehg.bitbucket.org/manual/2.3/workbench.html</a></p><h3>Getting hgsubversion</h3><p>You can get it from <a
href="https://bitbucket.org/durin42/hgsubversion/overview/">https://bitbucket.org/durin42/hgsubversion/overview/</a></p><p>This guide assumes that you will clone it to: C:\Apps\Mercurial\hgsubversion</p><p>I&#8217;m using hgsubversion at revision #821 (f28e0f54a6ef) so if in doubt and latest doesn&#8217;t seem to be working for you, try updating to this specific version.</p><p>More reading: <a
href="http://mercurial.selenic.com/wiki/HgSubversion">http://mercurial.selenic.com/wiki/HgSubversion</a></p><h3>Configuration</h3><p>My mercurial.ini file in C:\Users\Matt looks like:</p><pre class="brush: plain; title: ; notranslate">
[extensions]
hgsubversion = C:\Apps\Mercurial\hgsubversion\hgsubversion
mq =
rebase =
hgext.bookmarks =
hgext.graphlog =
mercurial_keyring=
[ui]
username = mattbutton
[tortoisehg]
ui.language = en
[diff]
git = True
</pre><p>my hgrc file in C:\Source\my-project\.hg looks like:</p><pre class="brush: plain; title: ; notranslate">
[paths]
default = svn+https://path-to-my-project-repository
[tortoisehg]
postpull = update
autoresolve = False
closeci = True
[ui]
username = mattbutton
</pre><p>my .hgignore in C:\Source\my-project for ASP.NET MVC development in Visual Studio on Windows looks like:</p><pre class="brush: plain; title: ; notranslate">
syntax: glob
obj
[Bb]in
_Resharper.*
*.csproj.user
*.resharper.user
*.resharper
*.suo
*.cache
*~
*.swp
*.db
build
GlobalAssemblyInfo.cs
*.sqlite
#ignore thumbnails created by windows
Thumbs.db
#Ignore files build by Visual Studio
*.obj
*.exe
*.pdb
*.user
*.aps
*.pch
*.vspscc
*_i.c
*_p.c
*.ncb
*.suo
*.tlb
*.tlh
*.bak
*.cache
*.ilk
*.log
*.dbmdl
[Bb]in
[Dd]ebug*/
*.lib
*.sbr
obj/
bin/[Rr]elease*/
_ReSharper*/
[Tt]est[Rr]esult*
*.ReSharper
</pre><h3>Cloning the Repository</h3><p>It&#8217;s best to clone the entire repository &#8211; not just trunk. This way you can take advantage of switching between branches and full history search.</p><p>If you&#8217;re cloning a large repository with thousands of changesets, you can expect the initial clone to take a few hours.</p><p>I recommend that you zip up the repository after the initial clone and keep it as a backup in case something happens to the working repository. This way, you can extract it somewhere and pull without having to go through the time consuming initial clone of the SVN repository.</p><h3>Import/Export Patch</h3><p>It&#8217;s important that git patches are enabled. Add the following to your mercurial.ini</p><pre class="brush: plain; title: ; notranslate">
[diff]
git = True
</pre><p>Without this setting, if you add a new file, commit, then create a patch based on the commit, you&#8217;ll discover that the new file is not included in the patch. Enabling git diffs will avoid this problem altogether.</p><p>More reading: <a
href="http://mercurial.selenic.com/wiki/GitExtendedDiffFormat">http://mercurial.selenic.com/wiki/GitExtendedDiffFormat</a></p><h3>Branching and Merging</h3><p>Do not ever use Mercurial for merging when dealing with a SVN repository. SVN only accepts a linear history, thus HG SVN cannot push merge changesets to a SVN repository and you&#8217;ll only end up with errors if you attempt this. There are two ways that you can get the same result without a merge.</p><p>If you&#8217;re working off of the trunk and you want to push your new changes, use the rebase function and deal with any merge conflicts. This will take all of your changesets which you haven&#8217;t yet pushed, and append them to the SVN head. You&#8217;ll then be able to push a linear history.</p><p>** TODO: add note about rebase onto SVN head</p><p>The general command line workflow for this is:</p><pre class="brush: plain; title: ; notranslate">
hg pull
hg rebase --svn
hg push
</pre><p>If you want to merge changes from one branch to trunk or vice-versa, the export/import patch functionality.</p><p>More reading: <a
href="http://blog.kalleberg.org/post/2337246985/merging-a-mercurial-repository-back-into-subversion">http://blog.kalleberg.org/post/2337246985/merging-a-mercurial-repository-back-into-subversion</a></p><h3>Removing Unversioned Files</h3><p>When switching between branches, you may end up with files which don&#8217;t belong in the revision which you&#8217;ve switched to. This may cause problems in your build process. To remove any unversioned files, you can use the &#8216;purge&#8217; extension:</p><pre class="brush: plain; title: ; notranslate">
hg purge --all
</pre><h3>When Things Go Wrong and You Can&#8217;t Push</h3><p>Sometimes you&#8217;ll have issues pushing to the SVN repository. Perhaps an error like &#8221;</p><p>If your changeset can&#8217;t be pushed and you&#8217;re getting an odd error which isn&#8217;t the usual change conflict, a workflow to fix this is:</p><ol><li>Pull the latest revisions</li><li>Export the changesets which aren&#8217;t pushing as a series of patches</li><li>Strip the changesets which aren&#8217;t pushing</li><li>Import the patches onto the head</li><li>Finalize the MQ</li><li>Push.</li></ol><p>Strip will remove the changeset and all it&#8217;s descendants.</p><p><strong>NB:</strong> Strip rewrites history so you should only use it on changesets which haven&#8217;t been pushed. You should never attempt to strip a changeset which has been pushed to SVN.</p><p>There are other methods such as hg collapse, however I see these as being quite risky and error prone since you&#8217;re making destructive. The export/import patch method has been reliable and problem-free for me.</p><p>More reading:<br
/> <a
href="http://mercurial.selenic.com/wiki/Strip">http://mercurial.selenic.com/wiki/Strip</a><br
/> <a
href="http://mercurial.selenic.com/wiki/Strip">http://mercurial.selenic.com/wiki/CollapseExtension</a></p> ]]></content:encoded> <wfw:commentRss>http://www.mattbutton.com/2012/04/05/using-mercurial-with-a-svn-repository-in-a-production-environment-without-any-drama/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>SQL Profiler templates missing</title><link>http://www.mattbutton.com/2011/06/01/sql-profiler-templates-missing/</link> <comments>http://www.mattbutton.com/2011/06/01/sql-profiler-templates-missing/#comments</comments> <pubDate>Wed, 01 Jun 2011 09:06:55 +0000</pubDate> <dc:creator>Matt</dc:creator> <category><![CDATA[Uncategorized]]></category> <guid
isPermaLink="false">http://www.mattbutton.com/?p=160</guid> <description><![CDATA[If you are connecting to a SQL server with the SQL profiler and none of your templates are showing up, check the version of the SQL server you are connecting to, compare the versions of the SQL profiler you are running and the SQL server you&#8217;re connecting to; there is likely a version mismatch. What&#8217;s [...]]]></description> <content:encoded><![CDATA[<p>If you are connecting to a SQL server with the SQL profiler and none of your templates are showing up, check the version of the SQL server you are connecting to, compare the versions of the SQL profiler you are running and the SQL server you&#8217;re connecting to; there is likely a version mismatch.</p><p>What&#8217;s happening here is that you&#8217;re connecting to a SQL 10.50 instance with a SQL 10.0 profiler and the profile templates for 10.50 aren&#8217;t present.</p><p>In the case of the profiler from SQL 2008 connecting to a SQL 2008 R2 instance, copy your 100 profile templates folder (default install is at C:\Program Files (x86)\Microsoft SQL Server\100\Tools\Profiler\Templates\Microsoft SQL Server\100) into a new folder in the same location with the name &#8220;1050&#8243; i.e. C:\Program Files (x86)\Microsoft SQL Server\100\Tools\Profiler\Templates\Microsoft SQL Server\1050.</p><p>Then try to reconnect, and you&#8217;ll have access to the profile templates and everything will work fine.</p><p>More information about SQL versions can be found at: http://sqlserverbuilds.blogspot.com/</p> ]]></content:encoded> <wfw:commentRss>http://www.mattbutton.com/2011/06/01/sql-profiler-templates-missing/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Loading jQuery via HTTP or HTTPS depending on the request protocol without document.write</title><link>http://www.mattbutton.com/2011/05/20/loading-jquery-via-http-or-https-depending-on-the-request-protocol-without-document-write/</link> <comments>http://www.mattbutton.com/2011/05/20/loading-jquery-via-http-or-https-depending-on-the-request-protocol-without-document-write/#comments</comments> <pubDate>Fri, 20 May 2011 08:49:36 +0000</pubDate> <dc:creator>Matt</dc:creator> <category><![CDATA[Uncategorized]]></category> <guid
isPermaLink="false">http://www.mattbutton.com/?p=162</guid> <description><![CDATA[When running a page with HTTPS, you&#8217;ll want to also load any external resources such as javascript via HTTPS. A lot of people recommend loading jQuery from the Google CDN via the following javascript script: This works just fine, however you can let the browser select the protocol depending on the request by the following [...]]]></description> <content:encoded><![CDATA[<p>When running a page with HTTPS, you&#8217;ll want to also load any external resources such as javascript via HTTPS. A lot of people recommend loading jQuery from the Google CDN via the following javascript script:</p><pre class="brush: jscript; title: ; notranslate">
&lt;script type=&quot;text/javascript&quot;&gt;
    var gaJsHost = ((&quot;https:&quot; == document.location.protocol) ? &quot;https://&quot; : &quot;http://&quot;);
    document.write(unescape(&quot;%3Cscript src='&quot; + gaJsHost + &quot;ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js' type='text/javascript'%3E%3C/script%3E&quot;));
    document.write(unescape(&quot;%3Cscript src='&quot; + gaJsHost + &quot;ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.min.js' type='text/javascript'%3E%3C/script%3E&quot;));
    document.write(unescape(&quot;%3Cscript src='&quot; + gaJsHost + &quot;ajax.googleapis.com/ajax/libs/swfobject/2.1/swfobject.js' type='text/javascript'%3E%3C/script%3E&quot;));
&lt;/script&gt;
</pre><p>This works just fine, however you can let the browser select the protocol depending on the request by the following snippet:</p><pre class="brush: xml; title: ; notranslate">
&lt;script type=&quot;text/javascript&quot; src=&quot;//ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;//ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.min.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;//ajax.googleapis.com/ajax/libs/swfobject/2.1/swfobject.js&quot;&gt;&lt;/script&gt;
</pre><p>This is obviously much cleaner, and you can see the full URL rather than javascript code to build up a string. The key here is the double slash within the src attribute. This kind of url works for any web resource and is particularly useful for loading resources from the Google CDN.</p> ]]></content:encoded> <wfw:commentRss>http://www.mattbutton.com/2011/05/20/loading-jquery-via-http-or-https-depending-on-the-request-protocol-without-document-write/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>How to include the Fluent NHibernate discriminator column in a composite key</title><link>http://www.mattbutton.com/2011/02/10/how-to-include-the-fluent-nhibernate-discriminator-column-in-a-composite-key/</link> <comments>http://www.mattbutton.com/2011/02/10/how-to-include-the-fluent-nhibernate-discriminator-column-in-a-composite-key/#comments</comments> <pubDate>Wed, 09 Feb 2011 12:22:25 +0000</pubDate> <dc:creator>Matt</dc:creator> <category><![CDATA[Development]]></category> <category><![CDATA[Fluent NHibernate]]></category> <category><![CDATA[NHibernate]]></category> <category><![CDATA[SQL]]></category> <guid
isPermaLink="false">http://www.mattbutton.com/?p=81</guid> <description><![CDATA[In our project, we&#8217;re sub classing multiple domain classes from a single Reference Data table &#8211; i.e. Volume and Weight types. Among other things, the reference data table contains discriminator, code and value columns. The &#8216;discriminator&#8217; column stores the name of the class and is used by Fluent NHibernate to determine which subclass to instantiate, [...]]]></description> <content:encoded><![CDATA[<p>In our project, we&#8217;re sub classing multiple domain classes from a single Reference Data table &#8211; i.e. Volume and Weight types. Among other things, the reference data table contains discriminator, code and value columns. The &#8216;discriminator&#8217; column stores the name of the class and is used by Fluent NHibernate to determine which subclass to instantiate, the &#8216;value&#8217; column is the full name of the reference data item, and the &#8216;code&#8217; column  is the abbreviated version of the value.</p><p>The code and value together are unique, and a composite key is created containing them both.</p><p>We load in reference data from an excel spreadsheet, and at some point, there was a code and value pair added to a reference data type which matched exactly with a code and value pair from another reference data type. Attempting to add the second code value pair resulted in a unique key violation.</p><p>I needed to add the discriminator column into the composite key. If you&#8217;re using auto mapping, you&#8217;ll need to add an auto mapping override. Below is an example of creating a composite key containing the code, discriminator and value columns.</p><pre class="brush: csharp; title: ; notranslate">
 public class ReferenceDataAutoMappingOverride : IAutoMappingOverride&lt;ReferenceData&gt;
 {
 public void Override(AutoMapping&lt;ReferenceData&gt; mapping)
 {
 const string uniqueKeyName = &quot;UK_ReferenceData_discriminator_Code_Value&quot;;
 mapping.DiscriminateSubClassesOnColumn&lt;string&gt;(&quot;discriminator&quot;).UniqueKey(uniqueKeyName);
 mapping.Map(refData =&gt; refData.Code).UniqueKey(uniqueKeyName);
 mapping.Map(refData =&gt; refData.Value).UniqueKey(uniqueKeyName);
 }
 }
</pre>]]></content:encoded> <wfw:commentRss>http://www.mattbutton.com/2011/02/10/how-to-include-the-fluent-nhibernate-discriminator-column-in-a-composite-key/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>ASP.NET MVC &#8211; Multiple parameterised form submit buttons without Javascript</title><link>http://www.mattbutton.com/2011/01/25/asp-net-mvc-multiple-parameterised-form-submit-buttons-without-javascript/</link> <comments>http://www.mattbutton.com/2011/01/25/asp-net-mvc-multiple-parameterised-form-submit-buttons-without-javascript/#comments</comments> <pubDate>Mon, 24 Jan 2011 12:44:20 +0000</pubDate> <dc:creator>Matt</dc:creator> <category><![CDATA[Development]]></category> <category><![CDATA[ASP.NET MVC]]></category> <category><![CDATA[NoScript]]></category> <guid
isPermaLink="false">http://www.mattbutton.com/?p=24</guid> <description><![CDATA[The current project I&#8217;m working on involves a search page with multiple submit buttons in a single HTML form. Each submit button triggers a different behavior while posting all of the form data to the controller. This method is compatible with both IE 6+ and Firefox. It also avoids the IE button bug where button [...]]]></description> <content:encoded><![CDATA[<p>The current project I&#8217;m working on involves a search page with multiple submit buttons in a single HTML form. Each submit button triggers a different behavior while posting all of the form data to the controller.</p><p>This method is compatible with both IE 6+ and Firefox. It also avoids the IE button bug where button values are not passed on HTTP POST.</p><p>After discussing a few design options we decided to allow the user to add the desired search parameters via selecting them one by one from a drop down list. The user will commonly want up to three parameters at a time and may want to remove parameters after adding.</p><p>The relevant basic requirements of the search page were as follows:</p><ul><li><strong>The form must work with JavaScript turned off</strong></li><li>26 optional parameters.</li><li>Display only the active parameters on screen.</li><li>The user must be able to add/remove parameters to/from the screen.</li><li>The user must be able to select individual items from the search results and download full XML certificate data for the selected records.</li><li>The user must be able to export all search results to a CSV file for processing in Excel.</li></ul><p>Buttons on forms allow us to go through a single action on the controller, we&#8217;ll call this <strong>PerformAction</strong>.</p><pre class="brush: csharp; title: ; notranslate">
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult PerformAction(HomeModel model, ButtonActionModel buttonAction)
{
	model.Items.Where(x =&gt; x.Key == buttonAction.ActionValue);
	if (buttonAction.ActionName == ButtonActionNames.Remove.ToString())
	{
		RemoveItem(buttonAction.ActionValue, model);
	}
	TempModel = model;
	// Post-get-redirect pattern:
	// http://blog.jorritsalverda.nl/2010/03/10/maintainable-mvc-post-redirect-get-pattern/
	return RedirectToAction(ViewNames.Index, null);
}
</pre><p>PerformAction accepts two parameters; HomeModel contains all of the form data and ButtonActionModel contains the button parameter data.</p><pre class="brush: csharp; title: ; notranslate">
public class ButtonActionModel
{
	public string ActionName { get; set; }
	public string ActionValue { get; set; }
}
</pre><p>The button model contains the name of the action (i.e. &#8220;Remove&#8221;) and the value of the action (i.e. &#8220;Parameter1&#8243;). The names and values are arbitrary and can be handled however you like in the PerformAction method.</p><p>In HTML, the buttons look like:</p><pre class="brush: xml; title: ; notranslate">
&lt;input name=&quot;buttonaction:Remove:Parameter1&quot; type=&quot;submit&quot;
       value=&quot;Remove Parameter 1&quot;&gt;&lt;/input&gt;
</pre><p>We&#8217;ll need a custom model binder to create the ButtonAction model.</p><pre class="brush: csharp; title: ; notranslate">
public class ButtonActionBinder : DefaultModelBinder
{
	public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
	{
		var request = controllerContext.HttpContext.Request;
		var formKeys = request.Form.AllKeys;
		ButtonActionModel result = null;
		var indexedbutton = formKeys.Where(x =&gt; x.StartsWith(&quot;buttonaction&quot;)).FirstOrDefault();
		if (indexedbutton != null)
		{
			result = new ButtonActionModel();
			var split = indexedbutton.Split(':');
			result.ActionName = split[1];
			if (split.Length &gt; 2) result.ActionValue = split[2];
		}
		return result;
	}
}
</pre><p>The model binder above is fairly simple, searching the submitted form data for &#8220;buttonaction&#8221; which is the first part of the button name.</p><p>The binder then splits the button name based on the colons, using the second element as the ActionName and the third element as the ActionValue. Once this is done, the binding is complete and the bound model is returned.</p><p>Add the model binder to Application_Start in Global.asax.cs</p><pre class="brush: csharp; title: ; notranslate">
ModelBinders.Binders.Add(typeof(ButtonActionModel),
                         new ButtonActionBinder());
</pre><p>Here&#8217;s an extended example demonstrating multiple parameterised form submit buttons without Javascript: <a
href='http://www.mattbutton.com/wp-content/uploads/2011/01/MvcMultiSubmit.zip'>MvcMultiSubmit</a></p> ]]></content:encoded> <wfw:commentRss>http://www.mattbutton.com/2011/01/25/asp-net-mvc-multiple-parameterised-form-submit-buttons-without-javascript/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Installing Sketchables for Sketchflow</title><link>http://www.mattbutton.com/2011/01/23/installing-sketchables-for-sketchflow/</link> <comments>http://www.mattbutton.com/2011/01/23/installing-sketchables-for-sketchflow/#comments</comments> <pubDate>Sat, 22 Jan 2011 13:18:17 +0000</pubDate> <dc:creator>Matt</dc:creator> <category><![CDATA[Design]]></category> <category><![CDATA[Balsamiq Mockups]]></category> <category><![CDATA[Expression Blend]]></category> <category><![CDATA[SketchFlow]]></category> <guid
isPermaLink="false">http://www.mattbutton.com/?p=64</guid> <description><![CDATA[We used to use Balsamiq for mockups, however Expression Blend 4 and Sketchflow has some compelling features. Sketchflow is missing a sketch style grid among other things, so we looked to Sketchables to provide. Referencing Sketchables.Silverlight.dll wasn&#8217;t enough, the new controls weren&#8217;t appearing in the &#8220;Assets&#8221; panel. Initially I tried referencing the designer files, but [...]]]></description> <content:encoded><![CDATA[<p>We used to use Balsamiq for mockups, however Expression Blend 4 and Sketchflow has some compelling features.</p><p>Sketchflow is missing a sketch style grid among other things, so we looked to Sketchables to provide.</p><p>Referencing Sketchables.Silverlight.dll wasn&#8217;t enough, the new controls weren&#8217;t appearing in the &#8220;Assets&#8221; panel. Initially I tried referencing the designer files, but that yielded no results. Reading the blog comments from <a
href="http://www.hardcodet.net/2010/07/public-sketchables-preview-release">hardcodet.net</a> there was the following one-liner:</p><blockquote><p><em>The libraries in the &#8220;design&#8221; folder are automatically picked up. They are used in Blend in order to provide the design time support.</em></p></blockquote><p><strong>The &#8220;Design&#8221; folder must sit below the folder which contains the referenced Sketchables.Silverlight.dll; Expression Blend 4 silently scans dlls in the design folder and loads them into the Assets panel.</strong></p> ]]></content:encoded> <wfw:commentRss>http://www.mattbutton.com/2011/01/23/installing-sketchables-for-sketchflow/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Bitbucket &#8211; wrong user on commit</title><link>http://www.mattbutton.com/2011/01/22/bitbucket-wrong-user-on-commit/</link> <comments>http://www.mattbutton.com/2011/01/22/bitbucket-wrong-user-on-commit/#comments</comments> <pubDate>Fri, 21 Jan 2011 15:07:52 +0000</pubDate> <dc:creator>Matt</dc:creator> <category><![CDATA[Development]]></category> <category><![CDATA[BitBucket]]></category> <category><![CDATA[Mercurial]]></category> <guid
isPermaLink="false">http://www.mattbutton.com/?p=74</guid> <description><![CDATA[I was having an issue where after pushing my changes to bitbucket, the changesets listed a different user as having pushed the files. For bitbucket, the commit username has to match your bitbucket username. As commits in Mercurial are local, we have no way of controlling that you have set your username correctly. It is [...]]]></description> <content:encoded><![CDATA[<p>I was having an issue where after pushing my changes to bitbucket, the changesets listed a different user as having pushed the files.</p><p>For bitbucket, the commit username has to match your bitbucket username.</p><blockquote><p> As commits in Mercurial are local, we have no way of controlling that you have set your username correctly. It is important for you to set this up in such a way that we can identify your user account on Bitbucket when you push your commits to us.</p></blockquote><p>In tortoise-hg, the username setting is available through <strong>global settings-&gt;commit</strong></p> ]]></content:encoded> <wfw:commentRss>http://www.mattbutton.com/2011/01/22/bitbucket-wrong-user-on-commit/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Some 3D Art I worked on Recently</title><link>http://www.mattbutton.com/2009/11/08/some-3d-art/</link> <comments>http://www.mattbutton.com/2009/11/08/some-3d-art/#comments</comments> <pubDate>Sun, 08 Nov 2009 10:11:21 +0000</pubDate> <dc:creator>Matt</dc:creator> <category><![CDATA[Uncategorized]]></category> <guid
isPermaLink="false">http://www.mattbutton.com/?p=1</guid> <description><![CDATA[]]></description> <content:encoded><![CDATA[<div
class="ngg-galleryoverview" id="ngg-gallery-1-1"><div
class="slideshowlink"> <a
class="slideshowlink" href="http://www.mattbutton.com/2009/11/08/some-3d-art/?show=slide"> [Show as slideshow] </a></div><div
class="piclenselink"> <a
class="piclenselink" href="javascript:PicLensLite.start({feedUrl:'http://www.mattbutton.com/wp-content/plugins/nextgen-gallery/xml/media-rss.php?gid=1&amp;mode=gallery'});"> [View with PicLens] </a></div><div
id="ngg-image-1" class="ngg-gallery-thumbnail-box"  ><div
class="ngg-gallery-thumbnail" > <a
href="http://www.mattbutton.com/wp-content/gallery/cg/speed_texturing_challenge_43_by_kendoran.jpg" title=" " class="shutterset_set_1" > <img
title="speed_texturing_challenge_43_by_kendoran" alt="speed_texturing_challenge_43_by_kendoran" src="http://www.mattbutton.com/wp-content/gallery/cg/thumbs/thumbs_speed_texturing_challenge_43_by_kendoran.jpg" width="100" height="75" /> </a></div></div><div
id="ngg-image-2" class="ngg-gallery-thumbnail-box"  ><div
class="ngg-gallery-thumbnail" > <a
href="http://www.mattbutton.com/wp-content/gallery/cg/s_floors_stairs_001_004.jpg" title=" " class="shutterset_set_1" > <img
title="s_floors_stairs_001_004" alt="s_floors_stairs_001_004" src="http://www.mattbutton.com/wp-content/gallery/cg/thumbs/thumbs_s_floors_stairs_001_004.jpg" width="100" height="75" /> </a></div></div><div
id="ngg-image-3" class="ngg-gallery-thumbnail-box"  ><div
class="ngg-gallery-thumbnail" > <a
href="http://www.mattbutton.com/wp-content/gallery/cg/render2.jpg" title=" " class="shutterset_set_1" > <img
title="render2" alt="render2" src="http://www.mattbutton.com/wp-content/gallery/cg/thumbs/thumbs_render2.jpg" width="100" height="75" /> </a></div></div><div
id="ngg-image-4" class="ngg-gallery-thumbnail-box"  ><div
class="ngg-gallery-thumbnail" > <a
href="http://www.mattbutton.com/wp-content/gallery/cg/render7.jpg" title=" " class="shutterset_set_1" > <img
title="render7" alt="render7" src="http://www.mattbutton.com/wp-content/gallery/cg/thumbs/thumbs_render7.jpg" width="100" height="75" /> </a></div></div><div
id="ngg-image-5" class="ngg-gallery-thumbnail-box"  ><div
class="ngg-gallery-thumbnail" > <a
href="http://www.mattbutton.com/wp-content/gallery/cg/s_walls_brickfront_002.jpg" title=" " class="shutterset_set_1" > <img
title="s_walls_brickfront_002" alt="s_walls_brickfront_002" src="http://www.mattbutton.com/wp-content/gallery/cg/thumbs/thumbs_s_walls_brickfront_002.jpg" width="100" height="75" /> </a></div></div><div
id="ngg-image-6" class="ngg-gallery-thumbnail-box"  ><div
class="ngg-gallery-thumbnail" > <a
href="http://www.mattbutton.com/wp-content/gallery/cg/t_walls_brickfront_002_d.jpg" title=" " class="shutterset_set_1" > <img
title="t_walls_brickfront_002_d" alt="t_walls_brickfront_002_d" src="http://www.mattbutton.com/wp-content/gallery/cg/thumbs/thumbs_t_walls_brickfront_002_d.jpg" width="100" height="75" /> </a></div></div><div
class='ngg-clear'></div></div> ]]></content:encoded> <wfw:commentRss>http://www.mattbutton.com/2009/11/08/some-3d-art/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> </channel> </rss>
