<?xml version="1.0" encoding="ISO-8859-1"?>

<rss version="2.0">
  <channel>
    <title>Recent Articles on FortyPoundHead.com</title>
    <link>http://www.fortypoundhead.com/</link>
    <description>Windows won't open? Linux got you flummoxed? Ask the Forty Pound Head your IT questions, get the right answer!</description>
    <language>en-us</language>
    <copyright>Copyright 2011 Derek Wirch. All Rights Reserved.</copyright>
    <lastBuildDate>5/24/2013 6:07:38 AM</lastBuildDate>
    <ttl>20</ttl>

    <item>
      <title>Killing Disconnected Terminal Server Sessions</title>
      <link>http://www.fortypoundhead.com/showcontent.asp?artid=23947</link>
      <datePosted>2013-05-17</datePosted>
	  <description>Terminal Services (or Remote Desktop if you prefer) is a good thing.  It allows you to remotely connect to a server to manage it.<br /><br />However, there is a &quot;special&quot; breed of user out there that can't remember to log off of their sessions, opting to simply click the &quot;X&quot; in the upper right.  Too many disconnected sessions (2), and nobody else can connect via RDP.  Kill 'em quick with this process.<br /><br />First, why are you using terminal services to manage your server?  You should be using remote administration tools, usually via an MMC interface.  All core services (AD, DHCP, DNS, etc), as well as most application services (Exchange, IIS, etc) can be administered with it. Heck, you can even use PowerShell to administer remote servers.  So stop using Terminal Services to manage your servers.<br /><br />Second, if you absolutely must RDP into a server, sign off correctly.  Windows servers have a maximum of two RDP sessions and one console session available, unless the server has been licensed for use as a terminal server.  Leaving two disconnected RDP sessions on the server effectively blocks anyone else from connecting to the server via RDP.<br /><br />Normally, to clear the disconnected sessions, one would fire up the terminal services manager MMC (remote management!), connect to the server in question, and log off any disconnected sessions.  It doesn't take long to do this, but can be a few minutes if you are working with a server that is on the other side of the country.<br /><br />So why not try the command prompt?  Windows (at least from Win7 onward, as well as server OSs) have a number of utilities built-in to manage Terminal Services remotely.  The two we are interested in are:<br />&lt;ul&gt;&lt;li&gt;Query Session&lt;/li&gt;&lt;li&gt;LogOff&lt;/li&gt;&lt;/ul&gt;<br />The first thing you'll need to do is open a command prompt with credentials that have permissions to administer terminal services on the remote server.  If you don't do this, you'll simply get &quot;Access Denied&quot; errors when attempting to administer the remote server.<br /><br />Once you get the command prompt open, type the following command:<br />&lt;code&gt;query session /server:&lt;i&gt;&lt;servername&gt;&lt;/i&gt;&lt;/code&gt;<br />The output of the command will be something similar to the following:<br />&lt;code&gt;&lt;pre&gt;C:\&gt;query session /server:MyTestServer<br />SESSIONNAME       USERNAME                 ID  STATE   TYPE        DEVICE<br />services                                    0  Disc<br />console                                     1  Conn<br />                  MyTestUser                2  Disc<br />rdp-tcp                                 65536  Listen<br /><br />C:\&gt;&lt;/pre&gt;&lt;/code&gt;<br />Ntoice the session with &lt;b&gt;MyTestUser&lt;/b&gt;, and its current state of &lt;b&gt;Disc&lt;/b&gt;.  This means that the user did not log off the machine, but rather the connection was either disrupted, or the user simply closed the RDP window without logging off.<br /><br />Just an FYI, the full syntax of the &lt;i&gt;Query Session&lt;/i&gt; command is:<br /><br />&lt;b&gt;query session&lt;/b&gt; [{&lt;i&gt;SessionName&lt;/i&gt; | &lt;i&gt;UserName&lt;/i&gt; | &lt;i&gt;SessionID&lt;/i&gt;}] [&lt;b&gt;/server&lt;/b&gt;:&lt;i&gt;ServerName&lt;/i&gt;] [&lt;b&gt;/mode&lt;/b&gt;] [&lt;b&gt;/flow&lt;/b&gt;] [&lt;b&gt;/connect&lt;/b&gt;] [&lt;b&gt;/counter&lt;/b&gt;]<br /><br />Parameters<br />&lt;table&gt; &lt;tr&gt;&lt;td&gt;&lt;b&gt;&lt;i&gt;SessionName&lt;/i&gt;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;The name of the session you want to query.&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt;&lt;td&gt;&lt;b&gt;&lt;i&gt;UserName&lt;/i&gt;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;The name of the user whose sessions you want to query.&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt;&lt;td&gt;&lt;b&gt;&lt;i&gt;SessionID&lt;/i&gt;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;The ID of the session you want to query.&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt;&lt;td&gt;&lt;b&gt;/server:&lt;i&gt;ServerName&lt;/i&gt;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Identifies the terminal server to query. The default is the current server.&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt;&lt;td&gt;&lt;b&gt;/mode&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Displays current line settings.&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt;&lt;td&gt;&lt;b&gt;/flow&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Displays current flow-control settings.&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt;&lt;td&gt;&lt;b&gt;/connect&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Displays current connect settings.&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt;&lt;td&gt;&lt;b&gt;/counter&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Displays current counters information, including the total number of sessions created, disconnected, and reconnected.&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt;&lt;td&gt;&lt;b&gt;/?&lt;/b&gt;&lt;/td&gt;&lt;td&gt;Displays help at the command prompt.&lt;/td&gt; &lt;/tr&gt;&lt;/table&gt;<br />So, now that you have a list of the sessions, including the disconnected session, you have what you need to kick that &quot;user&quot; off the dead RDP connection.  Make note of the ID number of the disconnected session, in this case &lt;b&gt;2&lt;/b&gt;.<br /><br />Now, at your handy-dandy super-elevated command prompt, type the following:<br />&lt;code&gt;Logoff 2 /server:MyTestServer&lt;/code&gt;<br />One thing you'll notice immediately is that you'll get &lt;i&gt;no&lt;/i&gt; feedback if the command was successful.  You'll simply get returned to the command prompt.  You can verify the connection was disconnected by running the Query command again.  The whole session would look like this:<br />&lt;code&gt;C:\&gt;logoff 2 /server:MyTestServer<br /><br />C:\&gt;&lt;pre&gt;query session /server:MyTestServer<br /> SESSIONNAME       USERNAME                 ID  STATE   TYPE        DEVICE<br /> services                                    0  Disc<br /> console                                     1  Conn<br /> rdp-tcp                                 65536  Listen<br /><br />C:\&gt;&lt;/pre&gt;&lt;/code&gt;<br />Notices the previously noted dead session, which had an ID of 2, is now missing from the list.  Congratulations!  You have now cleared out the blocking session.<br /><br />Questions? Comments?  Fire off in the comments below, or even in the forums!</description>
    </item>
    
    <item>
      <title>Why would you pay $12.95 per month ?</title>
      <link>http://www.fortypoundhead.com/showcontent.asp?artid=23946</link>
      <datePosted>2013-04-14</datePosted>
	  <description>There are sites out there that charge folks for answers.  Yup hard to believe, right?  This is incredible to me, since most of the information they provide is free, if you simple use your favorite search engine to find the answer.<br /><br />What if I were to tell you that there is a not-so-top-secret place where you could find just about any answer you'd want, and any subject, and it's free for you to use, twenty four hours per day, 365 days per year?  Oh, did I mention it was free?<br /><br />The first thing I am going to tell you is to use this site, naturally.  As the owner and webmaster, I would be remiss in not pimping my own site.  That being said and done, lets move on to some ranting, shall we ?<br /><br />I am currently an infrastructure architect for a large firm based in Tacoma, WA.  As such, we have agreements with software and hardware vendors from which we have purchased products from.<br /><br />For example, we have a Premier support agreement with Microsoft.  What this means, in a nutshell, is that anyone on the team can pick up the phone and call Microsoft Support, at any time, and get support for products that we own.  The case will be triaged, given a severity level, etc.  I won't go into the details, but suffice to say, we pay for support for products we have purchased, and the vendor (MS) sees those support tickets through to proper resolution.<br /><br />Did you know that anyone can call and get this type of support MS?  Yup, for a per-case fee, you can get the same great treatment as a big enterprise.  Depending on the problem, it may not be cost effective, though, so weigh your options carefully.<br /><br />Any application support or system administration type person worth his salt is going to scour the internet for an answer first.  They'll phone a friend, consult hardcopy manuals, etc., before placing that all important call.  Basically, any &lt;b&gt;sound&lt;/b&gt; information technology worker is going to exhaust the resources available before making the call to tech support.<br /><br />&lt;span style=&quot;font-size:x-large;&quot;&gt;So you might think, &lt;b&gt;&quot;Hey, what is this guys problem with paying for support?&quot;  &lt;/b&gt;&lt;/span&gt;<br /><br />The problem as I see it is that certain websites out there (who shall remain nameless), will charge unsuspecting newbies the sum of $12.95 per month for access to information that is &lt;b&gt;available free on the internet&lt;/b&gt;.  In my eyes, this is preying on the uninformed.  It's like having a telemarketer call you up and trying to sell you an extended warranty for your vehicle.  (yes, I have received this call).  Ninety percent of the time, it's a straight out scam (I hadn't even owned the vehicle for 3 years).<br /><br />How do I know their &quot;experts&quot; are simply regurgitating information that is free?  Let's just say that I know how to read the logs of my web server, and I notice that there is a growing number of referrals from this not-to-be-named site.  In speaking with a few other webmasters of similar sites, and they have found the similar activity in their logs.<br /><br />Besides fortypoundhead.com, there are literally &lt;i&gt;bushels&lt;/i&gt; of sites were hard-working folks are willing help you find the solution to your problem.  Lets run some numbers shall we ?  I did some looking around, and here is what I found when comparing the not-to-be-named site with one of my favorite answers sites:<br /><br />&lt;b&gt;Site:&lt;/b&gt; not going to name here<br />&lt;b&gt;Topics:&lt;/b&gt; 900+<br />&lt;b&gt;Questions:&lt;/b&gt; unknown<br />&lt;b&gt;Answers:&lt;/b&gt; 3 million<br />&lt;b&gt;Users:&lt;/b&gt; unknown<br />&lt;b&gt;Cost:&lt;/b&gt; $12.95 per month, unless you are an &quot;Expert&quot;<br />&lt;b&gt;Comments:&lt;/b&gt; good site for folks who don't know how to work a search engine.<br /><br />&lt;b&gt;Site:&lt;/b&gt; &lt;a href=&quot;http://stackexchange.com/&quot; target=&quot;_blank&quot;&gt;StackExchange.com&lt;/a&gt;<br />&lt;b&gt;Topics:&lt;/b&gt; 101 sub-sites, focused on targeted subjects<br />&lt;b&gt;Questions:&lt;/b&gt; 6 million<br />&lt;b&gt;Answers:&lt;/b&gt; 11+ million<br />&lt;b&gt;Users:&lt;/b&gt; 3+ million<br />&lt;b&gt;Cost:&lt;/b&gt; free<br />&lt;b&gt;Comments:&lt;/b&gt; Heavy tech content, but covers such things as philosophy, gardening, and martial arts as well.<br /><br />Wow.  I had no idea that Stack Exchange was so huge!  Hats off to &lt;a href=&quot;http://www.joelonsoftware.com/&quot; target=&quot;_blank&quot;&gt;Joel Spolsky&lt;/a&gt; and &lt;a href=&quot;http://www.codinghorror.com/&quot; target=&quot;_blank&quot;&gt;Jeff Atwood&lt;/a&gt;!  Like me, these two guys are in IT to help people, not make a quick buck by shystering noobs.<br /><br />This is only one comparison.  There are thousands of web sites and tons of documentation out there on the internets, all neatly indexed by your favorite search engine.  Most browsers available don't even require you to open a search engine - just type your keyword-laden question into the address bar, and whoosh! answers galore.<br /><br />Heck, while fortypoundhead.com is no competitor to some other sites out there, we have available 6,068 tech articles and tutorials available, a Q&amp;A section, and even forums on the way.  Can't find it here?  Ask for it.<br /><br />So why pay for support when you don't need to? Why are you lining the pockets of someone who is just going to give you information that is free to begin with?  Sounds fishy to me.<br /><br />Disagree? Got something to say? Let me know in the (also free) comments section below.</description>
    </item>
    
    <item>
      <title>Living with the Surface</title>
      <link>http://www.fortypoundhead.com/showcontent.asp?artid=23945</link>
      <datePosted>2013-01-27</datePosted>
	  <description>About one month ago, I became the proud owner of a Microsoft Surface RT.  So far, I'm loving it.  This seems to be contrary to the thoughts of the majority of folks in IT, but hey, I've always been a bit different.<br /><br />Having got rid of my iPad some time ago, I've been lugging around my Dell 6410 to meetings and such.  The laptop does a great job, and I have no real complaints, but I really missed the portability of a tablet.<br /><br />At first, I was kind of leery about letting go of the laptop, and lugged around both devices.  But after awhile, I found myself leaving the laptop in the dock, and grabbing the surface for meetings, quick document or spreadsheet updates, reading documentation, or even (gasp) playing a quick puzzle-type game.  Soon, it became my go-to device, however, and I the laptop now remains on my desk.<br /><br />For those who have not investigated the Surface RT specifications, here are the details:<br />&lt;ul&gt;&lt;li&gt;1366×768 (16:9 aspect ratio) 10.6? Cleartype display (148 PPI) and built in kickstand&lt;/li&gt;&lt;li&gt;274.6 x 172 x 9.4 mm (10.81 x 6.77 x 0.37 in); 680.4 g (1.50 lb)&lt;/li&gt;&lt;li&gt;Windows RT including Microsoft Office home and student 2013.&lt;/li&gt;&lt;li&gt;Nvidia Tegra 3 quad core processor clocked at 1.3Ghz&lt;/li&gt;&lt;li&gt;32 or 64GB memory with expandable SD card storage up to 64gb&lt;/li&gt;&lt;li&gt;Dual Stereo speakers, 720P front and rear facing cameras, dual Mics and dual band WiFi.&lt;/li&gt;&lt;li&gt;Full size USB 2.0 and a micro HDMI out.&lt;/li&gt;&lt;li&gt;Magnetic dock for one of Microsoft’s touch &amp; type keyboard covers and MagSafe style proprietary charger.&lt;/li&gt;&lt;li&gt;Starting Price; $499 without the touch cover (32gb), $599 with the touch cover. $699 with touch cover (64gb)&lt;/li&gt;&lt;/ul&gt;<br />&lt;img src=&quot;http://www.fortypoundhead.com/uploads/surface.jpg&quot; style=&quot;float:left;&quot; /&gt;My particular unit is the 64 GB model, with the touch cover.  If you want to store anything on your Surface, you'll want to get the 64 GB model.  Storage space on the 32 GB version is taken up mostly by Windows RT itself, along with any apps that are installed, so you'll be relying heavily on SkyDrive for document storage.  This could be a bit of a detriment, in my opinion.  There are going to be times you want to get something done, and don't have internet access.  Without local storage, you won't be able to crack open that Word document or Excel spreadsheet that lives on SkyDrive.<br /><br />That's not to say there isn't storage available on the 32 GB Surface, just not as much.  And we all know that more is better right?  Microsoft did give you an option, though.  On either model, you do have the option of plugging in an SD card, up to 64 GB, to augment the local storage.<br /><br />The hardware itself is pretty solid.  While some will quibble over the 28 grams of extra weight that the Surface packs over the iPad, it's not really noticeable.  If you are noticing 28 grams (or .04 pounds), you need to get out more often.  Or get a job as an accurate postal scale.<br /><br />Connectors abound, and this is one of the things the drove me away from the iPad.  There is a full size USB port, a micro HDMI port, SD card slot, and a headphone jack to augment the on-board stereo speakers, even glorious Bluetooth connectivity.  Have you tried to plug in an USB drive or upgrade the storage on an iPad?  Give it a try, but be sure to find the appropriate proprietary cable for that jump drive first.<br /><br />Speaking of connectors, the HDMI output of the Surface appears to have a minimum resolution limitation of 1366x768, which means if you hook up your surface to a 720p television, the signal will usually not be recognized by the TV.  To get your Surface to output to the TV, the TV needs to be 1080p.  Microsoft says this was done to protect the integrity of the Windows 8 interface.  This is a real bummer for me.  Most of my TVs are 1080p, with the exception of one, which happens to be the one that I like to watch movies on.  Guess it's time to upgrade the bedroom TV!<br /><br />The Surface comes with Office 2013 Student Edition, which includes Word, Excel, PowerPoint and OneNote.  With the exception of PowerPoint, I have been using the suite quite a bit.  Each application runs in the desktop space, and each is touch friendly.  One thing I would recommend is to get the type keyboard with your purchase.  The touch keyboard is usable, but takes about 3 days of use to get used to it, and until then you'll be making quite a few corrections.  <br /><br />OneNote is spectacular, in my humble opinion.  It integrates nicely with my two desktops (work and home), as well as my Windows phone, via a connection to SkyDrive.  This means I can take notes or even sketch with my finger or a stylus, within OneNote, and by the time I get back to my desk, the information is already there.<br /><br />Yes, the app store is a bit thin on offerings as of now.  However, I've not had a problem locating apps that I need.  I'm not talking about fluff apps such as random number generators, but useful apps.  More applications are being released daily, and I'm sure you won't have a problem finding what you need.<br /><br />In summary, I think the Microsoft Surface is a good alternative to an iPad or an Android tablet.  I've owned all three now, and I find the integration between the Surface and my other Windows devices is superb.  I don't have to buy an application to view PowerPoint presentations, and all manner of data is easily synchronized between all my Windows machines.</description>
    </item>
    
    <item>
      <title>Three Windows Command Prompt Replacements</title>
      <link>http://www.fortypoundhead.com/showcontent.asp?artid=23944</link>
      <datePosted>2012-12-01</datePosted>
	  <description>I've been using the trusty command prompt in Windows, well, forever.  Having started my life in IT as a DOS keyboard jockey, it's been a part of my life that just won't go away.<br /><br />Lateley though, I've been looking to teach my command prompt some new tricks.  Things like multi-tab interface, easier copy/paste within the window, things of that nature.  Here, I've tested three command prompt enhancments.<br /><br />Now, to be fair, there are a metric ton of replacements and enhancemants for the tired, old Windows command prompt.  Some are full on shell replacements, while others are simply wrappers over the existing command prompt.  In either case, new features are added.<br /><br />Some of the features I look for in a replacement are:<br />&lt;ul&gt;&lt;li&gt;Multi-tabbed interface&lt;/li&gt;&lt;li&gt;Ability to plug in multiple shells, such as CygWin or PowerShell&lt;/li&gt;&lt;li&gt;Confifigurability, such as colors, fonts, etc.&lt;/li&gt;&lt;li&gt;Windows-like line and block copy operations&lt;/li&gt;&lt;/ul&gt;<br />Nice to have would be some sort of IDE-like interface, with features such as command completion, command history, path history, etc.  Not necessary, but welcome additions.  I don't go in much for feature bloat, or having switches for the sake of having switches.  I like my environment clean and simple.<br /><br />Of all the packages I looked at, I narrowed it down to three contenders: &lt;a href=&quot;http://sourceforge.net/projects/console/&quot; target=&quot;_blank&quot;&gt;Console&lt;/a&gt;, &lt;a href=&quot;http://www.promptpal.com/&quot; target=&quot;_blank&quot;&gt;PromptPal&lt;/a&gt;, and &lt;a href=&quot;http://www.powercmd.com/&quot;&gt;PowerCMD&lt;/a&gt;.<br /><br />All three of these provide for each of the my requirements, with PowerCMD and PromptPal pulling out all the stops for feature sets.  There are tons of features in each that I will most likely not use.  Further, each of them performed pretty much equally as far as configurability and functionality.<br /><br />If you're a feature hound, you'll love PromptPal.  The high level of configurability will have you poking and prodding for hours.  But once you get all the options set just so, you'll shouldn't have to touch them again.  All three of the replacements had good configuration options, but PromptPal took it to a new level.  BUT, one thing that bothered me was the application error that kept presenting itself whenever the app was closed.  Boooo!<br /><br />PowerCMD was a close second for configuration options.  Similar flexibility is there, but takes some snooping around to find the options.<br /><br />And then there is Console.  It's not as configurable as the other two, but rather keeps things simple and clean.  There are the basic things you'd expect, and a few other items as well.  There is not even an installation program for this wrapper-type enhancement.  Simply park it in a directory, add it to your path, and make a shortcut to it.  If you don't know how to do those things, you don't need a shell enhancement anyway, right?<br /><br />So, how to decide which of these to use.  They all function pretty much the same, and all have the features I am looking for.  Hmmmm... a test!<br /><br />I decided to throw a seemingly simple test at each of these packages, a directory listing.  Not just any directory listing, though.  A recursive directory listing of my &quot;backups&quot; folder, containing &lt;b&gt;984,731 files&lt;/b&gt; in &lt;b&gt;164,789 directories&lt;/b&gt;.  Yes, I save &lt;i&gt;everything&lt;/i&gt;.  The pertinent specs for the test system are:<br />&lt;ul&gt;&lt;li&gt;Pentium dual-core CPU E5300 @ 2.6 ghz&lt;/li&gt;&lt;li&gt;8 GB RAM&lt;/li&gt;&lt;li&gt;System Drive: 10k RPM 500 GB&lt;/li&gt;&lt;li&gt;Data drive: 7200 RPM 1 TB&lt;/li&gt;&lt;li&gt;OS: Windows 8 Professional x64&lt;/li&gt;&lt;/ul&gt;<br />A simple batch file was built to take note of the time when the directory listing started, perform the listing, then make another note of the time at the end:<br />&lt;code&gt;echo Start Time:%time% &gt; timing.txt<br />dir *.* /s /a<br />echo End Time:%time% &gt;&gt; timing.txt&lt;/code&gt;<br />Pretty straightforward, eh?  <br /><br />Just to make sure all was equal, I turned of all disk buffering, as well as disabling power-saving features of the data drive (where the search will take place).  Further, each app will run the listing in a window of the same size, just so nobody can claim an advantage or disadvantage due to screen handling.<br /><br />First things first, though.  We need a baseline, gathered from the app being replaced, the Windows command prompt.<br /><br />Running the listing in the default Windows command prompt (CMD.EXE) seemed to run pretty briskly, but in reality it completed the task the slowest, with a run time 26 minutes, 23 seconds.<br /><br />I've build a synopsis of each package below, with the timings for each one.  <br /><br />&lt;b&gt;Note:&lt;/b&gt; PowerCMD does not have a time, since it never completed the test!  I tried running the same test three times, and each time it hung between 30-35% completion of the listing.  It appears to be doing &lt;i&gt;something&lt;/i&gt; (according task manager), but nothing ever presents on-screen, and the program itself goes into &quot;not responding&quot; mode.<br />&lt;h3&gt;Console&lt;/h3&gt;<br />Of the three, Console is the simplest.  It includes all the basic options such as multi-tabbed interface, multiple shells, and basic configuration options.  Clean and easy to use, this shell wrapper gets the job done with no-nonsense.<br /><br />&lt;b&gt;Cost:&lt;/b&gt; $0.00 (&lt;i&gt;open source&lt;/i&gt;)<br />&lt;b&gt;Test Runtime:&lt;/b&gt; 1 minute, 50 seconds<br /><br />&lt;b&gt;Pros:&lt;/b&gt;<br />&lt;ul&gt;&lt;li&gt;Free&lt;/li&gt; &lt;li&gt;Simple to Configure&lt;/li&gt; &lt;li&gt;tabbed interface&lt;/li&gt; &lt;li&gt;session saving&lt;/li&gt; &lt;li&gt;Plug in any shell, eh: CygWin, PowerShell, Visual Studio, etc.&lt;/li&gt;&lt;/ul&gt;<br />&lt;b&gt;Cons:&lt;/b&gt;<br />&lt;ul&gt;&lt;li&gt;Choppy performance&lt;/li&gt;&lt;li&gt;No install package, must be manually installed.&lt;/li&gt;&lt;/ul&gt;<br />&lt;h3&gt;PowerCMD&lt;/h3&gt;<br />Lots of options here, but can be a bit confusing to the user, if they're not into twiddling tons of settings.  PowerCMD seemed a bit dodgy when working with large datasets, as evidenced by its inability to complete the directory listing test.<br /><br />&lt;b&gt;Cost:&lt;/b&gt; $30.00 (&lt;i&gt;free trial available&lt;/i&gt;)<br />&lt;b&gt;Test Runtime:&lt;/b&gt; N/A - could not complete<br /><br />&lt;b&gt;Pros:&lt;/b&gt;<br />&lt;ul&gt;&lt;li&gt;Searchable windows&lt;/li&gt; &lt;li&gt;tabbed interface&lt;/li&gt; &lt;li&gt;log-to-file functionality&lt;/li&gt; &lt;li&gt;auto-completion&lt;/li&gt; &lt;li&gt;Windows Explorer Integration&lt;/li&gt; &lt;li&gt;Session saving&lt;/li&gt;&lt;/ul&gt;<br />&lt;b&gt;Cons:&lt;/b&gt;<br />&lt;ul&gt;&lt;li&gt;initial interface kind of cluttered&lt;/li&gt;&lt;li&gt;*very* sluggish performance when window contents go over ~10000 lines&lt;/li&gt;&lt;/ul&gt;<br />&lt;h3&gt;PromptPal&lt;/h3&gt;<br />PrompPal is a great package.  Screen updates can be a bit sluggish if you've been working in it for a couple hours, though.  This was evidenced in the directory listing test as well.  One of the other niggling things that bothered me was the choice of font for the first run.  For users who utlize high resolution screens, the choice of 8 point Courier makes the user &lt;i&gt;have&lt;/i&gt; go in to the configuration, in order to simply see the text within the console.  <br /><br />This app also suffered from the presentation of an Application Error when closing, every time.  Yikes!  We don't need no steenkin' errors!<br /><br />&lt;b&gt;Cost:&lt;/b&gt; $29.99 (&lt;i&gt;free trial available&lt;/i&gt;)<br />&lt;b&gt;Test Runtime:&lt;/b&gt; 2 minutes, 17 seconds<br /><br />&lt;b&gt;Pros:&lt;/b&gt;<br />&lt;ul&gt;&lt;li&gt;Highly configurable&lt;/li&gt; &lt;li&gt;Command Completion&lt;/li&gt; &lt;li&gt;Windows version of *nix TAIL command thrown in&lt;/li&gt; &lt;li&gt;Windows Explorer Integration&lt;/li&gt; &lt;li&gt;Command and path history&lt;/li&gt;&lt;/ul&gt;<br />&lt;b&gt;Cons:&lt;/b&gt;<br />&lt;ul&gt;&lt;li&gt;*very* sluggish performance when window contents go over ~33000 - 35000 lines&lt;/li&gt;&lt;li&gt;Seems a bit unstable;Application Error presents when closing the app&lt;/li&gt;&lt;li&gt;Command history/auto-complete gets in the way sometimes&lt;/li&gt;&lt;/ul&gt;<br /><br />After checking out these three packages, I am kind of leaning towards &lt;b&gt;Console&lt;/b&gt;, for a couple reasons.<br />&lt;ul&gt;&lt;li&gt;Open source - can be a good thing (free!), but can be a bad thing (no real support other than community based)&lt;/li&gt;&lt;li&gt;Stability - consistent update of display during long operations, and no errors presented&lt;/li&gt;&lt;li&gt;Simplicity - Has the options that I am looking for, without a pile of options I will never use&lt;/li&gt;&lt;/ul&gt;<br />Note that the conclusions I've reached above are based on a short amount of time working with the applications, approximately 8 hours each.  I'll continue working with all three of these apps over the next 20 or so days, and will post an update below, with any new findings.<br /><br />Have you replaced your shell?  What do you use?  What do you look for in a replacement?<br /></description>
    </item>
    
    <item>
      <title>Your Favorite Documentation Tool?</title>
      <link>http://www.fortypoundhead.com/showcontent.asp?artid=23943</link>
      <datePosted>2012-11-25</datePosted>
	  <description>In my current position, it is necessary to write large amounts of technical documentation. For this, I use a variety of tools to create a &quot;master&quot; document, which then gets uploaded to either a SharePoint repository, or to our Wiki.<br /><br />To build these documents, I use things like Word, Notepad++, OneNote, Photoshop, CamStudio, and maybe a few others, but those are the highlights.  I've been playing with a new idea, and am hoping to get some input from the community about their favorite tools, what they like, and what they don't like.  Let your voice be heard!<br /><br />What do you look for in a documentation tool?<br /><br />Favorite tool or feature?  Least Favorite tool or feature?</description>
    </item>
    
    <item>
      <title>ShellFileCopy with VB6</title>
      <link>http://www.fortypoundhead.com/showcontent.asp?artid=23942</link>
      <datePosted>2012-11-25</datePosted>
	  <description>Copying a file with VB6 is pretty straightforward.  However, giving feedback to the user during the copy process has historically been a challenge.<br /><br />By leveraging the Windows API, we can utilize the same functions that Windows itself uses to copy files, and at the same time make use of the built in copy status dialog.  Another VB6 post, by request.<br /><br />Success or failure of the copy process will be returned as well, with a true/false value.<br />			<br />&lt;b&gt;Example:&lt;/b&gt;<br />&lt;code&gt;dim bSuccess as boolean<br />bSuccess = ShellFileCopy (&quot;C:\MyFile.txt&quot;, &quot;D:\MyFile.txt&quot;)&lt;/code&gt;<br />  <br />&lt;code&gt;Option Explicit<br /><br />Private Type SHFILEOPSTRUCT<br />        hwnd As Long<br />        wFunc As Long<br />        pFrom As String<br />        pTo As String<br />        fFlags As Integer<br />        fAnyOperationsAborted As Long<br />        hNameMappings As Long<br />        lpszProgressTitle As String<br />End Type<br /><br />Private Declare Function SHFileOperation Lib &quot;shell32.dll&quot; _<br />Alias &quot;SHFileOperationA&quot; (lpFileOp As SHFILEOPSTRUCT) As Long<br /><br />Private Const FOF_ALLOWUNDO = &amp;H40<br />Private Const FOF_NOCONFIRMATION = &amp;H10<br />Private Const FO_COPY = &amp;H2<br /><br />Public Function ShellFileCopy(src As String, dest As String, _<br />    Optional NoConfirm As Boolean = False) As Boolean<br /><br />Dim WinType_SFO As SHFILEOPSTRUCT<br />Dim lRet As Long<br />Dim lflags As Long<br /><br />lflags = FOF_ALLOWUNDO<br />If NoConfirm Then lflags = lflags &amp; FOF_NOCONFIRMATION<br />With WinType_SFO<br />    .wFunc = FO_COPY<br />    .pFrom = src<br />    .pTo = dest<br />    .fFlags = lflags<br />End With<br /><br />lRet = SHFileOperation(WinType_SFO)<br />ShellFileCopy = (lRet = 0)<br /><br />End Function&lt;/code&gt;</description>
    </item>
    
    <item>
      <title>Compare Two Files in VB6</title>
      <link>http://www.fortypoundhead.com/showcontent.asp?artid=23941</link>
      <datePosted>2012-11-25</datePosted>
	  <description>This function will allow you to compare one file to another. It will do either a lax check (compare file lengths only) or a stringent check (a byte by byte comparison). <br /><br />Pretty straightforward demonstration of string handling for Visual Basic 6, posted by request.<br /><br />&lt;code&gt;Public Function AreTheyTheSame(ByVal File1 As String, _<br />  ByVal File2 As String, Optional StringentCheck As _<br />  Boolean = False) As Boolean<br /><br />On Error GoTo ErrorHandler<br /><br />If Dir(File1) = &quot;&quot; Then Exit Function<br />If Dir(File2) = &quot;&quot; Then Exit Function<br /><br />Dim lLen1 As Long, lLen2 As Long<br />Dim iFileNum1 As Integer<br />Dim iFileNum2 As Integer<br />Dim bytArr1() As Byte, bytArr2() As Byte<br />Dim lCtr As Long, lStart As Long<br />Dim bAns As Boolean<br /><br />lLen1 = FileLen(File1)<br />lLen2 = FileLen(File2)<br />If lLen1 &lt;&gt; lLen2 Then<br />    Exit Function<br />ElseIf StringentCheck = False Then<br />        AreTheyTheSame = True<br />        Exit Function<br />Else<br />    iFileNum1 = FreeFile<br />    Open File1 For Binary Access Read As #iFileNum1<br />    iFileNum2 = FreeFile<br />    Open File2 For Binary Access Read As #iFileNum2<br /><br />    'put contents of both into byte Array<br />    bytArr1() = InputB(LOF(iFileNum1), #iFileNum1)<br />    bytArr2() = InputB(LOF(iFileNum2), #iFileNum2)<br />    lLen1 = UBound(bytArr1)<br />    lStart = LBound(bytArr1)<br />    <br />    bAns = True<br />    For lCtr = lStart To lLen1<br />        If bytArr1(lCtr) &lt;&gt; bytArr2(lCtr) Then<br />            bAns = False<br />            Exit For<br />        End If<br />            <br />    Next<br />    AreTheyTheSame = bAns<br />       <br />End If<br /> <br />ErrorHandler:<br />If iFileNum1 &gt; 0 Then Close #iFileNum1<br />If iFileNum2 &gt; 0 Then Close #iFileNum2<br />End Function&lt;/code&gt;</description>
    </item>
    
    <item>
      <title>Get Available Drivespace with VB6</title>
      <link>http://www.fortypoundhead.com/showcontent.asp?artid=23940</link>
      <datePosted>2012-11-25</datePosted>
	  <description>As a developer, from time to time you are called upon to build or process large chunks of data.  During this process, you can use the the local hard drive as a temporary holding area.  Admittedly, with todays well-specc'd computers, you shouldn't need to do this, but back in the day, this was the norm.<br /><br />By request, here is a set of API functions for use with Visual Basic 6 that will return various pieces of information about local storage, such as total space, free space, etc.<br /><br />I've tried to take line wrap in to account, but watch out!  I may have missed one.<br /><br />&lt;code&gt;Option Explicit<br /><br />Private Declare Function LoadLibrary Lib &quot;kernel32&quot; Alias &quot;LoadLibraryA&quot; _<br />                            (ByVal lpLibFileName As String) As Long<br /><br />Private Declare Function FreeLibrary Lib &quot;kernel32&quot; _<br />                            (ByVal hLibModule As Long) As Long<br /><br />Private Declare Function GetProcAddress Lib &quot;kernel32&quot; _<br />                            (ByVal hModule As Long, ByVal lpProcName As String) As Long<br /><br />Private Declare Function GetDiskFreeSpace Lib &quot;kernel32&quot; Alias &quot;GetDiskFreeSpaceA&quot; _<br />                            (ByVal lpRootPathName As String, _<br />                            lpSectorsPerCluster As Long, _<br />                            lpBytesPerSector As Long, _<br />                            lpNumberOfFreeClusters As Long, _<br />                            lpTtoalNumberOfClusters As Long) As Long 'C Bool<br /><br />Private Declare Function GetDiskFreeSpaceExAsCurrency Lib &quot;kernel32&quot; Alias &quot;GetDiskFreeSpaceExA&quot; _<br />                            (ByVal lpDirectoryName As String, _<br />                             lpFreeBytesAvailableToCaller As Currency, _<br />                             lpTotalNumberOfBytes As Currency, _<br />                             lpTotalNumberOfFreeBytes As Currency) As Long 'C Bool<br /><br />Private Declare Sub CopyMemory Lib &quot;kernel32&quot; Alias &quot;RtlMoveMemory&quot; _<br />                                                    (lpvDest As Any, _<br />                                                    lpvSource As Any, _<br />                                                    ByVal cbCopy As Long)<br /><br />Public Function vbGetAvailableBytesAsString(Optional ByVal sPath As String = &quot;&quot;) As String<br />    Dim lo As Long, hi As Long<br />    Dim sOut As String<br />    <br />    If ExistGetDiskFreeSpaceEx() Then<br />        sOut = vbGetAvailableBytesEx(sPath)<br /><br />    Else<br />        sOut = CStr(vbGetAvailableBytes(sPath))<br />    End If<br />    vbGetAvailableBytesAsString = sOut<br />    <br />End Function<br /><br />Public Function vbGetAvailableKBytesAsString(Optional ByVal sPath As String = &quot;&quot;) As String<br />    Dim bytes As Currency, kBytes As Currency<br />    Dim sTmp As String<br />    <br />    sTmp = vbGetAvailableBytesAsString(sPath)<br />    bytes = CCur(sTmp)<br />    If bytes Then 'avoid divide by 0 errors<br />        kBytes = bytes / 1024<br />        kBytes = Fix(kBytes)<br />    Else<br />        kBytes = 0<br />    End If<br />    vbGetAvailableKBytesAsString = CStr(kBytes)<br />        <br />End Function<br /><br />Public Function vbGetAvailableMBytesAsString(Optional ByVal sPath As String = &quot;&quot;) As String<br />    Dim kBytes As Currency, mBytes As Currency<br />    Dim sTmp As String<br />    <br />    sTmp = vbGetAvailableKBytesAsString(sPath)<br />    kBytes = CCur(sTmp)<br />    If kBytes Then 'avoid divide by 0 errors<br />        mBytes = kBytes / 1024<br />        mBytes = Fix(mBytes)<br />    Else<br />        mBytes = 0<br />    End If<br />    vbGetAvailableMBytesAsString = CStr(mBytes)<br />        <br />End Function<br /><br />Public Function vbGetTotalBytesAsString(Optional ByVal sPath As String = &quot;&quot;) As String<br />    Dim lo As Long, hi As Long<br />    Dim sOut As String<br />    <br />    If ExistGetDiskFreeSpaceEx() Then<br />        sOut = vbGetTotalBytesEx(sPath)<br />    Else<br />        sOut = CStr(vbGetTotalBytes(sPath))<br />    End If<br />    vbGetTotalBytesAsString = sOut<br />    <br />End Function<br /><br />Public Function vbGetTotalKBytesAsString(Optional ByVal sPath As String = &quot;&quot;) As String<br />    Dim numbytes As Currency, kBytes As Currency<br />    Dim sTmp As String<br />    <br />    sTmp = vbGetTotalBytesAsString(sPath)<br />    numbytes = CCur(sTmp)<br />    If numbytes Then 'avoid divide by 0 errors<br />        kBytes = numbytes / 1024<br />        kBytes = Fix(kBytes)<br />    Else<br />        kBytes = 0<br />    End If<br />    vbGetTotalKBytesAsString = CStr(kBytes)<br />        <br />End Function<br /><br />Public Function vbGetTotalMBytesAsString(Optional ByVal sPath As String = &quot;&quot;) As String<br />    Dim kBytes As Currency, mBytes As Currency<br />    Dim sTmp As String<br />    <br />    sTmp = vbGetTotalKBytesAsString(sPath)<br />    kBytes = CCur(sTmp)<br />    If kBytes Then 'avoid divide by 0 errors<br />        mBytes = kBytes / 1024<br />        mBytes = Fix(mBytes)<br />    Else<br />        mBytes = 0<br />    End If<br />    vbGetTotalMBytesAsString = CStr(mBytes)<br />        <br />End Function<br /><br />Public Function ExistGetDiskFreeSpaceEx() As Boolean<br />    Dim hInst As Long<br />    Dim procAddress As Long<br />    <br />    hInst = LoadLibrary(&quot;kernel32.dll&quot;)<br />    If hInst Then<br />        procAddress = GetProcAddress(hInst, &quot;GetDiskFreeSpaceExA&quot;)<br />        Call FreeLibrary(hInst)<br />    End If<br />    ExistGetDiskFreeSpaceEx = CBool(procAddress)<br />    <br />End Function<br /><br />Private Function vbGetAvailableBytesEx(ByVal sPath As String) As String<br />    Dim BytesAvailable As Currency<br />    Dim TotalBytes As Currency<br />    Dim TotalFreeBytes As Currency<br />    Dim tmp As Currency<br /><br />    On Error GoTo APIfailed<br />    If &quot;&quot; = sPath Then<br />        Call GetDiskFreeSpaceExAsCurrency(vbNullString, BytesAvailable, TotalBytes, TotalFreeBytes)<br />    Else<br />        Call GetDiskFreeSpaceExAsCurrency(sPath, BytesAvailable, TotalBytes, TotalFreeBytes)<br />    End If<br /><br />    'If BytesAvailable Then<br />        BytesAvailable = BytesAvailable * 10000<br />        vbGetAvailableBytesEx = CStr(BytesAvailable)<br />    'End If<br />    Exit Function<br />APIfailed:<br />    'returns false<br />    Debug.Print &quot;GetDiskFreeSpaceEx() API Failed!&quot;<br />End Function<br /><br />Private Function vbGetTotalBytesEx(ByVal sPath As String) As String<br />    Dim BytesAvailable As Currency<br />    Dim TotalBytes As Currency<br />    Dim TotalFreeBytes As Currency<br />    <br />    On Error GoTo APIfailed<br />    If &quot;&quot; = sPath Then<br />        Call GetDiskFreeSpaceExAsCurrency(vbNullString, BytesAvailable, TotalBytes, TotalFreeBytes)<br />    Else<br />        Call GetDiskFreeSpaceExAsCurrency(sPath, BytesAvailable, TotalBytes, TotalFreeBytes)<br />    End If<br />    <br />    If TotalBytes Then<br />        TotalBytes = TotalBytes * 10000<br />    Else<br />        TotalBytes = 0<br />    End If<br />    vbGetTotalBytesEx = CStr(TotalBytes)<br />    Exit Function<br />APIfailed:<br />    'returns false<br />    Debug.Print &quot;GetDiskFreeSpaceEx() API Failed!&quot;<br />End Function<br /><br />Private Function vbGetAvailableBytes(ByVal sPath As String) As Long<br />    Dim lSpc As Long 'sectors per cluster<br />    Dim lBps As Long 'bytes per sector<br />    Dim lNfc As Long 'number of free clusters<br />    Dim lTnc As Long 'total number of clusters<br />    <br />    <br />    Call GetDiskFreeSpace(sPath, lSpc, lBps, lNfc, lTnc)<br />    vbGetAvailableBytes = lSpc * lBps * lNfc<br />    <br />End Function<br /><br />Private Function vbGetTotalBytes(ByVal sPath As String) As Long<br />    Dim lSpc As Long 'sectors per cluster<br />    Dim lBps As Long 'bytes per sector<br />    Dim lNfc As Long 'number of free clusters<br />    Dim lTnc As Long 'total number of clusters<br />    <br />    <br />    Call GetDiskFreeSpace(sPath, lSpc, lBps, lNfc, lTnc)<br />    vbGetTotalBytes = lSpc * lBps * lTnc<br />    <br />End Function<br /><br />Public Function vbGetPercentAvailable(Optional ByVal sPath As String = &quot;&quot;) As Long<br /><br />	Dim freeEX As Currency<br />	Dim totalEX As Currency<br />	Dim availEX As Currency<br />	Dim percent As Long<br /><br />	On Error Resume Next 'if API fails there will be divide by zero errors<br /><br />	If ExistGetDiskFreeSpaceEx() Then<br />		If &quot;&quot; = sPath Then<br />			Call GetDiskFreeSpaceExAsCurrency(vbNullString, availEX, totalEX, freeEX)<br />		Else<br />			Call GetDiskFreeSpaceExAsCurrency(sPath, availEX, totalEX, freeEX)<br />		End If<br />	Else<br />	   totalEX = vbGetTotalBytes(sPath)<br />	   availEX = vbGetAvailableBytes(sPath)<br />		<br />	End If<br /><br />	totalEX = totalEX * 10000<br />	availEX = availEX * 10000<br />	percent = (availEX * 100) / totalEX<br /><br />	vbGetPercentAvailable = percent<br /><br />End Function&lt;/code&gt;</description>
    </item>
    
    <item>
      <title>Adjusting windows border width in Windows 8</title>
      <link>http://www.fortypoundhead.com/showcontent.asp?artid=23939</link>
      <datePosted>2012-11-05</datePosted>
	  <description>Window borders are not something you usually think about.  They're just there, keeping a visual cue of the current workspace.  Did you could change the width of these borders? Some folks want just like small borders.  <br /><br />Shrinking the border provides a bit of a cleaner feel to the windows, and gains a couple of extra pixels in the workspace.  In Windows 7, it was pretty easy to open the control panel and adjust to your liking.  Windows 8 doesn't have this feature in the control panel, but you can adjust the border width with a straightforward registry change.<br /><br />There are two settings you can adjust that affect the border width, each having a range of 0 to -1500. The default setting for the &lt;b&gt;BorderWidth&lt;/b&gt; property is &lt;b&gt;-15&lt;/b&gt;, while the default for &lt;b&gt;PaddedBorderWidth&lt;/b&gt; is -60.<br /><br />To make a thicker border, simply increase the integer value in these fields:<br />&lt;code&gt;[HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics]<br />&quot;BorderWidth&quot;=&quot;-15&quot;<br />&quot;PaddedBorderWidth&quot;=&quot;-60&quot;&lt;/code&gt;<br />Higher numbers (for example -1000) will give you a thicker border, while lower numbers (0 or -1) will give you thinner borders.<br /><br />After you have made the changes, you'll need to log out, then back in, to see the changes.</description>
    </item>
    
    <item>
      <title>Dell XPS 12 - Worth it ?</title>
      <link>http://www.fortypoundhead.com/showcontent.asp?artid=23938</link>
      <datePosted>2012-10-18</datePosted>
	  <description>Today, I got the opportunity to lay my hands on a Dell XPS 12.  What's so special about the XPS 12?  It's not sure what it is.<br /><br />Seriously.  The XPS doesn't know if it wants to be a laptop or a tablet.  Fortunately for us, this small but powerful unit does both well.  Read on for the details.<br /><br />&lt;img src=&quot;http://www.fortypoundhead.com/img/dellxps12.png&quot; alt=&quot;Dell XPS 12&quot; style=&quot;float:right;&quot;/&gt;The XPS 12 is Dells latest entry in the &quot;executive jewelry&quot; category of ultrabooks.  It's small and light, packing in a strong processor, and enough RAM to perform just about any business task.  <br /><br />Let's get the tech specs out of the way.  The unit that I tested with was fully decked out with:<br />&lt;ul&gt;&lt;li&gt;3rd Generation Intel Core™ i7-3517U processor (4M Cache, up to 3.0 GHz)&lt;/li&gt;&lt;li&gt;8GB Dual Channel DDR3&lt;/li&gt;&lt;li&gt;256 GB SSD&lt;/li&gt;&lt;/ul&gt;<br />Standard features of all XPS 12 tablets are:<br />&lt;ul&gt;&lt;li&gt;Windows 8, 64-bit&lt;/li&gt;&lt;li&gt;12.5&quot; FHD 1080p touch display&lt;/li&gt;&lt;li&gt;Intel HD 4000 video&lt;/li&gt;&lt;li&gt;Realtek ALC3260 soundcard (dual digital array microphones, 2-1 watt onboard speakers)&lt;/li&gt; &lt;li&gt;Mobile Intel QS77 Express Chipset&lt;/li&gt; &lt;li&gt;1.3MP webcam&lt;/li&gt; &lt;li&gt;Intel Centrino Advanced-N 6235 802.11 a/g/n with Intel Smart Connect Technology + Bluetooth 3.0&lt;/li&gt; &lt;li&gt;Intel Wireless Display (WiDi) 3.0 ready&lt;/li&gt; &lt;li&gt;Standard full size, backlit chiclet keyboard; spill-resistant&lt;/li&gt; &lt;li&gt;Glass integrated button touchpad with gesture support&lt;/li&gt; &lt;li&gt;Glass integrated button touchpad&lt;/li&gt; &lt;/ul&gt; <br />As with most ultrabook-class devices, ports are not as numerous as on larger laptops, but the essentials are there:<br />&lt;ul&gt;&lt;li&gt;1, 9-pin USB 3.0 port&lt;/li&gt;&lt;li&gt;1, 9-pin USB 3.0 port with PowerShare and Windows debugging&lt;/li&gt;&lt;li&gt;1, 20-pin mini-display port&lt;/li&gt;&lt;li&gt;1, headphone/microphone combo port&lt;/li&gt;&lt;/ul&gt;<br />Using the device as a notebook, it's exactly what you would expect.  Small, but with a punch.  Boot time was quick, thanks to the roomy amount of RAM, speedy processor, and especially the solid state drive.  Visibility of on screen elements was pretty good.  The 1080p display has a 160 degree viewing angle, that makes sharing the screen with a friend not &lt;i&gt;too&lt;/i&gt; cozy.  Remember, it is a small screen, not your 52-inch plasma.<br /><br />Operation of Windows 8 on the device was equally zippy.  Moving in and out of applications, installing new items from the app store, and even playing videos was smooth and responsive.  A lightweight device for road warriors to get things done while stuck on a plane for six hours.<br /><br />Most of the XPS is made up of carbon fiber, on the main body and on the back of the display, with a painted magnesium palm rest.  In usual Dell style, an excellent Chiclet keyboard is present. Typing was no problem, even with my big meat hooks.<br /><br />Now on to the magic, the reason this is classified as a hybrid device.  That aluminum bezel is not just a bezel to hold the screen in place, or to just look pretty.  It's the hinge/frame for the tilting screen.  Simply push the top of the screen back a bit, and it does a full 180 degree flip.  then you can close the clamshell, and voila, you have a Windows 8 tablet.  Nifty, eh?<br /><br />This baby was made for Windows 8.  The touch screen is responsive and accurate, and I never had a problem doing drag-n-drop operations, selecting tiles or menu options, or even writing with my finger.  The on-board camera is still facing you, so you can have your cam-based chats and meetings, without the keyboard getting in the way.<br /><br />But.<br /><br />The Dell XPS is just a bit heavier than the iPad, 3.35 pounds versus 1.44 pounds.  So be prepared for the extra heft.  However, in my opinion (based on my brief experience with the Dell unit), the XPS 12 seems to be more &quot;balanced&quot;, and not quite as clumsy in my hands.  So in short, my hands didn't seem to be getting tired or fatigued while using the unit for a period of time.<br /><br />Honestly, I think this weight difference can be forgiven, given the extra 2.4 inches of screen real estate that comes with it.<br /><br />I currently utilize an iPad 2, mainly for light email, light surfing, and the occasional Angry Birds stress relief.  For getting real work done while traveling, I break out my trusty Latitude 6410.  There is no way that I can really do serious work on the iPad.  It's a consumer device, not a business device.  Hence the need to carry both a laptop and a tablet when I travel.  One for work, and one for not work.<br /><br />After using this device for a short period, I would defintely consider this as a purchase.  It definitely has the horsepower I need to get things done for my job, and can act like a prosumer consumption device.<br /><br />It might be a little spendy, for those just looking for a new device that won't get used very often.  But if you are serious road warrior, who needs to cut down on the number of devices you tote around in the performance of your duties, I would highly recommend you check out the Dell XPS 12.  It's worth cash, in my humble opinion.<br /><br />Now, how can I get my hands on a long term tester?</description>
    </item>
    

  </channel>
</rss>