<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-399914423284504036</id><updated>2011-11-27T15:38:48.513-08:00</updated><category term='PHP'/><category term='filesystem'/><category term='personal'/><category term='arrays'/><category term='UOM'/><category term='best practices'/><category term='Calculus'/><category term='roman numerals'/><category term='Star Wars'/><category term='ASP'/><category term='regular expressions'/><category term='atomic'/><category term='VB.NET'/><category term='Math'/><category term='SSL'/><category term='chemistry'/><category term='datetime'/><category term='Trigonometry'/><category term='strings'/><category term='Temperature'/><category term='Star Trek'/><category term='control structures'/><category term='ASP.NET'/><title type='text'>Reusable Code</title><subtitle type='html'>ASP and PHP code that you can use and re-use. Practical examples for real-world programming, under a Creative Commons license.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>79</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-8561115551433053086</id><published>2011-09-20T10:18:00.000-07:00</published><updated>2011-09-20T10:40:16.947-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VB.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='SSL'/><title type='text'>Force SSL in VB.NET</title><content type='html'>Today I'm wrapping up a project to convert an existing web site to use SSL communication only. This required adding HTTPS detection in various places to prevent mixed-content errors. I'm not entirely happy with my solution for that yet, so I'm not going to go into that right now.&lt;br /&gt;&lt;br /&gt;What I do want to talk about is actually forcing the user over to HTTPS once your site is SSL-ready. The code I had used for many years on classic ASP sites was not working reliably; it would redirect, but to the home page instead of the page you tried to access.&lt;br /&gt;&lt;br /&gt;ASP.NET has beefed up the Request object with some additional information we didn't have back in the old days (Request.IsSecureConnection and Request.Url). We also have a new way of including our function libraries, the App_Code folder.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;NameSpace myApplication&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Public Class myLibrary&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Public Shared Sub ForceSSL()&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;If Not System.Web.HttpContext.Current.Request.IsSecureConnection Then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.Web.HttpContext.Current.Response.Redirect(System.Web.HttpContext.Current.Request.Url.AbsoluteUri.Replace("http://", "https://"))&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;End If&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;End Sub&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;End Class&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;End NameSpace&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Then from each page on the site I import my custom library and run the subroutine:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;Imports myApplication.myLibrary&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;Sub Page_Load(sender as Object, e as EventArgs)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ForceSSL()&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'Rest of code goes here...&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;End Sub&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Supposedly there's a way to do this without code by modifying some settings in &lt;abbr title="Internet Information Server"&gt;IIS&lt;/abbr&gt;, but I didn't have any success with that. The particular situation I'm dealing with has some fairly severe cohesion/coupling issues with certain pages being accessed from different subdomains.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://snipplr.com/view/58863/force-ssl/"&gt;Download the VB.NET source code for ForceSSL from Snipplr.com&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-8561115551433053086?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/8561115551433053086/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=8561115551433053086' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/8561115551433053086'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/8561115551433053086'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2011/09/force-ssl-in-vbnet.html' title='Force SSL in VB.NET'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-1201564869918809602</id><published>2011-05-10T17:59:00.001-07:00</published><updated>2011-05-10T18:14:08.242-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VB.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='UOM'/><category scheme='http://www.blogger.com/atom/ns#' term='Temperature'/><title type='text'>Temperature Conversion Revisited</title><content type='html'>&lt;p&gt;I recently completed another ASP.NET project and learned about the app_code folder, which lets you share code between pages. It's slightly similar to the #include directive in Classic ASP, but a lot more structured. I couldn't find much good documentation on it, so most of what I've learned has been through experimentation.&lt;/p&gt;&lt;p&gt;Any files placed into the app_code folder are automatically available from any page in your web application, so you can write: &lt;code&gt;myNamespace.myClass.myFunction(someVariable)&lt;/code&gt; and the magic will happen. Alternatively, you can add &lt;code&gt;Imports myNamespace.myClass&lt;/code&gt; in the top of your page and call &lt;code&gt;myFunction&lt;/code&gt; without all the prefixing.&lt;/p&gt;&lt;p&gt;Though I'm still not a big fan of ASP.NET, this app_code thing is pretty slick and it's inspired me to write more reusable code. I had previously written a collection of functions for temperature conversion, which I've since grown unhappy with after reading &lt;a href="http://www.amazon.com/Code-Complete-Practical-Handbook-Construction/dp/0735619670/ref=sr_1_3?ie=UTF8&amp;qid=1305076400&amp;sr=8-3"&gt;Code Complete 2.0&lt;/a&gt; by &lt;a href="http://www.stevemcconnell.com/"&gt;Steve McConnell&lt;/a&gt; because I named my functions like this: &lt;code&gt;CelsiusToFahrenheit&lt;/code&gt;, instead of like this: &lt;code&gt;FahrenheitFromCelsius&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;I had been planning to write more conversion functions for various units of measurement, but was never satisfied enough with how it was turning out to make it publically available. Besides learning to appreciate ASP.NET, I'm also learning to appreciate object-oriented programming. This whole namespace/class combination with app_code seems to be appropriately suited for doing unit of measurement conversion.&lt;/p&gt;&lt;p&gt;So here's my plan. I've defined a namespace called UOM, which is the manufacturing industry standard abbreviation for unit of measure. Each type of measurement will be a class: temperature, distance, volume, mass, etc. Each class will accept string input so that you can specify both the numeric quantity and the unit of measure simultaneously. The class will use the specified unit of measure to convert values to a common unit of measure, and be able to return values in any equivalent unit of measure.&lt;/p&gt;&lt;h3&gt;VB.NET&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;Imports UOM&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;Dim outside as Temperature&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;outside = New Temperature("10 C")&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;Response.Write(outside.getFahrenheit) 'Displays "50"&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;And so I proudly announce the release of the first installment in the UOM namespace: UOM.Temperature, which handles Celsius, Delisle, Fahrenheit, Kelvin, Newton, Rankine, R&amp;#233;aumur, and R&amp;#248;mer temperature scales.&lt;/p&gt;&lt;p&gt;&lt;a href="http://snipplr.com/view/53332/temperature-class/"&gt;Download the VB.NET source code for UOM.Temperature from Snipplr.com&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-1201564869918809602?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/1201564869918809602/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=1201564869918809602' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/1201564869918809602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/1201564869918809602'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2011/05/temperature-conversion-revisited.html' title='Temperature Conversion Revisited'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-983727027075419745</id><published>2010-09-14T17:01:00.000-07:00</published><updated>2010-09-14T18:00:45.770-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='best practices'/><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><title type='text'>Scalable Site Structure</title><content type='html'>&lt;p&gt;If you've been developing web sites for a few years, you've probably developed a lot of sites with a structure similar to the following:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;/css/&lt;/li&gt;&lt;li&gt;/images/&lt;/li&gt;&lt;li&gt;/scripts/&lt;/li&gt;&lt;li&gt;index.php&lt;/li&gt;&lt;li&gt;about.php&lt;/li&gt;&lt;li&gt;products.php&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;One of my colleagues likes to keep the root directory as clean as possible, so his site structures look like this:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;/content/about.php&lt;/li&gt;&lt;li&gt;/content/products.php&lt;/li&gt;&lt;li&gt;/common/&lt;/li&gt;&lt;li&gt;/images/&lt;/li&gt;&lt;li&gt;index.php&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Which I find slightly irritating because I prefer to keep my &lt;abbr title="Cascading Style Sheets"&gt;CSS&lt;/abbr&gt; separate from my JavaScript, and the /content/ folder is just taking the mess from one place and moving it to another.&lt;/p&gt;&lt;p&gt;Of course, the Holy Grail of site structures is to have clean &lt;abbr title="uniform resources locator"&gt;URL&lt;/abbr&gt;s like this:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;/about/&lt;/li&gt;&lt;li&gt;/css/&lt;/li&gt;&lt;li&gt;/images/&lt;/li&gt;&lt;li&gt;/products/&lt;/li&gt;&lt;li&gt;/scripts/&lt;/li&gt;&lt;li&gt;index.php&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;If you have a dynamic site, this is easily achieved using mod_rewrite, so /about/ becomes index.php?page=about, but sometimes the client doesn't want to pay for a dynamic site. In that case we use the Poor Man's Clean URLs&amp;trade; wherein we actually create the /about/ and /products/ folders and put an index.php file in each with the static content. The PHP is then only really used to include a header, footer, navigation, etc.&lt;/p&gt;&lt;p&gt;As a site grows, performance and scalability become a (greater) concern. Popular site speed analysis tools often recommend using a content distribution network. Whether you outsource this or try to do it in-house, it sounds like a lot of work.&lt;/p&gt;&lt;p&gt;I hadn't had the privilege of working on a site that experienced enough traffic to be concerned about scalability until earlier this year. The company was running a national television commercial. They had hired another company to develop a micro-site on a separate server for the campaign, but viewers were being directed to the regular corporate site where a gigantic ad enticed them to visit the micro-site. If you're shaking your head right now, me too. The corporate web server was going down almost daily.&lt;/p&gt;&lt;p&gt;The web statistics package indicated that the most downloaded files were the product videos. I still don't know why they aren't using &lt;a href="http://www.youtube.com"&gt;YouTube&lt;/a&gt; or &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt; for this purpose. On a hunch, I copied the video files to the micro-site's web server and changed all the links. They experienced zero downtime after that.&lt;/p&gt;&lt;p&gt;This experience made me think about how to build scalability into a site from the beginning. Something in the back of my mind twigged a memory of reading something about &lt;a href="http://code.google.com/speed/page-speed/docs/request.html"&gt;serving static content from a cookieless domain&lt;/a&gt;. Cookies aside, it turns out that serving content from multiple subdomains has certain &lt;a href="http://www.askapache.com/htaccess/apache-speed-subdomains.html"&gt;performance advantages&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Any discussion of clean URLs would not be complete without mentioning www.example.com vs. example.com. Dropping the www seems to be the &amp;quot;cool&amp;quot; thing to do, but my personal feeling is that www.example.com is more descriptive of what you will find there. The mail server is mail.example.com, so the web server should be www.example.com.&lt;/p&gt;&lt;p&gt;So here's the site structure I'm planning to use for future projects:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;/css/ - css.example.com&lt;/li&gt;&lt;li&gt;/images/ - images.example.com&lt;/li&gt;&lt;li&gt;/images/logos/ - images.example.com/logos/&lt;/li&gt;&lt;li&gt;/images/products/ - images.example.com/products/&lt;/li&gt;&lt;li&gt;/js/ - js.example.com&lt;/li&gt;&lt;li&gt;/www/ - www.example.com&lt;/li&gt;&lt;li&gt;/www/about/ - www.example.com/about/&lt;/li&gt;&lt;li&gt;/www/products/ - www.example.com/products/&lt;/li&gt;&lt;li&gt;/www/index.php - the actual home page&lt;/li&gt;&lt;li&gt;/index.php - file which redirects to www.example.com&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The subdomains can be hosted from the primary web server while traffic is small, and migrated to dedicated servers when the traffic increases. The URLs to the images, scripts, and stylesheets don't change, so the PHP files don't need to be updated. Use plenty of folders to keep things organized. You can see I made folders at images.example.com to keep the logos separate from product pictures. If there will be a lot of pictures for each product, I would make folders within the products folder to keep them segregated.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-983727027075419745?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/983727027075419745/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=983727027075419745' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/983727027075419745'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/983727027075419745'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2010/09/scalable-site-structure.html' title='Scalable Site Structure'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-7437402197638657036</id><published>2010-09-05T13:17:00.000-07:00</published><updated>2010-09-10T13:27:54.699-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='roman numerals'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><category scheme='http://www.blogger.com/atom/ns#' term='regular expressions'/><title type='text'>Roman Numerals, Part 4</title><content type='html'>&lt;a href="http://www.blogger.com/profile/03164086700339769547"&gt;Keith Alexander&lt;/a&gt; of  Albuquerque, New Mexico writes:&lt;br /&gt;&lt;blockquote&gt;&amp;ldquo;I like your Roman Numeral library. I needed a function to test for Roman numerals, so I wrote this one.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;// Check to see if the string is a Roman Numeral&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;// NOTE: this doesn't check for fractions, overbars, the Bede "N" (zero) etc.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;// NOTE: It also doesn't check for a well-formed Roman Numeral.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function is_roman_numeral( $roman )&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Strip every non-word character &lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// - A-Z, 0-9, apostrophe and understcore are what's left&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$roman = preg_replace( "/[^A-Z0-9_']/iu", "", $roman );&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// if it contains anything other than MDCLXVI, then it's not a Roman Numeral&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$result = preg_match( "/[^MDCLXVI]/u", $roman );&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if( $result )&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return FALSE;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return TRUE;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Who knows if blogger is going to show it properly. If not, just contact me and I'll send it you in email or something. Anyway, it's something I wrote in 5 minutes. If you want to add it to your library, modified or otherwise, please feel free.&amp;rdquo;&lt;/blockquote&gt;&lt;br /&gt;Thanks for writing in Keith, and sorry for the late response. There are two ways to validate a Roman number, using regular expressions like you did, and converting back to an Arabic number (if the conversion fails, it's not a Roman number).&lt;br /&gt;&lt;br /&gt;I'm not sure about using a regular expression to remove non-word characters. My gut tells me that anything containing such characters should fail validation as a Roman number. Also, I would reverse the match and eliminate the &lt;code&gt;if&lt;/code&gt; statement by directly returning the result of the match.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;PHP&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function isRoman($roman)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return preg_match(&amp;quot;/[MDCLXVI]/u&amp;quot;, $roman);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;h3&gt;ASP&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function isRoman(roman)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim regEx&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set regEx = new RegExp&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;with regEx&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.IgnoreCase = true&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Global = true&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Pattern = &amp;quot;[MDCLXVI]&amp;quot;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end with&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if regEx.Test(roman) then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;isRoman = true&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;isRoman = false&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set regEx = nothing&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/8104/bigroman/"&gt;View ASP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/8105/bigroman/"&gt;View PHP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-7437402197638657036?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/7437402197638657036/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=7437402197638657036' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/7437402197638657036'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/7437402197638657036'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2010/09/roman-numerals-part-4.html' title='Roman Numerals, Part 4'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-5622454022101753263</id><published>2010-09-05T10:29:00.001-07:00</published><updated>2010-09-10T13:24:00.223-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><title type='text'>Calculating annual salary for employees paid hourly</title><content type='html'>Last time I explained how to calculate the annual salary for an employee who is paid by the hour. Today I'm going to show you by writing a function for it, and we'll write one for monthly salary too.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function annualSalary(someYear, hourlyPay)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const hoursPerDay = 8&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;annualSalary = 0&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for i = 1 to 12&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;annualSalary = annualSalary + WorkingDays(someYear, i) * hoursPerDay * hourlyPay&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;next&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function monthlySalary(someYear, someMonth, hourlyPay)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const hoursPerDay = 8&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;monthlySalary = 0&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;monthlySalary = monthlySalary + WorkingDays(someYear, someMonth) * hoursPerDay * hourlyPay&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://snipplr.com/view/40318/calculate-monthly-andor-annual-salary/"&gt;View ASP implementation on Snipplr&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-5622454022101753263?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/5622454022101753263/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=5622454022101753263' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/5622454022101753263'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/5622454022101753263'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2010/09/calculating-annual-salary-for-employees.html' title='Calculating annual salary for employees paid hourly'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-5210798789873724276</id><published>2010-09-01T14:18:00.000-07:00</published><updated>2010-09-01T14:53:39.560-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><category scheme='http://www.blogger.com/atom/ns#' term='datetime'/><title type='text'>Number of working days in a month</title><content type='html'>&lt;p&gt;I didn't realize it's been over a year since my last post. Most of the code I've written this past year has been too specialized to be considered useful to anyone outside of my present employer, but this week I was presented with a problem with our Intranet application where the annual salary of employees who are paid hourly was not being calculated correctly. I'm working with the application vendor to get this corrected in the next version, and learned some interesting things about how to calculate this correctly.&lt;/p&gt;&lt;p&gt;A common formula to calculate annual salary for hourly employees is hourly pay &amp;times; 40 hours/week &amp;times; 52 weeks/year. This is very close to accurate, but 365/366 days per year does not divide evenly by 7 days/week.&lt;/p&gt;&lt;p&gt;A more accurate result can be obtained by multiplying the hourly pay by the number of working hours in a year. One way to calculate this is based on the last day of the year. In a non-leap year, there are 2080 working hours if the last day of the year is a Saturday or Sunday, and 2088 working hours if the last day of the year is a weekday. In the case of a leap year, there are 2080 working hours if the last day of the year is a Sunday, 2088 working hours if the last day of the year is a Saturday or Monday, and 2096 working hours for any other weekday.&lt;/p&gt;&lt;p&gt;At our company, we work 8 hours each day, so we can calculate the number of working days rather than the number of working hours and multiply by 8 hours/day. Since the number of days per month is variable, I decided to calculate working days per month separately and sum them up for working days per year.&lt;/p&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;Function WorkingDays(someYear, someMonth)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WorkingDays = 0&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;For i = 1 To MonthDays(someYear, someMonth)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;If Weekday(DateSerial(someYear, someMonth, i)) &lt;&gt; 1 And Weekday(DateSerial(someYear, someMonth, i)) &lt;&gt; 7 Then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WorkingDays = WorkingDays + 1&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;End If&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Next&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;End Function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;You can take the result and multiply by 8 hours/day to get the number of working hours in a month, and then multiply by the hourly pay to get the monthly salary. The annual working days can be obtained by calling the function in a &lt;code&gt;for i = 1 to 12...next&lt;/code&gt; loop, multiplied by 8 hours/day to get the number of working hours in a year, and then multiplied by the hourly pay to get the annual salary.&lt;/p&gt;&lt;p&gt;We ignore holidays and vacation days since the employee is paid for those as well, though technically vacation pay is accured at 4% so you could subtract vacation days (probably either 10 or 15, depending on number of years of service) and multiply by 1.04 to get an even more accurate amount for annual salary.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://snipplr.com/view/39873/number-of-working-days-in-a-month/"&gt;View ASP implementation on Snipplr&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-5210798789873724276?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/5210798789873724276/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=5210798789873724276' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/5210798789873724276'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/5210798789873724276'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2010/09/number-of-working-days-in-month.html' title='Number of working days in a month'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-815453511196101097</id><published>2009-06-06T08:46:00.000-07:00</published><updated>2009-06-06T08:51:40.812-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><title type='text'>Publishing schedule change</title><content type='html'>As I mentioned last week, I ran out of code samples that are suitable for publishing. All that remains is code in various states of partial completion. I was trying to avoid this, but have decided I need to change the publishing schedule of this blog from weekly to whenever I have something finished. I have some fairly large projects on the go right now that I need to focus on if I hope to complete them in my own lifetime. I'm not even sure that anyone is ever reading this besides myself as I type it, so I don't expect anyone will be upset by this.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-815453511196101097?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/815453511196101097/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=815453511196101097' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/815453511196101097'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/815453511196101097'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2009/06/publishing-schedule-change.html' title='Publishing schedule change'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-2689074082247737930</id><published>2009-05-30T17:22:00.000-07:00</published><updated>2009-05-30T17:38:03.025-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><title type='text'>Dynamic Arrays</title><content type='html'>&lt;p&gt;I have to shamefully admit... I didn't prepare anything for this week. I'd hate to post nothing, so instead I'll post something which I don't consider completely finished yet, but it's far enough along that it probably works just fine.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Working with arrays in classic ASP is frustrating. I wanted to make it more like working with listbox controls in Visual Basic. Note that I wrote this class before I started learning ASP.NET; I wanted to revamp it to bring it in line with the ArrayList class in VB.NET, but just haven't had time yet. More importantly, I haven't really had reason. All my current projects are in PHP or ASP.NET; I've essentially abandoned classic ASP. But I know there are people out there with classic ASP applications which they can't completely rewrite, so I intend to continue writing classic ASP functions.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Considering the enormous size of this class, there's no way I'm going to attempt posting it here, but it'll be on Snipplr as usual. Count, Item, and Items are implemented as properties. Subroutines and functions include: Remove, RemoveAll, Add, BinarySearch, Exists, Random, Reverse, Sort (calls QuickSort; also available are BubbleSort, CombSort, ExchangeSort, and SelectionSort), Shuffle, Swap, Sum, and Product.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://snipplr.com/view/15412/dynamic-array-class/"&gt;View ASP implementation on Snipplr&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-2689074082247737930?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/2689074082247737930/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=2689074082247737930' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/2689074082247737930'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/2689074082247737930'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2009/05/dynamic-arrays.html' title='Dynamic Arrays'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-305529449635483136</id><published>2009-05-23T08:06:00.000-07:00</published><updated>2009-05-23T08:17:59.136-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Math'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><title type='text'>Prime Numbers</title><content type='html'>&lt;p&gt;Once upon a time I wrote some functions for finding and checking prime numbers. In this library of functions you'll find the following:&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;getPrimes() - finds prime numbers up to a specified limit&lt;/li&gt;&lt;li&gt;isPrime() - checks if a number is prime using modular division against odd numbers&lt;/li&gt;&lt;li&gt;isPrime2() - checks if a number is prime using modular division against known primes&lt;/li&gt;&lt;li&gt;primeCount() - counts the number of primes less than or equal to the specified number&lt;/li&gt;&lt;li&gt;isComposite() - the opposite of prime&lt;/li&gt;&lt;li&gt;isPrimeSpeedTest() - races isPrime againts isPrime2&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;In theory, checking against known primes should be faster than checking against all odd numbers, but it turned out to be slower because I was first finding the primes with getPrimes(). If a list of prime numbers was hardcoded in an array it might be faster for smaller numbers, and then the odd number method could be used for larger numbers.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://snipplr.com/view/15252/prime-numbers/"&gt;View ASP implementation on Snipplr&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-305529449635483136?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/305529449635483136/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=305529449635483136' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/305529449635483136'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/305529449635483136'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2009/05/prime-numbers.html' title='Prime Numbers'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-7261646503268163436</id><published>2009-05-16T09:36:00.000-07:00</published><updated>2009-05-16T09:54:12.116-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><category scheme='http://www.blogger.com/atom/ns#' term='chemistry'/><title type='text'>Chemistry Library</title><content type='html'>&lt;p&gt;This week's code is probably the biggest single release I've ever made. I considered splitting it up into two or three weeks, but that would be too much work. Before we get started, you'll need my &lt;a href="http://reusablecode.blogspot.com/2008/04/proper-case.html"&gt;proper case function&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;In this function library, we have three major things going on: look up chemical element symbols by atomic number, look up chemical element names by atomic number, and figure out the electron configuration of an atom given the atomic number.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;For the chemical element names and symbols, I made an array of all the named elements; currently the highest named element is atomic number 111. There are elements with higher atomic numbers that have been discovered, but not yet named. There is also the possibility that more elements may be discovered in the future. To handle both these situations, I wrote code to generate standardized names if the array lookup fails.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The function(s) for figuring out electron configuration are my favorite. I started with an array of all the subshells in the order they get filled. Then I wrote a function that knows how many electrons can fit in each type of subshell. Finally, I wrote the main function which fills the subshells, taking into account known exceptions to the rules. (e.g. palladium)&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/15097/chemistry-library/"&gt;View ASP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/15098/chemistry-library/"&gt;View PHP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-7261646503268163436?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/7261646503268163436/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=7261646503268163436' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/7261646503268163436'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/7261646503268163436'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2009/05/chemistry-library.html' title='Chemistry Library'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-7265921692012926679</id><published>2009-05-09T07:47:00.000-07:00</published><updated>2009-05-09T08:00:56.112-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><title type='text'>Fuel consumption</title><content type='html'>&lt;p&gt;Last November I was at a Service Canada office and picked up a pamphlet called &lt;cite&gt;Fuel Consumption Guide 2007&lt;/cite&gt;. Although too old to be relevant (unless you're buying a used car), it contained some formulae for calculating fuel consumption which inspired me to write some code.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;This library of functions is among the longest yet, so I won't be posting the code directly on the blog, but here's a list of the functions included:&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;lph() - Calculate fuel consumption rating in litres per 100 kilometres.&lt;/li&gt;&lt;li&gt;mpg() - Calculate fuel consumption rating in miles per gallon.&lt;/li&gt;&lt;li&gt;lph2mpg() - Convert miles per (imperial) gallon to litres per 100 kilometres.&lt;/li&gt;&lt;li&gt;mpg2lph() - Convert litres per 100 kilometres to miles per (imperial) gallon.&lt;/li&gt;&lt;li&gt;fuelConsumption() - Calculate fuel consumption in litres.&lt;/li&gt;&lt;li&gt;CO2emissions() - Calculate carbon dioxide emissions in kilograms.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/14873/fuel-consumption/"&gt;View ASP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/14874/fuel-consumption/"&gt;View PHP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-7265921692012926679?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/7265921692012926679/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=7265921692012926679' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/7265921692012926679'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/7265921692012926679'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2009/05/fuel-consumption.html' title='Fuel consumption'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-2914963546734261747</id><published>2009-05-02T08:13:00.000-07:00</published><updated>2009-05-02T08:23:50.932-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><category scheme='http://www.blogger.com/atom/ns#' term='regular expressions'/><title type='text'>Regular Expressions</title><content type='html'>&lt;p&gt;Over the past year, I've posted a lot of code that made use of regular expressions. When used appropriately, they can be very powerful. But regular expressions in ASP are a little more cumbersome than PHP. Wouldn't it be great if ASP had the simplicity of regular expression functions?&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Once again, the source code is too long to post here, so it will only be available on Snipplr. This library of functions includes the following:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;ereg() - case-sensitive regular expression match&lt;/li&gt;&lt;li&gt;eregi() - case-insensitive regular expression match&lt;/li&gt;&lt;li&gt;ereg_replace() - case-sensitive regular expression replacement&lt;/li&gt;&lt;li&gt;eregi_replace() - case-insensitive regular expression replacement&lt;/li&gt;&lt;li&gt;sql_regcase() - make regular expression for case insensitive match&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://snipplr.com/view/14646/regular-expressions/"&gt;View ASP implementation on Snipplr&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-2914963546734261747?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/2914963546734261747/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=2914963546734261747' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/2914963546734261747'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/2914963546734261747'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2009/05/regular-expressions.html' title='Regular Expressions'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-6838893387562558410</id><published>2009-04-25T09:14:00.000-07:00</published><updated>2009-04-25T09:25:38.047-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><title type='text'>Social Insurance Numbers</title><content type='html'>&lt;p&gt;Here in Canada, our equivalent of the Social Security Number is called Social Insurance Number. It serves the same purpose and has the same demands for privacy surrounding it.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Once again, I won't be posting the full source code on the blog, only on Snipplr, but I will discuss briefly how it works. It consists of three groups of three digits, and is validated using the &lt;a href="http://reusablecode.blogspot.com/2009/03/luhn-algorithm.html"&gt;Luhn algorithm&lt;/a&gt;. I also do a quick regular expression validation to check for numbers which invalidly begin with an eight: &lt;code&gt;^([1-79]{3})[\-\s]?(\d{3})[\-\s]?(\d{3})$&lt;/code&gt;.&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/14411/social-insurance-numbers/"&gt;View ASP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/14412/social-insurance-numbers/"&gt;View PHP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-6838893387562558410?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/6838893387562558410/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=6838893387562558410' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/6838893387562558410'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/6838893387562558410'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2009/04/social-insurance-numbers.html' title='Social Insurance Numbers'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-1404111035089034615</id><published>2009-04-18T07:50:00.000-07:00</published><updated>2009-04-18T08:14:35.255-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><title type='text'>Social Security Numbers</title><content type='html'>&lt;p&gt;Assuming that you have a legitimate need to capture social security numbers (human resources app?), you may want to validate and format them consistently. The actual code for both languages combined is a little bit too long to post, so I'll just talk about the algorithm.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;A social security number is a nine-digit number and can be matched with the following regular expression: &lt;code&gt;^\d{3}\-?\d{2}\-?\d{4}$&lt;/code&gt;. If it can't pass this test, it's not a valid social security number. However, passing this simple test doesn't guarantee validity, so we need to keep checking.&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;No digit group can consist of only zeros, and the first group cannot be 666. We check for these errors with the following regular expression: &lt;code&gt;((000|666)\-?\d{2}\-?\d{4}|\d{3}\-?00\-?\d{4}|\d{3}\-?\d{2}\-?0000&lt;/code&gt;.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Numbers from 987-65-4320 to 987-65-4329 are reserved for use in advertisements, and other previously legitimate numbers have been invalidated because of use in advertisments. We check for these errors with the following regular expression: &lt;code&gt;987\-?65\-?432\d{1}|042\-?10\-?3580|062\-?36\-?0749|078\-?05\-?1120|095\-?07\-?3645|128\-?03\-?6045|135\-?01\-?6629|141\-?18\-?6941|165\-?(16|18|20|22|24)\-?7999|189\-?09\-?2294|212\-?09\-?(7694|9999|219\-?09\-?9999|306\-?30\-?2348|308\-?12\-?5070|468\-?28\-?8779|549\-?24\-?1889)&lt;/code&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Last but not least, the first three numbers are never higher than 772 (well, not yet; this could change in the future). For this I used a simple string conversion and numeric comparison.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;The complete, commented source code is available on Snipplr:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/14151/social-security-numbers/"&gt;View ASP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/14152/social-security-numbers/"&gt;View PHP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;Next week we'll head north of the border to my country and see what the Canadian equivalent of the Social Security Number is, and how we can validate them.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-1404111035089034615?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/1404111035089034615/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=1404111035089034615' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/1404111035089034615'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/1404111035089034615'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2009/04/social-security-numbers.html' title='Social Security Numbers'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-3531251660082690672</id><published>2009-04-11T07:20:00.000-07:00</published><updated>2009-04-11T07:44:05.852-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><title type='text'>Homeland Security Advisory System</title><content type='html'>&lt;p&gt;Back in 2002, a bunch of bureaucrats decided that the United States needed an advisory system so that all federal departments and agencies could communicate what the current threat condition was using the same definitions. Sounds like a good idea to me.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The average citizen can see what the current threat condition is by visiting certain government web sites. The web site for the &lt;a href="http://www.dhs.gov"&gt;Department of Homeland Security&lt;/a&gt; is a good example.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The Department of Homeland Security also provides a little-known web service which returns the &lt;a href="http://www.dhs.gov/dhspublic/getAdvisoryCondition"&gt;threat condition in XML format&lt;/a&gt; so that you can do what you want with it. Let's write a function to retrieve and parse this information down to just the threat condition itself.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;function getThreatLevel()&lt;/code&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim regEx&lt;/code&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set regEx = new RegExp&lt;/code&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;with regEx&lt;/code&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Pattern = ".*\n.*CONDITION=""(.*)"" /&gt;"&lt;/code&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.IgnoreCase = true&lt;/code&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Global = true&lt;/code&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end with&lt;/code&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim xmlhttp&lt;/code&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set xmlhttp = Server.CreateObject("Msxml2.ServerXMLHTTP")&lt;/code&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;xmlhttp.open "GET", "http://www.dhs.gov/dhspublic/getAdvisoryCondition", "False"&lt;/code&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;xmlhttp.send&lt;/code&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;getThreatLevel = regEx.replace(xmlhttp.responseText, "$1")&lt;/code&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set xmlhttp = nothing&lt;/code&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set regEx = nothing&lt;/code&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;As is often the case, the PHP version requires a significantly less amount of code.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;PHP&lt;/h4&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;function getThreatLevel()&lt;/code&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return eregi_replace('.*CONDITION="(.*)" /&gt;', '\1', file_get_contents("http://www.dhs.gov/dhspublic/getAdvisoryCondition"));&lt;/code&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;So now we have a string that contains just the word &amp;quot;ELEVATED&amp;quot; (or whatever the current threat level is at the moment; it's been at elevated for several years at the time of this writing). What can you do with it? Feed it into a switch statement and display an image is one possibility.&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/13963/homeland-security-advisory-system/"&gt;View ASP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/13964/homeland-security-advisory-system/"&gt;View PHP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-3531251660082690672?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/3531251660082690672/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=3531251660082690672' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/3531251660082690672'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/3531251660082690672'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2009/04/homeland-security-advisory-system.html' title='Homeland Security Advisory System'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-2393178322107957786</id><published>2009-04-04T08:08:00.001-07:00</published><updated>2009-04-04T08:16:32.650-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><title type='text'>Min/Max</title><content type='html'>&lt;p&gt;SQL contains a number of &lt;a href="http://msdn.microsoft.com/en-us/library/ms173454.aspx"&gt;aggregate functions&lt;/a&gt; that can do things like select the largest or smallest number from a set of values. This could be handy in the programming language itself.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function max(arrNumbers)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim result&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result = arrNumbers(0)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for each i in arrNumbers&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if i &gt; result then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result = i&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;next&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;max = result&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function min(arrNumbers)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim result&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result = arrNumbers(0)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for each i in arrNumbers&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if i &lt; result then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result = i&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;next&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;min = result&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://snipplr.com/view/13769/minmax/"&gt;View ASP implementation on Snipplr&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-2393178322107957786?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/2393178322107957786/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=2393178322107957786' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/2393178322107957786'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/2393178322107957786'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2009/04/minmax.html' title='Min/Max'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-1210108325900165619</id><published>2009-03-28T08:34:00.000-07:00</published><updated>2009-03-28T08:42:15.498-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='filesystem'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><title type='text'>getFileType</title><content type='html'>&lt;p&gt;Last week I showed you how to get the size of a file. This week I'm going to show you how to get the type of a file. This is useful if you want to display an icon or bit of text next to a hyperlink to indicate the file type. Some people like to use this to warn visitors when they link to a PDF file, because PDF readers can take a while to load.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function getFileType(someFile)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim fs&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set fs = Server.CreateObject("Scripting.FileSystemObject")&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;getFileType = fs.GetExtensionName(Server.MapPath(someFile))&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set fs = nothing&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;See you next week!&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://snipplr.com/view/13532/getfiletype/"&gt;View ASP implementation on Snipplr&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-1210108325900165619?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/1210108325900165619/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=1210108325900165619' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/1210108325900165619'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/1210108325900165619'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2009/03/getfiletype.html' title='getFileType'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-504884253133251836</id><published>2009-03-21T08:58:00.000-07:00</published><updated>2009-03-28T08:40:21.690-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='filesystem'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><title type='text'>getFileSize</title><content type='html'>&lt;p&gt;When you provide a link to a file for the user to download, it's sometimes nice to provide the size of the file so that they know what they're getting themselves into.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function getFileSize(someFile)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim fs&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim file&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set fs = Server.CreateObject("Scripting.FileSystemObject")&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set file = fs.GetFile(Server.MapPath(someFile))&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;getFileSize = FormatFileSize(file.size)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set file = nothing&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set fs = nothing&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;The &lt;code&gt;size&lt;/code&gt; property returns the size in bytes, which could be a very large number. As you may have guessed, we're going to write a FormatFileSize function to wrap around it.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function FormatFileSize(size)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim units&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim factor&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;units = Array("B", "kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB")&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;factor = log(size) \ 7&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FormatFileSize = Round(size / (1024 ^ factor), 2) &amp; units(factor)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;I think it will be a very, very long time before we reach yottabytes, so this function should withstand the test of time. Next week I'll show you how to get the file type and why you might want that.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://snipplr.com/view/13348/getfilesize/"&gt;View ASP implementation on Snipplr&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-504884253133251836?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/504884253133251836/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=504884253133251836' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/504884253133251836'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/504884253133251836'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2009/03/getfilesize.html' title='getFileSize'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-5300675011165474868</id><published>2009-03-14T07:36:00.000-07:00</published><updated>2009-03-14T07:50:36.852-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><title type='text'>Soundex</title><content type='html'>&lt;p&gt;This week we're going to write a function to convert letters to their corresponding soundex codes. But wait, there's more! We'll also allow you to pass in an entire string and convert the whole thing. Here's the set up:&lt;/p&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function soundex(someString)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if len(someString) = 1 then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' code to convert a single character&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' loop through the whole string and convert each character&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;Inside the loop, we'll recursively call the soundex function to convert the individual character. Actually, this may not perfectly fit the definition of recursion. The only recursive aspect of it is that the function calls itself, but an entirely different execution path is being followed once inside. But that's good, because we won't have the poor performance that sometimes comes with recursion.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Once again, the full source code is a little too long to post, so you'll have to grab it from Snipplr:&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/13119/soundex/"&gt;View ASP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/13120/soundex/"&gt;View PHP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-5300675011165474868?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/5300675011165474868/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=5300675011165474868' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/5300675011165474868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/5300675011165474868'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2009/03/soundex.html' title='Soundex'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-2631591922353888603</id><published>2009-03-07T07:33:00.000-08:00</published><updated>2009-03-07T07:49:44.157-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><title type='text'>Luhn Algorithm</title><content type='html'>&lt;p&gt;This week we're writing a function to verify credit card numbers. Credit cards have a check digit which is generated with the &lt;a href="http://en.wikipedia.org/wiki/Luhn_algorithm"&gt;Luhn algorithm&lt;/a&gt;. The code is too long to post here, but as always it is posted on Snipplr and linked here for your dissemination.&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/12892/luhn-algorithm/"&gt;View ASP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/12893/luhn-algorithm/"&gt;View PHP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-2631591922353888603?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/2631591922353888603/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=2631591922353888603' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/2631591922353888603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/2631591922353888603'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2009/03/luhn-algorithm.html' title='Luhn Algorithm'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-1412460892754366359</id><published>2009-02-28T06:09:00.000-08:00</published><updated>2009-02-28T06:36:35.182-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><title type='text'>Phonetic Alphabet</title><content type='html'>&lt;p&gt;It seems to me that most people have trouble remembering the phonetic alphabet (probably myself included). Unless you're a pilot or air traffic controller, it's unlikely that your job requires you to have it memorized. People get by with whatever word comes to mind (&amp;quot;A as in Adam&amp;quot;), but this seems like an opportunity to write some code.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;For maximum reusability, I'm going to write my function to convert individual characters at a time. Looping through the characters of the string will occur outside the function. The function is too long to paste here in its entirety, but it will be posted on Snipplr and linked at the bottom of this entry.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;PHP has key/value arrays where we can specify any keys we want, so we'll declare an array containing all the conversions and use the input to retrieve the correct string from the array. ASP's arrays don't have this flexibility; we could achieve this with a Dictionary scripting object, but I'm concerned about the overhead associated with that. I'm going to use a Select...Case statement (AKA switch statement), but there is a chance that this is actually not any better. I'll leave the determination of this as an exercise to the reader. Also left as an exercise to the reader is the writing of the looping code.&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/12664/phonetic-alphabet/"&gt;View ASP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/12665/phonetic-alphabet/"&gt;View PHP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-1412460892754366359?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/1412460892754366359/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=1412460892754366359' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/1412460892754366359'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/1412460892754366359'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2009/02/phonetic-alphabet.html' title='Phonetic Alphabet'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-1202610100693574137</id><published>2009-02-21T15:48:00.000-08:00</published><updated>2010-09-10T13:18:48.780-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VB.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><title type='text'>Add and strip slashes</title><content type='html'>&lt;p&gt;Good programmers know that they can't trust user-inputted data. We do as much as we can to validate and try to prevent bad data from getting into our applications. But there is even some perfectly valid data that can cause trouble, especially when you're dealing with databases. The single apostrophe is a common occurrence and gotcha for the newbies when they discover the tail end of their string didn't make it into the database.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Our PHP programmer friends have a few different functions at their disposal. Native to PHP are the addslashes() and stripslashes() functions, which basically do what they say. In more common usage these days is the MySQL-native function, mysql_real_escape_string(), which can handle a wider variety of situations. I'm going to go a little bit further and handle the backspace and horizontal tab characters.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The regular expression we'll be using to add slashes is &lt;code&gt;([\000\010\011\012\015\032\042\047\134\140])&lt;/code&gt;, and to remove slashes we'll use &lt;code&gt;\\([\000\010\011\012\015\032\042\047\134\140])&lt;/code&gt;. The only difference is the extra pair of slashes at the beginning. These handle, respectively: null, backspace, horizontal tab, new line, carriage return, substitute, double quote, single quote, backslash, and grave accent.&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/12446/add-and-strip-slashes/"&gt;View ASP implementation on Snipplr.&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/40317/add-and-strip-slashes/"&gt;View VB.NET implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-1202610100693574137?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/1202610100693574137/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=1202610100693574137' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/1202610100693574137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/1202610100693574137'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2009/02/add-and-strip-slashes.html' title='Add and strip slashes'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-8252397865086662216</id><published>2009-02-14T07:58:00.000-08:00</published><updated>2009-02-14T08:10:50.788-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><title type='text'>htmlspecialchars()</title><content type='html'>&lt;p&gt;If you rigoursly validate your HTML like I do, you've probably seen many times the warning about HTML entities. Inevitably an ampersand makes its way into your code without being properly encoded. It's almost always in a hyperlink where you're trying to pass a QueryString variable or two.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;code&gt;somefile.asp?this=that&amp;blah=meh&lt;/code&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;That ampersand needs to be encoded as &lt;code&gt;&amp;amp;amp;&lt;/code&gt;. Likewise, double quotation marks need to be encoded as &lt;code&gt;&amp;amp;quot;&lt;/code&gt; and the greater than and less than symbols need to be encoded as &lt;code&gt;&amp;amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;amp;lt;&lt;/code&gt; respectively. If you allow users to write things on your web site, then you need a programmatic solution. Our PHP programmer friends have one in their toolbox which we can borrow.&lt;/p&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function htmlspecialchars(someString)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' Critical that ampersand is converted first, since all entities contain them.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;htmlspecialchars = replace(replace(replace(replace(someString, "&amp;", "&amp;amp;"), "&gt;", "&amp;gt;"), "&lt;", "&amp;lt;"), """", "&amp;quot;")&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function htmlspecialchars_decode(someString)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;htmlspecialchars_decode = replace(replace(replace(replace(someString, "&amp;amp;", "&amp;"), "&amp;gt;", "&gt;"), "&amp;lt;", "&lt;"), "&amp;quot;", """")&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://snipplr.com/view/12207/htmlspecialchars/"&gt;View ASP implementation on Snipplr&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-8252397865086662216?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/8252397865086662216/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=8252397865086662216' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/8252397865086662216'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/8252397865086662216'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2009/02/htmlspecialchars.html' title='htmlspecialchars()'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-6298605845471444199</id><published>2009-02-07T08:29:00.000-08:00</published><updated>2009-02-07T09:01:13.024-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><category scheme='http://www.blogger.com/atom/ns#' term='Star Trek'/><title type='text'>Difference between two stardates</title><content type='html'>&lt;p&gt;As promised last week, I rejigged my code to calculate the difference between two stardates into a proper function and translated it to ASP. I don't have access to an IIS server right now, so I didn't have a chance to test the ASP version yet, but I'm fairly confident that it works. Let me know if it doesn't!&lt;/p&gt;&lt;p&gt;I won't post the source code directly into this post like I usually do, but as usual it will be available on Snipplr. Expect to see this happen more often in the future. However, I'll talk briefly about what's going on under the hood.&lt;/p&gt;&lt;p&gt;The incoming stardates are just strings, and we split them up based on the official format: first two characters to calculate the years, next three characters to calculate the days, and last character to calculate the hours. The order of the stardates is not important - the code checks which is larger. The same magic numbers from last week are used to get the real values, which are then subtracted. After rounding off any decimal places, the three values are formatted into a human-readable string and returned. It should be very straight-forward.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/11949/difference-between-two-stardates/"&gt;View ASP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/11950/difference-between-two-stardates/"&gt;View PHP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-6298605845471444199?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/6298605845471444199/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=6298605845471444199' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/6298605845471444199'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/6298605845471444199'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2009/02/difference-between-two-stardates.html' title='Difference between two stardates'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-5276670145506437404</id><published>2009-01-31T21:10:00.000-08:00</published><updated>2009-01-31T21:43:54.241-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><category scheme='http://www.blogger.com/atom/ns#' term='Star Trek'/><title type='text'>Stardate</title><content type='html'>&lt;p&gt;As promised, today was to be a celebration of one year of Reusable Code. That celebration was overshadowed by a catastrophic hard drive failure early this morning, but luckily I managed to perform a successful recovery with Windows Home Server (after much trial and error).&lt;/p&gt;&lt;p&gt;The function I'm going to share this week is my favorite: calculating the stardate for a given Gregorian calendar date. If you're not familiar with the various Star Trek television series, you might not know what a stardate is. It's a fictional method of measuring time, which is supposed to solve the problems of relativistic time dilation caused by travelling at high velocity. In reality, it progressed at the same rate as time here on Earth.&lt;/p&gt;&lt;p&gt;The method of stardate calculation used here is based on Star Trek: the Next Generation, Star Trek: Deep Space Nine, and Star Trek: Voyager. It does not take the Original Series into account. Also, it is calibrated with the airdates of the television series, not with real world dates. That is to say, if you pass in today's date, it does not return the stardate corresponding to today's date in the 21st century, but today's date in the 24th century Star Trek universe. This is intended to be beneficial for roleplaying games.&lt;/p&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function stardate(someDateTime)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim season&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim episode&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim fractime&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;season = cStr(Year(someDateTime) - 1947)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;episode = str_pad(Round(1000 / 366 * DatePart("y", someDateTime), 0), 3, "0", "left")&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fractime = left(cStr((Hour(someDateTime) * 60 + Minute(someDateTime)) / 144), 1)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stardate = season &amp; episode &amp; "." &amp; fractime&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;It is important to note here that for the above function, you will also need my &lt;a href="http://reusablecode.blogspot.com/2008/09/strpad.html"&gt;str_pad()&lt;/a&gt; function.&lt;/p&gt;&lt;h4&gt;PHP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function stardate($timestamp)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$season = date("Y", $timestamp) - 1947;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$episode = str_pad(round(1000 / 366 * (date("z", $timestamp) + 1)), 3, "0", STR_PAD_LEFT);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$fractime = substr((date("g", $timestamp) * 60 + date("i", $timestamp)) / 144, 0, 1);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return $season . $episode . "." . $fractime;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;I'm somewhat ashamed to admit that there are some &amp;quot;magic&amp;quot; numbers at play here. When I originally wrote this function, I had not intended to make it open source, but events over the past year have led me to the realization that if I did not, it would become lost in the sands of time.&lt;/p&gt;&lt;p&gt;Once upon a time I also wrote some code to calculate the difference between two stardates, but it was only written in PHP. I'll have to port it to ASP and perhaps have it ready for next Saturday's posting, but no promises.&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/11722/stardate/"&gt;View ASP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/11724/stardate/"&gt;View PHP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-5276670145506437404?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/5276670145506437404/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=5276670145506437404' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/5276670145506437404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/5276670145506437404'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2009/01/stardate.html' title='Stardate'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-6884418374514049319</id><published>2009-01-24T10:59:00.000-08:00</published><updated>2009-01-24T11:45:55.902-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><title type='text'>A year of reusable code</title><content type='html'>&lt;p&gt;In just a few more days, it will be one year since I started this blog. Next week Saturday I plan to mark the occasion by sharing with you, one of my most favorite functions. In the weeks following that, I'll be bringing you some larger functions and function libraries which will hopefully make up for some of the less interesting things I've posted over the past year. Unfortunately I can't promise no more boring code, because eventually the good stuff will run out.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;If I'm going to be completely honest, some of the functions I've posted here, I wrote specifically for here. The tag line of this blog purports &amp;quot;Practical examples for real-world progrmaming&amp;quot;, and I feel that sometimes I wasn't really living up to that. However, I feel to a certain extent that I lived up to what I resolved &lt;em&gt;not&lt;/em&gt; to do, which was post silly examples about animals and cars just to illustrate how code works.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Since this is Saturday, I owe you folks some source code. Since next week's code is going to super awesome, I'm going to shamefully post two quick snippets which might seem lackluster, but these were honestly written out of desire/need. Both are re-creations of PHP functions, requested by a PHP programmer that worked for me and had to code in ASP because that's what the existing code was written in.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;First we have the echo() function. Our PHP programmer friends are spoiled with not having to type &lt;code&gt;Response.Write&lt;/code&gt; every time they want to put something on the screen. Then again, are we not entitled to the same luxuries? Rather than merely aliasing &lt;code&gt;Response.Write&lt;/code&gt;, you can also use &lt;code&gt;\n&lt;/code&gt; instead of typing &lt;code&gt;vbCrLf&lt;/code&gt;.&lt;/p&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;sub echo(someText)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Response.Write Replace(someText, "\n", vbCrLf)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end sub&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;Our second function for today was written for use with HTML's &lt;code&gt;textarea&lt;/code&gt; element and &lt;acronym title="Structured Query Language"&gt;SQL&lt;/acronym&gt; data types that contain text with line breaks.&lt;/p&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function nl2br(someText)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nl2br = Replace(someText, vbCrLf, "&amp;lt;br /&amp;gt;")&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/11488/echo/"&gt;View the implementation for echo() on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/11489/nl2br/"&gt;View the implementation for nl2br() on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-6884418374514049319?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/6884418374514049319/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=6884418374514049319' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/6884418374514049319'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/6884418374514049319'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2009/01/year-of-reusable-code.html' title='A year of reusable code'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-2392502570081586887</id><published>2009-01-17T07:56:00.000-08:00</published><updated>2009-01-17T08:11:43.063-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='Math'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><title type='text'>Triangular Numbers</title><content type='html'>&lt;p&gt;A &lt;a href="http://en.wikipedia.org/wiki/Triangular_number"&gt;triangular number&lt;/a&gt; is the sum of the n natural numbers from 1 to n.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function triangularNumber(someNumber)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim i&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim result&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result = 0&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for i = 1 to someNumber&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result = result + i&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;next&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;triangularNumber = result&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;h4&gt;PHP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function triangularNumber($number)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for($i = 1; $i &lt;= $number; $i++)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$result += $i;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return $result;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/11270/triangular-numbers/"&gt;View ASP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/11271/triangular-numbers/"&gt;View PHP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-2392502570081586887?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/2392502570081586887/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=2392502570081586887' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/2392502570081586887'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/2392502570081586887'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2009/01/triangular-numbers.html' title='Triangular Numbers'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-3915924715779638604</id><published>2009-01-10T07:48:00.000-08:00</published><updated>2009-01-10T08:01:10.386-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><category scheme='http://www.blogger.com/atom/ns#' term='arrays'/><title type='text'>Array Merge</title><content type='html'>&lt;p&gt;Did you ever have two arrays that you needed to merge together? If you were programming in PHP, you used the array_merge() function. If you were programming in ASP, you had to write a whole bunch of code because there is no array_merge() function... until now.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function array_merge(byVal firstArray, byVal secondArray)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim totalSize&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim i&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim combinedArray&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' Ensure that we're dealing with arrays.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if not isArray(firstArray) then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;firstArray = Array(firstArray)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if not isArray(secondArray) then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;secondArray = Array(secondArray)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' Set up the new array.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;totalSize = uBound(firstArray) + uBound(secondArray) + 1&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;combinedArray = firstArray&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;redim preserve combinedArray(totalSize)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for i = 0 to uBound(secondArray)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;combinedArray(uBound(firstArray) + 1 + i) = secondArray(i)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;next&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;array_merge = combinedArray&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://snipplr.com/view/11063/array-merge/"&gt;View ASP implementation on Snipplr&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-3915924715779638604?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/3915924715779638604/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=3915924715779638604' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/3915924715779638604'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/3915924715779638604'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2009/01/array-merge.html' title='Array Merge'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-1673389803415739997</id><published>2009-01-03T08:05:00.000-08:00</published><updated>2009-01-03T08:24:05.612-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='Math'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><title type='text'>Perfect Numbers</title><content type='html'>&lt;p&gt;This week's function is for checking if an integer is a &lt;a href="http://en.wikipedia.org/wiki/Perfect_number"&gt;perfect number&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function isPerfect(someNumber)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim i&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim arrFactors&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;arrFactors = Array()&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' Only positive integers can be perfect.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if someNumber &lt; 1 then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;isPerfect = false&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit function&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' Calculate the factors for the given number.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for i = 1 to someNumber&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if someNumber mod i = 0 then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;redim preserve arrFactors(UBound(arrFactors) + 1)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;arrFactors(UBound(arrFactors)) = i&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;next&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' A perfect number is a number that is half the sum of all of its positive divisors (including itself).&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if someNumber = eval(join(arrFactors, " + ")) / 2 then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;isPerfect = true&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;isPerfect = false&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;h4&gt;PHP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function isPerfect($number)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Only positive integers can be perfect.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ($number &lt; 1)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return false;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Calculate the factors for the given number.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for($i = 1; $i &lt;= $number; $i++)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ($number % $i == 0)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$arrFactors[] = $i;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// A perfect number is a number that is half the sum of all of its positive divisors (including itself).&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return ($number == array_sum($arrFactors) / 2) ? true : false;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;ode&gt;}&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/10853/perfect-numbers/"&gt;View ASP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/10854/perfect-numbers/"&gt;View PHP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-1673389803415739997?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/1673389803415739997/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=1673389803415739997' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/1673389803415739997'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/1673389803415739997'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2009/01/perfect-numbers.html' title='Perfect Numbers'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-2386761523706014859</id><published>2008-12-27T20:54:00.000-08:00</published><updated>2008-12-27T20:59:23.651-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><title type='text'>Random Integer</title><content type='html'>&lt;p&gt;Our PHP programmer friends have a function called randInt() which returns a random integer between two specified integers. It's time to level the playing field.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function randInt(min, max)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Randomize&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;randInt = Int((max - min + 1) * Rnd + min)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://snipplr.com/view/10719/random-integer/"&gt;View ASP implementation on Snipplr&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-2386761523706014859?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/2386761523706014859/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=2386761523706014859' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/2386761523706014859'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/2386761523706014859'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2008/12/random-integer.html' title='Random Integer'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-8195329467680242776</id><published>2008-12-20T20:17:00.000-08:00</published><updated>2008-12-20T20:40:29.504-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><title type='text'>strip_tags()</title><content type='html'>&lt;p&gt;This week we're recreating a PHP function that is extremely important for sanitizing user input. All HTML/ASP/PHP tags are stripped outright; there is no support for a whitelist of allowed tags. A whitelist can be very dangerous without much more rigorous testing to check for script-related exploits. A safer solution would be to force the user to use something like &lt;abbr title="Universal Bulletin Board"&gt;UBB&lt;/abbr&gt; code or &lt;a href="http://en.wikipedia.org/wiki/Markdown"&gt;Markdown&lt;/a&gt; and convert to HTML on the backend.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function strip_tags(unsafeString)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim regEx&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set regEx = new RegExp&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;with regEx&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Global = true&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.IgnoreCase = true&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Pattern = "(\&lt;(/?[^\&gt;]+)\&gt;)"&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end with&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;strip_tags = regEx.Replace(unsafeString, "")&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set regEx = nothing&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://snipplr.com/view/10608/striptags/"&gt;View ASP implementation on Snipplr&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-8195329467680242776?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/8195329467680242776/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=8195329467680242776' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/8195329467680242776'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/8195329467680242776'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2008/12/striptags.html' title='strip_tags()'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-6125654802577860121</id><published>2008-12-13T08:50:00.000-08:00</published><updated>2008-12-13T09:11:07.135-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><title type='text'>isPostBack()</title><content type='html'>&lt;p&gt;Today's function comes not from PHP, but ASP.NET. We're going to replicate the isPostBack() function from ASP.NET's Page object.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function isPostBack()&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if uCase(Request.ServerVariables("REQUEST_METHOD")) = "POST" then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;isPostBack = true&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;isPostBack = false&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;h4&gt;PHP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function isPostBack()&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return ($_SERVER['REQUEST_METHOD'] == 'POST');&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/10461/ispostback/"&gt;View ASP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/10462/ispostback/"&gt;View PHP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-6125654802577860121?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/6125654802577860121/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=6125654802577860121' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/6125654802577860121'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/6125654802577860121'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2008/12/ispostback.html' title='isPostBack()'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-3294482369103466121</id><published>2008-12-06T08:37:00.000-08:00</published><updated>2008-12-06T08:46:25.285-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='Math'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><title type='text'>Summation</title><content type='html'>&lt;p&gt;This week's function is summation using the Gauss method.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function sum(x, y)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sum = (x + y) * ((y - x + 1) / 2)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;h4&gt;PHP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function sum($x, $y)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return ($x + $y) * (($y - $x + 1) / 2);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/10301/summation/"&gt;View ASP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/10302/summation/"&gt;View PHP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-3294482369103466121?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/3294482369103466121/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=3294482369103466121' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/3294482369103466121'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/3294482369103466121'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2008/12/summation.html' title='Summation'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-1072669235606321327</id><published>2008-11-29T08:19:00.000-08:00</published><updated>2008-11-29T08:42:00.684-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><category scheme='http://www.blogger.com/atom/ns#' term='datetime'/><title type='text'>Swatch Internet Time</title><content type='html'>&lt;p&gt;Back in 1998, a company called &lt;a href="http://www.swatch.com/zz_en/internettime.html"&gt;Swatch&lt;/a&gt; decided to invent a new method of timekeeping. It didn't catch on, but some people embraced it. If you're one of those people, this is for you. We're going to write a function to convert a time value into a Swatch beat. Our PHP programmer friends already have access to this sort of thing through PHP's date() function.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The following code builds upon two other functions previously published here:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://reusablecode.blogspot.com/2008/09/strpad.html"&gt;str_pad()&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://reusablecode.blogspot.com/2008/05/ceiling-and-floor.html"&gt;floor()&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;IMPORTANT: To return an accurate result, the time value passed in needs to be UTC/GMT (in other words, without offset). There are two ways to achieve this: set your server's time zone to GMT, or use &lt;a href="http://reusablecode.blogspot.com/2008/11/utc-and-atomic-time.html"&gt;my UTC time function&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function swatch(someTime)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;swatch = str_pad(floor(((Hour(someTime) * 3600 * 1000) + (Minute(someTime) * 60 * 1000) + (Second(someTime) * 1000)) / 86400), 3, "0", STR_PAD_LEFT)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://snipplr.com/view/10149/swatch-internet-time/"&gt;View ASP implementation on Snipplr&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-1072669235606321327?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/1072669235606321327/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=1072669235606321327' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/1072669235606321327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/1072669235606321327'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2008/11/swatch-internet-time.html' title='Swatch Internet Time'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-4256362907571065472</id><published>2008-11-22T09:44:00.000-08:00</published><updated>2008-11-22T09:49:37.240-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='Math'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><title type='text'>Mersenne Numbers</title><content type='html'>&lt;p&gt;Today we're going to write a function to generate Mersenne numbers. This is useful in searching for Mersenne primes.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function mersenne(x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mersenne = 2^x - 1&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;h4&gt;PHP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function mersenne($x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return 2^$x - 1;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/9980/mersenne-numbers/"&gt;View ASP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/9981/mersenne-numbers/"&gt;View PHP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-4256362907571065472?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/4256362907571065472/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=4256362907571065472' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/4256362907571065472'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/4256362907571065472'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2008/11/mersenne-numbers.html' title='Mersenne Numbers'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-659665378176322571</id><published>2008-11-15T08:13:00.000-08:00</published><updated>2008-11-15T08:39:27.566-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='atomic'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><category scheme='http://www.blogger.com/atom/ns#' term='datetime'/><title type='text'>UTC and Atomic Time</title><content type='html'>&lt;p&gt;In this special double issue, I'm going to show you how to obtain time values in the &lt;abbr title="Greenwich Mean Time"&gt;GMT&lt;/abbr&gt; timezone, as well as ultra-precise atomic clock time values.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Our PHP programmer friends have a slight advantage against us. Their language is aware of what time zone the server is located in and is capable of doing various things with that information, including returning time values without any timezone offset. ASP has no clue what time zone the server is set for, but we can use XMLHTTP to retrieve a time value from a &lt;abbr title="National Institute of Standards and Technology"&gt;NIST&lt;/abbr&gt; time server.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function utcnow()&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim xmlhttp&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim response&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' Server to query datetime from&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Const TimeServer = "http://time.nist.gov:13"&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' Use XML HTTP object to request web page content&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Set xmlhttp = Server.CreateObject("Microsoft.XMLHTTP")&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;xmlhttp.Open "GET", TimeServer, false, "", ""&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;xmlhttp.Send&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response = xmlhttp.ResponseText&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set xmlhttp = nothing&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' Parse UTC date&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;utcnow = cDate(mid(response, 11, 2) &amp; "/" &amp; mid(response, 14, 2) &amp; "/" &amp; mid(response, 8, 2) &amp; " " &amp; mid(response, 16, 9))&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;If you were to compare the value returned by this function and the value returned by the built-in Now() function, you might notice more than just the hour value is different. This could mean you live in one of those funky half-hour-offset timezones, or it could mean that your server's clock is off by a few minutes. If accurate time values are important to you, you need a better Now() function. We can build one on top of the UTCnow() function we just wrote.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function atomicnow()&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim utc&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim offset&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;utc = utcnow()&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' The order of the dates is important here!&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;offset = DateDiff("h", utc, now())&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;atomicnow = DateAdd("h", offset, utc)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;There is expected to be some lag caused by this function, but the order of magnitude should only be milliseconds.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://snipplr.com/view/9772/utc-and-atomic-time/"&gt;View implementation on Snipplr&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-659665378176322571?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/659665378176322571/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=659665378176322571' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/659665378176322571'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/659665378176322571'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2008/11/utc-and-atomic-time.html' title='UTC and Atomic Time'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-2485016392200106153</id><published>2008-11-08T07:53:00.000-08:00</published><updated>2008-11-08T08:09:54.123-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='Math'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><title type='text'>Sinc function</title><content type='html'>&lt;p&gt;Today we're going to a &lt;a href="http://en.wikipedia.org/wiki/Sinc_function"&gt;Sinc function&lt;/a&gt;, both normalized and unnormalized. Apparently it's useful in digital signal processing.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;Const M_PI = 3.14159265358979323846&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;' Unnormalized sinc function.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function sinc(x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sinc = sin(x) / x&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;' Normalized sinc function.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;' REQUIRES: constant M_PI&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function nsinc(x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sinc = sin(M_PI * x) / (M_PI * x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;h4&gt;PHP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;// Unnormalized sinc function.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function sinc($x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return sin($x) / $x;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;// Normalized sinc function.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function nsinc($x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return sin(M_PI * $x) / (M_PI * $x);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/9568/sinc-function/"&gt;View ASP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/9569/sinc-function/"&gt;View PHP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-2485016392200106153?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/2485016392200106153/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=2485016392200106153' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/2485016392200106153'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/2485016392200106153'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2008/11/sinc-function.html' title='Sinc function'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-9092493507074832544</id><published>2008-11-01T07:55:00.000-07:00</published><updated>2008-11-01T08:24:07.865-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><category scheme='http://www.blogger.com/atom/ns#' term='datetime'/><title type='text'>Nth Day</title><content type='html'>&lt;p&gt;This week I want to share with you a function that I personally got a lot of use out of. Several years ago I had a situation where there was a calendar with several hundreds recurring events. It was desired to have these events fall on roughly the same day each year. The person responsible for this was spending two or three days at the end of each year planning all the occurrences for the next year on a giant wet-eraseable calendar.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Here's what all the fuss was about: Last year, November 1 was a Thursday. This year, November 1 is a Saturday. Saturday is not a working day for most people, so these events we are scheduling need to fall on week days. Because it fell on a Thursday last year, we'd prefer to have it on a Thursday again this year. This means either pushing it back to October 30 or forward to November 6.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;To make the event occur on the same day of the week, we'll store this information in our database and use it to generate the date for a given year. This is called the Nth Day. In the above example, our Nth Day is the first Thursday in November.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function nthDay(someYear, someMonth, someWeek, someWeekday)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim firstDay&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim someDay&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;firstDay = weekday(dateSerial(someYear, someMonth, 1))&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' Check if the week day of the first day of the month is before or after the given week day.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (someWeekday - firstDay) &gt;= 0 then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;someDay = 1 + (someWeekday - firstDay) + ((someWeek - 1) * 7)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;someDay = 1 + (someWeekday - firstDay) + (someWeek * 7)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nthDay = dateSerial(someYear, someMonth, someDay)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;If developing a system around this concept like I did, it's important to know that some months have a fifth week, depending on how late in the week the first day of the month is. You can't really schedule anything recurring during the fifth week. We kept it open both to give the people conducting the events a little time off, as well as for a place to move an event from the following month in situations where the customer thought it would be too late in the year otherwise.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;An idea I had to improve the system, but didn't get around to exploring, was to ignore the months entirely and use the weeks of the year. Nobody wants to schedule anything around Christmas and New Year's anyway, so you don't run into problems around the beginning/end of the year like you do at the beginning/end of a month. Under this system, first Thursday of November becomes Thursday of Week 44. Scheduling a recurring event this way is not only easier, but also more consistent from year to year.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://snipplr.com/view/9424/nth-day/"&gt;View ASP implementation on Snipplr&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-9092493507074832544?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/9092493507074832544/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=9092493507074832544' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/9092493507074832544'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/9092493507074832544'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2008/11/nth-day.html' title='Nth Day'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-8908612840586053374</id><published>2008-10-25T07:28:00.000-07:00</published><updated>2008-10-25T07:37:07.007-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='Math'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><title type='text'>Golden function</title><content type='html'>&lt;p&gt;The &lt;a href="http://en.wikipedia.org/wiki/Golden_function"&gt;golden function&lt;/a&gt; is the upper branch of the hyperbola.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function gold(x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gold = (x + sqr(x^2 + 4)) / 2&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;h4&gt;PHP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function gold($x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return ($x + sqrt($x^2 + 4)) / 2;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;Sorry if this is not exciting stuff. I've got some better stuff coming, but I want to clear out some older stuff that has been waiting a while.&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/9247/golden-function/"&gt;View ASP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/9248/golden-function/"&gt;View ASP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-8908612840586053374?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/8908612840586053374/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=8908612840586053374' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/8908612840586053374'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/8908612840586053374'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2008/10/golden-function.html' title='Golden function'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-4574832740611539603</id><published>2008-10-18T08:36:00.000-07:00</published><updated>2008-10-18T08:49:34.750-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><category scheme='http://www.blogger.com/atom/ns#' term='strings'/><title type='text'>Levenshtein distance</title><content type='html'>&lt;p&gt;The &lt;a href="http://en.wikipedia.org/wiki/Levenshtein_distance"&gt;Levenshtein distance&lt;/a&gt; between two strings is a measurement of similarity. The smaller the distance, the more similar two strings are. Our PHP programmer friends have a function to calculate this distance; we deserve one too.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function levenshtein(byVal first, byVal second)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim distance&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim truncateLength&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if first = second then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' The distance is zero if the strings are identical.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;distance = 0&lt;/code&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' The distance is at least the difference of the lengths of the two strings.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;distance = abs(len(first) - len(second))&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' Force the strings to be the same length to prevent overflows.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;truncateLength = ((len(first) + len(second)) - distance) / 2&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;first = Left(first, truncateLength)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;second = Left(second, truncateLength)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' Compare the corresponding characters in each string.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for i = 1 to truncateLength&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if Mid(first, i, 1) &lt;&gt; Mid(second, i, 1) then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;distance = distance + 1&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;next&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;levenshtein = distance&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://snipplr.com/view/9094/levenshtein-distance/"&gt;View ASP implementation on Snipplr&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-4574832740611539603?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/4574832740611539603/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=4574832740611539603' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/4574832740611539603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/4574832740611539603'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2008/10/levenshtein-distance.html' title='Levenshtein distance'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-2541808327452791078</id><published>2008-10-11T07:53:00.000-07:00</published><updated>2008-10-11T08:04:03.430-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><category scheme='http://www.blogger.com/atom/ns#' term='strings'/><title type='text'>WordCount</title><content type='html'>&lt;p&gt;PHP has a function called &lt;a href="http://ca.php.net/manual/en/function.str-word-count.php"&gt;str_word_count()&lt;/a&gt; which allows you to count the number of words in a string, and an array or associative array of those words. Unfortunately for us, ASP doesn't support optional parameters, so we can't duplicate all of this functionality in a single function, so we'll just concentrate on the main feature of counting the number of words.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function WordCount(byVal someString)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim position&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim spaces&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;spaces = 1&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;someString = trim(someString)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for position = 1 to len(someString)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if mid(someString, position, 1) = " " and not mid(someString, position - 1, 1) = " " then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;spaces = spaces + 1&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;next&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WordCount = spaces&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://snipplr.com/view/8958/wordcount/"&gt;View ASP implementation on Snipplr&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-2541808327452791078?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/2541808327452791078/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=2541808327452791078' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/2541808327452791078'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/2541808327452791078'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2008/10/wordcount.html' title='WordCount'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-78353685052406168</id><published>2008-10-04T07:46:00.000-07:00</published><updated>2009-06-20T10:17:19.931-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='Math'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><title type='text'>Nth Root</title><content type='html'>&lt;p&gt;Both ASP and PHP have a function that allows you to calculate the square root of a number. What if we wanted the cubic root of a number, or some deeper root? Calculating the root of a number is the same as raising that number to a fractional exponent.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function root(x, y)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;root = x ^ (1 / y)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;h4&gt;PHP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function root($x, $y)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return pow($x, 1/$y);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;dl&gt;&lt;dt&gt;x&lt;/dt&gt;&lt;dd&gt;the number you want the root of&lt;/dd&gt;&lt;dt&gt;y&lt;/dt&gt;&lt;dd&gt;the depth you want to go (2 = square, 3 = cubic, etc.)&lt;/dd&gt;&lt;/dl&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/8823/nth-root/"&gt;View ASP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/8824/nth-root/"&gt;View PHP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-78353685052406168?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/78353685052406168/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=78353685052406168' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/78353685052406168'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/78353685052406168'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2008/10/roots.html' title='Nth Root'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-5260946134720482945</id><published>2008-09-27T07:22:00.001-07:00</published><updated>2008-09-27T07:33:52.734-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><title type='text'>Format a number in scientific notation</title><content type='html'>&lt;p&gt;Surprisingly, neither ASP nor PHP seem to have a built-in way of formatting a number in &lt;a href="http://en.wikipedia.org/wiki/Scientific_notation"&gt;scientific notation&lt;/a&gt;. Today we're going to change that.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function formatScientific(someFloat)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim power&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;power = (someFloat mod 10) - 1&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;formatScientific = cStr(cDbl(someFloat) / 10^power) &amp; "e" &amp; cStr(power)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;h4&gt;PHP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function formatScientific($someFloat)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$power = ($someFloat % 10) - 1;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return ($someFloat / pow(10, $power)) . "e" . $power;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/8658/format-a-number-in-scientific-notation/"&gt;View ASP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/8659/format-a-number-in-scientific-notation/"&gt;View PHP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-5260946134720482945?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/5260946134720482945/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=5260946134720482945' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/5260946134720482945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/5260946134720482945'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2008/09/format-number-in-scientific-notation.html' title='Format a number in scientific notation'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-5882749212052635330</id><published>2008-09-21T07:43:00.000-07:00</published><updated>2008-09-21T07:57:02.890-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Math'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><title type='text'>Logarithms</title><content type='html'>&lt;p&gt;ASP's log() function returns the natural logarithm of a number. But what if we want a different base? The same problem exists with handheld calculators, and the same trick we use to get around it there can be used here too.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function logx(number, base)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;logx = log(number) / log(base)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://snipplr.com/view/8521/logarithms/"&gt;View ASP implementation on Snipplr&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-5882749212052635330?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/5882749212052635330/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=5882749212052635330' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/5882749212052635330'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/5882749212052635330'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2008/09/logarithms.html' title='Logarithms'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-6022065620062999411</id><published>2008-09-13T07:54:00.000-07:00</published><updated>2008-09-13T08:02:03.688-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><category scheme='http://www.blogger.com/atom/ns#' term='strings'/><title type='text'>str_repeat</title><content type='html'>&lt;p&gt;This week we're duplicating another string function from PHP: &lt;a href="http://ca3.php.net/manual/en/function.str-repeat.php"&gt;str_repeat()&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function str_repeat(input, multiplier)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim output&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;output = ""&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for i = 1 to multiplier&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;output = output &amp; input&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;next&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;str_repeat = output&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://snipplr.com/view/8384/strrepeat/"&gt;View ASP implementation on Snipplr&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-6022065620062999411?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/6022065620062999411/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=6022065620062999411' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/6022065620062999411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/6022065620062999411'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2008/09/strrepeat.html' title='str_repeat'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-7753507721494213979</id><published>2008-09-06T06:49:00.000-07:00</published><updated>2008-09-06T07:30:51.179-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><category scheme='http://www.blogger.com/atom/ns#' term='strings'/><title type='text'>str_pad</title><content type='html'>&lt;p&gt;PHP has a very useful function called str_pad(). It allows you to ensure that a string will conform to a specific length by adding characters of your choice on the end of your choice. A good practical example is when you want a number with leading zeros. ASP doesn't have an equivalent function out of the box, but we're going to write one today; as usual, we'll follow the same syntax to make it easy for those who are already familiar with PHP.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;Const STR_PAD_LEFT = "LEFT"&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;Const STR_PAD_RIGHT = "RIGHT"&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;Const STR_PAD_BOTH = "BOTH"&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;' Pad a string to a certain length with another string.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function str_pad(input, pad_length, pad_string, pad_type)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim output&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim difference&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;output = ""&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;difference = pad_length - len(input)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if difference &gt; 0 then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;select case ucase(pad_type)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case "LEFT"&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for i = 1 to difference step len(pad_string)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;output = output &amp; pad_string&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;next&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;output = right(output &amp; input, pad_length)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case "BOTH"&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;output = input&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for i = 1 to difference step len(pad_string) * 2&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;output = pad_string &amp; output &amp; pad_string&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;next&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' Not sure if it will step far enough when difference is an odd number, so this next block is just in case.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if len(output) &lt; pad_length then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;output = output &amp; pad_string&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;output = left(output, pad_length)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case else&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for i = 1 to difference step len(pad_string)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;output = output &amp; pad_string&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;next&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;output = left(input &amp; output, pad_length)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end select&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;output = input&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;str_pad = output&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;Thinking back to my days as a web developer, this was probably the most reused function out of all I'd ever written.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://snipplr.com/view/8221/strpad/"&gt;View ASP implementation on Snipplr&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-7753507721494213979?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/7753507721494213979/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=7753507721494213979' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/7753507721494213979'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/7753507721494213979'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2008/09/strpad.html' title='str_pad'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-6604333478203118547</id><published>2008-08-30T08:01:00.000-07:00</published><updated>2008-08-30T08:36:32.788-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='roman numerals'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><title type='text'>Roman Numerals, Part 3</title><content type='html'>&lt;p&gt;&lt;a href="http://reusablecode.blogspot.com/2008/03/roman-numerals-part-1.html"&gt;Back in March&lt;/a&gt;, we wrote a function to turn an arabic number into a Roman numeral. That function had a limitation of numbers smaller than 5000. There are ways of writing Roman numerals larger than 5000, but they are not as well accepted by purists because they evolved during later time periods. Out of respect for the purists, this new function will hinge on the old one, rather than replace it.&lt;/p&gt;&lt;p&gt;In the system we will be using, a bar is placed over the numeral to indicate that it is multipled by 1000:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="text-decoration: overline"&gt;V&lt;/span&gt; = 5000&lt;/li&gt;&lt;li&gt;&lt;span style="text-decoration: overline"&gt;X&lt;/span&gt; = 10,000&lt;/li&gt;&lt;li&gt;&lt;span style="text-decoration: overline"&gt;L&lt;/span&gt; = 50,000&lt;/li&gt;&lt;li&gt;&lt;span style="text-decoration: overline"&gt;C&lt;/span&gt; = 100,000&lt;/li&gt;&lt;li&gt;&lt;span style="text-decoration: overline"&gt;D&lt;/span&gt; = 500,000&lt;/li&gt;&lt;li&gt;&lt;span style="text-decoration: overline"&gt;M&lt;/span&gt; = 1 million&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Since there are no Unicode characters for this purpose, we will have to cheat a little bit by using some HTML and CSS.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function bigroman(ByVal arabic)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim thousands&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;thousands = Array("", "M", "MM", "MMM", "M(V)", "(V)", "(V)M", "(V)MM", "(V)MMM", "M(X)")&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if arabic &gt;= 10000 then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bigroman = "(" &amp; roman((arabic - (arabic mod 10000)) / 1000) &amp; ")"&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;arabic = arabic mod 10000&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bigroman = bigroman &amp; thousands((arabic - (arabic mod 1000)) / 1000)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;arabic = arabic mod 1000&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bigroman = bigroman &amp; roman(arabic)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' Convert parentheses to &amp;lt;span&amp;gt; tags.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bigroman = replace(bigroman, "(", "&amp;lt;span style=""text-decoration: overline""&amp;gt;")&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bigroman = replace(bigroman, ")", "&amp;lt;/span&amp;gt;")&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;h4&gt;PHP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function bigroman($arabic)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$thousands = Array("", "M", "MM", "MMM", "M(V)", "(V)", "(V)M", "(V)MM", "(V)MMM", "M(X)");&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ($arabic &gt;= 10000)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$bigroman = "(" . roman(($arabic - fmod($arabic, 10000)) / 1000) . ")";&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$arabic = fmod($arabic, 10000);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$bigroman .= $thousands[($arabic - fmod($arabic, 1000)) / 1000];&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$arabic = fmod($arabic, 1000);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$bigroman .= roman($arabic);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Convert parentheses to &amp;lt;span&amp;gt; tags.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$bigroman = str_replace("(", "&amp;lt;span style=""text-decoration: overline""&amp;gt;", $bigroman);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$bigroman = str_replace(")", "&amp;lt;/span&amp;gt;", $bigroman);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return $bigroman;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/8104/bigroman/"&gt;View ASP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/8105/bigroman/"&gt;View PHP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-6604333478203118547?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/6604333478203118547/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=6604333478203118547' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/6604333478203118547'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/6604333478203118547'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2008/08/roman-numerals-part-3.html' title='Roman Numerals, Part 3'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-1274600208571871488</id><published>2008-08-23T07:04:00.000-07:00</published><updated>2008-08-23T07:30:16.966-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><category scheme='http://www.blogger.com/atom/ns#' term='regular expressions'/><title type='text'>isValidPostCode</title><content type='html'>&lt;p&gt;In this final installment of the postal code trilogy, we turn our attention to the United Kingdom. Postal codes in the &lt;abbr title="United Kingdom"&gt;UK&lt;/abbr&gt; are called postcodes. They are similar to postal codes in Canada in that they contain both letters and numbers, but unlike Canadian postal codes, they are variable in length.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;A postcode can have any of the following formats:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;A9 9AA&lt;/li&gt;&lt;li&gt;A99 9AA&lt;/li&gt;&lt;li&gt;A9A 9AA&lt;/li&gt;&lt;li&gt;AA9 9AA&lt;/li&gt;&lt;li&gt;AA99 9AA&lt;/li&gt;&lt;li&gt;AA9A 9AA&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;To match all of these formats, we'll use the following regular expression: &lt;code&gt;[A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]|[A-HK-Y][0-9]([0-9]|[ABEHMNPRV-Y]))|[0-9][A-HJKS-UW])\ [0-9][ABD-HJLNP-UW-Z]{2}&lt;/code&gt;. You may notice that, like Canadian postal codes, certain letters are only allowed in certain positions, or not at all.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;There are also a few special cases that are valid postcodes but deviate from the regular format:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Girobank - &lt;code&gt;(GIR\ 0AA)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Father Christmas - &lt;code&gt;(SAN\ TA1)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;British Forces Post Office - &lt;code&gt;(BFPO\ (C\/O\ )?[0-9]{1,4})&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Overseas territories - &lt;code&gt;((ASCN|BBND|[BFS]IQQ|PCRN|STHL|TDCU|TKCA)\ 1ZZ)&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function isValidPostCode(postCode)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim regEx&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set regEx = new RegExp&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;with regEx&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.IgnoreCase = true&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Global = true&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Pattern = "^([A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]|[A-HK-Y][0-9]([0-9]|[ABEHMNPRV-Y]))|[0-9][A-HJKS-UW])\ [0-9][ABD-HJLNP-UW-Z]{2}|(GIR\ 0AA)|(SAN\ TA1)|(BFPO\ (C\/O\ )?[0-9]{1,4})|((ASCN|BBND|[BFS]IQQ|PCRN|STHL|TDCU|TKCA)\ 1ZZ))$"&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end with&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if regEx.Test(trim(CStr(postCode))) then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;isValidPostCode = true&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;isValidPostCode = false&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set regEx = nothing&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;h4&gt;PHP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function isValidPostCode($postCode)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$pattern = "/^([A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]|[A-HK-Y][0-9]([0-9]|[ABEHMNPRV-Y]))|[0-9][A-HJKS-UW])\ [0-9][ABD-HJLNP-UW-Z]{2}|(GIR\ 0AA)|(SAN\ TA1)|(BFPO\ (C\/O\ )?[0-9]{1,4})|((ASCN|BBND|[BFS]IQQ|PCRN|STHL|TDCU|TKCA)\ 1ZZ))$/i";&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return (preg_match($pattern, trim($postCode)) &gt; 0) ? true : false;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/7988/isvalidpostcode/"&gt;View ASP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/7989/isvalidpostcode/"&gt;View PHP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-1274600208571871488?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/1274600208571871488/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=1274600208571871488' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/1274600208571871488'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/1274600208571871488'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2008/08/isvalidpostcode.html' title='isValidPostCode'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-3497814142010344754</id><published>2008-08-16T15:47:00.000-07:00</published><updated>2008-08-16T16:27:48.237-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><category scheme='http://www.blogger.com/atom/ns#' term='regular expressions'/><title type='text'>isValidPostalCode</title><content type='html'>&lt;p&gt;This week we're turning our attention to my own country, Canada, and writing a function to validate postal codes. Unlike a ZIP code, a postal code contains letters too; the format is A1A 1A1. The simplest regular expression to validate this would be:&lt;/p&gt;&lt;p&gt;&lt;code&gt;^[A-Z]{1}[\d]{1}[A-Z]{1}[ ]?[\d]{1}[A-Z]{1}[\d]{1}$&lt;/code&gt;&lt;/p&gt;&lt;p&gt;But not all letters are used, and some letters can only appear in certain positions. Taking this into account gives us a slightly more complex pattern of:&lt;/p&gt; &lt;p&gt;&lt;code&gt;^[ABCEGHJ-NPRSTVXY]{1}[0-9]{1}[ABCEGHJ-NPRSTV-Z]{1}[ ]?[0-9]{1}[ABCEGHJ-NPRSTV-Z]{1}[0-9]{1}$&lt;/code&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;But I want to take this a step further and check the validity of the combination of the first three characters. The postal code C2B 4S3 has a valid format, but the code itself is not valid because there is no C2B postal area. I also want to check the postal code against the province to ensure that they match.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The full source code is too long to post here, but is available in its entirety from Snipplr in the language of your choice:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/7890/isvalidpostalcode/"&gt;View ASP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/7891/isvalidpostalcode/"&gt;View PHP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;Alternatively, if you wanted the extended validation, but didn't care about the province matching, you could combine everything into one gigantic regular expression:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;code&gt;^(A(0[ABCEGHJ-NPR]|1[ABCEGHK-NSV-Y]|2[ABHNV]|5[A]|8[A])|B(0[CEHJ-NPRSTVW]|1[ABCEGHJ-NPRSTV-Y]|2[ABCEGHJNRSTV-Z]|3[ABEGHJ-NPRSTVZ]|4[ABCEGHNPRV]|5[A]|6[L]|9[A])|C(0[AB]|1[ABCEN])|E(1[ABCEGHJNVWX]|2[AEGHJ-NPRSV]|3[ABCELNVYZ]|4[ABCEGHJ-NPRSTV-Z]|5[ABCEGHJ-NPRSTV]|6[ABCEGHJKL]|7[ABCEGHJ-NP]|8[ABCEGJ-NPRST]|9[ABCEGH])|G(0[ACEGHJ-NPRSTV-Z]|1[ABCEGHJ-NPRSTV-Y]|2[ABCEGJ-N]|3[ABCEGHJ-NZ]|4[ARSTVWXZ]|5[ABCHJLMNRTVXYZ]|6[ABCEGHJKLPRSTVWXZ]|7[ABGHJKNPSTXYZ]|8[ABCEGHJ-NPTVWYZ]|9[ABCHNPRTX])|H(0[HM]|1[ABCEGHJ-NPRSTV-Z]|2[ABCEGHJ-NPRSTV-Z]|3[ABCEGHJ-NPRSTV-Z]|4[ABCEGHJ-NPRSTV-Z]|5[AB]|7[ABCEGHJ-NPRSTV-Y]|8[NPRSTYZ]|9[ABCEGHJKPRSWX])|J(0[ABCEGHJ-NPRSTV-Z]|1[ACEGHJ-NRSTXZ]|2[ABCEGHJ-NRSTWXY]|3[ABEGHLMNPRTVXYZ]|4[BGHJ-NPRSTV-Z]|5[ABCJ-MRTV-Z]|6[AEJKNRSTVWYXZ]|7[ABCEGHJ-NPRTV-Z]|8[ABCEGHLMNPRTVXYZ]|9[ABEHJLNTVXYZ])|K(0[ABCEGHJ-M]|1[ABCEGHJ-NPRSTV-Z]|2[ABCEGHJ-MPRSTVW]|4[ABCKMPR]|6[AHJKTV]|7[ACGHK-NPRSV]|8[ABHNPRV]|9[AHJKLV])|L(0[[ABCEGHJ-NPRS]]|1[ABCEGHJ-NPRSTV-Z]|2[AEGHJMNPRSTVW]|3[BCKMPRSTVXYZ]|4[ABCEGHJ-NPRSTV-Z]|5[ABCEGHJ-NPRSTVW]|6[ABCEGHJ-MPRSTV-Z]|7[ABCEGJ-NPRST]|8[EGHJ-NPRSTVW]|9[ABCGHK-NPRSTVWYZ])|M(1[BCEGHJ-NPRSTVWX]|2[HJ-NPR]|3[ABCHJ-N]|4[ABCEGHJ-NPRSTV-Y]|5[ABCEGHJ-NPRSTVWX]|6[ABCEGHJ-NPRS]|7[AY]|8[V-Z]|9[ABCLMNPRVW])|N(0[ABCEGHJ-NPR]|1[ACEGHKLMPRST]|2[ABCEGHJ-NPRTVZ]|3[ABCEHLPRSTVWY]|4[BGKLNSTVWXZ]|5[ACHLPRV-Z]|6[ABCEGHJ-NP]|7[AGLMSTVWX]|8[AHMNPRSTV-Y]|9[ABCEGHJKVY])|P(0[ABCEGHJ-NPRSTV-Y]|1[ABCHLP]|2[ABN]|3[ABCEGLNPY]|4[NPR]|5[AEN]|6[ABC]|7[ABCEGJKL]|8[NT]|9[AN])|R(0[ABCEGHJ-M]|1[ABN]|2[CEGHJ-NPRV-Y]|3[ABCEGHJ-NPRSTV-Y]|4[AHJKL]|5[AGH]|6[MW]|7[ABCN]|8[AN]|9[A])|S(0[ACEGHJ-NP]|2[V]|3[N]|4[AHLNPRSTV-Z]|6[HJKVWX]|7[HJ-NPRSTVW]|9[AHVX])|T(0[ABCEGHJ-MPV]|1[ABCGHJ-MPRSV-Y]|2[ABCEGHJ-NPRSTV-Z]|3[ABCEGHJ-NPRZ]|4[ABCEGHJLNPRSTVX]|5[ABCEGHJ-NPRSTV-Z]|6[ABCEGHJ-NPRSTVWX]|7[AENPSVXYZ]|8[ABCEGHLNRSVWX]|9[ACEGHJKMNSVWX])|V(0[ABCEGHJ-NPRSTVWX]|1[ABCEGHJ-NPRSTV-Z]|2[ABCEGHJ-NPRSTV-Z]|3[ABCEGHJ-NRSTV-Y]|4[ABCEGK-NPRSTVWXZ]|5[ABCEGHJ-NPRSTV-Z]|6[ABCEGHJ-NPRSTV-Z]|7[ABCEGHJ-NPRSTV-Y]|8[ABCGJ-NPRSTV-Z]|9[ABCEGHJ-NPRSTV-Z])|X(0[ABCGX]|1[A])|Y(0[AB]|1[A]))[ ]?[0-9]{1}[ABCEGHJ-NPRSTV-Z]{1}[0-9]{1}$&lt;/code&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-3497814142010344754?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/3497814142010344754/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=3497814142010344754' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/3497814142010344754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/3497814142010344754'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2008/08/isvalidpostalcode.html' title='isValidPostalCode'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-2296730792778932496</id><published>2008-08-09T07:47:00.000-07:00</published><updated>2008-08-09T08:04:14.988-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><category scheme='http://www.blogger.com/atom/ns#' term='regular expressions'/><title type='text'>isValidZipCode</title><content type='html'>&lt;p&gt;Another week, another validation function. Last week was a little long, so this week we'll do a bit shorter one: validating a United States ZIP code. The pattern is simple enough that I don't think an explanation is warranted.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function isValidZIPCode(zipCode)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim regEx&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set regEx = new RegExp&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;with regEx&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.IgnoreCase = True&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Global = True&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Pattern = "^[0-9]{5}(-[0-9]{4})?$"&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end with&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if regEx.Test(trim(CStr(zipCode))) then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;isValidZipCode = True&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;isValidZipCode = False&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set regEx = nothing&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;h4&gt;PHP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function isValidZIPCode($zipCode)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return (preg_match("/^[0-9]{5}(-[0-9]{4})?$/i", trim($zipCode)) &gt; 0) ? true : false;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/7785/isvalidzipcode/"&gt;View ASP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/7786/isvalidzipcode/"&gt;View PHP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-2296730792778932496?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/2296730792778932496/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=2296730792778932496' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/2296730792778932496'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/2296730792778932496'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2008/08/isvalidzipcode.html' title='isValidZipCode'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-8581622441251489375</id><published>2008-08-02T06:46:00.000-07:00</published><updated>2008-08-02T07:15:20.380-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><category scheme='http://www.blogger.com/atom/ns#' term='regular expressions'/><title type='text'>isValidEmail</title><content type='html'>&lt;p&gt;This week we're going to build on the regular expression we wrote last week to validate e-mail addresses. What do IP addresses have to do with e-mail addresses? Just like domain names map to IP addresses, so also the domain part of an e-mail address can be substituted with an IP address, so instead of person@example.com you could have person@192.168.1.1&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function isValidEmail(email)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim regEx&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim result&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set regEx = new RegExp&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;with regEx&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.IgnoreCase = True&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Global = True&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Pattern = "^[^@]{1,64}@[^@]{1,255}$"&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end with&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result = false&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' Test length.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if regEx.Test(email) then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;regEx.Pattern = "^((([\w\+\-]+)(\.[\w\+\-]+)*)|(\"[^(\\|\")]{0,62}\"))@(([a-zA-Z0-9\-]+\.)+([a-zA-Z0-9]{2,})|\[?([1]?\d{1,2}|2[0-4]{1}\d{1}|25[0-5]{1})(\.([1]?\d{1,2}|2[0-4]{1}\d{1}|25[0-5]{1})){3}\]?)$"&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' Test syntax.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if regEx.Test(email) then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result = true&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;isValidEmail = result&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set regEx = nothing&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;h4&gt;PHP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function isValidEmail($email)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$lengthPattern = "/^[^@]{1,64}@[^@]{1,255}$/";&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$syntaxPattern = "/^((([\w\+\-]+)(\.[\w\+\-]+)*)|(\"[^(\\|\")]{0,62}\"))@(([a-zA-Z0-9\-]+\.)+([a-zA-Z0-9]{2,})|\[?([1]?\d{1,2}|2[0-4]{1}\d{1}|25[0-5]{1})(\.([1]?\d{1,2}|2[0-4]{1}\d{1}|25[0-5]{1})){3}\]?)$/";&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return ((preg_match($lengthPattern, $email) &gt; 0) &amp;&amp; (preg_match($syntaxPattern, $email) &gt; 0)) ? true : false;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;The validation is broken down into two steps: checking the length of each part, and checking the syntax of each part.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;^[^@]{1,64}@[^@]{1,255}$&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The part before the @ symbol is called the local part, and cannot exceed 64 characters. The part after the @ symbol is called the domain part, and cannot exceed 255 characters.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;^((([\w\+\-]+)(\.[\w\+\-]+)*)|(\"[^(\\|\")]{0,62}\"))@(([a-zA-Z0-9\-]+\.)+([a-zA-Z0-9]{2,})|\[?([1]?\d{1,2}|2[0-4]{1}\d{1}|25[0-5]{1})(\.([1]?\d{1,2}|2[0-4]{1}\d{1}|25[0-5]{1})){3}\]?)$&lt;/p&gt;&lt;br /&gt;&lt;p&gt;In the check for syntax, the local part is validated by &lt;code&gt;((([\w\+\-]+)(\.[\w\+\-]+)*)|(\"[^(\\|\")]{0,62}\"))&lt;/code&gt;. This is actually two patterns separated by the pipe character. The first, &lt;code&gt;(([\w\+\-]+)(\.[\w\+\-]+)*)&lt;/code&gt;, allows letters, numbers, the plus sign, and the hyphen (or minus sign if you prefer). It also allows periods, but not as the first or last character. The second, &lt;code&gt;(\"[^(\\|\")]{0,62}\")&lt;/code&gt;, allows just about anything, provided the local part is enclosed in quotation marks (which is valid, but you'll probably never encounter it).&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The domain part is validated by &lt;code&gt;(([a-zA-Z0-9\-]+\.)+([a-zA-Z0-9]{2,})|\[?([1]?\d{1,2}|2[0-4]{1}\d{1}|25[0-5]{1})(\.([1]?\d{1,2}|2[0-4]{1}\d{1}|25[0-5]{1})){3}\]?)&lt;/code&gt;. Once again, this is two different patterns separated by the pipe character. The second pattern is our IP address checker from last week with optional enclosure in square brackets. The first pattern, &lt;code&gt;([a-zA-Z0-9\-]+\.)+([a-zA-Z0-9]{2,})&lt;/code&gt;, allows a slightly smaller range of characters (no plus signs or underscores), any number of subdomains, and a top-level domain of at least 2 characters (the minimum). Some regular expressions will impose a maximum of six characters on the top-level domain (the longest at the moment is .museum), but that wouldn't allow for longer top-level domains that could be created in the future.&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/7670/isvalidemail/"&gt;View ASP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/7671/isvalidemail/"&gt;View PHP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-8581622441251489375?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/8581622441251489375/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=8581622441251489375' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/8581622441251489375'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/8581622441251489375'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2008/08/isvalidemail.html' title='isValidEmail'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-8172623687221366026</id><published>2008-07-26T07:03:00.000-07:00</published><updated>2008-07-26T07:39:47.870-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><category scheme='http://www.blogger.com/atom/ns#' term='regular expressions'/><title type='text'>isValidIP</title><content type='html'>&lt;p&gt;As promised, more regular expression fun. This week we're going to validate IP addresses. An IP address consists of four octets separated by periods. A lazy person might be inclined to use a regular expression of &lt;code&gt;\d{1,3}&lt;/code&gt; for each octet, but that would allow numbers larger than 255. A more complex expression is needed: &lt;code&gt;([1]?\d{1,2}|2[0-4]{1}\d{1}|25[0-5]{1})&lt;/code&gt;.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;This expression consists of three parts separated by the pipe character &amp;quot;|&amp;quot;. The first part, &lt;code&gt;[1]?\d{1,2}&lt;/code&gt;, matches numbers between 0 and 199. The second part, &lt;code&gt;2[0-4]{1}\d{1}&lt;/code&gt;, matches numbers between 200 and 249. The third part, &lt;code&gt;25[0-5]{1}&lt;/code&gt;, matches numbers between 250 and 255. We will repeat this pattern four times, once for each octet, and separate with periods.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function isValidIP(ip)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim regEx&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set regEx = new RegExp&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;with regEx&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.IgnoreCase = True&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Global = True&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Pattern = "^([1]?\d{1,2}|2[0-4]{1}\d{1}|25[0-5]{1})(\.([1]?\d{1,2}|2[0-4]{1}\d{1}|25[0-5]{1})){3}$"&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end with&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if regEx.Test(trim(CStr(ip))) then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;isValidIP = true&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;isValidIP = false&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set regEx = nothing&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;h4&gt;PHP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function isValidIP($ip)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$pattern = "/^([1]?\d{1,2}|2[0-4]{1}\d{1}|25[0-5]{1})(\.([1]?\d{1,2}|2[0-4]{1}\d{1}|25[0-5]{1})){3}$/";&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return (preg_match($pattern, $ip) &gt; 0) ? true : false;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;Next week we're going to build on this pattern to validate something else. I wonder what that could be?&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/7520/isvalidip/"&gt;View ASP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/7521/isvalidip/"&gt;View PHP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-8172623687221366026?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/8172623687221366026/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=8172623687221366026' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/8172623687221366026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/8172623687221366026'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2008/07/isvalidip.html' title='isValidIP'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-306965090116459324</id><published>2008-07-19T12:58:00.000-07:00</published><updated>2008-07-19T13:28:48.724-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><category scheme='http://www.blogger.com/atom/ns#' term='regular expressions'/><title type='text'>isAlpha(Numeric)</title><content type='html'>&lt;p&gt;We're going to take a break from math-related functions for a few weeks (yay!) and play with &lt;a href="http://en.wikipedia.org/wiki/Regular_expression"&gt;regular expressions&lt;/a&gt;. Regular expressions are more powerful and faster than old-fashioned string parsing.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Both ASP and PHP have a function for checking if something is numeric. How about a function for checking if something is alphabetical?&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function isAlpha(someString)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim regEx&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set regEx = new RegExp&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;with regEx&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Global = true&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.IgnoreCase = true&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Pattern = "[A-Z\s_]"&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end with&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if regEx.test(someString) then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;isAlpha = true&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;isAlpha = false&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set regEx = nothing&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;h4&gt;PHP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function is_alpha($someString)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return (preg_match("/[A-Z\s_]/i", $someString) &gt; 0) ? true : false;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;The test pattern we are using above will allow letters of the alphabet, the underscore character, and whitespace characters. With a small tweak to the test pattern, we can also write a function to check if a string is alphanumeric.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function isAlphaNumeric(someString)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim regEx&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set regEx = new RegExp&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;with regEx&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Global = true&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.IgnoreCase = true&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Pattern = "[\w\s.]"&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end with&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if regEx.test(someString) then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;isAlphaNumeric = true&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;isAlphaNumeric = false&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set regEx = nothing&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;h4&gt;PHP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function is_alphanumeric($someString)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return (preg_match("/[\w\s.]/i", $someString) &gt; 0) ? true : false;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;The \w switch in the pattern includes the 26 letters of the alphabet plus the numbers zero through nine.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;More regular expression fun next week!&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/7401/isalpha/"&gt;View ASP implementation for isAlpha on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/7402/isalpha/"&gt;View PHP implementation for is_alpha on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/7403/isalphanumeric/"&gt;View ASP implementation for isAlphaNumeric on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/7404/isalphanumeric/"&gt;View PHP implementation for is_alphanumeric on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-306965090116459324?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/306965090116459324/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=306965090116459324' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/306965090116459324'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/306965090116459324'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2008/07/isalphanumeric.html' title='isAlpha(Numeric)'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-2768608602308836113</id><published>2008-07-12T07:55:00.000-07:00</published><updated>2008-07-12T08:13:46.862-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='Math'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><title type='text'>Fibonacci numbers</title><content type='html'>&lt;p&gt;The Fibonacci numbers have &lt;a href="http://en.wikipedia.org/wiki/Fibonacci_number#Applications"&gt;many applications&lt;/a&gt; in computer programming. Today we're going to write a function that returns individual numbers from the Fibonacci sequence.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function fib(x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim fibArray()&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;redim fibArray(x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fibArray(0) = 0&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fibArray(1) = 1&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for i = 2 to x&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fibArray(i) = fibArray(i - 1) + fibArray(i - 2)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;next&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fib = fibArray(x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;h4&gt;PHP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function fib($x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$fibArray[0] = 0;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$fibArray[1] = 1;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for($i = 2; $i &lt;= $x; $i++)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$fibArray[$i] = $fibArray[$i - 1] + $fibArray[$i - 2];&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return $fibArray[$x];&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;So, for example, fib(8) will return 21, because the Fibonacci sequence is 1, 1, 2, 3, 5, 8, 13, 21, 34, 55...&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/7243/fibonacci-numbers/"&gt;View ASP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/7244/fibonacci-numbers/"&gt;View PHP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-2768608602308836113?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/2768608602308836113/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=2768608602308836113' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/2768608602308836113'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/2768608602308836113'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2008/07/fibonacci-numbers.html' title='Fibonacci numbers'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-2546979400636953933</id><published>2008-07-05T07:04:00.000-07:00</published><updated>2008-07-12T08:14:31.264-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='Math'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><title type='text'>Fermat numbers</title><content type='html'>&lt;p&gt;Today we're going to write a function to generate &lt;a href="http://en.wikipedia.org/wiki/Fermat_number"&gt;Fermat numbers&lt;/a&gt;. This could be useful if you want to write your own pseudo-random number generator.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function fermat(x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fermat = 2^2^x + 1&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;h4&gt;PHP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function fermat($x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return 2^2^$x + 1;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/7137/fermat-numbers/"&gt;View ASP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/7138/fermat-numbers/"&gt;View PHP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-2546979400636953933?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/2546979400636953933/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=2546979400636953933' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/2546979400636953933'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/2546979400636953933'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2008/07/fermat-numbers.html' title='Fermat numbers'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-2813824723653567846</id><published>2008-06-21T07:36:00.000-07:00</published><updated>2008-06-21T08:04:51.860-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><category scheme='http://www.blogger.com/atom/ns#' term='datetime'/><title type='text'>AM/PM</title><content type='html'>&lt;p&gt;To those of you who have been bored by the recent string of math-related articles, I apologize. I still have a lot of math-related functions to share with you, but I do have other things to share with you as well, such as validation functions, string functions, and datetime functions. This week we'll take a look at one of those datetime functions.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;In ASP, time values are normally in the format HH:MM:SS followed by AM or PM. Quite often, we don't want to include the seconds portion, so we extract the hours and minutes using the Hour() and Minute() functions respectively. Unfortunately, there is no quick function for extracting the AM/PM. Let's do something about that right now.&lt;/p&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function ampm(someTime)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if hour(someTime) &lt; 12 then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ampm = "AM"&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ampm = "PM"&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;Now we can do stuff like this:&lt;br /&gt;&lt;code&gt;Hour(someTime) &amp; ":" &amp; Minute(someTime) &amp; " " &amp; ampm(someTime)&lt;/code&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Those of you who are PHP programmers are hopefully aware that the same result can be achieved in PHP using the built-in date() function and specifying the letter A or a in the format string for uppercase or lowercase respectively:&lt;br /&gt;&lt;code&gt;date("g:i A", $timestamp)&lt;/code&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://snipplr.com/view/6831/ampm/"&gt;View this code on Snipplr&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-2813824723653567846?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/2813824723653567846/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=2813824723653567846' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/2813824723653567846'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/2813824723653567846'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2008/06/ampm.html' title='AM/PM'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-4208420992076682289</id><published>2008-06-14T06:56:00.000-07:00</published><updated>2008-06-14T07:17:50.223-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='Math'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><title type='text'>Factorial</title><content type='html'>&lt;p&gt;This week we're going to delve into some discrete math, starting with factorial. The factorial of a number is the product of that number and all the numbers smaller than it. For example, the factorial of 3 is 1 x 2 x 3 = 6.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function factorial(x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim result&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result = 1&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if x &gt; 1 then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for i = 2 to x&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result = result * i&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;next&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;factorial = result&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;h4&gt;PHP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function factorial($x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$result = 1;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ($x &gt; 1)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for ($i = 2; $i &lt;= $x; $i++)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$result *= $i;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return $result;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;Now that we have a function for factorial, we can also do combinatorial. Combinatorial tells us the number of combinations, without regard to order, of y items that can be made from a pool of x items.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function combinatorial(x, y)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (x &gt;= y) and (y &gt; 0) then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;combinatorial = factorial(x) / factorial(y) / factorial(x - y)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;combinatorial = 0&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;h4&gt;PHP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function combinatorial($x, $y)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return (($x &gt;= $y) &amp;&amp; ($y &gt; 0)) ? factorial($x) / factorial($y) / factorial($x - $y) : 0;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;We can also get the number of permutations of y items that can be made from a pool of x items.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function permutations(x, y)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;permutations = factorial(x) / factorial(x - y)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;h4&gt;PHP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function permutations($x, $y)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return factorial($x) / factorial($x - $y);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/6711/factorial/"&gt;ASP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/6712/factorial/"&gt;PHP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-4208420992076682289?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/4208420992076682289/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=4208420992076682289' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/4208420992076682289'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/4208420992076682289'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2008/06/factorial.html' title='Factorial'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-6522457979631541702</id><published>2008-06-07T07:59:00.000-07:00</published><updated>2008-06-07T08:08:36.876-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Math'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><title type='text'>Pythagorean Theorem</title><content type='html'>&lt;p&gt;When you're dealing with right-angled triangles, trigonometry is not required to calculate the length of the hypotenuse. Our PHP programmers friends have a function called hypot() which solves for c in the equation: a^2 + b^2 = c^2&lt;/p&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function hypot(a, b)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hypot = sqr(a^2 + b^2)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;Using the classic 3-4-5 triangle as an example, for a = 3 and b = 4, the function will return 5.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://snipplr.com/view/6619/pythagorean-theorem/"&gt;View this code on Snipplr&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-6522457979631541702?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/6522457979631541702/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=6522457979631541702' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/6522457979631541702'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/6522457979631541702'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2008/06/pythagorean-theorem.html' title='Pythagorean Theorem'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-4375354108400845074</id><published>2008-05-31T06:50:00.000-07:00</published><updated>2008-05-31T07:13:29.527-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Math'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><category scheme='http://www.blogger.com/atom/ns#' term='Calculus'/><category scheme='http://www.blogger.com/atom/ns#' term='Trigonometry'/><title type='text'>Degrees and Radians</title><content type='html'>&lt;p&gt;When you were learning trigonometry, you probably measured angles in degrees. But in calculus, angles are measured in radians (search for &amp;quot;&lt;a href="http://www.google.com/search?q=degrees+vs.+radians"&gt;degrees vs. radians&lt;/a&gt;&amp;quot; on Google for the reasons). Being able to convert between these two units might be handy. PHP provides two functions for this purpose, but no such luck in ASP. As usual, we're going to write our own.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Radians is heavily based on my favorite number, pi. We're going to need this number in our calculations, so make sure to define a constant for it.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;code&gt;Const M_PI = 3.14159265358979323846&lt;/code&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;And now the functions themselves...&lt;/p&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function deg2rad(x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;deg2rad = x * M_PI / 180&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function rad2deg(x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rad2deg = x * 180 / M_PI&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://snipplr.com/view/6514/degrees-and-radians/"&gt;View this code on Snipplr&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-4375354108400845074?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/4375354108400845074/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=4375354108400845074' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/4375354108400845074'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/4375354108400845074'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2008/05/degrees-and-radians.html' title='Degrees and Radians'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-1348281039350447631</id><published>2008-05-24T06:31:00.000-07:00</published><updated>2008-05-24T07:31:22.908-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='Math'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><title type='text'>Euclid's Algorithm</title><content type='html'>&lt;p&gt;Euclid's algorithm is one of the oldest, known by ancient Greeks like Aristotle. You might remember it from elementary school when you had to find things like greatest common factor/divisor and least common multiple. Greatest common factor/divisor allowed you to reduce fractions like 4/12 to 1/3. Least common multiple allowed you to add and subtract fractions that had different denominators.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;There is more than one way to implement this algorithm. The original involved iterative subtraction. This was later improved upon with iterative modulo division. Another method, the one I'll be using here, is recursion.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function gcd(byVal a, byVal b)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a = abs(a)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;b = abs(b)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if a = 0 then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gcd = b&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elseif b = 0 then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gcd = a&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elseif a &gt; b then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gcd = gcd(b, a mod b)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gcd = gcd(a, b mod a)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function lcm(byVal a, byVal b)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a = abs(a)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;b = abs(b)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if a &gt; b then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lcm = (b / gcd(a, b)) * a&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lcm = (a / gcd(a, b)) * b&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;h4&gt;PHP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function gcd($a, $b)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$a = abs($a);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$b = abs($b);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ($a == 0)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return $b;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elseif ($b == 0)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return $a;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elseif ($a &gt; $b)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return gcd($b, $a % $b);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return gcd($a, $b % $a);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function lcm($a, $b)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$a = abs($a);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$b = abs($b);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ($a &gt; $b)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return ($b / gcd($a, $b)) * $a;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return ($a / gcd($a, $b)) * $b;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;Euclid's algorithm is not always the fastest, but it is the simplest. A &lt;a href="http://en.wikipedia.org/wiki/Lehmer%27s_GCD_algorithm"&gt;better algorithm&lt;/a&gt; was devised by 20th century mathematician &lt;a href="http://en.wikipedia.org/wiki/Derrick_Henry_Lehmer"&gt;Dick Lehmer&lt;/a&gt;. Another 20th century mathematician, Josef Stein, devised a &lt;a href="http://en.wikipedia.org/wiki/Binary_GCD_algorithm"&gt;specialized algorithm for computers&lt;/a&gt; which uses bit shifting. Note, however, that the performance improvement of these more modern algorithms varies depending on the CPU and size of the numbers involved. In some cases, Euclid is actually faster.&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/6440/euclids-algorithm/"&gt;ASP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://snipplr.com/view/6441/euclids-algorithm/"&gt;PHP implementation on Snipplr&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-1348281039350447631?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/1348281039350447631/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=1348281039350447631' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/1348281039350447631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/1348281039350447631'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2008/05/euclids-algorithm.html' title='Euclid&apos;s Algorithm'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-1050109922827059193</id><published>2008-05-19T12:48:00.000-07:00</published><updated>2008-05-24T07:32:22.988-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><title type='text'>Update</title><content type='html'>&lt;p&gt;I've updated my &lt;a href="http://reusablecode.blogspot.com/2008/03/leap-years.html"&gt;Leap Years&lt;/a&gt; article with more elegant PHP solutions thanks to &lt;span class="vcard"&gt;&lt;a class="url fn" href="http://style-vs-substance.com/"&gt;Jim Mayes&lt;/a&gt;&lt;/span&gt;.&lt;/p&gt;&lt;p&gt;I discovered his feedback via a web site called &lt;a href="http://snipplr.com/"&gt;Snipplr&lt;/a&gt;, where I've been uploading all the code examples from this blog. All the previous code examples are still available here on the blog, but I'm considering posting future code examples on Snipplr only and linking to them from the blog, because it takes a ridiculous amount of time to format the code examples to display nicely on the blog. I think it will depend on the length of the example; I don't mind reformatting short examples, but I've got some longer ones that I'd rather not.&lt;/p&gt;&lt;p&gt;Anyways, you can view all my code snippets from &lt;a href="http://snipplr.com/users/Scooter/"&gt;my Snipplr profile&lt;/a&gt;. There are also some bonus things in there which are outside the scope of this blog (eg. Windows registry tweaks). I've also added this link to the sidebar so that it will be easy to find in the future when this post disappears off the front page.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-1050109922827059193?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/1050109922827059193/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=1050109922827059193' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/1050109922827059193'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/1050109922827059193'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2008/05/update.html' title='Update'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-4974608573867239838</id><published>2008-05-17T08:04:00.000-07:00</published><updated>2008-05-17T08:20:29.314-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Math'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><title type='text'>Ceiling and Floor</title><content type='html'>&lt;p&gt;In mathematics, there are two elementary special functions called ceiling() and floor() which allow us to round up or down, respectively, to the nearest whole number. These functions exist natively in PHP, but not in ASP. They are handy in situations where you want to force a number like 15.8 to round down to 15, but the round() function rounds it up to 16 according to the standard rules for rounding.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function floor(x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim temp&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;temp = round(x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if temp &gt; x then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;temp = temp - 1&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;floor = temp&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function ceil(x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim temp&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;temp = round(x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if temp &lt; x then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;temp = temp + 1&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ceil = temp&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-4974608573867239838?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/4974608573867239838/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=4974608573867239838' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/4974608573867239838'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/4974608573867239838'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2008/05/ceiling-and-floor.html' title='Ceiling and Floor'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-4598909999341480541</id><published>2008-05-10T07:13:00.000-07:00</published><updated>2008-05-10T07:21:50.184-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><title type='text'>Tractive Effort</title><content type='html'>&lt;p&gt;This week is another short, fun snippet of code. We're going to calculate the tractive effort of a steam locomotive. Useless to most people, but I've got a large project where I'll be using it myself.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function TractiveEffort(cylinderDiameter, stroke, pressure, wheelDiameter)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TractiveEffort = cylinderDiameter ^ 2 * stroke * pressure * 0.85 / wheelDiameter&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;h4&gt;PHP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function $tractiveEffort($cylinderDiameter, $stroke, $pressure, $wheelDiameter)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return $cylinderDiameter ^ 2 * $stroke * $pressure * 0.85 / $wheelDiameter;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;It should be noted that the formula only applies to non-compound steam locomotives. Locomotives with multiple cylinders are more complex.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-4598909999341480541?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/4598909999341480541/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=4598909999341480541' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/4598909999341480541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/4598909999341480541'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2008/05/tractive-effort.html' title='Tractive Effort'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-6334619494030365695</id><published>2008-05-03T07:47:00.000-07:00</published><updated>2009-02-07T19:49:56.886-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Math'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><title type='text'>Base Conversion</title><content type='html'>&lt;p&gt;Most of the modern world uses a base-10 number system. It's the easiest to work with. However, when it comes to computer systems, we use a few different number systems too. Base-2, or binary, is the basis of data storage and transmission; a bit is either on or off. We also use Base-8, or octal; each byte contains 8 bits. Last but not least is Base-16, or hexadecimal.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Under some circumstances, we might need to convert between these different number systems. ASP provides a pathetic two functions for this purpose: hex(), which converts from base-10 (decimal) to base-16 (hexadecimal), and oct() which converts from decimal to octal. PHP provides equivalent functions dechex() and decoct(), as well as additional functions decbin() for converting from decimal to binary, bindec() for converting from binary to decimal, hexdec() for converting from hexadecimal to decimal, and octdec() for converting from octal to decimal.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;It would be nice to extend ASP to support these four additional functions. When I started doing that, I noticed a pattern in the formulae. All the functions that converted from decimal were fairly similar, and all the functions that converted to decimal were also fairly similar. So I abstracted the calculations out into their own functions and simplified my code.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;' Convert from binary to decimal.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function bindec(bin)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bindec = toDecimal(bin, 2)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;' Convert from decimal to binary&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function decbin(dec)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;decbin = fromDecimal(dec, 2)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;' Convert from decimal to hexadecimal.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function dechex(dec)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' Assume that built-in hex() function is faster.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dechex = hex(dec)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;' Convert from decimal to octal.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function decoct(dec)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' Assume that built-in oct() function is faster.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;decoct = oct(dec)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;' Convert from hexadecimal to decimal.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function hexdec(hex)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hexdec = toDecimal(hex, 16)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;' Convert from octal to decimal.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function octdec(oct)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;octdec = toDecimal(oct, 8)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;Before we get into the underlying fromDecimal() and toDecimal() functions, some things need to be said. The lowest possible base is 2, so if the user tries to specify a base smaller than 2, we will change it to 2. Likewise, there is a practical upper limit of base 36. Beyond that, things get more complicated, so any base higher than 36 will be changed to 36 to prevent the function from going out of bounds and returning bad data.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function toDecimal(value, radix)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim result&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim digit&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result = 0&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' Prevent radix from going out of bounds.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if radix &lt; 2 then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;radix = 2&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elseif radix &gt; 36 then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;radix = 36&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for i = 1 to Len(value)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;digit = Mid(value, i, 1)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' Convert letters to numbers.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if not isNumeric(digit) then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' The letter A in any base is equal to 10 in decimal.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' The ASCII value of A is 65, so subtract 55 from the ASCII value to obtain the decimal value.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;digit = Asc(UCase(digit)) - 55&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;digit = CInt(digit)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' Return zero if any digit is out of bounds for the radix.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if digit &gt;= radix then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result = 0&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit for&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result = result + (digit * radix ^ (Len(value) - i))&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;next&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;toDecimal = result&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function fromDecimal(value, radix)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim result&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim digit&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result = 0&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' Prevent radix from going out of bounds.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if radix &lt; 2 then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;radix = 2&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elseif radix &gt; 36 then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;radix = 36&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' Check for invalid input.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if isNumeric(value) then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' Inputted value appears to be base 10. OK to proceed.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;do until value = 0&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;digit = value Mod radix&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if digit &gt; 9 then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;digit = Chr(digit + 55)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result = CStr(digit) &amp; result&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;value = value \ radix&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;loop&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' Inputted value was NOT base 10.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result = 0&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fromDecimal = result&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;It would be even better if we could easily convert between two bases where neither one is decimal. Also, it would be nice to have a unified interface. We can achieve both with one function, base_convert(), which is also present in PHP.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function base_convert(value, sourceRadix, targetRadix)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if sourceRadix = targetRadix then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' If source radix and target radix are equal, don't waste time converting.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;baseConv = value&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elseif sourceRadix = 10 then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' If source radix is decimal, skip converting to decimal.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;baseConv = fromDecimal(value, targetRadix)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elseif targetRadix = 10 then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' If target radix is decimal, skip converting from decimal.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;baseConv = toDecimal(value, sourceRadix)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' Convert to decimal, and then from decimal.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;baseConv = fromDecimal(toDecimal(value, sourceRadix), targetRadix)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;I leave you with the following potential exercises:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;From base 37 to 62, the lowercase letters of the Latin alphabet are used, but special handling would need to be added for them. The ASCII value for Z is 90. The ASCII value for a is 97. There are six other characters in between.&lt;/li&gt;&lt;li&gt;Base64 encoding begins with the uppercase letters A-Z, followed by a-z, followed by 0-9, followed by + and /. If you want to add Base64 support, separate functions would be wise, but could still be tied into the base_convert() wrapper.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-6334619494030365695?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/6334619494030365695/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=6334619494030365695' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/6334619494030365695'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/6334619494030365695'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2008/05/base-conversion.html' title='Base Conversion'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-8474185417566972132</id><published>2008-04-26T10:12:00.000-07:00</published><updated>2008-04-26T10:28:37.575-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='control structures'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><title type='text'>Immediate If</title><content type='html'>&lt;p&gt;Visual Basic programmers have a function at their disposal called IIf(), which is an abbreviation for &lt;strong&gt;I&lt;/strong&gt;mmediate &lt;strong&gt;If&lt;/strong&gt;.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;Example&lt;/h4&gt;&lt;p&gt;&lt;code&gt;result = IIf(2 + 2 = 5, "Correct", "Wrong")&lt;/code&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The iif() function is sometimes more convenient than a full-blown if...then...else... control structure. Oddly enough, the function does not exist in VBScript.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Our PHP programmer friends have a superior equivalent, the ternary operator.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;Example&lt;/h4&gt;&lt;p&gt;&lt;code&gt;$result = (2 + 2 = 5) ? 'Correct' : 'Wrong';&lt;/code&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Unfortunately we can't recreate the ternary operator in ASP, but we can recreate the iif() function.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function IIf(expression, truecondition, falsecondition)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if cbool(expression) then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IIf = truecondition&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IIf = falsecondition&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-8474185417566972132?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/8474185417566972132/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=8474185417566972132' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/8474185417566972132'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/8474185417566972132'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2008/04/immediate-if.html' title='Immediate If'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-3088480282048777950</id><published>2008-04-19T08:25:00.000-07:00</published><updated>2008-04-19T08:47:39.086-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><category scheme='http://www.blogger.com/atom/ns#' term='strings'/><title type='text'>Proper Case</title><content type='html'>&lt;p&gt;Both ASP and PHP have handy functions for forcing characters in a string to be all uppercase or all lowercase, but what about proper case? Proper case is used for names of people, titles of songs or movies, etc. The first letter in each word is capitalized, and the other letters are lowercase.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;PHP has a built-in function for this, but the usage is slightly different and the name of the function is inconsistent, so we're going to write a facade function.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;PHP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function strtoproper($someString)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return ucwords(strtolower($someString));&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;ASP doesn't have a function for this, though full-blown Visual Basic does. We're going to duplicate that functionality, and make a few improvements. Consider names like McDonald and O'Brien. An ordinary proper case function would not handle these properly. We're going to use a regular expression to find these situations and handle them appropriately.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function PCase(someString)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim position&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim space&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim result&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim regEx&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;position = 1&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set regEx = new RegExp&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;regEx.Pattern = "^(Mc[A-Z]{1}[A-Za-z]|O\'[A-Z]{1}[A-Za-z]|Mac[A-Z]{1}[A-Za-z])"&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' Loop through the string checking for spaces.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;do while InStr(position, someString, " ", 1) &lt;&gt; 0&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' Find the position of the next space.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;space = InStr(position, someString, " ", 1)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' Capitalize (and append to our output) the first character after the space which was handled by the previous run through the loop.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result = result &amp; UCase(Mid(someString, position, 1))&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' Check for situations like McDonald or O'Brien.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if not regEx.Test(Mid(someString, position, space - position)) then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' Lowercase (and append to our output) the rest of the string up to and including the current space.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result = result &amp; LCase(Mid(someString, position + 1, space - position))&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if Left(Mid(someString, position), 3) = "Mac" then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' Leave the next three characters intact.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result = result &amp; Mid(someString, position + 1, 3)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' Append the rest of the string.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result = result &amp; LCase(Mid(someString, position + 4, space - position + 4))&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' Leave the next two characters intact.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result = result &amp; Mid(someString, position + 1, 2)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' Append the rest of the string.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result = result &amp; LCase(Mid(someString, position + 3, space - position + 3))&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;position = space + 1&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;loop&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' Capitalize the first character of the last word after the final space (or the only word if there were no spaces).&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result = result &amp; UCase(Mid(someString, position, 1))&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' Check for situations like McDonald or O'Brien.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if not regEx.Test(Mid(someString, position)) then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' Lowercase (and append to our output) the rest of the string up to and including the current space.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result = result &amp; LCase(Mid(someString, position + 1))&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if Left(Mid(someString, position), 3) = "Mac" then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' Leave the next three characters intact.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result = result &amp; Mid(someString, position + 1, 3)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' Append the rest of the string.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result = result &amp; LCase(Mid(someString, position + 4))&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' Leave the next two characters intact.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result = result &amp; Mid(someString, position + 1, 2)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' Append the rest of the string.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result = result &amp; LCase(Mid(someString, position + 3))&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set regEx = Nothing&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PCase = result&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-3088480282048777950?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/3088480282048777950/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=3088480282048777950' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/3088480282048777950'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/3088480282048777950'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2008/04/proper-case.html' title='Proper Case'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-8093056132117775537</id><published>2008-04-12T08:52:00.000-07:00</published><updated>2008-04-12T09:06:21.664-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><title type='text'>Ordinal Numbers</title><content type='html'>&lt;p&gt;This week we're going to write a function to turn a cardinal integer into an ordinal number (eg. 4 becomes 4th). This is mostly useful when generating a page to display to a visitor.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function ordinal(ByVal cardinal)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cardinal = CStr(cardinal)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if Right(cardinal, 1) = "1" and Right(cardinal, 2) &lt;&gt; "11" then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ordinal = cardinal &amp; "st"&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elseif Right(cardinal, 1) = "2" and Right(cardinal, 2) &lt;&gt; "12" then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ordinal = cardinal &amp; "nd"&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elseif Right(cardinal, 1) = "3" and Right(cardinal, 2) &lt;&gt; "13" then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ordinal = cardinal &amp; "rd"&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ordinal = cardinal &amp; "th"&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;h4&gt;PHP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function ordinal($cardinal)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (substr($cardinal, -1, 1) == 1 &amp;&amp; substr($cardinal, -2, 2) != 11)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return ($cardinal . 'st');&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elseif (substr($cardinal, -1, 1) == 2 &amp;&amp; substr($cardinal, -2, 2) != 12)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return ($cardinal . 'nd');&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elseif (substr($cardinal, -1, 1) == 3 &amp;&amp; substr($cardinal, -2, 2) != 13)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return ($cardinal . 'rd');&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return ($cardinal . 'th');&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-8093056132117775537?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/8093056132117775537/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=8093056132117775537' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/8093056132117775537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/8093056132117775537'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2008/04/ordinal-numbers.html' title='Ordinal Numbers'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-7051908152107836226</id><published>2008-04-05T07:48:00.000-07:00</published><updated>2008-04-05T08:09:38.863-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SSL'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><title type='text'>Force SSL</title><content type='html'>&lt;p&gt;If your web site requires visitors to enter private information, like their credit card number, or even just a username and password, you're hopefully using SSL to secure the transmission. But providing SSL is not enough, because visitors can still access your site without SSL. When a visitor navigates to a page where they are entering private information, we want to enforce that their data is protected by SSL.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Our PHP programmer friends can do this via an htaccess file:&lt;/p&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;RewriteEngine On&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;RewriteCond %{HTTPS} off&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;But for those of us stuck using ASP, we don't have this luxury. We can achieve the same result with some code.&lt;/p&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;sub forceSSL()&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dim secureURL&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if UCase(Request.ServerVariables("HTTPS")) = "OFF" then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;secureURL = "https://" &amp; Request.ServerVariables("SERVER_NAME") &amp; Request.ServerVariables("HTTP_URL")&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if Request.ServerVariables("QUERY_STRING") &lt;&gt; "" then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;secureURL = secureURL &amp; "?" &amp; Request.ServerVariables("QUERY_STRING")&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Response.Redirect secureURL&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end sub&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;There are some things here worth noting. In both the htaccess example and the ASP example, we are checking if HTTPS is off. Some people will instead check if traffic is coming from port 80, the standard HTTP port, or not coming from 443, the standard HTTPS port. Checking port numbers is not the best solution because the server administrator can set up HTTP and HTTPS to run on different ports. It's also worth noting that the above ASP example preserves QueryString variables, if any are being passed. Most other examples I've seen on the Internet ignore the QueryString variables, which leads to navigation problems.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;With this subroutine in your arsenal, just call it at the top of any page you want to secure.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-7051908152107836226?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/7051908152107836226/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=7051908152107836226' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/7051908152107836226'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/7051908152107836226'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2008/04/force-ssl.html' title='Force SSL'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-6731696323177471588</id><published>2008-03-29T08:05:00.000-07:00</published><updated>2008-03-29T08:21:50.787-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><category scheme='http://www.blogger.com/atom/ns#' term='Star Wars'/><title type='text'>Finding your Star Wars name</title><content type='html'>&lt;p&gt;It's high time we did something fun. We're going to write a function that determines a person's Star Wars name.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function starwarsname(firstName, lastName, maidenName, city)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;starwarsname = Left(firstName, 3) &amp; LCase(Left(lastName, 2)) &amp; " " &amp; Left(maidenName, 2) &amp; LCase(Left(city, 3))&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;h4&gt;PHP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function starwarsname($firstName, $lastName, $maidenName, $city)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return substr($firstName, 0, 3) . strtolower(substr($lastName, 0, 2)) . " " . substr($maidenName, 0, 2) . strtolower(substr($city, 0, 3));&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-6731696323177471588?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/6731696323177471588/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=6731696323177471588' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/6731696323177471588'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/6731696323177471588'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2008/03/finding-your-star-wars-name.html' title='Finding your Star Wars name'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-8023241464931773050</id><published>2008-03-22T08:31:00.000-07:00</published><updated>2008-03-22T09:23:15.138-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><category scheme='http://www.blogger.com/atom/ns#' term='datetime'/><title type='text'>Calculating Easter</title><content type='html'>&lt;p&gt;It's Easter weekend, and as promised we're going to write a function to calculate when Easter occurs for a given year. Easter is a strange holiday in that it jumps around the calendar between March and April. This is because it is tied to the lunar cycle. Easter occurs on the first Sunday after the Paschal full moon.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function dateEaster(someYear)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim goldenNumber&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim solarCorrection&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim lunarCorrection&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim paschalFullMoon&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim dominicalNumber&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim difference&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim dayEaster&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;goldenNumber = (someYear Mod 19) + 1&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if someYear &lt;= 1752 then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' Julian calendar&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dominicalNumber = (someYear + (someYear / 4) + 5) Mod 7&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;paschalFullMoon = (3 - (11 * goldenNumber) - 7) Mod 30&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' Gregorian calendar&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dominicalNumber = (someYear + (someYear / 4) - (someYear / 100) + (someYear / 400)) Mod 7&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;solarCorrection = (someYear - 1600) / 100 - (someYear - 1600) / 400&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lunarCorrection = (((someYear - 1400) / 100) * 8) / 25&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;paschalFullMoon = (3 - 11 * goldenNumber + solarCorrection - lunarCorrection) Mod 30&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;do until dominicalNumber &gt; 0&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dominicalNumber = dominicalNumber + 7&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;loop&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;do until paschalFullMoon &gt; 0&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;paschalFullMoon = paschalFullMoon + 30&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;loop&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if paschalFullMoon = 29 or (paschalFullMoon = 28 and goldenNumber &gt; 11) then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;paschalFullMoon = paschalFullMoon - 1&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;difference = (4 - paschalFullMoon - dominicalNumber) Mod 7&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if difference &lt; 0 then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;difference = difference + 7&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dayEaster = paschalFullMoon + difference + 1&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if dayEaster &lt; 11 then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' Easter occurs in March.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dateEaster = DateSerial(someYear, 3, dayEaster + 21)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' Easter occurs in April.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dateEaster = DateSerial(someYear, 4, dayEaster - 10)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;h4&gt;PHP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function dateEaster($someYear)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$goldenNumber = fmod($someYear, 19) + 1;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ($someYear &lt;= 1752)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Julian calendar&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$dominicalNumber = fmod($someYear + ($someYear / 4) + 5, 7);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$paschalFullMoon = fmod(3 - (11 * $goldenNumber) - 7, 30);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Gregorian calendar&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$dominicalNumber = fmod($someYear + ($someYear / 4) - ($someYear / 100) + ($someYear / 400), 7);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$solarCorrection = ($someYear - 1600) / 100 - ($someYear - 1600) / 400;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$lunarCorrection = ((($someYear - 1400) / 100) * 8) / 25;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$paschalFullMoon = fmod(3 - 11 * $goldenNumber + $solarCorrection - $lunarCorrection, 30);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while ($dominicalNumber &lt; 0)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$dominicalNumber += 7;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while ($paschalFullMoon &lt; 0)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$paschalFullMoon += 30;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ($paschalFullMoon == 29 || ($paschalFullMoon == 28 &amp;&amp; $goldenNumber &gt; 11))&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$paschalFullMoon--;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$difference = fmod(4 - $paschalFullMoon - $dominicalNumber, 7);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ($difference &lt; 0)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$difference += 7;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$dayEaster = $paschalFullMoon + $difference + 1;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ($dayEaster &lt; 11)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Easter occurs in March.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$dateEaster = mktime(0, 0, 0, 3, $dayEaster + 21, $someYear);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Easter occurs in April.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$dateEaster = mktime(0, 0, 0, 4, $dayEaster - 10, $someYear);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return $dateEaster;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;We can calculate the other ecclesiastical holidays by offsetting the date of Easter with the number of days between Easter and the holiday we're looking for.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function dateGoodFriday(someYear)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dateGoodFriday = DateAdd("d", -2, dateEaster(someYear))&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function datePalmSunday(someYear)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;datePalmSunday = DateAdd("d", -7, dateEaster(someYear))&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function dateAshWednesday(someYear)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dateAshWednesday = DateAdd("d", -46, dateEaster(someYear))&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function dateAscensionDay(someYear)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dateAscensionDay = DateAdd("d", 39, dateEaster(someYear))&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function datePentecost(someYear)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;datePentecost = DateAdd("d", 49, dateEaster(someYear))&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;h4&gt;PHP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function dateGoodFriday($someYear)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$easter = getDate(dateEaster($someYear));&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return mktime(0, 0, 0, $easter[mon], $easter[mday] - 2, $easter[year]);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function datePalmSunday($someYear)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$easter = getDate(dateEaster($someYear));&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return mktime(0, 0, 0, $easter[mon], $easter[mday] - 7, $easter[year]);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function dateAshWednesday($someYear)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$easter = getDate(dateEaster($someYear));&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return mktime(0, 0, 0, $easter[mon], $easter[mday] - 46, $easter[year]);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function dateAscensionDay($someYear)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$easter = getDate(dateEaster($someYear));&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return mktime(0, 0, 0, $easter[mon], $easter[mday] + 39, $easter[year]);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function datePentecost($someYear)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$easter = getDate(dateEaster($someYear));&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return mktime(0, 0, 0, $easter[mon], $easter[mday] + 49, $easter[year]);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-8023241464931773050?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/8023241464931773050/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=8023241464931773050' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/8023241464931773050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/8023241464931773050'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2008/03/calculating-easter.html' title='Calculating Easter'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-6043039566242069662</id><published>2008-03-15T12:08:00.000-07:00</published><updated>2010-09-05T10:49:27.163-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='roman numerals'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><title type='text'>Roman Numerals, Part 2</title><content type='html'>&lt;p&gt;Last week we converted integers into Roman numerals, and I promised this week we would write a function to do the opposite. Part of the difficulty in working with Roman numerals is the subtractive notation. The number four can be written as IV or IIII; writing it as IV is the subtractive notation. When I precedes V, it means one less than five; if you reverse the two (VI), it means one more than five.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;To make our life easier, we want to expand the subtractive notation so that each numeral is equal to its value. While we're at it, we'll also write a function to compress Roman numerals back in subtractive notation.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function roman_expand(ByVal roman)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;roman = replace(roman, "CM", "DCCCC")&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;roman = replace(roman, "CD", "CCCC")&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;roman = replace(roman, "XC", "LXXXX")&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;roman = replace(roman, "XL", "XXXX")&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;roman = replace(roman, "IX", "VIIII")&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;roman = replace(roman, "IV", "IIII")&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;roman_expand = roman&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function roman_compress(ByVal roman)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;roman = replace(roman, "DCCCC", "CM")&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;roman = replace(roman, "CCCC", "CD")&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;roman = replace(roman, "LXXXX", "XC")&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;roman = replace(roman, "XXXX", "XL")&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;roman = replace(roman, "VIIII", "IX")&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;roman = replace(roman, "IIII", "IV")&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;roman_compress = roman&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;h4&gt;PHP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function roman_expand($roman)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$roman = str_replace("CM", "DCCCC", $roman);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$roman = str_replace("CD", "CCCC", $roman);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$roman = str_replace("XC", "LXXXX", $roman);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$roman = str_replace("XL", "XXXX", $roman);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$roman = str_replace("IX", "VIIII", $roman);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$roman = str_replace("IV", "IIII", $roman);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return $roman;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function roman_compress($roman)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$roman = str_replace("DCCCC", "CM", $roman);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$roman = str_replace("CCCC", "CD", $roman);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$roman = str_replace("LXXXX", "XC", $roman);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$roman = str_replace("XXXX", "XL", $roman);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$roman = str_replace("VIIII", "IX", $roman);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$roman = str_replace("IIII", "IV", $roman);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return $roman;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;These expand and compress functions would be essential if you wanted to write some functions to actually perform arithmetic on Roman numerals, and although on paper Roman addition is fairly straightforward, an implementation of it in code performs more poorly than simply converting the Roman numeral back into an integer and using the built-in math operators.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The following ASP function requires the InstrCount function from my previous post.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function arabic(ByVal roman)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim result&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result = 0&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' Remove subtractive notation.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;roman = roman_expand(roman)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' Calculate for each numeral.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result = result + InstrCount(roman, "M") * 1000&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result = result + InstrCount(roman, "D") * 500&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result = result + InstrCount(roman, "C") * 100&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result = result + InstrCount(roman, "L") * 50&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result = result + InstrCount(roman, "X") * 10&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result = result + InstrCount(roman, "V") * 5&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result = result + InstrCount(roman, "I")&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;h4&gt;PHP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function arabic($roman)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$result = 0;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Remove subtractive notation.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$roman = roman_expand($roman);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Calculate for each numeral.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$result += substr_count($roman, 'M') * 1000;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$result += substr_count($roman, 'D') * 500;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$result += substr_count($roman, 'C') * 100;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$result += substr_count($roman, 'L') * 50;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$result += substr_count($roman, 'X') * 10;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$result += substr_count($roman, 'V') * 5;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$result += substr_count($roman, 'I');&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return $result;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;Although I don't have code for you to actually add two Roman numerals together, I will tell you how to do it. For this example, we will add the numerals XIV and VII. First we must remove the subtractive notation, so XIV becomes XIIII and VII stays as it is. On paper we would then concatenate the two together and sort them.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;XIIII + VII = XIIIIVII = XVIIIIII&lt;/p&gt;&lt;br /&gt;&lt;p&gt;We already have a concatenation operator, but we would need to write a custom sorting function for Roman numerals. If we're going to go that much trouble, it might be better to just build a new string by counting the number of each numeral in the two strings we are given. This would allow us to handle the situation above where we now have six I's. Our next step is to combine similar numerals that are equal to the next larger numeral.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;XVIIIIII = XVVI = XXI&lt;/p&gt;&lt;br /&gt;&lt;p&gt;In code, it would be best to start with the smallest numeral, I, and work our way towards the largest numeral.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Subtraction of Roman numerals involves expanding and cancelling until there is only one number left.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;XIV - VI = XIIII - VI = XIII - V = VVIII - V = VIII&lt;/p&gt;&lt;br /&gt;&lt;p&gt;I leave it up to you to research how to perform multiplication and division of Roman numerals, and whether or not you want to write functions for Roman arithmetic. Such functions would not be useful in production code, but writing them would be a good exercise, and it would be interesting to compare the runtimes with conversion back to Arabic followed by a conversion to Roman again.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Next weekend is Easter, so we'll be writing code to calculate when Easter and its related holidays (Good Friday, Pentecost, etc.) occur for any given year.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-6043039566242069662?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/6043039566242069662/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=6043039566242069662' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/6043039566242069662'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/6043039566242069662'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2008/03/roman-numerals-part-2.html' title='Roman Numerals, Part 2'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-7132671633915961629</id><published>2008-03-12T12:01:00.000-07:00</published><updated>2008-03-12T12:16:28.064-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><category scheme='http://www.blogger.com/atom/ns#' term='strings'/><title type='text'>InstrCount()</title><content type='html'>&lt;p&gt;This is a special mid-week edition of Reusable Code. While preparing this weekend's edition, I discovered that for the ASP examples we would need another utility function that is useful outside of working with Roman numerals. I feel it important enough to have it's own post, but I don't want to delay the upcoming posts.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;ASP programmers are probably familiar with the Instr() function. It returns the location of one string within another. Sometimes you want to know how many times one string occurs within another. PHP programmers have a built-in function called substr_count() which can do this. We're going to write our own function in ASP to duplicate some of this functionality.&lt;/p&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function InstrCount(haystack, needle)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if needle &lt;&gt; "" then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InstrCount = UBound(Split(haystack, needle))&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;It's fairly self-explanatory, but just in case you're not familiar with the Split() function... We are splitting the string into an array, using the search string (needle) as our delimiter. The upper bound of the array gives us the number of needles in our haystack.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Why didn't I call the function substr_count() to match PHP? Normally I do like to have things consistent between languages because it makes it easier for people to go from one to the other, but in this particular case, the PHP function substr_count has two optional arguments. Since ASP does not support optional arguments (at least not the way you would expect), I went with a name more similar to the complementary Instr() function.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-7132671633915961629?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/7132671633915961629/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=7132671633915961629' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/7132671633915961629'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/7132671633915961629'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2008/03/instrcount.html' title='InstrCount()'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-6657379099464582532</id><published>2008-03-08T13:55:00.000-08:00</published><updated>2008-03-08T14:40:15.697-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='roman numerals'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><title type='text'>Roman Numerals, Part 1</title><content type='html'>&lt;p&gt;This weekend we're going to write a function to convert an integer into a Roman numeral, because storing Roman numerals in a database as strings is not cool.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function roman(ByVal arabic)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim ones&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim tens&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim hundreds&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim thousands&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ones = Array("", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX")&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tens = Array("", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC")&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hundreds = Array("", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM")&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;thousands = Array("", "M", "MM", "MMM", "MMMM")&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if arabic &gt; 4999 then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' For large numbers (five thousand and above), a bar is placed above a base numeral to indicate multiplication by 1000.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' Since it is not possible to illustrate this in plain ASCII, this function will refuse to convert numbers above 4999.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Err.Clear&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Err.Raise 9&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elseif arabic = 0 then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' About 725, Bede or one of his colleagues used the letter N, the initial of nullae,&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' in a table of epacts, all written in Roman numerals, to indicate zero.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;roman = "N"&lt;/code&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;roman = thousands((arabic - (arabic mod 1000)) / 1000)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;arabic = arabic mod 1000&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;roman = roman &amp; hundreds((arabic - (arabic mod 100)) / 100)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;arabic = arabic mod 100&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;roman = roman &amp; tens((arabic - (arabic mod 10)) / 10)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;arabic = arabic mod 10&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;roman = roman &amp; ones((arabic - (arabic mod 1)) / 1)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;arabic = arabic mod 1&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;h4&gt;PHP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function roman($arabic)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$ones = Array("", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX");&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$tens = Array("", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC");&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$hundreds = Array("", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM");&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$thousands = Array("", "M", "MM", "MMM", "MMMM");&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ($arabic &gt; 4999)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// For large numbers (five thousand and above), a bar is placed above a base numeral to indicate multiplication by 1000.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Since it is not possible to illustrate this in plain ASCII, this function will refuse to convert numbers above 4999.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;die("Cannot represent numbers larger than 4999 in plain ASCII.");&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elseif ($arabic == 0)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// About 725, Bede or one of his colleagues used the letter N, the initial of nullae,&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// in a table of epacts, all written in Roman numerals, to indicate zero.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return "N";&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$roman = $thousands[($arabic - fmod($arabic, 1000)) / 1000];&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$arabic = fmod($arabic, 1000);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$roman .= $hundreds[($arabic - fmod($arabic, 100)) / 100];&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$arabic = fmod($arabic, 100);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$roman .= $tens[($arabic - fmod($arabic, 10)) / 10];&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$arabic = fmod($arabic, 10);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$roman .= $ones[($arabic - fmod($arabic, 1)) / 1];&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$arabic = fmod($arabic, 1);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return $roman;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;You may have noticed in the PHP example that I used the fmod() function instead of the % operator. That was a clue that you might want to add support for floating point integers. You can learn how to represent fractions from the &lt;a href="http://en.wikipedia.org/wiki/Roman_numerals#Fractions"&gt;Wikipedia article on Roman numerals&lt;/a&gt;. Here's a couple of hints to get you started:&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;You will need another array to hold the numerals for the fractional values.&lt;/li&gt;&lt;li&gt;The fractional portion should be handled after the whole number portion has been converted and modularly divided out.&lt;/li&gt;&lt;li&gt;However, pre-check the rounding of the fraction before you start the conversion. If it rounds to a whole number, round it off before the conversion to prevent problems.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;Next weekend, we're going to write some utility functions that will be useful for turning Roman numerals back into integers, or if you're feeling particularly crazy, performing mathematical calculations on Roman numerals. The weekend after that is Easter weekend, so we'll write a function to calculate Easter and the related holidays surrounding it.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-6657379099464582532?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/6657379099464582532/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=6657379099464582532' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/6657379099464582532'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/6657379099464582532'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2008/03/roman-numerals-part-1.html' title='Roman Numerals, Part 1'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-5354937854519982882</id><published>2008-03-02T07:41:00.000-08:00</published><updated>2008-05-19T12:45:40.322-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><category scheme='http://www.blogger.com/atom/ns#' term='datetime'/><title type='text'>Leap Years</title><content type='html'>&lt;p&gt;This year (2008) is a leap year, and this past week contained February 29. It seems only fitting that we talk about calculating leap years and what we can do with that information.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;A leap year is always divisible by four, but not by one hundred unless it is also divisible by four hundred.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function isLeapYear(someYear)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if someYear Mod 4 = 0 and (someYear Mod 100 &lt;&gt; 0 or (someYear Mod 100 = 0 and someYear Mod 400 = 0)) then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;isLeapYear = True&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;isLeapYear = False&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;h4&gt;PHP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function isLeapYear($someYear)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return date("L", strtotime($someYear . "-01-01"));&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;Now let's write a function to build on this which returns the number of days in a given month.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function MonthDays(someMonth, someYear)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;select case someMonth&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case 1, 3, 5, 7, 8, 10, 12&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MonthDays = 31&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case 4, 6, 9, 11&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MonthDays = 30&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case 2&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if isLeapYear(someYear) then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MonthDays = 29&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MonthDays = 28&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end select&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;h4&gt;PHP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function MonthDays($someMonth, $someYear)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return date("t", strtotime($someYear . "-" . $someMonth . "-01"));&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;UPDATE:&lt;/strong&gt; Thanks to &lt;span class="vcard"&gt;&lt;a class="url fn" href="http://style-vs-substance.com/"&gt;Jim Mayes&lt;/a&gt;&lt;/span&gt; for showing me more elegant PHP solutions.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-5354937854519982882?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/5354937854519982882/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=5354937854519982882' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/5354937854519982882'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/5354937854519982882'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2008/03/leap-years.html' title='Leap Years'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-3601540378545360791</id><published>2008-02-23T10:15:00.000-08:00</published><updated>2008-02-23T12:08:11.538-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><category scheme='http://www.blogger.com/atom/ns#' term='Temperature'/><title type='text'>Temperature Conversion</title><content type='html'>&lt;p&gt;I promised we'd do something different this week, and that something different is temperature conversion. We're going to write some code to convert between Celsius, Fahrenheit, and Kelvin - the three most popular units of measurement for temperature.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function CelsiusToFahrenheit(temperature)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CelsiusToFahrenheit = (temperature * 9 / 5) + 32&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function CelsiusToKelvin(temperature)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CelsiusToKelvin = temperature + 273.15&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function FahrenheitToCelsius(temperature)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FahrenheitToCelsius = (temperature - 32) * 5 / 9&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function FahrenheitToKelvin(temperature)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FahrenheitToKelvin = (temperature - 32) * 5 / 9 + 273.15&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function KelvinToCelsius(temperature)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;KelvinToCelsius = temperature - 273.15&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function KelvinToFahrenheit(temperature)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;KelvinToFahrenheit = (temperature - 273.15) * 9 / 5 + 32&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;h4&gt;PHP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function CelsiusToFahrenheit($temperature)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return ($temperature * 9 / 5) + 32;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function CelsiusToKelvin($temperature)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return $temperature + 273.15;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function FahrenheitToCelsius($temperature)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return ($temperature - 32) * 5 / 9;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function FahrenheitToKelvin($temperature)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return ($temperature - 32) * 5 / 9 + 273.15;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function KelvinToCelsius($temperature)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return $temperature - 273.15;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function KelvinToFahrenheit($temperature)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return ($temperature - 273.15) * 9 / 5 + 32;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;You may have noticed that the conversion between Celsius and Kelvin is a simple addition or subtraction. I could have written the code such that some functions make use of other functions, but I decided to write each function to be self-sufficient in performing it's calculations. The reason for this is speed; calling an extra function would give a small performance hit. You could consider this contrary to how I wrote the trigonometry functions, but in those cases, the calculations were more complicated.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Ok, so now what? Let's write a facade function to make it easier to call the individual conversion functions.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function convertTemperature(temperature, originScale, targetScale)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' Return the input value for temperature if both scales are identical.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if UCase(originScale) = UCase(targetScale) then&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;convertTemperature = temperature&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit function&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Select Case UCase(originScale)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Case "CELSIUS"&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Select Case UCase(targetScale)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Case "FAHRENHEIT"&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;convertTemperature = CelsiusToFahrenheit(temperature)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Case "KELVIN"&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;convertTemperature = CelsiusToKelvin(temperature)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;End Select&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Case "FAHRENHEIT"&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Select Case UCase(targetScale)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Case "CELSIUS"&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;convertTemperature = FahrenheitToCelsius(temperature)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Case "KELVIN"&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;convertTemperature = FahrenheitToKelvin(temperature)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;End Select&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Case "KELVIN"&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Select Case UCase(targetScale)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Case "CELSIUS"&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;convertTemperature = KelvinToCelsius(temperature)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Case "FAHRENHEIT"&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;convertTemperature = KelvinToFahrenheit(temperature)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;End Select&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;End Select&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;h4&gt;PHP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function convertTemperature($temperature, $originScale, $targetScale)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Return the input value for temperature if both scales are identical.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (strtoupper($originScale) == strtoupper($targetScale))&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return $temperature;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;switch (strtoupper($originScale))&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case "CELSIUS":&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;switch (strtoupper($targetScale))&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case "FAHRENHEIT":&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return CelsiusToFahrenheit($temperature);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case "KELVIN":&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return CelsiusToKelvin($temperature);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case "FAHRENHEIT":&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;switch (strtoupper($targetScale))&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case "CELSIUS":&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return FahrenheitToCelsius($temperature);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case "KELVIN":&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return FahrenheitToKelvin($temperature);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case "KELVIN":&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;switch (strtoupper($targetScale))&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case "CELSIUS":&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return KelvinToCelsius($temperature);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case "FAHRENHEIT":&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return KelvinToFahrenheit($temperature);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;Whew! The line wrapping makes it look uglier than it is, but you can copy-paste it into your code editor of choice and it will be formatted correctly there.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;That's it for this week and for this topic. If you want to expand on this, you can add conversion functions for other temperature scales: Delisle, Newton, Rankine, Reaumur, and Romer. The formulas and information about each scale are available on Wikipedia.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-3601540378545360791?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/3601540378545360791/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=3601540378545360791' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/3601540378545360791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/3601540378545360791'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2008/02/temperature-conversion.html' title='Temperature Conversion'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-3646802604854035220</id><published>2008-02-18T08:26:00.000-08:00</published><updated>2008-02-18T08:49:35.920-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='Math'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><category scheme='http://www.blogger.com/atom/ns#' term='Trigonometry'/><title type='text'>Trigonometry, Part 3</title><content type='html'>&lt;p&gt;I was hoping to publish every Saturday, but this past Saturday I got sidetracked. So without further ado, I bring you the next installment in the trigonometry series of articles.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Each of the six basic trigonometric functions has an inverse function. The inverse functions for sine, cosine, and tangent (arcsine, arcosine, and arctangent, respectively) are already defined natively in PHP. In ASP, only the inverse function for tangent (arctangent) is defined, but we will create an adapter for it to be consistent with the abbreviation in PHP. We also need to define some constants that are already present in PHP but not in ASP.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;Const M_PI = 3.14159265358979323846&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;Const M_PI_2 = M_PI / 2&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function asin(x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;asin = atn(x / sqr(1 - x ^ 2))&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function acos(x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;acos = M_PI_2 - asin(x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function atan(x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;atan = atn(x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;As you can probably guess, the inverse functions for cosecant, secant, and cotangent are arccosecant, arcsecant, and arccotangent.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function acsc(x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;acsc = asin(1 / x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function asec(x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;asec = M_PI_2 - acsc(x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function acot(x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;acot = M_PI_2 - atn(x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;h4&gt;PHP&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;function acsc($x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return asin(1 / $x);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function asec($x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return (M_PI_2 - acsc($x));&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function acot($x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return (M_PI_2 - atan($x));&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;Next time we'll do something different for a change. I promise.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-3646802604854035220?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/3646802604854035220/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=3646802604854035220' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/3646802604854035220'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/3646802604854035220'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2008/02/trigonometry-part-3.html' title='Trigonometry, Part 3'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-1339722714819701555</id><published>2008-02-09T08:55:00.000-08:00</published><updated>2008-02-09T09:48:08.522-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='Math'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><category scheme='http://www.blogger.com/atom/ns#' term='Trigonometry'/><title type='text'>Trigonometry, Part 2</title><content type='html'>&lt;p&gt;As promised, this week we're building some special trigonometry functions using the functions we wrote last week: versed sine (or versine), coversed sine (or coversine), haversed sine (or haversine), hacoversed sine (or hacoversine), exsecant, and excosecant. Actually, to be honest, only two of those build on the functions from last week.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol class="code"&gt;&lt;li&gt;&lt;code&gt;function versin(x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;versin = 1 - cos(x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function coversin(x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;coversin = 1 - sin(x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function haversin(x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;haversin = versin(x) / 2&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function hacoversin(x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hacoversin = coversin(x) / 2&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function exsec(x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exsec = sec(x) - 1&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function excsc(x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;excsc = csc(x) - 1&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;h4&gt;PHP&lt;/h4&gt;&lt;ol class="code"&gt;&lt;li&gt;&lt;code&gt;function versin($x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return (1 - cos($x));&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function coversin($x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return (1 - sin($x));&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function haversin($x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return (versin($x) / 2);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function hacoversin($x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return (coversin($x) / 2);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function exsec($x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return (sec($x) - 1);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function excsc($x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return (csc($x) - 1);&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;Next week, the fun continues with inverse trigonometric functions.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-1339722714819701555?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/1339722714819701555/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=1339722714819701555' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/1339722714819701555'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/1339722714819701555'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2008/02/trigonometry-part-2.html' title='Trigonometry, Part 2'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-2950727907197103492</id><published>2008-02-02T21:33:00.000-08:00</published><updated>2008-02-09T09:20:01.841-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='Math'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><category scheme='http://www.blogger.com/atom/ns#' term='Trigonometry'/><title type='text'>Trigonometry, Part 1</title><content type='html'>&lt;p&gt;Both ASP and PHP contain three basic trigonometry functions: sin(), cos(), and tan(). You may remember from school that there are three more basic trigonometry functions: cosecant, secant, and cotangent. It might be handy to have some functions for these too.&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;ASP&lt;/h4&gt;&lt;ol class="code"&gt;&lt;li&gt;&lt;code&gt;function csc(x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;csc = 1 / sin(x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function sec(x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sec = 1 / cos(x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function cot(x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cot = 1 / tan(x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;end function&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;h4&gt;PHP&lt;/h4&gt;&lt;ol class="code"&gt;&lt;li&gt;&lt;code&gt;function csc($x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return (1 / sin($x));&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function sec($x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return (1 / cos($x));&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;function cot($x)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;{&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return (1 / tan($x));&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;}&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;Next week we'll build off some of these basic functions to make some special functions.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-2950727907197103492?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/2950727907197103492/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=2950727907197103492' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/2950727907197103492'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/2950727907197103492'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2008/02/trigonometry-part-1.html' title='Trigonometry, Part 1'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-399914423284504036.post-1839625729867114829</id><published>2008-01-29T20:10:00.000-08:00</published><updated>2008-01-29T20:32:43.024-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><title type='text'>A brief introduction</title><content type='html'>I thought it would be appropriate in my first post to talk a little bit about myself and why I started this blog. My name is Scott, and I used to be a web developer. I still dabble in code for fun, but professionally I've transitioned to the hardware side of things.&lt;br /&gt;&lt;br /&gt;Sad to say, most of my experience has been with ASP, but I am in the process of learning PHP. There are a lot of things in PHP that are missing in ASP, and in some future posts we will bridge this gap a little bit. As I'm learning PHP, there are some things from ASP that I'm finding to be more difficult. Perhaps some reusable code can help to bridge that gap as well.&lt;br /&gt;&lt;br /&gt;When I was working on my post-secondary education, the instructors in my programming classes often talked about how we would be writing lots of reusable code over our careers, but they never really offered any practical examples. It took a few years, but eventually I found myself needing to do certain things over and over in different places.&lt;br /&gt;&lt;br /&gt;There seems to be a lack of high-quality reusable code available on the Internet, so I thought I would do my part to help change that. My goal is to provide working, practical examples that you can take and use in your own work, even commercially. It's my way of giving back a little bit for all the great blog posts that I learned from.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/399914423284504036-1839625729867114829?l=reusablecode.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://reusablecode.blogspot.com/feeds/1839625729867114829/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=399914423284504036&amp;postID=1839625729867114829' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/1839625729867114829'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/399914423284504036/posts/default/1839625729867114829'/><link rel='alternate' type='text/html' href='http://reusablecode.blogspot.com/2008/01/brief-introduction.html' title='A brief introduction'/><author><name>Scott</name><uri>http://www.blogger.com/profile/00069741645360718046</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
