<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-885792999476012225</atom:id><lastBuildDate>Mon, 23 Sep 2024 22:24:41 +0000</lastBuildDate><category>Linux</category><category>Sysadmin</category><category>C#</category><category>Programming</category><category>ASP.Net</category><category>SQL Databases</category><category>Windows</category><category>Reviews</category><category>Hardware</category><category>Security</category><category>ASP Classic</category><category>Android</category><category>Apple / OSX / MacOS</category><category>Flash</category><category>Networking</category><category>PHP</category><category>Virtualization</category><category>Visual Basic / VBScript</category><category>HTML / CSS / JS</category><category>Document Store Databases</category><category>Python</category><category>Source Control</category><title>Grokking Code</title><description>Code exists for a reason</description><link>http://grokkingcode.blogspot.com/</link><managingEditor>noreply@blogger.com (Unknown)</managingEditor><generator>Blogger</generator><openSearch:totalResults>75</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">tag:blogger.com,1999:blog-885792999476012225.post-5922847219008164803</guid><pubDate>Sat, 27 Jan 2024 21:33:00 +0000</pubDate><atom:updated>2024-01-27T14:33:28.436-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Windows</category><title>Retrieving your Windows OEM key from the BIOS</title><description>&lt;div&gt;While an OEM license doesn&#39;t allow you to use it in a VM, there may be other reasons why you might want the keys. The following are how to access this value from a Windows system and a Linux system.&lt;/div&gt;
&lt;br/&gt;
&lt;div&gt;
  &lt;div&gt;From &lt;a href=&quot;https://www.howtogeek.com/660517/how-to-find-your-windows-10-product-key-using-the-command-prompt/&quot; target=&quot;_blank&quot;&gt;How-To Geek&lt;/a&gt; and &lt;a href=&quot;https://www.cyberciti.biz/faq/linux-find-windows-10-oem-product-key-command/&quot; target=&quot;_blank&quot;&gt;nixCraft&lt;/a&gt;:&lt;/div&gt;
  &lt;div&gt;Using a command prompty with admin privileges (per How-To Geek, nixCraft doesn&#39;t mention needing admin) on Windows&amp;hellip;&lt;/div&gt;
  &lt;code&gt;wmic path softwarelicensingservice get OA3xOriginalProductKey&lt;/code&gt;
&lt;/div&gt;
&lt;br/&gt;
&lt;div&gt;
  &lt;div&gt;From &lt;a href=&quot;https://www.cyberciti.biz/faq/linux-find-windows-10-oem-product-key-command/&quot; target=&quot;_blank&quot;&gt;nixCraft&lt;/a&gt;:&lt;/div&gt;
  &lt;div&gt;Using a terminal or terminal emulator&amp;hellip;&lt;/div&gt;
  &lt;code&gt;sudo strings /sys/firmware/acpi/tables/MSDM&lt;/code&gt;
&lt;/div&gt;
&lt;br/&gt;
&lt;div&gt;The original articles cover extra topics as well. I just wanted my own instructions on how to do it in case they linkrot away.&lt;/div&gt;</description><link>http://grokkingcode.blogspot.com/2024/01/retrieving-your-windows-oem-key-from.html</link><author>noreply@blogger.com (Unknown)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-885792999476012225.post-3171878613463631482</guid><pubDate>Sat, 12 Oct 2019 04:51:00 +0000</pubDate><atom:updated>2020-01-09T21:55:34.241-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Source Control</category><title>Command Line Git for the 99%</title><description>&lt;p&gt;I work with git a lot currently. I do it mostly through the command line because I&#39;ve found it easier to follow and focus on the files involved than the views provided by graphical git application. These commands get me through just about everything I need to do with a git repo (assuming it&#39;s hosted on a web service such as &lt;a href=&quot;httpd://github.com/&quot;&gt;GitHub.com&lt;/a&gt;, &lt;a href=&quot;https://gitlab.com/&quot;&gt;GitLab.com&lt;/a&gt;, or a &lt;a href=&quot;https://m.do.co/c/de22cd9e0829&quot;&gt;private GitLab server&lt;/a&gt; (possibly other git services, but I don&#39;t have access to them to check). This isn&#39;t intended to make you a git expert or discuss the merits of one branching and tagging practice versus another.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.git-scm.com/docs/git-clone&quot;&gt;git clone {repo url copied from site}&lt;/a&gt; - - - Initial retrieval or a git repository from a web service.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.git-scm.com/docs/git-status&quot;&gt;git status&lt;/a&gt; - - - See the status of your current repo/branch.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.git-scm.com/docs/git-checkout&quot;&gt;git checkout -b {branch name}&lt;/a&gt; - - - Create a new branch from your current branch and switch to it.  The &amp;quot;root&amp;quot; branch is called master.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.git-scm.com/docs/git-checkout&quot;&gt;git checkout {branch name}&lt;/a&gt; - - - Switch to a branch. If you are creating a new branch for each feature being worked on or added, this is a handy way to switch from working on one to working on the other.  (If working with Visual Studio solutions involving project or solution file changes, it might be best to close VS before doing the checkout and then re-opening the IDE.)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.git-scm.com/docs/git-add&quot;&gt;git add {file list or path possibly with a wildcard}&lt;/a&gt; - - - Takes any edited or new files specified and makes them ready for a git commit. Adding a directory attempts to add all files and subdirectories within not matching a partern in a &lt;a href=&quot;https://www.git-scm.com/docs/gitignore&quot;&gt;.gitignore&lt;/a&gt; file.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.git-scm.com/docs/git-commit&quot;&gt;git commit -m &amp;quot;Commit message&amp;quot;&lt;/a&gt; - - - Makes the added files (check with git status) part of a commit transaction.  A commit is like a checkpoint.  Commits are easy to roll back to or ready to push up to the web service. The -m and message are sometimes optional, but are a good habit to have as the messages show in your logs.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.git-scm.com/docs/git-log&quot;&gt;git log&lt;/a&gt; - - - Show the commit history of your current branch.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.git-scm.com/docs/git-push&quot;&gt;git push origin {branch name}&lt;/a&gt; - - - Takes the set of commits since either the branch&#39;s creation, last push, or last rebase and sends them to the web service you originally cloned from.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.git-scm.com/docs/git-stash&quot;&gt;git stash &amp;amp;&amp;amp; git stash drop&lt;/a&gt; - - - Gets rid of any changes you&#39;ve made since the last commit to any tracked files.  (Untracked/new files are unaffected.)  A handy way to revert changes you&#39;re working on that you&#39;ve decided weren&#39;t a good idea. There are lots of other little tricks git stash can do, but for beginners looking for the undo command, this combo is pretty close.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Git experts out there stumbling on this are probably screaming that I left out &lt;a href=&quot;https://www.git-scm.com/docs/git-merge&quot;&gt;merge&lt;/a&gt;. The web based services typically provide merge functionality and can warn you if there are conflicts that need resolved. There are better articles out there to walk you through merge conflict resolution. I merely wanted to provide a quick reference for someone who needs to get familiar with git in a hurry, like I did a while back.&lt;/p&gt;</description><link>http://grokkingcode.blogspot.com/2019/10/command-line-git-for-99.html</link><author>noreply@blogger.com (Unknown)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-885792999476012225.post-4663086794606198473</guid><pubDate>Sat, 25 May 2019 04:48:00 +0000</pubDate><atom:updated>2024-01-27T14:38:15.810-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ASP.Net</category><category domain="http://www.blogger.com/atom/ns#">Linux</category><title>DotNet Adventures In Linux Land</title><description>I&#39;m anxious to get things moving off of the old ASP.Net 4.6 and onto DotNet Core.  I started working on some DotNet Core versions of class libraries we have and found that if I target Dot Net Standard 1.3 I should be able to use the same library in DotNet Core 2.1 as well as DotNet Framework 4.6.  So I started down that path.  It didn&#39;t take long before I found out you could target multiple frameworks and decided to try adding net461 to see what would happen.&lt;br /&gt;
&lt;br /&gt;
Error.  Couldn&#39;t target net461 from Ubuntu.  Or could I...&lt;br /&gt;
&lt;br /&gt;
Found &lt;a href=&quot;https://stu.dev/how-to-target-net4x-on-macos/&quot;&gt;How to dotnet build and Target net4x on macOS&lt;/a&gt; and it turns out the solutions to compiling for the DotNet Framework on Macs also works for Linux.&lt;br /&gt;
&lt;br /&gt;
Suddenly looking forward to starting a new 4.6.x project at work to see if a net461 targeting classlib from Ubuntu really will work with it.&lt;br /&gt;
&lt;br /&gt;
Next stop: Nuget packaging that class library for multiple frameworks.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
January 2024 update: What I actually ended up doing back then with this was to target NetStandard 2.0 as we had moved our DN Framework stuff to 4.7.2.</description><link>http://grokkingcode.blogspot.com/2019/05/dotnet-adventures-in-linux-land.html</link><author>noreply@blogger.com (Unknown)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-885792999476012225.post-169312037760387080</guid><pubDate>Fri, 21 Jul 2017 03:30:00 +0000</pubDate><atom:updated>2020-01-09T21:58:23.424-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">SQL Databases</category><title>Make SQL Joined Tables Easier to Read</title><description>Often during development we find ourselves writing the following kind of query as we&#39;re working out what we need and how best to get at it.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;precode&quot;&gt;select T1.*
,T2.*
,T3.*
from table1 T1
inner join table2 T2 on T1.pk = T2.fk
inner join table3 T3 on T2.pk = T3.fk&lt;/pre&gt;&lt;br /&gt;
If the tables have a lot of fields it can become frustrating trying to figure out where one ends and the next begins. Try the following to make it easier on yourself as you scroll across your results...&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;precode&quot;&gt;select &#39;&gt;&gt;&gt; T1 &gt;&gt;&gt;&#39; as &#39;T1&#39;
,T1.*
,&#39;&gt;&gt;&gt; T2 &gt;&gt;&gt;&#39; as &#39;T2&#39;
,T2.*
,&#39;&gt;&gt;&gt; T3 &gt;&gt;&gt;&#39; as &#39;T3&#39;
,T3.*
from table1 T1
inner join table2 T2 on T1.pk = T2.fk
inner join table3 T3 on T2.pk = T3.fk&lt;/pre&gt;</description><link>http://grokkingcode.blogspot.com/2017/07/make-sql-joined-tables-easier-to-read.html</link><author>noreply@blogger.com (Unknown)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-885792999476012225.post-3921979634075895746</guid><pubDate>Sun, 05 Mar 2017 03:38:00 +0000</pubDate><atom:updated>2020-01-09T21:25:08.533-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">C#</category><title>Removing Values From a C# Generic List</title><description>For whatever reason, you have a list of items and it has values you wish to discard. I&#39;m going to use strings for my example, but you can use any comparable type. I&#39;m going to show you a good, better, best on doing so.&lt;br /&gt;
&lt;br /&gt;
If you&#39;re here because you&#39;re looking for an array based solution, I recommend you add using System.Collections.Generic; and push that array into a list first with List&amp;lt;string&amp;gt; removalList = new List&amp;lt;string&amp;gt;(myStringArray); and if you really need it to be an array at the end (perhaps legacy enterprise libraries), follow up with: myStringArray = removalList.ToArray();&lt;br /&gt;
&lt;br /&gt;
First, a relatively simple removal method…&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;precode&quot;&gt;using System.Collections.Generic;
using System.Diagnostics;
using System.Text.RegularExpressions;

List&lt;string&gt; test = new List&lt;string&gt;(10000);
string[] letters = Regex.Split(&quot;abcdefghijklmnopqrstuvwxyz&quot;, string.Empty);

for (int x = 0; x &amp;lt; 10000; ++x) {
    test.Add(letters[x % letters.Length]);
}

Stopwatch sw = new Stopwatch();
sw.Start();
foreach (string y in letters) {
    while (test.Contains(y)) {
        test.Remove(y);
    }
    Console.WriteLine(&quot;Removed &quot; + y + &quot;, &quot; + test.Count + &quot; remaining, &quot; + sw.ElapsedMilliseconds + &quot; elapsed.&quot;);
}
sw.Stop();
Console.WriteLine(&quot;Timer: &quot; + sw.ElapsedMilliseconds);
&lt;/string&gt;&lt;/string&gt;&lt;/pre&gt;&lt;br /&gt;
Since .Remove(value) only removes the first value we have to keep checking if we got them all. Also, I could have wrapped the while in a check to see if Y was null or empty, but in a real-world setting, you might want to be removing exactly those values and will likely have a very specific list of removals to make vs stripping out everything as I&#39;m doing for demonstration purposes.  Now, a better method…  &lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;precode&quot;&gt;using System.Collections.Generic;
using System.Diagnostics;
using System.Text.RegularExpressions;

List&lt;string&gt; test = new List&lt;string&gt;(10000);
string[] letters = Regex.Split(&quot;abcdefghijklmnopqrstuvwxyz&quot;, string.Empty);

for (int x = 0; x &amp;lt; 10000; ++x) {
    test.Add(letters[x % letters.Length]);
}

Stopwatch sw = new Stopwatch();
sw.Start();
foreach (string y in letters) {
    for (int z = test.Count - 1; z &amp;gt; -1; --z) {
        if (test[z].Equals(y)) {
            test.RemoveAt(z);
        }
    }
    Console.WriteLine(&quot;Removed &quot; + y + &quot;, &quot; + test.Count + &quot; remaining, &quot; + sw.ElapsedMilliseconds + &quot; elapsed.&quot;);
}
sw.Stop();
Console.WriteLine(&quot;Timer: &quot; + sw.ElapsedMilliseconds);
&lt;/pre&gt;&lt;br /&gt;
Big speed improvement as we step down the list (approximately 40× faster in my tests). We go backwards so we don&#39;t have to account for removed index values as we shorten the list. Once an index position is evaluated for removal we&#39;re done with it. Otherwise we&#39;d have to keep rechecking the current index value to see if it also needed removed before moving on, plus our upper index limit would have to be reevaluated at each increment of the counter instead of comparing to a constant.  This must be a pretty common task because Microsoft added a RemoveAll() function to lists, but rather than try to make it handle multiple types, you have to create a function called a predicate that returns true for removal of an entry or false to not remove. For a relatively simple comparison check, an anonymous lambda function (value =&amp;gt; function) does nicely…&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;precode&quot;&gt;using System.Collections.Generic;
using System.Diagnostics;
using System.Text.RegularExpressions;

List&lt;string&gt; test = new List&lt;string&gt;(10000);
string[] letters = Regex.Split(&quot;abcdefghijklmnopqrstuvwxyz&quot;, string.Empty);

for (int x = 0; x &amp;lt; 10000; ++x) {
    test.Add(letters[x % letters.Length]);
}

Stopwatch sw = new Stopwatch();
sw.Start();
foreach (string y in letters) {
    test.RemoveAll(z =&amp;gt; z.Equals(y));
    Console.WriteLine(&quot;Removed &quot; + y + &quot;, &quot; + test.Count + &quot; remaining, &quot; + sw.ElapsedMilliseconds + &quot; elapsed.&quot;);
}
sw.Stop();
Console.WriteLine(&quot;Timer: &quot; + sw.ElapsedMilliseconds);
&lt;/pre&gt;&lt;br /&gt;
Now we&#39;re talking. I was getting an 8× improvement over the seconds method, and 300× better than the first.</description><link>http://grokkingcode.blogspot.com/2017/03/removing-values-from-c-generic-list.html</link><author>noreply@blogger.com (Unknown)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-885792999476012225.post-6824224449411206766</guid><pubDate>Thu, 02 Feb 2017 03:34:00 +0000</pubDate><atom:updated>2020-01-09T21:25:26.765-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">C#</category><title>Redundant Ternary</title><description>I was reviewing some third-party C# code earlier and came across this little gem (trimmed down to the important bit)…&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;precode&quot;&gt;bool x = y == z ? true : false;&lt;/pre&gt;&lt;br /&gt;
I have wracked my brain and can not come up with a situation in which I would need the ternary operator ?: to convert a boolean into a boolean as tested by an operator == that already returns a boolean value. Maybe it avoids some kind of compiler warning regarding mixing = and ==.</description><link>http://grokkingcode.blogspot.com/2017/02/redundant-ternary.html</link><author>noreply@blogger.com (Unknown)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-885792999476012225.post-7133480439160293782</guid><pubDate>Sun, 29 Jan 2017 03:55:00 +0000</pubDate><atom:updated>2020-01-09T21:26:27.351-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">C#</category><title>Lazy Instantiation of Generic Collections</title><description>When you&#39;re working with large datasets you can often find yourself wanting to prevent creating a large number of &quot;just in case&quot; objects, particularly collections such as List. Any chance to avoid creating extra, unnecessary objects that exist only for the garbage collector to have to deal with is a welcome one.&lt;br /&gt;
&lt;br /&gt;
&lt;preclass=&quot;precode&quot;&gt;class ClassName {&lt;br /&gt;
  public ClassName() {&lt;br /&gt;
    StringList = new List&lt;string&gt;();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  public string Id { get; set; }&lt;br /&gt;
  public List&lt;string&gt; StringList { get; set; }&lt;br /&gt;
}&lt;br /&gt;
&lt;/pre&gt;&lt;br /&gt;
A simple, but not thread safe means of instantiating StringList would be…&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;precode&quot;&gt;class ClassName {
  private List&lt;string&gt; _StringList;

  public ClassName() { }

  public string Id { get; set; }
  public List&lt;string&gt; {
    get { return _StringList ?? (_StringList = new List&lt;string&gt;()); }
    set;
  }
}
&lt;/pre&gt;&lt;br /&gt;
That will get you by in a lot of coding situations, but eventually you may find yourself in a multi-threaded coding situation and need something thread safe…&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;precode&quot;&gt;class ClassName {
  private List&lt;string&gt; _StringList;
  private object _stringlistlock = new object();

  public ClassName() { }

  public List&lt;string&gt; {
    get {
      if (_StringList == null) {
        lock(stringlistlock) {
          // In case assignment happens between first check and locking call.
          if (_StringList == null) {
            _StringList = new List&lt;string&gt;();
          }
        }
      }
      return _StringList;
    }
    set;
  }
}
&lt;/pre&gt;&lt;br /&gt;
Now you&#39;re probably wondering why I would have a set option for the property when the get handles the instantiation. It&#39;s to support shorthand class instantiation.&lt;br /&gt;
&lt;br /&gt;
Instead of writing…&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;precode&quot;&gt;ClassName cn = new ClassName();
cn.Id = &quot;The Id&quot;;
cn.StringList.Add(&quot;A&quot;);
cn.StringList.Add(&quot;B&quot;);
cn.StringList.Add(&quot;C&quot;);
cn.StringList.Add(&quot;D&quot;);
cn.StringList.Add(&quot;E&quot;);
&lt;/pre&gt;&lt;br /&gt;
…we can write …&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;precode&quot;&gt;ClassName cn = new ClassName() { Id = &quot;The Id&quot;, StringList = new List&lt;string&gt;(new string[] { &quot;A&quot;, &quot;B&quot;, &quot;C&quot;, &quot;D&quot;, &quot;E&quot; }) };&lt;/pre&gt;&lt;br /&gt;
If you don&#39;t like or don&#39;t plan to use that class creation shorthand, and you are using DotNet 4 or later, you can use Microsoft&#39;s Lazy&lt;t&gt; methodology. It doesn&#39;t work with the shorthand because once a reference value has been set by doing the property get of the private backing variable, it can&#39;t be changed by a property set call.&lt;br /&gt;
&lt;br /&gt;
Thanks to &lt;a href=&quot;http://stackoverflow.com/a/8638694&quot;&gt;Stack Overflow&lt;/a&gt;, &lt;a href=&quot;http://stackoverflow.com/users/23354/marc-gravell&quot;&gt;Marc Gravell&lt;/a&gt;, and &lt;a href=&quot;http://stackoverflow.com/users/56778/jim-mischel&quot;&gt;Jim Mischel&lt;/a&gt; for some of this information.</description><link>http://grokkingcode.blogspot.com/2017/01/lazy-instantiation-of-generic.html</link><author>noreply@blogger.com (Unknown)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-885792999476012225.post-1570103710354414746</guid><pubDate>Thu, 01 Oct 2015 01:15:00 +0000</pubDate><atom:updated>2020-01-09T21:58:37.982-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">SQL Databases</category><title>Find a substring anywhere in a database.</title><description>I needed to find a pattern in a MSSQL 2008 database and I didn&#39;t know what table or column the data might be in. I was able to convert a script I found on StackOverflow.com over to a method that doesn&#39;t use server side cursors and returns the entire row for matches in any applicable columns to give the results context. Like the original poster&#39;s version, this assumes you are running it in the dbo role. If you intend to use this script with user input, you&#39;ll want to take extra care what gets assigned to @search_string. There&#39;s no protection against malicious input.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;precode&quot;&gt;/* Based on http://stackoverflow.com/questions/591853/search-for-a-string-in-all-tables-rows-and-columns-of-a-db */
DECLARE
 @table_name     SYSNAME,
 @table_id       INT,
 @column_name    SYSNAME,
 @sql_string     VARCHAR(max),
 @lasttableid INT = 0,
 @lastcolumnid INT = 0,
 @search_string  VARCHAR(max) = &#39;test phrase&#39;

declare @tables_cur table(entryid int not null identity(1,1), name sysname, object_id int)
declare @columns_cur table(column_id int not null, name sysname)

insert into @tables_cur (name, object_id)
select name, object_id
from sys.objects
where type=&#39;U&#39;

while exists (select * from @tables_cur where entryid &amp;gt; @lasttableid) begin

 select top 1 @lasttableid = t.entryid, @table_name = t.name, @table_id = t.object_id
 from @tables_cur t
 where t.entryid &amp;gt; @lasttableid
 order by t.entryid

 delete from @columns_cur
 set @lastcolumnid = 0

 insert into @columns_cur (column_id, name)
 select column_id, name
 from sys.columns
 where object_id = @table_id
 and system_type_id in (167, 175, 231, 239)

 SET @sql_string = &#39;SELECT &#39;&#39;&#39; + @table_name + &#39;&#39;&#39; as [_TABLE_NAME_], * FROM [&#39; + @table_name + &#39;] where 1=0&#39;

 while exists (select * from @columns_cur where column_id &amp;gt; @lastcolumnid) begin

  select top 1 @lastcolumnid = c.column_id, @column_name = c.name
  from @columns_cur c
  where c.column_id &amp;gt; @lastcolumnid
  order by c.column_id

  set @sql_string += &#39; or [&#39; + @column_name + &#39;] LIKE &#39;&#39;%&#39; + @search_string + &#39;%&#39;&#39;&#39;;

 end
 print @sql_string
 EXECUTE(&#39;if exists (&#39; + @sql_string + &#39;) begin &#39; + @sql_string + &#39; end;&#39;)
end
&lt;/pre&gt;</description><link>http://grokkingcode.blogspot.com/2015/09/find-substring-anywhere-in-database.html</link><author>noreply@blogger.com (Unknown)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-885792999476012225.post-8563191514003667954</guid><pubDate>Sun, 26 May 2013 00:07:00 +0000</pubDate><atom:updated>2020-01-09T22:14:31.461-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Linux</category><category domain="http://www.blogger.com/atom/ns#">Windows</category><title>Windows 8 and Ubuntu 13.04 have more in common than I&#39;d like</title><description>Both Microsoft and Canonical seem to have the belief that users have no desire to know what applications are installed on their systems.&amp;nbsp; Windows 8 desktop apps don&#39;t show up in the tile menu and Ubuntu 13.04 apps don&#39;t seem to show up anywhere.&amp;nbsp; In both cases you have to start typing the name of an application to find it.&amp;nbsp; This is a major pain if you aren&#39;t sure what it is you&#39;re looking for.&amp;nbsp; I just installed a bunch of games to keep my kids entertained on the Ubuntu system even when the Internet is inaccessible, but I can&#39;t even find the games to demonstrate them because as soon as I install them they basically disappear into the system somewhere.&amp;nbsp; I tried typing games into the Ubuntu search box and got a few entries, but only 3 of the 5 results were actual games.&amp;nbsp; The other 2 were game engines meant to be used by games.&amp;nbsp; Typing the same thing in the Windows 8 tile menu brought up a games app entry, which just led to some kind of games store that wanted me to create yet another account or sign in.&lt;br /&gt;
&lt;br /&gt;
Every smart phone and tablet I&#39;ve used has a button I can &quot;click&quot; to bring up a list of installed apps.&amp;nbsp; If PC makers want to stop the migration away from desktop systems, they may want to have a serious talk with the 2 big publishers of Operating Systems for people new to computers.&lt;br /&gt;
&lt;br /&gt;
Update: I may have spoken too soon.&amp;nbsp; Apparently you can find all the games installed in Ubuntu 13.04 if you know to switch from the home search to the app search and then click filter results.&amp;nbsp; So the menu is there on Ubuntu, but it&#39;s buried a few layers deep behind icons of questionable recognition and a search filtering system you may not realize has categories.&amp;nbsp; At least you don&#39;t have to know the name of the app you&#39;re looking for from that point.</description><link>http://grokkingcode.blogspot.com/2013/05/windows-8-and-ubuntu-1304-have-more-in.html</link><author>noreply@blogger.com (Unknown)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-885792999476012225.post-8790933208666274435</guid><pubDate>Thu, 06 Dec 2012 20:51:00 +0000</pubDate><atom:updated>2013-05-25T17:08:48.028-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Linux</category><title>Crunchbang is a big bang with tiny requirements</title><description>Over the past year I&#39;ve migrated my Linux systems for the kids from &lt;a href=&quot;http://www.ubuntu.com/&quot;&gt;Ubuntu&lt;/a&gt; to &lt;a href=&quot;http://xubuntu.org/&quot;&gt;Xubuntu&lt;/a&gt; and now to &lt;a href=&quot;http://crunchbang.org/&quot;&gt;Crunchbang&lt;/a&gt;.  It&#39;s a fantastic, no-nonsense system for getting stuff done.  It can play games, especially web-based ones.  It uses a &lt;a href=&quot;http://www.debian.org/&quot;&gt;Debian&lt;/a&gt; base similar to Ubuntu.  Most importantly, it seems to go fast.  There&#39;s little in the way of eye candy or nifty desktop tricks like wobbly windows.  Instead you have a minimalist desktop (actually 2 virtual desktops, but I reduce it to a single desktop to prevent confusion for the Pre-K user) with a simple menu.  I have it running on systems as old as an &lt;a href=&quot;http://www.asus.com/Eee/Eee_PC/Eee_PC_900A/&quot;&gt;Asus EEE&lt;/a&gt; laptop (the really old kind with the 4GB SSD).&lt;br /&gt;
&lt;br /&gt;
Something to think about for your current (slow) computer if you&#39;re planning on upgrading to a new computer in the near future.</description><link>http://grokkingcode.blogspot.com/2012/12/crunchbang-is-big-bang-with-tiny.html</link><author>noreply@blogger.com (Unknown)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-885792999476012225.post-369886624186158824</guid><pubDate>Sat, 23 Jul 2011 06:29:00 +0000</pubDate><atom:updated>2011-07-22T23:29:14.320-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ASP.Net</category><category domain="http://www.blogger.com/atom/ns#">C#</category><title>Safely Retrieving Values in ASP.Net 4.0</title><description>This is a C# 4.0 updated version of &lt;a href=&quot;/2009/01/safely-retrieving-values-in-aspnet-20.html&quot;&gt;Safely Retrieving Values in ASP.Net 2.0&lt;/a&gt; from January, 2009.&lt;br&gt;
Not everything we do in ASP.Net gets sent via web form.  We still do a lot involving Request.QueryString[] and Request.Form[].  The trick is dealing with input that may or may not be there or may even be in the wrong format (such as someone tweaking the URL to see if they can break your site or insert content for a cross-site scripting attack).
&lt;a href=&quot;http://grokkingcode.blogspot.com/2011/07/safely-retrieving-values-in-aspnet-40.html#more&quot;&gt;Read more »&lt;/a&gt;</description><link>http://grokkingcode.blogspot.com/2011/07/safely-retrieving-values-in-aspnet-40.html</link><author>noreply@blogger.com (Unknown)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-885792999476012225.post-6981261535971867164</guid><pubDate>Thu, 02 Jun 2011 01:14:00 +0000</pubDate><atom:updated>2011-06-01T18:14:18.548-07:00</atom:updated><title>Apple Clamps Down on Free Apple Device Promotions</title><description>&lt;a href=&quot;http://apple.slashdot.org/story/11/06/01/2158224/Apple-Nixes-iPad-Giveaways&quot;&gt;Slashdot&lt;/a&gt; is carrying a discussion of Apple&#39;s recent enforcement attempts to prevent companies using Apple devices in giveaways. This amuses me to no end, as having worked with a few Apple devices, you&#39;d have to pay me to take one.</description><link>http://grokkingcode.blogspot.com/2011/06/apple-clamps-down-on-free-apple-device.html</link><author>noreply@blogger.com (Unknown)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-885792999476012225.post-8787468561469581416</guid><pubDate>Fri, 20 May 2011 02:46:00 +0000</pubDate><atom:updated>2011-05-19T19:46:00.208-07:00</atom:updated><title>I want TermKit and I want it via SSH too</title><description>A terminal program that handles text and graphics, handles pipes based on input source or output type, and gives you the ability to format your data with HTML/CSS? &lt;a href=&quot;http://acko.net/blog/on-termkit&quot; title=&quot;TermKit&quot;&gt;Yes PLEASE.&lt;/a&gt;</description><link>http://grokkingcode.blogspot.com/2011/05/i-want-termkit-and-i-want-it-via-ssh.html</link><author>noreply@blogger.com (Unknown)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-885792999476012225.post-5089650006163164364</guid><pubDate>Tue, 17 May 2011 14:52:00 +0000</pubDate><atom:updated>2011-05-17T10:53:49.279-07:00</atom:updated><title>Droid 2 Texting Failure Has Finally Struck Me</title><description>I&#39;ve had at least 3 text messages this morning that may or may not have gone to who I was trying to send to because the name and picture on the conversation thread belong to one person while the phone number that appears belongs to another person who is right before them on the contact list.&amp;nbsp; I don&#39;t know if it&#39;s Motorola, Google/Android, or Verizon to blame for this, but I&#39;m utterly disappointed that such a basic feature as texting can go so horribly wrong. And I know from searches that I&#39;m not the first person to be struck by this, so either those companies are incompetent or willfully unaware of the problems with their phones.&lt;br /&gt;
Neither of these were new contacts and I&#39;ve texted each of them (successfully) in the recent past as well.&lt;br /&gt;
&lt;br /&gt;
Update: Some good news.&amp;nbsp; The number I was trying to text really did receive the messages, it just looked like they were going to the wrong person, right down to showing up in a conversation thread with that other person. Not sure who would have gotten the messages if I&#39;d gotten a reply to the texts instead of originating all of them from the contacts list.</description><link>http://grokkingcode.blogspot.com/2011/05/droid-2-texting-failure-has-finally.html</link><author>noreply@blogger.com (Unknown)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-885792999476012225.post-6649710034993120513</guid><pubDate>Sat, 14 May 2011 04:56:00 +0000</pubDate><atom:updated>2020-01-09T22:15:14.201-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Linux</category><category domain="http://www.blogger.com/atom/ns#">Reviews</category><title>My Family&#39;s Opinion on Ubuntu&#39;s Unity: Can We Please Downgrade?</title><description>Yes, Canonical, every member of my family that has been subjected to Ubuntu 11.04 has hated it to the point where the kids fight over who gets to use one of the computers still running Ubuntu 10.10.&amp;nbsp; My teenagers were ready to stage a rebellion when I told them I was updating the remaining computers this weekend until I told them that I would also be installing Gnome-Shell as an alternative to Unity so they&#39;d be able to use them pretty much they way they did prior to the &quot;upgrade&quot;.&lt;br /&gt;
&lt;br /&gt;
Personally, if I wanted a netbook interface, I would have bought a netbook. I&#39;m beginning the upgrade of my personal system as I write this. When completed, the very first thing I&#39;ll be doing is banishing Unity to some dark, desolate corner of my hard drive.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Post Install Update:&lt;/b&gt; Seems I won&#39;t be fighting with Unity after all. I was informed my hardware wasn&#39;t up to snuff for running it and would have to use Ubuntu Classic. If my hardware can&#39;t run Unity, I shudder to think of what Canonical has foisted upon netbook users who &quot;upgrade&quot; to 11.04.</description><link>http://grokkingcode.blogspot.com/2011/05/my-familys-opinion-on-ubuntus-unity-can.html</link><author>noreply@blogger.com (Unknown)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-885792999476012225.post-5240261277192410365</guid><pubDate>Sat, 23 Apr 2011 06:22:00 +0000</pubDate><atom:updated>2011-04-22T23:22:13.104-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Networking</category><category domain="http://www.blogger.com/atom/ns#">Sysadmin</category><title>Sharing Has Its Limits</title><description>As much as I like to help keep costs down by using torrents when getting Linux distributions, the Ultimate Boot CD, Eclipse, OpenOffice.org, and now LibreOffice, it really hurts that others seem to think that my openness and sharing extends to my entire network.&amp;nbsp; I have logs full of people getting blocked from my network because they just couldn&#39;t help but see if they could access SSH, FTP, POP, IMAP, and a number of other ports you might find interesting if you were a hacker.&amp;nbsp; There&#39;s no 3 strikes rule on my network.&amp;nbsp; If you attempt to access anything I haven&#39;t specifically granted, you&#39;re out.&amp;nbsp; No jury.&amp;nbsp; No appeal.</description><link>http://grokkingcode.blogspot.com/2011/04/sharing-has-its-limits.html</link><author>noreply@blogger.com (Unknown)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-885792999476012225.post-5450487239644656980</guid><pubDate>Wed, 20 Apr 2011 03:13:00 +0000</pubDate><atom:updated>2011-04-19T20:13:00.436-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ASP.Net</category><title>ASP.Net HTTP Status 404</title><description>I&#39;ve seen 2 common ways to throw HTTP 404 errors in ASP.Net (I&#39;m using C# for the code examples)...&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;
throw new System.Web.HttpException(404, &quot;{Custom not found message here}&quot;);
&lt;/code&gt;
&lt;br /&gt;
&lt;br /&gt;
And...&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;
Response.Clear();&lt;br /&gt;
Response.StatusCode = 404;&lt;br /&gt;
Response.End();&lt;br /&gt;
&lt;/code&gt;
&lt;br /&gt;
&lt;br /&gt;
While it would seem like the first one would be the best all-around option, it has a large problem when implemented in the middle of a try/catch block... It gets caught.  By using the Response object instead, you can let the browser handle the status code by whatever means it would normally display such a response from the server.</description><link>http://grokkingcode.blogspot.com/2011/04/aspnet-http-status-404.html</link><author>noreply@blogger.com (Unknown)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-885792999476012225.post-2892797385790481420</guid><pubDate>Wed, 16 Feb 2011 02:44:00 +0000</pubDate><atom:updated>2011-02-15T19:44:00.653-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Android</category><title>Linked Droid Contacts FAIL</title><description>I&#39;m finding lots of posts by people trying to fix their Droid contacts lists to show the name stored in the phone instead of the one on Facebook, MySpace, Twitter, etc. and I have yet to find a single solution other than removing social networking accounts from the phone settings.  Google engineers are pretty good at fixing their mistakes in a fairly timely manner.  This leads me to believe that Verizon or Motorola did the poor job of testing contact data management on the Droid line of phones.&lt;br /&gt;
&lt;br /&gt;
So let&#39;s &lt;a href=&quot;http://advancedsearch.motorola.com/socialsearch/query?query=edit+droid+contacts+names&amp;customerId=motorola&amp;code=b2c_usa&amp;startingDocNum=1&amp;mode=congsa&amp;hl=en&quot;&gt;ask Motorola&lt;/a&gt; and &lt;a href=&quot;http://search.vzw.com/?market=24246&amp;q=edit+droid+contact+names&amp;p=null&amp;ss=null&amp;b2eFlag=N&quot;&gt;ask Verizon&lt;/a&gt; how we fix this problem.  After all, it&#39;s a cell phone function that been around for years and has always allowed for editing entries as far back as I can remember.</description><link>http://grokkingcode.blogspot.com/2011/02/linked-droid-contacts-fail.html</link><author>noreply@blogger.com (Unknown)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-885792999476012225.post-4105357581550427039</guid><pubDate>Sat, 05 Feb 2011 01:56:00 +0000</pubDate><atom:updated>2011-02-06T13:53:03.534-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Android</category><title>Android market impasse [not] solved. [Updated]</title><description>Just a few days ago I wrote about &lt;a href=&quot;/2011/01/android-tablets-stuck-at-impasse.html&quot;&gt;problems trying to get apps for an Android tablet&lt;/a&gt;.  I swear that I had no idea at the time Google/Android were going to be opening a &lt;a href=&quot;http://market.android.com/&quot;&gt;web based Android market&lt;/a&gt; just 4 days later.  I feel much better now about buying an Android tablet without having to pay for a big name on the box.&lt;br /&gt;
&lt;br /&gt;
Update: Finally got around to trying the web based Android Market with my wife&#39;s aPad and it&#39;s still useless. I can&#39;t associate the device with my market account because the maker didn&#39;t include an accounts and sync section in the settings. Going forward, anyone purchasing an off-brand Android based device should make sure that set of settings exists or that something like AndAppStore.com gets some massive improvements done.</description><link>http://grokkingcode.blogspot.com/2011/02/android-market-impasse-solved.html</link><author>noreply@blogger.com (Unknown)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-885792999476012225.post-7987771350332122068</guid><pubDate>Tue, 01 Feb 2011 01:22:00 +0000</pubDate><atom:updated>2020-01-09T22:12:30.946-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Android</category><category domain="http://www.blogger.com/atom/ns#">Hardware</category><category domain="http://www.blogger.com/atom/ns#">Reviews</category><title>A review of my family&#39;s experiences with the Apad E600</title><description>Seems I&#39;ll have to revise my &lt;a href=&quot;/2011/01/android-tablets-stuck-at-impasse.html&quot;&gt;earlier statement&lt;/a&gt; that these are passable tablets.  You should instead take a pass on them.  The 256MB of RAM and 720MHz processor just aren&#39;t enough for my family members&#39; use.  We finally worked out a way of getting some apps from the official Apps Market and onto the Apads, but you&#39;ll need a friend with an actual &quot;blessed&quot; Android system to do it (before anyone yells piracy, we only copied over free apps that weren&#39;t available through F-Droid or AndAppStore).  The 2GB is built-in storage was adequate for what few apps they wanted to use.  We have 2 Apads and each of them has had stuck power button issues.  They&#39;ve both had overheating problems to the point where they are painful to touch on the back.  The touch screens are also a bit finicky, but that&#39;s only a problem if you&#39;re trying to play games, not read or watch videos.&lt;br /&gt;
&lt;br /&gt;
Update: One of the power buttons is now permanently stuck and DinoDirect.com&#39;s customer assistance redirects you to their forums where I&#39;m seeing lots of problems being posted about the various &quot;aPad&quot; models they carry. I don&#39;t think I&#39;m likely to order from them again. They appear to be intended as wholesalers and have a very short return policy centered more around receiving defective merchandise than items failing during use. I also haven&#39;t been able to determine a manufacturer for the aPads to contact about any kind of warranty whatsoever.</description><link>http://grokkingcode.blogspot.com/2011/01/review-of-my-familys-experiences-with.html</link><author>noreply@blogger.com (Unknown)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-885792999476012225.post-207481292406339474</guid><pubDate>Sat, 29 Jan 2011 20:39:00 +0000</pubDate><atom:updated>2011-02-05T11:02:03.575-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Android</category><title>Android tablets stuck at an impasse</title><description>Originally, I was going to write a review of the APAD E600 I&#39;d picked up for about $100. It&#39;s a fine device for the price.  It&#39;s a lot slower than a netbook and has only 256MB of RAM to work with, so don&#39;t expect to use those for more than entertaining kids with standard definition YouTube videos at best.  The biggest flaw with these devices is something that is actually beyond their control and is damning of Android tablets in general at this time...&lt;br /&gt;
&lt;br /&gt;
Lack of application availability is going to kill Android as an OS.  The applications exist, and more are getting written all the time, but between Google&#39;s manufacturer&#39;s license requirements for their &quot;official&quot; app store (and no means of installing it after the fact), and many Android app makers not providing links to their APK files outside the market, it means those who try out an inexpensive Android tablet are going to be left with this horrible experience and likely a belief that all Android tablets are just that craptastic to use.  Say hello to more iPad users at that point.  (I, for one, refuse to submit to Apple&#39;s walled garden approach to applications.  At least even the licensed Android devices that Google has been paid to bless allow you to install applications from outside the market.)&lt;br /&gt;
&lt;br /&gt;
Here&#39;s hoping either Google makes the market app available to all or the software developers (at least of the free apps) pull their heads out of their nethers and make their apps available to a wider audience.&lt;br /&gt;
&lt;br /&gt;
Update: Here&#39;s something even more insane I&#39;ve just run across, an app store like site (appbrain.com) that makes you use Google&#39;s market app to install their app.  It&#39;s like a circular firing squad in the software distribution industry.&lt;br /&gt;
&lt;br /&gt;
Update: I should point out that the &lt;a href=&quot;http://f-droid.org/&quot;&gt;FDroid app&lt;/a&gt; does mostly what I&#39;m hoping for, but only for free *and* open source Android apps.  &lt;a href=&quot;http://andappstore.com/&quot;&gt;AndAppStore&lt;/a&gt; has an app, but it doesn&#39;t work on my Apad E600.  Neither of these handle market:// links, which is what is really going to matter.</description><link>http://grokkingcode.blogspot.com/2011/01/android-tablets-stuck-at-impasse.html</link><author>noreply@blogger.com (Unknown)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-885792999476012225.post-6559547710205241763</guid><pubDate>Fri, 17 Dec 2010 04:56:00 +0000</pubDate><atom:updated>2011-02-05T11:01:59.547-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Reviews</category><category domain="http://www.blogger.com/atom/ns#">Sysadmin</category><title>Ketarin: An Excellent Tool for Keeping Installers Up To Date</title><description>In both my personal and professional life, I keep a local repository of the installers for software I use on multiple systems. People also often ask me to take a look at their computers and clean them up when they get infected or excess crap gets in from those default checked boxes during installations of other software.  Keeping those repositories up to date is a bit of a pain and sometimes results in installing an older version of something if I&#39;m in a hurry.  Now I&#39;ve found &lt;a href=&quot;http://ketarin.canneverbe.com/&quot;&gt;Ketarin&lt;/a&gt; and it&#39;s been a big boost in time saving.  There&#39;s a large database of applications already defined for you to choose from and adding new applications is fairly easy to do.  Ketarin is primarily geared to work with &lt;a href=&quot;http://www.filehippo.com/&quot;&gt;FileHippo&lt;/a&gt;, including a FileHippo ID field as an alternative to a download URL.&lt;br /&gt;
For programs without a FileHippo tracker defined, you can define a variable for the software version by giving it a page to find the current version number (often a program&#39;s web site home page) and then highlighting the distinctive text before and after the version number so Ketarin can pick it off the page (and there&#39;s a regular expression option for those who grok regular expressions where the captured group of the matching text is assigned as the value of the variable).  If the version is part of the installer&#39;s file name then the download URL is given as something like http://website.tld/files/SuperDuperInstaller{version}.exe and Ketarin replaces {version} with the parsed out version variable you taught it to find earlier.&lt;br /&gt;
It&#39;s not perfect by any stretch of the imagination. I&#39;ve already run across a preset that caused crashes until I edited the SQLite database with an external editor. It doesn&#39;t work will with SourceForge hosted programs yet, but it can let you know if there&#39;s an updated version available.&lt;br /&gt;
Ketarin has already saved me a day of work updating the repository with the newest versions of software like Firefox, Thunderbird, OpenOffice.org, Inkscape, Paint.Net, 7-Zip, FileZilla, CCleaner, Foxit Reader, and so many more.</description><link>http://grokkingcode.blogspot.com/2010/12/ketarin-excellent-tool-for-keeping.html</link><author>noreply@blogger.com (Unknown)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-885792999476012225.post-3433510333339573617</guid><pubDate>Fri, 17 Dec 2010 04:38:00 +0000</pubDate><atom:updated>2011-02-05T11:01:52.026-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Sysadmin</category><category domain="http://www.blogger.com/atom/ns#">Windows</category><title>SpaceSniffer: Find Out What&#39;s Hogging Your Hard Drive</title><description>I found another good tool for Windows systems today while helping someone with a full hard drive problem. It&#39;s called &lt;a href=&quot;http://www.uderzo.it/main_products/space_sniffer/&quot;&gt;SpaceSniffer&lt;/a&gt; and it presents you with a graphical layout of your Drive (or a particular folder) in boxes sized relative to the amount of space they occupy. There are controls to go deeper or shallower if you need extra detail on what is taking up the space.  The site says you can also filter for particular file types and ages, but I haven&#39;t tried that yet.</description><link>http://grokkingcode.blogspot.com/2010/12/spacesniffer-find-out-whats-hogging.html</link><author>noreply@blogger.com (Unknown)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-885792999476012225.post-8245436060868098629</guid><pubDate>Fri, 19 Nov 2010 07:30:00 +0000</pubDate><atom:updated>2011-02-05T11:01:48.493-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Linux</category><category domain="http://www.blogger.com/atom/ns#">Sysadmin</category><title>Making Linux More Responsive Without the Kernel Patch</title><description>Found this via &lt;a href=&quot;http://slashdot.org/&quot;&gt;Slashdot&lt;/a&gt; and didn&#39;t want to lose track of it as I worked on various Linux boxes. There are a set of commands you can run to &lt;a href=&quot;http://www.webupd8.org/2010/11/alternative-to-200-lines-kernel-patch.html&quot;&gt;greatly increase the responsiveness of your Linux system&lt;/a&gt;.</description><link>http://grokkingcode.blogspot.com/2010/11/making-linux-more-responsive-without.html</link><author>noreply@blogger.com (Unknown)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-885792999476012225.post-7054954539221977825</guid><pubDate>Fri, 12 Nov 2010 14:20:00 +0000</pubDate><atom:updated>2011-02-05T11:01:44.810-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Flash</category><category domain="http://www.blogger.com/atom/ns#">Reviews</category><title>I Like Adobe&#39;s Flash Update Mechanism</title><description>I don&#39;t want to be that person who just points out the problems with things. I want to point out when things are done right. Adobe&#39;s Flash updating software is simple, straightforward, and doesn&#39;t make me uncheck boxes for a bunch of crap I don&#39;t want installed.  There were a total of two check boxes.  I can&#39;t remember exactly what the first one said, but the second was the usual check to accept license terms.  There weren&#39;t any extra tool bars being added to my browsers or those of the users I support at my day job (I&#39;m looking at you Sun/Oracle). They didn&#39;t push some security scanner on me (though they do try that with Acrobat Reader). As long as my browser is closed, the update just works.&lt;br /&gt;
&lt;br /&gt;
So thank you, Adobe, for getting this right.&lt;br /&gt;
&lt;br /&gt;
(And thank you for having a Linux version of Flash, too.)</description><link>http://grokkingcode.blogspot.com/2010/11/i-like-adobes-flash-update-mechanism.html</link><author>noreply@blogger.com (Unknown)</author></item></channel></rss>