<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>BIT Consultants</title>
	<atom:link href="http://www.bitconsultants.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.bitconsultants.net</link>
	<description></description>
	<lastBuildDate>Sun, 25 Jul 2010 21:54:45 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Validating Data with Enhanced Declarative Data Integrity Rules</title>
		<link>http://www.bitconsultants.net/2010/validating-data-using-tuples-stored-in-column-comments/</link>
		<comments>http://www.bitconsultants.net/2010/validating-data-using-tuples-stored-in-column-comments/#comments</comments>
		<pubDate>Sat, 08 May 2010 05:48:09 +0000</pubDate>
		<dc:creator>Rob</dc:creator>
				<category><![CDATA[Code Snippets]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[validation]]></category>

		<guid isPermaLink="false">http://www.bitconsultants.net/?p=255</guid>
		<description><![CDATA[Visit us at our new Google Code project page: http://code.google.com/p/metadata-validator/ Problem Definition Data validation and integrity assurance are complex subjects that have strong opinions tied to the way they are implemented. Some strongly feel that the database can handle validation using the column&#8217;s attributes (size,...]]></description>
			<content:encoded><![CDATA[<p><strong>Visit us at our new Google Code project page: <a href="http://code.google.com/p/metadata-validator/">http://code.google.com/p/metadata-validator/</a></strong></p>
<h2>Problem Definition</h2>
<p>Data validation and integrity assurance are complex subjects that have strong opinions tied to the way they are implemented. Some strongly feel that the database can handle validation using the column&#8217;s attributes (size, data type, etc) and TRIGGERS/STORED PROCEDURES can provide means to enforce complex business rules. This is true, but there are many caveats and arguments against this approach. Should a data source be performing logic? According to <a href="http://download.oracle.com/docs/cd/B28359_01/server.111/b28318/triggers.htm#g22503">Oracle&#8217;s website</a>:</p>
<p style="padding-left: 30px;">&#8220;<em>Although triggers are useful for customizing a database, use them only when necessary. Excessive use of triggers can result in complex interdependencies, which can be difficult to maintain in a large application</em>&#8220;</p>
<p>Those in opposition to this approach feel that it is not the job of the database to perform logic, only to store data. So, who is right?<br />
How should data validation be handled? Triggers or code? Honestly, both is usually the practice. The current implementations of Declarative Data Integrity Rules in the database marketplace give us simple rules to validate against (again: size, data type, nullable, etc) and if we don&#8217;t validate data in our code prior to insertion the database errors out. Though mindless and tedious, it is a straightforward task to code validation prior to executing SQL in your programming language.</p>
<p>I think that both opinions are correct, but both approaches are inadequate. Logic <strong><em>should </em></strong>be separated from data. However, rules about data stored in your database are really metadata. Why should programmers have to tweak code every time the table changes? Why should DBAs have to worry that programmers validation is insufficient and not have any control over the data integrity? I believe the database should dictate to us, in specific terms, what it is expecting. In addition, programmers and DBAs should be able to work together to formulate the data validation and that is should be in only one place.</p>
<h2>Current Practice</h2>
<p>Most of the time, a DBA will create a table with data type, length, unique and referential constraints. These rules are enforced by the database, programmers are handed back an error message which has to be parsed into a friendly error. In some shops, STORED PROCEDURES and TRIGGERS are used to validate data prior to insertion. As we pointed out above, this is not an encouraged practice and makes a data source a logic engine.</p>
<p>Let&#8217;s say we have a table defined as such:</p>
<pre class="brush: sql;">

id INT(8) NOT NULL,
name VARCHAR(40),
zip_code VARCHAR(10)
</pre>
<p>Programmers take the constraints defined above (i.e. &#8220;INT&#8221;, &#8220;NOT NULL&#8221;, 40, etc) and write up code validation for each of those columns. If DBAs alter the number of columns or the metadata of any one of the columns, the code needs to be updated accordingly. Conversely, if the programmers don&#8217;t properly validate the raw data in code, we could easily end up with &#8220;NOTAZIP&#8221; in our zip_code field. In this way, the technologies are seemingly blind of each other except for a tin-can phone that can pass simple messages back and forth. This is not a knock against the technology, they were made to be platform independent (in terms of interfacing) and not necessarily to know everything about each other.  This is the price we have to pay for an exceedingly friendly means of storing and retrieving data.</p>
<h2>Proposed Solution</h2>
<p>Utilizing dynamic functions, JSON and metadata stored in column comments of my database I was able to validate data against any table with only one validation class (that isn&#8217;t very long!). I have yet to see a column or table comment be anything slightly useful (if anything at all). Up until two days ago, every time I saw the field to insert a comment in phpmyadmin  I would think &#8220;I guess that&#8217;s a nice feature&#8230;&#8221;, and then move on. Then I realized that using (in MySQL) SHOW FULL COLUMN FROM {TABLE}, I can get that comment&#8217;s value back. And using my programming language (PHP), I could do the following:</p>
<pre class="brush: php;">

$data = json_decode($comment);
</pre>
<p>I now am holding an object created from metadata to do what I will with.</p>
<p>The initial data I inserted into a column COMMENT was a minified representation of this:</p>
<pre class="brush: jscript;">
'{	&quot;insert_helpers&quot;: {
		&quot;functions&quot;: {
			&quot;func1&quot;:{
				&quot;name&quot;:&quot;strtotime&quot;,
				&quot;params&quot;:{
					&quot;param1&quot;:&quot;+20 years&quot;
				}
			},
			&quot;func2&quot;:{
				&quot;name&quot;:&quot;str_replace&quot;,
				&quot;params&quot;:{
					&quot;param1&quot;:&quot;!!&quot;,
					&quot;param2&quot;:&quot;!&quot;,
					&quot;param3&quot;:&quot;@this&quot;,
				}
			}
		}
	},
	&quot;validators&quot;: {
		&quot;maxlength&quot;:&quot;10&quot;,
		&quot;minlength&quot;:&quot;2&quot;,
		&quot;patterns&quot;:{
			&quot;pattern1&quot;:{
				&quot;pattern&quot;:&quot;[^0-9]&quot;,
				&quot;example&quot;:&quot;This is data without numbers&quot;
			}
		}
	}
}'
</pre>
<p>This was then validated with code very similar to this:</p>
<pre class="brush: php;">
/**
*
* NOTE: I have not tested this code
* I typed directly it into notepad++ for your reading,
* not for executing, if it works, great!
*
*/
$json 				= json_decode($comment);
$helper_functions 	        = $json-&gt;{'insert_helpers'};
$validators			= $json-&gt;{'validators'};
$errors				= array();

//$row_value = $result['field'];
foreach($helper_functions as $function)
{
	$params = array();
	foreach($function-&gt;{'params'} as $param)
	{
		//insert row value
		if($param == '@this')
		{
			$param = str_replace(&quot;@this&quot;, $row_value, $param);
		}
		array_push($params, $param);
	}
	if(is_callable($function-&gt;{'name'})
	{
		$row_value = call_user_func_array($function-&gt;{'name'}, $params);
	}
}

if(is_object($validators))
{
	if(is_object($validators-&gt;{'minlength'})
	{
		if(sizeof($row_value) &lt; $validators-&gt;{'minlength'})
		{
			array_push($errors, &quot;$row_value is not long enough&quot;);
		}
	}
	if(is_object($validators-&gt;{'maxlength'})
	{
		if(sizeof($row_value) &gt; $validators-&gt;{'maxlength'})
		{
			array_push($errors, &quot;$row_value is too long&quot;);
		}
	}
	if(is_object($validators-&gt;{'patterns'})
	{
		foreach($validators-&gt;{'patterns'} as $pattern)
		{
			if(preg_match(&quot;/$pattern-&gt;{'pattern'}/&quot;, $row_value))
			{
				array_push($errors, &quot;$row_value is not in correct format [example: $pattern-&gt;{'example'}&quot;);
			}
		}
	}
}
</pre>
<p>If you didn&#8217;t pick it up by reading through the code, these functions couldn&#8217;t care less what table you are dealing with and the same set of code works against any and all columns. In addition, the validation rules (JSON) can be handed to the client side code to perform validation prior to reaching the server. All major databases have a comment column and most modern programming languages allow behavior like the example I posted.</p>
<p>I will post my php class that facilitates this process soon.</p>
<p>Anxious to hear people&#8217;s thoughts.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bitconsultants.net/2010/validating-data-using-tuples-stored-in-column-comments/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Geocoding with Google Maps and the Zend Framework</title>
		<link>http://www.bitconsultants.net/2010/geocoding-with-google-maps-and-the-zend-framework/</link>
		<comments>http://www.bitconsultants.net/2010/geocoding-with-google-maps-and-the-zend-framework/#comments</comments>
		<pubDate>Sat, 24 Apr 2010 17:51:40 +0000</pubDate>
		<dc:creator>Rob</dc:creator>
				<category><![CDATA[Code Snippets]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Geocoding]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[Maps]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://www.bitconsultants.net/?p=231</guid>
		<description><![CDATA[Maps are a great way to engage your users and visualize data, but it can be a little tricky to setup. Here I will walk you through the steps needed to get a map up and running. // Sign Up Apply for a Google Maps...]]></description>
			<content:encoded><![CDATA[<p>Maps are a great way to engage your users and visualize data, but it can be a little tricky to setup. Here I will walk you through the steps needed to get a map up and running.<br />
<script type="text/javascript">// <![CDATA[
 google_ad_client = "pub-4761320180230999"; /* 468x15, created 5/5/10 */ google_ad_slot = "9379654790"; google_ad_width = 468; google_ad_height = 15;
// ]]&gt;</script><br />
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script></p>
<h3>Sign Up</h3>
<p>Apply for a Google Maps API Key (free) here using your domain without a subdomain or www (this will allow you to use key with or without www and on subdomains): http://code.google.com/apis/maps/signup.html</p>
<h3>Configuration</h3>
<p>Put the API key in your configuration file (application.ini, config.ini, etc.) like this:</p>
<pre class="brush: php;">
[google]
google_map_key =  YOUR_KEY
</pre>
<h3>Bootstrapping</h3>
<p>In your index.php file, add the following code:</p>
<pre class="brush: php;">
//update CONFIG_PATH to point to your configuration file
defined(CONFIG_PATH)
or define('CONFIG_PATH', APPLICATION_PATH . '/configs/application.ini');
Zend_Registry::set('google',    new Zend_Config_Ini(CONFIG_PATH, 'google'));
</pre>
<p>This will add your api key to the registry so that it can be accessed throughout your application.</p>
<h3>Model</h3>
<p>In your models directory, create a new class called &#8216;Geocoder.php&#8217;. This will be the file that contains the application logic for retreiving coordinates on a given location.</p>
<p><strong>models/Geocoder.php</strong></p>
<pre class="brush: php;">

/**
* Geocoder
*
* @author Robert McVey
*/
class Geocoder {
	protected $key = &amp;quot;&amp;quot;;
	public function __construct($apiKey)
	{
		$this-&gt;key = $apiKey;
	}
	private function _getGeocodedLatitudeAndLongitude($address)
	{
		$client = new Zend_Http_Client();
		$client-&gt;setUri($this-&gt;getGeocodingUri());
		$client-&gt;setParameterGet('q', urlencode($address))
			-&gt;setParameterGet('output', 'json')
			-&gt;setParameterGet('sensor', 'false')
			-&gt;setParameterGet('key', $this-&gt;key);
		$result = $client-&gt;request('GET');
		$response = Zend_Json_Decoder::decode(
			$result-&gt;getBody(),
			Zend_Json::TYPE_OBJECT
		);
		return $response;
	}
	public function getCoordinates($address)
	{
		$response = $this-&gt;_getGeocodedLatitudeAndLongitude($address);
		$return = array();
		if(isset($result-&gt;Placemark[0]-&gt;Point-&gt;coordinates[1])){
			$return(
			'lat' =&gt; $result-&gt;Placemark[0]-&gt;Point-&gt;coordinates[1];
			'lon' =&gt; $result-&gt;Placemark[0]-&gt;Point-&gt;coordinates[0];
			);
		}else{
			$return = null;
		}
		return $return;
	}
	private function getGeocodingUri()
	{
		return 'http://maps.google.com/maps/geo';
	}
}
?&gt;
</pre>
<h3>Usage</h3>
<p>Alright, that was pretty easy. Now we just have to implement this in our controller. Here is a sample model that uses the Geocoder class to return geotagged User objects.<br />
<strong>models/User.php</strong></p>
<pre class="brush: php;">
class User extends Zend_Db_Table_Abstract{
	protected $_name = 'users';
	protected $key;
	protected $geocoder;

	public function init()
	{
		$this-&gt;key = Zend_Registry::get('google')-&gt;google_map_key;
		$this-&gt;geocoder = new Geocoder($this-&gt;key);

	}
	public function getUsersAndGeocode()
	{
		$result = $this-&gt;fetchAll();

		$users    = $result-&gt;_toArray();
		foreach($users as $user)
		{
			$address = &quot;{$user['address']} {$user['city']} {$user['state']} {$user['zip']}&quot;;

			$latlon = $this-&gt;geocoder-&gt;getCoordinates($address);
			if($latlon)
			{
				$user['lat'] = $latlon['lat'];

				$user['lon'] = $latlon['lon'];
			}
		}
		return $users;
	}

}
?&gt;
</pre>
<p>The controller part is a little too easy. We will setup a reference to our user table and create a map action. Within the map action we get all of users and geocode them. We pass that collection to our view. This file should be located here:<br />
<strong>controllers/UserController.php</strong></p>
<pre class="brush: php;">
class UserController extends Zend_Controller_Action{
	protected $user_table;
	public function init()
	{
		//database connectivity stuff is up to you

		$this-&gt;user_table = new User();
	}
	public function mapAction()
	{

		$users = $this-&gt;user_table-&gt;getUsersAndGeocode();
		$this-&gt;view-&gt;users = $users;
	}
}
?&gt;
</pre>
<p>And finally, the view. Here we will create our map div, load the Google Maps API (don’t forget to sub out your key in the script src). We are using a custom marker here (personIcon); you can add your own image here by changing the path to your image. I recommend the image be pretty small with a transparent background. Given our current setup, this file would be located at this path:<br />
<strong>views/scripts/user/map.phtml</strong></p>
<pre class="brush: php;">
&lt;div id=&quot;map&quot;&gt;

&lt;noscript&gt;
&lt;center&gt;
&lt;strong&gt;To view the map feature, you need to have Javascript enabled. If you are unsure about how to turn Javascript support on, please&lt;/p&gt;
&lt;p&gt;read Google's instructions found here: &lt;a href=&quot;https://www.google.com/support/adsense/bin/answer.py?hl=en&amp;amp;answer=12654&quot; target=&quot;_blank&quot;&gt;LINK&lt;/a&gt;&lt;/strong&gt;

&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;&lt;/noscript&gt;
&lt;/div&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js&quot;&gt;&lt;/script&gt;

&lt;!--
&lt;script type=&quot;text/javascript&quot; src=&quot;http://maps.google.com/maps?file=api&amp;amp;amp;v=2&amp;amp;amp;sensor=false&amp;amp;amp;key=your_key&quot;&gt;&lt;/script&gt;
--&gt;

&lt;script type=&quot;text/javascript&quot;&gt;
 //Sorry, I love jquery! If you don't use window.onload = function(){initialize();}
    $(document).ready(function(){
        initialize();

    });
var map;
var personIcon;
function initialize() {
    if(GBrowserIsCompatible){

        map = new google.maps.Map2(document.getElementById(&quot;thurtene_map&quot;));
        map.setUIToDefault();
        map.setCenter(new google.maps.LatLng('48.858001709', '2.29460000992'), 4);
        &lt;? endif; ?&gt;

        personIcon            = new GIcon();
  /**
  * Change this marker to be a small transparent custom image
  *
  */

        personIcon.image      = '/img/common/custom_marker.png';
        personIcon.shadow     = &quot;http://www.google.com/mapfiles/shadow50.png&quot;;
        personIcon.iconSize   = new GSize(32,32);
        personIcon.shadowSize = new GSize(37,34);

        personIcon.iconAnchor = new GPoint(9,34);
        personIcon.infoWindowAnchor = new GPoint(9,2);
    }
    addOverlays(map);
}

function personMarker(point, index, dto){
 //set our marker to be the custom icon we created
    markerOptions = {icon:personIcon};
    var marker = new GMarker(point, markerOptions);

/**
 * This is the content in the info bubble
 */
    GEvent.addListener(marker, 'click', function(){
       marker.openInfoWindowHtml(
            '&lt;h3&gt;&lt;a href=&quot;/profile/view/'+dto.user_id+'&quot;&gt;'+dto.user_first+' '+ dto.user_last+'&lt;/a&gt;&lt;/h3&gt;
'
            +dto.user_address+'

'
            +dto.user_city+'
'
            +dto.user_state+' '+dto.user_zip
        );

    });
    return marker;
}
/*
* Here is where we loop through our users and create new markers for each

*/
function addOverlays(map){
    &lt;?php
  $geo = $this-&gt;users-&gt;_toArray();
        $size = sizeof($geo);

 ?&gt;
    &lt;? for($i = 0; $i &lt; $size; $i++): ?&gt;
                var latLon = new GLatLng(&lt;?php echo $geo[$i]['lat'];?&gt;, &lt;?php echo $geo[$i]['lon'];?&gt;);

                map.addOverlay(personMarker(latLon, &lt;?=$i?&gt;, &lt;?=Zend_Json::encode($geo[$i])?&gt;));
    &lt;?php endfor; ?&gt;
}
&lt;/script&gt;
</pre>
<p>Post a comment if you have any questions.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bitconsultants.net/2010/geocoding-with-google-maps-and-the-zend-framework/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>IT Consulting</title>
		<link>http://www.bitconsultants.net/2009/it-consulting/</link>
		<comments>http://www.bitconsultants.net/2009/it-consulting/#comments</comments>
		<pubDate>Wed, 07 Oct 2009 20:22:01 +0000</pubDate>
		<dc:creator>Rob</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.bitconsultants.net/?p=108</guid>
		<description><![CDATA[We offer St. Louis small business a host of corporate-sized IT Services.]]></description>
			<content:encoded><![CDATA[<p>We offer St. Louis small business a host of corporate-sized IT Services.</p>
<p><a href="http://www.bitconsultants.net/it-services/">Read More</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.bitconsultants.net/2009/it-consulting/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fighting Difficult Viruses</title>
		<link>http://www.bitconsultants.net/2009/fighting-difficult-viruses/</link>
		<comments>http://www.bitconsultants.net/2009/fighting-difficult-viruses/#comments</comments>
		<pubDate>Tue, 06 Oct 2009 20:18:00 +0000</pubDate>
		<dc:creator>Rob</dc:creator>
				<category><![CDATA[Malware]]></category>
		<category><![CDATA[Tips]]></category>

		<guid isPermaLink="false">http://www.fangledcontraption.com/?p=37</guid>
		<description><![CDATA[Tips and tricks for hunting down evasive pests.]]></description>
			<content:encoded><![CDATA[<p>Let&#8217;s face fact, most commercial AV publishers can&#8217;t get everything. They do a good job keeping known viruses off your system by scanning for the existence of certain files (not checking content), certain registry entries or running processes/services. So how do you get rid of a virus that your AV vendor doesn&#8217;t know about? Here are the tactics I use, with a high rate of success. Please not that the order is of no consequence, all of these tasks are fine to be performed atomically.</p>
<h2>Fix 1: Get the computer to boot:</h2>
<p style="padding-left: 30px;">Does the computer boot? If not, what messages (if any) are you getting? If you are getting error messages, Google them; most likely, you are not the first person to experience this problem. Careful where you click, though. Assuming you have eliminated the possibility of hardware failure (and that you have properly backed your important documents up): if the computer doesn&#8217;t boot, you could have a boot sector virus. To get rid of these, load the Windows CD and press &#8216;R&#8217; when prompted to enter the Recovery Console. Type these commands:</p>
<ul style="padding-left: 60px;">
<li>fixmbr</li>
<li>bootcfg /list
<ul>
<li>If no entries are listed, type bootcfg /rebuild</li>
<li>Enter the numerical identifier for your Windows installation (likely the number 1)</li>
<li>Type Y or Yes to add installation to boot list</li>
<li>Provide a load identifier (e.g. Windows XP)</li>
<li>Enter /fastdetect</li>
</ul>
</li>
</ul>
<h2>Fix 2: Finding the culprits:</h2>
<p style="padding-left: 30px;">If it&#8217;s possible, hook the infected hard drive up to a different machine and scan it using <a title="MalwareBytes" href="http://www.malwarebytes.org" target="_blank">MalwareBytes</a>, removing any infected objects it finds. Now, knowledge of an approximate time the virus was contracted is REALLY helpful here, though not necessary. If you can&#8217;t hook it up to another computer, boot the computer into safe mode (press F8 as the computer is booting) and choose Safe Mode (with Networking).</p>
<p style="padding-left: 30px;">Whether you have booted to this hard drive or are viewing it from a different computer, take the following actions:</p>
<p style="padding-left: 30px;">Open My Computer &gt; C:.  Go to Tools &gt; Folder Options &gt; View tab &gt; Check &#8220;Show hidden files and folders&#8221;; uncheck &#8220;Hide extensions for known file types&#8221;, &#8220;Hide protected operating system files&#8221; and &#8220;Use simple file sharing&#8221;. &gt; Change to detail view and sort by Date Modified, more than likely, all of the virus files are going to have the same date in this field. Now is the tedious process of looking (and deleting/renaming), be sure you aren&#8217;t deleting important system files by using Google. Here are the important places to look, though they can be anywhere:</p>
<ul>
<li>C:\</li>
<li>C:\WINDOWS\</li>
<li>C:\Recycler\S-1-{RANDOM}\</li>
<li>C:\WINDOWS\Tasks</li>
<li>C:\WINDOWS\system32\</li>
<li>C:\WINDOWS\system32\drivers\</li>
<li>C:\Program Files\{ANY RECENT SOFTWARE THAT IS NEW AN YOU DIDN&#8217;T CHOOSE TO INSTALL}</li>
<li>%TEMP% (Start &gt; Run &gt; %TEMP% &gt; OK)</li>
<li>%USERPROFILE%\Desktop (look for installer files)</li>
<li>&#8220;%USERPROFILE%\Local Settings\Temporary Internet Files\&#8221;</li>
</ul>
<p style="padding-left: 30px;">Open Windows Firewall through Start &gt; Control Panel &gt; Windows Firewall, click on the Exceptions tab and check for any programs that you didn&#8217;t specifically authorize, remove the exception if there are unknown entries.</p>
<h2>Fix 3: Stop the rogue processes from loading at startup</h2>
<p style="padding-left: 30px;"><a title="Autoruns" href="http://live.sysinternals.com/autoruns.exe" target="_blank">Download Autoruns from Sysinternals</a>. Run the program and select the Logon tab. Check for malicious software under the headings listed below, unchecking each malicious item:</p>
<ul>
<li> HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run</li>
<li>HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run</li>
<li>C:\Documents and Settings\All Users\Start Menu\Programs\Startup</li>
<li>C:\Documents and Settings\username\Start Menu\Programs\Startup</li>
</ul>
<p style="padding-left: 30px;">Move to the Services tab and look for items where the Publisher is missing, these items are frequently (not always) suspect. Remove malicious services by unchecking them</p>
<p style="padding-left: 30px;">Select the &#8220;Image Hijacks&#8221; tab, the only item that should be present is &#8220;Your Image File Name Here without a path&#8221;. If anything else is present, uncheck it.</p>
<p style="padding-left: 30px;">Close Autoruns</p>
<h2>Cleanup</h2>
<p style="padding-left: 30px;">Download <a title="CCleaner" href="http://www.filehippo.com/download_ccleaner/" target="_blank">CCleaner</a>, install and run it with the default settings to remove all of your temporary files. If you don&#8217;t have a good Firewall and don&#8217;t have money to spend, download <a href="http://personalfirewall.comodo.com/download_firewall.html" target="_blank">Comodo</a> or <a href="http://www.zonealarm.com/security/en-us/zonealarm-pc-security-free-firewall.htm" target="_blank">ZoneAlarm</a>. Turn off System Restore by right-clicking My Computer and selecting Properties.  Select the System Restore tab and check the Turn off System Restore checkbox &gt; Select Apply (may take a moment or two). Once it is responding again, uncheck the box and it will create a new restore point (that doesn&#8217;t have the virus files).</p>
<div style="border:1px solid #993300; padding:5px; background-color:#FBE3E4;">
<h3><span style="color: #993300;">Disclaimer</span></h3>
<p><span style="color: #993300;">I cannot be held liable for you bricking your computer. It is your responsibility to take the necessary precautions when altering system files and folders. I make no guarantee about the fitness of these instructions, their application to your computer system and settings and accept no liability for any system errors, serious or not that result from following these directions. The riskiest items in this posting are:</span></p>
<ul>
<li><span style="color: #993300;">the fixmbr command could cause some problems (warning is given when command is run)</span></li>
<li><span style="color: #993300;">Deleting files in the WINDOWS, system32, drivers directories is extremely risky, check files if you are unsure<br />
</span></li>
<li><span style="color: #993300;">Using Autoruns can be risky; if you uncheck important system processes your computer may no longer boot.<br />
</span></li>
</ul>
<p><span style="color: #993300;">That being said, if you have problems, post in the comments section and I will try to help.</span></div>
]]></content:encoded>
			<wfw:commentRss>http://www.bitconsultants.net/2009/fighting-difficult-viruses/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Deleted File Recovery</title>
		<link>http://www.bitconsultants.net/2009/deleted-file-recovery/</link>
		<comments>http://www.bitconsultants.net/2009/deleted-file-recovery/#comments</comments>
		<pubDate>Tue, 06 Oct 2009 18:17:58 +0000</pubDate>
		<dc:creator>Rob</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Disk Tools]]></category>
		<category><![CDATA[Downloads]]></category>

		<guid isPermaLink="false">http://bitconsultants.net/?p=3</guid>
		<description><![CDATA[We can recover files that you thought were long gone.]]></description>
			<content:encoded><![CDATA[<p>Browsing the interwebs this morning, I came across a great program that is made by the fine folks who made <a title="CCLeaner" href="http://www.ccleaner.com/" target="_blank">CCleaner</a> (my favorite disk cleanup program). The program is called <a title="Recuva" href="http://www.google.com/url?sa=t&amp;source=web&amp;ct=res&amp;cd=1&amp;url=http%3A%2F%2Fwww.piriform.com%2Frecuva&amp;ei=1ofLSsGbLIqosgOKt4CYAQ&amp;usg=AFQjCNEGa6mVKDuZ6f9XgpNYDpVereCAiw" target="_blank">Recuva</a>, and though it&#8217;s title is a bit uninspiring it has proven to be fairly awesome at file recovery. I put a couple of junk files in my recycle bin and emptied it than waited an hour or two while performing my normal routine. I ran the default scan on C: just to see what deleted files it would recover and was fairly shocked when it found around 2,000 items, some of which I had deleted 6 &#8211; 8 months ago.  The better part, is that it actually recovered the files perfectly.</p>
<p>Some of the other benefits of this free program are:</p>
<ul>
<li>Search by file type</li>
<li>Search specific drives</li>
<li>Hidden system files</li>
<li>Securely overwritten files</li>
<li>Zero byte files</li>
<li>It&#8217;s Free!</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.bitconsultants.net/2009/deleted-file-recovery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Making Podcasts</title>
		<link>http://www.bitconsultants.net/2009/making-podcasts/</link>
		<comments>http://www.bitconsultants.net/2009/making-podcasts/#comments</comments>
		<pubDate>Mon, 05 Oct 2009 15:28:20 +0000</pubDate>
		<dc:creator>Rob</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[podcast]]></category>
		<category><![CDATA[Tips]]></category>

		<guid isPermaLink="false">http://www.bitconsultants.net/?p=167</guid>
		<description><![CDATA[If you want to start making podcasts, it can be a bit difficult to understand how you go about the process. Making a podcast essentially requires three tasks (with various sub-tasks). The basic workflow is: Record the podcasts Create an XML file that describes the...]]></description>
			<content:encoded><![CDATA[<p>If you want to start making podcasts, it can be a bit difficult to understand how you go about the process. Making a podcast essentially requires three tasks (with various sub-tasks). The basic workflow is:</p>
<ol>
<li>Record the podcasts</li>
<li>Create an XML file that describes the content (author, file location, etc.)</li>
<li>Upload the audio and XML files to a web server</li>
</ol>
<p>The unlisted step 4 is share the link to your feed (XML file) with friends/colleagues/customers. That is really all there is to it. If you want iTunes to follow you, of course there is a little more work that goes into that.</p>
<p>If that seems straightforward, except for the XML part, I have generated a little tool to help you on your way. It won&#8217;t record the podcast for you or make you like the sound of your own voice, but it will generate the XML file you need.</p>
<p><a href="http://bitconsultants.net/podcasts/" target="_self">Podcast XML Generator</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.bitconsultants.net/2009/making-podcasts/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Malware Appears on New York Times Homepage</title>
		<link>http://www.bitconsultants.net/2009/malware-appears-on-new-york-times-homepage/</link>
		<comments>http://www.bitconsultants.net/2009/malware-appears-on-new-york-times-homepage/#comments</comments>
		<pubDate>Thu, 10 Sep 2009 09:40:28 +0000</pubDate>
		<dc:creator>Rob</dc:creator>
				<category><![CDATA[Malware]]></category>

		<guid isPermaLink="false">http://www.bitconsultants.net/?p=4</guid>
		<description><![CDATA[Autorun virus is a nasty one. Plus, how to get rid of the badder-than-it-seems malware.]]></description>
			<content:encoded><![CDATA[<div style="font-family: -moz-fixed; font-size: 13px;" lang="x-western">
<dl id="attachment_5" class="wp-caption alignleft" style="width: 261px;">
<dt class="wp-caption-dt"><img class="size-full wp-image-5" title="Matryoshka+doll-1" src="http://www.bitconsultants.net/wp-content/uploads/2009/10/Matryoshka+doll-1.jpg" alt="Matryoshka Doll" width="251" height="228" /></dt>
</dl>
<p><a href="http://mediamemo.allthingsd.com/20090913/home-delivery-the-new-york-times-serves-up-some-malware/">http://mediamemo.allthingsd.com/20090913/home-delivery-the-new-york-times-serves-up-some-malware/</a></div>
<div>I have already seen this trojan three times in the past week, it is  called &#8220;Windows Police Pro&#8221;. To remove it perform the following actions  (appx. 20 minutes):</p>
<p>* Turn off System Restore<br />
* Ctrl Alt Delete &#8211; end task Windows Police Pro.exe, also<br />
svchast.exe or svchasts.exe if they are running<br />
o If you can&#8217;t open task manager, run FixExe.reg<br />
* Navigate to the Windows Police Pro folder within program files and<br />
delete the entire folder<br />
* Download Malware Bytes here<br />
<a href="http://dw.com.com/redir?edId=3&amp;siteId=4&amp;oId=3001-8022_4-10804572&amp;ontId=8022_4&amp;spi=3426e77389633e655850b415cc3640d6&amp;lop=txt&amp;pid=11102549&amp;mfgId=6290020&amp;merId=6290020&amp;pguid=qf7KTAoPjF0AAEIGeqEAAAEr&amp;destUrl=http%3a%2f%2fsoftware-files.download.com%2fsd%2fda0BZEbQkGOVDsTmrswO8tb-0gEwKNG-rq3Fk9783HJsdPVgE9pMw_9oifebezAdxZfBihT197GCE-0KGRJcM7QZyYHRWyCi%2fsoftware%2f11102549%2f10804572%2f3%2fmbam-setup.exe%3flop%3dlink%26ptype%3d1901%26ontid%3d8022%26siteId%3d4%26edId%3d3%26spi%3d3426e77389633e655850b415cc3640d6%26pid%3d11102549%26psid%3d10804572">&lt;http://dw.com.com/redir?edId=3&amp;siteId=4&amp;oId=3001-8022_4-10804572&amp;ontId=8022_4&amp;spi=3426e77389633e655850b415cc3640d6&amp;lop=txt&amp;pid=11102549&amp;mfgId=6290020&amp;merId=6290020&amp;pguid=qf7KTAoPjF0AAEIGeqEAAAEr&amp;destUrl=http%3a%2f%2fsoftware-files.download.com%2fsd%2fda0BZEbQkGOVDsTmrswO8tb-0gEwKNG-rq3Fk9783HJsdPVgE9pMw_9oifebezAdxZfBihT197GCE-0KGRJcM7QZyYHRWyCi%2fsoftware%2f11102549%2f10804572%2f3%2fmbam-setup.exe%3flop%3dlink%26ptype%3d1901%26ontid%3d8022%26siteId%3d4%26edId%3d3%26spi%3d3426e77389633e655850b415cc3640d6%26pid%3d11102549%26psid%3d10804572&gt;</a>,<br />
install, update and run a quick scan<br />
* Remove all found viruses when it is finished<br />
* Check for the presence of C:\WINDOWS\system32\dddesot.dll and/or<br />
C:\WINDOWS\svchasts.exe, delete if they are there<br />
* Reboot computer<br />
* Turn on System Restore</p>
<div style="font-family: -moz-fixed; font-size: 13px;" lang="x-western">It is really important that you get rid of this trojan as quickly as  possible because a more insidious (and much more difficult to remove)  virus I have been seeing a lot of is using this easy-to-remove scareware  as its vehicle for getting onto computers. I guess this is more of  Matryoshka doll rather  than a trojan horse, in that the visible trojan is masking itself as the  real virus. After you have removed the virus, make sure that there is no  autorun.inf in root C (remember, right-click &gt; Explore). If there is an  autorun file, run the attached batch script (it&#8217;s from Trend Micro).</p>
<p>Questions?</p>
<p>P.S. Did you know that if a virus is blocking you from running programs  (regedit, task manager, add/remove programs, etc.) you can typically run them  through command.com?</p></div>
<div style="font-family: -moz-fixed; font-size: 13px;" lang="x-western">Start &gt; Run &gt; command.com &gt; OK<br />
Type regedit to open&#8230; well, you know. appwiz.cpl to open add/remove  programs, etc. I found this out recently and it has been  extremely helpful.</div>
</div>
<div style="font-family: -moz-fixed; font-size: 13px;" lang="x-western">
<pre>
<fieldset>
<legend>fixtm.reg</legend>
</fieldset>

<code>REGEDIT4

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System]
"DisableTaskMgr"=-
</code></pre>
</div>
<div style="font-family: -moz-fixed; font-size: 13px;" lang="x-western">
<pre>
<fieldset>
<legend>FixExe.reg</legend>
</fieldset>

<code>REGEDIT4

[HKEY_CLASSES_ROOT\exefile\shell\open\command]
@="\"%1\" %*"

Batch file
</code>
<code>&lt;@echo off
:: SET_NO_DRIVE_OTORUN
reg add HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer /v NoDriveTypeAutoRun /t REG_DWORD /d 0x0ff /f

:: GET_DRIVES
for /f "tokens=1 delims=:" %%j in ('reg query hklm\system\mounteddevices ^| findstr \DosDevices\') do (
echo %%j &gt;&gt; drives
)

:: REMOVE_\DosDevices\_PREFIX
for /f "tokens=3 delims=\" %%j in (drives) do (
echo %%j &gt;&gt; drives.txt
)
del /q /f drives &gt; nul

:: REMOVE_SPACE
for /f "tokens=1 delims= " %%j in (drives.txt) do (
echo %%j: &gt;&gt; drives
)
del /q /f drives.txt &gt; nul

:: CHECK_DRIVE_TYPE
for /f %%j in (drives) do (
fsutil fsinfo drivetype %%j | findstr "Fixed " &gt;&gt; fdtype
fsutil fsinfo drivetype %%j | findstr "Removable " &gt;&gt; frtype
)
del /q /f drives &gt; nul

:: GET_FDRIVES
for /f "tokens=1* delims= " %%j in (fdtype frtype) do (
echo %%j &gt;&gt; dtype
)
del /q /f fdtype &gt; nul
del /q /f frtype &gt; nul

:: REMOVE_SPACE1
for /f "tokens=1 delims= " %%j in (dtype) do (
echo %%j &gt;&gt; drives
)
del /q /f dtype &gt; nul

:: DEL_DRIVE_A_FROM_LIST
sort drives &gt;&gt; sort
type sort | findstr "A" &gt; nul
if errorlevel 0 for /f "tokens=1 skip=1" %%j in (sort) do (
echo %%j &gt;&gt; sorted
)
del /q /f drives &gt; nul
del /q /f sort &gt; nul

:: CREATE_OTORUN_FOLDER
for /f %%j in (sorted) do (
md %%j\AUTORUN.INF
attrib +s +h +r /d /s %%j\AUTORUN.INF
)
del /q /f sorted &gt; nul

echo Press any key to close this window..
pause &gt; nul&gt;
</code></pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.bitconsultants.net/2009/malware-appears-on-new-york-times-homepage/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Free Cloud Storage/Backup</title>
		<link>http://www.bitconsultants.net/2009/free-cloud-storagebackup/</link>
		<comments>http://www.bitconsultants.net/2009/free-cloud-storagebackup/#comments</comments>
		<pubDate>Thu, 03 Sep 2009 21:56:29 +0000</pubDate>
		<dc:creator>Rob</dc:creator>
				<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://www.fangledcontraption.com/?p=47</guid>
		<description><![CDATA[Windows Live SkyDrive offers 25 GB of cloud storage for free, use it to back up your important files.]]></description>
			<content:encoded><![CDATA[<p>Utilizing Gladinet and Windows Live SkyDrive, you can have 25 GB free cloud-based storage to backup to (you may even get a sneak preview of the yet to be released Office 2010 web applications), for FREE!</p>
<p>Here&#8217;s what you do:</p>
<ul>
<li>Go to <a href="http://skydrive.live.com" target="_blank">http://<cite><strong>skydrive</strong>.live.com</cite></a> and either sign-in or sign-up</li>
<li>Upload a Word/Excel/PowerPoint 2007 document. Select the file you uploaded, click on &#8220;Edit&#8221; (at the time of this writing, Word was not available)</li>
<li>Download Gladinet from here: <a href="http://www.gladinet.com/p/download_starter_direct.htm" target="_blank">http://www.gladinet.com/p/download_starter_direct.htm</a></li>
<li>Install the free version</li>
<li>Mount a network drive, select Windows SkyDrive and enter your Live credentials</li>
<li>Use Comodo backup or SyncBack to setup backups to the newly mounted network drive
<ul>
<li>Weekly/monthly backups may be best as Gladinet limits the number of items that can be transferred per month in the free version.</li>
</ul>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.bitconsultants.net/2009/free-cloud-storagebackup/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fix Windows 7 Flash Crashing, Remote Desktop Issue</title>
		<link>http://www.bitconsultants.net/2009/fix-windows-7-flash-crashing-remote-desktop-issue/</link>
		<comments>http://www.bitconsultants.net/2009/fix-windows-7-flash-crashing-remote-desktop-issue/#comments</comments>
		<pubDate>Wed, 12 Aug 2009 04:55:49 +0000</pubDate>
		<dc:creator>Rob</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Bugs]]></category>
		<category><![CDATA[Fix]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Remote Desktop]]></category>
		<category><![CDATA[Windows 7]]></category>

		<guid isPermaLink="false">http://www.bitconsultants.net/?p=203</guid>
		<description><![CDATA[Fix problems with Flash crashing browsers on Windows 7.]]></description>
			<content:encoded><![CDATA[<div id="gads" style="width: 340px; float: right;"><script type="text/javascript">// <![CDATA[
google_ad_client = "pub-4761320180230999";
/* 336x280, created 4/15/10 */
google_ad_slot = "4518447987";
google_ad_width = 336;
google_ad_height = 280;
// ]]&gt;</script><br />
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script></div>
<div>If you have upgraded to the 32 or 64 bit versions of Windows 7, you may have noticed the following symptoms:</p>
<ul>
<li>Flash crashes all browsers except 32 bit Internet Explorer</li>
<li>Remote Desktop stuck on &#8220;Configuring Remote Session&#8221;</li>
<li>Games requiring sound crash</li>
<li>Sound mixer hangs when you click on the volume control</li>
</ul>
<p>This is caused by an unpublished incompatibility between Windows 7 and the IDT Sound driver utility. This can be removed by going to add/remove programs:</p>
<p>Start &gt; Run &gt; type: appwiz.cpl &gt; select IDT Sound &gt; Remove</p>
<div id="tgads" style="float: left; width: 300px;"><script type="text/javascript">// <![CDATA[ google_ad_client = "pub-4761320180230999"; /* 300x250, created 5/29/10 */ google_ad_slot = "6915058446"; google_ad_width = 300; google_ad_height = 250; // ]]&gt;</script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> </script></div>
<p><strong>Caveat:</strong> removing this driver utility can impair some functionality, but will still allow you to adjust audio settings through Windows. The driver should be available from your computer manufacturer&#8217;s website  (you may want to confirm this by browsing the support section of their  website).</p>
<p>One last thing, reinstalling IDT Audio seems to make it all work again; however, watching Flash video in non 32 bit IE browsers causes some serious CPU spikes along with audiodg. Pick your poison, I guess&#8230;</p>
<div id="tgads"><script type="text/javascript">// <![CDATA[
google_ad_client = "pub-4761320180230999";
/* 468x15, created 5/5/10 */
google_ad_slot = "9379654790";
google_ad_width = 468;
google_ad_height = 15;
// ]]&gt;</script><br />
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script></div>
<p>Leave a comment if you have a question</p>
<h3>If you liked this article, you might also like:</h3>
<p></p>
<style type="text/css">
.inlinks li{list-style:none;display:inline;padding:5px}
</style>
<ul class="inlinks">
<li><a href="http://www.bitconsultants.net/2009/top-5-ways-to-secure-windows/"><img style="border:1px solid #000" width="250" src="http://www.bitconsultants.net/wp-content/uploads/2009/08/securewindows.png" alt="Top 5 Ways to Secure Windows" title="Top 5 Ways to Secure Windows" /></a></li>
<li><a href="http://www.bitconsultants.net/2009/family-safe-internet-in-7-minutes/"><img  style="border:1px solid #000"  width="250" src="http://www.bitconsultants.net/wp-content/uploads/2009/08/familysafe.png" alt="Family Safe Internet in 7 Minutes" title="Family Safe Internet in 7 Minutes" /></a></li>
<li><!-- Windows 7 How to Windows 7 Professional, Ultimate and Home Professional --><script type="text/javascript"><!--
google_ad_client = "pub-4761320180230999";
/* 250x250, created 7/25/10 */
google_ad_slot = "5233090370";
google_ad_width = 250;
google_ad_height = 250;
//-->
</script><br />
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></li>
</ul>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.bitconsultants.net/2009/fix-windows-7-flash-crashing-remote-desktop-issue/feed/</wfw:commentRss>
		<slash:comments>29</slash:comments>
		</item>
		<item>
		<title>Explorer: Executable files won&#8217;t launch</title>
		<link>http://www.bitconsultants.net/2009/explorer-executable-files-wont-launch/</link>
		<comments>http://www.bitconsultants.net/2009/explorer-executable-files-wont-launch/#comments</comments>
		<pubDate>Fri, 08 May 2009 18:52:19 +0000</pubDate>
		<dc:creator>Rob</dc:creator>
				<category><![CDATA[Troubleshooting]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Fix]]></category>
		<category><![CDATA[Windows XP]]></category>

		<guid isPermaLink="false">http://www.fangledcontraption.com/?p=46</guid>
		<description><![CDATA[Recently, I have dealt with a few computers where malware had wrecked Windows Explorer&#8217;s handling of executable files. Whenever you attempt to launch an executable file, you are told Windows doesn&#8217;t know what to do with the file, sometimes being prompted to download the file...]]></description>
			<content:encoded><![CDATA[<p>Recently, I have dealt with a few computers where malware had wrecked Windows Explorer&#8217;s handling of executable files. Whenever you attempt to launch an executable file, you are told Windows doesn&#8217;t know what to do with the file, sometimes being prompted to download the file you were trying to launch. Right-click the file linked <a href="http://securityresponse.symantec.com/avcenter/UnHookExec.inf">here</a> and save it to your desktop. Once it&#8217;s downloaded, right-click it and select Install. This should fix Windows handling of executable files. If you can&#8217;t get anything to launch, try showing file extensions by opening a folder or My Computer and selecting Tools &gt; Hide extensions for known file types (uncheck the box); find the file you want to launch (e.g. &#8220;firefox.exe&#8221;), change the file extension to com (&#8220;firefox.com&#8221;).  It could be that only the exe file handling has been wrecked.</p>
<p>More information from Symantec (source of the fix) here: <a href="http://www.symantec.com/security_response/writeup.jsp?docid=2004-050614-0532-99" target="_blank">http://www.symantec.com/security_response/writeup.jsp?docid=2004-050614-0532-99</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.bitconsultants.net/2009/explorer-executable-files-wont-launch/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
