<?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>Shinytype</title>
	<atom:link href="http://www.shinytype.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.shinytype.com</link>
	<description>Custom Code Development &#38; Insight</description>
	<lastBuildDate>Fri, 18 May 2012 16:53:32 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Local Web Development On Mac OSX</title>
		<link>http://www.shinytype.com/php/local-web-development-on-mac-osx/</link>
		<comments>http://www.shinytype.com/php/local-web-development-on-mac-osx/#comments</comments>
		<pubDate>Fri, 18 May 2012 16:53:32 +0000</pubDate>
		<dc:creator>Dave</dc:creator>
				<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[environment]]></category>
		<category><![CDATA[homebrew]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[mamp]]></category>
		<category><![CDATA[sequel pro]]></category>
		<category><![CDATA[sublime text]]></category>
		<category><![CDATA[virtual hosts]]></category>
		<category><![CDATA[virtualhostx]]></category>
		<category><![CDATA[web development]]></category>

		<guid isPermaLink="false">http://www.shinytype.com/?p=255</guid>
		<description><![CDATA[For quite some time, I used MAMP after switching to Mac from Windows (and WAMP). I even ponied up for MAMP Pro for the extra features. As time went on, they updated and wanted to pull another $30 out of me. I knew that Apache and PHP were already pre-installed on OSX so using what [...]]]></description>
			<content:encoded><![CDATA[<p>For quite some time, I used MAMP after switching to Mac from Windows (and WAMP). I even ponied up for MAMP Pro for the extra features. As time went on, they updated and wanted to pull another $30 out of me. I knew that Apache and PHP were already pre-installed on OSX so using what is basically a fairly clunky program to run MySQL and make virtual host editing easier didn&#8217;t make much sense anymore, so I searched for a better way while using these already installed components. With those in mind, this is my set up&#8230;</p>
<h1>1) MySQL via Homebrew</h1>
<p>If you haven&#8217;t heard of <a href="http://mxcl.github.com/homebrew/">Homebrew</a>, your world just got a whole lot more kickass (especially if macports drives you nuts). The perfect little package manager for OSX with a great community behind it. They&#8217;ve made it so simple that those who have never spent much time in terminal will still feel comfortable installing programs. You&#8217;ll need Xcode or Command Line Tools for Xcode, but from there it&#8217;s an easy <a href="https://github.com/mxcl/homebrew/wiki/Installation">installation</a>. Then, simply open terminal and type &#8220;brew install mysql&#8221;, follow their post-installation instruction (about the root password and installing database) and viola! Type &#8220;mysql start&#8221; in terminal and you&#8217;re set up. The client I use is <a href="http://www.sequelpro.com/">Sequel Pro</a>, which is an incredibly clean MySQL client for Mac and it&#8217;s free. When you login, remember to use the socket connection, username &#8220;root&#8221; and the password you set up with mysql&#8217;s post-installation instructions.</p>
<h1>2) Virtual Hosts</h1>
<p>It&#8217;s more of a personal choice to use a program to help me set up virtual hosts, really. For those unfamiliar, this gives you the ability to point your browser to local web files via a custom URL, like &#8220;codeigniter.site&#8221; points to &#8220;/Users/dave/Dropbox/Web Sites/CI/user_guide/&#8221; &#8211; CodeIgniter&#8217;s user guide installed to my computer. (Yeah, I use .site and .test, just a personal preference). MAMP did it fairly well before but I really love <a href="http://clickontyler.com/virtualhostx/">VirtualHostX</a>. It&#8217;s clean, powerful, and just does what it&#8217;s supposed to without getting in your way. It plays perfectly with Mac OSX&#8217;s built-in Apache. At $40 it&#8217;s a little expensive but I always think it&#8217;s worth purchasing great software from indie developers. He&#8217;s a great guy and I loved his <a href="http://clickontyler.com/blog/2011/05/experimenting-with-piracy/">blog post</a> about experimenting with people pirating his software.</p>
<h1>3) Code Development Client (bonus)</h1>
<p>I love Panic and their web development program Coda. It was a great relief to use such a great piece of software (that didn&#8217;t cost a fortune *cough ADOBE cough* that was so clean and worked pretty well. That said, it has it&#8217;s quirks which they&#8217;re clearly aware of because last I heard they&#8217;re completely revamping for Coda 2. One late night I stumbled onto <a href="http://www.sublimetext.com/">Sublime Text</a> and it was glorious. It supports pretty much everything and is so light weight. I love the cross-platformness too, just in case I ever get roped into using Windows for an employer. It walks the line of a no-frills (yet still beautiful) interface while packing some serious heat under the hood. It has a bunch of quality themes and extensions &#8211; even a package manager you can add.</p>
<p>CLOSING NOTES:</p>
<ul>
<li>One of my first annoyances with Apache was that errors were turned off. Go to terminal and type &#8220;pico /private/etc/php.ini&#8221; and change &#8220;error_reporting&#8221; to &#8220;E_ALL | E_STRICT&#8221; and &#8220;display_errors&#8221; to &#8220;On&#8221; (scroll way down).</li>
<li>You may get an error when connecting to your database in PHP (and I&#8217;m assuming other scripts as well). Connecting to &#8220;localhost&#8221; doesn&#8217;t seem to link to the IP &#8220;127.0.0.1&#8243; correctly. You can Google solutions to fix this; I just use the IP instead.</li>
<li>For what it&#8217;s worth, I prefer Chrome for browsing, Transmit for FTP, and backup my web files by saving them to <a href="http://db.tt/5OyNrcn">Dropbox</a>.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.shinytype.com/php/local-web-development-on-mac-osx/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Jolicloud and WiFi (Broadcom)</title>
		<link>http://www.shinytype.com/general-computing/jolicloud-and-wifi-broadcom/</link>
		<comments>http://www.shinytype.com/general-computing/jolicloud-and-wifi-broadcom/#comments</comments>
		<pubDate>Thu, 20 Oct 2011 08:23:47 +0000</pubDate>
		<dc:creator>Dave</dc:creator>
				<category><![CDATA[General Computing]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Broadcom]]></category>
		<category><![CDATA[Dell Inspiron 1720]]></category>
		<category><![CDATA[Jolicloud]]></category>
		<category><![CDATA[Netbook]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[WiFi]]></category>

		<guid isPermaLink="false">http://www.shinytype.com/?p=241</guid>
		<description><![CDATA[After just going through a lot of searching around to figure out how to fix the WiFi for a new Jolicloud installation, I thought I'd chronicle the issue and solution that worked for me.]]></description>
			<content:encoded><![CDATA[<p>After just going through a lot of searching around to figure out how to fix the WiFi for a new Jolicloud installation, I thought I&#8217;d chronicle the issue and solution that worked for me.</p>
<p>As you probably know, Jolicloud is a neat little netbook OS built on top  of Ubuntu&#8217;s netbook OS to run web apps natively. I opted to run it on an old Dell Inspiron 1720 as an easy-to-use and free OS for my brother to use (as letting him try full-blown Ubuntu wasn&#8217;t exactly working out) since he only needs it for the web and music. After taking Jolicloud for a test spin via a burned ISO and meeting my brother&#8217;s approval with all systems go (wifi working perfectly fine) I installed it. Everything went smoothly until realizing &#8211; uh oh! &#8211; the network manager wasn&#8217;t showing any nearby wireless networks, nor was I able to connect via manually entering one. Checking all obvious obstacles (hardware switch, BIOS settings, right clicking on the network manager applet and ensuring wireless was enabled, etc) and coming up empty handed, I searched trusty Google for answers to make it all better. While there was no direct answer to my issue with Jolicloud per se (I have to admit, their Help section is rather ridiculous &#8211; if you need help, their answer is &#8220;ask the Ubuntu guys.&#8221; Not exactly the most user friendly support for software directed at the average consumer), fortunately after much searching and reading I was able to piece together the solution for this particular issue.</p>
<p style="padding-left: 30px;">1. Check that your wireless card is Broadcom</p>
<ul>
<ul>
<ul>
<li>Press Alt+F1 To bring up Terminal.</li>
<li>Type &#8220;lspci -vvnn | grep 14e4&#8243;</li>
<li>Check to see that your network controller is from Broadcom and take note of the wireless card model (&#8220;BCM43xx&#8221;). Mine, for instance, is BCM4312.</li>
</ul>
</ul>
</ul>
<div style="padding-left: 30px;">2. Establish a wired internet connection (if you can&#8217;t, you could daisy chain wifi through another laptop and Cat5)</div>
<div style="padding-left: 30px;">3. Even if your model isn&#8217;t BCM4312, chances are yours qualifies for the STA driver (check <a href="https://help.ubuntu.com/community/WifiDocs/Driver/bcm43xx" target="_blank">here</a>)</div>
<div style="padding-left: 30px;">4. Ensure your system is up to date by typing &#8220;sudo apt-get update&#8221; and &#8220;sudo apt-get upgrade&#8221; in Terminal.</div>
<div style="padding-left: 30px;">5. Install the STA driver by typing &#8220;sudo apt-get install bcmwl-kernel-source&#8221; in Terminal.</div>
<p></p>
<div>By this point, the STA should theoretically be installed and activated, but not currently in use. You could go ahead and restart to see if your wireless woes are solved, but you could also check the Hardware Drivers dialogue to make sure it&#8217;s installed and activated. Just about every Ubuntu article and forum advice post out there talks about this dialogue but if you click on the cloud icon located at the top right corner and go to System &gt; Administration, you&#8217;ll see it&#8217;s not there. We need to install it&#8230;</div>
<p></p>
<div style="padding-left: 30px;">6. In Terminal, type &#8220;sudo apt-get install jockey-gtk&#8221;</div>
<p>
<div>Now if you go to System &gt; Administration, you&#8217;ll see Hardware Drivers. In this dialogue, you&#8217;ll see the currently in-use driver (that obviously doesn&#8217;t work) and the Broadcom STA wireless driver that we just installed, which should say that it&#8217;s activated but not currently in use. Now go ahead and reboot. Your wireless network applet should pick up all your local wireless networks. Connect to your desired wireless network and detach the wired connection.</div>
<p>
<div>Sources:</div>
<div><a href="https://help.ubuntu.com/community/WifiDocs/Driver/bcm43xx" target="_blank">WifiDocsDriverbcm43xx (Ubuntu Help)</a></div>
<div><a href="http://ubuntuforums.org/showthread.php?t=1487984" target="_blank">Ubuntu Forums</a></div>
]]></content:encoded>
			<wfw:commentRss>http://www.shinytype.com/general-computing/jolicloud-and-wifi-broadcom/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Blueprint Grid</title>
		<link>http://www.shinytype.com/tools/blueprint-grid/</link>
		<comments>http://www.shinytype.com/tools/blueprint-grid/#comments</comments>
		<pubDate>Mon, 11 Jul 2011 07:18:57 +0000</pubDate>
		<dc:creator>Dave</dc:creator>
				<category><![CDATA[Tools]]></category>
		<category><![CDATA[Blueprint]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://www.shinytype.com/?p=220</guid>
		<description><![CDATA[I've just begun working with Blueprint, a fairly popular CSS framework, and was soon annoyed with having to manually toggle it's convenient built-in grid while lining up layouts...]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-232" title="blueprint-grid" src="http://www.shinytype.com/wp-content/uploads/2011/07/blueprint-grid.jpg" alt="Blueprint Grid" width="200" height="200" />I&#8217;ve just begun working with <a title="Blueprint" href="http://www.blueprintcss.org/">Blueprint</a>, a fairly popular CSS framework, and was soon annoyed with having to manually toggle it&#8217;s convenient built-in grid while lining up layouts. The only thing I could find to do it for me was a <a href="http://www.sanityinc.com/articles/bookmarklet-to-toggle-blueprint-css-grid/">bookmarklet</a>, but I&#8217;m not in the habit of using those and in the past have worked with Less Framework 4, for which a crafty developer named <a href="http://arnaumarch.com/">Arnau March</a> made a neat little jQuery grid toggle button. So basically I&#8217;ve taken a bit of his code and had it toggle Blueprint&#8217;s built-in grid just to keep things simple. Do with it what you&#8217;d like&#8230;</p>
<p><a href="http://www.shinytype.com/projects/blueprint-grid/sample.html">Click here</a> to view the Blueprint sample page with this jQuery button added (upper right hand corner).</p>
<h3>Add this to the head of sample.html (or your own page you want to add this to) &#8230;</h3>
<pre class="brush: xml; title: ; notranslate">
&lt;script type=&quot;text/javascript&quot; src=&quot;jquery-1.6.2.min.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;blueprint-grid.js&quot;&gt;&lt;/script&gt;</pre>
<p><em>(remember to include your jQuery file)</em></p>
<h3>blueprint-grid.js &#8230;</h3>
<pre class="brush: jscript; title: ; notranslate">
/*
	blueprint grid v1.0 - For Blueprint CSS Framework (http://www.blueprintcss.org/)
	(c) 2011 Dave Rogers (http://shinytype.com), freely distributable under the terms of the MIT license:

		Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
		documentation files (the &quot;Software&quot;), to deal in the Software without restriction, including without limitation
		the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
		and to dpermit persons to whom the Software is furnished to do so, subject to the following conditions:

		THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
		THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
		AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
		TORT OR OTHERWISE, ARISING FROM, OUT OF OR 	IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

	Based off less grid v4.0 (c) by Arnau March (http://arnaumarch.com/) - also under MIT License
*/

$(document).ready(function() {
	createSwitch();
});

function createSwitch() {
	$('body').append('&lt;span id=&quot;toggle-button&quot;&gt;o&lt;/span&gt;');

	// floating toggle button
	$('#toggle-button').css({
							position: &quot;absolute&quot;,
							top: &quot;0&quot;,
							right: &quot;0&quot;,
							background: &quot;#3d5fa3&quot;,
							border: &quot;2px solid #fff&quot;,
							borderTop: 0,
							color: &quot;#fff&quot;,
							fontSize: &quot;13px&quot;,
							lineHeight: &quot;13px&quot;,
							padding: &quot;2px 8px 6px 8px&quot;,
							cursor: &quot;pointer&quot;,
							&quot;border-radius&quot;: &quot;0 0 5px 5px&quot;,
							&quot;-moz-border-radius&quot;: &quot;0 0 5px 5px&quot;,
							zIndex: 1000
	});
	$('#toggle-button').toggle(function() {
		$(this).text(&quot;x&quot;);
		$(&quot;.container&quot;).toggleClass(&quot;showgrid&quot;);
	}, function() {
		$(this).text('o');
		$(&quot;.container&quot;).toggleClass(&quot;showgrid&quot;);
	});
}</pre>
<p>&#8230;or&#8230;</p>
<h4>Download source files</h4>
<pre><a href="http://www.shinytype.com/projects/blueprint-grid/blueprint-grid-v1.0.zip">blueprint-grid-v1.0.zip</a> (173 kb)</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.shinytype.com/tools/blueprint-grid/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CodeIgniter: PHP time To MySQL datetime Helper</title>
		<link>http://www.shinytype.com/php/codeigniter-php-time-to-mysql-datetime-helper/</link>
		<comments>http://www.shinytype.com/php/codeigniter-php-time-to-mysql-datetime-helper/#comments</comments>
		<pubDate>Wed, 23 Jun 2010 07:33:12 +0000</pubDate>
		<dc:creator>Dave</dc:creator>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[Databases]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://shinytype.com/?p=197</guid>
		<description><![CDATA[A common issue most PHP developers run into is what date format should be used between PHP and MySQL. Converting can be a big pain, and their favorite formats could not be any different. CodeIgniter has a lot of great date functions (aka, &#8220;helpers&#8220;), but none really fit the bill to make it really simple [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://shinytype.com/wp-content/uploads/2010/06/codeigniter-black.jpg"><img src="http://shinytype.com/wp-content/uploads/2010/06/codeigniter-black.jpg" alt="" title="CodeIgniter" width="200" height="200" class="alignleft size-full wp-image-201" /></a> A common issue most PHP developers run into is what date format should be used between PHP and MySQL. Converting can be a big pain, and their favorite formats could not be any different.</p>
<p>CodeIgniter has a lot of great date functions (aka, &#8220;<a href="http://codeigniter.com/user_guide/helpers/date_helper.html">helpers</a>&#8220;), but none really fit the bill to make it really simple to convert PHP time (seconds since Unix Epoch) to MySQL&#8217;s datetime format, which is really the best way to store dates (so you can still leverage all of MySQL&#8217;s great date functionalities). So, I made one to extend CodeIgniter&#8217;s date helper&#8230;</p>
<p>Add <strong>&#8220;MY_date_helper.php&#8221;</strong> to <em>&#8216;/application/helpers/&#8217;</em> with the following code:</p>
<pre class="brush: php; title: ; notranslate">&lt;?php  if (!defined('BASEPATH')) exit('No direct script access allowed');
/**
 * Extends date helper to return current time in MySQL datetime format
 * By Dave Rogers
 * Shinytype.com
 *
 * @access	public
 * @param	string (optional)
 * @return	string
 */
function mysql_datetime($date=null) {
	if(!$date) {
		// use now() instead of time() to adhere to user setting
		$date = now();
		}
	if(is_numeric($date) &amp;&amp; strlen($date)==10) {
		return mdate(&quot;%Y-%m-%d %H:%i:%s&quot;, $date);
		}	else	{
		// try to use now()
		return mdate(&quot;%Y-%m-%d %H:%i:%s&quot;, now());
		}
	}

/* End of file MY_date_helper.php */
/* Location: ./application/helpers/MY_date_helper.php */
</pre>
<p>Note that it goes in your application helper stack rather than system helper. This will still extend the default helper, but since it&#8217;s in your application folder (which I personally abstract from the system folder, which I rename to it&#8217;s corresponding version number, to make upgrading CodeIgniter simple as well downgrading in the case of a bug) it will not get lost or overwritten when you upgrade CodeIgniter. Also note the &#8220;MY_&#8221; prefix. This is the default custom helper prefix, if you have changed it (&#8220;$config['subclass_prefix']&#8221; in config.php) then cascade that prefix accordingly.</p>
<p>The functionality of this helper is as simple as it looks: take PHP time and reformat it to MySQL&#8217;s datetime format. If no date is passed to the function, it simply uses the current time with CodeIgniter&#8217;s &#8220;now()&#8221; function (also available in the date helper), which is essentially a simple wrapper for PHP&#8217;s own &#8220;time()&#8221; function except it takes into account your master time reference setting (&#8220;$config['time_reference']&#8221; in config.php) and sets the time in accordance.</p>
<p>How you reference this helper:</p>
<pre class="brush: php; title: ; notranslate">
$this-&gt;load-&gt;helper('date');
echo &quot;the current datetime is &quot;.mysql_datetime();
</pre>
<p>Which displays as:</p>
<pre class="brush: plain; title: ; notranslate">the current datetime is 2010-06-23 00:12:30</pre>
<p>Example with a date passed in:</p>
<pre class="brush: php; title: ; notranslate">mysql_datetime('1277277150');</pre>
<h2>Datetime to PHP&#8217;s Time Format</h2>
<p>If you want to turn a datetime into PHP&#8217;s unix epoch format (the opposite of the above), you can add this function to the same file <em>(before the end of file lines)</em>:</p>
<pre class="brush: php; title: ; notranslate">// --------------------------------------------------------------------

/**
 * Take a MySQL datetime var and turn it into PHP's Unix Epoch time
 *
 * @access	public
 * @param	string
 * @return	int
 */
function datetime_to_unix($date) {
	if(!$date) {
		return false;
		}	else	{
		return date('U', strtotime($date));
		}
	}
</pre>
<p>With this function, a parameter is required&#8230;</p>
<pre class="brush: php; title: ; notranslate">
$this-&gt;load-&gt;helper('date');
echo datetime_to_unix('2010-06-23 00:22:23'); // returns 1277277743
</pre>
<p>Pretty painless, right?</p>
<h1>Full Source</h1>
<p>Here&#8217;s the full file if you&#8217;re just looking for a quick copy and paste&#8230;</p>
<p><strong>MY_date_helper.php</strong></p>
<pre class="brush: php; title: ; notranslate">&lt;?php  if (!defined('BASEPATH')) exit('No direct script access allowed');
/**
 * Extends date helper to return current time in MySQL datetime format
 * By Dave Rogers
 * Shinytype.com
 *
 * @access	public
 * @param	string (optional)
 * @return	string
 */
function mysql_datetime($date=null) {
	if(!$date) {
		// use now() instead of time() to adhere to user setting
		$date = now();
		}
	if(is_numeric($date) &amp;&amp; strlen($date)==10) {
		return mdate(&quot;%Y-%m-%d %H:%i:%s&quot;, $date);
		}	else	{
		// try to use now()
		return mdate(&quot;%Y-%m-%d %H:%i:%s&quot;, now());
		}
	}

// --------------------------------------------------------------------

/**
 * Take a MySQL datetime var and turn it into PHP's Unix Epoch time
 *
 * @access	public
 * @param	string
 * @return	int
 */
function datetime_to_unix($date) {
	if(!$date) {
		return false;
		}	else	{
		return date('U', strtotime($date));
		}
	}

/* End of file MY_date_helper.php */
/* Location: ./application/helpers/MY_date_helper.php */
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.shinytype.com/php/codeigniter-php-time-to-mysql-datetime-helper/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Persistent Login Protocol</title>
		<link>http://www.shinytype.com/php/persistent-login-protocol/</link>
		<comments>http://www.shinytype.com/php/persistent-login-protocol/#comments</comments>
		<pubDate>Tue, 15 Jun 2010 00:59:41 +0000</pubDate>
		<dc:creator>Dave</dc:creator>
				<category><![CDATA[Databases]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[login]]></category>
		<category><![CDATA[persistent]]></category>
		<category><![CDATA[protocol]]></category>

		<guid isPermaLink="false">http://shinytype.com/?p=156</guid>
		<description><![CDATA[A popular feature implemented in sites is persistent logins, or the "remember me" option. Here I have drawn out my own persistent login protocol and have provided experimental sample code.]]></description>
			<content:encoded><![CDATA[<p><a href="http://shinytype.com/wp-content/uploads/2010/06/persistentloginprotocol.jpg"><img src="http://shinytype.com/wp-content/uploads/2010/06/persistentloginprotocol.jpg" alt="" title="Persistent Login Protocol" width="200" height="200" class="alignleft size-full wp-image-192" /></a><br />
<h1>Introduction</h1>
<p>One feature many popular sites implement is persistent login, or the ability for a user to stay logged in for long periods of time &#8211; well beyond the time they last visited the site and subsequently closed their browser. Many basic login protocols web developers put in place either deal with cookies, which is valid until the date the web developer has specified, or sessions, which are only valid until the browser is closed. Clearly, they are very different options, each with their own pitfalls…</p>
<p><strong>Cookies:</strong><br />
<em>Pros</em> &#8211; Set it and forget it; simply check for the cookie and make them login if it doesn&#8217;t exist<br />
<em>Cons</em> &#8211; All data is viewable to the client and can be modified or stolen; a savvy user can easily mimic your cookie pattern and attempt to gain access maliciously</p>
<p><strong>Sessions:</strong><br />
<em>Pros</em> &#8211; Completely server-side, users cannot view or modify data; simple for a web developer to set, modify, and reference<br />
<em>Cons</em> &#8211; Only lasts as long as the browser is open; no native expiration option if the user leaves their browser open indefinitely</p>
<p>If only there were some way to leverage the better qualities of the two, right? Enter the persistent login protocol. Intertwining cookies, sessions and a database is not a new concept. Drupal, a very popular PHP CMS, uses the same concept in a popular <a href="http://drupal.org/project/persistent_login">module</a>. While reading up on various protocol designs, I noticed little holes in each of them. Many were good, none were great. My design takes pieces of various protocols and betters them as well as adds a bit of functionality that hadn&#8217;t existed in any of them. Ideally the concepts and sample code should plug into any existing system utilizing unique user IDs stored in a database. I&#8217;m not going to delve into the concept of persistent login too much here; there are some great articles listed at the bottom of this page for you to read more about them if you&#8217;d like.</p>
<p><strong>Requirements:</strong></p>
<ul>
<li>PHP 5.2 server</li>
<li>Intermediary knowledge of PHP (understanding of cookies, arrays, sessions, etc)</li>
<li>MySQL 5 server</li>
<li>Comfortability administering MySQL and understanding of database design</li>
</ul>
<h1>General Overview</h1>
<p>The overall concepts are simple. </p>
<ol>
<li>User successfully logs in</li>
<li>A &#8220;token&#8221; is issued &#8211; cookie, session, database</li>
<li>On every page view, the token is verified between the session and cookie</li>
<li>When the session has expired, issue a new token</li>
<li>Assume token forgery or theft if the three token sources do not match up and remove ALL sessions for this user in the database.</li>
</ol>
<p>Here is a design of the protocol to help you visualize the whole process flow:<br />
<a href="http://docs.google.com/drawings/pub?id=1Pppa7agP7hO2sHWDw2KL-I0CwVVMa_RICzlHb8hRtFo&#038;w=1856&#038;h=2009">Persistent Login Protocol Design</a> (.png)</p>
<p>Makes sense, right?<br />
You may be thinking &#8220;wait, but in PHP, sessions only expire with the browser!&#8221; This is true! It&#8217;s something that most persistent login protocols do not take into account in a way that is less database intensive than reissuing the token on each page load. I&#8217;m definitely not a fan of that, especially when you want your application to scale well. Instead, I have a session set as an array with the following parameters&#8230;<br />
- UserID<br />
- Token<br />
- Expiration Time</p>
<p>For the expiration, I set it to &#8220;seconds since the Unix Epoch&#8221; plus 900 seconds (or 15 minutes) and every time there is a page load, it checks whether that is the current time or not. Fairly simple implementation, no crazy date functions to mess with.</p>
<h1>Sample Code</h1>
<p>I do want to encourage you to look over sample code and determine whether or not it is secure enough for your system. It may not be. I wanted to avoid putting in too much extra code and functionalities that would overwhelm the subject I&#8217;m writing on here. This is why it&#8217;s referred to as sample code. Use at your own discretion.</p>
<p>First we&#8217;ll <strong>build the table in the database</strong> to store session tokens. Notice the &#8220;Active&#8221; field &#8211; it&#8217;s only purpose is to track legacy tokens and if someone tries to access the system with an inactive token, we know that it&#8217;s forged/stolen and we can take action against it.</p>
<pre class="brush: sql; title: ; notranslate">CREATE TABLE `Users_Sessions` (
  `SessionID` int(10) NOT NULL AUTO_INCREMENT,
  `UserID` int(10) NOT NULL DEFAULT '0',
  `Token` varchar(50) NOT NULL DEFAULT '0',
  `DateIssued` datetime NOT NULL,
  `Active` int(10) NOT NULL,
  PRIMARY KEY (`SessionID`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='User session mappings';</pre>
<p>We&#8217;ll also go ahead and build a table for users and insert a username (with the password &#8220;password&#8221; that is md5 encrypted) so you can play with this protocol right away&#8230;</p>
<pre class="brush: sql; title: ; notranslate">CREATE TABLE `Users` (
  `UserID` int(11) NOT NULL AUTO_INCREMENT,
  `Username` varchar(50) NOT NULL,
  `Password` varchar(50) NOT NULL,
  PRIMARY KEY (`UserID`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

INSERT INTO Users (Username, Password) VALUES ('Bob', '5f4dcc3b5aa765d61d8327deb882cf99');</pre>
<p>Now we&#8217;ll tailor the settings to whatever we want&#8230;<br />
<strong>tokenSettings.php</strong></p>
<pre class="brush: php; title: ; notranslate">&lt;?php
// database connection settings
$server		= 'localhost';
$username	= 'root';
$password	= 'root';
$database	= 'myDB';

// display errors - for testing only
$ShowErrors	= false;

// general settings
$TokenName		= 'MySiteToken';
$SessionExpire	= '15';		// in minutes
$CookieExpire	= '365';	// in days

//////////
// connect to the database
mysql_connect($server, $username, $password) or die(mysql_error());
mysql_select_db($database) or die(mysql_error());
?&gt;</pre>
<p><strong>Here is the rest of the sample code:</strong><br />
<a href="http://shinytype.com/wp-content/uploads/2010/06/PersLoginPrtcl.zip">Persistent Login Protocol Assets</a> (356 kb)</p>
<p>Included files:
<ul>
<li><em><strong>functions/clearToken.php:</strong></em> function to clear tokens in the database, session and cookie</li>
<li><em><strong>functions/issueToken.php:</strong></em> function to issue/reissue tokens</li>
<li><em><strong>functions/validateToken.php:</strong></em> heart of the system; it reviews the database, session and cookie tokens and determines what action to take per the protocol flow</li>
<li><em><strong>tokenSettings.php:</strong></em> file to modify settings (see above)</li>
<li><em><strong>tokenInclude.php:</strong></em> file to include on every page that requires authorization; takes action recommended by validateToken and executes it</li>
<li><em><strong>test.php:</strong></em> file for you to view token settings (session, cookie), how long before the session expires, current recommended action <em>(for testing only)</em></li>
<li><em><strong>login.php:</strong></em> login example to aid in your testing</li>
<li><em><strong>logout.php:</strong></em> logout example to aid in your testing</li>
<li><em><strong>PersistentLoginProtocol.png:</strong></em> design of protocol flow</li>
</ul>
<p>Unzip to your testing environment, add tables (code above) to database, commence testing. One thing I haven&#8217;t included is a way to flush old sessions out of the database after a set period of time. I figure that the developer implementing this process can easily handle that themselves.</p>
<h1>Closing Thoughts</h1>
<p><strong>a.</strong> This is a working sample that should be regarded as a proof of concept rather than a production-ready plugin. Although tested quite a bit, it hasn&#8217;t seen production-like usage and so it&#8217;s regarded as experimental right now. If you find anything that can be improved upon (within the scope of the exercise) or have a contribution, please comment or <a href="http://shinytype.com/contact/">contact me</a>.</p>
<p><strong>b.</strong> Another thing to keep in mind is that, while rare these days, some users still don&#8217;t allow cookies. This protocol depends a great deal on cookies being enabled, so if you run into this situation it would be advisable to make persistent login an <em>option</em> upon login and have the protocol fall back to a session-only login when cookies cannot be set. That&#8217;s generally a good fall back rule regardless.</p>
<p><strong>c.</strong> While, like I said before, this is a focused prototype, some cool/useful options you can build in could include&#8230;</p>
<ul>
<li>When a user&#8217;s token has been found to be compromised and all tokens for that user have been cleared, upon the next successful login from that user you can display a notice that their session was compromised along with the IP it came from. This can be useful in aiding the user in determining what they have done or where they have been that could be undermining their security.</li>
<li>Tracking IP addresses to uniquely identify &#8220;strains&#8221; of sessions so a user or administrator can see how many active sessions a user has and even log out from them.</li>
<li>Implement a &#8220;save state&#8221; feature where a user can resume their last session when they login along with what they were last doing. Note that this would require a database call on each page load, nullifying the effort made to keep from doing that with the session expiration functionality; although an ajax call could be made upon modifications to make it a little more intuitive.</li>
</ul>
<p><strong>d.</strong> Lastly, remember that security isn&#8217;t just about making an air-tight front line, there&#8217;s also a very important concept of security depth. Requiring your user to verify with a login before performing <em>major</em> tasks like editing user information, viewing billing information, etc is a great way to improve security in the case that someone makes it past the first line of defense. Sure, you don&#8217;t want to be so locked down that the user isn&#8217;t having a good time using your application, but with the sensitivity of those tasks, they&#8217;ll understand why it&#8217;s important to login.</p>
<p>Thanks for reading this article! If you like it (or have any other comments), please comment below! Thanks!</p>
<p><em>More great articles on Persistent Login protocols&#8230;</em></p>
<ul>
<li><a href="http://fishbowl.pastiche.org/2004/01/19/persistent_login_cookie_best_practice/">Persistent Login Cookie Best Practice, Charles Miller</a></li>
<li><a href="http://jaspan.com/improved_persistent_login_cookie_best_practice">Improved Persistent Login Cookie Best Practice, Barry Jaspan</a></li>
<li><a href="http://jeremycook.ca/2010/03/28/creating-a-persistent-login-mechanism/">Creating a Persistent Login Mechanism, Jeremy Cook</a></li>
]]></content:encoded>
			<wfw:commentRss>http://www.shinytype.com/php/persistent-login-protocol/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Upload Files To A MySQL Database With PHP</title>
		<link>http://www.shinytype.com/php/upload-files-to-a-mysql-database-with-php/</link>
		<comments>http://www.shinytype.com/php/upload-files-to-a-mysql-database-with-php/#comments</comments>
		<pubDate>Tue, 25 May 2010 05:24:28 +0000</pubDate>
		<dc:creator>Dave</dc:creator>
				<category><![CDATA[Databases]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[upload]]></category>

		<guid isPermaLink="false">http://shinytype.com/?p=46</guid>
		<description><![CDATA[There are plenty of tutorials and articles on uploading files to a server, but not quite as many about uploading to a database. Developing database-driven (or at least supported) applications is almost a right of passage for the bonafide PHP developer. As your applications become more ambitious and the database plays a larger role in them, uploading files to your database instead of the file server makes more sense in many scenarios. The grander the scale of your application, the more sense it makes. This tutorial walks you through uploading files to a MySQL database using PHP.]]></description>
			<content:encoded><![CDATA[<p><div id="attachment_125" class="wp-caption alignleft" style="width: 210px"><a href="http://shinytype.com/wp-content/uploads/2010/05/uploadfilestodatabase1.jpg"><img src="http://shinytype.com/wp-content/uploads/2010/05/uploadfilestodatabase1.jpg" alt="Upload Files To A Database" title="Upload Files To A Database" width="200" height="200" class="size-full wp-image-125" /></a><p class="wp-caption-text"> </p></div> There are plenty of tutorials and articles on uploading files to a server, but not quite as many about uploading to a database. Developing database-driven (or at least supported) applications is almost a right of passage for the bonafide PHP developer. As your applications become more ambitious and the database plays a larger role in them, uploading files to your database instead of the file server makes more sense in many scenarios. The grander the scale of your application, the more sense it makes.</p>
<p>Here are some advantages:</p>
<ul>
<li>If you&#8217;re building an application that has a great deal of user uploaded content, having all of that content stored in one location while being readily available to report on (you can draw reports on who uploads what, etc) is definitely a plus.</li>
<li>Files stored in a database cannot be executed there.</li>
<li>User-contributed content can be easily backed up, moved, and copied with the standard database backup jobs you should be already running to keep site content backed up.</li>
<li>Databases already have the procedures to deal with duplicated data and general data integrity.</li>
<p>In this tutorial, I&#8217;m going to use image uploading, which is a fairly common task facing many PHP developers. My example is simple and straight-forward. You can definitely be more fancy and do more things, but this should appeal to a wider audience &#8211; most especially beginners.
</ul>
<p>Before starting, you should have the following:</p>
<ul>
<li>A server with PHP and the MySQL extension installed <em>(tested with version 5.2.11)</em></li>
<li>A MySQL server</li>
<li>Credentials for connecting to the MySQL database</li>
</ul>
<p></p>
<p>First off, let&#8217;s prepare a connection file that we can include in ever page that needs to connect to the database.<br />
</p>
<h4 style="color: #264dc1;">1) Connect.php</h4>
<p>We&#8217;ll make an external PHP file and then include it so we don&#8217;t have to paste the same thing in multiple pages or edit a bunch of pages if our connection settings change. This is a BIG deal if you have a huge site and suddenly have to change your password, servername, etc.</p>
<pre class="brush: php; title: ; notranslate">&lt;?php
$server		= &quot;&quot;;	// aka &quot;localhost&quot; or &quot;69.249.73.42&quot;
$username	= &quot;&quot;;	// aka &quot;ChuckNorris&quot;
$password	= &quot;&quot;;	// aka &quot;Eatsnails4_breakfast&quot;
$database	= &quot;&quot;;	// where you want your new table to go

mysql_connect($server, $username, $password) or die(mysql_error());
mysql_select_db($database) or die(mysql_error());
?&gt;</pre>
<p></p>
<h4 style="color: #264dc1;">2) Create The Table</h4>
<p>To keep it simple, we&#8217;re just going to do the basic stuff. You can add other fields if you want to tag more information onto the file record. On one of my past projects, I had fields to track the category it was listed under, the user that uploaded it, and the date it was uploaded.</p>
<p>You might be a little confused asto how the file is physically stored to a database. What happens is the file&#8217;s content is put into the content field through the BLOB (Binary Large Object) type. It&#8217;s a part of the database now. The BLOB type we&#8217;re going to use is MEDIUMBLOB which will allow up to 16 MB files. If you&#8217;re thinking &#8220;HOLY COW! I don&#8217;t want people to be uploading 16 MB files!&#8221;, stress not my friend. We&#8217;re going to throttle the file size and other filtering in a minute.</p>
<pre class="brush: sql; title: ; notranslate">CREATE TABLE `files` (
`fid` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'unique id',
`name` VARCHAR( 30 ) NOT NULL COMMENT 'file name',
`type` VARCHAR( 30 ) NOT NULL COMMENT 'MIME type',
`size` INT( 11 ) NOT NULL COMMENT 'file size',
`content` MEDIUMBLOB NOT NULL COMMENT 'actual file'
) ENGINE = MYISAM COMMENT = 'Uploaded files'</pre>
<p>You can put this into phpMyAdmin&#8217;s query window or run this query in a PHP script.<br />
</p>
<h4 style="color: #264dc1;">3) Form.html</h4>
<p>So now we have a place to store our files &#8211; now it&#8217;s time to build the form to upload them. This is pretty simple.</p>
<pre class="brush: xml; title: ; notranslate">Upload your file to the database...
&lt;form action=&quot;upload.php&quot; method=&quot;post&quot; enctype=&quot;multipart/form-data&quot; name=&quot;uploadform&quot;&gt;
	&lt;input type=&quot;hidden&quot; name=&quot;MAX_FILE_SIZE&quot; value=&quot;350000&quot;&gt;
	&lt;input name=&quot;picture&quot; type=&quot;file&quot; id=&quot;picture&quot; size=&quot;50&quot;&gt;
	&lt;input name=&quot;upload&quot; type=&quot;submit&quot; id=&quot;upload&quot; value=&quot;Upload Picture!&quot;&gt;
&lt;/form&gt;</pre>
<p>Notice <em>&#8220;enctype=&#8221;multipart/form-data&#8221;"</em> &#8211; this is vital to uploading the file&#8230;without it, the file will not upload. Also take note of the &#8220;MAX_FILE_SIZE&#8221; &#8211; it is set to 350000 bytes, which is 350KB. This is merely our first throttle to check how big the file is. This does not work on all browsers, so we&#8217;ll have to double check that and other stuff in the next step in the process.</p>
<p></p>
<h4 style="color: #264dc1;">4) Upload.php</h4>
<p>Now, what you&#8217;re REALLY here for: the process of uploading files to the database.</p>
<p><strong>A)</strong> First we need to make sure this file is to our requirements and kill it if it is not! Since it&#8217;s a picture, we&#8217;ll be checking the file size, type, and parameters. I&#8217;ll try to note everything clearly within the code.</p>
<pre class="brush: php; title: ; notranslate">&lt;?php
// if something was posted, start the process...
if(isset($_POST['upload'])) {
	// define the posted file into variables
	$name		= $_FILES['picture']['name'];
	$tmp_name	= $_FILES['picture']['tmp_name'];
	$size		= $_FILES['picture']['size'];

	// get the width &amp; height of the file
	$imageinfo = getimagesize($tmp_name);
	list($width, $height) = $imageinfo;

	// if width is over 600 px or height is over 500 px, kill it
	if($width&gt;600 || $height&gt;500) {
		echo &quot;$name's dimensions exceed the 600x500 pixel limit. &quot;;
		echo &quot;&lt;a href='form.html'&gt;Click here&lt;/a&gt; to try again.&quot;;
		die();
		}

	// if the mime type is anything other than what we specify below, kill it
	$type = $imageinfo[&quot;mime&quot;]; // mime type
	if(!(
		$type=='image/jpeg' ||
		$type=='image/png' ||
		$type=='image/gif'
		)) {
		echo &quot;$type is not an acceptable format. &quot;;
		echo &quot;&lt;a href='form.html'&gt;Click here&lt;/a&gt; to try again.&quot;;
		die();
		} 

	// if the file size is larger than 350 KB, kill it
	if($size&gt;'350000') {
		echo &quot;$name is over 350KB. Please make it smaller. &quot;;
		echo &quot;&lt;a href='form.html'&gt;Click here&lt;/a&gt; to try again.&quot;;
		die();
		}</pre>
<p>If this checks out, then the file is good to upload!</p>
<p><strong>B)</strong> Now we extract the data from the file.</p>
<pre class="brush: php; title: ; notranslate">// open up the file and extract the data/content from it
	$extract = fopen($tmp_name, 'r');
	$content = fread($extract, $size);
	fclose($extract);</pre>
<p><strong>C)</strong> So now all of the file parameters that we need are queued up. Time to put them into the database.</p>
<pre class="brush: php; title: ; notranslate">	// connect to the database
	require(&quot;connect.php&quot;);

	// the query that will add this to the database - notice the sanatized variables
	 // &quot;mysql_real_escape_string&quot; will mess up the content, so just use slashes (I'm assuming magic quotes is off)
	$addfile = sprintf(&quot;INSERT INTO files (name, size, type, content) VALUES ('%s', '%s', '%s', '%s')&quot;,
			   mysql_real_escape_string($name),
			   mysql_real_escape_string($size),
			   mysql_real_escape_string($type),
			   addslashes($content));

	mysql_query($addfile) or die(mysql_error()); 

	// get the last inserted ID if we're going to display this image next
	$inserted_fid = mysql_insert_id();
	mysql_close();</pre>
<p><strong>D)</strong> Display the image to the user so they know it has been uploaded successfully.</p>
<pre class="brush: php; title: ; notranslate">	// display the image (you can alternatively just display a link or even just a &quot;successfully uploaded&quot; message)
	echo &quot;&lt;div align='center'&gt;
			&lt;strong&gt;$name&lt;br&gt;
			&lt;/strong&gt;&lt;img name='$name' src='getpicture.php?fid=$inserted_fid' alt='Unable to view image #$inserted_fid'&gt;
			&lt;br&gt;
			&lt;a href='form.html'&gt;upload more images&lt;/a&gt;
		&lt;/div&gt;&quot;;
	}	else	{
	echo &quot;No uploaded file present&quot;;
	}
?&gt;</pre>
<p>Now that it&#8217;s uploaded, we need a way to display the images&#8230;<br />
</p>
<h4 style="color: #264dc1;">5) GetPicture.php</h4>
<pre class="brush: php; title: ; notranslate">&lt;?php
if(isset($_GET['fid'])) {
	// connect to the database
	require(&quot;connect.php&quot;);

	// query the server for the picture
	$query	= sprintf(&quot;SELECT name, size, type, content FROM files WHERE fid = %s&quot;,
			  mysql_real_escape_string($_GET['fid']));
	$result	= mysql_query($query) or die(mysql_error()); 

	if(mysql_num_rows($result)) {
		$row		= mysql_fetch_array($result, MYSQL_BOTH);
		$name		= $row[&quot;name&quot;];
		$size		= $row[&quot;size&quot;];
		$type		= $row[&quot;type&quot;];
		$content	= $row[&quot;content&quot;]; 

		// give our picture the proper headers...otherwise our page will be confused
		header(&quot;Content-Disposition: inline; filename=$name&quot;);
		header(&quot;Content-length: $size&quot;);
		header(&quot;Content-type: $type&quot;);
		print $content;
		}	else	{
		echo &quot;File ID not found&quot;;
		}

	mysql_close();
	}	else	{
	echo &quot;No file ID given&quot;;
	}
?&gt;</pre>
<p><em>NOTE: if you&#8217;re setting up a file sharing site, you&#8217;ll want to set the disposition to &#8220;attachment&#8221; instead of &#8220;inline&#8221;</em></p>
<p>Now anytime you use the image tag&#8230;</p>
<pre class="brush: xml; title: ; notranslate">&lt;img src=&quot;getpicture.php?fid=1&quot;&gt;</pre>
<p>&#8230;it will display the image, as long as you give it the proper FID number.</p>
<p></p>
<h4 style="color: #264dc1;">Closing Thoughts</h4>
<p>Remember, allowing users to upload files to your server (whether it be your web server or database) could potentially be dangerous. Although I&#8217;ve made the script as secure as I can while not going overboard as to confuse readers, you should deliberate how to further protect the integrity of your application. In every case I have used this, I required users to register and verify their email as well as created a moderation queue for myself and other moderators to review any uploaded files before allowing them to be accessed publicly. In the scenario used here (adding image files), it&#8217;s not as necessary. It&#8217;s always best to cover all your bases, though.</p>
<p><em><strong>Tutorial Assets:</strong></em><br />
<a href="http://shinytype.com/wp-content/uploads/2010/05/Upload2Database.zip">Upload2Database.zip</a> (4kb)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.shinytype.com/php/upload-files-to-a-mysql-database-with-php/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Welcome To My New Blog!</title>
		<link>http://www.shinytype.com/general-topics/welcome-to-my-new-blog/</link>
		<comments>http://www.shinytype.com/general-topics/welcome-to-my-new-blog/#comments</comments>
		<pubDate>Tue, 01 Dec 2009 00:13:51 +0000</pubDate>
		<dc:creator>Dave</dc:creator>
				<category><![CDATA[General Topics]]></category>
		<category><![CDATA[milestones]]></category>

		<guid isPermaLink="false">http://shinytype.com/?p=26</guid>
		<description><![CDATA[So, I’ve finally done what I’ve always said I would do (but never made the time to do…) and just set myself up on a blog to share with others my experiences and various projects – typically those involving PHP applications. Hopefully I will make time to blog often enough to make it useful Here [...]]]></description>
			<content:encoded><![CDATA[<p><div id="attachment_149" class="wp-caption alignleft" style="width: 210px"><a href="http://shinytype.com/wp-content/uploads/2010/05/shinytype.jpg"><img src="http://shinytype.com/wp-content/uploads/2010/05/shinytype.jpg" alt="" title="Shinytype" width="200" height="200" class="size-full wp-image-149" /></a><p class="wp-caption-text"> </p></div> So, I’ve finally done what I’ve always said I would do (but never made the time to do…) and just set myself up on a blog to share with others my experiences and various projects – typically those involving PHP applications. Hopefully I will make time to blog often enough to make it useful <img src='http://www.shinytype.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Here are a few topics one could expect to see in the future:<br />
* <strong>PHP</strong> – tricks, applications, etc<br />
* <strong>Linux</strong> – probably nothing too advanced, just posting about things I find interesting<br />
* <strong>Databases</strong> – MySQL (which I use for personal projects, as is standard for most Open Source/LAMP projects) and MS SQL (what I used to work with and I always noticed there’s not a whole lot of information on it’s interaction with PHP)<br />
* <strong>Design</strong> – I don’t design nearly as much as I&#8217;d like to, hopefully I&#8217;ll find things to share that others find useful<br />
* <strong>General tech stuff</strong> – there are some applications (and software companies) out there that don’t need a sales staff because their customers evangelize their products perfectly…this is where I would be evangelizing their products <img src='http://www.shinytype.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />  Also I’ll probably put cool tech articles and interviews here.</p>
<p>I think that’s about it. Fingers crossed! <img src='http://www.shinytype.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.shinytype.com/general-topics/welcome-to-my-new-blog/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

