<?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>Hybrid Forge</title>
	<atom:link href="http://www.hybridforge.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.hybridforge.com/blog</link>
	<description>eCommerce Consultants</description>
	<lastBuildDate>Sun, 25 Mar 2012 03:22:17 +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>Nginx SSL Ciphers and PCI Compliance</title>
		<link>http://www.hybridforge.com/blog/808/nginx/ssl-ciphers-pci-compliance/</link>
		<comments>http://www.hybridforge.com/blog/808/nginx/ssl-ciphers-pci-compliance/#comments</comments>
		<pubDate>Sat, 24 Mar 2012 17:19:08 +0000</pubDate>
		<dc:creator>Chad Smith</dc:creator>
				<category><![CDATA[NGINX]]></category>

		<guid isPermaLink="false">http://www.hybridforge.com/blog/?p=808</guid>
		<description><![CDATA[Nginx has clearly established itself as a contender for the dominant next generation web server. However, the road to victory will require some significant improvements to the migration path from Apache and IIS. Online forums and the blogosphere are quickly filling with details on Nginx configuration snippets that share very focused instructions on accomplishing a [...]]]></description>
			<content:encoded><![CDATA[<p>Nginx has clearly established itself as a contender for the dominant next generation web server. However, the road to victory will require some significant improvements to the migration path from Apache and IIS. Online forums and the blogosphere are quickly filling with details on Nginx configuration snippets that share very focused instructions on accomplishing a very specific task. Many of these articles are now wildly out of date as the cycle of Nginx version release accelerates. </p>
<p>My objective is to provide some explanation and context around the configuration of SSL ciphers and protocols within Nginx as they relate to PCI compliance. It goes without saying that I have an eye for performance. When applying this information to your own servers keep in mind that these details apply to the currently stable Nginx release 1.0.14. </p>
<p>Encryption, crypto and SSL are hot topics these days with vulnerabilities, exploits and the <a href="http://www.theregister.co.uk/2011/11/04/ssl_still_hopelessly_broken/" title="discovery of recently comprised SSL authorities">discovery of recently compromised SSL authorities</a> eroding the protection SSL provides to both customers and businesses.</p>
<p>Encryption is an expensive, computationally intensive process at any scale, but it is absolutely critical for protecting the sensitive credit card details intrinsic to an ecommerce transaction.</p>
<p>The developers of Nginx have recently changed the default SSL ciphers to include the very strong Diffie-Hellman Ephemeral (DHE) cipher. DHE is used to provide perfect forward secrecy in TLS.  </p>
<p>Further reading on <a href="http://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange" title="DHE, PFS and TLS at Wikipedia.org">Ephermal Diffie-Hellman, PFS and TLS at Wikipedia.org</a></p>
<p>While I applaud this move on the part of the Nginx dev team there is a tradeoff and that is slower performance. DHE provides stronger encryption which in turn requires more computation but here’s where it gets interesting. To meet today’s PCI DSS crypto standards DHE is not required. Like many things in life there’s a balance to be struck between the risk of compromised encryption and the additional expense or rather the relative loss of connections per second. I’m not a lawyer nor should this be considered legal advice but I prefer things that go fast while meeting the necessary PCI compliance criteria.</p>
<p>In order to disable DHE in the server context of the Nginx configuration add the following line:</p>
<p><code>ssl_ciphers RC4:HIGH:!aNULL:!MD5:!kEDH;</code></p>
<p>This line provides the list of openssl cipher suites Nginx will use to negotiate a secure communication channel between client and server. To view the complete list of ciphers available on your server run:</p>
<p><code>openssl ciphers</code></p>
<p>An additional component required to meet the PCI DSS standard is the explicit definition of the SSL protocols supported by Nginx. Note the important omission is SSLv2 which enables weak cipher support.</p>
<p><code>ssl_protocols  SSLv3 TLSv1 TLSv1.1 TLSv1.2;</code></p>
<p>In combination with the above directives the ssl_prefer_server_ciphers setting enables protection from <a href="http://www.net-security.org/article.php?id=1638" title="Beast Attack Article">Beast attacks</a>.</p>
<p><code>ssl_prefer_server_ciphers on;</code><br />
For quick verification of the Nginx SSL encryption configuration the Qualys SSL Labs online tool is great. Consider hiding the results of your server’s analysis the first time you run this tool and also note the recently scanned domains list.</p>
<p><a href="https://www.ssllabs.com/ssldb/index.html" title="https://www.ssllabs.com/ssldb/index.html">https://www.ssllabs.com/ssldb/index.html</a></p>
<p>For the security experts I recommend using the openssl client rather than a 3rd party website.</p>
<p>Additional references:</p>
<p>PCI DSS v2.0<br />
<a href="https://www.pcisecuritystandards.org/documents/pci_dss_v2.pdf" title="https://www.pcisecuritystandards.org/documents/pci_dss_v2.pdf">https://www.pcisecuritystandards.org/documents/pci_dss_v2.pdf</a></p>
<p>OpenSSL Cipher List<br />
<a href="http://openssl.org/docs/apps/ciphers.html" title="http://openssl.org/docs/apps/ciphers.html">http://openssl.org/docs/apps/ciphers.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.hybridforge.com/blog/808/nginx/ssl-ciphers-pci-compliance/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>NGINX 1.0.14 Stable Released &#8211; Memory Disclosure</title>
		<link>http://www.hybridforge.com/blog/800/nginx/nginx-1-0-14-stable-released-memory-disclosure/</link>
		<comments>http://www.hybridforge.com/blog/800/nginx/nginx-1-0-14-stable-released-memory-disclosure/#comments</comments>
		<pubDate>Fri, 16 Mar 2012 03:35:43 +0000</pubDate>
		<dc:creator>Chad Smith</dc:creator>
				<category><![CDATA[NGINX]]></category>

		<guid isPermaLink="false">http://www.hybridforge.com/blog/?p=800</guid>
		<description><![CDATA[NGINX 1.0.14 was released on 15 March 2012 for both Windows and Linux. The binary is now available in the NGINX repository and direct download from Nginx.com. This stable release corrects a bug that enabled a malformed response from an upstream server to return the contents of previously freed memory to a client. Download link: [...]]]></description>
			<content:encoded><![CDATA[<p>NGINX 1.0.14 was released on 15 March 2012 for both Windows and Linux. The binary is now available in the NGINX repository and direct <a href="http://nginx.org/en/download.html">download from Nginx.com</a>. This stable release corrects a bug that enabled a malformed response from an upstream server to return the contents of previously freed memory to a client.</p>
<p>Download link:<br />
<a href="http://nginx.org/en/download.html" title="http://nginx.org/en/download.html">http://nginx.org/en/download.html</a></p>
<p>Hybrid Forge runs Nginx on Centos and Red Hat. When starting out we recommend manually adding the NGINX repo to the list of yum repositories.</p>
<p>With your favorite editor such VIM, VI, emacs or good old nano create a file named:</p>
<p><code><strong>/etc/yum.repos.d/nginx.repo</strong> </code></p>
<p>Add the following details to this file:</p>
<p><code><strong>[nginx]<br />
name=nginx repo<br />
baseurl=http://nginx.org/packages/OS/OSRELEASE/$basearch/<br />
gpgcheck=0<br />
enabled=1</strong></code></p>
<p>To install NGINX run:</p>
<p><code><strong>yum install nginx</strong></code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.hybridforge.com/blog/800/nginx/nginx-1-0-14-stable-released-memory-disclosure/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Magento Dynamically Set Static Block From Template File</title>
		<link>http://www.hybridforge.com/blog/780/software/magento-tips/magento-dynamically-set-static-block-from-template-file/</link>
		<comments>http://www.hybridforge.com/blog/780/software/magento-tips/magento-dynamically-set-static-block-from-template-file/#comments</comments>
		<pubDate>Wed, 06 Jul 2011 05:45:05 +0000</pubDate>
		<dc:creator>Geoff Kliza</dc:creator>
				<category><![CDATA[Magento Tips]]></category>

		<guid isPermaLink="false">http://www.hybridforge.com/blog/?p=780</guid>
		<description><![CDATA[OK, this one is a bit of an edge case, but I&#8217;ve dealt with similar issues while trying to set a static block through a template file when you need that static block to change based on the product being viewed. Sure, it&#8217;s easy to call the static block in the product&#8217;s custom layout update, [...]]]></description>
			<content:encoded><![CDATA[<p>OK, this one is a bit of an edge case, but I&#8217;ve dealt with similar issues while trying to set a static block through a template file when you need that static block to change based on the product being viewed.</p>
<p>Sure, it&#8217;s easy to call the static block in the product&#8217;s custom layout update, but the problem there is that you can&#8217;t place that block anywhere between the title and product description. All of those elements are called as childHtml and can&#8217;t be referenced by the layout XML. What happens if you need to put a special notice near the price or short description?</p>
<p>You could create a custom theme for each different product, but that could lead to a maintenance nightmare when you need to update a product page. You could also create a custom block and template, but that takes a lot of effort.</p>
<p>We&#8217;ll start by looking at calling a static block in the template file. It&#8217;s fairly academic to add the static block in the template&#8217;s phtml code in Magento:</p>
<p><code>&lt;?php echo $this-&gt;getLayout()-&gt;createBlock('cms/block')-&gt;setBlockId('my_static_block')-&gt;toHtml() ?&gt;</code></p>
<p>This works great, but every product page will have the exact same static block.</p>
<p>In this particular case, I needed to add some pricing information based on the product&#8217;s SKU. For simplicity I&#8217;ll say the SKUs were 1, 2, and 3. In this case, I created a static block for each of the three pricing notes, and set the identifier to product1, product2, and product3 respectively.</p>
<p><a rel="attachment wp-att-781" href="http://www.hybridforge.com/blog/780/software/magento-tips/magento-dynamically-set-static-block-from-template-file/attachment/magento_static_block_from_template/"><img class="aligncenter size-full wp-image-781" title="magento_static_block_from_template" src="http://www.hybridforge.com/blog/wp-content/uploads/magento_static_block_from_template.png" alt="Magento Dynamically Set Static Block From Template" width="638" height="484" /></a></p>
<p>Now, in the template file, I&#8217;ve changed the way the setBlockId is called:</p>
<p><code>&lt;?php echo $this-&gt;getLayout()-&gt;createBlock('cms/block')-&gt;setBlockId('pricing'.$_product-&gt;getSku())-&gt;toHtml() ?&gt;</code></p>
<p>This way the setBlockId would change depending on the product SKU. In theory this can also be done with custom attributes or any other product value. As an added bonus, it fails gracefully if it encounters a static block that doesn&#8217;t exist. Say for SKU = 4 I haven&#8217;t created a static block, so on that product page, no extra html is generated and no errors occur.</p>
<p>As I said, it&#8217;s a bit of an edge case, but it might come in handy in that rare instance.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hybridforge.com/blog/780/software/magento-tips/magento-dynamically-set-static-block-from-template-file/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Magento Custom Product Option Default Value</title>
		<link>http://www.hybridforge.com/blog/766/software/magento-tips/magento-custom-product-option-default-value/</link>
		<comments>http://www.hybridforge.com/blog/766/software/magento-tips/magento-custom-product-option-default-value/#comments</comments>
		<pubDate>Wed, 22 Jun 2011 06:49:58 +0000</pubDate>
		<dc:creator>Geoff Kliza</dc:creator>
				<category><![CDATA[Magento Tips]]></category>

		<guid isPermaLink="false">http://www.hybridforge.com/blog/?p=766</guid>
		<description><![CDATA[Magento is a great tool, but sometimes adds some unnecessary friction to the buying process. Take Custom Product Options drop-down list for example. There is no way to set an option as a default. If you have several custom options on a product, but 80% of the customers are buying a certain option there is [...]]]></description>
			<content:encoded><![CDATA[<p>Magento is a great tool, but sometimes adds some unnecessary friction to the buying process. Take Custom Product Options drop-down list for example. There is no way to set an option as a default.</p>
<p>If you have several custom options on a product, but 80% of the customers are buying a certain option there is no point in making those customers actually choose the option from the list &#8211; it should be set by default.</p>
<p><a rel="attachment wp-att-767" href="http://www.hybridforge.com/blog/766/software/magento-tips/magento-custom-product-option-default-value/attachment/product-custom-options-select/"><img class="aligncenter size-full wp-image-767" title="product-custom-options-select" src="http://www.hybridforge.com/blog/wp-content/uploads/product-custom-options-select.png" alt="" width="301" height="91" /></a></p>
<p>There is a relatively easy fix for this one.</p>
<p><strong>CAUTION::To do this requires editing of one of the Core Magento files. If you upgrade your Magento version, it will overwrite this code. Also, this will apply to all Product Custom Option Drop-down lists on your site.</strong></p>
<p>This example is based on Magento 1.4.2.0. so the exact location in the file may be different if you are running a different version.</p>
<p>First make sure you set the most popular option to the first in the sort order on your Custom Options tab. Now you want to fine the file app/code/Mage/Catalog/Block/Product/View/Options/Type/Select.php. Look for the following code (in 1.4.2.0 it starts on line 52):</p>
<p><code><!-- p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco} span.s1 {color: #a10066} span.s2 {color: #2f00cf} -->if ($_option-&gt;getType() == Mage_Catalog_Model_Product_Option::OPTION_TYPE_DROP_DOWN) {</code></p>
<p><code> </code></p>
<p><code>$select-&gt;setName('options['.$_option-&gt;getid().']')</code></p>
<p><code> </code></p>
<p><code>-&gt;addOption('', $this-&gt;__('-- Please Select --'));</code></p>
<p>You&#8217;ll want to edit out the line that calls for the addOption():</p>
<p><code><!-- p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco} p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #599573} span.s1 {color: #a10066} span.s2 {color: #2f00cf} span.s3 {color: #000000} -->if ($_option-&gt;getType() == Mage_Catalog_Model_Product_Option::OPTION_TYPE_DROP_DOWN) {</code></p>
<p><code> </code></p>
<p><code>$select-&gt;setName('options['.$_option-&gt;getid().']') ; //&lt;- don't miss this semi-colon</code></p>
<p><code> </code></p>
<p><code>// -&gt;addOption('', $this-&gt;__('-- Please Select --'));</code></p>
<p>That&#8217;s it! Now refresh your browser and your Custom Option Drop-down should default to the first option in the sort order.</p>
<p><a rel="attachment wp-att-768" href="http://www.hybridforge.com/blog/766/software/magento-tips/magento-custom-product-option-default-value/attachment/product-custom-options-default/"><img class="aligncenter size-full wp-image-768" title="product-custom-options-default" src="http://www.hybridforge.com/blog/wp-content/uploads/product-custom-options-default.png" alt="" width="274" height="99" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.hybridforge.com/blog/766/software/magento-tips/magento-custom-product-option-default-value/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>5 Important Tools for Websites</title>
		<link>http://www.hybridforge.com/blog/761/seo/5-important-tools-for-websites/</link>
		<comments>http://www.hybridforge.com/blog/761/seo/5-important-tools-for-websites/#comments</comments>
		<pubDate>Thu, 26 May 2011 05:38:41 +0000</pubDate>
		<dc:creator>Geoff Kliza</dc:creator>
				<category><![CDATA[Search Engine Optimization]]></category>

		<guid isPermaLink="false">http://www.hybridforge.com/blog/?p=761</guid>
		<description><![CDATA[Google Keyword Tool This tool is primarily for assessing the search volume and competition when setting up PPC campaigns. You can provide it with a list of terms, or point it at a web page. The trick with this tool is to point it at your key competitors pages to see how Google sees them [...]]]></description>
			<content:encoded><![CDATA[<h2>Google Keyword Tool</h2>
<p>This tool is primarily for assessing the search volume and competition when setting up PPC campaigns. You can provide it with a list of terms, or point it at a web page. The trick with this tool is to point it at your key competitors pages to see how Google sees them and then compare it to your own pages on the same topics. You can also use it to help guide your creative writing and ensure you have adequate density on your keywords.</p>
<p><a href="http://hybf.org/keyword" target="_blank">http://hybf.org/keyword</a></p>
<h2>Google SEO Primer</h2>
<p>This is a great resource for beginners who want to understand more about SEO. Google is still the giant in the search engine world, so it is important to pay attention to what they are telling you. The article has some great types of pitches to be cautious about when dealing with SEO consultants.</p>
<p><a href="http://hybf.org/seo" target="_blank">http://hybf.org/seo</a></p>
<h2>Google Places</h2>
<p>If you are a small business or cater primarily to your local community, then you need to make sure you are listed in Google Places. It is fast and easy to get set up, and it is an easy way to show up on the first page for search results. You will need a Google account to access Google Places.</p>
<p><a href="http://hybf.org/places" target="_blank">http://hybf.org/places</a></p>
<h2>Google Webmaster Tools</h2>
<p>This tool starts to get a bit more advanced, but it is a great resource to get an approximation of your search results. It provides insight into the keywords Google has indexed for your website, how you are ranking for specific search queries and change in position, and a listing of back links to your site. For more advanced users it tracks the status of the crawlers and can provide suggestions for improving the underlying site html. You will require a Google account to access Webmaster Tools.</p>
<p><a href="http://hybf.org/webmaster" target="_blank">http://hybf.org/webmaster</a></p>
<h2>Google Analytics</h2>
<p>Google Analytics is an advanced tool, but a must for measuring the success of any initiative you undertake with your website. You can track visitors, keywords, content, navigation paths, goals, and eCommerce. With the right level of data crunching, you can determine if visitors are using your site as you intend, and how you can improve the path from entry to goal conversion. You will need a Google Account to access Analytics.</p>
<p><a href="http://hybf.org/analytics" target="_blank">http://hybf.org/analytics</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.hybridforge.com/blog/761/seo/5-important-tools-for-websites/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Line of Business Web Apps with Microsoft ASP.Net MVC 2.0</title>
		<link>http://www.hybridforge.com/blog/752/software/line-of-business-web-apps-with-microsoft-asp-net-mvc-2-0/</link>
		<comments>http://www.hybridforge.com/blog/752/software/line-of-business-web-apps-with-microsoft-asp-net-mvc-2-0/#comments</comments>
		<pubDate>Mon, 14 Mar 2011 03:50:33 +0000</pubDate>
		<dc:creator>Chad Smith</dc:creator>
				<category><![CDATA[Line of Business]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://www.hybridforge.com/blog/?p=752</guid>
		<description><![CDATA[With the delivery of a number of successful line of business applications built with the Microsoft ASP.Net MVC 2.0 architecture we thought it was time to blog about our view of the framework versus traditional web forms. Both the Foundtastic web app for the City of Edmonton Transit department and the DOC-IT/SAMPLE-IT system in use [...]]]></description>
			<content:encoded><![CDATA[<p>With the delivery of a number of successful line of business applications built with the Microsoft ASP.Net MVC 2.0 architecture we thought it was time to blog about our view of the framework versus traditional web forms. Both the Foundtastic web app for the City of Edmonton Transit department and the DOC-IT/SAMPLE-IT system in use at the Wood Buffalo Environmental Association (WBEA) are excellent examples of custom web solutions leveraging ASP.Net MVC 2.0. In the case of the latter example a multi-million dollar scientific research operation is managed through the powerful DOC-IT/SAMPLE-IT web app. There are 3 significant improvements MVC brings to web app development for Microsoft environments: powerful client-side scripting, performance and testability.</p>
<p><strong>Brief Introduction to Microsoft ASP.Net Model-View-Controller (MVC) 2.0</strong></p>
<p>The Model-View-Controller pattern has been around for over three decades. It has been adapted for use in several user-interface frameworks. It is a very simple pattern that advocates the clear separation of responsibilities between the model (data), controller (logic &#038; orchestration) and the view (presentation). It has been observed to help produce more maintainable, structured applications. Web Forms and ASP.NET MVC differ radically in their adherence to separation of concerns best practices.</p>
<p><strong>jQuery &#038; client-side scripting</strong></p>
<p>In the early days of Web development, client-side script was mostly relegated to tasks such as validation. With the advent of Ajax this changed and a lot of complex JavaScript was written to create AJAX-enabled Web applications. This was tedious, complicated and error-prone work. Client-side scripting has a reputation for being quirky and difficult to get right. IDE support for the JavaScript language was lacking until recently. The language itself, while very capable, was not understood very well. The Document Object Model as implemented by different browsers caused several compatibility issues and generally earned its name as a difficult area to get right.</p>
<p>Over time, frameworks emerged to make this work easier. One such framework that emerged, and has quickly become the de facto standard for authoring client-side functionality, is the jQuery4 framework. jQuery makes it quite easy to work with client-side script. It abstracts away differences between common browser platforms and offers an elegant CSS-like syntax for targeting elements of the DOM. This, coupled with its fluid interface, has made client-side programming a joy.<br />
The Web Forms framework and the ASP.NET MVC framework differ substantially in their ability to work seamlessly with jQuery.</p>
<p><strong>Performance</strong></p>
<p>The ASP.NET MVC Framework allows for very lightweight markup. The application of unobtrusive JavaScript principles also leads to less markup being produced since it avoids repetitive inline markup such as that used for event subscriptions. Any state maintained by an MVC application is targeted and usually a small fraction of ViewState on similar Web Forms pages.</p>
<p>Performance differences are even more pronounced with Ajax applications. With Web Forms, the entire page lifecycle with all its associated traffic/code is required. This leads to much higher traffic back-and-forth with the server.</p>
<p><strong>Testing</strong></p>
<p>Solid and easy testing of business logic and data access is considered to be critical to the development of maintainable Web applications. Web Forms applications are very hard to test. This is primarily due to the following reasons:<br />
•	It remains hard to automate Web Forms applications without running them inside a complete hosting environment. It is not possible to easily simulate a complex hosting environment such as IIS.<br />
•	The view often contains business logic and presentation, making it very hard to test the business logic without testing the presentation.</p>
<p>In practice this meant that Web Forms applications were usually tested using elaborate UI automation tools or manual testing – an error-prone and expensive process.</p>
<p>ASP.NET MVC makes testing easy alleviating many of Web Forms barriers. All of the core components of ASP.NET MVC are designed to easily run from any unit testing container.  Furthermore, the entire MVC application is compiled within the Visual Studio development providing early indication of errors and problems.</p>
<p>I&#8217;ll be writing about deploying an MVC web app to the Microsoft Azure platform in an upcoming blog!</p>
<p>References:<br />
Microsoft Developers Network<br />
<a href="http://msdn.microsoft.com/en-us/">http://msdn.microsoft.com/en-us/</a><br />
IEEE &#8211; ACM<br />
<a href="http://portal.acm.org/citation.cfm?id=1088812">http://portal.acm.org/citation.cfm?id=1088812</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.hybridforge.com/blog/752/software/line-of-business-web-apps-with-microsoft-asp-net-mvc-2-0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Organize Magento CMS Pages Into Categories</title>
		<link>http://www.hybridforge.com/blog/728/software/magento-tips/organize-magento-cms-pages-into-categories/</link>
		<comments>http://www.hybridforge.com/blog/728/software/magento-tips/organize-magento-cms-pages-into-categories/#comments</comments>
		<pubDate>Mon, 18 Oct 2010 04:36:45 +0000</pubDate>
		<dc:creator>Geoff Kliza</dc:creator>
				<category><![CDATA[Magento Tips]]></category>

		<guid isPermaLink="false">http://www.hybridforge.com/blog/?p=728</guid>
		<description><![CDATA[Magento as a CMS Tool Magento continues to be one of the best shopping cart solutions in the market space. Although the architecture can be confusing and frightening at times, it is very powerful once you know how to use it. From merchandising your products, to exceptional SEO, all it takes are small adjustments to make your [...]]]></description>
			<content:encoded><![CDATA[<h2><strong>Magento as a CMS Tool</strong></h2>
<p>Magento continues to be one of the best shopping cart solutions in the market space. Although the architecture can be confusing and frightening at times, it is very powerful once you know how to use it. From merchandising your products, to exceptional SEO, all it takes are small adjustments to make your Magento implementation soar.</p>
<p>On many eCommerce sites, the content pages aren&#8217;t considered in the overall merchandising strategy. When used correctly, they can provide a wealth of product information, drive SEO results and therefore increase revenues. At first glance, Magento&#8217;s CMS pages look like they are just there to manage Terms and Conditions and some brief &#8220;About Us&#8221; content, so many merchants reach for other tools like WordPress to handle their content.</p>
<p>However, by using the URL rewrites, Static Blocks and a little extra work, Magento can render some rich, categorized content very effectively.</p>
<h2>Magento CMS Pages</h2>
<p>The first step to making this happen is in the creation of a new content page. Go to CMS-&gt;Pages and click on &#8220;Add New Page&#8221;.</p>
<p>The first thing that happens is you are prompted to input a Page Title and URL Key. Most often users enter a copy of the  page title in the URL Key, changing CAPS to lower case and replacing spaces with hyphens.</p>
<p>But Magento allows for just about any valid URL string you want to put in there. So, you can create content that is &#8216;category/sub-category/page-title&#8217;</p>
<p><a rel="attachment wp-att-729" href="http://www.hybridforge.com/blog/728/software/magento-tips/organize-magento-cms-pages-into-categories/attachment/magento-layered-cms/"><img class="aligncenter size-full wp-image-729" title="magento-layered-cms" src="http://www.hybridforge.com/blog/wp-content/uploads/magento-layered-cms.png" alt="" width="540" height="386" /></a></p>
<p>Using this method, you can create content in any sub-category you choose.</p>
<h2>Magento Static Block Driven Menu</h2>
<p>Now that we have categorized content, the next step is to create a menu that links to these content items. This is easily accomplished using static blocks to create the menu lists, then by pulling those lists into the layout as required.</p>
<p>You can use a single block for all of your categories, but you might find it provides more flexibility to create a static block per main category. Either way, the process is essentially the same.</p>
<p>Start by creating a new static block: CMS-&gt;Static Block and click on &#8220;Add New Block&#8221;.</p>
<p>Choose the category, or menu name, you want this static block to control as the Block Title. Use something descriptive for the Identifier. You can also leverage URL rewrites if you want have a multi-lingual shop and effectively switch between languages. (see our article on <a href="http://www.hybridforge.com/blog/685/software/magento-tips/magento-multi-language-cms/">setting up multi language content in Magento</a>).</p>
<p>Although the WYSIWYG editor in Magento 1.4.x is an excellent addition, I&#8217;d recommend using the HTML view for this. Add the nested list of categories, sub-categories, sub-sub-categories, etc as follows (assuming the static block is for a Category):<br />
<code><br />
</code></p>
<p><code></p>
<div id="_mcePaste">&lt;ul&gt;</div>
<div id="_mcePaste">&lt;li&gt;&lt;a href="{{store direct_url="category/sub-category1"}}"&gt;Sub-Category1&lt;/a&gt;&lt;/li&gt;</div>
<div>&lt;ul&gt;</div>
<div>&lt;li&gt;&lt;a href="{{store direct_url="category/sub-category1/sub-sub-category1"}}"&gt;Sub-Sub-Category1-1&lt;/a&gt;&lt;/li&gt;</div>
<div>&lt;li&gt;&lt;a href="{{store direct_url="category/sub-category1/sub-sub-category2"}}"&gt;Sub-Sub-Category2-2&lt;/a&gt;&lt;/li&gt;</div>
<div>&lt;/ul&gt;</div>
<div id="_mcePaste">&lt;li&gt;&lt;a href="{{store direct_url="category/sub-category2"}}"&gt;Sub-Category2&lt;/a&gt;&lt;/li&gt;</div>
<div>&lt;ul&gt;</div>
<div>&lt;li&gt;&lt;a href="{{store direct_url="category/sub-category2/sub-sub-category1"}}"&gt;Sub-Sub-Category2-1&lt;/a&gt;&lt;/li&gt;</div>
<div>&lt;li&gt;&lt;a href="{{store direct_url="category/sub-category2/sub-sub-category2"}}"&gt;Sub-Sub-Category2-2&lt;/a&gt;&lt;/li&gt;</div>
<div id="_mcePaste">&lt;/ul&gt;</div>
<div>&lt;/ul&gt;</div>
<p></code></p>
<p>You can pull this static block into your design by calling the static block in the tempate. You will likely set up the menus in the header.phtml file for example, so you would add a line such as:</p>
<div><code>&lt;?php echo $this-&gt;getLayout()-&gt;createBlock('cms/block')-&gt;setBlockId('category')-&gt;toHtml() ?&gt;</code></div>
<p>Use your favorite .css or .js technique to expand the menu if you&#8217;re putting it in a horizontal menu, or just let it fly as a tree list in the margin. You now have some easy-to-navigate and nicely organized content on your site. Not to mention the search engine optimization lift you&#8217;ll get out of having the category descriptor in the URL.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hybridforge.com/blog/728/software/magento-tips/organize-magento-cms-pages-into-categories/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Adding Google Analytics to Magento and Optimizing Page Speed</title>
		<link>http://www.hybridforge.com/blog/704/software/magento-tips/adding-google-analytics-to-magento-and-optimizing-page-speed/</link>
		<comments>http://www.hybridforge.com/blog/704/software/magento-tips/adding-google-analytics-to-magento-and-optimizing-page-speed/#comments</comments>
		<pubDate>Thu, 02 Sep 2010 21:49:16 +0000</pubDate>
		<dc:creator>Geoff Kliza</dc:creator>
				<category><![CDATA[Magento Tips]]></category>

		<guid isPermaLink="false">http://www.hybridforge.com/blog/?p=704</guid>
		<description><![CDATA[Add the Google Analytics Tracking Code OK, this part is really easy. Once you&#8217;ve signed up for your Analytics account, Google will give you a tracking code. It will be a number that looks like &#8220;UA-xxxxxx-x&#8221;. Copy this tracking code. Log in to your Magento admin panel. Go to System -&#62; Configuration. In the left [...]]]></description>
			<content:encoded><![CDATA[<h2>Add the Google Analytics Tracking Code</h2>
<p>OK, this part is really easy. Once you&#8217;ve signed up for your Analytics account, Google will give you a tracking code. It will be a number that looks like &#8220;UA-xxxxxx-x&#8221;. Copy this tracking code.</p>
<p>Log in to your Magento admin panel. Go to System -&gt; Configuration. In the left hand menu, click on the &#8220;Google API&#8221; tab under the Sales heading and open the Google Analytics accordion menu. Set Enable to &#8220;Yes&#8221; and paste the Google tracking code in the Account Number field.</p>
<p><a rel="attachment wp-att-705" href="http://www.hybridforge.com/blog/704/software/magento-tips/adding-google-analytics-to-magento-and-optimizing-page-speed/attachment/mangento-analytics/"><img class="aligncenter size-full wp-image-705" title="mangento-analytics" src="http://www.hybridforge.com/blog/wp-content/uploads/mangento-analytics.png" alt="Magento Google Analytics Tracking Code Setup" width="678" height="332" /></a></p>
<p>Click &#8220;Save Config&#8221; at the top right and you&#8217;re done.</p>
<h2>﻿<strong>Top or Bottom?</strong></h2>
<p>If you&#8217;ve ever checked you may notice that the Google Analytics tracking code was typically placed at the bottom of the page, just before the &lt;/body&gt; tag. If you&#8217;re running Magento 1.4.x.x, you may notice that the analytics code is now placed right at the top of the page.</p>
<p>Google&#8217;s original code looked like this:</p>
<p><code><span style="font-family: Consolas, Monaco, 'Courier New', Courier, monospace; line-height: 18px; font-size: 12px; white-space: pre;">&lt;!-- BEGIN GOOGLE ANALYTICS CODE --&gt;</span></code></p>
<p><code> </code></p>
<pre id="line344"><code>&lt;script type="text/javascript"&gt;
//&lt;![CDATA[
var gaJsHost = (("https:" == document.location.protocol) ? </code></pre>
<pre id="line344"><code>"https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js'</code></pre>
<pre id="line344"><code> type='text/javascript'%3E%3C/script%3E"));
//]]&gt;
&lt;/script&gt;
&lt;script type="text/javascript"&gt;
//&lt;![CDATA[
var pageTracker = _gat._getTracker("UA-xxxxxxxx-x");
pageTracker._trackPageview("/");
//]]&gt;
&lt;/script&gt;
&lt;!-- END GOOGLE ANALYTICS CODE --&gt;</code></pre>
<p>The old code could slow down the pageload time while Google loaded some fairly hefty javascript libraries to handle the analytics tracking. While the library downloaded, nothing else could happen on the page. Slow page load times make for bad user experience, and with Google&#8217;s recent changes in it&#8217;s Page Rank algorithms, page load times have an impact on SEO. By placing the code snippet at the bottom of the page, it would ensure that the analytics library was the <em>last</em> thing done on the page.</p>
<p>One concern with this method was that if a user bounced or otherwise left the page before the library downloaded, then any tracking of that event was lost.</p>
<p>Google recently changed the javascript code snipped to utilize ajax to asynchronously handle loading the libraries. This means that the time to load the library is no longer a factor. Google&#8217;s new best practices suggest that the code snippet should be added close to the top of the page so that all page events will be captured no matter how fast the user reacts.</p>
<p>Google&#8217;s new ajax code snippet looks like:</p>
<p><code> </code></p>
<p><code></p>
<pre id="line840">&lt;!-- BEGIN GOOGLE ANALYTICS CODE --&gt;</pre>
<p></code></p>
<pre id="line849"><code>&lt;script type="text/javascript"&gt;
//&lt;![CDATA[
    (function() {
        var ga = document.createElement('script'); ga.type = </code></pre>
<pre id="line849"><code>'text/javascript'; </code><span style="font-family: monospace;">ga.async = true;</span></pre>
<pre id="line849"><code>        ga.src = ('https:' == document.location.protocol ? </code></pre>
<pre id="line849"><code>'https://ssl' : 'http://www') </code><span style="font-family: monospace;">+ '.google-analytics.com/ga.js';</span></pre>
<pre id="line849"><code>        (document.getElementsByTagName('head')[0] || </code></pre>
<pre id="line849"><code>document.getElementsByTagName('body')[0])</code></pre>
<pre id="line849"><code>.appendChild(ga);
    })();

    var _gaq = _gaq || [];
    _gaq.push(["_setAccount", "UA-xxxxxxxx-x"]);
    _gaq.push(["_trackPageview", "/"]);
//]]&gt;
&lt;/script&gt;
&lt;!-- END GOOGLE ANALYTICS CODE --&gt;</code></pre>
<h2>Configuring Analytics Code in Magento</h2>
<p>If you are inclined to update Magento 1.3.x.x to the new asynchronous code snippet or want to move the code snippet around the site, there are two files you&#8217;ll want to concern yourself with.</p>
<h3>Change the old ga.js Code to the Asynchronous</h3>
<p>The first is the code snippet itself. It is located in &#8216;/app/code/core/Mage/GoogleAnalytics/Block/Ga.php&#8217;. You will want to find the _toHtml() method and look for:</p>
<p><code> </code></p>
<p><code></p>
<div id="_mcePaste">$this-&gt;addText('</div>
<div id="_mcePaste">&lt;!-- BEGIN GOOGLE ANALYTICS CODE --&gt;</div>
<div id="_mcePaste">&lt;script type="text/javascript"&gt;</div>
<div id="_mcePaste">//&lt;![CDATA[</div>
<div id="_mcePaste">var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");</div>
<div id="_mcePaste">document.write(unescape("%3Cscript src=\'" + gaJsHost + "google-analytics.com/ga.js\' type=\'text/javascript\'%3E%3C/scri$</div>
<div id="_mcePaste">//]]&gt;</div>
<div id="_mcePaste">&lt;/script&gt;</div>
<div id="_mcePaste">&lt;script type="text/javascript"&gt;</div>
<div id="_mcePaste">//&lt;![CDATA[</div>
<div id="_mcePaste">var pageTracker = _gat._getTracker("' . $this-&gt;getAccount() . '");</div>
<div id="_mcePaste">pageTracker._trackPageview("'.$this-&gt;getPageName().'");</div>
<div id="_mcePaste">//]]&gt;</div>
<div id="_mcePaste">&lt;/script&gt;</div>
<div id="_mcePaste">&lt;!-- END GOOGLE ANALYTICS CODE --&gt;</div>
<div id="_mcePaste">');</div>
<p></code></p>
<p>You can update that code to:</p>
<p><code>$this-&gt;addText('</code></p>
<p><code> </code></p>
<p><code>&lt;!-- BEGIN GOOGLE ANALYTICS CODE --&gt;</code></p>
<p><code>&lt;script type="text/javascript"&gt;</code></p>
<p><code>//&lt;![CDATA[</code></p>
<p><code>(function() {</code></p>
<p><code>var ga = document.createElement(\'script\'); ga.type = \'text/javascript\'; ga.async = true;</p>
<p>ga.src = (\'https:\' == document.location.protocol ? \'https://ssl\' : \'http://www\') + \'.google-analytics.com/ga.js\';</p>
<p>(document.getElementsByTagName(\'head\')[0] || document.getElementsByTagName(\'body\')[0]).appendChild(ga);</p>
<p>})();</p>
<p>var _gaq = _gaq || [];</p>
<p>_gaq.push(["_setAccount", "' . $this-&gt;getAccount() . '"]);</p>
<p>_gaq.push(["_trackPageview", "'.$this-&gt;getPageName().'"]);</p>
<p>//]]&gt;</p>
<p>&lt;/script&gt;</p>
<p>&lt;!-- END GOOGLE ANALYTICS CODE --&gt;<br />
');<br />
</code></p>
<h3>Change the Location of the Code Snippet on the Page</h3>
<p>Once that is updated, you can change the position of the code snippet on the page by modifying the &#8216;/app/design/frontend/base/default/default/googleanalytics.xml&#8217; file (or in the correct sub-directory for your template if applicable).</p>
<p>Look for the following code:</p>
<p><code>&lt;reference name="before_body_end"&gt;</code></p>
<p><code> </code></p>
<p><code>&lt;block type="googleanalytics/ga" name="google_analytics" as="google_analytics" /&gt;</code></p>
<p><code> </code></p>
<p><code>&lt;/reference&gt;<br />
</code><br />
and change &#8220;before_body_end&#8221; to &#8220;after_body_start&#8221; to move the code snippet to the top of the page.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hybridforge.com/blog/704/software/magento-tips/adding-google-analytics-to-magento-and-optimizing-page-speed/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Magento Multi-Language CMS</title>
		<link>http://www.hybridforge.com/blog/685/software/magento-tips/magento-multi-language-cms/</link>
		<comments>http://www.hybridforge.com/blog/685/software/magento-tips/magento-multi-language-cms/#comments</comments>
		<pubDate>Tue, 10 Aug 2010 05:25:48 +0000</pubDate>
		<dc:creator>Geoff Kliza</dc:creator>
				<category><![CDATA[Magento Tips]]></category>

		<guid isPermaLink="false">http://www.hybridforge.com/blog/?p=685</guid>
		<description><![CDATA[The problem: no language settings in Magento&#8217;s CMS pages causes 404 errors If you are developing or planning to develop a multi-lingual site in Magento, you may have noticed that there are no language settings in the CMS content pages. You can select the store view where the page will display and have different content [...]]]></description>
			<content:encoded><![CDATA[<h2>The problem: no language settings in Magento&#8217;s CMS pages causes 404 errors</h2>
<p>If you are developing or planning to develop a multi-lingual site in Magento, you may have noticed that there are no language settings in the CMS content pages. You can select the store view where the page will display and have different content pages show up in each view of the store, , say one called &#8216;english-content-item&#8217; enabled only for the English view and called &#8216;french-content-item&#8217; enabled only for the French view. Using static blocks and different templates for each language you can make this work.</p>
<p>For example, we have some English language menu links in a static block called &#8216;header_links&#8217; with a list of menu items pointing to the English content pages , and we have some French language menu links in a static block called &#8220;header_links_fr&#8217; with a list of menu items pointing to the French content pages. We would modify the template/page/html/header.phtml file in our English view template with the following code:</p>
<p><code>getLayout()-&gt;createBlock('cms/block')-&gt;setBlockId('header_links')-&gt;toHtml() ?&gt;</code></p>
<p>and the French view template with the following code:</p>
<p><code>getLayout()-&gt;createBlock('cms/block')-&gt;setBlockId('header_links_fr')-&gt;toHtml() ?&gt;</code></p>
<p>That&#8217;s pretty straight forward, but here&#8217;s the rub. If you are in the English content item and switch to the French language, you&#8217;ll get a 404 error. The reason for this is that the URL in the English view is http://yoursite.com/english-content-item, for example. When you switch to the French language, the URL is http://yoursite.com/fr/english-content-item.</p>
<p>Since the &#8216;english-content-item&#8217; isn&#8217;t enabled for the French store view, you get a 404. This is unlike the product pages, which can have separate content defined per store view.</p>
<h2>The solution: URL rewrites to the rescue</h2>
<p>The solution to Magento&#8217;s lack of multi-language CMS is to use the built in Catalog URL Rewrites under Catalog-&gt;URL Rewrite Management. By using permanent 301 redirects, not only can you avoid the 404 errors, but you can keep the URLs specific to each language &#8211; that&#8217;s good SEO!</p>
<p>In the URL rewrite manager, you&#8217;ll want to click on Add URL Rewrite and select &#8220;Custom&#8221; from the drop down list.</p>
<p><a rel="attachment wp-att-693" href="http://www.hybridforge.com/blog/685/software/magento-tips/magento-multi-language-cms/attachment/url-rewrites-2/"><img class="aligncenter size-full wp-image-693" title="magento-url-rewrites" src="http://www.hybridforge.com/blog/wp-content/uploads/url-rewrites1.jpg" alt="magento-url-rewrites" width="400" height="356" /></a></p>
<p>Under &#8220;Store&#8221; you will want to pick the first store, in this case we&#8217;ll start with the English store. &#8220;ID Path&#8221; and &#8220;Request Path&#8221; in the case of the CMS pages are going to be the same. In this case we want the French language site to properly redirect when switching to English, so we will use the &#8220;french-content-item&#8221; for the ID and Request paths.</p>
<p>Next we fill in the target path. In the case of the switch to the English site, we want it to redirect to &#8220;english-content-item&#8221;. We want it to be a 301 Permanent Redirect. You can add whatever description you need and Save.</p>
<p>Now, do the same for the French site, so use &#8220;english-content-item&#8221; for the ID and Request paths and &#8220;french-content-item&#8221; for the target path. Be sure select the French view under &#8220;Store&#8221;. Save that.</p>
<p>Of course, don&#8217;t forget to refresh your cache and make sure you re-index the catalog rewrites if needed. Now when you change languages on the front-end, the CMS page will switch to the appropriate page for you. No more 404&#8242;s and you get nice clean URLs, which means happy robots and better SEO results.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hybridforge.com/blog/685/software/magento-tips/magento-multi-language-cms/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Owl iLibrary iPad Edition Launched</title>
		<link>http://www.hybridforge.com/blog/656/press/owl-ilibrary-ipad-edition-launched/</link>
		<comments>http://www.hybridforge.com/blog/656/press/owl-ilibrary-ipad-edition-launched/#comments</comments>
		<pubDate>Wed, 02 Jun 2010 23:05:15 +0000</pubDate>
		<dc:creator>Geoff Kliza</dc:creator>
				<category><![CDATA[Press Releases]]></category>

		<guid isPermaLink="false">http://www.hybridforge.com/blog/?p=656</guid>
		<description><![CDATA[EDMONTON – June 2, 2010 – Hybrid Forge, in partnership with the Yellowhead Regional Library, has released an iPad application, based on the Owl iLibrary software called YourLibrary, to give patrons quick online access to the Regional Library’s collections. “We’ve already seen the popularity of iPads in Canada soar,” said Chad Smith, of Hybrid Forge. [...]]]></description>
			<content:encoded><![CDATA[<p>EDMONTON – June 2, 2010 – Hybrid Forge, in partnership with the Yellowhead Regional Library, has released an <a href="http://www.hybridforge.com/iphone/owl-ilibrary/ipad.php">iPad application</a>, based on the <a href="http://www.hybridforge.com/iphone/owl-ilibrary/ipad.php">Owl iLibrary software</a> called YourLibrary, to give patrons quick online access to the Regional Library’s collections.</p>
<p>“We’ve already seen the popularity of iPads in Canada soar,” said Chad Smith, of Hybrid Forge. “We were pleased to work with the Yellowhead Library to develop this leading edge app that helps people find titles, reserve materials, renew books and much more. Libraries are so much more than people think and having us work on this app shows leadership in using technology to increase access.”</p>
<p>The Yellowhead Regional Library (YRL) serves more than 250,000 residents in 48 municipalities, and 13,000 students in four school districts. “Because the territory is so expansive, the YourLibrary app can be extremely helpful,” said Kevin Dodds, Director of the Yellowhead Regional Library. “Materials unavailable in one library can be ordered from another library, for example, all from the user’s iPad.”</p>
<h3>Watch the Youtube Video on YourLibrary</h3>
<p><object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/xzJsnVAlN_I&#038;hl=en_US&#038;fs=1&#038;"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/xzJsnVAlN_I&#038;hl=en_US&#038;fs=1&#038;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object></p>
<h3>YourLibrary App Features for Patrons and Librarians:</h3>
<ul>
<li>Search nearly three million materials in the TRACpac system including books, CDs, DVDs and other materials using a keyword, title, author or ISBN number</li>
<li>View top 10 fiction and non-fiction listings</li>
<li>Get advice on selections through the Novelist integrated readers’ advisory service</li>
<li>Read book reviews written by readers from around the world</li>
<li>Place, view or cancel holds on items</li>
<li>Renew materials</li>
<li>Check the status of the library account, search for other libraries in the YRL</li>
<li>And, when checking materials out of the library, the app will display the cardholder’s barcode for easy scanning</li>
</ul>
<p>“We’re hoping to expand the interest in this application – it’s certainly portable and can be customized for any library system.” said Chad. “The app is a free download for everyone, including those in the Yellowhead region – one more reason it’s easy and convenient!”</p>
<h3>Watch the Shaw TV Interview by Stephanie Raddatz</h3>
<p><object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/Z4jHRzyDN9Y&#038;hl=en_US&#038;fs=1&#038;"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/Z4jHRzyDN9Y&#038;hl=en_US&#038;fs=1&#038;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object></p>
<h3>ABOUT HYBRID FORGE</h3>
<p>Hybrid Forge is an Edmonton-based firm providing comprehensive e-commerce integration, website design, and custom software development. Visit www.hybridforge.com for more.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hybridforge.com/blog/656/press/owl-ilibrary-ipad-edition-launched/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

