<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' version='2.0'><channel><atom:id>tag:blogger.com,1999:blog-4026771455763366052</atom:id><lastBuildDate>Thu, 04 Jun 2009 20:13:54 +0000</lastBuildDate><title>Ledscripts.com</title><description>Blog posts about programming, database stuff and other technical junk.</description><link>http://www.ledscripts.com/blog/</link><managingEditor>noreply@blogger.com (Jon Coulter)</managingEditor><generator>Blogger</generator><openSearch:totalResults>7</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4026771455763366052.post-5224300499841605734</guid><pubDate>Thu, 04 Jun 2009 20:03:00 +0000</pubDate><atom:updated>2009-06-04T13:13:54.654-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>techcrunch</category><category domain='http://www.blogger.com/atom/ns#'>javascript</category><category domain='http://www.blogger.com/atom/ns#'>greasemonkey</category><category domain='http://www.blogger.com/atom/ns#'>fun</category><title>Make TechCrunch worth reading again... with greasemonkey!</title><description>For those of you that enjoy tech and startup news, &lt;a href="http://www.techcrunch.com/"&gt;TechCrunch&lt;/a&gt; is (or at least used to be) a good source for news.&lt;br /&gt;&lt;br /&gt;Over the past year or so it has gone down hill in a few regards:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Full of biased articles&lt;/li&gt;&lt;li&gt;Every other post is about Twitter (many times consecutive posts are about Twitter)&lt;/li&gt;&lt;li&gt;There are petty posts posted by certain authors every once in a while just to stir things up.&lt;/li&gt;&lt;/ol&gt;So I figured, rather then abandon &lt;a href="http://www.techcrunch.com/"&gt;TechCrunch&lt;/a&gt; all together, why not just write a &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/748"&gt;GreaseMonkey&lt;/a&gt; script to clean it up when the page loads.  That way I can read it without ever seeing a post about Twitter!&lt;br /&gt;&lt;br /&gt;My script removes any posts related to twitter as well as has a filter in place to remove articles written by a specific author (though this is only an example, I suggest you edit the script to your liking).&lt;br /&gt;&lt;br /&gt;You can download my basic &lt;a href="http://www.ledscripts.com/blog/smashposts.user.js"&gt;script here&lt;/a&gt;.  Give it a try, improve upon it,  let me know if it is of value to you at all.&lt;br /&gt;&lt;a href="http://www.ledscripts.com/blog/smashposts.user.js"&gt;&lt;br /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='//blogger.googleusercontent.com/tracker/4026771455763366052-5224300499841605734?l=www.ledscripts.com%2Fblog'/&gt;&lt;/div&gt;</description><link>http://www.ledscripts.com/blog/2009/06/make-techcrunch-worth-reading-again.html</link><author>noreply@blogger.com (Jon Coulter)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4026771455763366052.post-3254442011883065540</guid><pubDate>Fri, 13 Mar 2009 22:03:00 +0000</pubDate><atom:updated>2009-03-13T15:37:52.336-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>sql</category><category domain='http://www.blogger.com/atom/ns#'>startup</category><category domain='http://www.blogger.com/atom/ns#'>search</category><category domain='http://www.blogger.com/atom/ns#'>google</category><title>Google searching with SQL</title><description>A co-worker over at &lt;a href="http://www.chacha.com/"&gt;chacha&lt;/a&gt; and I were talking one day and decided it would be "cool" to be able to search google with select statement (note the sarcastic air quotes around "cool"?)&lt;br /&gt;&lt;br /&gt;For example, why not write a select statement like so:&lt;br /&gt;&lt;br /&gt;SELECT * FROM google g&lt;br /&gt;WHERE g.query = 'barack obama'&lt;br /&gt; and g.title like '%policy%' and g.text like '%economic%'&lt;br /&gt; and g.site &lt;&gt; 'wsj.com'&lt;br /&gt; and g.filetype in ('html') and g.filetype &lt;&gt; 'jpg';&lt;br /&gt;&lt;br /&gt;... instead of using the google advanced search format (which becomes '&lt;font size="-1"&gt;&lt;b&gt;"barack obama" intitle:*policy* intext:*economic* -site:wsj.com filetype:html -filetype:jpg&lt;/b&gt;')&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://sqlsear.ch/"&gt;Now you can&lt;/a&gt;!  I took about 3 hours and a few open source sql parsing modules and created &lt;a href="http://sqlsear.ch/"&gt;sqlsear.ch&lt;/a&gt;.  You simply type in a select statement (the 'where' clause is all that matters right now) and sqlsear.ch converts it to google's advanced search syntax and runs the search for you!&lt;br /&gt;&lt;br /&gt;Special thanks to the sweds for the .ch top-level domain extension and for letting me purchase it!&lt;br /&gt;&lt;br /&gt;Go on over and give it a try.  Drop me a line if you can think of anything you want improved/changed/fixed or whatever.&lt;br /&gt;&lt;br /&gt;- Jon&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='//blogger.googleusercontent.com/tracker/4026771455763366052-3254442011883065540?l=www.ledscripts.com%2Fblog'/&gt;&lt;/div&gt;</description><link>http://www.ledscripts.com/blog/2009/03/google-searching-with-sql.html</link><author>noreply@blogger.com (Jon Coulter)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4026771455763366052.post-1762263331231290147</guid><pubDate>Fri, 13 Mar 2009 02:01:00 +0000</pubDate><atom:updated>2009-03-12T19:35:46.487-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>api</category><category domain='http://www.blogger.com/atom/ns#'>response</category><category domain='http://www.blogger.com/atom/ns#'>twilio</category><category domain='http://www.blogger.com/atom/ns#'>opensource</category><title>Twilio Responses made Super Easy</title><description>In case you haven't heard of it, &lt;a href="http://www.twilio.com/"&gt;Twilio&lt;/a&gt; is a super cool, super easy to use and program voice service started last year.  It is basically a full on PBX system that you can program very easily with and can scale to handle any demand you can throw at it, as it is built using Amazon's cloud infrastructure.&lt;br /&gt;&lt;br /&gt;(Side node: I'm very jealous of it.  This is exactly the kind of cool yet simple thing I wish I could think of!)&lt;br /&gt;&lt;br /&gt;While the Twilio folks have provided &lt;a href="http://www.twilio.com/docs/libraries/"&gt;libraries for their REST API&lt;/a&gt;, the "response" side of the equation is left completely up to you to form.  This is very easy to do; the easy with which you can do this is, in fact, key to how simple the service is to use in general.  However, I don't like writing code that concatenates xml strings together, nor do I want to use the heavy-handed xml libraries that are out there to simply print results like "&lt;say&gt;Doggies are cute!&lt;/say&gt;".   One key thing on "hand crafting" the xml responses is that you have to remember to encode any special xml characters.  If you are using any sort of user-input values to generate this xml, then you have to be constantly aware of this and escape everything.&lt;br /&gt;&lt;br /&gt;So, to the point, I wrote a simple PHP class (2 classes, really) and dropped them over on the ledscripts &lt;a href="http://code.google.com/p/ledscripts-opensource/source/browse/#svn/trunk/libraries/php/twilio"&gt;google code page&lt;/a&gt;.  This basically allows you to general the xml needed in a fashion similar to the "flow" you are outputting yourself.  Let's look at an example.&lt;br /&gt;&lt;br /&gt;To generate a simple response, you can do something like this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$response = new TwilioResponse();&lt;br /&gt;$response-&gt;Say('Doggies are Cute');&lt;br /&gt;$response-&gt;Respond();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;(I know it is more lines, but it makes more sense and gets cooler).&lt;br /&gt;&lt;br /&gt;Let's look at a better example (easier to read &lt;a href="http://code.google.com/p/ledscripts-opensource/source/browse/trunk/libraries/php/twilio/examples/example2.php"&gt;here&lt;/a&gt;):&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$response = new TwilioResponse();&lt;br /&gt;&lt;br /&gt;$response-&gt;Say('this is a test, my friend',&lt;br /&gt;array('voice' =&gt; 'woman', 'loop' =&gt; 2)&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;// Gather, with the alternate method of doing verbs (as a "get" that can be passed as sub-verbs)&lt;br /&gt;$response-&gt;Gather(&lt;br /&gt;array(&lt;br /&gt;$response-&gt;GetVerb(TwilioResponse::V_SAY, 'Thank you for calling. Please press 1 for more options'),&lt;br /&gt;$response-&gt;GetVerb(TwilioResponse::V_PAUSE),&lt;br /&gt;$response-&gt;GetVerb(TwilioResponse::V_SAY, 'Go on. Press something')&lt;br /&gt;),&lt;br /&gt;array(&lt;br /&gt;'action' =&gt; '/handle-response.php?a=b&amp;amp;c=d', // note that the &amp;amp; here must be encoded... the library takes care of it!&lt;br /&gt;'numDigits' =&gt; 1&lt;br /&gt;)&lt;br /&gt;);&lt;br /&gt;$response-&gt;Respond();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;You can find out more in the examples folder in the repository.  This may not be a perfect library, as I put it together in the course of about 1 hour, but it has worked very well for what I've done.&lt;br /&gt;&lt;br /&gt;Let me know if any bugs are found, or if you have any requests/suggestions for improvements!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/ledscripts-opensource/source/checkout"&gt;Here&lt;/a&gt; is the SVN page on google code. To check out just this library and the examples:&lt;br /&gt;&lt;tt&gt;svn checkout &lt;strong&gt;&lt;em&gt;http&lt;/em&gt;&lt;/strong&gt;://ledscripts-opensource.googlecode.com/svn/trunk/libraries/php/twilio .&lt;/tt&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='//blogger.googleusercontent.com/tracker/4026771455763366052-1762263331231290147?l=www.ledscripts.com%2Fblog'/&gt;&lt;/div&gt;</description><link>http://www.ledscripts.com/blog/2009/03/twilio-responses-made-super-easy.html</link><author>noreply@blogger.com (Jon Coulter)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4026771455763366052.post-7416557226796077198</guid><pubDate>Fri, 09 Nov 2007 17:36:00 +0000</pubDate><atom:updated>2009-03-12T15:52:17.602-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>System Administration</category><category domain='http://www.blogger.com/atom/ns#'>Linux</category><title></title><description>&lt;p&gt;I tend to get myself involved with projects that have a lot of small files -- on the order of a few million.  These files are often only good to me for a short period of time, such as when I'm importing a million xml files into a &lt;a href="http://www.postgresql.org/" target="_blank" mce_href="http://www.postgresql.org/"&gt;SQL Database&lt;/a&gt; for processing later.  I've also worked on projects where millions of spam emails pile up in queues to be filtered by humans, which they obviously never will be, and simply need to be removed.&lt;/p&gt; &lt;p&gt;The annoying thing about this is the time/effort it takes to remove all of these files quickly and with as little system resource consumption as possible.&lt;/p&gt; &lt;p&gt;In this entry I'm going to show you a couple of ways you can set your self up for quick removal of files that you know (or are pretty sure) will be temporary, so you need to quickly remove them.&lt;/p&gt; &lt;p&gt;&lt;img src="http://www.ledscripts.com/blog/wp-includes/js/tinymce/themes/advanced/images/spacer.gif" moretext="" alt="More..." title="More..." class="mce_plugin_wordpress_more" name="mce_plugin_wordpress_more" width="100%" height="10" /&gt;&lt;/p&gt; &lt;p&gt;Traditionally, if you had a big directory structure to remove, you would simply use rm -rf to remove the files:&lt;/p&gt; &lt;pre&gt;&lt;code&gt;rm -rf /home/mybigpath&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;Of course, this will take forever and chew up all sort of valuable system resources. We want our CPUs being used for business logic, not recursive directory searching and unlink operation!&lt;/p&gt; &lt;p&gt;So how do we avoid doing an unlink of all of those files? Well the key here is to set ourselves up knowing that we're going to remove these files in the first place. Basically, we're going to create another file system specifically for these millions of files, and when we're done with them, we'll simply remove/format the file system we were using. There are several ways we can do this, just to name a few:&lt;/p&gt; &lt;ol&gt;&lt;li&gt;We can dedicate whole partitions of hard drives (logic or physical) to this temporarly location.&lt;/li&gt;&lt;li&gt;We can use something lvm (or &lt;a href="http://sourceware.org/lvm2/" target="_blank" mce_href="http://sourceware.org/lvm2/"&gt;lvm2&lt;/a&gt;) to manage these temporary chunks of disk space.&lt;/li&gt;&lt;li&gt;We can use loop-device file mounting to create truly temporary file stores that require one unlink operation to blow away!&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;I personally like #3 for thinks I &lt;i&gt;know&lt;/i&gt; are going to be deleted, and #2 for things that I might want to keep around, so I need to be safe.&lt;/p&gt; &lt;p&gt;I'm going to first show you option #3 (loop-device file), as this is the easiest to make use of.  The basic steps for this:&lt;/p&gt; &lt;ol&gt;&lt;li&gt;Create an "empty" file on your real file system.&lt;/li&gt;&lt;li&gt;Format that file as a file system block.&lt;/li&gt;&lt;li&gt;Mount the file using the "-o loop" option.&lt;/li&gt;&lt;li&gt;Create millions/billions/trillions of files within the newly mounted file system, and do whatever processing needs to be done on them.&lt;/li&gt;&lt;li&gt;When you're done with the files, unmount the file and simply delete the large fake file system, which is a very simple and efficient operation for the OS to do.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Let's dig into the details&lt;/p&gt; &lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;~# cd /mnt&lt;br /&gt;/mnt# mkdir fakepoint&lt;br /&gt;# This creates a 200MB file&lt;br /&gt;/mnt# dd if=/dev/zero of=fake.img bs=1M count=200&lt;br /&gt;200+0 records in&lt;br /&gt;200+0 records out&lt;br /&gt;209715200 bytes (210 MB) copied, 6.93631 seconds, 30.2 MB/s     &lt;br /&gt;&lt;br /&gt;# We're using reiserfs in this example, but any file system should work&lt;br /&gt;/mnt# mkreiserfs -f fake.img&lt;br /&gt;/mnt# mount -o loop /mnt/fake.img /mnt/fakepoint&lt;br /&gt;/mnt# df -h /mnt/fakepoint/&lt;br /&gt;Filesystem            Size  Used Avail Use% Mounted on&lt;br /&gt;/mnt/fake.img         200M   33M  168M  17% /mnt/fakepoint     &lt;br /&gt;&lt;br /&gt;/mnt# cd /mnt/fakepoint/     &lt;br /&gt;&lt;br /&gt;# create 1,000,000 dummy files&lt;br /&gt;/mnt/fakepoint# perl -e&lt;br /&gt;     'for(1..1_000_000) { open(F,"&gt;",$_); print F "hello"; close(F) }'     &lt;br /&gt;&lt;br /&gt;# do a bunch of processing on your files     &lt;br /&gt;&lt;br /&gt;# what if we need to expand our file&lt;br /&gt;# because we didn't allocate enough?&lt;br /&gt;/mnt# umount /mnt/fakepoint/     &lt;br /&gt;&lt;br /&gt;# seek 201mb into the file (so we don't overwrite what we have)&lt;br /&gt;# and add another 200mb&lt;br /&gt;/mnt# dd if=/dev/zero of=fake.img bs=1M count=200 seek=201&lt;br /&gt;200+0 records in&lt;br /&gt;200+0 records out&lt;br /&gt;209715200 bytes (210 MB) copied, 5.97021 seconds, 35.1 MB/s     &lt;br /&gt;&lt;br /&gt;# resize the "file system"&lt;br /&gt;/mnt# resize_reiserfs fake.img      &lt;br /&gt;&lt;br /&gt;# Re-mount&lt;br /&gt;/mnt# mount -o loop /mnt/fake.img /mnt/fakepoint&lt;br /&gt;/mnt# df -h /mnt/fakepoint/&lt;br /&gt;Filesystem            Size  Used Avail Use% Mounted on&lt;br /&gt;/mnt/fake.img         401M  132M  270M  33% /mnt/fakepoint     &lt;br /&gt;&lt;br /&gt;# all done with these files, we want to blow them away now&lt;br /&gt;# simple as this:&lt;br /&gt;/mnt# umount /mnt/fakepoint/&lt;br /&gt;/mnt# rm fake.img&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;Notice that we can even re-size this "fake" file system.  This allows us nearly total flexibility in how we handle these millions of files.&lt;/p&gt; &lt;p&gt;With this technique, you could even "transfer" these files from one Linux system to another by simply copying the file system-file (fake.img, in this case) from one computer to another.&lt;/p&gt; &lt;p&gt;This works very well for simple projects and things that are temporary.  If you want a more permanent solution, you could use lvm2 to create a real logical disk partition that could be managed with enterprise class tools.   Most of the concepts stay the same, except you would use lvm2 to do all the dist-size management (the "dd"  steps.)&lt;/p&gt; &lt;p&gt;On a side note, here is a &lt;a href="http://www.faqs.org/docs/Linux-HOWTO/Loopback-Encrypted-Filesystem-HOWTO.html" target="_blank" mce_href="http://www.faqs.org/docs/Linux-HOWTO/Loopback-Encrypted-Filesystem-HOWTO.html"&gt;nice tutorial&lt;/a&gt; on using loop-devices to create encrypted data blocks.  Very cool stuff.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='//blogger.googleusercontent.com/tracker/4026771455763366052-7416557226796077198?l=www.ledscripts.com%2Fblog'/&gt;&lt;/div&gt;</description><link>http://www.ledscripts.com/blog/2007/11/i-tend-to-get-myself-involved-with.html</link><author>noreply@blogger.com (Jon Coulter)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4026771455763366052.post-7238914346460697083</guid><pubDate>Wed, 19 Sep 2007 16:40:00 +0000</pubDate><atom:updated>2009-03-12T18:35:47.043-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>System Administration</category><category domain='http://www.blogger.com/atom/ns#'>PostgreSQL</category><category domain='http://www.blogger.com/atom/ns#'>Backups</category><title>The Correct way to Backup PostgreSQL</title><description>Begin a full time DBA can make you realize how important backups are.  Enterprise database systems like Oracle and Microsoft's SQL Server provide excellent backup mechanisms for doing "live" backups of the databases that guarantee consistency and allow for &lt;a href="http://en.wikipedia.org/wiki/Point-in-time_recovery"&gt;point-in-time recovery&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;In the open source world, however, we're left with old skoul methods of doing backups such as cold backups, or even worse, text-based "dumps" of the databases.  I'll let you waste your time reading about how MySQL "&lt;a href="http://dev.mysql.com/doc/refman/5.0/en/backup.html"&gt;recommends&lt;/a&gt;" you backup a database, and how PostgreSQL's &lt;a href="http://www.postgresql.org/docs/8.1/interactive/backup.html#BACKUP-DUMP"&gt;pg_dump&lt;/a&gt; works.  These methods are very resource intensive (creating a bunch of "insert" statements and formatting everything as plain text) and can even lock our real working processes (in the case of MySQL) while it is doing the backup!&lt;br /&gt;&lt;br /&gt;&lt;!--more--&gt;&lt;br /&gt;&lt;br /&gt;Thankfully, the folks as PostgreSQL introduced &lt;a href="http://www.postgresql.org/docs/8.1/interactive/backup-online.html"&gt;Online-Backups&lt;/a&gt; in version 8.0.  In my opinion, this is the single biggest advancement in this release of the database engine.  It how handles it's backup is a more Oracle-before-&lt;a href="http://www.oracle.com/technology/deploy/availability/htdocs/rman_overview.htm"&gt;RMAN&lt;/a&gt; fashion (which worked great for many many years for Oracle.)  It basically works like this:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;You setup the database instance to make use of, and keep historical "logs" (WAL for PostgreSQL, "arhive redo logs" for Oracle.)   A contiguous chain of these logs, plus a full backup from some point in the past (more in this in a second) can be used to "replay" every transaction/change in your database.  MySQL sort of implements this with it's binary logs, but it is not quite the same thing.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;You tell the database &lt;em&gt;how&lt;/em&gt; to backup these "logs"&lt;/li&gt;&lt;br /&gt;&lt;li&gt;You do a "full backup" of the database which is on-line, so no body is blocked from doing any work.  In fact, the only work involved in this backup is really the I/O operations required to do a binary copy of the data files to a backup location.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Once you tell the database engine you are done with the backup, it will start (or continue) backing up the logs to a location of your choosing.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;In the event of a failure or need for recovery you can take the full backups (step 3) and apply the saved logs (steps 1, 2 and 4) to recover your database.  Even cooler then that, you can &lt;a href="http://www.postgresql.org/docs/8.1/interactive/backup-online.html#BACKUP-PITR-RECOVERY"&gt;point-in-time recovery&lt;/a&gt;.  Which essentially means that if you had somebody "accidentally" delete a bunch of data at 1:34:00 PM, you can restore the database up to 1:33:59 PM and get back the lost data!&lt;br /&gt;&lt;br /&gt;I'll let you read more details on the &lt;a href="http://www.postgresql.org/docs/8.1/interactive/backup-online.html"&gt;official PostgreSQL backup&lt;/a&gt;page about it, but I would highly recommend this method of backup and recovery to any PostgreSQL DBA that has critical data to take care of.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='//blogger.googleusercontent.com/tracker/4026771455763366052-7238914346460697083?l=www.ledscripts.com%2Fblog'/&gt;&lt;/div&gt;</description><link>http://www.ledscripts.com/blog/2007/09/correct-way-to-backup-postgresql.html</link><author>noreply@blogger.com (Jon Coulter)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4026771455763366052.post-1125765577421542355</guid><pubDate>Sat, 15 Sep 2007 01:35:00 +0000</pubDate><atom:updated>2009-03-12T18:36:52.302-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>PHP</category><category domain='http://www.blogger.com/atom/ns#'>FreeBSD</category><category domain='http://www.blogger.com/atom/ns#'>Perl</category><category domain='http://www.blogger.com/atom/ns#'>System Administration</category><category domain='http://www.blogger.com/atom/ns#'>Linux</category><title>ServAdmin Open Sourced</title><description>&lt;p&gt;I've decided to release a web-hosting application that I had built from scratch a couple of years ago, &lt;a href="http://code.google.com/p/servadmin/" target="_blank" title="ServAdmin" mce_href="http://code.google.com/p/servadmin/"&gt;ServAdmin&lt;/a&gt;. You can access the SVN repository on Google code here: &lt;a href="http://servadmin.googlecode.com/svn/trunk/" mce_href="http://servadmin.googlecode.com/svn/trunk/"&gt;http://servadmin.googlecode.com/svn/trunk/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Some of the features:&lt;/p&gt; &lt;ul&gt;&lt;li&gt;Single administrative panel to control any number of servers (unlimited)&lt;/li&gt;&lt;li&gt;Written from scratch -- does not rely on 3rd party packages&lt;/li&gt;&lt;li&gt;Written in about 95% PHP5 code.&lt;/li&gt;&lt;li&gt;Secure communication between servers using &lt;a href="http://www.stunnel.org/" target="_blank" mce_href="http://www.stunnel.org/"&gt;stunnel&lt;/a&gt;. &lt;ul&gt;&lt;li&gt;This allows you to have servers spread across the Internet where communications between them will happen on open networks, and still maintain a secure environment.&lt;/li&gt;&lt;/ul&gt; &lt;/li&gt;&lt;li&gt;OS-independent - Right now I've only written the 'Linux' server pieces of code, but this could be easily applied to any operation system.  It is designed in such a way that you simply have to write the layer for whatever OS you're concerned with.&lt;/li&gt;&lt;li&gt;Controls MySQL, Apache, Bind and vpopmail to make a complete hosting environment.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;If anybody out there is interested in picking up development, just let me know.  It is really only a few polishes away from being a complete product.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.ledscripts.com/blog/wp-content/uploads/2007/09/servadminscreenshot.png" title="ServAdmin Screen Shot" mce_href="http://www.ledscripts.com/blog/wp-content/uploads/2007/09/servadminscreenshot.png"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='//blogger.googleusercontent.com/tracker/4026771455763366052-1125765577421542355?l=www.ledscripts.com%2Fblog'/&gt;&lt;/div&gt;</description><link>http://www.ledscripts.com/blog/2009/03/servadmin-open-sourced.html</link><author>noreply@blogger.com (Jon Coulter)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4026771455763366052.post-2790012573876974602</guid><pubDate>Tue, 11 Sep 2007 01:37:00 +0000</pubDate><atom:updated>2009-03-12T18:43:21.480-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Mono</category><category domain='http://www.blogger.com/atom/ns#'>.Net</category><title>Nozbe API and .Net</title><description>&lt;p&gt;While browsing this very nice &lt;a href="http://mashable.com/2007/09/08/5000-resources-to-do-just-about-anything-online/" target="_blank" mce_href="http://mashable.com/2007/09/08/5000-resources-to-do-just-about-anything-online/"&gt;5000+ Resources to Do Just About Anything Online&lt;/a&gt; blog entry, I can across a very nice "Getting things Done" site named &lt;a href="http://www.nozbe.com/" target="_blank" mce_href="http://www.nozbe.com/"&gt;Nozbe&lt;/a&gt;. &lt;/p&gt; &lt;p&gt;What I particularly liked about it was that it had a very simple &lt;a href="http://www.nozbe.com/page/api" target="_blank" mce_href="http://www.nozbe.com/page/api" title="View Nozbe's API Page"&gt;API&lt;/a&gt; that you can work with.  Basically, you make a specially formatted request and it sends results back on a &lt;a href="http://en.wikipedia.org/wiki/JSON" target="_blank" mce_href="http://en.wikipedia.org/wiki/JSON"&gt;JSON&lt;/a&gt; response.&lt;/p&gt; &lt;p&gt;JSON was likely chosen as the response type for a few reasons:&lt;/p&gt; &lt;ul&gt;&lt;li&gt;You can make the requests via AJAX so it is very easy to integrate with web sites.&lt;/li&gt;&lt;li&gt;You can easily use it with PHP5's very nice json_&lt;a href="http://us3.php.net/json_encode" target="_blank" mce_href="http://us3.php.net/json_encode"&gt;encode&lt;/a&gt;/&lt;a href="http://us3.php.net/json_decode" mce_href="http://us3.php.net/json_decode"&gt;decode&lt;/a&gt; functions.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;I, however, wanted to be able to write a windows application so that I could quickly add tasks to my project lists without having to actually open a web browser.  The ideal tool would be a simple icon-tray application that I would rick click on and say "add action" (actions are what Nozbe calls what I would call a task.)&lt;/p&gt; &lt;p&gt;I decided to start writing a .Net application to do just this.  In .Net (C#, in my case) you have to have some external library to handle the JSON parsing -- because writing it yourself would be a pointless waste of time. &lt;/p&gt; &lt;p&gt;Thankfully, &lt;a href="http://www.newtonsoft.com/products/json/" target="_blank" mce_href="http://www.newtonsoft.com/products/json/"&gt;Json.Net&lt;/a&gt; has done just that for us.    Thanks to this nice library and about 10 minutes of fiddling around, I was able to piece together a "proof of concept" application to show myself that want I wanted to do, could be done.&lt;/p&gt; &lt;p&gt;For now, I'll throw up my demo application for anybody whom wants to do download and extend.  If I actually follow through on completing the application, I'll post the updated app as well. &lt;/p&gt; &lt;p&gt;Side note: I guess I better create an action item in Nozbe to finish the application!  If only there were some Windows application that would allow me to do this very easily....&lt;/p&gt; &lt;p&gt; - Jon&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.ledscripts.com/blog/wp-content/uploads/2007/09/nozbepocscreenshot.png" mce_href="http://www.ledscripts.com/blog/wp-content/uploads/2007/09/nozbepocscreenshot.png" title="Nozbe POC Screenshot"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;a href="http://www.ledscripts.com/blog/nozbe-poc-2007-09-10.zip"&gt;Download Nozbe .Net API Integration Proof of Concept&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='//blogger.googleusercontent.com/tracker/4026771455763366052-2790012573876974602?l=www.ledscripts.com%2Fblog'/&gt;&lt;/div&gt;</description><link>http://www.ledscripts.com/blog/2007/09/nozbe-api-and-net.html</link><author>noreply@blogger.com (Jon Coulter)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item></channel></rss>