<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Dan Grossman &#187; web applications</title>
	<atom:link href="http://www.dangrossman.info/tag/web-applications/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.dangrossman.info</link>
	<description></description>
	<lastBuildDate>Thu, 19 Aug 2010 20:19:09 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Handling UTF-8 in JavaScript, PHP, and Non-UTF8 Databases</title>
		<link>http://www.dangrossman.info/2007/05/25/handling-utf-8-in-javascript-php-and-non-utf8-databases/</link>
		<comments>http://www.dangrossman.info/2007/05/25/handling-utf-8-in-javascript-php-and-non-utf8-databases/#comments</comments>
		<pubDate>Fri, 25 May 2007 06:14:06 +0000</pubDate>
		<dc:creator>Dan</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[ascii]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[interpreter]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[later server]]></category>
		<category><![CDATA[Microsoft Windows]]></category>
		<category><![CDATA[operating system]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Scott Reynen]]></category>
		<category><![CDATA[web application development]]></category>
		<category><![CDATA[web applications]]></category>

		<guid isPermaLink="false">http://www.dangrossman.info/2007/05/25/handling-utf-8-in-javascript-php-and-non-utf8-databases/</guid>
		<description><![CDATA[Dealing with characters outside the ASCII range on the web is tough. It&#8217;s tough in other environments too, but particularly for web applications since text needs to move through so many places without being mangled &#8212; from user input, through JavaScript, into and out of PHP and string manipulation functions, into and out of databases. [...]]]></description>
			<content:encoded><![CDATA[<p>Dealing with characters outside the ASCII range on the web is tough. It&#8217;s tough in other environments too, but particularly for web applications since text needs to move through so many places without being mangled &mdash; from user input, through JavaScript, into and out of PHP and string manipulation functions, into and out of databases. If you&#8217;re not careful, the text you start with isn&#8217;t what you&#8217;ll end up with after you&#8217;re done handling it. That was the case with <a href="http://www.w3counter.com">W3Counter</a> for a long time, but not any longer. I&#8217;ll tell you how.<span id="more-121"></span></p>
<p>Unicode is the preferred method of representing text outside the ASCII range, which includes text from virtually all non-English languages. Unicode maps characters to integers, and includes a large range of characters, many more than Windows-1252 or ISO-8859-1, the most common character sets used for English documents. Luckily there&#8217;s another character set, UTF-8, which can represent Unicode and has wide operating system and browser support. </p>
<h2>Handling UTF-8 in HTML</h2>
<p>The first step in capturing and displaying non-English text is to deliver your webpages with the UTF-8 encoding. This tells the browser to interpret the text of the webpage as UTF-8 sequences, allowing it to display characters UTF-8 can encode that other character sets can&#8217;t. There are two places your page tells the browser what encoding to use &mdash; the Content-Type HTTP header, and the Content-Type meta tag.</p>
<p>On an Apache 1.3.12 or later server, you can set what content-type header will be sent by default with the AddCharset, AddType, or AddDefaultCharset directives. <a href="http://www.w3.org/International/questions/qa-htaccess-charset">These can be set in a .htaccess file</a> if you&#8217;re on shared hosting and don&#8217;t have access to the server&#8217;s main configuration file. You can also specify the character set in a meta tag:</p>
<blockquote><p>&lt;meta http-equiv=&#8221;Content-Type&#8221; content=&#8221;text/html; charset=utf-8&#8243; /&gt;</p></blockquote>
<p>If you&#8217;re using IIS, you can find the content-type setting for each file type under the &#8220;Headers&#8221; menu in the properties of your web site.</p>
<h2>Handling UTF-8 in JavaScript</h2>
<p>JavaScript internally works with all text in Unicode, so it&#8217;s going to handle UTF-8 encoded text properly without any extra care. However, in the context of web application development, JavaScript is often used to pass off data to server-side scripts. Whether it&#8217;s done through rendering HTML (such as constructing an iframe URL) or through AJAX calls, you may need to send text as a parameter in a URL&#8217;s query string. </p>
<p>You&#8217;ll often see escape() used to prepare the string for use in a URL; it escapes characters like the ampersand that would otherwise result in a malformed URL. However, escape() doesn&#8217;t handle characters outside the ASCII range correctly, so the receiving script won&#8217;t be able to interpret them. You simply can&#8217;t use escape() on Unicode text. </p>
<p>Luckily, all recent browsers support two new JavaScript functions, encodeURIComponent() and encodeURI(). These functions are safe for UTF-8 text, encoding them with the proper escape sequence, as well as everything escape() did to make sure the text is usable in a URL. The encodeURI() function encodes entire URIs &#8212; so it leaves characters such as <u> <img src='http://www.dangrossman.info/wp-includes/images/smilies/icon_confused.gif' alt=':?' class='wp-smiley' /> &amp;</u> intact. encodeURIComponent() encodes strings to be individual parameters of a URI, so it encodes all characters except <u>~!*()&#8217;</u>.</p>
<p>In short, if you&#8217;re using escape(), use encodeURIComponent() instead. If you&#8217;re worried about breaking compatibility with very old browsers, you can test for the existence of the function before using it:</p>
<blockquote><p>if (encodeURIComponent) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;string = encodeURIComponent(string);<br />
} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;string = escape(string);<br />
}</p></blockquote>
<h2>Handling UTF-8 in PHP</h2>
<p>Internally, PHP uses ISO-8859-1/Latin-1 encoding. This character set is much smaller and incompatible with Unicode, which makes handling UTF-8 text difficult. Use of most string functions in PHP will result in the interpreter handling the text as Latin-1, and your output looking like garbled junk. PHP provides a <a href="http://us2.php.net/mbstring">multibyte string function library</a> if your host has compiled it into their PHP build, although it&#8217;s sometimes difficult to use and doesn&#8217;t provide equivalents to all the string functions PHP normally provides. </p>
<p>PHP handles integers just fine, and Unicode is just a mapping of characters to integers. We can take advantage of that, <a href="http://www.randomchaos.com/documents/?source=php_and_unicode">using some handy functions Scott Reynen has written</a>, to deal with the incoming UTF-8 text. He provides several functions that work well together, allowing you to convert strings to Unicode, convert Unicode to HTML entities for display on a webpage, and do simple string manipulation.</p>
<h2>Storing UTF-8 in Non-UTF-8 Databases</h2>
<p>The beauty of Scott&#8217;s unicode_to_entities_preserving_ascii() function is that it turns UTF8-encoded text into a string that is represented entirely with ASCII characters. All of the chracters outside the ASCII range are turned into their HTML escape sequences, like <b>&amp;#1575;</b>. That means you don&#8217;t need your database tables to be set to the UTF-8 character set, which on shared hosting, you may not have the ability to do, and it&#8217;s not often the default.</p>
<p>This is useful even if your output format isn&#8217;t HTML. Now that you have a way to get the text into the database without losing non-English characters, you can convert it back after you get it out for use elsewhere in your app. PHP has a built-in function which will handle this part for you: <a href="http://us.php.net/html_entity_decode">html_entity_decode</a>.</p>
<blockquote><p>$original_string = html_entity_decode($string, ENT_NOQUOTES, &#8216;UTF-8&#8242;);</p></blockquote>
<p>The caveat, of course, is that you can&#8217;t search or sort on those strings in the database properly. If you need those abilities, you need to ensure the database, the table, the columns, and the connection are all set to the UTF-8 character set, and that you don&#8217;t use any non-multibyte-safe functions on the strings before inserting or after retrieving them.</p>
<p>And there you have it: Handling non-English text in your web applications even in a shared hosting environment. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.dangrossman.info/2007/05/25/handling-utf-8-in-javascript-php-and-non-utf8-databases/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>Dedicated Server Setup Checklist</title>
		<link>http://www.dangrossman.info/2007/03/18/dedicated-server-setup-checklist/</link>
		<comments>http://www.dangrossman.info/2007/03/18/dedicated-server-setup-checklist/#comments</comments>
		<pubDate>Sun, 18 Mar 2007 07:27:34 +0000</pubDate>
		<dc:creator>Dan</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[Apache web server]]></category>
		<category><![CDATA[Brute Force]]></category>
		<category><![CDATA[firewall]]></category>
		<category><![CDATA[installed software]]></category>
		<category><![CDATA[line 
Protocol]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[McAfee Threat Center]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[pico text editor]]></category>
		<category><![CDATA[software updates]]></category>
		<category><![CDATA[text editor]]></category>
		<category><![CDATA[UDP]]></category>
		<category><![CDATA[web applications]]></category>
		<category><![CDATA[web forms]]></category>
		<category><![CDATA[web server]]></category>

		<guid isPermaLink="false">http://www.dangrossman.info/2007/03/18/dedicated-server-setup-checklist/</guid>
		<description><![CDATA[You&#8217;ve outgrown shared hosting and decided to start renting a server of your own. Since you&#8217;re still on a tight budget, you want an unmanaged server, where full responsibility for configuring and managing the server is yours. These are the steps I go through every time I set up a new server for web and [...]]]></description>
			<content:encoded><![CDATA[<p>You&#8217;ve outgrown shared hosting and decided to start renting a server of your own. Since you&#8217;re still on a tight budget, you want an unmanaged server, where full responsibility for configuring and managing the server is yours. These are the steps I go through every time I set up a new server for web and database hosting. It doesn&#8217;t matter if you choose to use a control panel or not, these are the essential items for securing a Linux server and preparing it to host websites or web applications.<span id="more-82"></span></p>
<ol>
<li>
<b>Create a Non-Root User</b></p>
<p>When your server is provisioned, you&#8217;ll generally only be given an IP address and a root password. That&#8217;s all you need to <a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/">SSH in</A> to the server as the root user for the first time. It&#8217;s bad practice to log in as root for a few reasons &mdash; if you log in as a single user and only &#8220;su&#8221; to root access when needed, you&#8217;re less likely to accidentally damage your own system by deleting an important file or providing the wrong options or path to a command. It&#8217;s also harder for someone to attempt to break into your server by brute force if they can&#8217;t log in directly as root; they&#8217;ll need to find a way in as another user then additionally gain root access.</p>
<p>The first thing you&#8217;ll want to do is create a user for yourself to log in as in the future. In most Linux distributions, that&#8217;s as easy as typing &#8220;useradd [username]&#8221; or &#8220;adduser [username]&#8220;. To set the password for your new user, type &#8220;pass<i></i>wd [username]&#8221; and you&#8217;ll be prompted to supply the new password.
</li>
<li><b>Disable Root Logins Over SSH</b>
<p>Now that you have a second user account, reconnect to your server as that user. Now you can use &#8220;su&#8221; to gain root access again and edit the SSH configuration file. To do so with the pico text editor, type &#8220;pico /etc/ssh/sshd_config&#8221;. You&#8217;re going to make two changes:</p>
<p>Find the line <i>Protocol 2, 1</i>, uncomment it, and change it to <i>Protocol 2</i>. Find the line <i>PermitRootLogin yes</i>, uncomment it, and change it to <i>PermitRootLogin no</i>.</p>
<p>Save the file (CTRL+X, Y) and quit your text editor. Now restart the SSH service (/etc/rc.d/init.d/sshd restart) and it&#8217;s no longer possible to log in as the root user over SSH.
</li>
<li><b>Disable Telnet</b>
<p>Telnet is another way to connect to your server, but unlike SSH, is not encrypted. As it&#8217;s less secure and just another opportunity for someone to attempt to gain access to your server, it&#8217;s best to simply disable the service. To do so, edit the telnet configuration with &#8220;pico /etc/xinetd.d/telnet&#8221;. </p>
<p>Find the line that reads <i>disable = no</i> and change it to <i>disable = yes</i>.</p>
<p>Now, restart the xinetd service with &#8220;/etc/rc.d/init.d/xinetd restart&#8221; and prevent telnet from starting on boot with &#8220;/sbin/chkconfig telnet off&#8221;.
</li>
<li><b>Install APF (Advanced Policy Firewall)</b>
<p>APF is a policy based firewall for Linux. It&#8217;s very simple to install and configure. </p>
<ol>
<li>Download it to your server by issuing &#8220;wget <a href="http://www.rfxnetworks.com/downloads/apf-current.tar.gz">http://www.rfxnetworks.com/downloads/apf-current.tar.gz</a>&#8220;</li>
<li>Extract the file with &#8220;tar -xzf apf-current.tar.gz&#8221;</li>
<li>Enter the directory that was created, for example &#8220;cd apf-0.9.6&#8243;</li>
<li>Install APF with the provided script &#8220;./install.sh&#8221;</li>
<li>Edit the configuration file: &#8220;pico /etc/apf/conf.apf&#8221;
<p>Find the line <i>USE_DS=&#8221;0&#8243;</i> and change it to <i>USE_DS=&#8221;1&#8243;</i> to enable the DShield.org block list. Then you&#8217;ll want to edit the ports APF will allow traffic through on your server by finding and updating the following lines as appropriate:</p>
<p><i># Common ingress (inbound) TCP ports -3000_3500 = passive port range for Pure FTPD<br />
IG_TCP_CPORTS=&#8221;20,21,22,25,26,53,80,110,143,443,8443,2222,123,3306,10000,8767,14534,51234&#8243;</p>
<p># Common ingress (inbound) UDP ports<br />
IG_UDP_CPORTS=&#8221;21,22,53,123,8767,14534,51234&#8243;</p>
<p># Egress filtering [0 = Disabled / 1 = Enabled]<br />
EGF=&#8221;1&#8243;</p>
<p># Common egress (outbound) TCP ports<br />
EG_TCP_CPORTS=&#8221;21,22,25,80,443,8443,43,2222,123,8767,14534,51234&#8243;</p>
<p># Common egress (outbound) UDP ports<br />
EG_UDP_CPORTS=&#8221;20,21,22,53,123,8767,14534,51234&#8243;</i>
</li>
<li>Start up APF to test your settings. &#8220;/usr/local/sbin/apf -s&#8221;</li>
<li>If everything looks right (you&#8217;re still connected, you can still access whatever ports you need to access, etc.) you can edit the configuration file again and change <i>DEVM=&#8221;1&#8243;</i> to <i>DEVM=&#8221;0&#8243;</i> to disable development mode.</li>
<li>Restart APF and set it to start on reboot with &#8220;/sbin/chkconfig &#8211;level 2345 apf on&#8221;</li>
</ol>
</li>
<li><b>Install BFD (Brute Force Protection)</b>
<p>BFD is designed to work alongside APF by scanning your system&#8217;s logs for a large number of failed login attempts, and issuing the command to APF to deny that person&#8217;s IP address from connecting again. This protects you from attempts at &#8220;brute forcing&#8221; access to your system, such as repeatedly trying to log in to common account names using a dictionary of common passwords.</p>
<p>To install BFD, follow the same procedure as above, using the archive at <a href="http://www.rfxnetworks.com/downloads/bfd-current.tar.gz">http://www.rfxnetworks.com/downloads/bfd-current.tar.gz</a>.</p>
<p>The configuration file for BFD is located at /usr/local/bfd/conf.bfd if you want to change any settings, including the ability to have a daily report of failed login attempts e-mailed to you.
</li>
<li><b>Install mod_security</b>
<p>mod_security is a module for the Apache web server that lets you filter out certain requests from being processed. This lets you stop many types of vulnerability exploits on your web server, especially those aimed at sending spam through web forms and issuing commands through known vulnerabilities in some PHP scripts.</p>
<p>The download and installation process is slightly different depending on what version of Apache you&#8217;re running, but it only takes a few minutes to install in most cases. You can download and find documentation at the <a href="http://www.modsecurity.org/">ModSecurity</a> website.</p>
<li><b>Check Services are Up to Date</b>
<p>While you just purchased your server, the software that came with it may already be out of date, and potentially vulnerable to newly discovered exploits. A good place to keep track of high risk vulnerabilities in the wild is the <a href="http://www.mcafee.com/us/threat_center/default.asp">McAfee Threat Center</a>. </p>
<p>Many Linux distributions come with a program such as yum or up2date which you can use to check for updates to installed software on your system automatically. Make use of them on a regular basis and check with the websites of the service creators for updates and patches.
</li>
<li><b>Tune Apache and MySQL</b>
<p>For most people, Apache and MySQL will work relatively well out of the box. If you intend to put considerable load on the server, it&#8217;s worth doing a little tuning before you go live. There&#8217;s documentation for tuning the settings of both <a href="http://httpd.apache.org/docs/2.0/misc/perf-tuning.html">apache</a> and <a href="http://dev.mysql.com/doc/refman/4.1/en/server-parameters.html">mysql</a> on their websites, and an excellent blog at <a href="http://www.mysqlperformanceblog.com/">mysqlperformanceblog.com</a>.</p>
<p>If you&#8217;re going to be running PHP applications, a byte code cache such as <a href="http://us3.php.net/apc">APC</a> can significantly boost performance as well.</li>
</ol>
<p>Follow this checklist to get up and running, ready to host your websites. Remember that managing a server is an ongoing process. You need to keep up with software updates, vulnerabilities, and performance bottlenecks on a regular basis to keep things running smoothly.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dangrossman.info/2007/03/18/dedicated-server-setup-checklist/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Got the Job: Microsoft</title>
		<link>http://www.dangrossman.info/2007/01/22/got-the-job-microsoft/</link>
		<comments>http://www.dangrossman.info/2007/01/22/got-the-job-microsoft/#comments</comments>
		<pubDate>Tue, 23 Jan 2007 00:00:07 +0000</pubDate>
		<dc:creator>Dan</dc:creator>
				<category><![CDATA[Personal]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Microsoft Windows]]></category>
		<category><![CDATA[web applications]]></category>

		<guid isPermaLink="false">http://www.dangrossman.info/2007/01/22/got-the-job-microsoft/</guid>
		<description><![CDATA[I just got a voice mail and e-mail from one of the Microsoft recruiters I interviewed with last week letting me know I have a job. They&#8217;re hiring me as an Application Developer. I&#8217;ll be writing both Windows and web applications with C#/ASP.NET and SQL server. This is great news. Now I need to buy [...]]]></description>
			<content:encoded><![CDATA[<p>I just got a voice mail and e-mail from one of the Microsoft recruiters I interviewed with last week letting me know I have a job. They&#8217;re hiring me as an Application Developer. I&#8217;ll be writing both Windows and web applications with C#/ASP.NET and SQL server. <span id="more-70"></span></p>
<p>This is great news. Now I need to buy a C# book.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dangrossman.info/2007/01/22/got-the-job-microsoft/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Stumbling Across the Web #3</title>
		<link>http://www.dangrossman.info/2007/01/21/stumbling-across-the-web-3/</link>
		<comments>http://www.dangrossman.info/2007/01/21/stumbling-across-the-web-3/#comments</comments>
		<pubDate>Mon, 22 Jan 2007 04:06:49 +0000</pubDate>
		<dc:creator>Dan</dc:creator>
				<category><![CDATA[Stumbling]]></category>
		<category><![CDATA[Another site]]></category>
		<category><![CDATA[DOM]]></category>
		<category><![CDATA[DOM inspector]]></category>
		<category><![CDATA[Forum software]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[search engine]]></category>
		<category><![CDATA[search engine optimization]]></category>
		<category><![CDATA[software life cycles]]></category>
		<category><![CDATA[web applications]]></category>
		<category><![CDATA[Web Developer]]></category>
		<category><![CDATA[web service]]></category>

		<guid isPermaLink="false">http://www.dangrossman.info/2007/01/21/stumbling-across-the-web-3/</guid>
		<description><![CDATA[Agile processes, are they killing our children? A cynically comical look at how software life cycles are really done.. among other things. Thanks to dagfinn at SitePoint for that link. Using Mozilla in testing and debugging web sites A guide to all the tools Mozilla makes available for debugging websites, especially useful for debugging web [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://codecraft.info/index.php/archives/70/">Agile processes, are they killing our children?</a><br />
A cynically comical look at how software life cycles are really done.. among other things. Thanks to <a href="http://www.sitepoint.com/forums/member.php?u=38890">dagfinn</a> at SitePoint for that link.<span id="more-69"></span></p>
<p><a href="http://gemal.dk/mozilla/development.html">Using Mozilla in testing and debugging web sites</a><br />
A guide to all the tools Mozilla makes available for debugging websites, especially useful for debugging web applications and complicated JavaScript code. From the DOM inspector to JavaScript debugger, you&#8217;ll probably find something you didn&#8217;t know existed. </p>
<p><a href="http://bbpress.org/">bbPress</a><br />
Forum software from the makers of WordPress. Having explored the code base a bit when writing my first plugin, I can say these guys practice good coding standards, and extending their stuff is straightforward. A whole different world from the hole-riddled mess called phpBB most sites use. Thanks <a href="http://life.mysiteonline.org/">Brendon</a> for the link.</p>
<p><a href="http://amberjack.org/">Amberjack</a><br />
Another site pointed out by Brendon, Amberjack lets you create website &#8220;tours&#8221; with just JavaScript. It overlays information about webpages over the actual webpage along with navigation buttons to move page to page. A good way to show off features of a web service or product you&#8217;re trying to sell.</p>
<p><a href="http://www.devlisting.com/">The Web Developer&#8217;s List of Resources</a><br />
While not the most visually appealing site, I found a couple useful sites from the list, which is editable by the site users by &#8220;pinning&#8221; or &#8220;unpinning&#8221; links you like or don&#8217;t like.</p>
<p><a href="http://www.iwebtool.com/tools/">iWebTools</a><br />
A collection of extremely useful tools for search engine optimization. I always use their PageRank checker when an update is going on since it checks two dozen different servers at the same time.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dangrossman.info/2007/01/21/stumbling-across-the-web-3/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Stumbling Across the Web #2</title>
		<link>http://www.dangrossman.info/2007/01/14/stumbling-across-the-web-2/</link>
		<comments>http://www.dangrossman.info/2007/01/14/stumbling-across-the-web-2/#comments</comments>
		<pubDate>Mon, 15 Jan 2007 03:44:59 +0000</pubDate>
		<dc:creator>Dan</dc:creator>
				<category><![CDATA[Stumbling]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[Internet Explorer]]></category>
		<category><![CDATA[personalized homepage services]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Pixel]]></category>
		<category><![CDATA[software documentation]]></category>
		<category><![CDATA[viral marketing]]></category>
		<category><![CDATA[web applications]]></category>
		<category><![CDATA[Web Client Class]]></category>
		<category><![CDATA[Web Developer Toolbar]]></category>
		<category><![CDATA[web stats]]></category>
		<category><![CDATA[YouTube]]></category>

		<guid isPermaLink="false">http://www.dangrossman.info/2007/01/14/stumbling-across-the-web-2/</guid>
		<description><![CDATA[Where the Hell is Matt? Another YouTube viral marketing video. Did you notice the Stride gum logo appear several times? Would you have noticed it if I didn&#8217;t mention it? PHP UTF-8 Cheatsheet Writing web applications that deal with multiple languages is a messy process. You can never be sure what encoding is coming in, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.youtube.com/watch?v=bNF_P281Uu4&#038;eurl=">Where the Hell is Matt?</a><br />
Another YouTube viral marketing video. Did you notice the Stride gum logo appear several times? Would you have noticed it if I didn&#8217;t mention it?<span id="more-63"></span></p>
<p><a href="http://www.nicknettleton.com/zine/php/php-utf-8-cheatsheet">PHP UTF-8 Cheatsheet</a><br />
Writing web applications that deal with multiple languages is a messy process. You can never be sure what encoding is coming in, but you can make a decent attempt at it with UTF-8. This cheatsheet shows you what&#8217;s involved in handling UTF-8 data in PHP.</p>
<p><a href="http://snoopy.sourceforge.net/">Snoopy: The Web Client Class for PHP</a><br />
One of my favorite PHP classes. I don&#8217;t use it much anymore, but I used to; it makes grabbing webpages, stripping them of HTML, retrieving all the links on pages, submitting forms, sending and receiving cookies, and everything else a browser would do easy in PHP.</p>
<p><a href="http://www.netvibes.com">Netvibes</a><br />
My favorite among all the personalized homepage services. It&#8217;s quick and responsive even on older computers, I&#8217;ve never encountered a bug, and you can make virtually anything into a Netvibes module if there isn&#8217;t already one made. I use it to organize my RSS feeds, my Google calendar, check the weather and check my web stats (RSS feeds from W3Counter).</p>
<p><a href="http://anybrowser.com/ScreenSizeTest.html">AnyBrowser Screen Size Test</a><br />
A simple tool which opens a URL in a specific sized browser window. The Web Developer Toolbar for Firefox handles resizing for me, but I still use this to test pages at 800&#215;600 in Internet Explorer, as I have been for almost 7 years now.</p>
<p><a href="http://web.archive.org/">Archive.org</a><br />
Look at previous versions of any webpage going back more than 10 years. Great for checking out a domain you&#8217;re interested in buying or advertising on. Also great for verifying you don&#8217;t overestimate how many years you&#8217;ve been using some site (like AnyBrowser).</p>
<p><a href="http://www.example.com">Example.com</a><br />
Mysite.com and yoursite.com get far too many free incoming links from casual forum posts and software documentation. When you&#8217;re writing instructions telling someone to provide their website address, use example.com, example.net or example.org as your example. That&#8217;s what they&#8217;re specifically reserved for.</p>
<p><a href="http://csstype.com/">CSSTYPE v2</a><br />
Pixel perfect text styles for your website. Change the appearance of the text with the selection and input fields, see the results instantly, and click the CSS link to grab the styles for your own site.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dangrossman.info/2007/01/14/stumbling-across-the-web-2/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Stumbling Across the Web #1</title>
		<link>http://www.dangrossman.info/2007/01/07/weekly-links-010707/</link>
		<comments>http://www.dangrossman.info/2007/01/07/weekly-links-010707/#comments</comments>
		<pubDate>Mon, 08 Jan 2007 02:31:03 +0000</pubDate>
		<dc:creator>Dan</dc:creator>
				<category><![CDATA[Stumbling]]></category>
		<category><![CDATA[Bill Gates]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[set 150]]></category>
		<category><![CDATA[Super Bowl]]></category>
		<category><![CDATA[text advertising]]></category>
		<category><![CDATA[web applications]]></category>
		<category><![CDATA[web design inspiration]]></category>
		<category><![CDATA[YouTube]]></category>

		<guid isPermaLink="false">http://www.dangrossman.info/2007/01/07/17-weekly-links/</guid>
		<description><![CDATA[I often run across websites that provide something useful or interesting; a small tutorial, some inspiration, a useful tool. Not everything warrants a permanent listing in my links, nor do I want to clutter my already unorganized browser bookmarks, so I&#8217;ll share them here each week. Maybe you&#8217;ll find some of these sites useful as [...]]]></description>
			<content:encoded><![CDATA[<p>I often run across websites that provide something useful or interesting; a small tutorial, some inspiration, a useful tool. Not everything warrants a permanent listing in <a href="http://www.dangrossman.info/links">my links</a>, nor do I want to clutter my already unorganized browser bookmarks, so I&#8217;ll share them here each week. Maybe you&#8217;ll find some of these sites useful as well. <span id="more-50"></span></p>
<p><a href="http://www.askthecssguy.com/2006/12/hyperlink_cues_with_favicons.html">Hyperlink Cues with Favicons</a><br />
CSS and JavaScript which automatically displays the favicon icon of each website a page links to next to that link.</p>
<p><a href="http://www.programmingbooks.org">Programming Books</a><br />
A new, user-ranked directory devoted entirely to programming books. Most of the <a href="http://www.dangrossman.info/links">books I&#8217;ve read</a> are recommended there, as well as quite a few that I&#8217;d like to read this year.</p>
<p><a href="http://withoutane.com/rants/2007/when-you-read-code">When you read code, imagine typing it by hand.</a><br />
Tips for better understanding others&#8217; code, especially when it&#8217;s in an unfamiliar language.</p>
<p><a href="http://clickbrain.com/?q=node/68">YouTube is Better Than the Superbowl</a><br />
A 75-second film Dove released at no cost on YouTube that brought a bigger traffic spike than their Super Bowl commercial.</p>
<p><a href="http://getvanilla.com/">Vanilla</a><br />
A relatively new open-source PHP message board package I absolutely love. It&#8217;s well written, extensible through plugins, actively maintained, and devoid of unnecessary features that could be added as needed for individual boards. </p>
<p><a href="http://www.designsnack.com/">Design Snack</a><br />
&#8220;Digg&#8221; for web design inspiration. A website gallery which uses user votes to decide what gets featured on the homepage.</p>
<p><a href="http://adclustr.com/">adClustr</a><br />
A site dedicated to helping you blend text advertising into your website design. CSS snippets and images to help style text ads from AdSense, YPN, and Text-LinkAds.</p>
<p><a href="http://sweetie.sublink.ca/">Sweetie</a><br />
A set of 150 icons for use in web applications. Free for commercial use and provided in PSD and PNG formats.</p>
<p>Feel free to share anything interesting you&#8217;ve found this week in the comments; if I do too maybe it&#8217;ll end up in my post next week. I&#8217;m off to watch the live webcast of Bill Gates giving the keynote at CES.</p>
<p>##NOLIGHTBOX##</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dangrossman.info/2007/01/07/weekly-links-010707/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
