<?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>Jerome&#039;s TOTs</title>
	<atom:link href="https://blog.jeromeparadis.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.jeromeparadis.com/</link>
	<description>Toughts on Technology by Jerome Paradis</description>
	<lastBuildDate>Wed, 08 Jan 2014 18:29:10 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
	<item>
		<title>How to create a Python or Django logger to log to a string</title>
		<link>https://blog.jeromeparadis.com/2014/01/08/create-python-django-logger-log-string/</link>
		
		<dc:creator><![CDATA[jparadis]]></dc:creator>
		<pubDate>Wed, 08 Jan 2014 18:29:10 +0000</pubDate>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[python]]></category>
		<guid isPermaLink="false">http://blog.jeromeparadis.com/?p=437</guid>

					<description><![CDATA[<p>I had to allow some of our admin users to view the logic and results of a parsing module to help find and pinpoint improvements. Since my backend Python Celery module already uses Python logging, I needed a way to log to a string to display the results on a Web page. Here&#8217;s a function [&#8230;]</p>
<p>The post <a href="https://blog.jeromeparadis.com/2014/01/08/create-python-django-logger-log-string/">How to create a Python or Django logger to log to a string</a> appeared first on <a href="https://blog.jeromeparadis.com">Jerome&#039;s TOTs</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>I had to allow some of our admin users to view the logic and results of a parsing module to help find and pinpoint improvements. Since my backend Python Celery module already uses Python logging, I needed a way to log to a string to display the results on a Web page.</p>
<p>Here&#8217;s a function that will return a StringIO variable and a Python logger. Once you are done logging or need the logger results, you can easily get the output logger in a string. Also, I found a <a title="turn off SQL logging while keeping settings.DEBUG?" href="http://stackoverflow.com/questions/7768027/turn-off-sql-logging-while-keeping-settings-debug" target="_blank">Stack Overflow</a> article to remove Django database debug info from being logged so I added this as a default parameter that can be changed.</p>
<p>Here&#8217;s <a href="https://gist.github.com/JeromeParadis/8321365" title="How to generate a logger that logs to a string." target="_blank">the Gist</a>:</p>
<p><script src="https://gist.github.com/JeromeParadis/8321365.js"></script></p>
<p>The post <a href="https://blog.jeromeparadis.com/2014/01/08/create-python-django-logger-log-string/">How to create a Python or Django logger to log to a string</a> appeared first on <a href="https://blog.jeromeparadis.com">Jerome&#039;s TOTs</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Email recipes and templates for nicely formatted HTML messages</title>
		<link>https://blog.jeromeparadis.com/2012/08/29/html-email-recipes-and-templates/</link>
		
		<dc:creator><![CDATA[jparadis]]></dc:creator>
		<pubDate>Wed, 29 Aug 2012 15:59:27 +0000</pubDate>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[email]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[mailchimp]]></category>
		<category><![CDATA[templates]]></category>
		<guid isPermaLink="false">http://blog.jeromeparadis.com/?p=436</guid>

					<description><![CDATA[<p>A few geeks may still prefer text emails but when building a site or an app, you know you need HTML emails. It just still works. What doesn&#8217;t always work, thought, is the myriad of mail clients that all have their quirks and may break some of your formatting. What you need is a recipe [&#8230;]</p>
<p>The post <a href="https://blog.jeromeparadis.com/2012/08/29/html-email-recipes-and-templates/">Email recipes and templates for nicely formatted HTML messages</a> appeared first on <a href="https://blog.jeromeparadis.com">Jerome&#039;s TOTs</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>A few geeks may still prefer text emails but when building a site or an app, you know you need HTML emails. It just still works. What doesn&#8217;t always work, thought, is the myriad of mail clients that all have their quirks and may break some of your formatting. What you need is a recipe or a template to display your stuff the way you want and ensure it works across most rich clients.</p>
<p><a title="MailChimp HTML templates" href="http://mailchimp.com/resources/html-email-templates/" target="_blank"><img fetchpriority="high" decoding="async" class="size-medium wp-image-438 aligncenter" title="MailChimp HTML templates" src="http://blog.jeromeparadis.com/wp-content/uploads/2012/08/template_layout1-300x220.png" alt="MailChimp HTML templates" width="300" height="220" /></a></p>
<p>While reading Hacker News this morning, I stumbled on <a href="http://news.ycombinator.com/item?id=4447637" target="_blank">this thread</a> about <a title="HTML EMAIL BOILERPLATE" href="http://htmlemailboilerplate.com/" target="_blank">HTML Email Boilerplate</a> and discovered two great resources that deserve a place in your toolbox:</p>
<ul>
<li>The HTML Email Boilerplate sir has<a href="http://htmlemailboilerplate.com/#f2" target="_blank"> a great article that explains</a> how to use their <a href="https://github.com/seanpowell/Email-Boilerplate" target="_blank">boilerplate on GitHub</a>. Read it to understand the subtleties of creating HTML messages that technically work.</li>
<li>MailChimp has a nice and free <a href="http://mailchimp.com/resources/html-email-templates/" target="_blank">collection of HTML templates</a> that are ready to use.</li>
</ul>
<p>The post <a href="https://blog.jeromeparadis.com/2012/08/29/html-email-recipes-and-templates/">Email recipes and templates for nicely formatted HTML messages</a> appeared first on <a href="https://blog.jeromeparadis.com">Jerome&#039;s TOTs</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Creating a Generic jQuery Countdown Timer</title>
		<link>https://blog.jeromeparadis.com/2011/09/07/jquery-countdown-timer/</link>
		
		<dc:creator><![CDATA[jparadis]]></dc:creator>
		<pubDate>Wed, 07 Sep 2011 17:13:21 +0000</pubDate>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[jquery]]></category>
		<guid isPermaLink="false">http://blog.jeromeparadis.com/?p=415</guid>

					<description><![CDATA[<p>I needed to create many HTML countdown timers for a little pet project of mine. So, I wrote a jQuery selector function to create countdown timers on demand. These timers are really simple, they countdown for a number of seconds to zero. Add this to your scripts: (function($) { $.fn.createCountdownTimer = function(selector,time,tick,cb) { var seconds [&#8230;]</p>
<p>The post <a href="https://blog.jeromeparadis.com/2011/09/07/jquery-countdown-timer/">Creating a Generic jQuery Countdown Timer</a> appeared first on <a href="https://blog.jeromeparadis.com">Jerome&#039;s TOTs</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>I needed to create many HTML countdown timers for a little pet project of mine. So, I wrote a jQuery selector function to create countdown timers on demand. These timers are really simple, they countdown for a number of seconds to zero.</p>
<p>Add this to your scripts:</p>
<pre>(function($) {
  $.fn.createCountdownTimer = function(selector,time,tick,cb) {
    var seconds = time;
    var el = this;
    tick = tick || 1;
    var timer = function() {
      seconds -= tick;
      el.find(selector).text(String(seconds));
      if (seconds &gt; 0)
         setTimeout(timer,tick * 1000);
      else
         cb &amp;&amp; cb();
    };
    setTimeout(timer,tick * 1000);
    return this;
 };
})(jQuery);</pre>
<p>Parameters <em>tick </em>and <em>cb </em>are optional. <em>tick </em>defaults to 1 as you usually tick down 1 second at a time.</p>
<p>Suppose you have a HTML countdown timer such as:</p>
<pre>
<div id="mytimer">&lt;div id="my_timer"&gt;Starting in &lt;span class="timer"&gt;10&lt;/span&gt; seconds...&lt;/div&gt;</div></pre>
<p>then, all you need to do to start a countdown from 10 to 0 is:</p>
<pre>$("#my_timer").createCountdownTimer(".timer",10);</pre>
<p>You can also supply a callback as a fourth parameter that will be called when the timer is done counting to zero. For example:</p>
<pre>$("#my_timer").createCountdownTimer(".timer",10,1,function() {
   alert('Done!');
});</pre>
<p>The post <a href="https://blog.jeromeparadis.com/2011/09/07/jquery-countdown-timer/">Creating a Generic jQuery Countdown Timer</a> appeared first on <a href="https://blog.jeromeparadis.com">Jerome&#039;s TOTs</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Integrating bit.ly with WordPress 3.0 Shortlinks Support</title>
		<link>https://blog.jeromeparadis.com/2010/07/02/integrating-bit-ly-with-wordpress-3-0-shortlinks-support/</link>
		
		<dc:creator><![CDATA[jparadis]]></dc:creator>
		<pubDate>Sat, 03 Jul 2010 01:31:30 +0000</pubDate>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[WordPress]]></category>
		<guid isPermaLink="false">http://blog.jeromeparadis.com/?p=402</guid>

					<description><![CDATA[<p>The official release of WordPress 3.0 being a bit recent, I’ve had a hell of a time trying to find bit.ly plugin that supports WordPress 3.0. The idea is to get your bit.ly short URL instead of the WordPress 3.0 short URL that uses your own domain name when you press the “Get Shortlink” button [&#8230;]</p>
<p>The post <a href="https://blog.jeromeparadis.com/2010/07/02/integrating-bit-ly-with-wordpress-3-0-shortlinks-support/">Integrating bit.ly with WordPress 3.0 Shortlinks Support</a> appeared first on <a href="https://blog.jeromeparadis.com">Jerome&#039;s TOTs</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>The official release of WordPress 3.0 being a bit recent, I’ve had a hell of a time trying to find bit.ly plugin that supports WordPress 3.0. The idea is to get your bit.ly short URL instead of the WordPress 3.0 short URL that uses your own domain name when you press the “Get Shortlink” button of a post editor.</p>
<p><a href="http://blog.jeromeparadis.com/wp-content/uploads/2010/07/WordPress3.0_BitLy.png"><img decoding="async" class="aligncenter size-medium wp-image-403" title="bit.ly support in WordPress 3.0" src="http://blog.jeromeparadis.com/wp-content/uploads/2010/07/WordPress3.0_BitLy-300x152.png" alt="bit.ly support in WordPress 3.0" width="300" height="152" /></a></p>
<p>I found the “<a href="http://wordpress.org/extend/plugins/wp-bitly/" target="_blank">WP Bit.ly</a>” plugin which looks pretty good but does not yet support WordPress 3.0.</p>
<p>So what does an unsatisfied geek do on a Friday evening instead of having dinner? He finds a solution.</p>
<h2>1. Download the WP Bit.ly plugin</h2>
<h2>2. Fix the plugin code</h2>
<p>In file wp.bitly.php, put lines 47-48 in comment:</p>
<p><code><strong>/*</strong>add_action( 'wp',      'wpbitly_shortlink_header' );<br />
add_action( 'wp_head', 'wpbitly_shortlink_wp_head' ); <strong>*/</strong></code></p>
<p>If you too are a geek and you need to know, this will make sure WordPress 3.0 continues to take care itself of the HTML response header and the Web page HTML header as per <a href="http://microformats.org/wiki/rel-shortlink" target="_blank">the rel=”shortlink” proposed standard</a>. Otherwise, the WP Bit.ly plugin would add these twice to a page which wouldn&#8217;t be clean.</p>
<h2>3. Modify your theme’s function.php</h2>
<p>Add the following code to your theme’s functions.php file:</p>
<p>/* bit.ly shortlink */</p>
<p><code>function get_bitly_shortlink($shortlink, $id, $context, $allow_slugs) {<br />
&nbsp;&nbsp;&nbsp;if (function_exists('wpbitly_get_shortlink')) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$slink = wpbitly_get_shortlink($id);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (empty($slink)) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wpbitly_generate_shortlink($id);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$slink = wpbitly_get_shortlink($id);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return !empty($slink) ? $slink : $shortlink;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;return $shortlink;<br />
}<br />
add_filter( 'get_shortlink', 'get_bitly_shortlink',10,4);</code></p>
<p>This code links the plugin code to the new WP 3.0 shortlink feature. It also makes sure that WordPress 3.0 will continue to operate as before if you do not enable the WP bit.ly plugin or you disable it.</p>
<h2>Generate the bit.ly links from the plugin</h2>
<p>So that the “Get Shortlink” button gets you a bit.ly link (instead of the default permalink), these should be generated once from the plugin&#8217;s settings. For new posts new bit.ly links should be created automatically.</p>
<p>Be aware that visits and crawls to your site will generate bit.ly links for each visited posts if no link already existed for each visited post. This is due to the fact that the short links are included in the code of each of your page to support new standards.</p>
<p>The post <a href="https://blog.jeromeparadis.com/2010/07/02/integrating-bit-ly-with-wordpress-3-0-shortlinks-support/">Integrating bit.ly with WordPress 3.0 Shortlinks Support</a> appeared first on <a href="https://blog.jeromeparadis.com">Jerome&#039;s TOTs</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Fix for Facebook URL Linter / Open Graph Protocol Bug with WordPress 3.0</title>
		<link>https://blog.jeromeparadis.com/2010/07/02/fix-for-facebook-url-linter-open-graph-protocol-bug-with-wordpress-3-0/</link>
		
		<dc:creator><![CDATA[jparadis]]></dc:creator>
		<pubDate>Fri, 02 Jul 2010 16:20:39 +0000</pubDate>
				<category><![CDATA[Facebook]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[WordPress]]></category>
		<guid isPermaLink="false">http://blog.jeromeparadis.com/?p=394</guid>

					<description><![CDATA[<p>I’ve been helping At Home with Kim Vallee support the Open Graph Protocol promoted by Facebook. It’s easy to implement and great research that we’ll be adding immediately to Shwowp. If you want to learn a bit more why it’s important for your site to implement the Open Graph Protocol, read this article: “Facebook Unleashes [&#8230;]</p>
<p>The post <a href="https://blog.jeromeparadis.com/2010/07/02/fix-for-facebook-url-linter-open-graph-protocol-bug-with-wordpress-3-0/">Fix for Facebook URL Linter / Open Graph Protocol Bug with WordPress 3.0</a> appeared first on <a href="https://blog.jeromeparadis.com">Jerome&#039;s TOTs</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>I’ve been helping <a href="http://athome.kimvallee.com/" target="_blank">At Home with Kim Vallee</a> support the <a href="http://developers.new.facebook.com/docs/opengraph" target="_blank">Open Graph Protocol</a> promoted by Facebook. It’s easy to implement and great research that we’ll be adding immediately to <a href="http://shwowp.com/" target="_blank">Shwowp</a>. If you want to learn a bit more why it’s important for your site to implement the Open Graph Protocol, read this article: “<a href="http://www.allfacebook.com/2010/06/facebook-unleashes-open-graph-search-engine-declares-war-on-google/" target="_blank">Facebook Unleashes Open Graph Search Engine, Declares War On Google</a>”.</p>
<p style="text-align: center"><a href="http://blog.jeromeparadis.com/wp-content/uploads/2010/07/url_linter_matrix.png"><img decoding="async" class="aligncenter size-medium wp-image-395" title="url_linter_matrix" src="http://blog.jeromeparadis.com/wp-content/uploads/2010/07/url_linter_matrix-300x171.png" alt="" width="300" height="171" /></a></p>
<p><a href="http://developers.facebook.com/tools/lint/" target="_blank">URL Linter</a> is a handy Facebook Developer tool that allows you to analyze a Web page meta data to see how Facebook understands it.</p>
<p>The problem is that URL Linter was working for the home page but not for the article pages. After much lost sleep and a <a href="http://forum.developers.facebook.com/viewtopic.php?id=64351" target="_blank">call for help</a> on Facebook Developer Forums, <a href="http://forum.developers.facebook.com/viewtopic.php?id=63850" target="_blank">Paul from Facebook confirmed it was a bug</a>:</p>
<ul>
<li>WordPress 3.0 added a shortlink feature</li>
<li>If you changed your WordPress permalinks to friendly names instead of the default, it adds an HTTP header variable in the form
<ul>
<li>Link    &lt;http://domain.com/?p=12345&gt;; rel=shortlink</li>
<li>This new header variable is part of a <a href="http://microformats.org/wiki/rel-shortlink" target="_blank">proposed microformat standard</a>.</li>
<li>The Facebook URL Linter and crawler currently has trouble parsing the page when it sees this HTTP header</li>
</ul>
</li>
</ul>
<h3>The Fix</h3>
<p>The bug should be fixed by Facebook in about a week. In the meanwhile, if you run WordPress 3.0 and are implementing Open Graph Protocol support to your site, you can add the following code in your theme’s functions.php to disable the shortlink in the HTTP header output:</p>
<p><code><br />
/* Remove WP 3.0 shortlink */<br />
function empty_shortlink($shortlink, $id, $context, $allow_slugs) {<br />
return NULL;<br />
}<br />
add_filter( 'get_shortlink', 'empty_shortlink',10,4);</code></p>
<p>The post <a href="https://blog.jeromeparadis.com/2010/07/02/fix-for-facebook-url-linter-open-graph-protocol-bug-with-wordpress-3-0/">Fix for Facebook URL Linter / Open Graph Protocol Bug with WordPress 3.0</a> appeared first on <a href="https://blog.jeromeparadis.com">Jerome&#039;s TOTs</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Twitter allows to follow Facebook friends, Facebook blocks feature</title>
		<link>https://blog.jeromeparadis.com/2010/06/23/twitter-allows-to-follow-facebook-friends-facebook-blocks-feature/</link>
		
		<dc:creator><![CDATA[jparadis]]></dc:creator>
		<pubDate>Wed, 23 Jun 2010 22:25:14 +0000</pubDate>
				<category><![CDATA[social media]]></category>
		<category><![CDATA[Web 2.0]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[twitter]]></category>
		<guid isPermaLink="false">http://blog.jeromeparadis.com/?p=385</guid>

					<description><![CDATA[<p>In their recent Mashable article, HUGE: Twitter Lets You Automatically Follow Your Facebook Friends, we learn that we can now use Twitter&#8217;s Facebook Application to find friends to follow in Twitter. It looks like it was short lived because minutes after this article was published, it seems that Facebook blocked that capability: Really wondering what [&#8230;]</p>
<p>The post <a href="https://blog.jeromeparadis.com/2010/06/23/twitter-allows-to-follow-facebook-friends-facebook-blocks-feature/">Twitter allows to follow Facebook friends, Facebook blocks feature</a> appeared first on <a href="https://blog.jeromeparadis.com">Jerome&#039;s TOTs</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>In their recent Mashable article, <a href="http://mashable.com/2010/06/23/huge-twitter-lets-you-automatically-follow-your-facebook-friends/" target="_blank">HUGE: Twitter Lets You Automatically Follow Your Facebook Friends</a>, we learn that we can now use Twitter&#8217;s <a href="http://apps.facebook.com/twitter/" target="_blank">Facebook Application</a> to find friends to follow in Twitter.</p>
<p>It looks like it was short lived because minutes after this article was published, it seems that Facebook blocked that capability:</p>
<p style="text-align: center"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-386" title="Facebook blocks Twitter" src="http://blog.jeromeparadis.com/wp-content/uploads/2010/06/TwitterFacebook.png" alt="" width="535" height="442" /></p>
<p style="text-align: left">Really wondering what game is being played right now! The Twitter Facebook app allow you (as an option) to publish your tweets to Facebook and it now seems that you can&#8217;t find new friends through Facebook so you can follow them on Twitter (and optionally post back to Facebook!). Strange!</p>
<p style="text-align: left">Facebook was really quick in blocking Twitter and I&#8217;m wondering which  Term of Service Facebook thinks Twitter did not respect.</p>
<p style="text-align: left"><strong>UPDATE:</strong> on Techcrunch, there&#8217;s<a href="http://techcrunch.com/2010/06/23/facebook-blocks-twitter/" target="_blank"> now an update article from MG Siegler</a> which says this might be an issue on Facebook&#8217;s end. Maybe a coding error or, more probable: a) an API problem on Facebook&#8217;s end or b) Facebook really blocked Twitter.</p>
<p style="text-align: left"><strong>UPDATE 2</strong>: it seems it is not intentional. Facebook is working with Twitter to solve the problem.</p>
<p>The post <a href="https://blog.jeromeparadis.com/2010/06/23/twitter-allows-to-follow-facebook-friends-facebook-blocks-feature/">Twitter allows to follow Facebook friends, Facebook blocks feature</a> appeared first on <a href="https://blog.jeromeparadis.com">Jerome&#039;s TOTs</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to fix the WordPress plugin WP-SpamFree to avoid the “Your location has been identified as part of a reported spam network” error</title>
		<link>https://blog.jeromeparadis.com/2010/03/11/how-to-fix-the-wordpress-plugin-wpspamfree-to-avoid-the/</link>
		
		<dc:creator><![CDATA[jparadis]]></dc:creator>
		<pubDate>Fri, 12 Mar 2010 00:42:12 +0000</pubDate>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[social media]]></category>
		<category><![CDATA[WordPress]]></category>
		<guid isPermaLink="false">http://blog.jeromeparadis.com/?p=377</guid>

					<description><![CDATA[<p>My wife Kim is the successful editor behind At Home with Kim Vallee. She uses the WordPress platform. With success and a popular platform, problems with comment and contact form spam becomes quickly a pain to manage. That&#8217;s why you need a good toolset to keep your sanity intact. Good WordPress plugins to protect against [&#8230;]</p>
<p>The post <a href="https://blog.jeromeparadis.com/2010/03/11/how-to-fix-the-wordpress-plugin-wpspamfree-to-avoid-the/">How to fix the WordPress plugin WP-SpamFree to avoid the “Your location has been identified as part of a reported spam network” error</a> appeared first on <a href="https://blog.jeromeparadis.com">Jerome&#039;s TOTs</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>My wife Kim is the successful editor behind <a href="http://athome.kimvallee.com/" target="_blank">At Home with Kim Vallee</a>. She uses the WordPress platform.</p>
<p>With success and a popular platform, problems with comment and contact form spam becomes quickly a pain to manage. That&#8217;s why you need a good toolset to keep your sanity intact. Good WordPress plugins to protect against spamming and keep your installation secure include:</p>
<ul>
<li>Akismet &#8211; protects against spam </li>
<li>Login LockDown &#8211; adds extra security to your login form </li>
<li>WP Security Scan &#8211; security </li>
<li><a href="http://www.polepositionmarketing.com/library/wp-spamfree/" target="_blank">WP-SpamFree</a> &#8211; extra spam protection </li>
</ul>
<p>WP-SpamFree is quite invaluable against robots and contact form spam. However, it came to our attention that some people would see the following message instead of the contact form:</p>
<blockquote>
<p>Your location has been identified as part of a reported spam network. Contact form has been disabled to prevent spam.</p>
</blockquote>
<p>See the message when it would appear instead of <a href="http://athome.kimvallee.com/contact/" target="_blank">Kim&#8217;s contact form</a>:</p>
<p><a href="http://blog.jeromeparadis.com/images/blog_jeromeparadis_com/WindowsLiveWriter/HowtofixtheWordPresspluginWPSpamFreegene_EA76/image_2.png"><img loading="lazy" decoding="async" style="border-right-width: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px" title="image" border="0" alt="image" src="http://blog.jeromeparadis.com/images/blog_jeromeparadis_com/WindowsLiveWriter/HowtofixtheWordPresspluginWPSpamFreegene_EA76/image_thumb.png" width="627" height="375"></a> </p>
<p>This was really annoying. People were telling Kim they couldn&#8217;t send comments.</p>
<p>By chance, one PC at our office had this bug. The unique IP address assigned to our network by Videotron seemed clean. So I dug further and looked at the plugin code to understand and debug what&#8217;s happening. It seems some browsers in some configurations (in our case a particular Firefox installation on Windows XP) do not transmit the HTTP_ACCEPT_LANGUAGE variable to servers. There is a check in the WP-SpamFree plugin that identifies the visitor as a spammer if this variable is empty.</p>
<p>Once the problem identified, the fix is easy: simply disable this verification. The quick fix to the plugin is to modify the wp-spamfree.php file in the plugin directory to put this condition in comment. See my changes in <strong><font color="#ff0000">red</font></strong>:</p>
<p><font face="Times New Roman"><strong><font color="#ff0000">/*</font></strong>       <br />            $user_http_accept_language = trim($_SERVER[&#8216;HTTP_ACCEPT_LANGUAGE&#8217;]);       <br />            if ( !$user_http_accept_language ) {       <br />                $contact_form_blacklist_status = &#8216;2&#8217;;       <br />                $spamfree_error_code .= &#8216; CF-HAL1001&#8217;;       <br />                }       <br /><strong><font color="#ff0000">*/</font> </strong>      <br />            // Add blacklist check &#8211; IP&#8217;s only though. </font></p>
<p><font face="Times New Roman">            if ( $contact_form_blacklist_status ) {      <br />                $spamfree_contact_form_content = &#8216;&lt;strong&gt;Your location has been identified as part of a reported spam network. Contact form has been disabled to prevent spam.&lt;/strong&gt;&#8217;;       <br />                }       <br />            $content_new = str_replace(&#8216;&lt;!&#8211;spamfree-contact&#8211;&gt;&#8217;, $spamfree_contact_form_content, $content);</font></p>
<p>That&#8217;s it. No more false positives for Kim&#8217;s visitors!</p>
<p>I&#8217;ll send this issues to the WP-SpamFree devs.</p>
<p>The post <a href="https://blog.jeromeparadis.com/2010/03/11/how-to-fix-the-wordpress-plugin-wpspamfree-to-avoid-the/">How to fix the WordPress plugin WP-SpamFree to avoid the “Your location has been identified as part of a reported spam network” error</a> appeared first on <a href="https://blog.jeromeparadis.com">Jerome&#039;s TOTs</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>The iPad: The Emperor says you shall pass through our gates – Mac App Store next?</title>
		<link>https://blog.jeromeparadis.com/2010/01/28/the-ipad-the-emperor-says-you-shall-pass-through-our-2/</link>
		
		<dc:creator><![CDATA[jparadis]]></dc:creator>
		<pubDate>Thu, 28 Jan 2010 15:26:45 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<guid isPermaLink="false">http://blog.jeromeparadis.com/?p=376</guid>

					<description><![CDATA[<p>Yesterday Steve Jobs announced his latest creation, the Apple iPad. The Emperor has spoken and it&#8217;s very telling. Apple&#8217;s present and future is no longer about a fine-tuned combination of hardware and software. It&#8217;s also about being the content gatekeeper. The announcement We finally know what kind of tablet computer the Apple folks were cooking! [&#8230;]</p>
<p>The post <a href="https://blog.jeromeparadis.com/2010/01/28/the-ipad-the-emperor-says-you-shall-pass-through-our-2/">The iPad: The Emperor says you shall pass through our gates – Mac App Store next?</a> appeared first on <a href="https://blog.jeromeparadis.com">Jerome&#039;s TOTs</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Yesterday Steve Jobs announced his latest creation, the<a href="http://www.apple.com/ipad/"> Apple iPad</a>.<a href="http://sherryetal.deviantart.com/art/Bite-me-in-the-rain-83886389" target="_blank"><img loading="lazy" decoding="async" style="border-right-width: 0px;border-top-width: 0px;border-bottom-width: 0px;margin-left: 0px;border-left-width: 0px;margin-right: 0px" title="Bite_me_in_the_rain_by_sherryetal" border="0" alt="Bite_me_in_the_rain_by_sherryetal" align="right" src="http://blog.jeromeparadis.com/images/blog_jeromeparadis_com/WindowsLiveWriter/TheiPadTheEmperorsaysyoushallpassthrough_A149/Bite_me_in_the_rain_by_sherryetal_3.jpg" width="189" height="244"></a> </p>
<p>The Emperor has spoken and it&#8217;s very telling. Apple&#8217;s present and future is no longer about a fine-tuned combination of hardware and software. It&#8217;s also about being the content gatekeeper.</p>
<h3>The announcement</h3>
<p>We finally know what kind of tablet computer the Apple folks were cooking! Basically, it&#8217;s a blend of an oversized iPod Touch and iPhone. At the same time, it&#8217;s really a computer; the chip looks much more powerful. It&#8217;s supposedly very fast. Like any first generation Apple product, it has a lot going for it while missing a few things. No real surprises except maybe the starting price and very surprised about seeing a touch version of iWorks.</p>
<p>What&#8217;s more telling about Steve&#8217;s strategy is the lack of support for Adobe Flash. Not that I am very fond of Flash, but it is very telling.</p>
<h3>It&#8217;s all about control</h3>
<p>It&#8217;s no secret Steve Jobs is a control freak. It has worked well for him. Since the first Apple computer, Apple has had an aversion for clones. Apple wants to control the whole experience starting from hardware. Forget about having an Orange, a Pear or a Peach. Like Eve, all you need is to get a bite out of the Apple and you&#8217;re hooked. (Their logo is really telling). By controlling hardware and software combined with their sense of design and controlled user experience they&#8217;ve been able to do what most tech giants still dream of.</p>
<p>But today, controlling the user experience is also all about controlling content distribution.</p>
<p>They&#8217;ve done a really good job with iTunes out of distributing songs for people to buy. Then, Apple added an App Store to iTunes to distribute and install software. It made sense: it is more user-friendly and practical. What a success it has been!</p>
<p>Now enters the iPad which uses exactly the same model than the iPhone or iPod Touch. To download and install and application you still need to go through the Apple store. Oh, and you can download books now.</p>
<p>The excuse for the lack of Flash support on the iPhone Safari browser was that it was using too much CPU. It would deter the user experience. It wasn&#8217;t a bad excuse. Heck! Flash is known to bring underpowered computers to a crawl. But that excuse doesn&#8217;t fly well with the iPad. Those who got to try the device were all raving on how fast it is with its new Apple designed chip.</p>
<p>I do not care that much about the lack of Flash on Web sites. It is usually more a pain than a gain.</p>
<p>On the other hand, Adobe is <a href="http://blogs.adobe.com/flashplatform/2010/01/building_ipad_apps.html">prepping Flash CS5</a> which allows to build iPod Touch, iPhone and iPad applications. Who needs Flash support? Adobe is building it in some way! Who needs Adobe Air support on the iPad computer? Here&#8217;s a solution!</p>
<p>The thing is these Flash applications will have to be distributed by the App Store and approved and censored by Apple. There is no other way to do it unless you want to break Apple&#8217;s terms of use.</p>
<p>That&#8217;s why I don&#8217;t see Flash being supported natively in the browser on the iPad or the iPhone. It would be a way for developers to distribute software in a Web page without going through the content distribution gatekeeper Apple has become. Do pass go, but we&#8217;ll charge a fee on your 200$!</p>
<h3>What&#8217;s next?</h3>
<p>Apple&#8217;s announcement of the iWorks software suite for the iPad was quite a surprise to me. Digesting this announcement means Apple does not see the iPad as just an oversized iPhone. It&#8217;s also a computer where you can get some sort of work done. With the new screen estate, I can see a lot of exciting business applications being built for this new toy. But again, all these will have to pass through the gatekeeper.</p>
<p>To conclude, I predict we will see App Store support for Mac applications in the near future. It would make perfect sense when you think of it. Users get to download everything in a single place. Invoices are easy to find. You are dealing with a single company you trust. Why download and install something from somewhere else? That&#8217;s really too hard and too risky!</p>
<p>I wouldn&#8217;t be surprised to someday see a new computer from Apple which will make everything even easier for the computer illiterate. It will support a mouse and keyboard when touch is not yet as efficient. You will be able to get some real work done with it. It will use a blend of the Mac OS and the iPad OS to offer a seamless experience from hardware to content consumption. We almost have this device with the iPad but it&#8217;s just a start. In a future near you, your Adobe PhotoShop or Microsoft Office installations for a Mac will probably be downloaded from Apple.</p>
<p><p>Image source: <a href="http://sherryetal.deviantart.com/art/Bite-me-in-the-rain-83886389" target="_blank">Bite me in the rain by *sherryetal</a></p>
<p><strong>Update:</strong></p>
<p>Some interesting articles popped-up on the subject after I wrote this:</p>
<ul>
<ul>
<li>Alex Payne: &#8220;<a href="http://al3x.net/2010/01/28/ipad.html" target="_blank">On the iPad</a>&#8220;.</li>
<li>Free Software Foundation: &#8220;<a href="http://www.fsf.org/news/ibad_launch" target="_blank">iPad is iBad for freedom</a>&#8220;.</li>
<li>Dave Winer: &#8220;<a href="http://www.scripting.com/stories/2010/01/29/attnJoeShouldWeTrustIpad.html#disqus_thread" target="_blank">Attn Joe: Should we trust iPad?</a>&#8220;.</li>
<li>Adobe Blog: &#8220;<a href="http://blogs.adobe.com/flashplatform/2010/01/apples_ipad_--_a_broken_link.html" target="_blank">Apple&#8217;s iPad &#8212; a broken link?</a>&#8220;.</li>
<li>Fortune Brainstorm Tech: &#8220;<a href="http://brainstormtech.blogs.fortune.cnn.com/2010/01/29/behind-the-adobe-apple-cold-war/" target="_blank">Behind the Adobe-Apple cold war</a>&#8220;.</li>
</ul>
</ul>
<p>The post <a href="https://blog.jeromeparadis.com/2010/01/28/the-ipad-the-emperor-says-you-shall-pass-through-our-2/">The iPad: The Emperor says you shall pass through our gates – Mac App Store next?</a> appeared first on <a href="https://blog.jeromeparadis.com">Jerome&#039;s TOTs</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>The joys of IP telephony</title>
		<link>https://blog.jeromeparadis.com/2010/01/05/the-joys-of-ip-telephony/</link>
		
		<dc:creator><![CDATA[jparadis]]></dc:creator>
		<pubDate>Tue, 05 Jan 2010 20:32:54 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Technology]]></category>
		<guid isPermaLink="false">http://blog.jeromeparadis.com/?p=375</guid>

					<description><![CDATA[<p>I&#8217;ve been quite busy with work during the holidays. I had a huge mandate to complete for January 4th. This doesn&#8217;t mean I&#8217;m always at the office. I&#8217;m always looking for new way to make my office more mobile. This is why I&#8217;ve been using an IP Telephony service (from Ubity in Montreal) for a [&#8230;]</p>
<p>The post <a href="https://blog.jeromeparadis.com/2010/01/05/the-joys-of-ip-telephony/">The joys of IP telephony</a> appeared first on <a href="https://blog.jeromeparadis.com">Jerome&#039;s TOTs</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><a href="http://blog.jeromeparadis.com/images/blog_jeromeparadis_com/WindowsLiveWriter/ThejoysofIPtelephony_DABB/IPphone_2.jpg"><img loading="lazy" decoding="async" style="border-bottom: 0px;border-left: 0px;margin-left: 0px;border-top: 0px;margin-right: 0px;border-right: 0px" title="IPphone" border="0" alt="IPphone" align="right" src="http://blog.jeromeparadis.com/images/blog_jeromeparadis_com/WindowsLiveWriter/ThejoysofIPtelephony_DABB/IPphone_thumb.jpg" width="244" height="184"></a>I&#8217;ve been quite busy with work during the holidays. I had a huge mandate to complete for January 4th. This doesn&#8217;t mean I&#8217;m always at the office. I&#8217;m always looking for new way to make my office more mobile. </p>
<p>This is why I&#8217;ve been using an IP Telephony service (from <a href="http://ubity.ca/" target="_blank">Ubity</a> in Montreal) for a year now. With such a service, you can plug your phones anywhere there&#8217;s an Ethernet jack.</p>
<h3>Location, location</h3>
<p> The location where I&#8217;m at doesn&#8217;t matter. I could be in Mexico, in Europe, wherever and when I use my phone, it&#8217;s my office phone calling locally from Montreal.</p>
<p>So, I have a phone plugged in at my office, I have one at home and I have another one at my cottage. When the phone rings these 3 phones will all ring at the same time and I can answer like I was at the office. When I call someone, I always look as if I was at the office. I can be at my cottage and answer as if I was at the office after a day of skiing.</p>
<p><a href="http://blog.jeromeparadis.com/images/blog_jeromeparadis_com/WindowsLiveWriter/ThejoysofIPtelephony_DABB/SubaruNeigeSutton_2.jpg"><img loading="lazy" decoding="async" style="border-bottom: 0px;border-left: 0px;margin-left: 0px;border-top: 0px;margin-right: 0px;border-right: 0px" title="SubaruNeigeSutton" border="0" alt="SubaruNeigeSutton" align="right" src="http://blog.jeromeparadis.com/images/blog_jeromeparadis_com/WindowsLiveWriter/ThejoysofIPtelephony_DABB/SubaruNeigeSutton_thumb.jpg" width="244" height="184"></a>Not only that, I also have software phone support. So, when travelling, I can use my laptop at the hotel to make calls: I just plug in my iPhone headphones (which as a microphone) and I still appear as being in the office when returning calls from clients!</p>
<p>I&#8217;ve also installed a VoIP application on my iPhone called <a href="http://www.vnet-corp.com/iphone.htm" target="_blank">iSip</a>. Unfortunately, it does not allow to make calls over the 3G network yet. It only supports Wi-Fi. The cool thing is I can be having a glass of port and smoking a cigar on my terrace and use the phone to call back clients or partners while still looking as if I&#8217;m at the office!</p>
<p>The day I&#8217;ll move my office, I just need to plug the phone somewhere else and I&#8217;m instantly ready to make and answer calls.</p>
<h3>Features</h3>
<p>This kind of service has all the usual telephony and corporate voicemail features for an affordable price. Calls in North America are free (1000 minutes per months) and calls to countries the other side of the Ocean are ridiculously cheap. On top of that I have features such as &#8220;find me&#8221; where in my corporate voicemail, people can press a button in my inbox to find me. They get to speak their names while the service calls my cell phone. Then, when receiving the call on my cell phone, after listening to who&#8217;s calling, I can press a button to accept or ignore the call.</p>
<p>The downside is I&#8217;m extremely reachable. But I often need to be.</p>
<p>The upside is that I can enjoy the pleasures of life a bit more and work where it&#8217;s more practical and enjoyable while looking like I&#8217;m never leaving my office and even sleeping there!</p>
<p>The post <a href="https://blog.jeromeparadis.com/2010/01/05/the-joys-of-ip-telephony/">The joys of IP telephony</a> appeared first on <a href="https://blog.jeromeparadis.com">Jerome&#039;s TOTs</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>My predictions for 2010</title>
		<link>https://blog.jeromeparadis.com/2010/01/04/my-predictions-for-2010/</link>
		
		<dc:creator><![CDATA[jparadis]]></dc:creator>
		<pubDate>Mon, 04 Jan 2010 19:34:35 +0000</pubDate>
				<category><![CDATA[social media]]></category>
		<category><![CDATA[Technology]]></category>
		<guid isPermaLink="false">http://blog.jeromeparadis.com/?p=374</guid>

					<description><![CDATA[<p>So, I decided to join the bandwagon and give my predictions for 2010 in technology and social media. 1. We&#8217;ll see a new breed of social media curating As we are more than ever overloaded with information, implicit filtering becomes a must. Are you able to keep up with your RSS feed? I can&#8217;t! Do [&#8230;]</p>
<p>The post <a href="https://blog.jeromeparadis.com/2010/01/04/my-predictions-for-2010/">My predictions for 2010</a> appeared first on <a href="https://blog.jeromeparadis.com">Jerome&#039;s TOTs</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>So, I decided to join the bandwagon and give my predictions for 2010 in technology and social media.<a href="http://commons.wikimedia.org/wiki/File:Glaskugel_CrystalBall.jpg" target="_blank"><img loading="lazy" decoding="async" style="border-bottom: 0px;border-left: 0px;margin-left: 0px;border-top: 0px;margin-right: 0px;border-right: 0px" title="450px-Glaskugel_CrystalBall" border="0" alt="450px-Glaskugel_CrystalBall" align="right" src="http://blog.jeromeparadis.com/images/blog_jeromeparadis_com/WindowsLiveWriter/Mypredictionsfor2010_C395/450px-Glaskugel_CrystalBall_3.jpg" width="184" height="244"></a>     </p>
<h3>1. We&#8217;ll see a new breed of social media curating</h3>
<p>As we are more than ever overloaded with information, implicit filtering becomes a must. Are you able to keep up with your RSS feed? I can&#8217;t! Do you feel like you&#8217;re missing on a lot of interesting conversations shared across your networks? I sure do!   <br />We&#8217;ve already seen a bunch of aggregators in the social media landscape as destination sites. The next wave, which will happen this year, will focus on personalized our social media streams based on our social interactions and preferences. We&#8217;ll see a lot of innovation in this space.</p>
<h3>2. Telcos start adopting a single Android platform</h3>
<p>Google&#8217;s upcoming Nexus One Android phone proves that Google can&#8217;t afford to have a platform where it does not better control the experience in its fight against Apple&#8217;s iPhone. I predict we will see many telcos start adopting a unified Android which will be a packaged version of the Nexus One and thelcos will start dropping other Android implementations.</p>
<h3>3. It will be the year of BuddyPress</h3>
<p>As more and more bloggers become media empires and as different brands want to embrace social media, we&#8217;ll see an impressive number of mainstream sites adopt BuddyPress to build their own communities.</p>
<h3>4. Bing will integrate social shopping features</h3>
<p>As innovation in e-commerce is stagnating outside of Amazon, social shopping will continue to boom. We&#8217;ll see major players such as Google, Microsoft and even Apple jump into social shopping. Bing, which already has some focus on shopping, will integrate social features in its search engine.</p>
<h3>5. There will be at least one high profile lawsuit against Apple</h3>
<p>Losers love their lawyers and success breads jealousy. A major company will have a major lawsuit against Apple. Easy prediction. There probably will be more than one high profile lawsuit against Apple. As a bonus, Apple will fend these off.</p>
<h3>6. 2010: the year of the tablet</h3>
<p>Another easy prediction. Everyone&#8217;s making it. I had to.</p>
<p>The real questions are: Will Windows 7 stand of the crowd with its multi-touch features? Will Android be majorly used? Will Apple&#8217;s tablet be great enough? As a side prediction it is sure that Apple fans will drink to cool-aid.</p>
<h3>7. More anti-trust investigations against Google</h3>
<p>The American Department of Justice and the European Union will open both new probes and investigations into Google&#8217;s activities. At least another high profile acquisition will be blocked. It a rite a passage Microsoft had to go through and its Google turn.</p>
<h3>8. Facebook to become the next Paypal</h3>
<p>In 2010, Facebook will finally launch a payment platform that can be used as a virtual currency. Eventually, users can exchange credits.</p>
<h3>9. Facebook e-commerce applications</h3>
<p>We will see adoption of Facebook&#8217;s payment platform outside of social gaming and we will see it adopted on Facebook Connect sites too. Want to make a donation through Facebook?</p>
<h3>10. We&#8217;ll see innovation in e-commerce outside of Amazon</h3>
<p>I had to make this prediction because I feel e-commerce is still at the 1.0 stage. It&#8217;s a matter of time before we begin to see innovation outside of Amazon. I&#8217;m making this prediction because you&#8217;ll have to stay tuned to <a href="http://shwowp.com/" target="_blank">Shwowp</a> a new startup from <a href="http://www.horsepigcow.com/" target="_blank">Tara Hunt</a> and yours truly. If others don&#8217;t start to innovate, at least there will be us! In any case, it will become true if #9 becomes true.</p>
<p>Image copyright: <a title="http://commons.wikimedia.org/wiki/File:Glaskugel_CrystalBall.jpg" href="http://commons.wikimedia.org/wiki/File:Glaskugel_CrystalBall.jpg">http://commons.wikimedia.org/wiki/File:Glaskugel_CrystalBall.jpg</a></p>
<p>The post <a href="https://blog.jeromeparadis.com/2010/01/04/my-predictions-for-2010/">My predictions for 2010</a> appeared first on <a href="https://blog.jeromeparadis.com">Jerome&#039;s TOTs</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
