<?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>American Butifarra &#187; How-To</title> <atom:link href="http://claude.betancourt.us/topic/how-to/feed/" rel="self" type="application/rss+xml" /><link>http://claude.betancourt.us</link> <description>Claude Betancourt&#039;s Personal Blog</description> <lastBuildDate>Fri, 16 Dec 2011 02:43:25 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=3.3.1</generator> <item><title>Stop &#8216;Apache Killer&#8217; in its tracks</title><link>http://claude.betancourt.us/stop-apache-killer-in-its-tracks/</link> <comments>http://claude.betancourt.us/stop-apache-killer-in-its-tracks/#comments</comments> <pubDate>Thu, 25 Aug 2011 03:47:44 +0000</pubDate> <dc:creator>Claude</dc:creator> <category><![CDATA[How-To]]></category> <category><![CDATA[Platform]]></category> <category><![CDATA[Security]]></category> <category><![CDATA[Apache]]></category> <category><![CDATA[Rewrite]]></category><guid isPermaLink="false">http://claude.betancourt.us/?p=861</guid> <description><![CDATA[Protect your Apache server from the latest vulnerability exploit with a simple rule. <a href="http://claude.betancourt.us/stop-apache-killer-in-its-tracks/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>As you may have heard, a new Apache attack tool was released on Friday. The tool, named Apache Killer, is able to create a denial-of-service attack by overloading the web server with partial requests for content. As the web server attempts to fulfill the requests it begins to run out of and memory and it crashes. The problem is exacerbated when larger files are requested (PDFs, zips, etc.) as the server must fulfill the entire request while it attempts to deliver just a portion of it.</p><h3>Testing &#8216;Apache Killer&#8217;</h3><p>I ran the tool to attack this server as well as my employer&#8217;s load balanced array of servers. It is clear that only those servers running an older version of Apache (i.e. 1.3) and those not protected by a firewall are at risk.</p><p>My underpowered virtual private server crashed just a few seconds after the attack began. The tool revealed that my employer&#8217;s web sites did not appear to be vulnerable.</p><h3>Is there a solution?</h3><p>While a solution from Apache.org has not been published, some of the contributors have identified the issue and are working on a patch. In the meantime, you can add the following rule to your virtual site definitions, if you own your sever, or <code>.htaccess</code> file if you&#8217;re in a shared-hosting environment.</p><pre class="brush: plain; title: ; notranslate">
&lt;IfModule mod_rewrite.c&gt;
RewriteEngine On
RewriteCond %{REQUEST_METHOD} ^(HEAD|GET) [NC]
RewriteCond %{HTTP:Range} ([0-9]*-[0-9]*)(\s*,\s*[0-9]*-[0-9]*)+
RewriteRule .* - [F]
&lt;/IfModule&gt;
</pre><p>The preceding rule blocks &#8220;<a href="http://seclists.org/fulldisclosure/2011/Aug/241">get and head requests with multiple ranges in the Range HTTP header</a>.&#8221;</p><p>After applying this rule, feel free to attempt to kill your server, it will not crash. You should inspect your traffic logs to verify the incoming traffic is denied access with an HTTP status of 403, or forbidden.</p><p>Dirk-Willem van Gulik from <a href="http://mail-archives.apache.org/mod_mbox/httpd-announce/201108.mbox/%3C20110824161640.122D387DD@minotaur.apache.org%3E">Apache published this workaround</a> for versions 2.0 and 2.2:</p><pre class="brush: plain; title: ; notranslate">
&lt;IfModule mod_setenvif.c&gt;
# Drop the Range header when more than 5 ranges.
# CVE-2011-3192
SetEnvIf Range (,.*?){5,} bad-range=1
RequestHeader unset Range env=bad-range

# optional logging.
CustomLog logs/range-CVE-2011-3192.log common env=bad-range
&lt;/IfModule&gt;
</pre>]]></content:encoded> <wfw:commentRss>http://claude.betancourt.us/stop-apache-killer-in-its-tracks/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Clean up XML files in Vim</title><link>http://claude.betancourt.us/clean-up-xml-files-in-vim/</link> <comments>http://claude.betancourt.us/clean-up-xml-files-in-vim/#comments</comments> <pubDate>Tue, 21 Jun 2011 15:10:42 +0000</pubDate> <dc:creator>Claude</dc:creator> <category><![CDATA[How-To]]></category> <category><![CDATA[Tutorials]]></category> <category><![CDATA[Clean-up]]></category> <category><![CDATA[Linux]]></category> <category><![CDATA[Vim]]></category> <category><![CDATA[XML]]></category> <category><![CDATA[xmllint]]></category><guid isPermaLink="false">http://claude.betancourt.us/?p=826</guid> <description><![CDATA[Sometimes we need to clean up XML files before being able to make sense of them. Here is a quick way to get nicely formatted and readable XML files while using Vim. <a href="http://claude.betancourt.us/clean-up-xml-files-in-vim/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>Sometimes we need to clean up XML files before being able to make sense of them. Here is a quick way to get nicely formatted and readable XML files while using <code>Vim</code>.</p><h3>Requirements</h3><p>Make sure <code>xmllint</code> is installed on your machine and it is in your path. It&#8217;s part of <code>libxml</code>.</p><pre class="brush: plain; title: ; notranslate">man xmllint</pre><p>The command above should display the manual for <code>xmllint</code> if the program has been installed. Hit the <code>q</code> key to exit.</p><h3>Create a Custom Function</h3><p>Add the following user defined command to your <code>.vimrc</code> file:</p><pre class="brush: plain; title: ; notranslate">vim ~/.vimrc</pre><pre class="brush: bash; title: ; notranslate">
function! DoCleanXML()
        &quot; save the filetype so we can restore it later
        let l:origft = &amp;ft
        set ft=
        &quot; delete the xml header if it exists. This will
        &quot; permit us to surround the document with fake tags
        &quot; without creating invalid xml.
        1s/&lt;?xml .*?&gt;//e
        &quot; insert fake tags around the entire document.
        &quot; This will permit us to pretty-format excerpts of
        &quot; XML that may contain multiple top-level elements.
        0put ='&lt;CleanXML&gt;'
        $put ='&lt;/CleanXML&gt;'
        silent %!xmllint --format --encode utf-8 -
        &quot; xmllint will insert an &lt;?xml?&gt; header setting its
        &quot; encoding type to utf-8
        &quot; delete the fake tags
        2d
        $d
        &quot; restore the normal indentation
        silent %&lt;
        &quot; back to home
        1
        &quot; restore the filetype
        exe &quot;set ft=&quot; . l:origft
endfunction
command! CleanXML call DoCleanXML()
</pre><p>Set the indent character by adding the following environment variable to your <code>.profile</code> or similar file. In my case I inserted a tab between the double quotes.</p><pre class="brush: plain; title: ; notranslate">export XMLLINT_INDENT=&quot; &quot;</pre><p>Reload your environment</p><pre class="brush: plain; title: ; notranslate">source ~/.profile</pre><h3>How to use it</h3><p>Your custom command, CleanXML, is now available within your Vim editor. To use it, edit an XML file and type the following command to clean up its contents: <code>:CleanXML</code> and hit enter.</p><p class="alert">This was adapted from a solution found on the <a href="http://vim.wikia.com/wiki/Pretty-formatting_XML">Vim Tips Wiki</a></p> ]]></content:encoded> <wfw:commentRss>http://claude.betancourt.us/clean-up-xml-files-in-vim/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Compress JavaScript and CSS as Part of your Build Process</title><link>http://claude.betancourt.us/compress-javascript-and-css-as-part-of-your-build-process/</link> <comments>http://claude.betancourt.us/compress-javascript-and-css-as-part-of-your-build-process/#comments</comments> <pubDate>Mon, 05 Jul 2010 04:56:20 +0000</pubDate> <dc:creator>Claude</dc:creator> <category><![CDATA[How-To]]></category> <category><![CDATA[JavaScript]]></category> <category><![CDATA[Tutorials]]></category> <category><![CDATA[Compression]]></category> <category><![CDATA[Concatenation]]></category> <category><![CDATA[CSS]]></category> <category><![CDATA[Performance]]></category> <category><![CDATA[Web Developement]]></category><guid isPermaLink="false">http://claude.betancourt.us/?p=736</guid> <description><![CDATA[Web page performance is critical to keeping customers and visitors moving along on your site. Slow responses typically result in frustrated users, unhappy customers and worse, abandoned orders. It is important to reduce the number of requests generated by a web page in order to increase its actual and perceived performance. <a href="http://claude.betancourt.us/compress-javascript-and-css-as-part-of-your-build-process/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>Web page performance is critical to keeping customers and visitors moving along on your site. Slow responses typically result in frustrated users, unhappy customers and worse, abandoned orders. It is important to reduce the number of requests generated by a web page in order to increase its actual and perceived performance.</p><p>One critical way is to reduce the number of external files loaded by a page. Another one is to reduce their size through compression. This post aims to take this concept a step further by automating this tedious process using open-source libraries.</p><p><span id="more-736"></span></p><h3>Example</h3><p>This example will accomplish the task by executing the following steps:</p><ol><li>Create a temporary directory, <code>/build</code></li><li>Compress each JS file into <code>{original}-min.js</code> files</li><li>Compress each CSS file into <code>{original}-min.css</code> files</li><li>Concatenate all compressed JS files into <code>/js/complete.js</code></li><li>Concatenate all compressed CSS files into <code>/css/complete.css</code></li></ol><h3>Requirements</h3><ul><li>Make sure <a href="http://ant.apache.org/" alt="Apache Ant" title="Apache Ant">Apache Ant</a> has been installed on your system.</li><li>Check out a copy of the <a href="http://svn.betancourt.us/public/yui-compression-sample/">sample project</a> from my public SVN repository. This project already contains the open-source libraries necessary, <a href="http://yhoo.it/3FXTgK">YUI compressor</a> and <a href="http://bit.ly/avcPrG">YUI compressor Ant task</a>.</li><li>Setup a system variable, <code>COMPRESSOR_HOME</code> that points to the location of the sample project&#8217;s <code>/lib</code> directory.<ul><li>On Windows, right click My Computer and select properties. Then click the &#8220;Environment Variables&#8221; button under the advanced tab. Add a new system variable, <code>COMPRESSOR_HOME</code>, and set its value to your local path, for example: <code>C:\Documents and Settings\username\Desktop\yui-compression-sample\lib</code></li><li>On Mac OSX and Linux, update <code>~/.profile</code> or similar file and add <code>export COMPRESSOR_HOME=~/YourProjectDir/yui-compression-sample/lib</code></li></ul></li></ul><h3>Examine the configuration</h3><p>Take a look at the contents of <code>build.xml</code>. The first portion defines variables and locations of the libraries.</p><pre class="brush: xml; title: ; notranslate">
&lt;!-- tells Ant to refer to your environment vars --&gt;
&lt;property environment=&quot;env&quot; /&gt;

&lt;!-- defines location of libraries --&gt;
&lt;property name=&quot;lib.dir&quot; value=&quot;${env.COMPRESSOR_HOME}&quot; /&gt;

&lt;!-- defines output directory --&gt;
&lt;property name=&quot;build.dir&quot; value=&quot;build&quot; /&gt;

&lt;!-- output files, one for JS one for CSS --&gt;
&lt;property name=&quot;final_js&quot; value=&quot;${basedir}/js/complete.js&quot; /&gt;
&lt;property name=&quot;final_css&quot; value=&quot;${basedir}/css/complete.css&quot; /&gt;

&lt;!-- define nicknames for libraries --&gt;
&lt;property name=&quot;yui-compressor&quot; location=&quot;${lib.dir}/yuicompressor-2.4.2.jar&quot; /&gt;
&lt;property name=&quot;yui-compressor-ant-task&quot; location=&quot;${lib.dir}/yui-compressor-ant-task-0.5.jar&quot; /&gt;

&lt;!-- adds libraries to the classpath --&gt;
&lt;path id=&quot;yui.classpath&quot;&gt;
	&lt;pathelement location=&quot;${yui-compressor}&quot; /&gt;
	&lt;pathelement location=&quot;${yui-compressor-ant-task}&quot; /&gt;
&lt;/path&gt;

&lt;!-- define tasks --&gt;
&lt;taskdef name=&quot;yui-compressor&quot; classname=&quot;net.noha.tools.ant.yuicompressor.tasks.YuiCompressorTask&quot;&gt;
	&lt;classpath refid=&quot;yui.classpath&quot; /&gt;
&lt;/taskdef&gt;
</pre><p>The second portion of <code>build.xml</code> defines the Ant targets to be executed. These tell YUI compressor how the source files are to be processed.</p><pre class="brush: xml; title: ; notranslate">
&lt;!-- targets --&gt;
&lt;target name=&quot;concat&quot;&gt;

	&lt;!-- concatenates all compressed JS files into one --&gt;
	&lt;concat destfile=&quot;${final_js}&quot; force=&quot;true&quot; fixlastline=&quot;true&quot;&gt;
		&lt;fileset dir=&quot;${build.dir}&quot; includes=&quot;**/*.js&quot; /&gt;
		&lt;fileset dir=&quot;${build.dir}&quot; includes=&quot;**/widgets/*.js&quot; /&gt;
	&lt;/concat&gt;

	&lt;!-- concatenates all compressed CSS files into one --&gt;
	&lt;concat destfile=&quot;${final_css}&quot; force=&quot;true&quot; fixlastline=&quot;true&quot;&gt;
		&lt;fileset dir=&quot;${build.dir}&quot; includes=&quot;**/*.css&quot; /&gt;
		&lt;fileset dir=&quot;${build.dir}&quot; includes=&quot;**/flexgrid/*.css&quot; /&gt;
	&lt;/concat&gt;

&lt;/target&gt;

&lt;target name=&quot;compress&quot;&gt;

	&lt;!-- compresses each JavaScript and CSS file --&gt;
	&lt;!-- and saved as {original_name}-min.{extension} --&gt;
	&lt;yui-compressor
		warn=&quot;false&quot;
		munge=&quot;true&quot;
		preserveallsemicolons=&quot;false&quot;
		fromdir=&quot;${basedir}&quot;
		todir=&quot;${build.dir}&quot;
	/&gt;

&lt;/target&gt;

&lt;!-- deletes the temporary directory and all its contents --&gt;
&lt;target name=&quot;clean&quot;&gt;
	&lt;delete dir=&quot;${build.dir}&quot;/&gt;
&lt;/target&gt;

&lt;!-- creates the temporary directory --&gt;
&lt;target name=&quot;start&quot;&gt;
	&lt;mkdir dir=&quot;${build.dir}&quot; /&gt;
&lt;/target&gt;

&lt;target name=&quot;main&quot; depends=&quot;start,compress,concat,clean&quot; /&gt;
</pre><h3>What does this do?</h3><p>If you are new to Ant you are probably wondering why the tasks are defined in reverse order of execution. This is just a personal preference and it does not affect execution.</p><p>The order of execution is controlled by the <code>main</code> task. This is the task Ant runs when a target is not passed to it. The attribute <code>depends</code> tells Ant the order in which the tasks must be executed.</p><h3>Give it a try</h3><p>All you have to do to execute the entire operation is open a command prompt (or a terminal window on OS X), change into the project directory where <code>build.xml</code> lives and type <code>ant</code> and hit <code>Enter</code>. You should see some output that looks like this:</p><pre class="brush: plain; highlight: [19,20,32]; light: true; title: ; notranslate">
claude$ ant
Buildfile: build.xml

start:
     [echo] Building JS-CSS-Compression-and-Concat-Sample with Apache Ant version 1.7.1 compiled on April 8 2010 - System Java 1.6
    [mkdir] Created dir: /Users/claude/Documents/www/yui-compression-sample/build

compress:
[yui-compressor] [53%] global-print.css [920] ---&gt; global-print-min.css [488]
[yui-compressor] [80%] global.css [11895] ---&gt; global-min.css [9564]
[yui-compressor] [79%] style.css [1148] ---&gt; style-min.css [910]
[yui-compressor] [64%] googlemaps-yelp-ext.js [6604] ---&gt; googlemaps-yelp-ext-min.js [4270]
[yui-compressor] [70%] split-filepath.js [814] ---&gt; split-filepath-min.js [576]
[yui-compressor] [73%] ContactForm.js [4711] ---&gt; ContactForm-min.js [3461]
[yui-compressor] [57%] InfoTabs.js [1160] ---&gt; InfoTabs-min.js [669]
[yui-compressor] [55%] InfoWindow.js [1228] ---&gt; InfoWindow-min.js [686]
[yui-compressor] [68%] Intraday.js [9559] ---&gt; Intraday-min.js [6536]
[yui-compressor] [68%] MediaCenter.js [5728] ---&gt; MediaCenter-min.js [3906]
[yui-compressor] [JavaScript] Compressed 7 files to 67% (29KB to 19KB, saving 10KB)
[yui-compressor] [CSS] Compressed 3 files to 78% (13KB to 10KB, saving 3KB)
[yui-compressor] Compressed 10 files to 70% (42KB to 30KB, saving 12KB)

concat:
     [echo] Building /Users/claude/Documents/www/yui-compression-sample/js/complete.js
     [echo] Building /Users/claude/Documents/www/yui-compression-sample/css/complete.css

clean:
   [delete] Deleting directory /Users/claude/Documents/www/yui-compression-sample/build

main:

BUILD SUCCESSFUL
Total time: 1 second
</pre><h3>What Now?</h3><p>Change your HTML code to point to the newly created <code>complete.js</code> and <code>complete.css</code> instead of the individual files. Your page will load and render faster.</p><p>Squeeze even more performance out of your site by implementing other best practices. Get a copy of <a href="http://amzn.to/cueRAt">High Performance Web Sites</a> by Steve Souders and read <a href="http://yhoo.it/bjbsh4">Yahoo&#8217;s rules for exceptional performance</a>.</p><p class="note">Watch <a href="http://www.youtube.com/watch?v=BTHvs3V8DBA#t=90s">Steve Souders&#8217; presentation at Google Tech Talks</a>. Audio problems are fixed 5 minutes in. Skip the first 90 seconds to listen to Steve.</p> ]]></content:encoded> <wfw:commentRss>http://claude.betancourt.us/compress-javascript-and-css-as-part-of-your-build-process/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>ExtJS ComboBox Hidden Field Issues</title><link>http://claude.betancourt.us/extjs-combobox-hidden-field-issues/</link> <comments>http://claude.betancourt.us/extjs-combobox-hidden-field-issues/#comments</comments> <pubDate>Tue, 09 Mar 2010 18:57:26 +0000</pubDate> <dc:creator>Claude</dc:creator> <category><![CDATA[Ext JS]]></category> <category><![CDATA[Framework]]></category> <category><![CDATA[How-To]]></category> <category><![CDATA[JavaScript]]></category> <category><![CDATA[Tutorials]]></category> <category><![CDATA[Ext JS 3]]></category><guid isPermaLink="false">http://claude.betancourt.us/?p=721</guid> <description><![CDATA[Despite looking like a typical select box, Ext.form.ComboBox does not behave exactly as you would expect. It submits the display text instead of the selected option's value. This post provides a solution to this problem. <a href="http://claude.betancourt.us/extjs-combobox-hidden-field-issues/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p class="alert">This post refers to version 3.x of the Ext-JS framework.</p><p>Despite looking like a typical select box, <a href="http://www.extjs.com/deploy/dev/docs/?class=Ext.form.ComboBox"><strong>Ext.form.ComboBox</strong></a> doesn&#8217;t behave exactly as you would expect since it submits the display text instead of the selected option&#8217;s value. The documentation states:</p><blockquote><p>A ComboBox works in a similar manner to a traditional HTML &lt;select&gt; field. The difference is that to submit the valueField, you must specify a hiddenName to create a hidden input field to hold the value of the valueField. The displayField is shown in the text field which is named according to the name.</p></blockquote><pre class="brush: jscript; highlight: [5,6]; title: ; notranslate">
this.add([
	{
		xtype: 'combo',
		name: 'suffix',
		hiddenName: 'suffixId', // post this name
		hiddenValue: 0, // default value
		fieldLabel: 'Suffix',
		mode: 'local',
		store: this.suffixStore,
		valueField: 'key',
		displayField: 'display',
		triggerAction: 'all',
		forceSelection: true,
		allowBlank: true
	}
]);
</pre><p>Adding a <strong>hiddenName</strong> and a default value in <strong>hiddenValue</strong> does the trick, the default value (0) is set in the hidden field until a user chooses a different value. Unfortunately this breaks when the ComboBox is set to allow blanks and the user tabs over the field. When this happens, the hiddenValue is set to a null string and the user is never prompted to select a value.</p><p>Upon form submission, the hiddenField (<strong>suffixId</strong>) will be set to neither the default nor a valid value.</p><p>One solution is to listen for the <strong>focus</strong> and <strong>blur</strong> events to reset the value of the hidden field when it has been set to a null string.</p><pre class="brush: jscript; highlight: [15,16,17,18,19]; title: ; notranslate">
this.add([
	{
		xtype: 'combo',
		name: 'suffix',
		hiddenName: 'suffixId',
		hiddenValue: 0,
		fieldLabel: 'Suffix',
		mode: 'local',
		store: this.suffixStore,
		valueField: 'key',
		displayField: 'display',
		triggerAction: 'all',
		forceSelection: true,
		allowBlank: true,
		listeners: {
			'focus': this.handleSuffixChange,
			'blur': this.handleSuffixChange,
			scope: this
		}
	}
]);

handleSuffixChange: function(field) {
	if (field.value==='') {
		field.hiddenField.value = '0';
	}
}
</pre><p>Upon form submission you will be guaranteed a valid value, which is especially beneficial if you&#8217;re using the form values to populate a server side bean object.</p> ]]></content:encoded> <wfw:commentRss>http://claude.betancourt.us/extjs-combobox-hidden-field-issues/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Is My Mac&#8217;s SuperDrive Dead?</title><link>http://claude.betancourt.us/is-my-macs-superdrive-dead/</link> <comments>http://claude.betancourt.us/is-my-macs-superdrive-dead/#comments</comments> <pubDate>Thu, 03 Dec 2009 03:50:04 +0000</pubDate> <dc:creator>Claude</dc:creator> <category><![CDATA[Hardware]]></category> <category><![CDATA[How-To]]></category> <category><![CDATA[Apple]]></category> <category><![CDATA[Mac]]></category> <category><![CDATA[MacBook Pro]]></category><guid isPermaLink="false">http://claude.betancourt.us/?p=716</guid> <description><![CDATA[For the last couple of weeks I&#8217;ve been unable to burn DVDs on my MacBook Pro. I insert a blank disc whenever the SuperDrive prompts for one, it then checks and checks for about a minute before ejecting the disc. &#8230; <a href="http://claude.betancourt.us/is-my-macs-superdrive-dead/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>For the last couple of weeks I&#8217;ve been unable to burn DVDs on my MacBook Pro. I insert a blank disc whenever the SuperDrive prompts for one, it then checks and checks for about a minute before ejecting the disc. At first I thought this was related to the type of disc I was using, TDK DVD-R 1-16x 4.7GB, but they burned just fine on my wife&#8217;s slightly older iMac.</p><h3>Have you reset your PRAM and NVRAM lately?</h3><p>After a bit of Googling for a fairly recent and verifiable solution I decided to reset the machine&#8217;s parameter random access memory (PRAM) and nonvolatile RAM (NVRAM) as suggested by some folks and Apple&#8217;s <a href="http://support.apple.com/kb/HT1379">technical support site</a>. It works!</p><p>Try this before you declare your SuperDrive dead and go out and buy a new one.</p> ]]></content:encoded> <wfw:commentRss>http://claude.betancourt.us/is-my-macs-superdrive-dead/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Force a URL to Use HTTPS</title><link>http://claude.betancourt.us/how-to-force-a-url-to-use-https/</link> <comments>http://claude.betancourt.us/how-to-force-a-url-to-use-https/#comments</comments> <pubDate>Sat, 28 Feb 2009 03:02:55 +0000</pubDate> <dc:creator>Claude</dc:creator> <category><![CDATA[How-To]]></category> <category><![CDATA[Protocol]]></category> <category><![CDATA[Security]]></category> <category><![CDATA[Apache]]></category> <category><![CDATA[ColdFusion]]></category> <category><![CDATA[IIS]]></category> <category><![CDATA[MachII]]></category> <category><![CDATA[plugin]]></category> <category><![CDATA[Rewrite]]></category><guid isPermaLink="false">http://claude.betancourt.us/?p=385</guid> <description><![CDATA[Site owners sometimes need to make sure secure connections are used. They can do this quickly with this Apache rule. <a href="http://claude.betancourt.us/how-to-force-a-url-to-use-https/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p><span class="drop_cap">T</span>oday I came across some old ColdFusion <span class="amp">&#038;</span> Mach-II (1.0) code where a plugin was used to force HTTPS. I assume the original developer decided to go with this solution because the target environment was Windows and Internet Information Server.</p><p>The task becomes a lot easier under Apache. So I threw away the plugin code and added the following rule to the Apache configuration:</p><pre class="brush: xml; title: ; notranslate">
&lt;directory &quot;/public_html/mysite.com&quot;&gt;
RewriteEngine on
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*) https://%{HTTP_HOST}/$1	[R,L]
&lt;/directory&gt;
</pre><p class="alert">The directive above can be placed inside a <span class="amp">VirtualHost</span> or <span class="amp">Directory</span> directives, but this usually requires access to the Apache server configuration, which is not typically possible in a shared hosting environment &#8212; in that case, the rule can be added to the <span class="amp">.htaccess</span> file.</p><p>Alternatively we could have used the <a href="http://httpd.apache.org/docs/2.2/mod/mod_ssl.html#sslrequiressl">SSLRequireSSL Apache (2.x) directive</a>, but this would only block access to the non HTTPS address. In our case we want to automatically redirect the users instead of displaying an error message.</p> ]]></content:encoded> <wfw:commentRss>http://claude.betancourt.us/how-to-force-a-url-to-use-https/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>iTunes Crashes During Sync Post 2.2.1 Upgrade &#8211; FIX</title><link>http://claude.betancourt.us/itunes-crashes-during-sync-post-221-upgrade-fix/</link> <comments>http://claude.betancourt.us/itunes-crashes-during-sync-post-221-upgrade-fix/#comments</comments> <pubDate>Tue, 03 Feb 2009 06:27:37 +0000</pubDate> <dc:creator>Claude</dc:creator> <category><![CDATA[Hardware]]></category> <category><![CDATA[How-To]]></category> <category><![CDATA[Apple]]></category> <category><![CDATA[Crash]]></category> <category><![CDATA[Firmware]]></category> <category><![CDATA[iPhone]]></category> <category><![CDATA[iPod]]></category> <category><![CDATA[iTunes]]></category> <category><![CDATA[Mac]]></category><guid isPermaLink="false">http://claude.betancourt.us/?p=305</guid> <description><![CDATA[Keep iTunes from crashing after the iPhone/iPod Touch 2.2.1 upgrade. <a href="http://claude.betancourt.us/itunes-crashes-during-sync-post-221-upgrade-fix/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p><img class="aligncenter frame" src="http://cdn.betancourt.us/claude/images/blog/assets/itunes-ipod-sync-2.2.1.gif" /></p><p><span class="drop_cap">I</span>Tunes began crashing on Super Bowl Sunday after I upgraded my iPod Touch to the latest firmware, version 2.2.1 &#8212; Since then I have reinstalled iTunes, did a factory restore of the iPod to no avail.</p><p>A few minutes ago I was looking through the <a href="http://discussions.apple.com/message.jspa?messageID=8929066">Apple discussion groups</a> and came across <a href="http://www.jeffmccord.org/itunes-crashes-when-syncing-iphone-221/">this fix by Jeff McCord</a>. It is a simple one when you think about it:</p><ol><li>Deauthorize your computer</li><li>Authorize it again</li><li>Visit the App Store and &#8220;Buy&#8221; a free app</li><li>Sync up</li></ol><p>I am a happy camper again. All my music, movies, videos and audio books are back!</p> ]]></content:encoded> <wfw:commentRss>http://claude.betancourt.us/itunes-crashes-during-sync-post-221-upgrade-fix/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Build Your First Ext-JS in Under an Hour</title><link>http://claude.betancourt.us/build-your-first-ext-js-in-under-an-hour/</link> <comments>http://claude.betancourt.us/build-your-first-ext-js-in-under-an-hour/#comments</comments> <pubDate>Thu, 09 Oct 2008 19:36:35 +0000</pubDate> <dc:creator>Claude</dc:creator> <category><![CDATA[Ext JS]]></category> <category><![CDATA[Framework]]></category> <category><![CDATA[How-To]]></category> <category><![CDATA[Presentation]]></category> <category><![CDATA[JavaScript]]></category> <category><![CDATA[Library]]></category> <category><![CDATA[Webinar]]></category><guid isPermaLink="false">http://claude.betancourt.us/?p=154</guid> <description><![CDATA[The Visual Ajax User Group is hosting a webinar with Aaron Conran, Sr. Architect Ext-JS on Thursday, October 16th, 2008. Sign up now. <a href="http://claude.betancourt.us/build-your-first-ext-js-in-under-an-hour/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p><span class="drop_cap">T</span>he Visual Ajax User Group is hosting a webinar with Aaron Conran, Sr. Architect Ext-JS on Thursday, October 16th, 2008.</p><p><a href="http://visualajax.blogspot.com/2008/10/learn-about-ext-from-master-hands-on.html">Hands-On Ext is a fast-paced session</a> in which we will build an Ext application in less than an hour. This session demonstrates how to get started using Ext JS and how quickly you can put together a simple application from scratch. Learn how to utilize Ext&#8217;s high-level UI widgets like GridPanel, TabPanel and FormPanel instead of re-inventing the wheel.</p><p>In this session you learn how to:</p><ul><li>Create an application from scratch with Ext JS</li><li>Utilize Ext&#8217;s high-level UI widgets, such as GridPanel, TabPanel and FormPanel.</li></ul><p><a href="https://www1.gotomeeting.com/register/976425294"><strong>Sign up now</strong></a>.</p> ]]></content:encoded> <wfw:commentRss>http://claude.betancourt.us/build-your-first-ext-js-in-under-an-hour/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Creating an Apple Style Menu with Animation</title><link>http://claude.betancourt.us/create-apple-style-top-navigation/</link> <comments>http://claude.betancourt.us/create-apple-style-top-navigation/#comments</comments> <pubDate>Mon, 28 Jul 2008 22:23:29 +0000</pubDate> <dc:creator>Claude</dc:creator> <category><![CDATA[How-To]]></category> <category><![CDATA[Tutorials]]></category> <category><![CDATA[Apple]]></category> <category><![CDATA[CSS]]></category> <category><![CDATA[jQuery]]></category> <category><![CDATA[Photoshop]]></category> <category><![CDATA[Sprites]]></category><guid isPermaLink="false">http://claude.betancourt.us/blog/?p=107</guid> <description><![CDATA[Kriesi Budschedl has posted a very detailed tutorial to help you build your own Apple.com style menu and adds a nice touch by animating it. <a href="http://claude.betancourt.us/create-apple-style-top-navigation/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p><span class="drop_cap">K</span>riesi Budschedl has <a href="http://www.kriesi.at/archives/apple-menu-improved-with-jquery"><b>posted a very detailed tutorial</b></a> to help you build your own Apple.com style menu and adds a nice touch by animating it.</p><p><img class="alignleft frame" src="/images/blog/assets/tutorial-kwicks-home.jpg?2ce803" border="0" /></p><p>To construct the basic menu, Kriesi takes advantage of <a href="http://www.alistapart.com/articles/sprites" title="CSS Sprites: Image Slicing's Kiss of Death">CSS Sprites</a>, a technique to reduce the number of image files necessary to accomplish things like rollovers, without the need to preload the images using JavaScript.</p><p>A single image contains all the navigation menu options in their normal and active states and CSS rules are used to move the appropriate menu option into view. Once the basic menu is working, animation is added by using <a href="http://www.jeremymartin.name/projects.php?project=kwicks">Kwicks for jQuery</a>, a plugin written by Jerry Martin, resulting in the <a href="http://www.kriesi.at/wp-content/extra_data/kwicks_tutorial/kwicks_final.html">final product seen here</a>.</p><p><a href="http://www.kriesi.at/wp-content/extra_data/kwicks_tutorial/kwicks_final.html" title="Final product"><img class="aligncenter" src="/images/blog/assets/tutorial-kwicks-working-menu.png?2ce803" border="0" /></a></p> ]]></content:encoded> <wfw:commentRss>http://claude.betancourt.us/create-apple-style-top-navigation/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Google Maps Component for Ext-JS</title><link>http://claude.betancourt.us/googlemap-extjs/</link> <comments>http://claude.betancourt.us/googlemap-extjs/#comments</comments> <pubDate>Tue, 01 Jul 2008 14:41:25 +0000</pubDate> <dc:creator>Claude</dc:creator> <category><![CDATA[Articles]]></category> <category><![CDATA[Ext JS]]></category> <category><![CDATA[How-To]]></category> <category><![CDATA[Tutorials]]></category> <category><![CDATA[Component]]></category> <category><![CDATA[ext.ux.gmappanel]]></category> <category><![CDATA[gmappanel]]></category> <category><![CDATA[GoogleMaps]]></category> <category><![CDATA[JavaScript]]></category> <category><![CDATA[Library]]></category> <category><![CDATA[Map]]></category> <category><![CDATA[Sencha]]></category><guid isPermaLink="false">http://claude.betancourt.us/blog/?p=75</guid> <description><![CDATA[Shea Frederick has created a user-defined extension to integrate Google Maps with ExtJS. <a href="http://claude.betancourt.us/googlemap-extjs/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>Shea Frederick has created a user-defined extension to <a href="http://extjs.com/blog/2008/07/01/integrating-google-maps-api-with-extjs/">integrate Google Maps with ExtJS</a>.</p><p><strong>UPDATE:</strong>I&#8217;ve created a <a href="http://code.betancourt.us/ext-map/">tutorial that uses the latest version of the extension and Ext-JS</a>.</p><pre class="brush: jscript; title: ; notranslate">
Ext.ns('Sample');
Sample.ExtGMap = function() {

	var el = 'ext-map';

	function _init() {

		new Ext.Panel({
			renderTo: el,
			layout: 'fit',
			height: 300,
			hideLabel: true,
			items: [
		        {
		        	xtype: 'gmappanel',
		        	gmapType: 'map',
		        	zoomLevel: 14,
		            setCenter: {
		        		lat: 40.782686,
		        		lng: -73.96524,
			            marker: {
		        			title: 'Central Park'
			            }
			        }
		        }
			]
		});

	}

	return {
		init: _init
	}

}();
Ext.onReady(Sample.ExtGMap.init, Sample.ExtGMap);
</pre><p>Configuration options:</p><blockquote><p>It’s just as easy to create a Google map window that maps addresses and places markers at their locations (which could just as easily be nested in a layout instead).</p><p>A couple of the primary Google maps handlers and settings are setup as configuration options. For instance, ‘addControl’ allows adding of a standard Google map control (zoom, pan, etc) and the ‘zoomLevel’ sets a default zoom level for the map.</p><p>Geocoding can be used by substituting the lat/long configuration options with a ‘geoCodeAddr’ string.</p><p>The ’setCenter’ configuration allows the default center location of the map to be set, along with a marker. More markers can be added to the map using the ‘markers’ array.</p></blockquote> ]]></content:encoded> <wfw:commentRss>http://claude.betancourt.us/googlemap-extjs/feed/</wfw:commentRss> <slash:comments>14</slash:comments> </item> <item><title>Improving Performance by Combining Scripts and CSS</title><link>http://claude.betancourt.us/improving-performance-by-combining-scripts-and-css/</link> <comments>http://claude.betancourt.us/improving-performance-by-combining-scripts-and-css/#comments</comments> <pubDate>Wed, 09 Apr 2008 13:53:45 +0000</pubDate> <dc:creator>Claude</dc:creator> <category><![CDATA[How-To]]></category> <category><![CDATA[CSS]]></category> <category><![CDATA[JavaScript]]></category><guid isPermaLink="false">http://claude.betancourt.us/blog/?p=128</guid> <description><![CDATA[According to the Yahoo! performance team, the best way to improve your web site&#8217;s performance is to reduce the number of requests for assets such as scripts, style sheets and images. One way to accomplish this is by combining all &#8230; <a href="http://claude.betancourt.us/improving-performance-by-combining-scripts-and-css/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p><span class="drop_cap">A</span>ccording to the <a title="Exceptional Performance" href="http://developer.yahoo.com/performance/"><strong>Yahoo! performance team</strong></a>, the best way to improve your web site&#8217;s performance is to <a title="YSlow Rule #1" href="http://developer.yahoo.com/performance/rules.html#num_http"><strong>reduce the number of requests</strong></a> for assets such as scripts, style sheets and images. One way to accomplish this is by combining all the script files into one and serving only that file in your production environment. The same approach can also be applied to cascading style sheets.</p><p>The guys at <a title="Cozi.com" href="http://www.cozi.com/"><strong>Cozi</strong></a> <a href="http://blogs.cozi.com/tech/2008/04/combining-js-an.html"><strong>have created a server side solution</strong></a> that takes the pain out of combining these files in some sort of intermediary build process. Here is how they go about doing it:</p><blockquote><p class="MsoNormal" style="margin: 0cm 0cm 0pt; line-height: normal;"><span style="font-size: 10pt; font-family: Consolas; color: blue;">&lt;</span><span style="color: #a31515;"><span style="font-size: 10pt; font-family: Consolas;">WebClientCode</span></span><span style="font-size: 10pt; font-family: Consolas; color: blue;">:</span><span style="color: #a31515;"><span style="font-size: 10pt; font-family: Consolas;">CombinerControl</span></span><span style="font-size: 10pt; font-family: Consolas;"> <span style="color: red;">ID</span><span style="color: blue;">=&#8221;CombineScript&#8221;</span> <span style="color: red;">runat</span><span style="color: blue;">=&#8221;server&#8221;&gt;</span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; line-height: normal;"><span style="font-size: 10pt; font-family: Consolas;"><span style="color: blue;">&lt;</span><span style="color: #a31515;">script</span> <span style="color: red;">src</span><span style="color: blue;">=&#8221;script/third-party/jquery.js&#8221;</span> <span style="color: red;">type</span><span style="color: blue;">=&#8221;text/javascript&#8221;&gt;&lt;/</span><span style="color: #a31515;">script</span><span style="color: blue;">&gt;</span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; line-height: normal;"><span style="font-size: 10pt; font-family: Consolas;"><span style="color: blue;">&lt;</span><span style="color: #a31515;">script</span> <span style="color: red;">src</span><span style="color: blue;">=&#8221;script/third-party/sifr.js&#8221;</span> <span style="color: red;">type</span><span style="color: blue;">=&#8221;text/javascript&#8221;&gt;&lt;/</span><span style="color: #a31515;">script</span><span style="color: blue;">&gt;</span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; line-height: normal;"><span style="font-size: 10pt; font-family: Consolas;"><span style="color: blue;">&lt;</span><span style="color: #a31515;">script</span> <span style="color: red;">src</span><span style="color: blue;">=&#8221;script/third-party/soundmanager.js&#8221;</span> <span style="color: red;">type</span><span style="color: blue;">=&#8221;text/javascript&#8221;&gt;&lt;/</span><span style="color: #a31515;">script</span><span style="color: blue;">&gt;</span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; line-height: normal;"><span style="font-size: 10pt; font-family: Consolas;"><span style="color: blue;">&lt;</span><span style="color: #a31515;">script</span> <span style="color: red;">src</span><span style="color: blue;">=&#8221;script/cozi_date.js&#8221;</span> <span style="color: red;">type</span><span style="color: blue;">=&#8221;text/javascript&#8221;&gt;&lt;/</span><span style="color: #a31515;">script</span><span style="color: blue;">&gt;</span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; line-height: normal;"><span style="font-size: 10pt; font-family: Consolas; color: blue;">&lt;/</span><span style="color: #a31515;"><span style="font-size: 10pt; font-family: Consolas;">WebClientCode</span></span><span style="font-size: 10pt; font-family: Consolas; color: blue;">:</span><span style="color: #a31515;"><span style="font-size: 10pt; font-family: Consolas;">CombinerControl</span></span><span style="font-size: 10pt; font-family: Consolas; color: blue;">&gt;</span></p><p>The combiner outputs a reference to an Http Handler which will serve the combined file:</p><p class="MsoNormal" style="margin: 0cm 0cm 10pt;"><span style="font-size: 10pt; line-height: 115%; font-family: Consolas; color: blue;">&lt;</span><span style="color: #a31515;"><span style="font-size: 10pt; line-height: 115%; font-family: Consolas;">script</span></span><span style="font-size: 10pt; line-height: 115%; font-family: Consolas;"> <span style="color: red;">src=<span style="font-size: 10pt; font-family: Consolas; color: blue;">&#8220;../Combiner/Combiner.ashx?ext=js ?<br /> &amp;ver=59169b00 ?<br /> &amp;type=text%2fjavascript ?<br /> &amp;files=!script&#8217;third-party*jquery*sifr*soundmanager*!script*cozi_date*&#8221; ?<br /> </span></span><span style="color: red;">type</span><span style="color: blue;">=&#8221;text/javascript&#8221;&gt;&lt;/</span><span style="color: #a31515;">script</span><span style="color: blue;">&gt;</span></span></p></blockquote><p>Although they do not provide the source code for the ASP.NET control, they do point to an old article on Vitamin, <a href="http://www.thinkvitamin.com/features/webapps/serving-javascript-fast"><strong>Serving JavaScript Fast</strong></a>, that served as their inspiration.</p><p>Personally I prefer combining the files before they get pushed to production in a build process, as doing it while the client may introduce unexpected delays depending on the traffic load a any given time.</p><p>What do you do to improve performance on your web sites?</p> ]]></content:encoded> <wfw:commentRss>http://claude.betancourt.us/improving-performance-by-combining-scripts-and-css/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>To Love One&#8217;s Craft: Fun with grep and RegEx&#8230;</title><link>http://claude.betancourt.us/to-love-ones-craft-fun-with-grep-and-regex/</link> <comments>http://claude.betancourt.us/to-love-ones-craft-fun-with-grep-and-regex/#comments</comments> <pubDate>Fri, 28 Mar 2008 00:35:22 +0000</pubDate> <dc:creator>Claude</dc:creator> <category><![CDATA[How-To]]></category> <category><![CDATA[Ext]]></category> <category><![CDATA[JavaScript]]></category><guid isPermaLink="false">http://claude.betancourt.us/blog/2008/03/27/to-love-ones-craft-fun-with-grep-and-regex/</guid> <description><![CDATA[I just read an interesting post by Dave Nelson (spugbrap) in which he details all the fun he had writing a script to search through Ext JS source code and open it with Textpad. So, I checked the TextPad help &#8230; <a href="http://claude.betancourt.us/to-love-ones-craft-fun-with-grep-and-regex/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p><span class="drop_cap">I</span> just read an interesting post by Dave Nelson (spugbrap) in which he details all the fun he had writing a script to search through Ext JS source code and open it with Textpad.</p><blockquote><p>So, I checked the TextPad help to see if I could pass in the name of a file containing full file paths for TextPad to open.</p><p>You just need to put an at sign (@) before the filename, and TextPad will look at that file to find a list of files to open. So, I decided to create a temporary file, output the filenames found and converted by my set of commands (above) into that temporary file, and then run TextPad, passing the temporary filename preceded by an @ sign.</p><p><code>textpad $(for g in 'for f in \'grep -Rli "new Ext.Panel" *\'; do (grep -Hn -m 1 "new Ext.Panel" $f | sed -e 's/\(^[^:]\+\):\([0-9]\+\):.*$/\1(\2/g'); done'; do echo 'cygpath -w -a ${g/\(*/}'\(${g/*\(/},'grep -m 1 "new Ext.Panel" ${g/(*/} | sed -e 's/\t/ /g' -e 's/new Ext.Panel.*$//g' | wc -c'\); done) &#038;</code></p><p>I’m sure this could be done more efficiently, but this was a fun challenge to take on, and I managed to find a way to do what I wanted to do.</p></blockquote><p><a href="http://www.spugbrap.com/blog/2008/03/recursively-grep-for-a-substring-open-all-results-in-textpad-with-cursor-positioned-appropriately/">Read on&#8230;</a></p> ]]></content:encoded> <wfw:commentRss>http://claude.betancourt.us/to-love-ones-craft-fun-with-grep-and-regex/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>ColdFusion Tags for POI &#8211; Microsoft&#8217;s &#8220;Poor Obfuscation Implementation&#8221;</title><link>http://claude.betancourt.us/coldfusion-tags-for-poi-microsofts-poor-obfuscation-implementation/</link> <comments>http://claude.betancourt.us/coldfusion-tags-for-poi-microsofts-poor-obfuscation-implementation/#comments</comments> <pubDate>Tue, 25 Mar 2008 20:12:25 +0000</pubDate> <dc:creator>Claude</dc:creator> <category><![CDATA[How-To]]></category> <category><![CDATA[ColdFusion]]></category> <category><![CDATA[Tags]]></category><guid isPermaLink="false">http://claude.betancourt.us/blog/2008/03/25/coldfusion-tags-for-poi-microsofts-poor-obfuscation-implementation/</guid> <description><![CDATA[Ben Nadel of Kinky Solutions has posted his latest work. He has wrapped the Apache POI API in a ColdFusion tag to help us create &#8220;authentic&#8221; Microsoft Office file formats. Now, the project contains more than just the POIUtility.cfc; it &#8230; <a href="http://claude.betancourt.us/coldfusion-tags-for-poi-microsofts-poor-obfuscation-implementation/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p><span class="drop_cap">B</span>en Nadel of Kinky Solutions has posted his latest work. He has wrapped the <a href="http://poi.apache.org/"><strong>Apache POI API</strong></a> in a ColdFusion tag to help us create &#8220;authentic&#8221; Microsoft Office file formats.</p><blockquote><p>Now, the project contains more than just the POIUtility.cfc; it also contains all the ColdFusion custom tags and some additional CSS-based components that can be used to create Microsoft Excel files in ColdFusion.</p></blockquote><p><a href="http://www.bennadel.com/blog/1187-POI-ColdFusion-Custom-Tags-First-Release.htm"><strong>Read more about it</strong></a>.</p> ]]></content:encoded> <wfw:commentRss>http://claude.betancourt.us/coldfusion-tags-for-poi-microsofts-poor-obfuscation-implementation/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> </channel> </rss>
<!-- Served from: claude.betancourt.us @ 2012-02-07 14:48:43 by W3 Total Cache -->
