<?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"
	>

<channel>
	<title>a square with round corners</title>
	<atom:link href="http://www.xobni.com/bryan/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.xobni.com/bryan</link>
	<description>&#60;a href="http://aboutbryan.com"&#62;Bryan&#60;/a&#62;'s thoughts on web design and development</description>
	<pubDate>Tue, 17 Jun 2008 00:52:50 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5-beta1</generator>
	<language>en</language>
			<item>
		<title>Copy tables from one mysql database to another</title>
		<link>http://www.xobni.com/bryan/2008/06/16/copy-tables-from-one-mysql-database-to-another/</link>
		<comments>http://www.xobni.com/bryan/2008/06/16/copy-tables-from-one-mysql-database-to-another/#comments</comments>
		<pubDate>Tue, 17 Jun 2008 00:52:50 +0000</pubDate>
		<dc:creator>plusbryan</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://www.xobni.com/bryan/?p=31</guid>
		<description><![CDATA[
At Xobni, I&#8217;ve developed a simple testing and deployment platform that helps us ensure that new web code is good before it&#8217;s pushed out the door. Part of this means maintaining two separate databases, one for development and one for live mode (Ruby on Rails developers will find this concept familiar). That way, we can [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.xobni.com/bryan/wp-content/uploads/2008/06/mirror_fretwork_english_looking-glass-189x300.png" alt="" title="mirror" width="189" height="300" class="alignright size-medium attachment wp-att-32" align="right" /><br />
At Xobni, I&#8217;ve developed a simple testing and deployment platform that helps us ensure that new web code is good before it&#8217;s pushed out the door. Part of this means maintaining two separate databases, one for development and one for live mode (Ruby on Rails developers will find this concept familiar). That way, we can test our database-enabled pages without adversely affecting the live database.</p>
<p>But this means the development database gets stale over time and must be refreshed. Ideally it should contain data from the day before or some reasonable approximation. In the past, I relied on the &#8220;copy-database&#8221; command in phpMyAdmin to do this. But being a manual process, and being fairly intensive on the server to boot, it rarely got done.</p>
<p>So I set out to create a php script that would mirror the two databases on a regular schedule. Essentially to copy one database&#8217;s tables to another, erasing the old data in the development database.</p>
<p>It&#8217;s not rocket science, as it turns out. Here it goes:</p>
<blockquote><p>
        $todb = &#8220;development&#8221;;<br />
	$fromdb = &#8220;live&#8221;;</p>
<p>	$sql = &#8220;SHOW TABLES&#8221;;<br />
	$result = mysql_query($sql);<br />
	while($row = mysql_fetch_array($result)) {<br />
		$table = $row[0];<br />
		$sql = &#8220;DROP TABLE IF EXISTS `$todb.$table`&#8221;;<br />
		mysql_query($sql);<br />
		$sql = &#8220;CREATE TABLE $todb.$table LIKE $fromdb.$table&#8221;;<br />
		mysql_query($sql);<br />
		$sql = &#8220;INSERT INTO $todb.$table SELECT * FROM $fromdb.$table&#8221;;<br />
		mysql_query($sql);<br />
	}
</p></blockquote>
<p>The script just loops through each table in your $fromdb and copies it to new tables in the $todb. I have it set to run every 24 hours via cron.</p>
<p>The LIKE syntax is fairly new in mysql (as of 4.1) and permits a fully copy of table, including all indexes and keys. The rest is all pretty standard stuff.</p>
<p>Be sure to fill in the appropriate mysql connection strings, and you&#8217;re good to go. And do a dry run or two before you run back crying that your deployment database got erased and you don&#8217;t have any backups.</p>
<p>I hope this was helpful.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xobni.com/bryan/2008/06/16/copy-tables-from-one-mysql-database-to-another/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Windows Tools: TortoiseSVN</title>
		<link>http://www.xobni.com/bryan/2008/04/03/windows-tools-tortoisesvn/</link>
		<comments>http://www.xobni.com/bryan/2008/04/03/windows-tools-tortoisesvn/#comments</comments>
		<pubDate>Fri, 04 Apr 2008 00:16:27 +0000</pubDate>
		<dc:creator>plusbryan</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[Infrastructure]]></category>

		<guid isPermaLink="false">http://www.xobni.com/bryan/?p=21</guid>
		<description><![CDATA[If you&#8217;re on a windows machine and you use SVN, I&#8217;ll bet you already know about TortoiseSVN. If not, it&#8217;s seriously the most important application in my arsenal. It makes svn management a snap in windows, where before I had to adopt a whole clunky editor (Eclipse) to do the job.
If you don&#8217;t know the [...]]]></description>
			<content:encoded><![CDATA[<p>If you&#8217;re on a windows machine and you use SVN, I&#8217;ll bet you already know about <a href="http://tortoisesvn.tigris.org/" onclick="javascript:urchinTracker ('/outbound/article/tortoisesvn.tigris.org');">TortoiseSVN</a>. If not, it&#8217;s seriously the most important application in my arsenal. It makes svn management a snap in windows, where before I had to adopt a whole clunky editor (Eclipse) to do the job.</p>
<p>If you don&#8217;t know the magic of TortoiseSVN yet, try it!</p>
<p><img src="http://www.xobni.com/bryan/wp-content/uploads/2008/04/tort-235x300.png" alt="" title="tort" width="235" height="300" class="size-medium attachment wp-att-30" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.xobni.com/bryan/2008/04/03/windows-tools-tortoisesvn/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Windows Tools: 7-Zip</title>
		<link>http://www.xobni.com/bryan/2008/03/20/windows-tools-7-zip/</link>
		<comments>http://www.xobni.com/bryan/2008/03/20/windows-tools-7-zip/#comments</comments>
		<pubDate>Thu, 20 Mar 2008 22:20:31 +0000</pubDate>
		<dc:creator>plusbryan</dc:creator>
		
		<category><![CDATA[Random]]></category>

		<guid isPermaLink="false">http://www.xobni.com/bryan/?p=19</guid>
		<description><![CDATA[There are a lot of Windows unzip utilities out there, but 7-zip outshines the rest by far. The shell commands (right click a file to zip or extract), the multitude of supported formats, and the speed of extraction make it a star. And it definitely beats out XP&#8217;s standard unzipper for UI.
]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.xobni.com/bryan/wp-content/uploads/2008/03/229521675_0105d49f9b-150x150.jpg" alt="" title="229521675_0105d49f9b" width="150" height="150" class="alignright size-thumbnail attachment wp-att-29" />There are a lot of Windows unzip utilities out there, but <a href="http://www.7-zip.org/" onclick="javascript:urchinTracker ('/outbound/article/www.7-zip.org');">7-zip</a> outshines the rest by far. The shell commands (right click a file to zip or extract), the multitude of supported formats, and the speed of extraction make it a star. And it definitely beats out XP&#8217;s standard unzipper for UI.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xobni.com/bryan/2008/03/20/windows-tools-7-zip/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Deploy PHP like a Starfleet Commander</title>
		<link>http://www.xobni.com/bryan/2008/03/14/deploy-php-like-a-starfleet-commander/</link>
		<comments>http://www.xobni.com/bryan/2008/03/14/deploy-php-like-a-starfleet-commander/#comments</comments>
		<pubDate>Fri, 14 Mar 2008 18:49:55 +0000</pubDate>
		<dc:creator>plusbryan</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[Infrastructure]]></category>

		<guid isPermaLink="false">http://www.xobni.com/bryan/?p=23</guid>
		<description><![CDATA[
Ruby on Rails brought with it a lot of good practices in regards to code structure and maintenance. At least for me, my experience with RoR two years ago was the first time I&#8217;d used subversion and deployed my code (via capistrano). 
Even though I use PHP on my day-to-day, there&#8217;s no reason why PHP [...]]]></description>
			<content:encoded><![CDATA[<p><a href='http://www.xobni.com/bryan/wp-content/uploads/2008/03/cast_pic1.jpg'><img src="http://www.xobni.com/bryan/wp-content/uploads/2008/03/cast_pic1-300x222.jpg" alt="" title="The Commander" width="300" height="222" class="alignright size-medium attachment wp-att-28" /></a><br />
Ruby on Rails brought with it a lot of good practices in regards to code structure and maintenance. At least for me, my experience with RoR two years ago was the first time I&#8217;d used <a href="http://subversion.tigris.org/" onclick="javascript:urchinTracker ('/outbound/article/subversion.tigris.org');">subversion</a> and deployed my code (via <a href="http://www.capify.org/" onclick="javascript:urchinTracker ('/outbound/article/www.capify.org');">capistrano</a>). </p>
<p>Even though I use PHP on my day-to-day, there&#8217;s no reason why PHP can&#8217;t be deployed like RoR. So let&#8217;s learn a thing or two from the RoR community and create a deploy script for PHP.</p>
<p>What does it mean to &#8216;deploy&#8217; your code? Deployment is more than just a fancy name for syncing your svn repository with your web root. Deploying your code lets you:</p>
<ul>
<li>exclude certain files (i.e. those pesky .svn folders),
<li>put up a &#8216;maintenance&#8217; page while your large upload is running,
<li>set permissions automagically,
<li>leave only ssh (and www) access open on your live server,
<li>deploy to multiple locations at once across servers (for testing, clustering, etc),
<li>and perhaps even <a href="http://www.phpclasses.org/browse/package/3158.html" onclick="javascript:urchinTracker ('/outbound/article/www.phpclasses.org');">compress</a> your code on the fly.
</ul>
<p>Besides, saying &#8216;deploy&#8217; every day kind of makes me feel like the commander of a starship battle group!</p>
<p>Unfortunately, deployment options for PHP seem pretty meager, so I figured I&#8217;d give you a peek into the custom way we do it, in case it&#8217;s helpful to you in your work.</p>
<p><strong>I&#8217;m assuming you&#8217;re already using subversion.</strong> If you&#8217;re not, you should. Even if you&#8217;re on windows, using <a href="http://tortoisesvn.net/downloads" onclick="javascript:urchinTracker ('/outbound/article/tortoisesvn.net');">TortoiseSVN</a> makes using svn as easy as pie. Its <a href="http://athleticsnyc.com/blog/entry/on-using-subversion-for-web-projects" onclick="javascript:urchinTracker ('/outbound/article/athleticsnyc.com');">long-term benefits</a> far outweigh the <a href="http://howtoforge.com/debian_subversion_websvn" onclick="javascript:urchinTracker ('/outbound/article/howtoforge.com');">short setup time</a>. Just use it.</p>
<p>I also assume you are running a dedicated server. It will be hard to implement this on a shared server due to the probable lack of rsync. </p>
<p>Here at Xobni, our process is pretty simple:</p>
<ul>
<li>Webdevs test on their local machines using a custom VMware virtual machine running Debian, and do a subversion checkin when everything looks good.</li>
<li>The deploy script is called on our intranet server with a (-t) switch, which svn-ups the deploy directory there, and then rsync&#8217;s it to a test directory on our primary www box.</li>
<blockquote><p>
cd /var/www/deploy/scripts/<br />
./deploy.sh -t
</p></blockquote>
<li>If all looks dandy on our test url, we push it live by running the deploy script again with the (-d) switch which does the same thing as before, but the rsync is to the root www directory. And whammo! we&#8217;re live.
<li>If something goes wrong, we can always rollback with the -r switch. But I&#8217;ve never needed it. No, not me.
</ul>
<p><strong>The deploy script</strong></p>
<blockquote><p>
#! /bin/bash</p>
<p># folders in wwwroot you want to include in deploy<br />
sites=( domain.com common scripts )</p>
<p># check for required root or sudo access<br />
if [ &#8220;$USER&#8221; != &#8220;root&#8221; ]; then<br />
   echo &#8220;Please run as root&#8221;<br />
   exit 1<br />
fi
</p></blockquote>
<p>Make sure to replace the elements in the {sites} array with the various folders you want to deploy to your www root. Also, the script checks for the root access it will need to svn up and such. Alternately, you could just run it as a privileged user.</p>
<p>Now we need to check to make sure our deploy script has not been updated. Since the deploy script is itself in the svn repository, we want to make sure we&#8217;re using the very latest.</p>
<blockquote><p>
# check for updated version of this script<br />
MODDATEF=$(sudo stat -c %Y /var/www/deploy/scripts/deploy.sh)<br />
svn up /var/www/deploy/scripts<br />
MODDATEL=$(sudo stat -c %Y /var/www/deploy/scripts/deploy.sh)<br />
chmod 755 /var/www/deploy/scripts -R<br />
if [ &#8220;$MODDATEF&#8221; != &#8220;$MODDATEL&#8221; ]; then<br />
   echo &#8220;Deploy script updated. Please run again.&#8221;<br />
   exit 1<br />
fi
</p></blockquote>
<p>Next we need to get the parameters from the script call to see what the user wants us to do, and then run an svn up:</p>
<blockquote><p>
TEST=0<br />
# GET PARAMETERS<br />
while getopts &#8220;:dtr:&#8221; optname<br />
  do<br />
    case &#8220;$optname&#8221; in<br />
      &#8220;d&#8221;)<br />
         echo &#8220;*** Will DEPLOY! ***&#8221;<br />
        DEPLOY=1<br />
         ;;<br />
      &#8220;r&#8221;)<br />
         REVISION=$OPTARG<br />
         ;;<br />
      &#8220;t&#8221;)<br />
         TEST=1<br />
         DEPLOY=1<br />
         echo &#8220;TEST deploy&#8221;<br />
        ;;<br />
      *)<br />
        echo &#8220;error: unexpected parameter&#8221;<br />
        exit 1<br />
        ;;<br />
     esac<br />
  done</p>
<p># inform the user if we are rolling back<br />
if [ !$REVISION ]; then<br />
 echo &#8220;Not rolling back, -r NUM to rollback&#8221;<br />
else<br />
 echo &#8220;ROLLBACK to rev num $REVISION&#8221;<br />
fi</p>
<p># SVN UP (or down) SITES<br />
for site in ${sites[@]}<br />
do<br />
   if [ $REVISION ]; then<br />
    #echo &#8220;Rolling back to rev num $REVISION&#8221;<br />
   svn up /var/www/deploy/$site -r $REVISION<br />
   else<br />
    #echo &#8220;svn to latest revision. run with -r NUM to rollback&#8221;<br />
   svn up /var/www/deploy/$site<br />
   fi<br />
done
</p></blockquote>
<p>Now that we&#8217;ve svn updated our root, we&#8217;re ready to deploy if the right parameter has been specified (-t or -d). Note that we set up <a href="http://www.debian-administration.org/articles/152" onclick="javascript:urchinTracker ('/outbound/article/www.debian-administration.org');">passwordless ssh</a> between our servers, which I recommend if you want a single-command deploy.</p>
<blockquote><p>
deploysite=&#8221;/var/wwwroot&#8221;<br />
predeployloc=&#8221;/var/www/deploy&#8221;<br />
#rsync options to use<br />
deployoptions=&#8221;&#8211;compress &#8211;delete &#8211;progress &#8211;exclude .svn &#8211;archive -e &#8217;ssh -p 22&#8242;&#8221;<br />
# note: deploys to test dir always, and live dir only if deploy</p>
<p>if [ $DEPLOY ]; then<br />
        for site in ${sites[@]}<br />
        do<br />
            # WWW<br />
           su - privledgeduser -c &#8220;rsync $deployoptions $predeployloc/$site privledgeduser@265.265.265.265:$deploysite-test&#8221;<br />
	   echo &#8220;TEST - WWW deploy completed ($site)&#8221;<br />
           if [ $TEST != 1 ]; then<br />
                  su - privledgeduser -c &#8220;rsync $deployoptions $predeployloc/$site privledgeduser@265.265.265.265:$deploysite&#8221;<br />
                  echo &#8220;LIVE - WWW deploy completed! ($site)&#8221;<br />
            fi<br />
        done<br />
        echo &#8220;Completed!&#8221;<br />
else<br />
        echo &#8220;Did not deploy: run with -d to deploy&#8221;<br />
fi
</p></blockquote>
<p>Be sure to change &#8216;privledgeduser&#8217; to the passwordless user, and 265.265.265.265 to your remote server&#8217;s ip address.</p>
<p>Now, when you run deploy.sh, with one line you&#8217;ll be taking care of syncing your site to the very latest in your svn repository!</p>
<p>Ok, so maybe commanding ships into battle would be more fun, but you have to admit it&#8217;s a thrill when your infrastructure works so seamlessly.  One of these days I&#8217;m going to convince the guys to install a <a href="http://www.designnotes.com/Merchant2/graphics/00000001/HAA40R.JPG" onclick="javascript:urchinTracker ('/outbound/article/www.designnotes.com');">flashing red light</a> above my desk that I can activate when I deploy. To the stars we go! </p>
]]></content:encoded>
			<wfw:commentRss>http://www.xobni.com/bryan/2008/03/14/deploy-php-like-a-starfleet-commander/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Track spam with your gmail account</title>
		<link>http://www.xobni.com/bryan/2007/11/30/monitoring-spam-with-gmail/</link>
		<comments>http://www.xobni.com/bryan/2007/11/30/monitoring-spam-with-gmail/#comments</comments>
		<pubDate>Sat, 01 Dec 2007 03:13:25 +0000</pubDate>
		<dc:creator>plusbryan</dc:creator>
		
		<category><![CDATA[Random]]></category>

		<guid isPermaLink="false">http://www.xobni.com/bryan/2007/11/30/monitoring-spam-with-gmail/</guid>
		<description><![CDATA[As you know, gmail has an awesome spam filter. It&#8217;s the reason I started using it for personal email in the first place.
They also have a cool feature that is not at all well documented, which can help you find out where your spam is coming from. The premise is simple - you can attach [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.xobni.com/bryan/wp-content/uploads/2007/11/spam-c07.thumbnail.jpg" align="right" hspace=4 border=2>As you know, gmail has an awesome spam filter. It&#8217;s the reason I started using it for personal email in the first place.</p>
<p>They also have a cool feature that is not at all well documented, which can help you find out where your spam is coming from. The premise is simple - you can attach ANY string to your email address with a plus sign like so:</p>
<blockquote><p>
<strong>yourname<em>+spammersitecom</em>@gmail.com</strong>
</p></blockquote>
<p>The email will still make it to your gmail account, and you&#8217;ll be able to see that string.<br />
If you follow this format when signing up on web sites, you can track to see who&#8217;s selling your information &#8212; and essentially arrive at the source of the spam. Since most spam comes from your email spreading from one to many, this is where tracking down the source is important. If they&#8217;re scrupulous, you can just ask to be removed.</p>
<p>In one instance, by doing this, I found out that a web backup service I signed up for had shared my email to some advertisers, and I was able to opt-out (the source) before it went out any further.</p>
<p>You might try this on web sites that you post your email to as well - that&#8217;s where most of my spam comes from, and it&#8217;s enlightening to see which of my sites draws in the most spambots. It helps me decide where I should implement web forms instead of just listing my email address.</p>
<p>This is very similar to an idea I launched a few years back called spamtree.com (I&#8217;ve since taken the domain down). It was pretty basic: you&#8217;d sign up for a flexible email address like this (i.e. bryan-applecom@spamtree.com), and if they ever emailed you or sold your name, you could track that on a graph (and set up permissions that, for example, only allowed them to email you once). Presumably, the more your email was passed around, the graph would look somewhat like a tree with branches and nodes, hence the name.</p>
<p>It never caught on, probably because it was so nerdy (like me!), but I&#8217;m glad to see that gmail has introduced the backbone of this concept. I don&#8217;t even know if they *meant* to for tracking spam - but that&#8217;s what&#8217;s so fun about unadvertised features: no one is forcing you into a particular frame of mind, so you can be inventive in their use.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xobni.com/bryan/2007/11/30/monitoring-spam-with-gmail/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Saving your Wordpress posts from tyranny (or, How to Disable the Wordpress WYSIWYG editor)</title>
		<link>http://www.xobni.com/bryan/2007/11/02/saving-your-wordpress-posts-from-tyranny/</link>
		<comments>http://www.xobni.com/bryan/2007/11/02/saving-your-wordpress-posts-from-tyranny/#comments</comments>
		<pubDate>Fri, 02 Nov 2007 18:08:45 +0000</pubDate>
		<dc:creator>plusbryan</dc:creator>
		
		<category><![CDATA[Infrastructure]]></category>

		<guid isPermaLink="false">http://www.xobni.com/bryan/2007/11/02/saving-your-wordpress-posts-from-tyranny/</guid>
		<description><![CDATA[Even with today&#8217;s modern version 2.3 era, Wordpress&#8217;s WYSIWYG editor is still the evil, overbearing dictator it always was: &#8220;You couldn&#8217;t possibly have wanted to put that tag there - I&#8217;ll go ahead and remove it for you!&#8221; How helpfully MS-Word-smart-paste-paper-clip of you!
Thankfully, it&#8217;s easier to remove this most egregious of components than a real [...]]]></description>
			<content:encoded><![CDATA[<p><img src='http://www.xobni.com/bryan/wp-content/uploads/2007/10/dictator.thumbnail.jpg' align="right" alt='' />Even with today&#8217;s modern version 2.3 era, Wordpress&#8217;s WYSIWYG editor is still the evil, overbearing dictator it always was: &#8220;You couldn&#8217;t possibly have wanted to put that tag there - I&#8217;ll go ahead and remove it for you!&#8221; How helpfully MS-Word-smart-paste-paper-clip of you!</p>
<p>Thankfully, it&#8217;s easier to remove this most egregious of components than a real dictator! Just follow these easy steps:<br />
1) Go to &#8216;Users&#8217;<br />
2) Click &#8216;edit&#8217; next to your account (you&#8217;ll have to do this for every user who doesn&#8217;t want WYSIWYG)<br />
3) Uncheck &#8216;Use the visual editor when writing&#8217;<br />
4) Revel in the newfound power!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xobni.com/bryan/2007/11/02/saving-your-wordpress-posts-from-tyranny/feed/</wfw:commentRss>
		</item>
		<item>
		<title>A better programmer&#8217;s font</title>
		<link>http://www.xobni.com/bryan/2007/10/30/a-better-programmers-font/</link>
		<comments>http://www.xobni.com/bryan/2007/10/30/a-better-programmers-font/#comments</comments>
		<pubDate>Tue, 30 Oct 2007 21:59:04 +0000</pubDate>
		<dc:creator>plusbryan</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://www.xobni.com/bryan/?p=12</guid>
		<description><![CDATA[For years I&#8217;ve used Courier New or whatever font my IDE chose for me. On a whim, I decided to search for a better programmer&#8217;s font; one that&#8217;s not only is easier on the eyes, but is more compact and efficient. I think I&#8217;ve found it: ProggyFonts

The Proggy font collection is composed of several free [...]]]></description>
			<content:encoded><![CDATA[<p>For years I&#8217;ve used <em>Courier New</em> or whatever font my IDE chose for me. On a whim, I decided to search for a better programmer&#8217;s font; one that&#8217;s not only is easier on the eyes, but is more compact and efficient. I think I&#8217;ve found it: <a href="http://www.proggyfonts.com/" onclick="javascript:urchinTracker ('/outbound/article/www.proggyfonts.com');">ProggyFonts</a></p>
<p><img src='http://www.xobni.com/bryan/wp-content/uploads/2007/10/oldfontcompare.png' alt='' /></p>
<p>The Proggy font collection is composed of several <strong>free</strong> monospaced fonts designed for programmers, and emphasizes what hackers really want: easy readability and concise presentation. It&#8217;s so much better than what I was using this morning that I can&#8217;t believe I lived with Courier for so long.</p>
<p>I know it&#8217;s probably a sign of deep rooted psychological instability to get this excited over a <i>font</i>, but I can&#8217;t help it! Yay!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xobni.com/bryan/2007/10/30/a-better-programmers-font/feed/</wfw:commentRss>
		</item>
		<item>
		<title>IMAP + Gmail + Outlook + Xobni = Bliss</title>
		<link>http://www.xobni.com/bryan/2007/10/26/imap-gmail-outlook-xobni-bliss/</link>
		<comments>http://www.xobni.com/bryan/2007/10/26/imap-gmail-outlook-xobni-bliss/#comments</comments>
		<pubDate>Fri, 26 Oct 2007 20:46:01 +0000</pubDate>
		<dc:creator>plusbryan</dc:creator>
		
		<category><![CDATA[Random]]></category>

		<guid isPermaLink="false">http://www.xobni.com/bryan/?p=17</guid>
		<description><![CDATA[In case you haven&#8217;t heard, Gmail has finally released IMAP support for Gmail. This means that you can access Gmail from Outlook (or any email client for that matter). The clear implication here is that I can use Xobni on my gmail inbox, finally!
Setting up Gmail on Outlook
]]></description>
			<content:encoded><![CDATA[<p>In case you haven&#8217;t heard, Gmail has finally released IMAP support for Gmail. This means that you can access Gmail from Outlook (or any email client for that matter). The clear implication here is that I can use Xobni on my gmail inbox, finally!</p>
<p><a href="http://mail.google.com/support/bin/answer.py?ctx=%67mail&#038;hl=en&#038;answer=75726" onclick="javascript:urchinTracker ('/outbound/article/mail.google.com');">Setting up Gmail on Outlook</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.xobni.com/bryan/2007/10/26/imap-gmail-outlook-xobni-bliss/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Memory Leak in Google Desktop</title>
		<link>http://www.xobni.com/bryan/2007/10/24/memory-leak-in-google-desktop/</link>
		<comments>http://www.xobni.com/bryan/2007/10/24/memory-leak-in-google-desktop/#comments</comments>
		<pubDate>Wed, 24 Oct 2007 23:54:28 +0000</pubDate>
		<dc:creator>plusbryan</dc:creator>
		
		<category><![CDATA[Random]]></category>

		<guid isPermaLink="false">http://www.xobni.com/bryan/?p=14</guid>
		<description><![CDATA[The last few days I&#8217;ve been noticing my system lagging pretty badly at the end of the day. 
On a whim, I took a look at mem usage in the task manager, and noticed the largest memory hog was not firefox as is the custom, but google desktop&#8230; 

As I watched, google gobbled up memory [...]]]></description>
			<content:encoded><![CDATA[<p>The last few days I&#8217;ve been noticing my system lagging pretty badly at the end of the day. </p>
<p>On a whim, I took a look at mem usage in the task manager, and noticed the largest memory hog was not firefox as is the custom, but google desktop&#8230; </p>
<p><img src='http://www.xobni.com/bryan/wp-content/uploads/2007/10/memleak-in-google-desktop.png' alt='' /></p>
<p>As I watched, google gobbled up memory at a rate of over 50K per second!</p>
<p><img src='http://www.xobni.com/bryan/wp-content/uploads/2007/10/memleak-in-google-desktop2.png' alt='' /></p>
<p>Auuga! I only have a few extensions installed - time, google calendar, weather (22C in SF, no way!), and my skype list. Indexing disabled. But considering it starts up with 7.5Mb, that&#8217;s a pretty huge increase. What&#8217;s up, Google? Didn&#8217;t have enough memory in the <a href="http://www.imsai.net/movies/WOPR.jpg" onclick="javascript:urchinTracker ('/outbound/article/www.imsai.net');">ol datacenter</a> and had to use mine?</p>
<p><strong>UPDATE:</strong> It appears to be related to the Skype Widget. After removing it, Google Desktop is no longer hogging all the memory. It&#8217;s a difficult position to be in for Google - they are putting their good name on the line with programmers that may or may not be very good. I wonder if OpenSocial will suffer the same sorts of issues.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xobni.com/bryan/2007/10/24/memory-leak-in-google-desktop/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Simple dynamic graphs with PHP+mysql</title>
		<link>http://www.xobni.com/bryan/2007/10/22/simple-dynamic-graphs-with-phpmysql/</link>
		<comments>http://www.xobni.com/bryan/2007/10/22/simple-dynamic-graphs-with-phpmysql/#comments</comments>
		<pubDate>Mon, 22 Oct 2007 18:09:57 +0000</pubDate>
		<dc:creator>plusbryan</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://www.xobni.com/bryan/?p=8</guid>
		<description><![CDATA[Graphing in PHP has always been an annoyance for me - while it would be cool feature to have, the need doesn&#8217;t come up nearly enough to warrant paying the exorbitant fees associated with most commercial graphing libraries. Besides, commercial PHP libraries always bring out the miser in me - it just doesn&#8217;t seem to [...]]]></description>
			<content:encoded><![CDATA[<p>Graphing in PHP has always been an annoyance for me - while it would be cool feature to have, the need doesn&#8217;t come up nearly enough to warrant paying the exorbitant fees associated with most commercial graphing libraries. Besides, commercial PHP libraries always bring out the miser in me - it just doesn&#8217;t seem to fit with the open source model. Enter <a href="http://www.ebrueggeman.com/phpgraphlib/" onclick="javascript:urchinTracker ('/outbound/article/www.ebrueggeman.com');">Elliot Brueggeman&#8217;s Lightweight PHP Graphing Library</a> - with it I&#8217;ve finally found a PHP graphing library that&#8217;s simple to operate, generates image-based graphs, and is free to boot.</p>
<p><img src="http://www.xobni.com/bryan/wp-content/uploads/2007/10/futurelist_by_clientphp.png" /><br/><br />
This is a graph of future email client requests on <a href="http://www.xobni.com" >xobni.com</a>. It tells us what clients other than Outlook people are using to manage their email, and thus helps us plan out future directions for Xobni Insight.</p>
<p>Elliot&#8217;s graphing library supports bar, line, and pie charts. As far as I can tell, it doesn&#8217;t yet support multiple lines per graph, and the graphs are not anti-aliased (yuck!). But for admin-only graphs, its simplicity is its best asset. The dynamic graph above was produced by this code below:<br />
<br/></p>
<pre>
include("lib/phpgraphlib.php");
include("lib/phpgraphlib_pie.php");

$title = "Future Requests by Client";

$dataArray=array();
$sql = "SELECT client,COUNT(id) as counter FROM Users GROUP BY client";
$result = mysql_query($sql);
while ($row = mysql_fetch_assoc($result)) {
	$counter = $row["counter"];
	$dataArray[$row["which_client"]]=$counter;
}

$graph=new PHPGraphLibPie(265,265);
$graph->addData($dataArray);
$graph->setTitle($title);
$graph->setLabelTextColor("50,50,50");
$graph->setLegendTextColor("50,50,50");
$graph->createGraph();
</pre>
<p>That&#8217;s all there is to creating an image-based graph with Elliot&#8217;s library. In some ways, I prefer this over the <a href="http://www.maani.us/xml_charts/" onclick="javascript:urchinTracker ('/outbound/article/www.maani.us');">flash charting library</a> I&#8217;ve used in the past - while the flash animation is beautiful, it&#8217;s nice that you can just right click and save these image-based graphs for use in powerpoint presentations, etc. Besides, while it took me a good 5 hours to set up the flash library, I had this set up in less than an hour of experimentation. </p>
<p><a href="http://www.ebrueggeman.com/phpgraphlib/downloads.php" target="_blank" onclick="javascript:urchinTracker ('/outbound/article/www.ebrueggeman.com');">Download needed files here</a></p>
<p>There are a few other svg+css+javascript <a href="http://www.liquidx.net/plotkit/" onclick="javascript:urchinTracker ('/outbound/article/www.liquidx.net');">graphing</a> <a href="http://dragan.yourtree.org/blog/en/2007/03/31/ajax-mgraph/" onclick="javascript:urchinTracker ('/outbound/article/dragan.yourtree.org');">libraries</a> that I plan to check out soon; but for now, the Lightweight PHP graphing library did the trick by producing simple graphs with relatively little effort.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xobni.com/bryan/2007/10/22/simple-dynamic-graphs-with-phpmysql/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
