Monday, April 3. 2006
Pawel Foremski is preparing to release the latest version (0.42) of his qmail-spp patch for qmail. This incredibly useful patch allows you to modify the behaviour of qmail, on the fly, through use of external scripts. These external scripts can be written in any programming language that allows STDIN and STDOUT. I have found this to be incredibly useful and it has haled tremendously when targeted by spammers and virii. There was some initial concern about the overhead involved with calling an external program for processing, but my fears have been calmed since then. I've seen this patch in production on machines processing over 250,000 emails per day. That's a LOT of email. The patch allows you to inject special processing during specific portions of the smtpd process. These areas include
HELO/EHLO, MAIL, RCPT, DATA and (if supported) AUTH. There is also another hook available when the client connects, before any data is transferred between the client and server. These 6 areas allow for a massive amount of power. For instance, you can interrupt the process right after the HELO/EHLO and run an spf plugin. Or, you can check the from address during the RCPT portion and determine if the user is relaying, and if they're allowed. Basically, a chkusr function. Tarpitting is fairly simple at the RCPT level as well. The initial connection point is a great time to check for blacklists. In fact, you can set different SPP config files for use depending on where the connection originates. Thus, you can add additional RBL lists depending on the source. So, you can skip RBL altogether for known local connections, and use a wider range of blocklists for external connections. All in all, the flexibility is incredible. I highly recommend the use of this patch for any qmail installation intended for normal mail use. Obviously if you're never going to allow mail delivery, there's no real point, but if you need a strong, secure mail server, this is definitely a step in the right direction. In fact, I worked with Pawel to create a patch that will work with the SMTP AUTH/TLS patch that Bill Shupp put together. Bill has a nice page with a complete qmail toaster on it. His toaster was the basis for my own foray into the qmail scene, and I owe a lot to the work he's done. I've built my own toaster based loosely on his, but using the qmail-spp patch, and some of my own experience. You can find my toaster by either clicking here, or on the link to the right.
Monday, March 6. 2006
I've been perusing the boards over at PHP Freaks lately and I've noticed a few annoying practices that I want to highlight. In my experience, keeping things as simple as possible helps to keep the code clean and usable. It's easier to debug, easier to change, and lasts longer. When dealing with something like PHP, you inevitably run into the problem of differentiating languages. PHP, HTML, CSS, Javascript, UGH! Far too many people combine everything in one file and try to make sense of it. It's rough enough for some people to keep one language straight, let alone 4. So, let's use some common sense. It's possible to separate them, so why don't we? Let's start with the simple ones. CSS and Javascript are easily put in separate files. Creating a .js and .css file is a good practice and should be a standard step in all web creation. Granted, this should be done with some additional common sense. Creating either file for one or two small additions is not necessary unless those functions/definitions are used frequently through several pages. So, we've removed 2 of the 4 languages and separated them out to their own files. How about the PHP and HTML? Well, there's a fairly easy solution there too. I, personally, use the Smarty Template Engine. I believe there are other template systems out there, but Smarty works for me and I like it. Basically, you put all your php code in one file, make calls to $smarty->assign() and variables from php appear as Smarty variables in the template. From there you can easily "print" them in the template by using something like {$var} ... Extremely flexible. Smarty also allows you to do some primitive programming. Enough to make it useful, but not so much that you get confused once more by 2 languages in one file. So now we've separated everything into it's own file. It's easier to read, easier to understand, and easier to make changes. Imagine being able to simply change the HTML only and not worry about impacting the logic in the PHP program! Ahh.. flexibility! Next on my pet peeve list is programmers who just won't use functions like sprintf()... Let's try an example here.. Which looks simpler : $query = 'SELECT id, name, age, salary FROM users WHERE name LIKE "%' . $name . '%" AND age > ' . $age . ' AND salary > ' . $salary . ' ORDER BY name'; or this : $query = sprintf('SELECT id, name, age, salary FROM users WHERE name LIKE "%%%s%%" AND age > %d AND salary > %f ORDER BY NAME', $name, $age, $salary); Now, at first glance, the second one looks a little suspect. That's because I chose what might be considered an ugly example. But, an experienced programmer can tell at a glance what the intended value of the 3 variables used in the query should be. String, Decimal, and Float. In addition to making it look a little nicer, you also gain some security. If someone snuck a string in for $age, it has no effect. So even if you skip sanitizing your variables, you still have a little bit of security. (Don't skip sanitization...) Simple additions to your coding toolkit, tons and tons of enhancements to your skillset. Please, code responsibly.
Tuesday, February 21. 2006
There's a new or, rather, old programming language.. wait.. language? Hrm.. mixture of concepts is more like it. Anyways, there's this new way of doing things on the web. It's called AJAX which is an acronym for Asynchronous Javascript and XML. Based on the XMLHttpRequest object, it allows a web programmer to transfer information between the server and the web browser without requiring a complete reload of the web page. Pretty nifty stuff.
Dubbed Web 2.0, this "new" technology is revolutionizing the way users interact with the web. More than a mere buzzword, AJAX is sweeping the web and offering up some very powerful web applications. Gmail has been using AJAX for a while now. AJAX, combined with DHTML, allows you to "build" your Google homepage, and allows that same page to be updated on the fly without reloading the entire page. More recently, sites such as Netvibes, Pageflakes, and Eskobo offer "Web Desktops". Other sites such as Yahoo Maps and Google Local offer web based mapping software without the arrow clicking and page reloading.
I've purchased a book on AJAX to enhance my own knowledge of this powerful web development tool. It's definitely an intruiging concept and it seems simple enough up front, but extremely powerful when you get deep into it. Stay tuned for more!!!
Wednesday, February 8. 2006
Network management is a field I've been in for the past few years. In addition to making sure that packets get from point A to point B in the most efficient manner, I've also had to deal with network failures and disaster recovery. Essential to the disaster recovery scenario is the concept of backups. We've all heard of backing up the files on your computer, and backing up the servers, and storing them off-site, etc. But sometimes people overlook other backups that need to be handled. Namely, network device configuration backups. It really sucks when you realize that the smoking router in the corner has the only copy of the configuration you need to get the network back up... I've written a bunch of code in the past to handle backing up a bunch of different types of equipment, and I've decided to make it open source. This new project will be hosted at SourceForge, and there is a link to the project page in the links section of this blog. The initial code release will take a little bit to put together, but I'm hoping to have an alpha release within a month or so. It's all written in object-oriented perl, a language I find fun to code in. I hope someone out there finds this useful. I know I spent quite a bit of time looking for a solution like this, and was sadly disappointed that I did not find one...
Sunday, January 29. 2006
I released version 0.6 of phpTodo last night. There were some minor bugfixes, nothing major though. Added to this release were a few new fields in the database to track creation date, and last modified dates. Future releases may utilize these fields more, but at the moment they're only being used for the sort stabilizer.. The task modify code was updated to deal with these 2 new fields. Each time a record is created, the create_date field is populated. Every change updates the last_modified field. Which brings me to another feature I added. I noticed that if you sort by priority, status, or anything other than subject, the entries shifted when you reloaded the page. My initial thought was to just add a behind the scenes secondary sort on id. I changed my mind and decided to give that choice to the user. So, on the preferences screen, the user can choose what field to sort on. This is set to task ID by default. At this point the program is pretty much feature complete. I'm adding in WML support before the 1.0 release, but that's about it. Besides bugfixes, of course. After the 1.0 release, I have some bigger plans. I read a book by David Allen about todo lists and handling tasks.. Really enlightening stuff. Basically, the idea is to process everything in your inbox (anything you need to do), and determine what the next action is. At that point, you file it away based on when it needs to be done. There's obviously a lot more to it, and if you're interested, you can find his book on Amazon. Based on what I learned, I'm planning on adding a number of features to phpTodo. First, I plan on adding an email module. This will allow the user to email todo items to their list. I'll be adding some sort of authentication schema to it to ensure the item goes to the correct list. That has yet to be worked out. I'm also looking at updating the main screen. I'll break it up a bit to become a dashboard of sorts like the presonalized google homepage. Essentially, there will be an inbox which will consist of un-sorted todo items, an interface to quickly go through those items, the main todo list, and a calendar with appointments. Since I'm adding a calendar, I want to also add a tickler module that can send reminders via email, sms, IM, etc. The user can choose the method(s) they want to be notified by and the system will alert them when the time comes. I also want to add group todo lists. In essence, another user that will "share" their list with other users. This will, I believe, add more project management capabilities. Anyone can add a todo list item, and anyone else can take it and work on it. Possibly some sort of notification feature to update all users regarding those items. Overall, I think this project is working out pretty well. I've learned a lot about php programming and I'm working on solidifying my coding style. It's helped me a lot with the coding I've been doing for work. I've put together a complete database system, dsl tools, and the like. Good stuff that I seem to be getting some decent praise for..  You can download the latest version of phpTodo from the phpTodo SourceForge page.
|