<?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>MentorMate Company Blog</title>
	<atom:link href="http://mentormate.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://mentormate.com/blog</link>
	<description></description>
	<lastBuildDate>Tue, 09 Mar 2010 20:01:32 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Using UIWebView with local CSS and JavaScript resources</title>
		<link>http://mentormate.com/blog/uiwebview-local-css-javascript-resources/</link>
		<comments>http://mentormate.com/blog/uiwebview-local-css-javascript-resources/#comments</comments>
		<pubDate>Tue, 09 Mar 2010 17:16:50 +0000</pubDate>
		<dc:creator>Iordan</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[uiwebview]]></category>

		<guid isPermaLink="false">http://mentormate.com/blog/?p=433</guid>
		<description><![CDATA[With the great significance of the large screen on iPhone / iPod Touch, the graphical user interfaces experience of iPhone applications are more important than on other mobile platforms. One possible approach to make your application more interactive and dynamic is to use the default iPhone Design Resource UIWebView with local style definition (CSS) and JavaScript.]]></description>
			<content:encoded><![CDATA[<div id="_mcePaste">This post will cover the basic setup and creation of an application with web content for iPhone that will load local CSS and some useful JavaScript functions. Most of these hints I found partially in different blogs and forums listed in the reference section. The idea is to collect all them together. You can use the following technique to create a more attractive application design.</div>
<p><br/></p>
<div id="_mcePaste">Creating an application using UIWebView control is not the focus of this post. Here is a helpful beginner’s tutorial for creating an application using UIWebView. We assume that you are already familiar with this topic.</div>
<p><br/></p>
<h3>UIWebView load</h3>
<p>Our work will start with a little change in calling load method of the UIWebView instance. Instead of <em>loadRequest</em></p>
<pre class="brush: plain;">[[webView graphWebView] loadRequest:requestObj];</pre>
<p>we use the <em>loadHTMLString</em> method, providing an NSString object that contains HTML code of our page as a parameter:</p>
<pre class="brush: plain;">[[webView graphWebView] loadHTMLString:htmlPageStr baseURL:baseURL];</pre>
<p>To get this page to load resources and styles correctly, you have to set up the right URL:</p>
<h3>Set baseURL property of UIWebView to refer your bundle&#8217;s resources directory</h3>
<div id="attachment_437" class="wp-caption alignright" style="width: 143px"><a style="float: right;" href="http://mentormate.com/blog/wp-content/uploads/2010/03/screen1.png" target="_blank"><img class="size-medium wp-image-437    " src="http://mentormate.com/blog/wp-content/uploads/2010/03/screen1-208x300.png" alt="MentorMate" width="133" height="192" /></a><p class="wp-caption-text">Initial loading screen with progress indicator</p></div>
<p>On the following reference<sup>[2]</sup> you can find a short and clear revision of the problem of displaying local images in a UIWebView. To use relative paths or files in UIWebView, you have to load the HTML into the view with the correct baseURL parameter. The following example shows how to do this:</p>
<pre class="brush: plain;">NSString *path = [[NSBundle mainBundle] bundlePath];
NSURL *baseURL = [NSURL fileURLWithPath:path];</pre>
<p>And then call load method of UIWebView provide above NSURL parameter:</p>
<pre class="brush: plain;">[[webView graphWebView] loadHTMLString:pageStr baseURL:baseURL];</pre>
<p>A short explanation: An <em>NSBundle</em> object represents a location in the file system that groups code and resources that can be used in a program. <em>mainBundle </em>method returns the <em>NSBundle</em>object that corresponds to the directory where the current <em>application executable</em> is located. <em>bundlePath </em>instance method of <em>NSBundle</em> returns the full pathname of the receiver’s bundle directory. <em>NSURL</em> class is used to create an object which will hold the URL information. It provides a way to manipulate URLs and the resources they reference. <em>loadHTMLString</em> method of UIWebView has parameter <em>baseURL</em> that accept an NSURL object instead of a pathname as the file reference. Giving the above baseURL to UIWebView, you can refer to your bundle&#8217;s resources directory like this:</p>
<pre class="brush: plain;">&lt;img src=&quot;myimage.png&quot;&gt;</pre>
<p>Or from within CSS like this:</p>
<pre class="brush: plain;">background-image: url(loading.gif)</pre>
<p>It’s important to note that resources (images, CSS and JavaScript Files) inside your application bundle are at the root of the bundle, even if you place them in an separate group (folder) in your project.</p>
<p>Giving the correct URL to UIWebView will allow you to refer to local resources in your page, but it does not work in all cases. If you want to use JavaScipt, some additional settings have to be done.</p>
<h3>Link a CSS and JavaScript files</h3>
<div id="attachment_438" class="wp-caption alignright" style="width: 140px"><a href="http://mentormate.com/blog/wp-content/uploads/2010/03/screen2.png" target="_blank"><img class="size-medium wp-image-438  " src="http://mentormate.com/blog/wp-content/uploads/2010/03/screen2-204x300.png" alt="MentorMate" width="130" height="192" /></a><p class="wp-caption-text">Second loading screen with progress indicator</p></div>
<p>Now you can use generic HTML technique to add CSS and JavaScript to the web page and displaying in a UIWebView.</p>
<pre class="brush: plain;">&lt;link href=&quot;default.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; /&gt;
 &lt;script type=&quot;text/javascript&quot; src=&quot;showhide.js&quot;&gt;&lt;/script&gt;</pre>
<p>Do not forget to add your CSS and Javascript files to the xCode project (if you are using external files).</p>
<p>Some additional actions have to be taken before starting your application and using JavaScript functions.<sup>[3]</sup></p>
<p>XCode setup (*.js) javascript as some type of source code needs to be compiled in the application. We would like to include it as a resource so I&#8217;ve solved it by doing two things:</p>
<ol>
<li>Select .js file and in the &#8220;Detail&#8221; view unselect the bullseye column indicating it is compiled code</li>
<li>In the &#8220;Groups &amp; files&#8221; view expand the &#8220;Targets&#8221; tree and expand the application then go to &#8220;Copy Bundle Resources&#8221; and drag the *.js files into it.</li>
</ol>
<p>The Apple dev forums has a posted solution. <sup>[4]</sup> You need to do two things &#8211; select the .js file in your project, and turn off the checkbox that indicates that it is compiled (the &#8220;bullseye&#8221; column). If you don&#8217;t do this, you&#8217;ll get a warning in your build log about being unable to compile the file (which should be your first warning &#8211; always try to figure out and and correct any and all warnings that appear in your build).</p>
<h3>Set transparent background color for UIWebView</h3>
<div id="attachment_436" class="wp-caption alignright" style="width: 139px"><a href="http://mentormate.com/blog/wp-content/uploads/2010/03/screen3.png" target="_blank"><img class="size-medium wp-image-436  " src="http://mentormate.com/blog/wp-content/uploads/2010/03/screen3-201x300.png" alt="MentorMate" width="129" height="192" /></a><p class="wp-caption-text">Final screen with graph representation.</p></div>
<p>In our example we need to figure out a transparent background for UIWebView. On the parent View Container we have additional controls (buttons, labels) and already defined background. The following code will set this:</p>
<pre class="brush: plain;">[[webView graphWebView] setBackgroundColor:[UIColor clearColor]];&lt;/code&gt;

[[webView graphWebView] setOpaque:NO];
</pre>
<h3>Example</h3>
<p>MentorMateDemoJS is a simple application example which uses the settings described above. It is a view-based application that shows a graphical representation of some data. Application behavior consists of a predefined call with formatted data to Vvidget Service<sup>[5]</sup> for graph generation. The service returns an image that is loaded in UIWebView Design Resource. The update button is added to resend the graph request and update view.</p>
<p><span style="text-decoration: underline;">The Problem</span>: Graph image requires some time for loading.</p>
<p><span style="text-decoration: underline;">Our Decision</span>: Notify user of graph loading process by showing a progress bar during load time.</p>
<p>To achieve this, we use UIWebView with local resource of two JavaScript functions. One to show/hide notification messages and the other to visualize a progress bar during loading time. In the provided sources you can find all these steps implemented.</p>
<p><a href="http://mentormate.com/blog/wp-content/uploads/2010/03/MentorMateDemoJS.zip">Sources of the example iPhone application</a></p>
<h3>References</h3>
<ol>
<li>iPhone SDK Articles, <a title="http://www.iphonesdkarticles.com/2008/08/uiwebview-tutorial.html" rel="nofollow" href="http://www.iphonesdkarticles.com/2008/08/uiwebview-tutorial.html" target="_blank">UIWebView Tutorial</a>, August 19, 2008</li>
<li>iPhone Development Blog, <a title="http://iphoneincubator.com/blog/windows-views/uiwebview-revisited" rel="nofollow" href="http://iphoneincubator.com/blog/windows-views/uiwebview-revisited" target="_blank">UIWebView – Loading External Images and CSS</a>, February, 2009</li>
<li>StackOverflow, <a title="http://stackoverflow.com/questions/843820/iphone-uiwebview-local-resources-using-javascript-and-handling-onorientationchang" rel="nofollow" href="http://stackoverflow.com/questions/843820/iphone-uiwebview-local-resources-using-javascript-and-handling-onorientationchang" target="_blank">iPhone UIWebView local resources using Javascript and handling onorientationChange</a></li>
<li>Developer Forum, <a title="https://devforums.apple.com/message/32282#32282" rel="nofollow" href="https://devforums.apple.com/message/32282#32282" target="_blank">UIWebView and JavaScript</a>, 2009</li>
<li>Vvidget, <a title="http://www.vvidget.org/service/manual/index.html" rel="nofollow" href="http://www.vvidget.org/service/manual/index.html" target="_blank">Vvidget Server™ Reference Manual </a>, 2010</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://mentormate.com/blog/uiwebview-local-css-javascript-resources/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MentorMate&#8217;s Backup Script</title>
		<link>http://mentormate.com/blog/mentormates-backup-process/</link>
		<comments>http://mentormate.com/blog/mentormates-backup-process/#comments</comments>
		<pubDate>Thu, 25 Feb 2010 21:37:04 +0000</pubDate>
		<dc:creator>Doug</dc:creator>
				<category><![CDATA[IT]]></category>

		<guid isPermaLink="false">http://mentormate.com/blog/?p=256</guid>
		<description><![CDATA[Backups are important and automated backups help reduce error by removing the human component.  Of course it is always good to check in and make sure that everything is working properly, and audit your systems periodically to see if you need to add anything new to your backup.  MentorMate uses a script with a few simple tools to get all important information in one place and make redundant onsite and offsite backups of it.]]></description>
			<content:encoded><![CDATA[<h2>Overview</h2>
<p>The script starts by creating a copy of all of the important information in a staging area.  Keeping the staging area intact will help speed up the backup after it has been run once since rsync is used for most of the copying.  After the staging area is updated, we use rdiff-backup as our incremental backup system.  The rdiff-backup repository can then be copied to other local and offsite locations to increase reduncancy in the backup.  The output is sent by email every time the backup runs, so we are automatically updated on its status, and can correct any errors that may have taken place.</p>
<h2>Relevant Tools</h2>
<p>Following is a description of the tools that are used to back up our data, as well as some of the tools that are holding out data.  Different sets of data must be backed up in different was in order to maximize efficiency and reliability.</p>
<h3>Hardware</h3>
<p>We use a mixture of standard desktop hardware, server hardware, and virtual dedicated servers for our infrastructure.  Services requiring reliability are all run on the virtual dedicated servers providing uptime guarantees.  All of our backups are gathered and stored on two local computers, each with a raid 1 array, and copied to an offsite computer.</p>
<h3>Bash</h3>
<p><a href="http://www.gnu.org/software/bash/manual/bashref.html">http://www.gnu.org/software/bash/manual/bashref.html</a></p>
<p>Bash is an interactive shell and a scripting language that is installed by default on Linux, and can be configured on many other operating system.  We use it for the backup system because it is easy to call other programs that are already designed to do a lot of the work that we need to do for the backup.  This gets us a full backup in less than 100 lines of code.  The small amount of code makes it easy to proof read and test for errors.</p>
<h3>Rsync</h3>
<p><a href="http://samba.anu.edu.au/rsync/">http://samba.anu.edu.au/rsync/</a></p>
<p>Rsync is a very common program for copying data from one location to another when bandwidth can be limited, or when large amounts of data must be copied.  It first checks if the file exists in the destination, and, if it does exist, makes sure that it is that same file.  If the file already exists, and is up to date, the file is not copied.  For our backup, this saves a lot of time since there is generally only a small amount of files that change.</p>
<h3>Rdiff-Backup</h3>
<p><a href="http://rdiff-backup.nongnu.org/">http://rdiff-backup.nongnu.org/</a></p>
<p>After the staging area has been updated, we use rdiff-backup to keep track of 10 days of history.  rdiff-backup copies files from the source to an rdiff-backup repository.  Instead of deleting files that have been removed and overwriting files that have changed, it stores a backup of any changes.  It is possible to go into the repository later and restore any version that has not been removed.</p>
<h3>OpenVZ</h3>
<p><a href="http://wiki.openvz.org/">http://wiki.openvz.org/</a></p>
<p>OpenVZ allows us to quickly and easily set up new virtualized environments, known as containers.  OpenVZ containers are not fully virtualized, so they do not require as many resources as traditional virtual machines.  Our OpenVZ containers are used to quickly and easily set up testing environments, and to provide some of our services within our office that do not have the uptime requirements of the services running on the offsite virtual dedicated servers.</p>
<h3>Logical Volume Management</h3>
<p><a href="http://tldp.org/HOWTO/LVM-HOWTO/">http://tldp.org/HOWTO/LVM-HOWTO/</a></p>
<p>Logical Volume Management (LVM) is an abstraction layer between the hard drive and the partitions and filesystems on that hard drive.  One or more hard drives or partitions, known as physical volumes in LVM language, can be combined into a volume group.  The volume group can then be divided into multiple logical volumes, which behave like partitions and can be formatted like a normal partition would be.  There are many features in LVM that provide an advantage over normal partition management including resizing partitions and volume groups while the filesystems are mounted, moving the logical volumes from one physical drive to another, also while the filesystems are mounted, and many other management tasks.  Our backup script takes advantage of the ability to create a snapshot of a filesystem.  A snapshot creates another logical volume that is an image of the first logical volume frozen in time.  Any changes that are made to the files on the original logical volume will be stored in the extra space at the end of the volume group that is dedicated to the snapshot when the snapshot is created.  Business can continue as normal as we create a backup from a consistent set of files where we no longer need to worry about someone writing to the files while we are backing them up.</p>
<h3>MySQL</h3>
<p><a href="http://www.mysql.com/">http://www.mysql.com/</a></p>
<p>MySQL is a database that comes with it&#8217;s own set of backup tools to ensure that you get a consistent copy of the database.  Mysqldump locks the database when necessary to make sure that it does not make a copy of the database when some other program is in the middle of making a change to the database.</p>
<h3>Subversion</h3>
<p><a href="http://subversion.apache.org/">http://subversion.apache.org/</a></p>
<p>Subversion is a version control system.  We use it for all of our development projects to ensure that each team of developers is working with the most recent version of the code.  Because all of our projects use subversion, we have built up a large collection of code that would take a long time to fully back up each day.  We use subversion tools along with some bash scripting to compare the most recent version of the code in version control with the version that we last backed up, and only back up the changes.</p>
<h3>Grep, Sed, and Others</h3>
<p><a href="http://linuxmanpages.com/">http://linuxmanpages.com/</a></p>
<p>There are many other tools used throughout the script.  The two biggest examples are grep, a regular expression program, and sed, a stream editor which takes some input and changes it as specified.  If you want to know more about any of these tools, you can look them up in the Linux manual pages, or you can find more information on them using your favorite search engine.</p>
<h2>Variables</h2>
<p>﻿Following are the variables that are used in this script.  Some of the values have been changed for security reasons.</p>
<pre class="brush: plain;"># space seperated list of servers that have openvz and lvm set up
CONTAINER_SERVERS=&quot;fox walrus&quot;
# server to put a second copy of the backup on, located in MN
SECONDARY_BACKUP=&quot;walrus&quot;
# offsite server
OFFSITE_BACKUP=&quot;offsite.server.com&quot;
# Location on the openvz servers where the lvm snapshot of the openvz partition is mounted
SRC=&quot;/vzsnap/&quot;
# Location on the main backup server to collect all files
STAGING=&quot;/backup/staging/&quot;
# Location of the rdiff-backup repository
RECENT=&quot;/backup/recent_backup/&quot;
# Location on the second server for a copy of the rdiff-backup repository
SECOND_RECENT=&quot;/backup/recent_backup/&quot;
# Location on the offsite server for a copy of the rdiff-backup repository
OFFSITE_RECENT=&quot;/home/backup/recent_backup/&quot;
# Command locations
LVCREATE=/sbin/lvcreate
LVREMOVE=/sbin/lvremove
VZLIST=/usr/sbin/vzlist
VZCTL=/usr/sbin/vzctl</pre>
<h2>OpenVZ Containers</h2>
<pre class="brush: plain;"># containers
echo &quot;Staging Containers&quot;
for host in $CONTAINER_SERVERS
do
   containerlist=`ssh $host $VZLIST -aH -o veid`
   for container in $containerlist
   do
      echo &quot;Backing up $container from $host&quot;
      ssh $host $LVCREATE -L2G -s -n vzsnap /dev/filestore/vz &gt; /dev/null

      # check if the container is running
      run=&quot;`ssh $host vzlist | grep --only-matching $container`&quot;
      if [ &quot;$run&quot; == &quot;$container&quot; ]
      then
         # check if mysql server is running inside the container
         if [ -f /vz/private/$container/etc/init.d/mysql ]
         then
            ssh $host &quot;vzctl exec $container 'if [ -f /var/run/mysqld/mysqld.pid ]; then echo mysql is running; echo /var/run/mysqld/mysqld.pid &gt; /mysqld.pid; fi'&quot;
            if [ -f /vz/private/$container/mysqld.pid ]
            then
               pass=&quot;`ssh $host cat /vz/private/$container/etc/mysql/debian.cnf | grep --max-count=1 password | sed 's/^password = //'`&quot;
               user=&quot;debian-sys-maint&quot;
               ssh $host vzctl exec $container mysqldump --user=$user -p$pass --all-databases &gt; /backup/staging/$container.dump
               ssh $host vzctl exec $container rm /mysqld.pid
            fi
         fi
      fi

      ssh $host mkdir -p $SRC
      ssh $host mount /dev/filestore/vzsnap $SRC
      rsync -a --delete root@$host:$SRC/private/$container $STAGING/
      rsync -a root@$host:$SRC/etc/vz/conf/$container.conf $STAGING/
      ssh $host umount $SRC
      ssh $host $LVREMOVE /dev/filestore/vzsnap --force &gt; /dev/null
      ssh $host rmdir $SRC
   done
done</pre>
<p>For each server that is running OpenVZ containers, we want to make a full backup of each of the containers.</p>
<ol>
<li>We use LVM to create a snapshot of the filesystem.  This gives us a version of the files that we can copy that is consistent with itself at a given point in time.</li>
<li>In the case that MySQL is running in the container, we want to make sure that we do not get a corrupt copy of the database just in case it was in the middle of a commit when the LVM snapshot was taken.  For this, we will use the standard MySQL backup tool mysqldump.  This will also allow us to easily examine an old version of the database without fully restoring the entire container.</li>
<li>Finally, we copy the configuration for the container, and all of the files within the container.</li>
</ol>
<p>This will give us enough to restore any of our containers to the point at which the backup was taken.</p>
<h2>Version Control (SVN)</h2>
<pre class="brush: plain;">echo &quot;Staging Source Control&quot;
REPOS=`ssh scm.mentormate.com ls /files/repo/svn/`
echo $REPOS
for repo in $REPOS
do
   echo &quot;processing svn repo $repo&quot;
   head=`svn info svn+ssh://scm.mentormate.com/files/repo/svn/$repo/ | grep &quot;^Revision: .*&quot; | sed 's/^Revision: //'`
   curfile=$STAGING/svn.$repo.lastversion
   # check if there is currently a backup of the repo
   if [ -f $curfile ]
   then
      # if yes, read the last saved file
      current=`cat $curfile`
   else
      # if no, start from the beginning
      current=0
   fi
   if [ $current -lt $head ]
   then
      if [ $current -ne 0 ]
      then
         current=$(( $current + 1 ))
      fi
      padcurrent=`printf &quot;%05d&quot; $current`
      padhead=`printf &quot;%05d&quot; $head`
      # take incremental backup
      ssh scm.mentormate.com svnadmin dump -r$current:$head --incremental /files/repo/svn/$repo | gzip --best &gt; $STAGING/svn.$repo.$padcurrent-$padhead.dump.gz
      echo &quot;$head&quot; &gt; $curfile
   else
      echo &quot;$repo does not have any changes&quot;
   fi
done</pre>
<p>We use subversion for version control.   It&#8217;s very easy to dump a full backup of a subversion repository, but when the repositories get large, this can start to take a lot of time and bandwidth.  It is better to only back up the new revisions.</p>
<ol>
<li>Get a list of all subversion repositories</li>
<li>The head is the version that was most recently committed to the repository.  This can be obtained by checking the svn info.</li>
<li>The head that we backed up the last time that we made a backup was saved to a file.  This will give us a range for the last backup that we made to the current head.</li>
<li>An incremental backup is taken of only the new revisions, and the current head is written to a file.  The filename will tell us which revisions were backed up.</li>
</ol>
<p>When restoring this, the files can be combined and loaded into a new repository, or they can be loaded into a new repository one after the other.  If you decide that there are too many files for one repository, you can simply delete all of the files for that repository, including the last revision file, from the staging area, and a full backup will be taken the next time the backup script runs.</p>
<h2>Backup Router Configuration</h2>
<pre class="brush: plain;">wget -q https://192.168.1.1/diag_backup.php --post-data 'Submit=Download' --no-check-certificate --http-user=admin --http-password=&quot;**********&quot; --output-document=$STAGING/pfsense.xml</pre>
<p>We use pfSense for our router software.  This allows us great flexibility at a very low cost.  pfSense has a web page with a button for downloading the configuration file.  Wget can be set to send the appropriate information to request the configuration file.  In the event that the router hardware fails, we can quickly install pfSense on new hardware, and load the configuration.</p>
<h2>Crontab from the Backup Server</h2>
<pre class="brush: plain;">crontab -l &gt; $STAGING/crontab.`hostname`</pre>
<p>If our main backup server goes down, we want to make sure that we know everything that it was doing.  All of our important backups jobs run as a single user, so we only need to get one crontab here.</p>
<h2>Staging to Incremental Backup</h2>
<pre class="brush: plain;">rdiff-backup $STAGING/ $RECENT/
rdiff-backup --remove-older-than 10B $RECENT/</pre>
<p>Now that we have everything in the staging area, we want to copy it to a more long term location.  We will do this using rdiff-backup, which will store multiple revisions of our files without making a full copy of each one.  We then need to remove old revisions of the files so that the repository does not get too large.  In this case, we keep 10 versions of the files.</p>
<h2>Offsite Backup</h2>
<pre class="brush: plain;">rsync -azq --delete $RECENT/ $SECONDARY_BACKUP:$SECOND_RECENT/
rsync -azq --delete --bwlimit=10 $RECENT/ user@$OFFSITE_BACKUP:$OFFSITE_RECENT/</pre>
<p>The final step is to make sure that we have multiple copies of our big backup.  The rdiff-backup repository is copied to a second onsite server, for easy restore in the event of hardware failure on the backup machine, and an offsite server.</p>
<h2>Conclusion</h2>
<p>By gathering all of our information into one place, then taking an incremental backup and sending that to remote servers, we have easily created a backup script that stores incremental versions of all of our important data in one place.</p>
]]></content:encoded>
			<wfw:commentRss>http://mentormate.com/blog/mentormates-backup-process/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to use HTML Signatures in Gmail (Google Mail)</title>
		<link>http://mentormate.com/blog/html-signatures-gmail-google-mail/</link>
		<comments>http://mentormate.com/blog/html-signatures-gmail-google-mail/#comments</comments>
		<pubDate>Tue, 09 Feb 2010 20:07:41 +0000</pubDate>
		<dc:creator>Andy</dc:creator>
				<category><![CDATA[Marketing]]></category>
		<category><![CDATA[gmail]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[signature]]></category>

		<guid isPermaLink="false">http://mentormate.com/blog/?p=395</guid>
		<description><![CDATA[We pride ourselves on our branding and our heavy use of Google services here at MentorMate. For some reason Gmail does not have a built-in feature supporting HTML Signatures. After several iterations of designing workarounds, we've decided to share the best one we've come up with. Enjoy!]]></description>
			<content:encoded><![CDATA[<h2>Plain Text Signature</h2>
<p>First of all you need to decide on the plain text you will input into your default text-only signature.</p>
<h3>Example</h3>
<p>Full Name</p>
<p>Job Title</p>
<p>www.spydermate.com</p>
<h3>Example Code</h3>
<pre class="brush: plain;">Full Name&lt;br&gt;Job Title&lt;br&gt;&lt;br&gt;www.spydermate.com</pre>
<h2>HTML Signature</h2>
<p>Next you will need to design the HTML signature version of the same signature.</p>
<h3>Example</h3>
<p><span style="font-family: Verdana; font-size: 18px; color: #ff943b; font-weight: bold;">Full Name</span></p>
<p><span style="font-family: Verdana; font-size: 11px; font-style: italic;">Job Title</span></p>
<p><a href="http://spydermate.com"><img src="http://mentormate.com/images/spydermate-esig.gif" border="0" alt="" width="150" /></a></p>
<p><span style="font-family: Verdana; color: #7f7f7f; font-size: 11px;"><a style="font-family: Verdana; font-weight: bold; color: #ff943b;" href="http://spydermate.com">www.spydermate.com</a></span></p>
<h3>Example Code</h3>
<pre class="brush: plain;">&lt;span style=&quot;font-family: Verdana;font-size: 18px;color:#ff943b;font-weight:bold;&quot;&gt;Full Name&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;font-family: Verdana;font-size: 11px;font-style: italic;&quot;&gt;Job Title&lt;/span&gt;&lt;span style=&quot;font-family: Verdana;font-size:11px;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;
&lt;a href=&quot;http://spydermate.com&quot;&gt;&lt;img src=&quot;http://mentormate.com/images/spydermate-esig.gif&quot; border=&quot;0&quot; width=&quot;150&quot;/&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;
&lt;span style=&quot;font-family: Verdana;color: #7f7f7f;font-size:11px;&quot;&gt;&lt;a href=&quot;http://spydermate.com&quot; style=&quot;font-family: Verdana;font-weight:bold;color:#ff943b;&quot;&gt;www.spydermate.com&lt;/a&gt;&lt;/span&gt;</pre>
<h2>Javascript Bookmark</h2>
<p>Next a Javascript Bookmark must be setup to find the Plain Text Signature and replace it with the HTML Signature</p>
<h3>Example Code</h3>
<pre class="brush: plain;">javascript:void ((
function(){
  if (!document.getElementById(&quot;Ijquery&quot;)) {
    var noeud_js = document.createElement(&quot;script&quot;);
    noeud_js.setAttribute(&quot;type&quot;, &quot;text/javascript&quot;);
    noeud_js.setAttribute(&quot;id&quot;, &quot;Ijquery&quot;);
    noeud_js.setAttribute(&quot;src&quot;, &quot;http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js&quot;);
    document.getElementsByTagName(&quot;head&quot;)[0].appendChild(noeud_js);
  }
  function jquery_loaded(){
    var tmp = &quot;false&quot;;
    try {
      tmp = $(&quot;body&quot;).text();
    } catch (erreur) {
      tmp = &quot;false&quot;;
    } return tmp;
  }
  function verif_loaded(){
    var temp = jquery_loaded();
    if (temp != &quot;false&quot;) {
      clearInterval(interval);
      code();
    }
  }
  var interval = window.setInterval(verif_loaded, 100);
  function code() {
    var gsig = &quot;Full Name&lt;br&gt;Job Title&lt;br&gt;&lt;br&gt;www.spydermate.com&quot;;
    var htmlsig = &quot;&lt;span style=\&quot;font-family: Verdana;font-size: 18px;color:#ff943b;font-weight:bold;\&quot;&gt;Full Name&lt;/span&gt;&lt;br/&gt;&lt;span style=\&quot;font-family: Verdana;font-size: 11px;font-style: italic;\&quot;&gt;Job Title&lt;/span&gt;&lt;span style=\&quot;font-family: Verdana;font-size:11px;\&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;br/&gt; &lt;a href=\&quot;http://spydermate.com\&quot;&gt;&lt;img src=\&quot;http://mentormate.com/images/spydermate-esig.gif\&quot; border=\&quot;0\&quot; width=\&quot;150\&quot;/&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt; &lt;span style=\&quot;font-family: Verdana;color: #7f7f7f;font-size:11px;\&quot;&gt;&lt;a href=\&quot;http://spydermate.com\&quot; style=\&quot;font-family: Verdana;font-weight:bold;color:#ff943b;\&quot;&gt;www.spydermate.com&lt;/a&gt;&lt;/span&gt;&quot;; var h = jQuery(&quot;iframe:last&quot;).contents().find(&quot;iframe:last&quot;).contents().find(&quot;body.editable&quot;).html();
    h = h.replace(gsig, htmlsig); jQuery(&quot;iframe:last&quot;).contents().find(&quot;iframe:last&quot;).contents().find(&quot;body.editable&quot;).html(h);
  }
} )())</pre>
<h2>Gmail Settings</h2>
<p>Next Gmail must be setup to use the Plain Text Signature. Then the Signature tweaks feature in Gmail Labs needs to be enabled. Once all these steps have been completed, the user simply has to compose an email and click on the Javascript Bookmark in order to use their HTML Signature. The best part about this method is that even if the user forgets to click on the Javascript Bookmark for the HTML Signature, at the very least the Plain Text Signature will always be there.</p>
<h2>Known Issues</h2>
<p>This script will not work while a chat window or a task window is open in Gmail. These windows must be closed before this script can be used properly. We&#8217;ve also noticed that this script does not find and replace properly in FireFox while running the Personas Add-On. If you know of any other issues with this script specific to a certain browser or plugin to a certain browser, please make a note of them in the comments.</p>
<h2>WiseStamp</h2>
<p>If you use FireFox as your primary browser you can simply use the FireFox Add-On WiseStamp (<a href="https://addons.mozilla.org/en-US/firefox/addon/8206">https://addons.mozilla.org/en-US/firefox/addon/8206</a>) to accomplish the same result. However, the solution we just described above will also work in other browsers and does not require any additional browser add-on installations.</p>
]]></content:encoded>
			<wfw:commentRss>http://mentormate.com/blog/html-signatures-gmail-google-mail/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The 15 Best Free Android Apps</title>
		<link>http://mentormate.com/blog/best-free-google-android-apps/</link>
		<comments>http://mentormate.com/blog/best-free-google-android-apps/#comments</comments>
		<pubDate>Tue, 22 Dec 2009 20:39:40 +0000</pubDate>
		<dc:creator>Andy</dc:creator>
				<category><![CDATA[Miscellaneous]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[applications]]></category>
		<category><![CDATA[google]]></category>

		<guid isPermaLink="false">http://mentormate.com/blog/?p=258</guid>
		<description><![CDATA[Many of the employees at MentorMate have Google Android phones. There are a few iPhone owners too, but they’re in the minority at MentorMate. We did a little survey and found out what Android apps everyone was using. We then consolidated the list and filtered out all the apps that wouldn’t be used by your average Google Android user. What follows is a list of truly great apps that every Google Android user should have. These apps have one more thing in common, they’re all FREE!]]></description>
			<content:encoded><![CDATA[<h2><a href="http://www.kurniadi.org/akproduction/?q=node/6" target="_blank">AK Notepad</a></h2>
<p>Extremely useful app for storing notes in. Includes features to easily share notes with others.</p>
<h2><a href="http://weloveastrid.com/" target="_blank">Astrid</a></h2>
<p>Spectacular to-do list app. Ability to synchronize with rememberthemilk.com so you’ll never lose anything. Tags allow for easy categorization.</p>
<h2><a href="http://www.androidtapp.com/astro-file-manager/" target="_blank">ASTRO File Manager</a></h2>
<p>Manage your files directly with this app, rather than just when you have your device hooked up to a computer with a USB cable.</p>
<h2><a href="http://www.chompsms.com/" target="_blank">chompSMS</a></h2>
<p>The built-in SMS message app works alright, but the interface is not all that special. chompSMS has chat style conversation bubbles that are far more ideal for such communication.</p>
<h2><a href="http://www.gmote.org/" target="_blank">Gmote</a></h2>
<p>Make your android phone function as a remote control for your computer.</p>
<h2><a href="http://www.google.com/sky/skymap.html" target="_blank">Google Sky Map</a></h2>
<p>View the constellations clearly. Changes the view based on your GPS coordinates and the angle at which you hold the phone.</p>
<h2><a href="http://www.google.com/mobile/products/voice.html#p=default" target="_blank">Google Voice</a></h2>
<p>Send text messages to other Google Voice users for free. Setup customized voicemails based on who is calling you. Even allows for transcripts of voicemail, although this particular feature has a lot of room for improvement still.</p>
<h2><a href="http://handycalc.wordpress.com/" target="_blank">handyCalc</a></h2>
<p>Allows for multiple, independent calculations simultaneously and is far less limited than the built-in calculator.</p>
<h2><a href="http://www.twofortyfouram.com/" target="_blank">Locale</a></h2>
<p>Setup auto-triggers on your phone based on your location, time of day, calendar events, battery level, etc.</p>
<h2><a href="http://newsrob.blogspot.com/" target="_blank">NewsRob</a></h2>
<p>RSS reader that syncs with Google reader</p>
<h2><a href="http://www.pandora.com/android" target="_blank">Pandora</a></h2>
<p>Pick an artist and listen to their songs for free and songs from similar artists.</p>
<h2><a href="http://sites.google.com/site/placesdirectory/" target="_blank">Places Directory</a></h2>
<p>Find what you’re looking for near your GPS coordinates by general category.</p>
<h2><a href="http://www.shazam.com/music/web/pages/android.html" target="_blank">Shazam</a></h2>
<p>Never again be stuck wondering what artist/song was just on the radio. Use Shazam to record it and report this information to you.</p>
<h2><a href="http://www.biggu.com/apps/shopsavvy-android/" target="_blank">ShopSavvy</a></h2>
<p>Scan the bar code of a product and compare prices from all over the place.</p>
<h2><a href="http://www.androidtapp.com/the-weather-channel/" target="_blank">The Weather Channel</a></h2>
<p>Weather information on the go with alerts.</p>
]]></content:encoded>
			<wfw:commentRss>http://mentormate.com/blog/best-free-google-android-apps/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Is the Google Chrome Browser faster than Internet Explorer in JavaScript performance?</title>
		<link>http://mentormate.com/blog/google-chrome-browser-faster-internet-explorer-javascript-performance/</link>
		<comments>http://mentormate.com/blog/google-chrome-browser-faster-internet-explorer-javascript-performance/#comments</comments>
		<pubDate>Tue, 15 Dec 2009 17:38:52 +0000</pubDate>
		<dc:creator>Georgi</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[browser]]></category>
		<category><![CDATA[chrome]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[ie]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[performance]]></category>

		<guid isPermaLink="false">http://mentormate.com/blog/?p=259</guid>
		<description><![CDATA[On November 19, 2009 Google announced their open source Chrome operating system built around the core tenets of speed, simplicity and security. The presentation started with a slide showing the increasing number of Chrome users – the browser that is used as a base in their OS. The slide also stated that Chrome has “39x faster JavaScript than Internet Explorer.” Is it really that much faster or faster at all? Will their built from scratch “V8 JavaScript Engine”  outplay the latest version of the Microsoft browser and will it work almost 40 times faster?]]></description>
			<content:encoded><![CDATA[<h2>JavaScript Speed in Google Chrome versus Internet Explorer</h2>
<p>The latest stable version of Chrome browser at the time this article was written was 3.0.195.33. We will compare it to the current version of IE, which is 8.0.6001.18865. We started with Google’s own benchmark that is hosted at their site and is called <a href="http://v8.googlecode.com/svn/data/benchmarks/current/run.html" target="_blank">V8 Benchmark Suite</a>.  The result differed from one machine to another, but the score of the Google browser was always about 38 times higher than the one of IE – very close to the numbers that Google is claiming. Of course, as much we believe in the accuracy of the tests, we wanted to use some independent benchmarking sites, too. After some research, we found some of the major ones are <a href="http://www2.webkit.org/perf/sunspider-0.9/sunspider.html" target="_blank">SunSpider JavaScript Benchmark</a> and <a href="http://jsbenchmark.celtickane.com/" target="_blank">JSBenchmark</a>. Their tests are a complex mixture of different tasks, including drawing, code decompression, encrypting and operations with arrays, dates and handling exceptions. As we expected, the difference between the two browsers was much smaller compared to Google’s own test, but it was again pretty impressive. The results differed from platform to platform, but overall the “SunSpider” test showed that Chrome is ten times faster, while the “JSBenchmark” reported that it is “only” seven times faster.</p>
<h2>JavaScript Speed Test</h2>
<p>In order to conclude that Internet Explorer is much slower than Google Chrome in JavaScript performance though, we still needed more facts. As an alternative to the complex and heavy testing suites, we created a very short example with few array operations. We wanted it to be fairly simple and pretty close to real life examples. Basically, this piece of code assigned random numbers to an array of 20,000 items. Then we reversed the order of the elements. In the next two steps we sorted it in ascending and descending order. The script outputs the milliseconds needed for its completion. We did not expect a lot of difference in doing something so basic. Here is the code:</p>
<h2>JavaScript Speed Test Source Code</h2>
<pre class="brush: plain;">
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot;
    &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;
	&lt;head&gt;
		&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html;charset=utf-8&quot; /&gt;
		&lt;title&gt;MentorMate JavaScript simple speed test&lt;/title&gt;
		&lt;script type=&quot;text/javascript&quot;&gt;
			&lt;!--
			function testStart() {
				var mySampleNumbers = new Array();
				var now;
				var start_time_mill;
				var end_time_mill;

				//gets the start date
				now = new Date();
				start_time_mill = now.getTime();

				//assigning random numbers to an array of 20 thousand items
				for (i=0;i&lt;=20000;i++) {
					mySampleNumbers[i] = Math.random();
				}

				//reverse the order of the elements in an array
				mySampleNumbers.reverse();

				//sort the numbers (ascending)
				mySampleNumbers.sort(sortAsc);

				//sort the numbers (descending)
				mySampleNumbers.sort(sortDesc);

				//gets the end date
				now = new Date();
				end_time_mill = now.getTime();
				displayResult(end_time_mill - start_time_mill);
			}
			function sortAsc(m, n) {
				if (m &gt; n) {
					return 1;
				}
				else if (m &lt; n) {
					return -1;
				}
				else {
					return 0;
				}
			}
			function sortDesc(m, n) {
				if (m &gt; n) {
					return -1;
				}
				else if (m &lt; n) {
					return 1;
				}
				else {
					return 0;
				}
			}
			function displayResult(result) {
				alert(&quot;Result: &quot; + result + &quot; ms.&quot;);
			}
			// --&gt;
		&lt;/script&gt;
	&lt;/head&gt;
	&lt;body&gt;
		&lt;form action=&quot;&quot;&gt;
			&lt;p&gt;
				&lt;input type=&quot;button&quot; value=&quot;Start&quot; onclick=&quot;testStart()&quot; /&gt;
			&lt;/p&gt;
		&lt;/form&gt;
	&lt;/body&gt;
&lt;/html&gt;
</pre>
<h2>JavaScript Speed Test Results</h2>
<p>There were differences from PC to PC as with the other tests, but the tendency stayed the same. The time of completion of the tasks in Chrome was about six times faster than IE. This was the smallest advantage the Google browser had compared to the tests that were run so far, but it sounds pretty prestige for Chrome to have such a boost in performance for a really small task.</p>
<p>In conclusion, we can say that Google Chrome has set new standards for speed as far as JavaScript is concerned. Although the advantage the browser has might not be as big as Google claim in their advertising campaigns, it is something very impressive and gives the users additional speed for simple everyday tasks as we saw in the example above. We are looking forward to see the ninth version of Internet Explorer soon, as in the early discussions the developers show ambition to reach the level of performance that Chrome already has. The acceleration of the JavaScript engines for all the browsers can only bring benefits to users and contribute to the creation of richer, more complex Internet applications.</p>
]]></content:encoded>
			<wfw:commentRss>http://mentormate.com/blog/google-chrome-browser-faster-internet-explorer-javascript-performance/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SEO Diagram</title>
		<link>http://mentormate.com/blog/seo-diagram/</link>
		<comments>http://mentormate.com/blog/seo-diagram/#comments</comments>
		<pubDate>Fri, 23 Oct 2009 21:56:48 +0000</pubDate>
		<dc:creator>Andy</dc:creator>
				<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://mentormate.com/blog/?p=228</guid>
		<description><![CDATA[The following SEO diagram was designed for our SEO presentation. It does a particularly good job of giving an overview of how we get through various steps of SEO to ultimately result in more revenue. A good way to read it is to work your way backwards, starting at the conversions step. Obviously this has a focus on revenue-generating web sites, but most of its principles can be associated with any SEO effort.]]></description>
			<content:encoded><![CDATA[<div class="mceTemp">
<dl id="attachment_242" class="wp-caption alignnone" style="width: 630px;">
<dt class="wp-caption-dt"><img class="size-full wp-image-242 " title="SEO Diagram" src="http://mentormate.com/blog/wp-content/uploads/2009/10/seo-diagram3.jpg" alt="SEO Diagram" width="620" /></dt>
</dl>
</div>
]]></content:encoded>
			<wfw:commentRss>http://mentormate.com/blog/seo-diagram/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Latest SEO Industry News</title>
		<link>http://mentormate.com/blog/latest-seo-industry-news/</link>
		<comments>http://mentormate.com/blog/latest-seo-industry-news/#comments</comments>
		<pubDate>Wed, 23 Sep 2009 21:05:24 +0000</pubDate>
		<dc:creator>Andy</dc:creator>
				<category><![CDATA[Marketing]]></category>
		<category><![CDATA[news]]></category>
		<category><![CDATA[seo]]></category>

		<guid isPermaLink="false">http://mentormate.com/blog/?p=171</guid>
		<description><![CDATA[9/21/09 Google officially announces that meta keywords don't impact ranking in Google
9/17/09 Rand Fishkin of SEOMoz changes stance on paid links
7/29/09 Yahoo gives up on search, makes deal with Bing]]></description>
			<content:encoded><![CDATA[<h2>9/21/09 <a title="Google officially announces that meta keywords don't impact ranking in Google" href="http://googlewebmastercentral.blogspot.com/2009/09/google-does-not-use-keywords-meta-tag.html" target="_blank">Google officially announces that meta keywords don&#8217;t impact ranking in Google</a></h2>
<p>Matt Cutts just officially stated that Google does not use meta keywords to impact web sites&#8217; rankings in Google. It has been widely known for a long time that meta keywords did next to nothing, if anything in Google. Cutts decided to make it official. I have always recommended to not use meta keyword tags on web sites because they are a waste of time and competitors can then see what keywords you are targeting. Purposely using meta keywords to trick your competitors into thinking you are targeting certain keywords is still an option I guess, but that seems like a waste of time as well. Any good competitor will be able to figure out the truth anyway, especially with tools like compete.com around.</p>
<h2>9/17/09 <a title="Rand Fishkin of SEOMoz changes stance on paid links" href="http://www.seomoz.org/blog/our-stance-on-paid-links-link-ads" target="_blank">Rand Fishkin of SEOMoz changes stance on paid links</a></h2>
<p>After a lengthy period of pushing paid link services all over the SEOMoz web site, Rand Fishkin has decided to change his stance on paid links. That is, of course, paid links that are not properly deemed as advertisements and actually pass along PageRank. <a title="John Chow's Blog" href="http://www.johnchow.com/" target="_blank">John Chow&#8217;s blog</a> was targeted by Google for this practice awhile ago. As a result, he did not rank for his own name in Google for a long period of time. Google received a lot a negative response for this move from well-known bloggers and recently removed the punishment, allowing Chow to rank for his own name again.</p>
<p>Aaron Wall of <a title="SEOBook" href="http://www.seobook.com/" target="_blank">SEOBook</a> had some interesting thoughts on this move by Fishkin. Wall recently stated on his blog &#8220;If you philosophically didn&#8217;t believe in buying links then why would you spend $1,000,000+ building a web graph of link data? What good is researching all the link data if you take link buying off the table as one of the options? Most of the competing links that you can replicate will require some level of payment.&#8221;</p>
<h2>7/29/09 <a title="Yahoo gives up on search, makes deal with Bing" href="http://www.businessweek.com/technology/content/jul2009/tc20090728_826397.htm" target="_blank">Yahoo gives up on search, makes deal with Bing</a></h2>
<p>While most of you already know about this, it is a major news item for the SEO industry in particular. This means no longer trying to rank in Google, Yahoo! and Bing. Now there are only two major search engine you have to focus your SEO efforts on. I do not know how to feel about this at this time. I am curious however, to see what kind of market share Bing has in a year or so.</p>
<p>QuadsZilla at <a title="SEO Black Hat" href="http://seoblackhat.com" target="_blank">SEO Black Hat</a> seems to be very excited about Bing. He recently wrote a post stating &#8220;We want Bing to succeed: we need a real challenger to Google’s monopoly&#8221; and even goes as far as to get a contact at Bing in order to &#8220;negotiate a deal to bring upwards of 10,000,000 new searchers per year to Bing.com.&#8221;</p>
]]></content:encoded>
			<wfw:commentRss>http://mentormate.com/blog/latest-seo-industry-news/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Secure Data Backup and Recovery Best Practices</title>
		<link>http://mentormate.com/blog/backups/</link>
		<comments>http://mentormate.com/blog/backups/#comments</comments>
		<pubDate>Fri, 31 Jul 2009 13:53:50 +0000</pubDate>
		<dc:creator>Doug</dc:creator>
				<category><![CDATA[IT]]></category>

		<guid isPermaLink="false">http://mentormate.com/blog/?p=72</guid>
		<description><![CDATA[Why make backups? There are many reasons, and it is important to keep them all in mind when you are creating your backup system. Different types of disasters require different methods of recovery.]]></description>
			<content:encoded><![CDATA[<p><strong>Reasons to backup:</strong></p>
<ul>
<li>Hardware Failure, hard drives and other computer components fail regularly.</li>
<li>Destruction of your site, fire or flooding.</li>
<li>Accidental data loss, somebody unintentionally deletes one or more files.</li>
<li>Software error, a software error could corrupt one or more of your files.</li>
</ul>
<h1>The difference between backup and redundancy</h1>
<p>Most modern servers use RAID for redundancy.  This usually means that when you put something on the server, it gets written to two hard drives.  In the event that one hard drive goes down, you can replace it with no disruption to service.  This is an example of redundancy, and will help protect you against a very specific type of failure.  Some systems, like Google, will have multiple servers, allowing an entire server to go down without disruption to service.  It is important to have redundancy so that services to your company or to your clients are not disrupted, but it is not a replacement for backups.</p>
<p>Backups involve creating a second copy of your data.  Often times, multiple backups from different points in time will be maintained.  Restoring a backup takes time, and can result in disruption of service.  Backups help protect from user errors like accidental deletion and software errors that could corrupt data.  Having more than one copy of your files is very important for recovery from these errors.</p>
<h1>What to backup</h1>
<h2>Email</h2>
<p>If you host your own email, this is probably one of the most important things to backup.  If your email is hosted, see if you can backup your email, or see what your provider is doing to backup your email.</p>
<h2>Document Management System</h2>
<p>If you have a document management system or some other type of server that you store your files on, this is also a very important group of files to back up.</p>
<h2>Desktops</h2>
<p>If you have a lot of people, it can be very difficult to back up each desktop that you have.  A better solution is to make sure that all important files are stored on a server so you only need to back up a single server.  You should have a plan in place for what happens when a desktop goes down in order to reduce the impact on the productivity of the person who was using it.</p>
<h2>Web Application Data</h2>
<p>If your website collects data, or if you have any web applications that collect data, make sure that you back up the databases and other information stores.  SQL databases have backup programs that can be run.  You can set your operating system to run the backup regularly.  Also, if there is space where users can upload files, make sure to back up the files as well.</p>
<h2>Custom Software</h2>
<p>Custom software can be expensive to develop.  Make sure that you have a backup of any custom software that you have had built so that you can easily deploy it again if you need to.</p>
<h2>Information in &#8220;The Cloud&#8221;</h2>
<p>You may have documents or other information that is hosted on the internet.  If at all possible, you should take your own backups.  If you cannot take your own backups, how reliable is the service provider?  Think carefully about each of the services that you are subscribed to.  These could be Salesforce, Google Docs, email providers, Online stores (do you need your amazon.</p>
<h2>Any other products that are generated</h2>
<p>Each company produces different types of products.  Make sure that you go through the list of products that you have and ask yourself what would happen and how you would recover if you lost some data.  Make sure to think about digital components that are created to support physical products.</p>
<h1>How</h1>
<p>The number of backup programs that exist and techniques that are available are too numerous to count, so I will only cover a few concepts.</p>
<h2>Important Concepts</h2>
<h3>Local and Offsite</h3>
<p>It is a good idea to have a copy of your data locally and a copy of your data offsite.  The offsite backup is important in the event that your office is destroyed.  The location of the offsite backup could also be destroyed, so having an onsite backup will help protect you against that.  Another reason to keep an onsite backup is that if you need to restore an item, the backup is immediately available.</p>
<h3>Automated Vs. Manual</h3>
<p>Human memory is flawed, people take vacations and sick time, and staffing changes.  If your backup is automated, these events will have a smaller impact on your backup system.  An automated backup system can grab all of your data every night, and push it to an offsite location over the internet or a T1 pipe.  There may be parts of the backup that must be done manually, like changing media, or a few parts of the backup that are difficult to automate, but the more automatic it is, the better.  Still, make sure to check it periodically to make sure that it is still taking the backup and you are not getting errors.</p>
<h3>Backup Media</h3>
<p>Depending on how much you need to back up, you may want different types of media.  Tape drives are popular for large quantities of data.  CD or DVD media is a cheap way to back up small amounts of data, but make sure that you get high quality media, and check it from time to time to make sure that it is not deteriorating.  Hard drives are very convenient since they are rewritable.  Keep in mind that hard drives fail.  Using RAID for redundancy is a good way to help protect yourself from hard drive failure.</p>
<h3>Ensure it works</h3>
<p>After you have created your backup system and are making sure that it runs, make sure to test it by restoring data from the backup.  If you cannot restore a backup, it is not really a backup.</p>
<h3>Security</h3>
<p>If you are backing up confidential or sensitive data, make sure that the backup is at least as secure as the data that you are backing up.  A compromised backup is just as bad as the data being compromised since you have a copy of everything.  If the backup is encrypted, make sure that enough people have the key, and that the key is backed up somewhere.  If you encrypt the data and lose the key, you lose the backup.</p>
<h3>Organization</h3>
<p>Make sure that you always know what backup is current, what backup is old, and when you&#8217;ve taken the backups.  Your software may take care of this for you.  If it does not, putting dates on the folders, or a file with the information within the folder can be good ways to keep organized.  You also need to know where it is going and how to restore it.  Make sure that this is documented in case the person who built the backup is not available when a restore is needed.  You can also streamline the backup process by making sure that the files that need backing up are organized in as few places as possible.</p>
<h3>Human Redundancy</h3>
<p>Make sure that multiple people know where the backup is and how to restore it.  It is a good idea to have some documentation on the backup system, how the backups are created, any manual steps and when they need to be performed, and how to restore each component of the backup, either fully or partially.</p>
<h2>Software</h2>
<h3>Virtual Machines</h3>
<p>Virtual machines typically have a way to make a copy of the entire machine.  This can be taken advantage of to backup an entire system from all of the software that is in stalled to the data files that are on the machine.</p>
<h3>rsync and rdiff-backup</h3>
<p>rsync is used to copy files from one place to another, optionally over the network or internet.  All data transfers are encrypted.  When files are copied, only the files that have changed are copied, reducing the amount of bandwidth required for most cases.  rdiff-backup is similar, but it will keep incremental backups making it so that you can revert to a previous version of your backup.  To save space, files are only saved twice if they have changed.</p>
<h3>dd</h3>
<p>dd can make a copy of a hard drive.  This can be used to make an image of your operating system hard drive from time to time.  If you ever need to restore, you can reload the image to the drive, and all of your software will be ready to go.</p>
<h3>Others</h3>
<p>There is enough backup software out there that I could not hope to cover all of it.  Look at your needs and find the group of software that fills your needs.</p>
<h1>Conclusion</h1>
<p>Make sure you think carefully about why you are backing up your data.  Your reasons for backing up your data will have an impact on how you back it up.  What would happen to you or your business if you lost some or all of your files?  Who is going to be able to restore your files?</p>
]]></content:encoded>
			<wfw:commentRss>http://mentormate.com/blog/backups/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>19 Signs Your Web Site Was Poorly Designed and/or Developed</title>
		<link>http://mentormate.com/blog/19-signs-your-web-site-was-poorly-designed-developed/</link>
		<comments>http://mentormate.com/blog/19-signs-your-web-site-was-poorly-designed-developed/#comments</comments>
		<pubDate>Tue, 26 May 2009 20:28:50 +0000</pubDate>
		<dc:creator>Andy</dc:creator>
				<category><![CDATA[Marketing]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://mentormate.com/blog/?p=59</guid>
		<description><![CDATA[MentorMate’s web marketing team has created a list of some commonly-found problems in web site design. These flaws are detrimental aspects to the site in terms of actual site functionality, usability, and/or search engine optimization. They are problems that are readily apparent without an extensive technical background, and ranked in order, beginning with the most severe red flag and ending with more minor inconveniences that could be improved upon.]]></description>
			<content:encoded><![CDATA[<h3>1.    You can’t find your own site on Google</h3>
<p>If you’re looking for your own site and still can’t find it, something big is wrong. This is worst case scenario for a web site; if you can’t find your own site, none of your target audience will be able to either.  If you’ve typed in your company name or something else specific to your brand you should be at or near the top of the results.</p>
<h3>2.    Your visitors aren’t doing what you want them to</h3>
<p>Your site has a specific purpose, whether it’s sales or to generate a lead through a contact form. If your site is receiving traffic, but that traffic isn’t using the site like you intended, there are probably issues with the way your website targets your audience.  In other words, you need to refocus your SEO to allow the right people to find you. Another problem may be with your web site’s usability. If visitors are unable to use it as you intended, your site has some serious problems.</p>
<h3>3.    Browser incompatibility</h3>
<p>This is a design flaw that isn’t always noticed, but is crucial for the user experience. Your web site may look great in the browser you personally use, but different browsers render sites differently. Your site may look great in Firefox, but terrible in Safari.</p>
<h3>4.    Duplicate or nonexistent page titles</h3>
<p>Page titles, the text shown in the top left corner of your browser, are one of the biggest factors in how a search engine finds your site. Each page’s title should accurately reflect the keywords you’re targeting for that specific page. Your pages won’t appear anywhere near the top of the search results without effective page title usage.</p>
<h3>5.    Excessive use of images in place of text</h3>
<p>Text rendered as an image can often look more appealing to the eye, but it can hurt your search rankings.  If you use images in place of text, you’re missing a major opportunity to help search engines figure out what your site is about.</p>
<h3>6.    Main navigation isn’t persistent</h3>
<p>Certain page elements should be present on every page.  The most important is your main navigation.  This might be tabs that are at the top of every page, or a list of website sections on the side of the page.  Regardless of how users navigate through your website, you should never leave them guessing about how to get to more of your content.</p>
<h3>7.    Excessive use of Flash</h3>
<p>Creating a site exclusively with Flash can look impressive, but it is nearly impossible to rank highly in search results by doing this. Flash can be used to enhance a site, but it shouldn’t make up the entire site.</p>
<h3>8.    Websitegrader.com gives site a score less than 25</h3>
<p>Website Grader is a free tool that measures your site’s marketing effectiveness. It analyzes the amount of traffic you receive, your SEO efforts, social networking popularity, and technical factors to produce a score from 1-100. Scoring below 25 would signify major problems in several areas of your site.</p>
<h3>9.    Intro pages</h3>
<p>An extensive introduction may look nice, but intro pages can also detract from the user experience.  This is especially the case for your most valuable user – the repeat visitor – who may not want to sit through the same intro every time they visit your site.</p>
<h3>10.     Page URLs aren’t human readable</h3>
<p>Your URLs should be simple and say what each page is about. For example, www.dogs.com/dalmatians is better than www.dogs.com/show.php?breed=11. This helps search engines better index your content and your users stand a better chance of remembering how to get to your content.</p>
<h3>11.     Site contains excessive text</h3>
<p>Too little text can keep search engines from understanding what your site is about, but too much text can drive away visitors. Follow the rule of thumb that nobody on the web wants to read; users should be able to quickly find and use the information they are looking for without reading anything unnecessary.  Limiting your text also helps you focus on the most important words, too, and this helps search engines figure out what your site is about.</p>
<h3>12.     No contact information is present on the site</h3>
<p>This is obviously easy to remedy, but also a problem that some sites forget about. You need contact info to receive both leads and feedback on areas to improve your site.</p>
<h3>13.     Slow load time</h3>
<p>Internet users are impatient. The longer they wait, the less likely they are to use your site. Significantly slow load times can also negatively impact your rankings in the search engines, resulting in less web traffic to your site.</p>
<h3>14.     Your site is designed for small monitors</h3>
<p>As computer hardware advances, your website needs to also.  A site designed for 800&#215;600 screen resolution may have been state of the art in 1997, but today users expect your site to utilize their entire screen. A width of 960 pixels is optimal these days.</p>
<h3>15.     Canonical URL issues</h3>
<p>http://www.sampledomain.com and http://sampledomain.com (no www) should 301-redirect to one variation of the domain name. You need to choose with or without the www. This way you can ensure no link juice is wasted on the less popular variation of your domain.</p>
<h3>16.     Too many navigation choices or too many clicks to get there</h3>
<p>Your site has to be easy to navigate. Too many options on the home page are overwhelming; will spend too much time reading through all the options.  At the other end of the spectrum is excessive page depth.  Forcing users through a seemingly endless train of pages is a sure way to get them to leave.  As a rule of thumb, users should never have pick between more than 7 navigational options per page and they should be able to get to any page in at most three clicks. All pages should also link back to the home page.</p>
<h3>17.     Single column display format</h3>
<p>This is simply an outdated feel and looks unprofessional as well. Make use of all the space presented to you. Single column formats lead to excessive scrolling. Don’t make extra work for the user.</p>
<h3>18.     Site has no Compete.com data (after six months of existence)</h3>
<p>Compete.com is an online tool used to measure traffic against your competition. If your site has existed for a substantial amount of time and has yet to be noticed by Compete, your site is likely getting very minimal amounts of visitors.</p>
<h3>19.     There are specific on-page browser recommendations</h3>
<p>These should be unnecessary because as previously stated, your site should be usable in all browsers.</p>
]]></content:encoded>
			<wfw:commentRss>http://mentormate.com/blog/19-signs-your-web-site-was-poorly-designed-developed/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Optimized paging query implementation for Microsoft SQL Server 2005</title>
		<link>http://mentormate.com/blog/optimized-paging-queries-microsoft-sql-server-2005/</link>
		<comments>http://mentormate.com/blog/optimized-paging-queries-microsoft-sql-server-2005/#comments</comments>
		<pubDate>Wed, 25 Feb 2009 15:03:38 +0000</pubDate>
		<dc:creator>Dimitar Dobrev</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://mentormate.com/blog/?p=45</guid>
		<description><![CDATA[Paging queries or paging records is an often-used approach in web applications. It displays subsets of data records as a page, allowing the user to navigate more easily through all pages. The straightforward implementation of a paging query running over large data sets in a stored procedure in MS SQL 2005 can cause increased server load when large numbers of paging queries are executed simultaneously.]]></description>
			<content:encoded><![CDATA[<p>We did performance tests on several methods of paging implementation and found the fastest one:</p>
<pre class="brush: plain;">DECLARE @PageNumber INT
DECLARE @PageSize INT
SET @PageNumber = 2
SET @PageSize = 10
SELECT TOP (@PageSize) * FROM
(
SELECT
ROW_NUMBER() OVER (ORDER BY FieldA) As RowID,
FieldB,FieldC,
TotalRows=COUNT(*) OVER()
FROM TheTable
) TmpTable
WHERE TmpTable.RowID &gt; ((@PageNumber-1)*@PageSize)</pre>
<p>One significant advantage of this implementation approach is that there is no need for a second query that returns the total count of the paged data. The total record count is returned as a column in the result set. This minimizes the number of queries that are needed to return a paged result set. If not needed, the “TotalRows” column can be removed from the query.</p>
]]></content:encoded>
			<wfw:commentRss>http://mentormate.com/blog/optimized-paging-queries-microsoft-sql-server-2005/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
