<?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/"
	>

<channel>
	<title>Barcode Knowledge and More</title>
	<atom:link href="http://www.barcodeschool.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.barcodeschool.com</link>
	<description>dedicated on barcode</description>
	<pubDate>Wed, 16 Aug 2017 19:27:47 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Morovia.com has switched https site wide</title>
		<link>http://www.barcodeschool.com/2017/08/moroviacom-has-switched-https-site-wide/</link>
		<comments>http://www.barcodeschool.com/2017/08/moroviacom-has-switched-https-site-wide/#comments</comments>
		<pubDate>Wed, 16 Aug 2017 19:27:47 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.barcodeschool.com/?p=331</guid>
		<description><![CDATA[Morovia switches its main domain to secure http (https) protocol on August 16, 2017.]]></description>
			<content:encoded><![CDATA[<p>Today we switched the whole domain www.morovia.com to https. In recent years more and more web sites are switching to https (the secure http protocol). You probably won&#8217;t notice the difference. However it is remarkable for us. Because we have a modular web site design, there are not a lot of changes in the code. And best of all, we can switch back to normal http at any time.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.barcodeschool.com/2017/08/moroviacom-has-switched-https-site-wide/feed/</wfw:commentRss>
		</item>
		<item>
		<title>We got a big server</title>
		<link>http://www.barcodeschool.com/2013/03/we-got-a-big-server/</link>
		<comments>http://www.barcodeschool.com/2013/03/we-got-a-big-server/#comments</comments>
		<pubDate>Thu, 14 Mar 2013 19:20:42 +0000</pubDate>
		<dc:creator>Sherwood Hu</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.barcodeschool.com/?p=316</guid>
		<description><![CDATA[Norco RPC-4224 case, new server, huge storage.]]></description>
			<content:encoded><![CDATA[<p>We  just spend a few days to assemble a server for our company to use in the next 5 years. The old one is a 1U supermicro chasis. The tag on it reads &#8220;2005&#8243;. yes it has a floppy drive on it.</p>
<p><img class="alignleft size-medium wp-image-321" title="existing 1U server" src="http://www.barcodeschool.com/wp-content/uploads/2013/03/img_21451-300x225.jpg" alt="existing 1U server" width="300" height="225" /></p>
<p>We are not happy that the old server does not have vast storage capability, so we bough a Norco 4224 case that can hold 24 hard drives. If we put 2T drives into each bay, we will have a total storage of 48T bytes.</p>
<p><img class="alignleft size-medium wp-image-324" title="Norco 4224 24-bay case" src="http://www.barcodeschool.com/wp-content/uploads/2013/03/img_2146-300x118.jpg" alt="Norco 4224 24-bay case" width="600" /></p>
<p>Plenty of storage for us. We are going to migrate many services to this new server in the near future.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.barcodeschool.com/2013/03/we-got-a-big-server/feed/</wfw:commentRss>
		</item>
		<item>
		<title>QR Business Card Maker now supports Unicode!</title>
		<link>http://www.barcodeschool.com/2012/03/qr-business-card-now-support-unicode/</link>
		<comments>http://www.barcodeschool.com/2012/03/qr-business-card-now-support-unicode/#comments</comments>
		<pubDate>Thu, 08 Mar 2012 18:01:23 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Barcode Formats]]></category>

		<category><![CDATA[PDF Software]]></category>

		<category><![CDATA[Programming]]></category>

		<category><![CDATA[Business Card]]></category>

		<category><![CDATA[Free Utilities]]></category>

		<category><![CDATA[QR Code]]></category>

		<guid isPermaLink="false">http://www.barcodeschool.com/?p=311</guid>
		<description><![CDATA[QR Business Card Maker]]></description>
			<content:encoded><![CDATA[<p>Now the contact information can encode Unicode characters with our <a href="http://www.morovia.com/free-online-barcode-generator/qrcode-businesscard-maker.html">free QR code business card maker</a>.  Previously characters outside ISO8859-1 are filtered. Now they show up correctly. </p>
<p><img src="http://www.barcodeschool.com/wp-content/uploads/2012/03/qbiz068fdda59db84be4033961eea87e42cd.png" alt="QR Business Card with Unicode" title="QR Business Card with Unicode" width="336" height="192" class="alignnone size-full wp-image-312" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.barcodeschool.com/2012/03/qr-business-card-now-support-unicode/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Resumable Download at morovia.com</title>
		<link>http://www.barcodeschool.com/2012/03/resumable-download-at-moroviacom/</link>
		<comments>http://www.barcodeschool.com/2012/03/resumable-download-at-moroviacom/#comments</comments>
		<pubDate>Mon, 05 Mar 2012 19:19:11 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.barcodeschool.com/?p=305</guid>
		<description><![CDATA[Recently we implemented resumable download feature at our web site. Through this feature user can pause a download, and resume at any time back. This feature also supports download accelerators. 
Is this a big deal? Certainly not. We used to server trial downloads in a public accessible directory and web server automatically has this feature. [...]]]></description>
			<content:encoded><![CDATA[<p>Recently we implemented resumable download feature at our web site. Through this feature user can pause a download, and resume at any time back. This feature also supports download accelerators. </p>
<p>Is this a big deal? Certainly not. We used to server trial downloads in a public accessible directory and web server automatically has this feature. However, we want to our user to get *versioned* filenames, as it will be easy for our users to tell which version they downloaded. Implementing resumable downloads in a scripting language is not a trivial task. </p>
<p><div id="attachment_307" class="wp-caption alignnone" style="width: 310px"><img src="http://www.barcodeschool.com/wp-content/uploads/2012/03/resumable-download-in-firefox-300x89.png" alt="Resumable download in Firefox" title="Resumable download in Firefox" width="300" height="89" class="size-medium wp-image-307" /><p class="wp-caption-text">Resumable download in Firefox</p></div></p>
<p><div id="attachment_308" class="wp-caption alignnone" style="width: 310px"><img src="http://www.barcodeschool.com/wp-content/uploads/2012/03/resumable-download-in-internet-explorer-300x25.png" alt="Resumable Download in Internet Explorer" title="resumable-download-in-internet-explorer" width="300" height="25" class="size-medium wp-image-308" /><p class="wp-caption-text">Resumable Download in Internet Explorer</p></div></p>
]]></content:encoded>
			<wfw:commentRss>http://www.barcodeschool.com/2012/03/resumable-download-at-moroviacom/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Using JanRain OpenID with Zend Framework</title>
		<link>http://www.barcodeschool.com/2011/12/using-janrain-openid-with-zend-framework/</link>
		<comments>http://www.barcodeschool.com/2011/12/using-janrain-openid-with-zend-framework/#comments</comments>
		<pubDate>Sun, 11 Dec 2011 03:04:39 +0000</pubDate>
		<dc:creator>Sherwood Hu</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<category><![CDATA[OpenID]]></category>

		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://www.barcodeschool.com/2011/12/using-janrain-openid-with-zend-framework/</guid>
		<description><![CDATA[We are currently working on an OpenID consumer implementation. We looked into the Zend_OpenID - unfortunately it did not work. We are unable to get it work with Google. The remaining choice is the excellent JanRain library. 
OK, the Jan rain library is not PHP 5.3 friendly. There are several warnings if you try included [...]]]></description>
			<content:encoded><![CDATA[<p>We are currently working on an OpenID consumer implementation. We looked into the Zend_OpenID - unfortunately it did not work. We are unable to get it work with Google. The remaining choice is the excellent <a href="http://www.openidenabled.com/php-openid/" target="_blank">JanRain library</a>. </p>
<p>OK, the Jan rain library is not PHP 5.3 friendly. There are several warnings if you try included consumer test. The library also requires several extensions. To start you&#8217;d better read the README first and run the detect.php under its example directory. Fortunately, those warnings are easy to deal with and I won&#8217;t repeat them here.</p>
<p> <code><span style="color: #000000">$path = ini_get(&#8217;include_path&#8217;);      <br />$path = APPLICATION_PATH . &#8216;/../library/openid-php&#8217; . PATH_SEPARATOR . $path;       <br />ini_set(&#8217;include_path&#8217;, $path);       </p>
<p>require_once &quot;Auth/OpenID/Consumer.php&quot;;       <br />require_once &quot;Auth/OpenID/FileStore.php&quot;;       <br />require_once &quot;Auth/OpenID/SReg.php&quot;;       <br />require_once &quot;Auth/OpenID/PAPE.php&quot;;       </p>
<p>class OpenidController extends Zend_Controller_Action       <br />{       <br />&#160; public function init()       <br />&#160; {       <br />&#160;&#160;&#160; $this-&gt;session = new Zend_Session_Namespace(&#8217;openid&#8217;);       <br />&#160;&#160;&#160; $this-&gt;store = $this-&gt;getFileStore();       <br />&#160;&#160;&#160; $this-&gt;consumer = new Auth_OpenID_Consumer($this-&gt;store);       <br />&#160; }       <br />&#160;&#160; <br />&#160;&#160; /** for testing only. This is not necessary as openid_identifier       <br />&#160; *&#160; is captured in the URL. */       <br />&#160; public function indexAction()&#160; <br />&#160; {       <br />&#160; }       <br />&#160;&#160; <br />&#160; public function tryAction()&#160; <br />&#160; {       <br />&#160;&#160;&#160; $this-&gt;openid = $_GET['openid_identifier'];       <br />&#160;&#160;&#160; try {       <br />&#160;&#160;&#160;&#160;&#160; // Make sure the user entered something.       <br />&#160;&#160;&#160;&#160;&#160; if(strlen($this-&gt;openid) == 0) {       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; throw new Exception(&#8217;OpenID is empty.&#8217;);       <br />&#160;&#160;&#160;&#160;&#160; }       </p>
<p>&#160;&#160;&#160;&#160;&#160; // Try to start an openid authentication.       <br />&#160;&#160;&#160;&#160;&#160; $auth_request = $this-&gt;consumer-&gt;begin($this-&gt;openid);       </p>
<p>&#160;&#160;&#160;&#160;&#160; if(!$auth_request) {       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; throw new Exception(&quot;No Auth Request&quot;);       <br />&#160;&#160;&#160;&#160;&#160; }       <br />&#160;&#160;&#160;&#160;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160; $sreg_request = Auth_OpenID_SRegRequest::build(       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; // Required       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; array(&#8217;nickname&#8217;),       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; // Optional       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; array(&#8217;fullname&#8217;, &#8216;email&#8217;));       <br />&#160;&#160;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160; if ($sreg_request) {       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; $auth_request-&gt;addExtension($sreg_request);       <br />&#160;&#160;&#160;&#160;&#160; }       <br />&#160;&#160;&#160;&#160;&#160;&#160; </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160; $redirect_url = $auth_request       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; -&gt;RedirectURL($this-&gt;getTrustRoot(),$this-&gt;getReturnTo());       </p>
<p>&#160;&#160;&#160;&#160;&#160; if (Auth_OpenID::isFailure($redirect_url)) {       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; throw new Exception(&quot;Could not redirect to server: &quot;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; . $redirect_url-&gt;message);       <br />&#160;&#160;&#160;&#160;&#160; }       </p>
<p>&#160;&#160;&#160; } catch (Exception $e) {       <br />&#160;&#160;&#160;&#160;&#160; $this-&gt;view-&gt;error = $e-&gt;getMessage();       <br />&#160;&#160;&#160;&#160;&#160; $this-&gt;render(&#8217;index&#8217;);       <br />&#160;&#160;&#160;&#160;&#160; return;       <br />&#160;&#160;&#160; }       </p>
<p>&#160;&#160;&#160; $this-&gt;_redirect($redirect_url);       <br />&#160; }       <br />&#160;&#160;&#160;&#160; <br />&#160; private $session;       <br />&#160; private $store;       <br />&#160; private $consumer;       <br />&#160; private $openid;       </p>
<p>&#160; public function getFileStore()&#160; <br />&#160; {       <br />&#160;&#160;&#160; /**       <br />&#160;&#160;&#160;&#160; * This is where the example will store its OpenID information.       <br />&#160;&#160;&#160;&#160; * You should change this path if you want the example store to be       <br />&#160;&#160;&#160;&#160; * created elsewhere.&#160; After you&#8217;re done playing with the example       <br />&#160;&#160;&#160;&#160; * script, you&#8217;ll have to remove this directory manually.       <br />&#160;&#160;&#160;&#160; */       <br />&#160;&#160;&#160; $store_path = null;       <br />&#160;&#160;&#160; if (function_exists(&#8217;sys_get_temp_dir&#8217;)) {       <br />&#160;&#160;&#160;&#160;&#160; $store_path = sys_get_temp_dir();       <br />&#160;&#160;&#160; }       <br />&#160;&#160;&#160; else {       <br />&#160;&#160;&#160;&#160;&#160; if (strpos(PHP_OS, &#8216;WIN&#8217;) === 0) {       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; $store_path = $_ENV['TMP'];       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (!isset($store_path)) {       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; $dir = &#8216;C:\Windows\Temp&#8217;;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }       <br />&#160;&#160;&#160;&#160;&#160; }       <br />&#160;&#160;&#160;&#160;&#160; else {       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; $store_path = @$_ENV['TMPDIR'];       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (!isset($store_path)) {       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; $store_path = &#8216;/tmp&#8217;;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }       <br />&#160;&#160;&#160;&#160;&#160; }       <br />&#160;&#160;&#160; }       <br />&#160;&#160;&#160; $store_path .= DIRECTORY_SEPARATOR . &#8216;_atlantis_openid&#8217;;       <br />&#160;&#160; <br />&#160;&#160;&#160; if (!file_exists($store_path) &amp;&amp;       <br />&#160;&#160;&#160;&#160;&#160; !mkdir($store_path)) {       <br />&#160;&#160;&#160;&#160;&#160; print &quot;Could not create the FileStore directory &#8216;$store_path&#8217;. &quot;.       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &quot; Please check the effective permissions.&quot;;       <br />&#160;&#160;&#160;&#160;&#160; exit(0);       <br />&#160;&#160;&#160; }       <br />&#160;&#160;&#160; $r = new Auth_OpenID_FileStore($store_path);       </p>
<p>&#160;&#160;&#160; return $r;       <br />&#160; }       <br />&#160;&#160; <br />&#160; /**       <br />&#160;&#160; * When the identity provider is done having their       <br />&#160;&#160; * moment with the user they get returned to this action.       <br />&#160;&#160; * Here we look at the response status codes to decide       <br />&#160;&#160; * to if they were authenticated or not.       <br />&#160;&#160; */       <br />&#160; public function finishAction()&#160; <br />&#160; {       <br />&#160;&#160;&#160;&#160;&#160; $return_to = $this-&gt;getReturnTo();       <br />&#160;&#160;&#160;&#160;&#160; $response = $this-&gt;consumer-&gt;complete($return_to);       <br />&#160;&#160;&#160;&#160;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160; if($response-&gt;status == Auth_OpenID_CANCEL) {       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; $this-&gt;view-&gt;error = &#8216;Verification cancelled.&#8217;;       <br />&#160;&#160;&#160;&#160;&#160; } else if ($response-&gt;status == Auth_OpenID_FAILURE) {       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; $this-&gt;view-&gt;error = &quot;OpenID authentication failed: &quot;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; . $response-&gt;message;       <br />&#160;&#160;&#160;&#160;&#160; } else if ($response-&gt;status == Auth_OpenID_SUCCESS) {       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; $this-&gt;view-&gt;error =&#160; &quot;Success&quot;;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; $auth = Zend_Auth::getInstance();       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; $adapter = new Application_Model_Account_OpenIDAdapter($response-&gt;identity_url);       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; $result = $auth-&gt;authenticate($adapter);       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; if ($result-&gt;isValid()) {       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; $this-&gt;_redirect(&#8217;/');       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }       <br />&#160;&#160;&#160;&#160;&#160; }       <br />&#160;&#160;&#160; $this-&gt;_redirect(&#8217;/account/index&#8217;);       <br />&#160; }       </p>
<p>&#160; private function getScheme()&#160; <br />&#160; {       <br />&#160;&#160;&#160; $scheme = &#8216;http&#8217;;       <br />&#160;&#160;&#160; if (isset($_SERVER['HTTPS']) and $_SERVER['HTTPS'] == &#8216;on&#8217;) {       <br />&#160;&#160;&#160;&#160;&#160; $scheme .= &#8217;s&#8217;;       <br />&#160;&#160;&#160; }       <br />&#160;&#160;&#160; return $scheme;       <br />&#160; }       </p>
<p>&#160; private function getReturnTo()&#160; <br />&#160; {       <br />&#160;&#160;&#160; return sprintf(&quot;%s://%s/openid/finish&quot;,       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; $this-&gt;getScheme(), $_SERVER['SERVER_NAME']);       <br />&#160; }       </p>
<p>&#160; private function getTrustRoot()&#160; <br />&#160; {       <br />&#160;&#160;&#160; return sprintf(&quot;%s://%s/&quot;, $this-&gt;getScheme(),       <br />&#160;&#160;&#160;&#160;&#160; $_SERVER['SERVER_NAME']);       <br />&#160; }&#160;&#160; <br />&#160;&#160; <br />}       </p>
<p></span></code>
<p>The code starts with /openid/try action. It communicates with OpenID provider to obtain a URL that user will be redirected to. It also set the callback to /openid/finish. Note that I created class Application_Model_Account_OpenIDAdapter so that it fits Zend_Auth architecture. In reality, all it does is to write information to user account database and persist it to a storage in choice (such as session or cookie).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.barcodeschool.com/2011/12/using-janrain-openid-with-zend-framework/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Overdesign case in Web UI</title>
		<link>http://www.barcodeschool.com/2011/12/overdesign-case-in-web-ui/</link>
		<comments>http://www.barcodeschool.com/2011/12/overdesign-case-in-web-ui/#comments</comments>
		<pubDate>Sun, 11 Dec 2011 02:03:27 +0000</pubDate>
		<dc:creator>Sherwood Hu</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<category><![CDATA[Web UI]]></category>

		<guid isPermaLink="false">http://www.barcodeschool.com/?p=291</guid>
		<description><![CDATA[Today I went to a site that displays information on domains. I wanted to look at how we are doing so I entered Morovia in the search box. Quickly surprisingly I received a message
Morovia is an Invalid Extension.
difficult to understand uuuh? Obviously you have to put your full domain name - in this case, morovia.com. [...]]]></description>
			<content:encoded><![CDATA[<p>Today I went to a site that displays information on domains. I wanted to look at how we are doing so I entered Morovia in the search box. Quickly surprisingly I received a message</p>
<blockquote><p>Morovia is an Invalid Extension.</p></blockquote>
<p>difficult to understand uuuh? Obviously you have to put your full domain name - in this case, morovia.com. Otherwise it thinks morovia is the top domain name. But even so, why it is called &#8220;extension&#8221;? File names have extensions; while domain names have <strong>suffixes</strong>. </p>
<p><img src="http://www.barcodeschool.com/wp-content/uploads/2011/12/error-invalid-extension-search-domain.png" alt="error-invalid-extension-search-domain" title="error-invalid-extension-search-domain" width="798" height="287" class="aligncenter size-full wp-image-292" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.barcodeschool.com/2011/12/overdesign-case-in-web-ui/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Useful QR Code Ideas for Small Business Marketing</title>
		<link>http://www.barcodeschool.com/2011/12/useful-qr-code-ideas-for-small-business-marketing/</link>
		<comments>http://www.barcodeschool.com/2011/12/useful-qr-code-ideas-for-small-business-marketing/#comments</comments>
		<pubDate>Fri, 09 Dec 2011 21:10:54 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Barcode Formats]]></category>

		<category><![CDATA[Marketing]]></category>

		<category><![CDATA[QR Code]]></category>

		<category><![CDATA[Small Business]]></category>

		<guid isPermaLink="false">http://www.barcodeschool.com/?p=285</guid>
		<description><![CDATA[Nowadays smart phones are cheap. Android powered phones are around 100 dollars. It is not surprising that majority people now have smart phones - those with touch screen and have far more power than their predecessors. This phenomenon brings business opportunities that you as a business owner want to tap.
So what is QR Code?
A QR [...]]]></description>
			<content:encoded><![CDATA[<p>Nowadays smart phones are cheap. Android powered phones are around 100 dollars. It is not surprising that majority people now have smart phones - those with touch screen and have far more power than their predecessors. This phenomenon brings business opportunities that you as a business owner want to tap.</p>
<p><div id="attachment_289" class="wp-caption alignnone" style="width: 158px"><img src="http://www.barcodeschool.com/wp-content/uploads/2011/12/qrcode-mecard-format.png" alt="QR Code Image" title="qrcode-mecard-format" width="148" height="148" class="size-full wp-image-289" /><p class="wp-caption-text">QR Code Image</p></div><br />
So what is QR Code?</p>
<p>A QR Code is a 2D barcode that can be scanned by smart phone&#8217;s camera. It is capable of encoding large amount of text; however most QR codes encode a few dozen characters. QR Code becomes increasingly popular because smart phones now have decoder programs that read the barcode and act on the content it reads.</p>
<p>So what is the big deal for that? It turns out that QR Code offers a convenient way to encode key information - such as your web site address, email and so on. A smart phone owner can capture the info to his phone by just scanning the QR Code.</p>
<p>You certainly want your web site gets more visits - but how? If you run a restaurant, you can print a QR Code at the bottom of receipt, or in news paper&#8230; people who are interest just scan the QR code and visit your web site.</p>
<p>Some more ideas:</p>
<p>1. <strong>QR Code on Business Card</strong>. There is a popular format called MECARD, which allows contact info to be encoded into a QR Code. A smart phone user scans the barcode and put your contact into his address book. Hey if you are in  real estate agent, insurance broker or industry that you&#8217;d like everyone to remember you,  QR Code is a must.</p>
<p>2. <strong>Product Label</strong>. If you are a manufacturer it is time to add a QR Code with your web site encoded on the product label. Customers who bought your stuff may scan the barcode and visit your web site. Even more, you can print something like - scan this QR code to get a 10% off coupon.</p>
<p>3. <strong>Promotions, Discounts and Coupons.</strong> The idea here is to get the user to visit your web site and receive the discount. If you just print a coupon barcode on the newspaper your web site won&#8217;t get visited.  It is also easier to track users through your web site.</p>
<p>4. <strong>E-commerce</strong>.  QR Code encodes a URL with extra parameters - and users can only see them when they scan the barcode. So you can easily offer different discounts to different audience.</p>
<p>QR code can encode many information: such as web site URL, E-mail address and contact info. This <a href="http://www.morovia.com/fonts/qrcode/common-usage-qrcode.html" target="_blank">Morovia page </a>lists the common usage in mobile industry. Even better, there is an <a href="http://www.morovia.com/free-online-barcode-generator/qrcode-maker.php">online QR code generator</a> that create QR codes for free.</p>
<p>If you are looking a solution to add QR Code to Word documents, we&#8217;d like to recommend Morovia&#8217;s excellent product <a href="http://www.morovia.com/fonts/qrcode/">QR Code Fonts &amp; Encoder 5</a>.  With this <a href="http://mdn.morovia.com/manuals/qrcode-font-encoder/chapter-word-add-in.php">word addin</a>, creating a QRcode just takes two steps - highlight and convert; all can be done in 1 minute.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.barcodeschool.com/2011/12/useful-qr-code-ideas-for-small-business-marketing/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Creating Barcodes in Memory with PHP</title>
		<link>http://www.barcodeschool.com/2011/08/creating-barcodes-in-memory-with-php/</link>
		<comments>http://www.barcodeschool.com/2011/08/creating-barcodes-in-memory-with-php/#comments</comments>
		<pubDate>Tue, 30 Aug 2011 02:23:12 +0000</pubDate>
		<dc:creator>Sherwood Hu</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[Barcode ActiveX]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[PHP Barcode]]></category>

		<guid isPermaLink="false">http://www.barcodeschool.com/?p=272</guid>
		<description><![CDATA[Barcode image generation in memory using Barcode ActiveX, in PHP5.]]></description>
			<content:encoded><![CDATA[<p>Morovia <a href="http://mdn.morovia.com/kb/Tutorial-Barcode-ActiveX-Generate-Barcodes-PHP-Web-Applications-10148.html">KB 10148</a> talks about how to use Barcode ActiveX to generate barcode images in PHP 5. Barcode ActiveX 3 has a long history in Morovia, as it was conceived in year 2003 and our first ActiveX control product.</p>
<p>In this article, barcode is generated first in a front end script and the image is saved to a disk file. In the backend script the image is loaded and sent to the browser. Sometimes an in-memory solution is preferred, as programers will not have to deal with file permission, clean up and possible privacy issues.</p>
<p>The classic ASP example, which is included in the installer package, is an in-memory solution. It utilizes ADODB.Stream object. It exports barcode images to ADODB.Stream object, then calls Response.BinaryWrite to write all the bytes out. While it looks simple, the ADODB.Stream object&#8217;s Read method does not give back a sequence of bytes as defined in PHP. It is actually a COM SafeArray packaged in VARIANT type.</p>
<p><code>try {<br />
$objBarcode = new COM("Morovia.BarcodeActiveX");<br />
$objBarcode-&gt;RasterImageResolution = 96;								//Set the resolution to 96 dpi (screen)<br />
$objBarcode-&gt;NarrowBarWidth        = 15;                               //Default NarrowBarWidth 15 mils<br />
$objBarcode-&gt;BorderStyle = 0;											//No border<br />
$objBarcode-&gt;ShowComment = false;										//No comment<br />
$objBarcode-&gt;ShowHRText = false;										//No human readable text<br />
// By default the Barcode ActiveX creates margins around the symbol. The margins are around 100 mils<br />
// You can increase or decrease the margins by setting 4 SymbolMargin properties like<br />
$objBarcode-&gt;SymbolMarginTop = 100;</code></p>
<p><code>// Retrieve input parameters through the URL query string<br />
$objBarcode-&gt;Rotation   = $_GET["rotation"];<br />
$objBarcode-&gt;ShowHRText = (strlen($_GET["showhrtext"])==0 || $_GET['showhrtext']==0) ? 0 : 1;<br />
$objBarcode-&gt;Symbology = $_GET["symbology"];<br />
$objBarcode-&gt;NarrowBarWidth = $_GET['narrowbarwidth'];</code></p>
<p><code>$objBarcode-&gt;BarHeight            = $_GET['barheight'];<br />
$objBarcode-&gt;Message              = $_GET['message'];</p>
<p>$objBarcode-&gt;Font-&gt;Name = &#8220;MRV OCRB I&#8221;;<br />
$objBarcode-&gt;Font-&gt;Bold = false;<br />
$objBarcode-&gt;ShowComment = false;</p>
<p>// The Stream object is available in MDAC 2.5 and above versions. You can download the most<br />
// recent MDAC at http://www.microsoft.com/data/mdac/<br />
$objStream = new COM(&#8221;ADODB.Stream&#8221;);<br />
$objStream-&gt;Open();<br />
$objStream-&gt;Type = adTypeBinary;</p>
<p>// Export the Image to Stream object.<br />
// After transfer completes, the Position must set to 0 before Calling Response.BinaryWrite<br />
// otherwise an &#8220;unknown type&#8221; is reported.<br />
$objBarcode-&gt;ExportImage($objStream, imgTypePNG);</p>
<p>// BinaryWrite the image data to the client browser, in PHP use echo<br />
$objStream-&gt;Position = 0;</p>
<p>// until we figured out how to convert a byte array in COM to PHP,<br />
// we have to save it to a file first, then read it back to PHP.<br />
header(&#8217;Content-Type: image/png&#8217;);<br />
$buffer = $objStream-&gt;Read();</p>
<p>// Note: this does not work!<br />
echo($buffer);</p>
<p></code></p>
<p><code> $objStream  = null;<br />
$objBarcode = null;<br />
} catch(Exception $ex) {<br />
header('Content-Type: text/plain');<br />
echo($ex-&gt;getMessage());<br />
}</code></p>
<p>It turns out that the solution is pretty simple - although PHP does not provide direct way to convert a COM safe array to string, it provides a way to iterate the content. Thus, we can write:</p>
<p><code><br />
foreach ($buffer as $byte) echo chr($byte);<br />
</code></p>
<p>In the place of echo($buffer) statement. It worked.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.barcodeschool.com/2011/08/creating-barcodes-in-memory-with-php/feed/</wfw:commentRss>
		</item>
		<item>
		<title>IDispatch::Invoke Arguments are passed in reverse order</title>
		<link>http://www.barcodeschool.com/2011/03/idispatchinvoke-arguments-are-passed-in-reverse-order/</link>
		<comments>http://www.barcodeschool.com/2011/03/idispatchinvoke-arguments-are-passed-in-reverse-order/#comments</comments>
		<pubDate>Tue, 29 Mar 2011 18:54:44 +0000</pubDate>
		<dc:creator>Sherwood Hu</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.barcodeschool.com/2011/03/idispatchinvoke-arguments-are-passed-in-reverse-order/</guid>
		<description><![CDATA[Today I am testing the IDispatch of a COM object. The method has the following fingerprint:
[id(6)] HRESULT DataMatrixEncodeSet(   &#160;&#160;&#160;&#160;&#160;&#160;&#160; [in] BSTR strDateToEncode,    &#160;&#160;&#160;&#160;&#160;&#160;&#160; [in] LONG sizeID,     &#160;&#160;&#160;&#160;&#160;&#160;&#160; [out,retval] LONG* chunks);    
I was quite surprise that I got an “type mistach” error from Invoke [...]]]></description>
			<content:encoded><![CDATA[<p>Today I am testing the IDispatch of a COM object. The method has the following fingerprint:</p>
<p>[id(6)] HRESULT DataMatrixEncodeSet(   <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; [in] BSTR strDateToEncode,    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; [in] LONG sizeID,     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; [out,retval] LONG* chunks);    </p>
<p>I was quite surprise that I got an “type mistach” error from Invoke function. My code is as below:</p>
<p>args[0].vt = VT_BSTR;   <br />args[0].bstrVal = SysAllocString(L&quot;this is data to encodeencodeencodeencodeencode&quot;);    <br />args[1].vt = VT_I4;    <br />args[1].lVal = 0;</p>
<p>dp.cArgs&#160; = 2;&#160;&#160;&#160; <br />dp.rgvarg = args;&#160;&#160;&#160; <br />dp.cNamedArgs = 0;&#160;&#160;&#160; <br />dp.rgdispidNamedArgs = NULL; </p>
<p>VARIANT vaRet;   <br />VariantClear(&amp;vaRet);    <br />EXCEPINFO&#160; exInfo;    <br />unsigned int uErr;    <br />hr = disp-&gt;Invoke(dispID[0], IID_NULL, LCID_NEUTRAL,    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; DISPATCH_METHOD, &amp;dp, &amp;vaRet, &amp;exInfo, &amp;uErr);    <br />BOOST_CHECK(SUCCEEDED(hr));    </p>
<p>After some search, I finally found the cause: the arguments packed in DISPPARAMS must be in reverse order. In other words, the args[] array must be reversed. After I changed that, the error disappeared.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.barcodeschool.com/2011/03/idispatchinvoke-arguments-are-passed-in-reverse-order/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Bulk generate barcode images using Barcode ActiveX and Perl</title>
		<link>http://www.barcodeschool.com/2011/02/bulk-generate-barcode-images-using-barcode-activex-and-perl/</link>
		<comments>http://www.barcodeschool.com/2011/02/bulk-generate-barcode-images-using-barcode-activex-and-perl/#comments</comments>
		<pubDate>Tue, 01 Mar 2011 04:23:43 +0000</pubDate>
		<dc:creator>Sherwood Hu</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://www.barcodeschool.com/?p=266</guid>
		<description><![CDATA[How to bulk generate upc-a images]]></description>
			<content:encoded><![CDATA[<p>With <a href="http://www.morovia.com/activex/barcode-activex.asp">Morovia Barcode ActiveX 3</a>, it is easy to bulk generate barcode images. The following 10 lines of perl code just demonstrate how easy it is.</p>
<p>use Win32::OLE;<br />
my $object = Win32::OLE-&gt;new(&#8217;Morovia.BarcodeActivex&#8217;, &#8221;);<br />
$object-&gt;{&#8221;Symbology&#8221;} = 8; #UPC-A symbology<br />
$object-&gt;{&#8221;ShowComment&#8221;} = 0;<br />
$object-&gt;{&#8221;BarHeight&#8221;}=1000;</p>
<p>for(my $number=0; $number&lt;=999; $number++)<br />
{<br />
my $text_number = sprintf(&#8221;%03d&#8221;, $number);<br />
$object-&gt;{&#8221;message&#8221;} = &#8220;81058201&#8243; . $text_number;</p>
<p>print(&#8221;exporting image $text_number.\n&#8221;);</p>
<p>$object-&gt;ExportImage($object-&gt;{&#8221;message&#8221;} . &#8220;.jpg&#8221;, 1);<br />
}</p>
<p>my $result = `zip all-images.zip *.jpg`;</p>
<p>The code above generates UPC-A barcode images for numbers 81058201xxx where xxx is from 000 to 999. At the end, the code calls zip command to zip all the images files into zip.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.barcodeschool.com/2011/02/bulk-generate-barcode-images-using-barcode-activex-and-perl/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
