<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7600782647856196849</id><updated>2012-02-16T20:11:29.907-08:00</updated><category term='scripting'/><category term='meta'/><category term='.NET'/><category term='Links'/><title type='text'>yzorgsoft</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://yzorgsoft.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7600782647856196849/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://yzorgsoft.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>yzorg</name><uri>http://www.blogger.com/profile/12338842532726067525</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_JoPXi_iYcuM/TO3qcJ3RmTI/AAAAAAAAAAc/AMlx5Q6Pe-Q/S220/AtDesk.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>17</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7600782647856196849.post-7856374476733464416</id><published>2012-01-12T17:39:00.000-08:00</published><updated>2012-01-12T17:39:23.306-08:00</updated><title type='text'>polygon in SQL Server 2008: compute the angle of the first side of the polygon</title><content type='html'>I wanted the angle of the first side of a polygon in SQL Server 2008+. &amp;nbsp;Our code for entering the shapes evolved over time, specifically which direction drew the shapes. &lt;br /&gt;&lt;br /&gt;For example: starting with the NW point drawing clockwise (the anglican way) or drawing counter-clockwise (the way SQL draws Geography).&lt;br /&gt;&lt;br /&gt;I have to convert to geography on the fly because the geometry in the DB is combined with other shapes, hence the 2-level CTE.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;WITH PolygonGeo (Id, Polygon)&lt;br /&gt;AS (&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;SELECT&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt; &amp;nbsp;[MyIDColumn] AS [id]&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt; &amp;nbsp;,geometry::STGeomFromText(GeometryText, 4326) as [Polygon]&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;FROM [MyDatabase].[dbo].[MyTable]&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;WHERE GeometryText LIKE 'POLYGON%'&lt;br /&gt;),&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;Points ([Id], Pt0, Pt1)&lt;br /&gt;AS (&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;SELECT Id&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;, [Polygon].STPointN(1) AS Pt0&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;, [Polygon].STPointN(2) AS Pt1&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;FROM PolygonGeo&lt;br /&gt;)&lt;br /&gt;SELECT [Id]&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;, ATN2(Pt1.STX - Pt0.STX, Pt1.STY - Pt0.STY) / PI() * 180 &amp;nbsp;AS Angle&lt;br /&gt;FROM Points&lt;br /&gt;&lt;br /&gt;Results:&lt;br /&gt;&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;Id_8&lt;/th&gt;&lt;th&gt;Angle&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;33BAA7F&lt;/td&gt;&lt;td&gt;180&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;167AAEA&lt;/td&gt;&lt;td&gt;176.395579460831&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;F6469B3&lt;/td&gt;&lt;td&gt;180&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;33BAA7F&lt;/td&gt;&lt;td&gt;180&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;167AAEA&lt;/td&gt;&lt;td&gt;177.137594773874&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;0D34759&lt;/td&gt;&lt;td&gt;154.490530508003&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;33BAA7F&lt;/td&gt;&lt;td&gt;165.499833233449&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CB398C0&lt;/td&gt;&lt;td&gt;180&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CB398C0&lt;/td&gt;&lt;td&gt;143.383248480932&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;F6469B3&lt;/td&gt;&lt;td&gt;179.283840054506&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;33BAA7F&lt;/td&gt;&lt;td&gt;-175.114797431858&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7600782647856196849-7856374476733464416?l=yzorgsoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yzorgsoft.blogspot.com/feeds/7856374476733464416/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://yzorgsoft.blogspot.com/2012/01/polygon-in-sql-server-2008-compute.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7600782647856196849/posts/default/7856374476733464416'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7600782647856196849/posts/default/7856374476733464416'/><link rel='alternate' type='text/html' href='http://yzorgsoft.blogspot.com/2012/01/polygon-in-sql-server-2008-compute.html' title='polygon in SQL Server 2008: compute the angle of the first side of the polygon'/><author><name>yzorg</name><uri>http://www.blogger.com/profile/12338842532726067525</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_JoPXi_iYcuM/TO3qcJ3RmTI/AAAAAAAAAAc/AMlx5Q6Pe-Q/S220/AtDesk.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7600782647856196849.post-1120913634236805434</id><published>2011-12-13T05:29:00.000-08:00</published><updated>2011-12-13T05:29:16.603-08:00</updated><title type='text'>DOS tricks by yzorg, part 2</title><content type='html'>This is my second attempt at writing up my DOS tricks.  I changed jobs, just like the original post said, but found the original tricks were woefully inadequate in real world use.  Consider this as my first attempt at 'pro' tricks.I'll start with the basics from the command-line.&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;span style="font-family: Courier New; font-size: x-small;"&gt;C:\Users\YzOrg&amp;gt;echo %date:~10,4% %date:~4,2%&lt;br /&gt;2010 11&lt;br /&gt;&lt;br /&gt;C:\Users\YzOrg&amp;gt;echo hi &amp;gt;&amp;nbsp; %date:~10,4%%date:~4,2%.txt&lt;br /&gt;&lt;br /&gt;C:\Users\YzOrg&amp;gt;dir *.txt&lt;br /&gt;Volume in drive C has no label.&lt;br /&gt;Volume Serial Number is B8EE-D08D&lt;br /&gt;&lt;br /&gt;Directory of C:\Users\YzOrg&lt;br /&gt;&lt;br /&gt;11/24/2010&amp;nbsp; 09:32 AM&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5 201011.txt&lt;br /&gt;10/01/2010&amp;nbsp; 10:40 AM&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 210 SDK.txt&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2 File(s)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 215 bytes&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 Dir(s)&amp;nbsp; 199,100,514,304 bytes free&lt;br /&gt;&lt;br /&gt;C:\Users\YzOrg&amp;gt;set line=0123456789 ABCD 0123456789 ABCD0123456789 ABCD0123456789 ABCD0123456789&lt;br /&gt;&lt;br /&gt;C:\Users\YzOrg&amp;gt;echo %line:~10,8%&lt;br /&gt;ABCD 01&lt;br /&gt;&lt;br /&gt;C:\Users\YzOrg&amp;gt;echo hi &amp;gt; demo%date:~10,4%%date:~4,2%%date:~7,2%.log &amp;amp; dir demo*.log&lt;br /&gt;Volume in drive C has no label.&lt;br /&gt;Volume Serial Number is B8EE-D08D&lt;br /&gt;&lt;br /&gt;Directory of C:\Users\YzOrg&lt;br /&gt;&lt;br /&gt;11/24/2010&amp;nbsp; 09:50 AM&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6 demo20101124.log&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1 File(s)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6 bytes&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 Dir(s)&amp;nbsp; 199,100,379,136 bytes free&lt;br /&gt;&lt;br /&gt;C:\Users\YzOrg&amp;gt;set /?&lt;br /&gt;Displays, sets, or removes cmd.exe environment variables.&lt;br /&gt;&lt;br /&gt;SET [variable=[string]]&lt;/span&gt;&lt;br /&gt;...&amp;lt;SNIP&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Pitfalls with using %DATE% and %TIME% in filenames&lt;/h2&gt;Time and date from OS can have spaces.&amp;nbsp; So put the log filename in its own variable and use &lt;br /&gt;&lt;pre&gt;    SET MYVAR=%MYVAR: =0%&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;to replace any spaces from %DATE% and %TIME% to 0.&lt;br /&gt;&lt;br /&gt;I recommend you &lt;a href="http://www.robvanderwoude.com/redirection.php"&gt;follow this guidance&lt;/a&gt;, put StdErr redirection at the end of the line.&lt;br /&gt;&lt;br /&gt;Here is the final snippet for use in scripts:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Code&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;set LOG_TIMESTAMP=%date:~10,4%%date:~4,2%%date:~7,2%-%time:~0,2%%time:~3,2%.JobName.log&lt;br /&gt;set LOG_TIMESTAMP=%LOG_TIMESTAMP: =0%&lt;br /&gt;echo starting at %date% %time% with log %CD%\log\%LOG_TIMESTAMP%&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Output&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;starting at Tue 02/13/2011  8:26:57.99 with log C:\Users\YzOrg\log\20110213-0826.JobName.log&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h2&gt;Other CMD Tricks&lt;/h2&gt;Use %~dp0 to get the full path of the current batch file.&amp;nbsp; %0 is the scriptname argument, '~dp' are modifiers to get the drive and path of that argument, %~dp0.&lt;br /&gt;&lt;br /&gt;Rule: always turn off 'echo' in batch files using this first line:&lt;br /&gt;&lt;pre&gt;@if not defined _echo echo off&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Use 'set _echo=1' before calling the script to debug it (it will echo every command)References: set /?, call /?, for /?, setlocal /?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7600782647856196849-1120913634236805434?l=yzorgsoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yzorgsoft.blogspot.com/feeds/1120913634236805434/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://yzorgsoft.blogspot.com/2011/12/dos-tricks-by-yzorg-part-2.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7600782647856196849/posts/default/1120913634236805434'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7600782647856196849/posts/default/1120913634236805434'/><link rel='alternate' type='text/html' href='http://yzorgsoft.blogspot.com/2011/12/dos-tricks-by-yzorg-part-2.html' title='DOS tricks by yzorg, part 2'/><author><name>yzorg</name><uri>http://www.blogger.com/profile/12338842532726067525</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_JoPXi_iYcuM/TO3qcJ3RmTI/AAAAAAAAAAc/AMlx5Q6Pe-Q/S220/AtDesk.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7600782647856196849.post-6784451659961381134</id><published>2011-09-24T00:18:00.000-07:00</published><updated>2011-09-24T00:18:16.584-07:00</updated><title type='text'>don't need to install .NET 3.5 for Metro UI Tweaker</title><content type='html'>The post I wrote for GreenShot used a configuration file to tell the app to use the CLR and .NET FX that is already installed on Windows 8. &amp;nbsp;The same hack works for the Metro UI Tweaker tool from The Windows Club (which I found via winsupersite.com). &lt;br /&gt;&lt;br /&gt;So &lt;a href="https://gist.github.com/1223509"&gt;grab the configuration file&lt;/a&gt; I used for GreenShot but this time name it "Metro UI Tweaker.exe.config".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7600782647856196849-6784451659961381134?l=yzorgsoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yzorgsoft.blogspot.com/feeds/6784451659961381134/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://yzorgsoft.blogspot.com/2011/09/dont-need-to-install-net-35-for-metro.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7600782647856196849/posts/default/6784451659961381134'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7600782647856196849/posts/default/6784451659961381134'/><link rel='alternate' type='text/html' href='http://yzorgsoft.blogspot.com/2011/09/dont-need-to-install-net-35-for-metro.html' title='don&apos;t need to install .NET 3.5 for Metro UI Tweaker'/><author><name>Unknown</name><uri>http://www.blogger.com/profile/04345699682484220414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7600782647856196849.post-5716130669588180796</id><published>2011-09-16T18:56:00.000-07:00</published><updated>2011-09-16T18:56:26.117-07:00</updated><title type='text'>Greenshot on Windows 8 (.NET 4.5)</title><content type='html'>&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;How to run&amp;nbsp;Greenshot on&amp;nbsp;.NET 4.5 (Windows 8).&amp;nbsp; Greenshot is an OSS alternative for SnagIt (screenshot tool).&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial;"&gt;Don't install the Greenshot installer.  It will refuse to install without .NET 2.0, even though it seems to run fine on .NET 4.5.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;1)&amp;nbsp;&lt;a href="http://sourceforge.net/projects/greenshot/files/Greenshot/Greenshot%200.8%20beta/Greenshot-NO-INSTALLER-UNSTABLE-0.8.1.1314.zip/download"&gt;download the zip file&lt;/a&gt; and extract it to C:\Program Files\Greenshot.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;Note: On Win8 y&lt;/span&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;ou'll need to be running a process with Admin privileges to create the directory and extract the files.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;2) create Greenshot.exe.config to tell .NET to run Greenshot on .NET 4 with a couple of compatibility options.&amp;nbsp; &lt;/span&gt;&lt;a href="https://gist.github.com/1223509"&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;https://gist.github.com/1223509&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7600782647856196849-5716130669588180796?l=yzorgsoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yzorgsoft.blogspot.com/feeds/5716130669588180796/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://yzorgsoft.blogspot.com/2011/09/greenshot-on-windows-8-net-45.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7600782647856196849/posts/default/5716130669588180796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7600782647856196849/posts/default/5716130669588180796'/><link rel='alternate' type='text/html' href='http://yzorgsoft.blogspot.com/2011/09/greenshot-on-windows-8-net-45.html' title='Greenshot on Windows 8 (.NET 4.5)'/><author><name>Unknown</name><uri>http://www.blogger.com/profile/04345699682484220414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7600782647856196849.post-4287116137484209247</id><published>2011-09-10T14:40:00.000-07:00</published><updated>2011-09-10T14:42:13.433-07:00</updated><title type='text'>A look at ReactiveUI</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;I'm thinking about how to take some of the middle-tier parallel concepts like #RxNet and apply them in a little OSS GUI app I've been thinking about. &amp;nbsp;I quickly found&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;this gem, &lt;a href="http://www.reactiveui.net/welcome/pdf"&gt;ReactiveUI PDF&lt;/a&gt;&amp;nbsp;. &amp;nbsp;A couple of quotes that stoked my interest:&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;b&gt;"What’s in this library&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;ReactiveCommand - an implementation of ICommand that is also a Subject whose OnNext is&amp;nbsp;raised when Execute is executed. Its CanExecute can also be deﬁned by an IObservable which&amp;nbsp;means the UI will instantly update instead of implementations which rely on RequerySuggested."&lt;/span&gt;&lt;/blockquote&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&amp;nbsp;...&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;b&gt;"Some philosophy&lt;/b&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;A lot of examples of the Reactive Extensions make its domain appear really constrained, like the&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;only thing it’s ever useful for is either handing web service requests and implementing drag-and-&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;drop. However, here’s the key thing to realize - a property change notiﬁcation is an event.&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;Once you realize that Reactive Programming applies to any time an object changes state, Rx&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;suddenly becomes &amp;nbsp;far more applicable to any programming domain - really, Rx is a library to&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;model state machines that are context-free with respect to threading."&lt;/span&gt;&lt;/blockquote&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;And, I can use all the high-level composition that I've been using in the middle tier. &amp;nbsp;Like Merge() to join streams of events, and Throttle() to do in one line that takes a half-page of code with other frameworks. &amp;nbsp;This looks promising. &amp;nbsp;One glitch. &amp;nbsp;The author of the library recently moved from Microsoft (Office team) to GitHub. &amp;nbsp;Uh-Oh. &amp;nbsp;But too promising to ignore it. &amp;nbsp;At least I hope he still works in C#, maybe he can help with the Windows OSS clients, like Git Extensions, which is written in C# (but not hosted on github).&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;nRoute is another MVVM framework that leans on Rx for event streams. &amp;nbsp;It's author is French. &amp;nbsp;Hmm.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"&gt;It's good to have choices, unlike 18 months ago.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7600782647856196849-4287116137484209247?l=yzorgsoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yzorgsoft.blogspot.com/feeds/4287116137484209247/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://yzorgsoft.blogspot.com/2011/09/look-at-reactiveui.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7600782647856196849/posts/default/4287116137484209247'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7600782647856196849/posts/default/4287116137484209247'/><link rel='alternate' type='text/html' href='http://yzorgsoft.blogspot.com/2011/09/look-at-reactiveui.html' title='A look at ReactiveUI'/><author><name>yzorg</name><uri>http://www.blogger.com/profile/12338842532726067525</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_JoPXi_iYcuM/TO3qcJ3RmTI/AAAAAAAAAAc/AMlx5Q6Pe-Q/S220/AtDesk.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7600782647856196849.post-2833863502716564556</id><published>2011-09-09T20:39:00.000-07:00</published><updated>2011-09-09T20:44:58.297-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>Middle-Tie​r: TPL and/or RxNet</title><content type='html'>&lt;span style="font-family: &amp;quot;Helvetica Neue&amp;quot;, Arial, Helvetica, sans-serif;"&gt;I was thinking about how to rewrite an old (2009) WCF middle-tier service, and have been thinking about George Tsiokos's recent &lt;a href="http://george.tsiokos.com/posts/2011/8/28/different-async-options-in-net.html"&gt;TPL vs. RxNet post&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Helvetica Neue&amp;quot;, Arial, Helvetica, sans-serif;"&gt;I think a middle-tier service is perfect to illustrate how I see the strengths and weaknesses of these two.&amp;nbsp; Specifically the scenario:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-family: &amp;quot;Helvetica Neue&amp;quot;, Arial, Helvetica, sans-serif;"&gt;Complex Middle-Tier:&amp;nbsp; Startup vs. Message Handling&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Helvetica Neue&amp;quot;, Arial, Helvetica, sans-serif;"&gt;TPL might be great for startup tasks.&amp;nbsp; There is one 'global' task, Initialize, that has many sequences and chunks (in TPL these could be child tasks) that can have different degrees of parallelization.&amp;nbsp; It also requires global 'command and control' and 'top-down' composition and error handling (a type of event correlation).&amp;nbsp; If any critical part of startup fails then tear-down the service (cancel outstanding parallel tasks) and exit the service quickly.&amp;nbsp; So global handling and command-control programming style (root of the call hierarchy has all control).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Helvetica Neue&amp;quot;, Arial, Helvetica, sans-serif;"&gt;Once everything is initialized you want bottom-up event correlation and error handling.&amp;nbsp; The function at the top of the callstack has no control (usually a WCF operation or I/O completion callback).&amp;nbsp; You only want global state to be touched when absolutely necessary, not touched by ignorable infrastructure errors, and not by errors that are ignorable according to business rules.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Helvetica Neue&amp;quot;, Arial, Helvetica, sans-serif;"&gt;&lt;strong&gt;Startup, large complex top-down composable work:&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Helvetica Neue&amp;quot;, Arial, Helvetica, sans-serif;"&gt;TPL&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Helvetica Neue&amp;quot;, Arial, Helvetica, sans-serif;"&gt;&lt;strong&gt;Streams, composable business logic (streams that include error/end):&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Helvetica Neue&amp;quot;, Arial, Helvetica, sans-serif;"&gt;RxNet&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Arial;"&gt;With .NET 5 the TPL dataflow libraries might change things again, but for now I much prefer RxNet for composing and routing 'messages' between layers.&amp;nbsp;&amp;nbsp;We recently used it in a project and when you have to correctly handle error scenarios it shines.&amp;nbsp; Imagine a WCF callback for a business operation that is completely async, where business logic has to fire&amp;nbsp;if the notification&amp;nbsp;fails (delivery of the&amp;nbsp;data to the client).&amp;nbsp; The code isn't pretty in either case, but is better and can be handled at the right level of the lego blocks with RxNet.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7600782647856196849-2833863502716564556?l=yzorgsoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yzorgsoft.blogspot.com/feeds/2833863502716564556/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://yzorgsoft.blogspot.com/2011/09/middle-tier-tpl-andor-rxnet.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7600782647856196849/posts/default/2833863502716564556'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7600782647856196849/posts/default/2833863502716564556'/><link rel='alternate' type='text/html' href='http://yzorgsoft.blogspot.com/2011/09/middle-tier-tpl-andor-rxnet.html' title='Middle-Tie​r: TPL and/or RxNet'/><author><name>yzorg</name><uri>http://www.blogger.com/profile/12338842532726067525</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_JoPXi_iYcuM/TO3qcJ3RmTI/AAAAAAAAAAc/AMlx5Q6Pe-Q/S220/AtDesk.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7600782647856196849.post-5763425965864858062</id><published>2011-02-08T18:24:00.001-08:00</published><updated>2011-02-08T18:24:33.056-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scripting'/><title type='text'>mandatory DOS trick - %date:~10,4%%date:~4,2%%date:~7,2%</title><content type='html'>&lt;p&gt;I’ve written this trick every new job or position I miss out on the old standby, using batch script to capture command-line output to a dated log file.&amp;nbsp; This post is so I’ll never have to reproduce it again.&lt;/p&gt; &lt;p&gt;&lt;font size="2" face="Courier New"&gt;C:\Users\YzOrg&amp;gt;echo %date:~10,4% %date:~4,2%&lt;br&gt;2010 11&lt;br&gt;&amp;nbsp;&lt;br&gt;C:\Users\YzOrg&amp;gt;echo hi &amp;gt;&amp;nbsp; %date:~10,4%%date:~4,2%.txt&lt;br&gt;&amp;nbsp;&lt;br&gt;C:\Users\YzOrg&amp;gt;dir *.txt&lt;br&gt;Volume in drive C has no label.&lt;br&gt;Volume Serial Number is B8EE-D08D&lt;br&gt;&amp;nbsp;&lt;br&gt;Directory of C:\Users\YzOrg&lt;br&gt;&amp;nbsp;&lt;br&gt;11/24/2010&amp;nbsp; 09:32 AM&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5 201011.txt&lt;br&gt;10/01/2010&amp;nbsp; 10:40 AM&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 210 SDK.txt&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2 File(s)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 215 bytes&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 Dir(s)&amp;nbsp; 199,100,514,304 bytes free&lt;br&gt;&amp;nbsp;&lt;br&gt;C:\Users\YzOrg&amp;gt;set line=0123456789 ABCD 0123456789 ABCD0123456789 ABCD0123456789 ABCD0123456789&lt;br&gt;&amp;nbsp;&lt;br&gt;C:\Users\YzOrg&amp;gt;echo %line:~10,8%&lt;br&gt;ABCD 01&lt;br&gt;&amp;nbsp;&lt;br&gt;C:\Users\YzOrg&amp;gt;echo hi &amp;gt; demo%date:~10,4%%date:~4,2%%date:~7,2%.log &amp;amp; dir demo*.log&lt;br&gt;Volume in drive C has no label.&lt;br&gt;Volume Serial Number is B8EE-D08D&lt;br&gt;&amp;nbsp;&lt;br&gt;Directory of C:\Users\YzOrg&lt;br&gt;&amp;nbsp;&lt;br&gt;11/24/2010&amp;nbsp; 09:50 AM&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6 demo20101124.log&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1 File(s)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6 bytes&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 Dir(s)&amp;nbsp; 199,100,379,136 bytes free&lt;br&gt;&amp;nbsp;&lt;br&gt;C:\Users\YzOrg&amp;gt;set /?&lt;br&gt;Displays, sets, or removes cmd.exe environment variables.&lt;br&gt;&amp;nbsp;&lt;br&gt;SET [variable=[string]]&lt;br&gt;&lt;/font&gt;...&amp;lt;SNIP&amp;gt;&lt;br&gt;&amp;nbsp;&lt;br&gt;Use %~dp0 to get the full path of the current batch file.&amp;nbsp; %0 is the scriptname argument, '~dp' are modifiers to get the drive and path of that argument, %~dp0.&amp;nbsp; &lt;br&gt;&amp;nbsp;&lt;br&gt;Interesting FOR commands in cmd.exe :&lt;br&gt;FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]&lt;br&gt;FOR /F ["options"] %variable IN ("string") DO command [command-parameters]&lt;br&gt;FOR /F ["options"] %variable IN ('command') DO command [command-parameters]&lt;br&gt;&amp;nbsp;&lt;br&gt;Rule: always turn off 'echo' in batch files using this first line:&lt;br&gt;@if not defined _echo echo off&lt;br&gt;Use 'set _echo=1' before calling the script to debug it (it will echo every command)&lt;br&gt;&amp;nbsp;&lt;br&gt;References: set /?, call /?, for /?, setlocal /?&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7600782647856196849-5763425965864858062?l=yzorgsoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yzorgsoft.blogspot.com/feeds/5763425965864858062/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://yzorgsoft.blogspot.com/2011/02/mandatory-dos-trick-date104date42date72.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7600782647856196849/posts/default/5763425965864858062'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7600782647856196849/posts/default/5763425965864858062'/><link rel='alternate' type='text/html' href='http://yzorgsoft.blogspot.com/2011/02/mandatory-dos-trick-date104date42date72.html' title='mandatory DOS trick - %date:~10,4%%date:~4,2%%date:~7,2%'/><author><name>yzorg</name><uri>http://www.blogger.com/profile/12338842532726067525</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_JoPXi_iYcuM/TO3qcJ3RmTI/AAAAAAAAAAc/AMlx5Q6Pe-Q/S220/AtDesk.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7600782647856196849.post-5977881567417704411</id><published>2011-02-01T20:35:00.000-08:00</published><updated>2011-02-01T20:44:43.563-08:00</updated><title type='text'>Round-Up</title><content type='html'>&lt;h2&gt;iPod&lt;/h2&gt;&lt;div&gt;I recently bought a 4th gen iPod and man do I love it.  Don't have to pay a data plan, and with a few bucks for good software can really make use of the GB of &lt;br /&gt;flash storage and the fat bandwidth over WiFi.  Exactly what my old Windows Mobile 6.X phone sucked at.  Great battery, great podcast playback (2x play, remembers where I left off, etc.).&lt;br /&gt;The only thing I was missing was Podcast subscription (on device, no iTunes on Windows please) and automatic WiFi sync for podcasts.  There's an app ...&lt;/div&gt;&lt;br /&gt;&lt;h2&gt;iOS Apps&lt;/h2&gt;&lt;div&gt;&lt;a href="http://www.downcastapp.com/"&gt;DownCast&lt;/a&gt;: $0.99 app to sync podcasts over WiFi. My Features: Multitasking (background play), subscribe to podcasts,&amp;nbsp;sync to iPod via WiFi, 2x speed, good jump buttons (back 30, back 15, forward 30, forward 2:00).  Bonus features: can sort a playlist by podcast name instead of date, so can see the three 'good'&lt;br /&gt;weekly podcasts first (instead of listening to the daily podcasts first, which tend to be filler. &amp;nbsp;I also found out too late that it can import an &lt;a href="http://twitter.com/#!/downcastapp/status/32403342722338816"&gt;OPML from a URL&lt;/a&gt;&amp;nbsp;(I was adding them one at a time, good time saver.)&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Microsoft OneNote: free. My Features: (sync to Live/SkyDrive/OfficeLive, whatever they're calling it today).  Love that it syncs my notes to all my devices + web.  &lt;br /&gt;So I can start gathering notes and thoughts for a blog post on the laptop, research it on the desktop, and pull it up on my pocket device (iPod in my case) to solicit feedback from a co-worker.  &lt;br /&gt;Leave it to Apple to help make OneNote useful enough to finally start using it instead of email.&lt;/div&gt;&lt;br /&gt;&lt;h2&gt;StackOverflow + Google&lt;/h2&gt;&lt;div&gt;The work&amp;nbsp;&lt;a href="http://googleblog.blogspot.com/2011/01/google-search-and-search-engine-spam.html"&gt;Google is doing to reduce spammers and content farms&lt;/a&gt;&amp;nbsp;seems to be working - SO rank has recently improved dramatically in my recent programming searches.&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.google.com/search?sourceid=chrome&amp;amp;ie=UTF-8&amp;amp;q=threadsafe+INotifyPropertyChanged"&gt;http://www.google.com/search?sourceid=chrome&amp;amp;ie=UTF-8&amp;amp;q=threadsafe+INotifyPropertyChanged&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.google.com/search?sourceid=chrome&amp;amp;ie=UTF-8&amp;amp;q=Property+name+from+lambda"&gt;http://www.google.com/search?sourceid=chrome&amp;amp;ie=UTF-8&amp;amp;q=Property+name+from+lambda&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;For similar technology searches a few weeks ago I was getting spam/content farms of stackoverflow.com duplicated content for most of the results, with SO 3rd or 4th (obviously the content farms were gaming the SEO ranking). &amp;nbsp;Not scientific by any stretch, but getting better.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7600782647856196849-5977881567417704411?l=yzorgsoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yzorgsoft.blogspot.com/feeds/5977881567417704411/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://yzorgsoft.blogspot.com/2011/02/round-up.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7600782647856196849/posts/default/5977881567417704411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7600782647856196849/posts/default/5977881567417704411'/><link rel='alternate' type='text/html' href='http://yzorgsoft.blogspot.com/2011/02/round-up.html' title='Round-Up'/><author><name>yzorg</name><uri>http://www.blogger.com/profile/12338842532726067525</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_JoPXi_iYcuM/TO3qcJ3RmTI/AAAAAAAAAAc/AMlx5Q6Pe-Q/S220/AtDesk.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7600782647856196849.post-6088476490109282474</id><published>2011-02-01T20:27:00.000-08:00</published><updated>2011-02-01T20:29:31.516-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Links'/><title type='text'>linkfest 2011.Feb.01</title><content type='html'>&lt;h2&gt;&lt;span class="Apple-style-span" style="font-size: 19px;"&gt;JSON / Diagnostics&lt;/span&gt;&lt;/h2&gt;&lt;a href="http://markmail.org/message/z2yzevdhw22xhds3"&gt;Pretty Print JSON&lt;/a&gt; via JayRock&lt;br /&gt;&lt;a href="http://jayrock.berlios.de/"&gt;New JSON library for .NET, JayRock&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;WPF and INotifyPropertyChanged&lt;/h2&gt;&lt;a href="http://code.google.com/p/notifypropertyweaver/"&gt;http://code.google.com/p/notifypropertyweaver/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://stackoverflow.com/questions/671968/retrieving-property-name-from-lambda-expression"&gt;http://stackoverflow.com/questions/671968/retrieving-property-name-from-lambda-expression&lt;/a&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms229614.aspx"&gt;http://msdn.microsoft.com/en-us/library/ms229614.aspx&lt;/a&gt;&lt;br /&gt;&lt;a href="http://caliburn.codeplex.com/wikipage?title=Asynchronous%20Actions"&gt;http://caliburn.codeplex.com/wikipage?title=Asynchronous%20Actions&lt;/a&gt;&lt;br /&gt;&lt;a href="http://stackoverflow.com/questions/834632/bind-any-xml-document-to-wpf-treeview"&gt;http://stackoverflow.com/questions/834632/bind-any-xml-document-to-wpf-treeview&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;IoC / Autofac&lt;/h2&gt;&lt;a href="http://www.blogger.com/nblumhardt.com/2011/01/an-autofac-lifetime-primer/"&gt;Nicholas Blumhardt: AutoFac and object Lifetime&lt;/a&gt;  (summary: mind your 'unit of work' pattern)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7600782647856196849-6088476490109282474?l=yzorgsoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yzorgsoft.blogspot.com/feeds/6088476490109282474/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://yzorgsoft.blogspot.com/2011/02/linkfest-2011feb01.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7600782647856196849/posts/default/6088476490109282474'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7600782647856196849/posts/default/6088476490109282474'/><link rel='alternate' type='text/html' href='http://yzorgsoft.blogspot.com/2011/02/linkfest-2011feb01.html' title='linkfest 2011.Feb.01'/><author><name>yzorg</name><uri>http://www.blogger.com/profile/12338842532726067525</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_JoPXi_iYcuM/TO3qcJ3RmTI/AAAAAAAAAAc/AMlx5Q6Pe-Q/S220/AtDesk.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7600782647856196849.post-271437549900253198</id><published>2011-01-19T19:48:00.000-08:00</published><updated>2011-01-19T19:48:13.454-08:00</updated><title type='text'>robocopy /MT for Windows XP: RichCopy</title><content type='html'>Microsoft's devs and testers write great little specialized utilities but far too often they never see the light of day. They write it for their team, and sometimes have time to post it internally, but all too often they're too busy to publish it outside the company.&lt;br /&gt;&lt;br /&gt;This is one of those gems, and fortunately it is public.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;My Scenario&lt;/h2&gt;I had a NY to FL file copy operation that was taking about 10 minutes with xcopy and pre-Win7 robocopy.  The files weren't that big, but lots of small files, and one-at-a-time file copy performed horribly. Win7 introduced the /MT argument to allow 'multiple threads' to copy file simultaneously, which is exactly what I needed.  But I'm not using Win7 (yet).  Even better, the Win7 robocopy.exe won't run on older versions of Windows (both properly licensed). Nice. RichCopy to the rescue.&lt;br /&gt;&lt;br /&gt;RichCopy is a graphical application for Windows and will run on Windows XP and Windows Server 2003. It also has (cryptic) command-line options for all of the various copy options like filter by name, filter by date, and copy file attribute. RichCopy really shines when copying huge files, but if you seriously raise the threading you can also get a boost when copying lots of small files (like source code files or in this case PowerShell scripts).&lt;br /&gt;&lt;br /&gt;I've used robocopy a lot over the years, so while its options are cryptic I found RichCopy's options even worse. To save myself time I wanted to document the options I'm using.&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Courier New, Courier New, monospace; font-weight: bold;"&gt;RichCopy.exe source destination /TD 64 /TS 32 /SC 64 /FEF *.7z&lt;/div&gt;&lt;br /&gt;Get it here. &lt;a href="http://blogs.technet.com/ken/"&gt;http://blogs.technet.com/ken/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Gotchas / Caveats&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;I was looking for a command-line tool, and this is a windows application. You can wait on the windows application (which does exit properly when given correct command-line options) using PowerShell's &lt;b&gt;'Start-Process -Wait RichCopy.exe'&lt;/b&gt; or in cmd.exe &lt;b&gt;'start /wait "" RichCopy.exe'&lt;/b&gt;.&lt;/li&gt;&lt;li&gt;I wasn't getting any command-line output when passing bad command-line arguments, and while it has logging options I didn't get them to work after a couple of tries.&lt;/li&gt;&lt;li&gt;RichCopy comes with a chm (compiled help) which explains all the options.  But I get the feeling the author's first spoken language isn't English because the wording is clumsy. (Not that my blog writing is any good, ahem.)&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;h2&gt;Sample PowerShell&lt;/h2&gt;I was using RichCopy to copy my PowerShell profile to my DEV servers.  It includes code to call robocopy (if found via Get-Command) and if not found fall back to RichCopy (XP / Server 2003 only). If planning to compare the tools a good addition would be to make this a script parameter instead.  The code is available at PoshCode: &lt;a href="http://powershellcommunity.poshcode.org/2468"&gt;PoshCode 2468&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src="http://PoshCode.org/embed/2468" type="text/javascript"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7600782647856196849-271437549900253198?l=yzorgsoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yzorgsoft.blogspot.com/feeds/271437549900253198/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://yzorgsoft.blogspot.com/2011/01/robocopy-mt-for-windows-xp-richcopy.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7600782647856196849/posts/default/271437549900253198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7600782647856196849/posts/default/271437549900253198'/><link rel='alternate' type='text/html' href='http://yzorgsoft.blogspot.com/2011/01/robocopy-mt-for-windows-xp-richcopy.html' title='robocopy /MT for Windows XP: RichCopy'/><author><name>yzorg</name><uri>http://www.blogger.com/profile/12338842532726067525</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_JoPXi_iYcuM/TO3qcJ3RmTI/AAAAAAAAAAc/AMlx5Q6Pe-Q/S220/AtDesk.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7600782647856196849.post-3653661154107534925</id><published>2011-01-17T20:26:00.000-08:00</published><updated>2011-01-19T17:13:56.545-08:00</updated><title type='text'>StreamBase annoyance for today</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: left;"&gt;After 9 months of use, SB Studio left 670MB of temporary files. &amp;nbsp;Thanks StreamBase! &amp;nbsp;In all fairness this might have something to do with SB Studio being built in/with Eclipse. &amp;nbsp;They all start with .sb, which makes me feel better about casting blame.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_JoPXi_iYcuM/TTFPr60v4qI/AAAAAAAAABE/kHf4QmmKfnM/s1600/Blog-SBAnnoyance2011Jan12.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/_JoPXi_iYcuM/TTFPr60v4qI/AAAAAAAAABE/kHf4QmmKfnM/s320/Blog-SBAnnoyance2011Jan12.PNG" width="299" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Friendly poking aside, SB is critical to my current role. &amp;nbsp;It's been a fun ride learning event-based programming, time-window aggregates, and getting back into Java. &amp;nbsp;Eclipse perspectives need to be brought to Visual Studio.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Also an&amp;nbsp;&lt;a href="http://spectrum.ieee.org/computing/hardware/data-torrents-and-rivers"&gt;old but good article&lt;/a&gt;&amp;nbsp;which makes the case for CEP. &amp;nbsp;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7600782647856196849-3653661154107534925?l=yzorgsoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yzorgsoft.blogspot.com/feeds/3653661154107534925/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://yzorgsoft.blogspot.com/2011/01/sb-annoyance-for-today.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7600782647856196849/posts/default/3653661154107534925'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7600782647856196849/posts/default/3653661154107534925'/><link rel='alternate' type='text/html' href='http://yzorgsoft.blogspot.com/2011/01/sb-annoyance-for-today.html' title='StreamBase annoyance for today'/><author><name>yzorg</name><uri>http://www.blogger.com/profile/12338842532726067525</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_JoPXi_iYcuM/TO3qcJ3RmTI/AAAAAAAAAAc/AMlx5Q6Pe-Q/S220/AtDesk.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_JoPXi_iYcuM/TTFPr60v4qI/AAAAAAAAABE/kHf4QmmKfnM/s72-c/Blog-SBAnnoyance2011Jan12.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7600782647856196849.post-1482033079669785591</id><published>2011-01-14T23:17:00.001-08:00</published><updated>2011-01-19T17:14:20.422-08:00</updated><title type='text'>x-platform, huge performance from LMAX, Azul</title><content type='html'>I'm a cross-platform developer in the financial services sector.  If any .NET or Java developer interested in reaching a 'new level' of performance on commodity hardware should watch this video about LMAX, hosted on InfoQ.  Great refresher on HW, good example of pulling back a couple of layers of abstraction to find the worst and best in modern parallel processing.  They achieve high throughput with low latency. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;LMAX and TradeFair (think of BetFair)&lt;/b&gt;&lt;br /&gt;http://www.infoq.com/presentations/LMAX&lt;br /&gt;&lt;br /&gt;Interested in pause-less GC on Java?  Not afraid of running custom everything?  (Custom HW, Custom OS, leveraging power of HW virtualization to maximize JVM.)  Take a look.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Azul and Zing&lt;/b&gt;&lt;br /&gt;http://www.infoq.com/interviews/gil-tene-azul-zing&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7600782647856196849-1482033079669785591?l=yzorgsoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yzorgsoft.blogspot.com/feeds/1482033079669785591/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://yzorgsoft.blogspot.com/2011/01/x-platform-huge-performance-from-lmax.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7600782647856196849/posts/default/1482033079669785591'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7600782647856196849/posts/default/1482033079669785591'/><link rel='alternate' type='text/html' href='http://yzorgsoft.blogspot.com/2011/01/x-platform-huge-performance-from-lmax.html' title='x-platform, huge performance from LMAX, Azul'/><author><name>yzorg</name><uri>http://www.blogger.com/profile/12338842532726067525</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_JoPXi_iYcuM/TO3qcJ3RmTI/AAAAAAAAAAc/AMlx5Q6Pe-Q/S220/AtDesk.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7600782647856196849.post-3778000202951564916</id><published>2011-01-14T23:12:00.000-08:00</published><updated>2011-01-14T23:12:26.613-08:00</updated><title type='text'>TopShelf and NuGet</title><content type='html'>I've been playing with &lt;a href="http://topshelf-project.com/"&gt;TopShelf service host&lt;/a&gt;. &amp;nbsp;Its goal is to remove the repetitive code from Windows Services written in .NET.&amp;nbsp;&amp;nbsp;My production servers aren't Win 2008, so App Fabric service hosting isn't an option.&lt;br /&gt;&lt;br /&gt;TopShelf 2.1 is still a bit of a moving target.  I thought to myself: Self, if you want to update your 3-4 services that use this OSS library, and want to do it really easily, you'll create yourself a NuGet package for TopShelf. &lt;br /&gt;&lt;br /&gt;For those who haven't heard, NuGet packages are to .NET what gems are to Ruby.  The package is a zip with DLL and small bit of metadata. &amp;nbsp;The package goes on a share*, add a line to Visual Studio, and now VS can find and add the package to your service host projects.&lt;br /&gt;&lt;p&gt;* - You could also drop some service code into IIS to host an internal gallery, but I only need a file share.&lt;br /&gt;&lt;br /&gt;Here is the nuspec file (package description)&amp;nbsp;and PowerShell script (prepare the folder and create the package).&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;TopShelfYZ.nuspec&lt;/h2&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;package xmlns:xsd=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot; xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;metadata xmlns=&amp;quot;http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;id&amp;gt;TopShelfCT&amp;lt;/id&amp;gt;&lt;br /&gt;    &amp;lt;version&amp;gt;2.1.1&amp;lt;/version&amp;gt;&lt;br /&gt;    &amp;lt;authors&amp;gt;Chris Patterson (phatboyg), Travis Smith (legomaster)&amp;lt;/authors&amp;gt;&lt;br /&gt;    &amp;lt;owners&amp;gt;Chris Patterson (phatboyg), Travis Smith (legomaster), Chris Tracy (yzorgsoft)&amp;lt;/owners&amp;gt;&lt;br /&gt;    &amp;lt;licenseUrl&amp;gt; https://github.com/Topshelf/Topshelf/blob/master/LICENSE &amp;lt;/licenseUrl&amp;gt;&lt;br /&gt;    &amp;lt;requireLicenseAcceptance&amp;gt;false&amp;lt;/requireLicenseAcceptance&amp;gt;&lt;br /&gt;    &amp;lt;description&amp;gt;A Windows Service hosting library for .NET, for those unfortunate enough to no be able to use AppFabric to host .NET services. Package created by Chris Tracy (yzorgsoft) until real owners can publish the package on NuGet gallery.&amp;lt;/description&amp;gt;&lt;br /&gt;    &amp;lt;language&amp;gt;en-US&amp;lt;/language&amp;gt;&lt;br /&gt;    &amp;lt;projectUrl&amp;gt; http://topshelf-project.com/ &amp;lt;/projectUrl&amp;gt;&lt;br /&gt;    &amp;lt;dependencies&amp;gt;&lt;br /&gt;      &amp;lt;dependency id=&amp;quot;log4net&amp;quot; version=&amp;quot;1.2.10&amp;quot; /&amp;gt;&lt;br /&gt;    &amp;lt;/dependencies&amp;gt;&lt;br /&gt;  &amp;lt;/metadata&amp;gt;&lt;br /&gt;&amp;lt;/package&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h2&gt;CreateTopshelfPackage.ps1&lt;/h2&gt;&lt;div class="MsoNormal"&gt;Write-Host "START [$($&lt;a href="http://myinvocation.mycommand.name/" target="_blank"&gt;MyInvocation.MyCommand.&lt;wbr&gt;&lt;/wbr&gt;Name&lt;/a&gt;)] $(get-date -f yyyyMMdd.HHmmss)"&lt;/div&gt;&lt;div class="MsoNormal"&gt;try {&lt;/div&gt;&lt;div class="MsoNormal"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $packDir = 'pkg\lib\3.0'&lt;/div&gt;&lt;div class="MsoNormal"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; rd -Recurse $packDir -Force&lt;/div&gt;&lt;div class="MsoNormal"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; md $packDir -Verbose -EA SilentlyContinue&lt;/div&gt;&lt;div class="MsoNormal"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; copy .\Topshelf.dll,.\Topshelf.pdb $packDir -Verbose -Force&lt;/div&gt;&lt;div class="MsoNormal"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/div&gt;&lt;div class="MsoNormal"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nuget.exe pack .\TopShelfYZ.nuspec -b pkg&lt;/div&gt;&lt;div class="MsoNormal"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # should output:&lt;/div&gt;&lt;div class="MsoNormal"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # Successfully created package '...\TopShelfYZ.2.1.1.nupkg'.&lt;/div&gt;&lt;div class="MsoNormal"&gt;}&lt;/div&gt;&lt;div class="MsoNormal"&gt;catch { throw; }&lt;/div&gt;&lt;div class="MsoNormal"&gt;Write-Host "END&amp;nbsp;&amp;nbsp; [$($&lt;a href="http://myinvocation.mycommand.name/" target="_blank"&gt;MyInvocation.MyCommand.&lt;wbr&gt;&lt;/wbr&gt;Name&lt;/a&gt;)] $(get-date -f yyyyMMdd.HHmmss)"&lt;/div&gt;&lt;br /&gt;&lt;h2&gt;Gotchas&lt;/h2&gt;If you're like me then when creating your first package you might expect NuGet.exe (package creation utility) to be downloaded with the NuGet VisualStudio extension. &amp;nbsp;This is not the case. &amp;nbsp;You have to get it from the &lt;a href="http://nuget.codeplex.com/releases/view/latest"&gt;CodePlex project&lt;/a&gt;&amp;nbsp;(under "Other Available Downloads").&lt;br /&gt;&lt;br /&gt;&lt;p&gt;When creating your package you must start with a 'lib' folder. &amp;nbsp;I thought the lib folder in the examples was like 'foo' and 'bar' (a placeholder for real name), but no, it must be 'lib' to act like one would expect a .NET assembly package to work (to contain .NET DLLs). &amp;nbsp;And it won't warn you if you don't have a lib folder, or even notify you in any way, it just creates a package that isn't what you were probably expecting.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Nit-Pick Corner&lt;/h2&gt;I like all my command-line tools on Windows to show help when I give them /?. &amp;nbsp;It has been thus since my early days before DOS 5.0. &amp;nbsp;But NuGet.exe doesn't, it shows an error if you give it /? but does show "good help" when not given any arguments. &amp;nbsp;Is it just me or is this bad form?&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Summary: tools help gather the right Lego pieces&lt;/h2&gt;The ruby community has been running circles around .NET the last few years.  That time is passing and I expect .NET to make up lots of ground with NuGet and the growing .NET OSS community.  NuGet is a great tool that has been sorely needed.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;One more time for the SEO crowd: NuGet rocks!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7600782647856196849-3778000202951564916?l=yzorgsoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yzorgsoft.blogspot.com/feeds/3778000202951564916/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://yzorgsoft.blogspot.com/2011/01/topshelf-and-nuget.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7600782647856196849/posts/default/3778000202951564916'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7600782647856196849/posts/default/3778000202951564916'/><link rel='alternate' type='text/html' href='http://yzorgsoft.blogspot.com/2011/01/topshelf-and-nuget.html' title='TopShelf and NuGet'/><author><name>yzorg</name><uri>http://www.blogger.com/profile/12338842532726067525</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_JoPXi_iYcuM/TO3qcJ3RmTI/AAAAAAAAAAc/AMlx5Q6Pe-Q/S220/AtDesk.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7600782647856196849.post-8017560773628260504</id><published>2011-01-14T22:07:00.000-08:00</published><updated>2011-01-14T22:08:20.093-08:00</updated><title type='text'>OData back-end code example</title><content type='html'>I've been playing with NuGet recently. &amp;nbsp;&lt;a href="http://twitter.com/gtsiokos"&gt;@GTsiokos&lt;/a&gt; pointed out the package service seems to be the same code that hosts the Orchard CMS gallery at&amp;nbsp;&lt;a href="http://orchardproject.net/gallery"&gt;http://orchardproject.net/gallery&lt;/a&gt; .&lt;br /&gt;&lt;br /&gt;The Gallery Service project has good example of code _to read_ for anyone building a production OData service (a.k.a. Astoria, WCF Data Services). &amp;nbsp;Also looks like a good example for the 'shape' of a public OData service. &amp;nbsp;Some very useful service conventions, like ServiceBase.ExecuteAction that wraps .NET exceptions in ServiceFault, so not even try/catch code is duplicated across service operations (methods).&lt;br /&gt;&lt;br /&gt;I've spent a fair amount of time with WCF and back-end service code this year, and it's&amp;nbsp;cathartic&amp;nbsp;to see a small, lightweight example of .NET service code that is well-factored with (AFAICT) no duplicate code in the codebase.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://galleryserver.codeplex.com/SourceControl/changeset/view/571cbbf82836#GalleryServer%2fsrc%2fGallery.Server%2fPackageService.cs"&gt;http://galleryserver.codeplex.com/SourceControl/changeset/view/571cbbf82836#GalleryServer%2fsrc%2fGallery.Server%2fPackageService.cs&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7600782647856196849-8017560773628260504?l=yzorgsoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yzorgsoft.blogspot.com/feeds/8017560773628260504/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://yzorgsoft.blogspot.com/2011/01/mvc-and-odata-back-end-code-example.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7600782647856196849/posts/default/8017560773628260504'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7600782647856196849/posts/default/8017560773628260504'/><link rel='alternate' type='text/html' href='http://yzorgsoft.blogspot.com/2011/01/mvc-and-odata-back-end-code-example.html' title='OData back-end code example'/><author><name>yzorg</name><uri>http://www.blogger.com/profile/12338842532726067525</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_JoPXi_iYcuM/TO3qcJ3RmTI/AAAAAAAAAAc/AMlx5Q6Pe-Q/S220/AtDesk.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7600782647856196849.post-5087099284657657450</id><published>2011-01-10T07:53:00.000-08:00</published><updated>2011-01-19T20:11:03.241-08:00</updated><title type='text'>Enable and Disable monitor displays with Sikuli</title><content type='html'>For a while I've been trying to find a way to switch from a many-monitor setup to a single monitor setup. &amp;nbsp;Why? I'm using GoToMyPC with it's desktop composition when remoting into my developer workstation from my laptop, and sometimes I don't want all those desktops composed together.&lt;br /&gt;&lt;br /&gt;I couldn't find anything with WMI or PowerShell to automate switching between these two configurations.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://superuser.com/q/225877/31557"&gt;SuperUser question&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I found a solution - GUI automation of the "Display Settings" control panel dialog via &lt;a href="http://sikuli.org/docx"&gt;Sikuli&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I'm attaching a zip with Enable, Disable (simpler scripts) and optimized versions of both that run a bit faster. &amp;nbsp;These are GUI automation and driven by screenshot, so they won't work for anyone else "out of the box" but should be a good starting point for others trying to accomplish a similar task.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://docs.google.com/uc?id=0B-nVLKZtpZy9ZDgyMDhmYTUtNzY0MC00MzdkLThmNjMtYzI4ZjM5OTk4NWVl&amp;export=download&amp;hl=en"&gt;SikuliMonitors.zip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_JoPXi_iYcuM/TSsrUMk0NSI/AAAAAAAAABA/nhnFS-6SIzU/s1600/SikuliMonitors.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/_JoPXi_iYcuM/TSsrUMk0NSI/AAAAAAAAABA/nhnFS-6SIzU/s320/SikuliMonitors.PNG" width="209" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7600782647856196849-5087099284657657450?l=yzorgsoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yzorgsoft.blogspot.com/feeds/5087099284657657450/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://yzorgsoft.blogspot.com/2011/01/enable-and-disable-monitor-displays.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7600782647856196849/posts/default/5087099284657657450'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7600782647856196849/posts/default/5087099284657657450'/><link rel='alternate' type='text/html' href='http://yzorgsoft.blogspot.com/2011/01/enable-and-disable-monitor-displays.html' title='Enable and Disable monitor displays with Sikuli'/><author><name>yzorg</name><uri>http://www.blogger.com/profile/12338842532726067525</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_JoPXi_iYcuM/TO3qcJ3RmTI/AAAAAAAAAAc/AMlx5Q6Pe-Q/S220/AtDesk.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_JoPXi_iYcuM/TSsrUMk0NSI/AAAAAAAAABA/nhnFS-6SIzU/s72-c/SikuliMonitors.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7600782647856196849.post-5433608850709652355</id><published>2010-11-24T21:34:00.000-08:00</published><updated>2010-11-24T21:34:08.686-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='meta'/><title type='text'>blog 'Hello World' from yzorgsoft</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Arial, sans-serif; font-size: 13px;"&gt;I created the name 'yzorg' during a time when I was looking for a smarter organization. &amp;nbsp;I was looking for an IT management team that invested in the right tools, one that understood the power and limitations of technology, and one that understood&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial, sans-serif; font-size: 13px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial, sans-serif; font-size: 13px;"&gt;&lt;a href="http://martinfowler.com/bliki/TechnicalDebt.html" style="color: #0000cc; font-family: Arial, sans-serif;"&gt;technical debt&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial, sans-serif; font-size: 13px;"&gt;&amp;nbsp;(the slowly increasing dead weight that is inherent with very old IT systems, or broken IT systems of any age).&lt;/span&gt;&lt;br /&gt;&lt;div style="font-family: Arial, sans-serif; font-size: 13px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial, sans-serif; font-size: 13px;"&gt;yz = 'Wise' and 'Org' = Oranization. &amp;nbsp;&lt;/div&gt;&lt;div style="font-family: Arial, sans-serif; font-size: 13px;"&gt;YzOrg = Wise Organization.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now I try to build software and create teams to make whatever organization I'm in smarter. &amp;nbsp;YzOrgSoft = smart software, smart IT.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I don't work in corporate IT anymore. &amp;nbsp;I'm currently working for a financial services company whose offerings include technology solutions.&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/7600782647856196849-5433608850709652355?l=yzorgsoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yzorgsoft.blogspot.com/feeds/5433608850709652355/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://yzorgsoft.blogspot.com/2010/11/blog-hello-world-from-yzorgsoft.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7600782647856196849/posts/default/5433608850709652355'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7600782647856196849/posts/default/5433608850709652355'/><link rel='alternate' type='text/html' href='http://yzorgsoft.blogspot.com/2010/11/blog-hello-world-from-yzorgsoft.html' title='blog &apos;Hello World&apos; from yzorgsoft'/><author><name>yzorg</name><uri>http://www.blogger.com/profile/12338842532726067525</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_JoPXi_iYcuM/TO3qcJ3RmTI/AAAAAAAAAAc/AMlx5Q6Pe-Q/S220/AtDesk.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7600782647856196849.post-7152171045448278940</id><published>2010-11-24T20:28:00.001-08:00</published><updated>2010-11-24T21:03:55.724-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scripting'/><title type='text'></title><content type='html'>I just did a little demo for [a coworker] today of DOS tricks I learned &lt;a href="http://blogs.msdn.com/b/release_team/archive/2004/08/13/214418.aspx"&gt;while at MS&lt;/a&gt;. &amp;nbsp;I thought I'd send out the log as a sample (with mistakes removed, &amp;lt;smile&amp;gt;). &amp;nbsp;I usually become the goto dev when someone needs a quick-n-dirty batch script, or need to know "Can DOS do X?".&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: black; font-family: 'Courier New', Courier, monospace; font-size: x-small; foreground-color: gray;"&gt;&lt;span class="Apple-style-span" style="background-color: black; color: #f3f3f3; font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;C:\Users\TracyC&amp;gt;echo %date:~10,4% %date:~4,2%&lt;br /&gt;2010 11&lt;br /&gt;&lt;br /&gt;C:\Users\TracyC&amp;gt;echo hi &amp;gt; &amp;nbsp;%date:~10,4%%date:~4,2%.txt&lt;br /&gt;&lt;br /&gt;C:\Users\TracyC&amp;gt;dir *.txt&lt;br /&gt;Volume in drive C has no label.&lt;br /&gt;Volume Serial Number is B8EE-D08D&lt;br /&gt;&lt;br /&gt;Directory of C:\Users\TracyC&lt;br /&gt;&lt;br /&gt;11/24/2010 &amp;nbsp;09:32 AM &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 5 201011.txt&lt;br /&gt;10/01/2010 &amp;nbsp;10:40 AM &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 210 SDK.txt&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 2 File(s) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;215 bytes&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0 Dir(s) &amp;nbsp;199,100,514,304 bytes free&lt;br /&gt;&lt;br /&gt;C:\Users\TracyC&amp;gt;set line=0123456789 ABCD 0123456789 ABCD0123456789 ABCD0123456789 ABCD0123456789&lt;br /&gt;&lt;br /&gt;C:\Users\TracyC&amp;gt;echo %line:~10,8%&lt;br /&gt;ABCD 01&lt;br /&gt;&lt;br /&gt;C:\Users\TracyC&amp;gt;echo hi &amp;gt; demo%date:~10,4%%date:~4,2%%date:~7,2%.log &amp;amp; dir demo*.log&lt;br /&gt;Volume in drive C has no label.&lt;br /&gt;Volume Serial Number is B8EE-D08D&lt;br /&gt;&lt;br /&gt;Directory of C:\Users\TracyC&lt;br /&gt;&lt;br /&gt;11/24/2010 &amp;nbsp;09:50 AM &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 6 demo20101124.log&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 1 File(s) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;6 bytes&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0 Dir(s) &amp;nbsp;199,100,379,136 bytes free&lt;br /&gt;&lt;br /&gt;C:\Users\TracyC&amp;gt;set /?&lt;br /&gt;Displays, sets, or removes cmd.exe environment variables.&lt;br /&gt;&lt;br /&gt;SET [variable=[string]]&lt;br /&gt;...&amp;lt;SNIP&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;h2&gt;.BAT/.CMD&lt;/h2&gt;Use %~dp0 to get the full path of the current batch file. &amp;nbsp;%0 is the scriptname argument, '~dp' are modifiers to get the drive and path of that argument, %~dp0. &lt;br /&gt;&lt;br /&gt;Interesting FOR commands in cmd.exe :&lt;br /&gt;FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]&lt;br /&gt;FOR /F ["options"] %variable IN ("string") DO command [command-parameters]&lt;br /&gt;FOR /F ["options"] %variable IN ('command') DO command [command-parameters]&lt;br /&gt;&lt;br /&gt;Rule: always turn off 'echo' in batch files using this first line:&lt;br /&gt;@if not defined _echo echo off&lt;br /&gt;Use 'set _echo=1' before calling the script to debug it (it will echo every command)&lt;br /&gt;&lt;br /&gt;References: set /?, call /?, for /?, setlocal /?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7600782647856196849-7152171045448278940?l=yzorgsoft.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yzorgsoft.blogspot.com/feeds/7152171045448278940/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://yzorgsoft.blogspot.com/2010/11/i-just-did-little-demo-for-coworker.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7600782647856196849/posts/default/7152171045448278940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7600782647856196849/posts/default/7152171045448278940'/><link rel='alternate' type='text/html' href='http://yzorgsoft.blogspot.com/2010/11/i-just-did-little-demo-for-coworker.html' title=''/><author><name>yzorg</name><uri>http://www.blogger.com/profile/12338842532726067525</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://1.bp.blogspot.com/_JoPXi_iYcuM/TO3qcJ3RmTI/AAAAAAAAAAc/AMlx5Q6Pe-Q/S220/AtDesk.JPG'/></author><thr:total>0</thr:total></entry></feed>
