<?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>Rayhan's blog (raynux.com) &#187; Tutorial</title>
	<atom:link href="http://raynux.com/blog/tag/tutorial/feed/" rel="self" type="application/rss+xml" />
	<link>http://raynux.com/blog</link>
	<description>Rayhan's Personal Web Blog Site</description>
	<lastBuildDate>Fri, 16 Oct 2009 06:07:31 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Http Client Class for PHP development</title>
		<link>http://raynux.com/blog/2009/06/13/http-client-class-for-php-development/</link>
		<comments>http://raynux.com/blog/2009/06/13/http-client-class-for-php-development/#comments</comments>
		<pubDate>Sat, 13 Jun 2009 07:01:35 +0000</pubDate>
		<dc:creator>rayhan</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Reference]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[class]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://raynux.com/blog/?p=99</guid>
		<description><![CDATA[RayHttp, A Simple Http Client Class for PHP Development. This class is designed to provide quick http reqest method to access external website. A CURL alternative to php native file_get_contents method. It can work without any configuration and can be called anywhere is your application using singleton design pattern. Unlike other Http client class in [...]]]></description>
			<content:encoded><![CDATA[<p><strong>RayHttp</strong>, A Simple Http Client Class for PHP Development.</p>
<p>This class is designed to provide quick http reqest method to access external website. A CURL alternative to php native file_get_contents method. It can work without any configuration and can be called anywhere is your application using singleton design pattern. Unlike other Http client class in php, this is lightweight, simple and easy to use and configure. If you need more functionality you can extend the class. CURL request is fully customizable through setCurlOptions() method.</p>
<p>This class is suitable for those project which is not built on a PHP Framework. Usually all frameworks provide a built in Http Client Object.</p>
<p><strong>Features:</strong></p>
<p>- General purpose http request class.<br />
- Supports GET &amp; POST request Method.<br />
- For GET Request both CURL &amp; PHP native file_get_contents are available.<br />
- By default CURL is used for GET Request.<br />
- Easily configurable &amp; can work without any configuration.<br />
- Simple &amp; Easy to use from anywhere in your application with a single line of code.<br />
- Request through CURL fully configurable with all possible curl options, so it&#8217;s up to you.<br />
- Encode given URL Automatically, may be disabled.<br />
- Supports POST requests with a user defined array or serialised string of form values.<br />
- Supports GET requests with a user defined parameter array.<br />
- Support Singleton pattern<br />
- Support Custom CURL request, may be used to extends functionality.<br />
- Light Weight</p>
<p>Methods Available (This class provides):</p>
<p>- get()<br />
- post()<br />
- curlExecute()<br />
- encodeUrl()</p>
<p><strong>Class:</strong></p>
<p>File: <strong>rayhttp.php</strong></p>
<pre><code>&lt;?php
/*	SVN FILE: $Id: rayhttp.php 113 2008-06-15 04:30:19Z rayhan $	 */
/**
 * HTTP Client Class.
 *
 * A basic HTTP Client desinged for php developer.
 * - CURL
 * - Native php method
 *
 *	PHP Version 5
 *
 *
 *	@copyright		Copyright 2006-2008, Md. Rayhan Chowdhury
 *	@package		raynux
 *	@subpackage		raynux.lab.http
 * 	@since			version 1.0
 *	@version		$Revision: 113 $
 * 	@modifiedby		$LastChangedBy: rayhan $
 *	@lastModified	$Date: 2008-06-15 10:30:19 +0600 (Sun, 15 Jun 2008) $
 *	@author			$Author: rayhan $
 *	@url			$HeadURL: http://localhost/svn/raynux/trunk/labs/rayhttp.php $
 *	@website		www.raynux.com
 *  @license 		GPL
 */

/**
 * HTTP Client Class.
 *
 * A basic HTTP Client desinged for php developer.
 * - CURL
 * - Native php method
 *
 *
 * @todo add utf-8 conversion.
 * @todo add plugins functionality
 *
 *
 * @package raynux
 * @subpackage raynux.lab.http
 * @version 1.0
 * @since version 1.0
 * @author Md. Rayhan Chowdhury
 */
class RayHttp{

	/**
	 * Hold runtime instance of self
	 *
	 * @var array of self instances
	 * @access private
	 * @static
	 */
	static private $__instances;

	/**
	 * Curl Instance
	 *
	 * @var object Curl instance
	 * @access protected
	 */
	protected 	$_curlInstance = null;

	/**
	 * Default configuration for the crawler.
	 *
	 * @var array
	 * @access private
	 */
	private 	$__defaultConfigs = array(
                    'client' =&gt; 'curl',
                    'encodeUrl' =&gt; true,
                    'curlOptions' =&gt; array(
                        CURLOPT_SSL_VERIFYPEER =&gt; 0,
                        CURLOPT_RETURNTRANSFER =&gt; 1,
                        CURLOPT_FOLLOWLOCATION =&gt; 1,
                        CURLOPT_ENCODING =&gt; "",
                        CURLOPT_USERAGENT =&gt; "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.0.5) Gecko/2008120121 Firefox/3.0.5",
                        CURLOPT_COOKIESESSION =&gt; 1,
                        CURLOPT_AUTOREFERER =&gt; 1,
                        CURLOPT_CONNECTTIMEOUT =&gt; 120,
                        CURLOPT_AUTOREFERER =&gt; 120,
                        CURLOPT_TIMEOUT =&gt; 120,
                        CURLOPT_MAXREDIRS =&gt; 10,
                        CURLOPT_COOKIEFILE =&gt; 'cookiefile',
                        CURLOPT_COOKIEJAR =&gt; 'cookiefile',
                    ),
                );

	/**
	 * Hold runtime configuration.
	 *
	 *
	 * @var array
	 * @access protected
	 */
	protected 	$_configs = array();

	/**
	 * Class Constructor
	 *
	 * @param array $configs
	 * @access public
	 * @return unknown
	 */
	function __construct($configs = array()){
		if (!empty($configs)) {
			$this-&gt;setOptions($configs);
		} else {
			$this-&gt;setOptions($this-&gt;__defaultConfigs);
		}
	}

	/**
	 * Configure the class.
	 *
	 * @param array $configs, configuration data.
	 * @return unknown
	 * @access public
	 */
	public function &amp;setOptions($configs){
		$this-&gt;_configs = array_merge($this-&gt;__defaultConfigs, $configs);

		return $this;
	}

	/**
	 * Get Curl Instance.
	 *
	 * @return object curl instance
	 * @access protected
	 */
	protected function &amp;_getCurlInstance() {
		if ($this-&gt;_curlInstance == null) {
			$this-&gt;_curlInstance = curl_init();
			$this-&gt;setCurlOptions($this-&gt;_configs['curlOptions']);
		}
		return $this-&gt;_curlInstance;
	}

	/**
	 * Set Curl Options from array
	 *
	 * @param array $options
	 * @return object | this
	 * @access public
	 */
	public function &amp;setCurlOptions($options = array()) {
		$c = $this-&gt;_getCurlInstance();
		if (function_exists('curl_setopt_array')) {
			curl_setopt_array($c, $options);
		} else {
			foreach ($options as $key =&gt; $value) {
				curl_setopt($c, $key, $value);
			}
		}
		return $this;
	}

	/**
	 * Execute curl library function.
	 *
	 * @param string $url
	 * @param string $method, http method, 'get' or 'post'
	 * @param string|array $postFields, form data
	 * @return string | curl response object
	 * @access public
	 */
	public function curlExecute($url, $method = 'get', $postFields = null){
		$c = $this-&gt;_getCurlInstance();
		if ($method === 'get') {
			$this-&gt;setCurlOptions(array(CURLOPT_URL =&gt; $url,
                                        CURLOPT_POST =&gt; false,
                                        CURLOPT_HTTPGET =&gt; 1));

		} elseif ($method === 'post') {
			$this-&gt;setCurlOptions(array(CURLOPT_URL =&gt; $url,
                                        CURLOPT_POST =&gt; true,
                                        CURLOPT_HTTPGET =&gt; 0,
                                        CURLOPT_POSTFIELDS =&gt; $postFields));

		} else {
			$this-&gt;setCurlOptions(array(CURLOPT_URL =&gt; $url));

		}
		return curl_exec($c);
	}

	/**
	 * Encode url with urlencode function for unencoded character.
	 *
	 * @param string $url urls to be encoded.
	 * @param string $callback function name as callback function, 'urlencode' or 'raw_urlencode'
	 * @return string encoded url.
	 * @access public
	 */
	public function encodeUrl($url, $callback = 'urlencode') {
		if ($pathOfset = strpos($url, '/', (strpos($url, '://') + 3))) {

			extract(parse_url($url));

			$path = implode('/', array_map($callback, explode('/', $path)));
			$url = substr($url, 0, $pathOfset) . $path;

			if (!empty($query)) {
				parse_str($query, $query);
				$query = http_build_query(array_map($callback, $query));
				$query = preg_replace('@(\=($|(&amp;)))@is', '\3', $query);			// remove tailing = sign from empty variable.
				$url = $url . "?" . $query;
			}
		}

		return $url;
	}

    /**
     * Get Self Instance.
     *
     * @param string $name, name of the instance, default value is 'default'
     * @param array $configs, configuration array for the instance
     * @return object, self instance
	 * @access public
     * @static
     */
    static public function &amp;getInstance($name = 'default', $configs = array()){
    	if (is_null(self::$__instances[$name])) {
    		self::$__instances[$name] = new self($configs);
    	}
    	return self::$__instances[$name];
    }

	/**
	 * Get url contents using GET MEthod.
	 *
	 * @param string $url
	 * @param string|array $getData, get data in serialized string or array format.
	 * @return string
	 * @access public
	 */
    public function get($url, $getData = null){
    	if (!is_null($getData)) {
    		if (is_array($getData)) {
    			$getData = http_build_query($getData);
    		}
    		if (strpos($url, '?') === false) {
    			$url .= '?';
    		}
    		$url .= $getData;
    	}

    	if ($this-&gt;_configs['encodeUrl']) {
    		$url = $this-&gt;encodeUrl($url);
    	}

    	if ($this-&gt;_configs['client'] === 'php') {
    		return file_get_contents($url);
    	}
    	return $this-&gt;curlExecute($url);
    }

    /**
     * Get URL contents using POST method.
     *
     * @param string $url
     * @param string|array $postData, form data in serialized string or array format.
     * @return string
     * @access public
     */
    public function post($url, $postData = null) {
    	if (is_array($postData)) {
    		$postData = http_build_query($postData);
    	}

    	if ($this-&gt;_configs['encodeUrl']) {
    		$url = $this-&gt;encodeUrl($url);
    	}

    	return $this-&gt;curlExecute($url, 'post', $postData);
    }
}
</code></pre>
<p>
<strong>Usage Example:</strong><br />
File: <strong>example.php</strong></p>
<pre><code>&lt;?php
/**
 * HTTP Client Class Example Script.
 *
 * Example of RayHttp Class Object.
 *
 *	PHP Version 5
 *
 *
 *	@copyright		Copyright 2006-2008, Md. Rayhan Chowdhury
 *	@package		raynux
 *	@subpackage		raynux.lab.http
 * 	@since			version 1.0
 *	@version		$Revision: 113 $
 * 	@modifiedby		$LastChangedBy: rayhan $
 *	@lastModified	$Date: 2008-06-15 10:30:19 +0600 (Sun, 15 Jun 2008) $
 *	@author			$Author: rayhan $
 *	@url			$HeadURL: http://localhost/svn/raynux/trunk/labs/example.php $
 *	@website		www.raynux.com
 *  @license 		GPL
 */

/**
 * Load the http client.
 */
require_once("rayhttp.php");

/**
 * METHOD GET.
 */

/**
 * Example 1
 *
 * using default configuration
 * default method is curl.
 * use as a singleton object.
 */
$content = RayHttp::getInstance()-&gt;get("http://google.com");
$content = RayHttp::getInstance()-&gt;get("http://google.com/search", array('q' =&gt; 'rayhttp'));
$content = RayHttp::getInstance()-&gt;get("http://google.com/search?q=rayhttp");

/**
 * Example 2
 *
 * using default configuration but using php native file_get_contetns method.
 * use as a singleton object.
 * static method.
 */
$content = RayHttp::getInstance()-&gt;setOptions(array('client' =&gt; 'php'))-&gt;get("http://google.com");
$content = RayHttp::getInstance()-&gt;setOptions(array('client' =&gt; 'php'))-&gt;get("http://google.com/search", array('q' =&gt; 'rayhttp'));
$content = RayHttp::getInstance()-&gt;setOptions(array('client' =&gt; 'php'))-&gt;get("http://google.com/search?q=rayhttp");

/**
 * Example 3
 *
 * Take Instance Of the object
 */
$http = new RayHttp();
$content = $http-&gt;get("http://google.com");
$content = $http-&gt;get("http://google.com/search", array('q' =&gt; 'rayhttp'));
$content = $http-&gt;get("http://google.com/search?q=rayhttp");

/**
 * METHOD POST.
 */

/**
 * Example 4
 *
 * using default configuration
 */
$content = RayHttp::getInstance()-&gt;post("http://example.com/", array('name' =&gt; 'rayhttp', 'location' =&gt; 'dhaka, bangladesh'));

/**
 * Multiple Instance &amp; Configuration.
 */
RayHttp::getInstance('default', $configs);
RayHttp::getInstance('default2', $configs);

$http = RayHttp::getInstance(); // get default instance
$http2 = RayHttp::getInstance('default2'); // get default2 instance

$http3 = RayHttp::getInstance('default3', $configs); // get default 3 instance
$http3-&gt;setOptions($configs); // reconfigure default3 instance;

/**
 * Specify Proxy
 */
RayHttp::getInstance('c')-&gt;setCurlOptions(array(CURLOPT_PROXY =&gt; '172.19.79.1:3128'))-&gt;get("http://www.google.com");

</code></pre>
<p>Rate this class at phpclasses.org: <a href="http://www.phpclasses.org/rayhttpclient">http://www.phpclasses.org/rayhttpclient</a></p>
]]></content:encoded>
			<wfw:commentRss>http://raynux.com/blog/2009/06/13/http-client-class-for-php-development/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>IPTABLES quick command list</title>
		<link>http://raynux.com/blog/2009/04/15/iptables-quick-command-list/</link>
		<comments>http://raynux.com/blog/2009/04/15/iptables-quick-command-list/#comments</comments>
		<pubDate>Wed, 15 Apr 2009 06:09:34 +0000</pubDate>
		<dc:creator>rayhan</dc:creator>
				<category><![CDATA[Fedora]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Reference]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[iptables]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://raynux.com/blog/?p=86</guid>
		<description><![CDATA[Iptables is the default and powerful firewall that works on almost all Linux version including Ubuntu and Fedora. Here I have listed some important commands and a short description of each command for quick help. It can help people who already know little Iptables. manage chain: # iptables -N new_chain // create a chain # [...]]]></description>
			<content:encoded><![CDATA[<p>Iptables is the default and powerful firewall that works on almost all Linux version including Ubuntu and Fedora. Here I have listed some important commands and a short description of each command for quick help. It can help people who already know little Iptables.</p>
<pre><code>
manage chain:
# iptables -N new_chain				// create a chain
# iptables -E new_chain old_chain  		// edit a chain
# iptables -X old_chain				// delete a chain

redirecting packet to a user chain:
# iptables -A INPUT -p icmp -j new_chain

listing rules:
# iptables -L					// list all rules of all tables
# iptables -L -v				// display rules and their counters
# iptables -L -t nat				// display rules for a specific tables
# iptables -L -n --line-numbers			// listing rules with line number for all tables
# iptables -L INPUT -n --line-numbers		// listing rules with line number for specific table

manage rules:
# iptables -A chain				// append rules to the bottom of the chain
# iptables -I chain [rulenum]			// insert in chain as rulenum (default at the top or 1)
# iptables -R chain rulenum			// replace rules with rules specified for the rulnum
# iptables -D chain	rulenum			// delete rules matching rulenum (default 1)
# iptables -D chain				// delete matching rules

change default policy:
# iptables -P chain target			// change policy on chain to target
# iptables -P INPUT DROP			// change INPUT table policy to DROP
# iptables -P OUTPUT DROP			// change OUTPUT chain policy to DROP
# iptables -P FORWARD DROP			// change FORWARD chain policy to DROP
</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://raynux.com/blog/2009/04/15/iptables-quick-command-list/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Install Additional softwares by a single command on Ubuntu</title>
		<link>http://raynux.com/blog/2008/11/21/install-additional-softwares-by-a-single-command-on-ubuntu/</link>
		<comments>http://raynux.com/blog/2008/11/21/install-additional-softwares-by-a-single-command-on-ubuntu/#comments</comments>
		<pubDate>Thu, 20 Nov 2008 20:49:15 +0000</pubDate>
		<dc:creator>rayhan</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Reference]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[personal]]></category>
		<category><![CDATA[Bash Script]]></category>
		<category><![CDATA[Install]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://raynux.com/blog/?p=45</guid>
		<description><![CDATA[I have created a bash script file to install almost all necessary softwares to run and work on a Ubuntu box. I have tried this script in Ubuntu 8.04 Hardy Heron and Ubuntu 8.10 Intrepid Ibex. Softwares I have placed in this script covers PHP-MySQL development and desktop applications for graphics, multimedia, to Internet applications. [...]]]></description>
			<content:encoded><![CDATA[<p>I have created a bash script file to install almost all necessary softwares to run and work on a Ubuntu box. I have tried this script in Ubuntu 8.04 Hardy Heron and Ubuntu 8.10 Intrepid Ibex. Softwares I have placed in this script covers PHP-MySQL development and desktop applications for graphics, multimedia,  to Internet applications. You can also add your favourite softwares in the script.</p>
<p>File: <strong><em>RayInstall.sh</em></strong></p>
<pre><code>
# RayInstall.sh
#
# Ubuntu Intrepid &amp; Hardy
#
# A very simple Bash Script file to automate installation of necessary
# softwares for PHP-MySQL development and desktop uses in a ubuntu box
#
# This may take several hours or even days depending on your internet connection speed.
#	It tooks 8 Hours for me with about 70-130 KBps of speed
#
# @uses Aplication -&gt; Accesories -&gt; Terminal
#		Now write following command "sudo sh ./RayInstall.sh" without quotes
#		and press enter button on your keyboard
#
# @author ray@raynuxcom
# @licence GPL

#
# For PHP-MySQL Based Development
#

# Install Apache version 2 web server
apt-get -y install apache2 apache2-doc

# Install PHP with necessary modules
apt-get -y install php5 libapache2-mod-php5 php5-cli
apt-get -y install php5-curl php5-dev php5-gd php5-gmp php5-imap php5-ldap php5-mcrypt php5-mhash php5-ming php5-odbc php5-pspell php5-snmp php5-sybase php5-tidy curl libwww-perl imagemagick

# Install MySQL Database server
apt-get -y install mysql-server php5-mysql mysql-gui-tools-common

#Restart apache
/etc/init.d/apache2 restart

# Install Webmin, A web based frontend for linux box.
apt-get -y install webmin

# Install Subversion &amp; Rapidsvn a subversion gui client tools
apt-get -y install subversion subversion-tools libapache2-svn
apt-get -y install rapidsvn

#Restart apache
/etc/init.d/apache2 restart

#Install Doxygen, An documentation tools for PHP Application
apt-get -y install doxygen doxygen-gui doxygen-doc graphviz

# Install Phpmyadmin, A web based mysql administration tools
apt-get -y install phpmyadmin

# Install Java runtime for Eclipse PDT to work properly
apt-get -y install sun-java6-bin sun-java6-jdk sun-java6-jre

# Install Eclipse PDT
# Just download the pdt-all-in-one peckage from zend site
# http://downloads.zend.com/pdt/all-in-one/pdt-1.0.3.R20080603_debugger-5.2.14.v20080602-all-in-one-linux-gtk.tar.gz
# Unpack it in a suitable location.
# run eclipse/eclipse from the unpacked folder and you are done
# Now install Subclipse plugin using eclipse update tools

#
# Graphics, 2D and 3D Modeling Softwares &amp; tools
#

# Install inkscape, An Illustrator alternative
apt-get -y install inkscape

# Install dia and graphical UML modeling tools
apt-get -y install dia

# Install Scribus, An alternative to Adobe Pagemaker
apt-get -y install scribus

# Install Cheese,  Webcam Software, a video and photo shoot application with cool effects for the GNOME desktop
apt-get -y install webcam cheese

# Install QCAD, and linux alternative to CAD Program.
apt-get -y install qcad

# Install Blender, Linux alternative for 3D Modeling
apt-get -y install blender

#
# Misc. Tools
#

# Install Wine, to run windows program
apt-get -y install wine

# Install XChm to read CHM Help file and Manual
apt-get -y install xchm

#
# Multimedia Players and codec
#

# Install GStreamer restricted codec to run mp3 and other media file
apt-get -y install gstreamer0.10-plugins-ugly gstreamer0.10-plugins-bad

# XMMS2 Media player
apt-get -y install xmms2 gxmms2

# Install vlc player, An alternative media player. Can play DVD file with title
apt-get -y install vlc vlc-plugin-*

# Install Amarok music player
apt-get -y install amarok

# Install k3b, A dvd burner application
apt-get -y install k3b

#
# Network and internet tools
#

# Install OpenSSH server to access your ubuntu box remotely
apt-get -y install openssh-server openssh-client

#Install gnome-network-admin, not available in default ubuntu 8.10
apt-get -y install gnome-network-admin

# Install Webhttrack, Website copier tools for linux
apt-get -y install webhttrack

# Install kopete instant messenger
apt-get -y install kopete

# install Internet Explorer in Ubuntu (Experimental)
apt-get -y install wine cabextract msttcorefonts

#run the following command manually to install IE
# wget http://www.tatanka.com.br/ies4linux/downloads/ies4linux-latest.tar.gz
# tar zxvf ies4linux-latest.tar.gz
# cd ies4linux-*
# ./ies4linux
</code>
</pre>
<p>If you are using Ubuntu on your computer and want to automate the installation process utilising this script then perform the following steps:</p>
<ul>
<li>Create a file name <em>RayInstall.sh</em> in you home folder.</li>
<li>Copy and paste the above code inside the the file and save it.</li>
<li>Open a terminal window from <em>Applications -&gt; Accessories -&gt; Terminal</em></li>
<li>Write the following command</li>
<li><code>sudo sh ./RayInstall.sh</code></li>
<li>press <em>Enter</em></li>
<li>Now it will start installing all the softwares listed in the script and you may need to provide some information during installation process when needed.</li>
</ul>
<p>This script may be helpful for newbies. If you have any comment or suggestion regarding this script please let me know as I am also a newbie in Ubuntu.</p>
]]></content:encoded>
			<wfw:commentRss>http://raynux.com/blog/2008/11/21/install-additional-softwares-by-a-single-command-on-ubuntu/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Store and Display image from MySQL database</title>
		<link>http://raynux.com/blog/2008/11/20/store-and-display-image-from-mysql-database/</link>
		<comments>http://raynux.com/blog/2008/11/20/store-and-display-image-from-mysql-database/#comments</comments>
		<pubDate>Thu, 20 Nov 2008 10:09:13 +0000</pubDate>
		<dc:creator>rayhan</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Reference]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[Image]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Upload]]></category>

		<guid isPermaLink="false">http://raynux.com/blog/?p=47</guid>
		<description><![CDATA[A basic approach to upload and save image to a MySQL database and then display the image from the database. First you need to create a table in MySQL Database to store the image data. Log into you database and run the following sql command: CREATE TABLE  `images` ( `id` int(11) NOT NULL auto_increment, `name` [...]]]></description>
			<content:encoded><![CDATA[<p>A basic approach to upload and save image to a MySQL database and then display the image from the database.</p>
<p>First you need to create a table in MySQL Database to store the image data. Log into you database and run the following sql command:<br />
<code>CREATE TABLE  `images` (<br />
`id` int(11) NOT NULL auto_increment,<br />
`name` varchar(100) default NULL,<br />
`size` int(11) default NULL,<br />
`type` varchar(20) default NULL,<br />
`content` mediumblob,<br />
PRIMARY KEY  (`id`)<br />
) ENGINE=MyISAM;</code></p>
<p>Once the table have been created, we are ready to write codes. Now create a folder in you webserver named <strong>rayImg</strong> and create image.php and upload.php files inside the folder.</p>
<p>Open the <strong>image.php</strong>, copy and paste the following code and save it.</p>
<p>File: image.php</p>
<pre><code>&lt;?php
	/**
	 * Display image form database
	 *
	 * Retrive an image from mysql database if image id is provided.
	 *
	 * @example to display a image with image id 1, place &lt;img src="image.php?id=1" &gt; in your html file.
	 *
	 * @author Md. Rayhan Chowdhury
	 * @copyright www.raynux.com
	 * @license LGPL
	 */

	// verify request id.
	if (empty($_GET['id']) || !is_numeric($_GET['id'])) {
		echo 'A valid image file id is required to display the image file.';
		exit;
	}

	$imageId = $_GET['id'];

	//connect to mysql database
	if ($conn = mysqli_connect('localhost', 'root', 'root', 'test')) {
		$content = mysqli_real_escape_string($conn, $content);
		$sql = "SELECT type, content FROM images where id = {$imageId}";

		if ($rs = mysqli_query($conn, $sql)) {
			$imageData = mysqli_fetch_array($rs, MYSQLI_ASSOC);
			mysqli_free_result($rs);
		} else {
			echo "Error: Could not get data from mysql database. Please try again.";
		}
		//close mysqli connection
		mysqli_close($conn);

	} else {
		echo "Error: Could not connect to mysql database. Please try again.";
	}	

	if (!empty($imageData)) {
		// show the image.
		header("Content-type: {$imageData['type']}");
		echo $imageData['content'];
	}
?&gt;</code></pre>
<p>Now open the update.php, copy and paste the following code and save it.</p>
<p>File: upload.php</p>
<pre><code>&lt;?php
/**
 * Upload an image to mysql database.
 *
 *
 *
 * @author Md. Rayhan Chowdhury
 * @copyright www.raynux.com
 * @license LGPL
 */

// Check for post data.
if ($_POST &amp;&amp; !empty($_FILES)) {
	$formOk = true;

	//Assign Variables
	$path = $_FILES['image']['tmp_name'];
	$name = $_FILES['image']['name'];
	$size = $_FILES['image']['size'];
	$type = $_FILES['image']['type'];

	if ($_FILES['image']['error'] || !is_uploaded_file($path)) {
		$formOk = false;
		echo "Error: Error in uploading file. Please try again.";
	}

	//check file extension
	if ($formOk &amp;&amp; !in_array($type, array('image/png', 'image/x-png', 'image/jpeg', 'image/pjpeg', 'image/gif'))) {
		$formOk = false;
		echo "Error: Unsupported file extension. Supported extensions are JPG / PNG.";
	}
	// check for file size.
	if ($formOk &amp;&amp; filesize($path) &gt; 500000) {
		$formOk = false;
		echo "Error: File size must be less than 500 KB.";
	}

	if ($formOk) {
		// read file contents
		$content = file_get_contents($path);

		//connect to mysql database
		if ($conn = mysqli_connect('localhost', 'root', 'root', 'test')) {
			$content = mysqli_real_escape_string($conn, $content);
			$sql = "insert into images (name, size, type, content) values ('{$name}', '{$size}', '{$type}', '{$content}')";

			if (mysqli_query($conn, $sql)) {
				$uploadOk = true;
				$imageId = mysqli_insert_id($conn);
			} else {
				echo "Error: Could not save the data to mysql database. Please try again.";
			}

			mysqli_close($conn);
		} else {
			echo "Error: Could not connect to mysql database. Please try again.";
		}
	}
}
?&gt;

&lt;html&gt;
	&lt;head&gt;
		&lt;title&gt;Upload image to mysql database.&lt;/title&gt;
		&lt;style type="text/css"&gt;
			img{
				margin: .2em;
				border: 1px solid #555;
				padding: .2em;
				vertical-align: top;
			}
		&lt;/style&gt;
	&lt;/head&gt;
	&lt;body&gt;
		&lt;?php if (!empty($uploadOk)): ?&gt;
			&lt;div&gt;
		  		&lt;h3&gt;Image Uploaded:&lt;/h3&gt;
		  	&lt;/div&gt;
			&lt;div&gt;
				&lt;img src="image.php?id=&lt;?=$imageId ?&gt;" width="150px"&gt;
				&lt;strong&gt;Embed&lt;/strong&gt;: &lt;input size="25" value='&lt;img src="image.php?id=&lt;?=$imageId ?&gt;"&gt;'&gt;
			&lt;/div&gt;

			&lt;hr&gt;
		&lt;? endif; ?&gt;

		&lt;form action="&lt;?=$_SERVER['PHP_SELF']?&gt;" method="post" enctype="multipart/form-data" &gt;
		  &lt;div&gt;
		  	&lt;h3&gt;Image Upload:&lt;/h3&gt;
		  &lt;/div&gt;
		  &lt;div&gt;
		  	&lt;label&gt;Image&lt;/label&gt;
		  	&lt;input type="hidden" name="MAX_FILE_SIZE" value="500000"&gt;
			&lt;input type="file" name="image" /&gt;
		    &lt;input name="submit" type="submit" value="Upload"&gt;
		  &lt;/div&gt;
		&lt;/form&gt;
	&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>Replace line</p>
<p><strong>mysqli_connect(&#8216;localhost&#8217;, &#8216;root&#8217;, &#8216;root&#8217;, &#8216;test&#8217;) </strong></p>
<p>with<strong></strong></p>
<p><strong>mysqli_connect(&#8216;your host&#8217;, &#8216;your username&#8217;, &#8216;your password&#8217;, &#8216;your database name&#8217;)</strong></p>
<p>in both the file and save again.</p>
<p>You are done. Open upload.php from your browser and upload you desired image and view the uploaded image.</p>
]]></content:encoded>
			<wfw:commentRss>http://raynux.com/blog/2008/11/20/store-and-display-image-from-mysql-database/feed/</wfw:commentRss>
		<slash:comments>41</slash:comments>
		</item>
		<item>
		<title>Recovering Ubuntu or Fedora Linux after installing windows</title>
		<link>http://raynux.com/blog/2008/09/21/recovering-ubuntu-or-fedora-linux-after-installing-windows/</link>
		<comments>http://raynux.com/blog/2008/09/21/recovering-ubuntu-or-fedora-linux-after-installing-windows/#comments</comments>
		<pubDate>Sat, 20 Sep 2008 19:40:26 +0000</pubDate>
		<dc:creator>rayhan</dc:creator>
				<category><![CDATA[Fedora]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Reference]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[Boot]]></category>
		<category><![CDATA[GRUB]]></category>
		<category><![CDATA[Troublshooting]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://raynux.com/blog/?p=41</guid>
		<description><![CDATA[Running linux with windows in dual boot mode is not hassle free at all. Specially if you reinstall or repair windows, your linux system will disappear. As a newbie you may stop using linux or reinstall it again instead of solving the problem. In this article I will share my experience on how to recover [...]]]></description>
			<content:encoded><![CDATA[<p>Running linux with windows in dual boot mode is not hassle free at all. Specially if you reinstall or repair windows, your linux system will disappear. As a newbie you may stop using linux or reinstall it again instead of solving the problem. In this article I will share my experience on how to recover the boot option for linux. I will cover two well known linux distro ubuntu 8 and fedora 7. I will try to cover the fail safe situation here.</p>
<p>In both Fedora and Ubuntu this task includes two basic steps. These are:</p>
<ul>
<li><strong>Enter into your existing hard disk linux system.</strong></li>
<li><strong>Setup GRUB Boot Loader using GRUB program.</strong></li>
</ul>
<p><strong>a. Enter into your existing hard disk linux system.</strong></p>
<p>Fedora 7:</p>
<p>In fedora recovering grub is easy task as fedora automatically mount the existing system image to /mnt/sysimage in rescue mode.</p>
<ol>
<li>Insert the fedora installation cd to boot from cd.</li>
<li>When the boot menu appear enter the rescue mode. A message will be prompt saying mounting the existing fedora system on /mnt/sysimage, click ok.</li>
<li>In rescue mode you will be in a shell</li>
<li>Enter the following command<br />
<code>#chroot /mnt/sysimage</code></li>
<li>Now you are in your existing fedora operating system.</li>
</ol>
<p>Ubuntu 8.04 LTS:</p>
<p>In ubuntu you will have to mount the existing system image manually.</p>
<ol>
<li>Insert the ubuntu live cd and start a live session from cd.</li>
<li>open the terminal window</li>
<li>the following command will display currently mounted device or harddisk partitions<br />
<code>#df -h</code></li>
<li>get the device name for <em>/boot</em> if exists or <em>/</em> (root) partition say <em>/dev/sda9</em>.</li>
<li>enter the following command<br />
<code>#sudo mkdir ubuntu<br />
#sudo mount -t ext3 /dev/sda9 ubuntu</code></li>
<li>If you have separate <em>/usr</em> partition say <em>/dev/sda7</em> enter the following command too.<br />
<code>#sudo mount -t ext3 /dev/sda7 ubuntu/usr<br />
</code></li>
<li>Enter the following command to mount <em>/proc</em> and <em>/dev</em> and change chroot.<br />
<code>#sudo mount -t proc none ubuntu/proc<br />
#sudo mount -o bind /dev/ ubuntu/dev<br />
#sudo chroot ubuntu /bin/bash</code></li>
<li>Now you are in your existing ubuntu operating system.</li>
</ol>
<p><strong>b. Setup GRUB Boot Loader using GRUB program.</strong></p>
<p>In grub you are mainly required to find the boot device and set the root to bood device.</p>
<ol>
<li>Insert the ubuntu live cd and start a live session from cd.<br />
<code>#grub</code></li>
<li>Find the existing boot device using following command. Which will out put something like (hd0,0) or (hd0,5) say (hdX,Y).<br />
<code>#grub&gt; find /boot/grub/stage1</code></li>
<li>Use the above output in the following two commands.<br />
<code>#grub&gt; root (hdX,Y)<br />
#grub&gt; setup (hdX)<br />
#grub&gt; quit</code></li>
<li>if everything is ok then you are done. just reboot the system.</li>
</ol>
<p>This article is completely based on my current experience and I am still a newbie in linux environment. so there may have sevaral other options to do the same task.</p>
]]></content:encoded>
			<wfw:commentRss>http://raynux.com/blog/2008/09/21/recovering-ubuntu-or-fedora-linux-after-installing-windows/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>GPRS Connection from fedora linux using my moto L6</title>
		<link>http://raynux.com/blog/2008/07/19/gprs-connection-from-fedora-linux-using-my-moto-l6/</link>
		<comments>http://raynux.com/blog/2008/07/19/gprs-connection-from-fedora-linux-using-my-moto-l6/#comments</comments>
		<pubDate>Sat, 19 Jul 2008 16:19:55 +0000</pubDate>
		<dc:creator>rayhan</dc:creator>
				<category><![CDATA[Fedora]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Reference]]></category>
		<category><![CDATA[GPRS]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://raynux.com/blog/?p=36</guid>
		<description><![CDATA[This is how I connect to internet from fedora box using my motorola L6 GPRS modem. I use this procedure with Teletalk connection. After a fresh fedora installation I enter the following command in the shell. This command creates a wvdial configuration file for my modem. # wvdialconf /etc/wvdial.conf Now I need to modify some [...]]]></description>
			<content:encoded><![CDATA[<p>This is how I connect to internet from fedora box using my motorola L6 GPRS modem. I use this procedure with Teletalk connection.</p>
<p>After a fresh fedora installation I enter the following command in the shell. This command creates a wvdial configuration file for my modem.<br />
<code><br />
# wvdialconf /etc/wvdial.conf<br />
</code><br />
Now I need to modify some contents of wvdial.conf file. To do so I open the /etc/wvdial.conf using VI or other text editor. And replace the content of the file with the following text and save it.</p>
<pre>
<code>
[Dialer Defaults]
Modem = /dev/ttyACM0
Baud = 460800
Init1 = ATZ
Init2 = ATQ0 V1 E1 S0=0 &amp;C1 &amp;D2 +FCLASS=0
ISDN = 0
Modem Type = USB Modem
Phone = *99#
Username = A
Password = B
Stupid Mode = 1
</code>
</pre>
<p>I make sure to set  username = A, Password=B and Stupid Mode = 1 and do not modify the line<br />
<code><br />
Modem = .....<br />
</code><br />
as this is my device name (this line can very with your phone set). Now whenever I need to connect to internet I just enter the following command to the shell.<br />
<code><br />
# wvdial<br />
</code><br />
Thats all. Same way you can turn your mobile set to internet from fedora with no or little modification.</p>
]]></content:encoded>
			<wfw:commentRss>http://raynux.com/blog/2008/07/19/gprs-connection-from-fedora-linux-using-my-moto-l6/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Good commenting practice in PHP.</title>
		<link>http://raynux.com/blog/2008/06/26/good-commenting-practice-in-php/</link>
		<comments>http://raynux.com/blog/2008/06/26/good-commenting-practice-in-php/#comments</comments>
		<pubDate>Thu, 26 Jun 2008 06:50:06 +0000</pubDate>
		<dc:creator>rayhan</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Reference]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://raynux.com/blog/?p=33</guid>
		<description><![CDATA[Currently I am working on the documentation of my software written in PHP. From this documentation project I have found that proper commenting of code is a good documentation. If you write your code base along with comment then you don&#8217;t need to worry about the API Documentation of your software. You just have to [...]]]></description>
			<content:encoded><![CDATA[<p>Currently I am working on the documentation of my software written in PHP. From this documentation project I have found that proper commenting of code is a good documentation. If you write your code base along with comment then you don&#8217;t need to worry about the API Documentation of your software. You just have to use some software like <a href="http://www.phpdoc.org">PHPDoc</a> or <a href="http://www.doxygen.org">Doxygen</a> to make the API in a minute. Specially I am using <a href="http://www.doxygen.org">Doxygen</a> in my project which is also used in <a href="http://www.cakephp.org">CakePHP</a> API documentaiton. </p>
<p>When you are commenting your code be careful to meet the commenting requirement/procedure so that those documentation software can understand your comment as a data.</p>
<p>Here is a simple example what <a href="http://www.doxygen.org">Doxygen</a> can easily parse for you.</p>
<pre>
    <code>
/**
 * Class A.
 *
 * Class description.
 *
 * @example example here.
 * @todo to do here
 *
 * @package appname
 * @subpackage appname.subname
 * @author yourname
 * @since version 1.0
 */
class A extends Object{
	/**
	 * Enter description here...
	 *
	 * @var type
	 */
	var $member1;
	/**
	 * Enter description here...
	 *
	 * @param integer $param1
	 * @param string $param2
	 * @param array $param3 contains a array of data
	 * @return boolean
	 * @since version 2.0
	 */
	function doSomeThing($param1, $param2, $param3){
		return true;
	}
}
    </code>
</pre>
<p>So if you follow the commenting technique carefully, you don&#8217;t have to white API of your own.</p>
]]></content:encoded>
			<wfw:commentRss>http://raynux.com/blog/2008/06/26/good-commenting-practice-in-php/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>SVN Server backup &amp; Restore</title>
		<link>http://raynux.com/blog/2008/06/25/svn-server-backup-restore/</link>
		<comments>http://raynux.com/blog/2008/06/25/svn-server-backup-restore/#comments</comments>
		<pubDate>Wed, 25 Jun 2008 06:00:48 +0000</pubDate>
		<dc:creator>rayhan</dc:creator>
				<category><![CDATA[Reference]]></category>
		<category><![CDATA[SVN]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://raynux.com/blog/?p=28</guid>
		<description><![CDATA[Most of the time I forget what I did to solve a problem in the past. So I have decided to do some shorthand documentation. This post is on how did I import my project repository to the repository of my assembla account. First I took the backup of my repository in my windows pc [...]]]></description>
			<content:encoded><![CDATA[<p>Most of the time I forget what I did to solve a problem in the past. So I have decided to do some shorthand documentation. This post is on how did I import my project repository to the repository of my <a href="http://www.assembla.com">assembla</a> account. First I took the backup of my repository in my windows pc with the following command.</p>
<p>Windows:<br />
<code>cmd&gt;  svnadmin dump c:\repo\proj1 &gt; c:\proj_backup\proj1_date</code><br />
Equivalent Linux command:<br />
<code>shell&gt; svnadmin dump /repo_path/proj1 &gt; /backup_path/proj1_date</code></p>
<p>Then I created a test repository and imported the backup file to the new test repository to see whether it is working. After that I deleted the test repository. </p>
<p>Windows command:<br />
<code>cmd&gt; svnadmin create c:\repo_path\proj1_new<br />
cmd&gt; svnadmin load c:\repo_path\proj1_new &lt; c:\proj_backup\proj1_date<br />
cmd&gt; rmdir /s c:\repo_path\proj1_new</code><br />
Equivalent linux command:<br />
<code>shell&gt; svnadmin create /repo_path/proj1_new<br />
shell&gt; svnadmin load /repo_path/proj1_new &lt; /proj_backup/proj1_date<br />
shell&gt; rm -rf /repo_path/proj1_new</code></p>
<p>Then I created a zip copy of the backup file <strong>proj1_data</strong> to <strong>proj1_date.zip</strong> and imported the zip copy to my account of <a href="http://www.assembla.com">assembla</a>. This is how I solved the problem related to backup &amp; restore my project repository. <a href="http://dev.eiffel.com/Subversion_Tutorial">Subversion_Tutorial</a> is a nice SVN site for quick reference.</p>
]]></content:encoded>
			<wfw:commentRss>http://raynux.com/blog/2008/06/25/svn-server-backup-restore/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Painless css layout implementation with float clearfix tweaking.</title>
		<link>http://raynux.com/blog/2008/06/24/painless-css-layout-implementation-with-float-clearfix-tweaking/</link>
		<comments>http://raynux.com/blog/2008/06/24/painless-css-layout-implementation-with-float-clearfix-tweaking/#comments</comments>
		<pubDate>Tue, 24 Jun 2008 07:36:17 +0000</pubDate>
		<dc:creator>rayhan</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[Reference]]></category>
		<category><![CDATA[Layout]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://raynux.com/blog/?p=31</guid>
		<description><![CDATA[Most of the time I forget what I did to solve a problem in the past. So I have decided to do some shorthand documentation. This is how I solve a very tricky problem when working with css in layout designing. I add the following css rules in my style file. .clearfix:after { content: "."; [...]]]></description>
			<content:encoded><![CDATA[<p>Most of the time I forget what I did to solve a problem in the past. So I have decided to do some shorthand documentation.</p>
<p>This is how I solve a very tricky problem when working with css in layout designing. I add the following  css rules in my style file.</p>
<pre>
<code>
.clearfix:after {
	content: ".";
	display: block;
	height: 0;
	clear: both;
	visibility: hidden;
}
/* Hides from IE-mac \*/
* html .clearfix {height: 1%;}
/* End hide from IE-mac */
/* row can be in any place */
.row{
	clear: both;
	margin-bottom: .3em;
}
.row:after {
	content: ".";
	display: block;
	height: 0;
	clear: both;
	visibility: hidden;
}
/* Hides from IE-mac \*/
* html .row {height: 1%;}
/* End hide from IE-mac */
.column{
	float: left;
	padding: 0;
	margin: 0;
	margin-right: 15px;
	padding-right: 0;
}
.last{
	margin-right:0;
	padding-right:0;
}

</code>
</pre>
<p>Then I add the simple row, and column class to the html elements to get the work done. like</p>
<pre>
<code>
        &lt;div class="row"&gt;
            &lt;h2&gt;Header&lt;/h2&gt;
        &lt;/div&gt;
        &lt;div class="row"&gt;
            &lt;div class="column"&gt;Home&lt;/div&gt;
            &lt;div class="column"&gt;Services&lt;/div&gt;
            &lt;div class="column"&gt;Products&lt;/div&gt;
            &lt;div class="column last"&gt;News&lt;/div&gt;
        &lt;/div&gt;
        &lt;div class="row"&gt;
            &lt;h2&gt;Content&lt;/h2&gt;
            &lt;div class="column"&gt;Body Column 1&lt;/div&gt;
            &lt;div class="column"&gt;Body Column 2
                &lt;div class="column row"&gt;
                    &lt;div class="column"&gt;
                        Nested Body Column 1
                    &lt;/div&gt;
                    &lt;div class="column last"&gt;
                        Nested Body Column 2
                    &lt;/div&gt;
                &lt;/div&gt;
            &lt;/div&gt;
            &lt;div class="column last"&gt;Body Column 3&lt;/div&gt;
        &lt;/div&gt;
        &lt;div class="row"&gt;
            &lt;div class="column"&gt;Footer Text&lt;/div&gt;
            &lt;div class="column last"&gt;Copyright text&lt;/div&gt;
        &lt;/div&gt;
    </code>
</pre>
]]></content:encoded>
			<wfw:commentRss>http://raynux.com/blog/2008/06/24/painless-css-layout-implementation-with-float-clearfix-tweaking/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
