<?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>Nettuts+ &#187; Tools &amp; Tips</title>
	<atom:link href="http://net.tutsplus.com/category/tutorials/tools-and-tips/feed/" rel="self" type="application/rss+xml" />
	<link>http://net.tutsplus.com</link>
	<description>Web Development &#38; Design Tutorials</description>
	<lastBuildDate>Fri, 19 Mar 2010 17:51:11 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Quick Tip: My Favorite New IDE: WebStorm</title>
		<link>http://net.tutsplus.com/tutorials/tools-and-tips/quick-tip-my-favorite-new-ide-web-storm/</link>
		<comments>http://net.tutsplus.com/tutorials/tools-and-tips/quick-tip-my-favorite-new-ide-web-storm/#comments</comments>
		<pubDate>Mon, 08 Mar 2010 17:28:05 +0000</pubDate>
		<dc:creator>Jeffrey Way</dc:creator>
				<category><![CDATA[Tools & Tips]]></category>
		<category><![CDATA[code editors]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[tricks]]></category>
		<category><![CDATA[Videos]]></category>

		<guid isPermaLink="false">http://net.tutsplus.com/?p=9781</guid>
		<description><![CDATA[
Over the weekend, Elijah Manor tweeted about a new IDE, called WebStorm, that is currently being offered as a public preview, from JetBrains. After spending a few hours with it, I&#8217;m extremely impressed! In this video quick tip, I thought I&#8217;d show you some of my favorite features that you, frankly, just don&#8217;t see much [...]]]></description>
			<content:encoded><![CDATA[<p>
Over the weekend, <a href="http://twitter.com/elijahmanor">Elijah Manor</a> tweeted about a new IDE, called <a href="http://www.jetbrains.com/webide/">WebStorm</a>, that is currently being offered as a public preview, from <a href="http://www.jetbrains.com/webide/">JetBrains</a>. After spending a few hours with it, I&#8217;m extremely impressed! In this video quick tip, I thought I&#8217;d show you some of my favorite features that you, frankly, just don&#8217;t see much in other code editors.
</p>
<p><span id="more-9781"></span></p>
<div class="tutorial_image">
<object width="600" height="450"><param name="movie" value="http://www.youtube.com/v/NIx4tScmBos&#038;hl=en_US&#038;fs=1&#038;hd=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/NIx4tScmBos&#038;hl=en_US&#038;fs=1&#038;hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="600" height="450"></embed></object>
</div>
<h3>Alternative Viewing Options</h3>
<ul>
<li><a href="http://screenr.com/Kfh">Screenr (MP4)</a></li>
</ul>
<h2>Notable Features</h2>
<ul>
<li>Not as bloated as other IDEs, like Aptana</li>
<li>Git integration </li>
<li>Fast intellisense </li>
<li>Vertical Selecting (Option + select)</li>
<li>CSS lookup on markup (Shift + Command + I) </li>
<li>Definition lookup (Control J) </li>
<li>Immediately finds formatting errors in your code </li>
<li>Advanced debugging </li>
<li>Plenty of <a href="http://www.jetbrains.net/devnet/docs/DOC-1154">skins</a> </li>
<li><a href="http://net.tutsplus.com/tutorials/tools-and-tips/learn-how-to-write-lightning-fast-code-in-4-minutes-screencast/">Zen coding</a> implementation! (Such as, ul#nav>li*4>a)</li>
<li>Quickly and easily export inline CSS and JS to external files. </li>
</ul>
<h2>What Do You Think?</h2>
<p>So, if you&#8217;re curious, take some time to <a href="http://www.jetbrains.com/webide/">look over WebStorm</a> and let me know what you think! I&#8217;m still learning it too, so let me know if you found any cool features that I didn&#8217;t mention. </p>
]]></content:encoded>
			<wfw:commentRss>http://net.tutsplus.com/tutorials/tools-and-tips/quick-tip-my-favorite-new-ide-web-storm/feed/</wfw:commentRss>
		<slash:comments>121</slash:comments>
		</item>
		<item>
		<title>Quick Tip: Top 5 Ways to Browser-Test your Website</title>
		<link>http://net.tutsplus.com/tutorials/tools-and-tips/quick-tip-5-ways-to-browser-test-your-website/</link>
		<comments>http://net.tutsplus.com/tutorials/tools-and-tips/quick-tip-5-ways-to-browser-test-your-website/#comments</comments>
		<pubDate>Fri, 22 Jan 2010 22:00:13 +0000</pubDate>
		<dc:creator>Jeffrey Way</dc:creator>
				<category><![CDATA[Tools & Tips]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[Videos]]></category>

		<guid isPermaLink="false">http://net.tutsplus.com/?p=8741</guid>
		<description><![CDATA[<img src="http://nettuts.s3.cdn.plus.org/546_browserTesting/200x200.jpg" alt="Quick Tip: Top 5 Ways to Browser-Test your Website" />]]></description>
			<content:encoded><![CDATA[<p>
The great joy that comes from being a web designer is getting to view your new website in a variety of browsers, only to find that each renders the site at varying levels of consistency &#8211; namely Internet Explorer 7 and below. This video quick tip will demonstrate the five most popular services and tools for testing a website in a variety of browsers.
</p>
<p><span id="more-8741"></span></p>
<div class="tutorial_image">
<object classid='clsid:d27cdb6e-ae6d-11cf-96b8-444553540000' codebase='http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,115,0' width='600' height='369'><param name='movie' value='http://screenr.com/Content/assets/screenr_1116090935.swf' /><param name='flashvars' value='i=41388' /><param name='allowFullScreen' value='true' /><embed src='http://screenr.com/Content/assets/screenr_1116090935.swf' flashvars='i=41388' allowFullScreen='true' width='600' height='369' pluginspage='http://www.macromedia.com/go/getflashplayer'></embed></object>
</div>
<h3><a href="http://www.browsershots.org">Browsershots</a></h3>
<div class="tutorial_image">
<a href="http://www.browsershots.org"><br />
   <img src="http://nettuts.s3.cdn.plus.org/546_browserTesting/browserShots.jpg" alt="Browsershots" /><br />
</a>
</div>
<h3><a href="https://browserlab.adobe.com/index.html">Adobe Browserlab</a></h3>
<div class="tutorial_image">
<a href="https://browserlab.adobe.com/index.html"><br />
   <img src="http://nettuts.s3.cdn.plus.org/546_browserTesting/adobeBrowserlab.jpg" alt="Adobe Browserlab" /><br />
</a>
</div>
<h3><a href="http://www.litmusapp.com">Litmusapp (paid service)</a></h3>
<div class="tutorial_image">
<a href="http://www.litmusapp.com"><br />
   <img src="http://nettuts.s3.cdn.plus.org/546_browserTesting/litmus.jpg" alt="LitmusApp" /><br />
</a>
</div>
<h3><a href="http://www.vmware.com/products/fusion/">VMware Fusion</a></h3>
<div class="tutorial_image">
<a href="http://www.vmware.com/products/fusion/"><br />
   <img src="http://nettuts.s3.cdn.plus.org/546_browserTesting/vmware.jpg" alt="VMware Fusion" /><br />
</a>
</div>
<p><em>Please note that there are multiple applications like this. Choose the one that works best for you. I prefer VMWare Fusion, though admittedly, I don&#8217;t have a huge amount of experience with the others. </em></p>
<h3><a href="http://www.my-debugbar.com/wiki/IETester/HomePage">IE Tester</a></h3>
<div class="tutorial_image">
<a href="http://www.my-debugbar.com/wiki/IETester/HomePage"><br />
   <img src="http://nettuts.s3.cdn.plus.org/546_browserTesting/ieTester.jpg" alt="IE Tester" /><br />
</a>
</div>
<ul class="webroundup">
<li>Follow us on <a href="http://www.twitter.com/nettuts">Twitter</a>, or subscribe to the <a href="http://feeds.feedburner.com/nettuts" title="Nettuts+ RSS Feed">Nettuts+ RSS Feed</a> for the best web development tutorials on the web. </li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://net.tutsplus.com/tutorials/tools-and-tips/quick-tip-5-ways-to-browser-test-your-website/feed/</wfw:commentRss>
		<slash:comments>53</slash:comments>
		</item>
		<item>
		<title>Terminal, Git, and GitHub for the Rest of Us: Screencast</title>
		<link>http://net.tutsplus.com/tutorials/tools-and-tips/terminal-git-and-github-for-the-rest-of-us-screencast/</link>
		<comments>http://net.tutsplus.com/tutorials/tools-and-tips/terminal-git-and-github-for-the-rest-of-us-screencast/#comments</comments>
		<pubDate>Fri, 15 Jan 2010 23:18:19 +0000</pubDate>
		<dc:creator>Jeffrey Way</dc:creator>
				<category><![CDATA[Tools & Tips]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[terminal]]></category>
		<category><![CDATA[Videos]]></category>

		<guid isPermaLink="false">http://net.tutsplus.com/?p=8607</guid>
		<description><![CDATA[<img src="http://nettuts.s3.cdn.plus.org/536_git/200.jpg" alt="Terminal, Git, and GitHub for the Rest of Us" />]]></description>
			<content:encoded><![CDATA[<p>
So you&#8217;ve <a href="http://net.tutsplus.com/tutorials/other/getting-the-hang-of-github/">read </a>the <a href="http://net.tutsplus.com/tutorials/other/easy-version-control-with-git/">tutorials</a>, and still can&#8217;t manage to figure out this stuff? What is Git &#8211; and why do we even need it? If you fall into this category, much like I did at one point, I&#8217;ve recorded a video tutorial that hopes to teach you exactly how to get started. Rather than feeling your eyes blur over as you attempt to comprehend code snippets like &#8220;git push origin master,&#8221; relax, and let me explain it to you as best as I possibly can!
</p>
<p><span id="more-8607"></span></p>
<div class="tutorial_image">
<embed src="http://blip.tv/play/gcMVgb34OAA%2Em4v" type="application/x-shockwave-flash" width="600" height="450" allowscriptaccess="always" allowfullscreen="true"></embed>
</div>
<h3>Other Viewing Options</h3>
<ul>
<li><a href="http://a4.video3.blip.tv/0240001777159/NETTUTS-TerminalGitAndGitHubForTheRestOfUs515.mp4?bri=14.8&#038;brs=426"> MP4 Version (!ads)</a></li>
<li><a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?i=60856588&#038;id=291173544">iTunes/Downloadable Version (!ads)</a></li>
</ul>
<h3>Further Reading </h3>
<ul>
<li><a href="http://net.tutsplus.com/tutorials/other/getting-the-hang-of-github/">Getting the Hang of GitHub</a></li>
<li><a href="http://net.tutsplus.com/tutorials/other/easy-version-control-with-git/">Easy Version Control with Git</a></li>
<li><a href="http://developer.yahoo.com/yui/theater/video.php?v=prestonwerner-github">GitHub Overview Presented by the Founders</a></li>
</ul>
<h3>Write a Plus Tutorial</h3>
<p><strong>Did you know that you can earn up to $600 for writing a PLUS tutorial and/or screencast for us? </strong>We&#8217;re looking for in depth and well-written tutorials on HTML, CSS, PHP, and JavaScript. If you&#8217;re of the ability, please contact Jeffrey at nettuts@tutsplus.com.</p>
<p>Please note that actual compensation will be dependent upon the quality of the final tutorial and screencast. </p>
<div class="tutorial_image"><img src="http://miscfiles.s3.cdn.plus.org/banners/nettuts_728x90.jpg" alt="Write a PLUS tutorial" style="width:600px;" /></div>
<ul class="webroundup">
<li>Follow us on <a href="http://www.twitter.com/nettuts">Twitter</a>, or subscribe to the <a href="http://feeds.feedburner.com/nettuts" title="Nettuts+ RSS Feed">Nettuts+ RSS Feed</a> for the best web development tutorials on the web. </li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://net.tutsplus.com/tutorials/tools-and-tips/terminal-git-and-github-for-the-rest-of-us-screencast/feed/</wfw:commentRss>
		<slash:comments>68</slash:comments>
<enclosure url="http://a4.video3.blip.tv/0240001777159/NETTUTS-TerminalGitAndGitHubForTheRestOfUs515.mp4?bri=14.8&amp;brs=426" length="103178960" type="video/mp4" />
		</item>
		<item>
		<title>Learn how to Write Lightning-Fast Code in 4 Minutes: Screencast</title>
		<link>http://net.tutsplus.com/tutorials/tools-and-tips/learn-how-to-write-lightning-fast-code-in-4-minutes-screencast/</link>
		<comments>http://net.tutsplus.com/tutorials/tools-and-tips/learn-how-to-write-lightning-fast-code-in-4-minutes-screencast/#comments</comments>
		<pubDate>Fri, 08 Jan 2010 20:11:16 +0000</pubDate>
		<dc:creator>Jeffrey Way</dc:creator>
				<category><![CDATA[Tools & Tips]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[fast code]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[Videos]]></category>

		<guid isPermaLink="false">http://net.tutsplus.com/?p=8480</guid>
		<description><![CDATA[<img src="http://nettuts.s3.cdn.plus.org/535_fastCode/200x200.jpg" alt="Learn how to Write Lightning-Fast Code in 4 Minutes: Screencast" />]]></description>
			<content:encoded><![CDATA[<p>
We all know the benefits of using snippets and bundles to speed up our coding, but what if we could take things a step further, and turn a complex html structure into something as simple as a CSS selector? Well, thanks to a new project, called <a href="http://code.google.com/p/zen-coding/">Zen-Coding</a>, we can do this very thing!
</p>
<p>In this four-minute video quick tip, I&#8217;ll demonstrate how. </p>
<p><span id="more-8480"></span></p>
<div class="tutorial_image">
  <embed src="http://blip.tv/play/gcMVgbyPDgI%2Em4v" type="application/x-shockwave-flash" width="600" height="376" allowscriptaccess="always" allowfullscreen="true"></embed>
</div>
<h4><a href="http://code.google.com/p/zen-coding/">Download Zen-Coding</a></h4>
<h3>Other Viewing Options</h3>
<ul>
<li><a href="http://blip.tv/file/get/NETTUTS-LearnHowToWriteLightningFastCodeIn4MinutesScreencast353.mp4"> MP4 Version (no ads)</a></li>
<li><a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?i=60856588&#038;id=291173544">iTunes/Downloadable Version (no ads)</a></li>
</ul>
<h3>Update </h3>
<p>
Within the comments below, I made a suggestion that it would be neat if we could also paste in the generic &#8220;lorem&#8221; text, like so:
</p>
<pre name="code" class="html">
div#header>p>lorem
</pre>
<p>This would generate something like so: </p>
<pre name="code" class="html">
&lt;div id="header">
	&lt;p>
		Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
	&lt;/p>
&lt;/div>
</pre>
<p>Unfortunately, I didn&#8217;t know how to do it. But luckily, the author of Zen-Coding, Sergey, was able to help me. I recorded a sixty second screencast showing you how to allow for this. <a href="http://nettuts.s3.cdn.plus.org/535_fastCode/zen_coding_supplementary.mp4">You can watch it here. </a></p>
<h3>Additional Resources</h3>
<ul>
<li><a href="http://vimeo.com/7405114">Demo Video with Current Features</a></li>
<li><a href="http://mondaybynoon.com/2009/08/17/the-art-of-zen-coding-bringing-snippets-to-a-new-level/">The Art of Zen Coding</a></li>
<li><a href="http://www.smashingmagazine.com/2009/11/21/zen-coding-a-new-way-to-write-html-code/">A New Way to Write HTML Code</a></li>
</ul>
<ul class="webroundup">
<li>Follow us on <a href="http://www.twitter.com/nettuts">Twitter</a>, or subscribe to the <a href="http://feeds.feedburner.com/nettuts" title="Nettuts+ RSS Feed">Nettuts+ RSS Feed</a> for the best web development tutorials on the web. </li>
</ul>
<h3>Write a Plus Tutorial</h3>
<p><strong>Did you know that you can earn up to $600 for writing a PLUS tutorial and/or screencast for us? </strong>We&#8217;re looking for in depth and well-written tutorials on HTML, CSS, PHP, and JavaScript. If you&#8217;re of the ability, please contact Jeffrey at nettuts@tutsplus.com.</p>
<p>Please note that actual compensation will be dependent upon the quality of the final tutorial and screencast. </p>
<div class="tutorial_image"><img src="http://miscfiles.s3.cdn.plus.org/banners/nettuts_728x90.jpg" alt="Write a PLUS tutorial" style="width:600px;" /></div>
<p>
]]></content:encoded>
			<wfw:commentRss>http://net.tutsplus.com/tutorials/tools-and-tips/learn-how-to-write-lightning-fast-code-in-4-minutes-screencast/feed/</wfw:commentRss>
		<slash:comments>122</slash:comments>
<enclosure url="http://nettuts.s3.cdn.plus.org/535_fastCode/zen_coding_supplementary.mp4" length="8892731" type="video/mp4" />
<enclosure url="http://blip.tv/file/get/NETTUTS-LearnHowToWriteLightningFastCodeIn4MinutesScreencast353.mp4" length="15599195" type="video/mp4" />
		</item>
		<item>
		<title>5 More Helpful Video Quick Tips</title>
		<link>http://net.tutsplus.com/tutorials/tools-and-tips/5-more-helpful-video-quick-tips/</link>
		<comments>http://net.tutsplus.com/tutorials/tools-and-tips/5-more-helpful-video-quick-tips/#comments</comments>
		<pubDate>Fri, 20 Nov 2009 19:56:34 +0000</pubDate>
		<dc:creator>Jeffrey Way</dc:creator>
				<category><![CDATA[Tools & Tips]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[quick tip]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[Videos]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://net.tutsplus.com/?p=7844</guid>
		<description><![CDATA[<img src="http://nettuts.s3.cdn.plus.org/499_quicktips/200x200.jpg" alt="5 More Helpful Video Quick Tips" />]]></description>
			<content:encoded><![CDATA[<p>
As many of you might know, I post a sporadic video quick tip on <a href="http://www.twitter.com/nettuts">Twitter</a> once a week or so. For those of you who don&#8217;t <a href="http://www.twitter.com/nettuts">follow us</a>, here are the latest five.</p>
<p>
You&#8217;ll learn how to select anything and everything with jQuery, how to log PHP errors to a text file, how to change your website&#8217;s background with each WordPress post, and more. Each video does not exceed five minutes.
</p>
<p><span id="more-7844"></span></p>
<h3><a href="http://screenr.com/o12">How to Change your Website&#8217;s Background with Each WordPress Blog Post</a></h3>
<div class="tutorial_image">
<a href="http://screenr.com/o12"><br />
<object classid='clsid:d27cdb6e-ae6d-11cf-96b8-444553540000' codebase='http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,115,0' width='560' height='345'><param name='movie' value='http://screenr.com/Content/assets/screenr_1116090935.swf' /><param name='flashvars' value='i=27577' /><param name='allowFullScreen' value='true' /><embed src='http://screenr.com/Content/assets/screenr_1116090935.swf' flashvars='i=27577' allowFullScreen='true' width='560' height='345' pluginspage='http://www.macromedia.com/go/getflashplayer'></embed></object><br />
</a>
</div>
<ul>
<li><a href="http://screenr.com/o12">Watch on your iPhone</a></li>
<li><a href="http://screenr.com/download.aspx?ScreencastId=27577">Download the Mp4</a></li>
<li><a href="http://www.8164.org/wordpress-custom-field/">Further Reading on this Subject</a></li>
</ul>
<h3><a href="http://screenr.com/n1B">How to Rename the jQuery &#8220;$&#8221; Symbol</a></h3>
<div class="tutorial_image">
<a href="http://screenr.com/n1B"><br />
<object classid='clsid:d27cdb6e-ae6d-11cf-96b8-444553540000' codebase='http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,115,0' width='560' height='345'><param name='movie' value='http://screenr.com/Content/assets/screenr_1116090935.swf' /><param name='flashvars' value='i=23711' /><param name='allowFullScreen' value='true' /><embed src='http://screenr.com/Content/assets/screenr_1116090935.swf' flashvars='i=23711' allowFullScreen='true' width='560' height='345' pluginspage='http://www.macromedia.com/go/getflashplayer'></embed></object><br />
</a>
</div>
<ul>
<li><a href="http://screenr.com/n1B">Watch on your iPhone</a></li>
<li><a href="http://screenr.com/download.aspx?ScreencastId=23711">Download the Mp4</a></li>
</ul>
<h3><a href="http://screenr.com/IdB">How to Select Anything and Everything with jQuery</a></h3>
<div class="tutorial_image">
<a href="http://screenr.com/IdB"><br />
<object classid='clsid:d27cdb6e-ae6d-11cf-96b8-444553540000' codebase='http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,115,0' width='560' height='345'><param name='movie' value='http://screenr.com/Content/assets/screenr_1116090935.swf' /><param name='flashvars' value='i=23807' /><param name='allowFullScreen' value='true' /><embed src='http://screenr.com/Content/assets/screenr_1116090935.swf' flashvars='i=23807' allowFullScreen='true' width='560' height='345' pluginspage='http://www.macromedia.com/go/getflashplayer'></embed></object><br />
</a>
</div>
<ul>
<li><a href="http://screenr.com/IdB">Watch on your iPhone</a></li>
<li><a href="http://screenr.com/download.aspx?ScreencastId=23807">Download the Mp4</a></li>
</ul>
<h3><a href="http://screenr.com/PON">Log Errors to a Text File with PHP</a></h3>
<div class="tutorial_image">
<a href="http://screenr.com/PON"><br />
<object classid='clsid:d27cdb6e-ae6d-11cf-96b8-444553540000' codebase='http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,115,0' width='560' height='345'><param name='movie' value='http://screenr.com/Content/assets/screenr_1116090935.swf' /><param name='flashvars' value='i=20759' /><param name='allowFullScreen' value='true' /><embed src='http://screenr.com/Content/assets/screenr_1116090935.swf' flashvars='i=20759' allowFullScreen='true' width='560' height='345' pluginspage='http://www.macromedia.com/go/getflashplayer'></embed></object><br />
</a>
</div>
<ul>
<li><a href="http://screenr.com/PON">Watch on your iPhone</a></li>
<li><a href="http://screenr.com/download.aspx?ScreencastId=20759">Download the Mp4</a></li>
</ul>
<p><!-- 5--></p>
<h3><a href="http://screenr.com/IIN">Stay Up to Date on the Latest Nettuts+ Screencasts with Boxee</a></h3>
<div class="tutorial_image">
<a href="http://screenr.com/IIN"><br />
<object classid='clsid:d27cdb6e-ae6d-11cf-96b8-444553540000' codebase='http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,115,0' width='560' height='345'><param name='movie' value='http://screenr.com/Content/assets/screenr_1116090935.swf' /><param name='flashvars' value='i=23063' /><param name='allowFullScreen' value='true' /><embed src='http://screenr.com/Content/assets/screenr_1116090935.swf' flashvars='i=23063' allowFullScreen='true' width='560' height='345' pluginspage='http://www.macromedia.com/go/getflashplayer'></embed></object><br />
</a>
</div>
<ul>
<li><a href="http://screenr.com/IIN">Watch on your iPhone</a></li>
<li><a href="http://screenr.com/download.aspx?ScreencastId=23063">Download the Mp4</a></li>
</ul>
<ul class="webroundup">
<li>Follow us on <a href="http://www.twitter.com/nettuts">Twitter</a>, or subscribe to the <a href="http://feeds.feedburner.com/nettuts" title="Nettuts+ RSS Feed">Nettuts+ RSS Feed</a> for the best web development tutorials on the web.</li>
</ul>
<p>
<script type="text/javascript"><!--digg_url = "post permalink (not digg url)"; // -->
</script><br />
<script src="http://digg.com/tools/diggthis.js" type="text/javascript"></script></p>
]]></content:encoded>
			<wfw:commentRss>http://net.tutsplus.com/tutorials/tools-and-tips/5-more-helpful-video-quick-tips/feed/</wfw:commentRss>
		<slash:comments>31</slash:comments>
		</item>
		<item>
		<title>Easy Website Updates with PageLime</title>
		<link>http://net.tutsplus.com/tutorials/tools-and-tips/easy-editing-for-your-clients-with-pagelime/</link>
		<comments>http://net.tutsplus.com/tutorials/tools-and-tips/easy-editing-for-your-clients-with-pagelime/#comments</comments>
		<pubDate>Fri, 13 Nov 2009 02:10:53 +0000</pubDate>
		<dc:creator>Jeffrey Way</dc:creator>
				<category><![CDATA[Tools & Tips]]></category>
		<category><![CDATA[CMS]]></category>
		<category><![CDATA[pagelime]]></category>
		<category><![CDATA[template]]></category>
		<category><![CDATA[themeforest]]></category>
		<category><![CDATA[Videos]]></category>

		<guid isPermaLink="false">http://net.tutsplus.com/?p=7691</guid>
		<description><![CDATA[<img src="http://nettuts.s3.cdn.plus.org/492_pagelime/200x200.jpg" alt="Easy Editing for your Clients with PageLime" />]]></description>
			<content:encoded><![CDATA[<p>
<a href="http://www.pagelime.com">PageLime</a> makes the process of editing static websites laughably easy. There are times when a full CMS like WordPress is far too complicated when only simple edits are required &#8211; not to mention the fact that a static template must first be modified accordingly to work with WordPress. Wouldn&#8217;t it be easier if your current static website could instantly be integrated with a service, without requiring hours of conversion time? This is where PageLime comes in.
</p>
<p>In today&#8217;s <strong>video tutorial</strong>, we&#8217;ll go through the process of purchasing a site template on <a href="http://themeforest.net">ThemeForest</a>, and then integrating that specific template with PageLime, resulting in a website which is super easy to update&#8230;even for your mom.</p>
<p><span id="more-7691"></span></p>
<div class="tutorial_image">
<a href="http://www.pagelime.com"><br />
   <img src="http://nettuts.s3.cdn.plus.org/492_pagelime/pagelime-site.jpg" alt="PageLime" /><br />
</a>
</div>
<blockquote>
<p>
<a href="http://www.pagelime.com">PageLime</a> is a remote Content Management System that allows you to update the content, images, and documents on your web site without installing any software.
</p>
</blockquote>
<h3>The Screencast</h3>
<div class="tutorial_image">
<embed src="http://blip.tv/play/gcMVga7XAwA%2Em4v" type="application/x-shockwave-flash" width="600" height="450" allowscriptaccess="always" allowfullscreen="true"></embed>
</div>
<h3>Other Viewing Options</h3>
<ul>
<li><a href="http://blip.tv/file/2842042?filename=NETTUTS-EasyEditingForYourClientsWithPageLime191.mp4"> Hi-Quality MP4</a></li>
<li><a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?i=60856588&#038;id=291173544">iTunes Version / Download</a></li>
</ul>
<h3>What&#8217;s in Store for PageLime? </h3>
<p><em>In the CEO&#8217;s own words&#8230;</em></p>
<ul>
<li> <strong>Repeating Regions</strong> &#8211; You/Your clients will be able to have regions that you define as repeatable. This will let you dynamically create new buttons in navigation, blog like article additions, etc. This is in testing now, and will roll out across all sites in the next week!
    </li>
<li> <strong>Multipage Dynamic Content</strong> &#8211; You will be able to define areas that show up on other places in the website. So when you update them, they update in other places.
    </li>
<li> <strong>Blog</strong> &#8211; Drop in simple PageLime managed blog.
    </li>
<li> <strong>Client Invoicing</strong> &#8211; We&#8217;re building an invoicing feature from withing PageLime that will let you manage your PageLime clients with auto recurring invoices that link to your PageLime account. This basically allows you to setup a subscription model for you clients, and pass the cost of PageLime directly to them. OR charge them more, and make money off of PageLime! This will be a feature in the Business Account Level.
</li>
<li> <strong>iPhone App</strong> &#8211; Manage websites from an iPhone application. This is already designed, just need to go about building it soon. I can send you screenshots if you would like.
    </li>
<li> <strong>eCommerce</strong> &#8211; Either a partnership with another team, or build one ourselves that can be dropped in, like the blog.
</li>
<ul class="webroundup">
<li>Follow us on <a href="http://www.twitter.com/nettuts">Twitter</a>, or subscribe to the <a href="http://feeds.feedburner.com/nettuts" title="Nettuts+ RSS Feed">Nettuts+ RSS Feed</a> for the best web development tutorials on the web.</li>
</ul>
<p>
<script type="text/javascript"><!--digg_url = "post permalink (not digg url)"; // -->
</script><br />
<script src="http://digg.com/tools/diggthis.js" type="text/javascript"></script></p>
]]></content:encoded>
			<wfw:commentRss>http://net.tutsplus.com/tutorials/tools-and-tips/easy-editing-for-your-clients-with-pagelime/feed/</wfw:commentRss>
		<slash:comments>82</slash:comments>
		</item>
		<item>
		<title>How to Create a Mashup by Combining 3 Different APIs</title>
		<link>http://net.tutsplus.com/tutorials/tools-and-tips/how-to-create-a-mashup-by-combining-3-different-apis/</link>
		<comments>http://net.tutsplus.com/tutorials/tools-and-tips/how-to-create-a-mashup-by-combining-3-different-apis/#comments</comments>
		<pubDate>Mon, 13 Oct 2008 10:30:36 +0000</pubDate>
		<dc:creator>Chris Cagle</dc:creator>
				<category><![CDATA[Tools & Tips]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[google maps]]></category>
		<category><![CDATA[mashup]]></category>

		<guid isPermaLink="false">http://nettuts.com/?p=1078</guid>
		<description><![CDATA[<img src="http://nettuts.s3.cdn.plus.org/089_mashup/200x200.png" alt="API Mashup" />]]></description>
			<content:encoded><![CDATA[<p>This tutorial will show you how to create a mashup of three different <a href="http://en.wikipedia.org/wiki/API">APIs</a> including integration with Google Maps. This idea came about when I was searching through <a href="http://www.programmableweb.com/apis/directory">ProgrammableWeb&#8217;s API directory</a> for a couple APIs that complimented each other enough that I could use one to provide the other with data. What I came up with will be known as the &#8220;Beer Mashup&#8221;. </p>
<p><span id="more-1078"></span></p>
<div class="tutorial_image">
<a href="http://nettuts.s3.cdn.plus.org/089_mashup/DEMO.zip"><br />
<img src="http://net.tutsplus.com/wp-content/themes/nettuts/site_images/button_src_nm.jpg" alt=""></a><br />
<a href="http://www.nettuts.com/demos/07_mashup/DEMO/beermashup2.php" target="_blank"><br />
<img src="http://net.tutsplus.com/wp-content/themes/nettuts/site_images/button_demo_nm.jpg" alt=""></a></div>
<div class="tutorial_image"><img src="http://nettuts.s3.cdn.plus.org/089_mashup/images/mainphoto.jpg" alt="" /></div>
<h3>Step 1. API Discovery</h3>
<p>While looking through ProgrammableWeb&#8217;s directory, I found an IP geolocating tool called <a href="http://iploc.mwudka.com/">ipLoc</a>. It simply accepts in an IP address and returns relevant location-specific data on it such as it&#8217;s state, city, country, postal code, etc. </p>
<p>I then found the very cool <a href="http://beermapping.com/">Beer Mapping Project</a>, which has a huge directory of bars and pubs from not only across the US, but <a href="http://beermapping.com/brewery-maps/">many other countries</a> as well. Instantly I noticed that this was a perfect compliment to ipLoc because the <a href="http://beermapping.com/api/">BeerMapping API</a> requires a city (which we can get from the ipLoc API) to return a list of local bars and pubs. </p>
<p>Lastly, I also wanted to integrate <a href="http://maps.google.com/">Google Maps</a> into this mashup to plot out the addresses of the bars and pubs to add a bit of interactivity to the page instead of just displaying each bar in a simple HTML list. </p>
<div class="tutorial_image"><img src="http://nettuts.s3.cdn.plus.org/089_mashup/images/apilist.jpg" alt="" /></div>
<h3>Step 2. Variable Initialization</h3>
<p>I usually find it best to start PHP documents off with some of the variables that I want to set globally within the script. Here I add a line that silences PHP warning messages (Google Maps spits out many of these if you happen to try to map an invalid address) and my BeerMashup and Google Maps API keys. We will end up using these API keys when we get to their respective steps below.</p>
<pre name="code" class="php">&lt;?php
	error_reporting(E_ERROR|E_PARSE);  //Silence Errors

//Initialize Variables
	$beer_api = 'YOUR_BEERMAPPING_API_KEY';
	$gmaps_api = 'YOUR_GOOGLEMAPS_API_KEY';</pre>
<h3>Step 3. IP Geolocation Setup</h3>
<p>The ipLoc API allows you to either specify an IP address to get data on, or use the default IP address that the script finds.</p>
<p><b>Default Version:</b> <a href="http://iploc.mwudka.com/iploc/json/">http://iploc.mwudka.com/iploc/json/</a><br />
<b>Static Version (IP address is hardcoded):</b> <a href="http://iploc.mwudka.com/iploc/68.162.155.110/json/">http://iploc.mwudka.com/iploc/68.162.155.110/json/</a></p>
<pre name="code" class="php">//Set Location
	//Visitor IP Address
	$ip = getenv("REMOTE_ADDR");

	//via IPLoc
	$iploc = file_get_contents("http://iploc.mwudka.com/iploc/$ip/json/");  //Format: JSON
	$ipdata = json_decode($iploc, true);</pre>
<p>After a little testing, I realized that the default version of the ipLoc API was finding the location (Scottsdale, AZ, USA) of my hosting provider&#8217;s server rather than my home computer&#8217;s IP location (Pittsburgh, PA, USA). To circumvent this, I decided to use the static IP version of the API (Line 2 above) and passed in the IP address that is detected by the <strong><a href="http://us2.php.net/getenv">getenv</a>(&#8220;REMOTE_ADDR&#8221;)</strong> php variable.</p>
<p>After checking if the data has been successfully returned as a decoded <a href="http://www.json.org/">json</a> formatted string, we need to extract only the specific data we want to pass to the BeerMapping API, which is the <em>city</em> and <em>state</em>. </p>
<pre name="code" class="php">	// Error checking
	if ($ipdata['city']) {
		$city = $ipdata['city'];
		$state = $ipdata['region'];
		$location = $city .", ". $state;
	} else {
		$err = "No location data returned for your IP address: ". $ip; 

	}</pre>
<h3>Step 4. Integrating Google Maps</h3>
<p>This step needs to be done now because the next step will add the location points to Google Maps – and Google Maps has to be initialized before any of that can happen. </p>
<p>To make the Google Maps integration as easy and painless as possible, I&#8217;ve enlisted the help of a great PHP class called <a href="http://www.systemsevendesigns.com/phoogle">Phoogle from System Seven Designs</a>. This class takes care of all the Google Maps API heavy lifting for us while just allowing us to worry about the data. </p>
<p>All we need to do to get this to work is to first include the class file we downloaded: <em>phoogle.php</em>, then set some basic map parameters such as the height, width, zoom level and your Google Maps API key. (<a href="http://code.google.com/apis/maps/">Get one of those here</a>). </p>
<pre name="code" class="php">//Phoogle - GoogleMaps PHP Class
	require_once 'phoogle.php';
	$map = new PhoogleMap();
	$map->setAPIKey($gmaps_api); //Using the variable we set in Step 2
	$map->setHeight(450);
	$map->setWidth(750);
	$map->zoomLevel = 6;
	$map->showType = false;</pre>
<h3>Step 5. BeerMapping API</h3>
<p>Since we have the combined city and state in the variable <strong>$location</strong> from Step 3, we have everything we need to pull data from the BeerMapping API. Of course we also need one of their API keys, which can be requested <a href="http://beermapping.com/api/request_key">here</a> (about a 30 seconds process, start to finish). </p>
<p>A BeerMapping API call looks like this according to their <a href="http://beermapping.com/api/examples/">examples</a>:<br />
<b>Real Example:</b> <a href="http://beermapping.com/webservice/loccity/71515667a86b8ec7f58cd22e3af86f6e/pittsburgh,pa">http://beermapping.com/webservice/loccity/71515667a86b8ec7f58cd22e3af86f6e/pittsburgh,pa</a>
<p>After substituting our variables in for the API Key (Step 2) and Location (Step 3), our BeerMapping API call now looks like this:<br />
<b>Our Example:</b> http://beermapping.com/webservice/loccity/$beer_api/$location</p>
<p>After a little playing around with this API, I found that the location can&#8217;t have any spaces. So the below code first gets rid of the space bewtween the &#8220;city, state&#8221; format. Then it replaces all other spaces within the location with underscores &#8220;_&#8221;.</p>
<pre name="code" class="php">//Format Location for use with API
	$locationF = str_replace(", ", ",", $location); // Remove space before "State"
	$locationF = str_replace(" ", "_", $locationF); // Replace space with underscore in "City" name</pre>
<p>Their data can only be returned in xml format, so we can easily extract the data returned by this call with the <a href="http://us.php.net/simplexml_load_file">simplexml_load_file</a> PHP function.</p>
<pre name="code" class="php">//BeerMapping - Format: XML
	$beerdata = simplexml_load_file ("http://beermapping.com/webservice/loccity/$beer_api/$locationF");</pre>
<div class="tutorial_image"><img src="http://nettuts.s3.cdn.plus.org/089_mashup/images/blogdata.gif" alt="" /></div>
<p>As the image shows, we first load the whole file into the variable <b>$beerdata</b>. After checking to see if we returned any results…</p>
<pre name="code" class="php">	// Error checking
	$beererr = $beerdata->location->id; //$beererr will be 0 if there were no locations returned
	if ($beererr == '0') {
		$err = "No breweries were found in ". $location;
	} else {</pre>
<p>…the next step is to cycle through each bar/pub returned in the call, extracting all the data we need to pass into Google Maps (Step 4).  </p>
<pre name="code" class="php">		$breweries = $beerdata->location;
		$barcount = count($breweries); //How Many?

		foreach ($breweries as $brewery) {
			$name = $brewery->name;
			$link = $brewery->reviewlink;
			$street = $brewery->street;
			$city = $brewery->city;
			$state = $brewery->state;
			$zip = $brewery->zip;
			$phone = $brewery->phone;

			//Location Point set for the Google Maps API
			$map->addAddress("$street $city $state $zip", "&lt;a href='$link' title='$name BeerMap'>$name&lt;/a>&lt;br/>$street&lt;br />$city, $state $zip&lt;br />Phone: $phone");
		}
	}
?>
</pre>
<p>Line 1 above sets the structure location of the &#8220;locations&#8221;. Line 2 counts the amount of &#8220;locations&#8221; the API result returned. The remaining lines use a <a href="http://us3.php.net/foreach">foreach loop</a> to cycle though each &#8220;location&#8221; and pull out it&#8217;s address information. Line 14 sets a &#8220;point&#8221; for each brewery on our Google Map.</p>
<h3>Step 6. HTML Generation</h3>
<p>After finishing all the PHP code that we&#8217;ve created, we can now work on displaying it. The first few lines shown below are standard in any HTML document, but after that we get back to using PHP. We first check to see if the variable <strong>$err</strong> is FALSE – which would mean that the <strong>$err</strong> variable is empty, or that we never received an error. If we never got an error, we spit out the Google Map, otherwise we spit out an error message. </p>
<pre name="code" class="php">&lt;html xmlns="http://www.w3.org/1999/xhtml">
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
&lt;head>
&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
&lt;link rel="stylesheet" type="text/css" href="styles.css" />
&lt;title>Bars Near &lt;?php echo $location; ?>&lt;/title>
&lt;/head>
	&lt;body>
	&lt;div class="wrapper">
		&lt;div class="header">
			&lt;img class="logo" src="images/logo.png" alt="The Beer Mashup" />

			&lt;p class="footer">Developed by &lt;a href="http://www.cagintranet.com">Chris Cagle&lt;/a> for &lt;a href="http://www.nettuts.com">NETTUTS&lt;/a>&lt;/p>

			&lt;div class="mapdiv">
				&lt;?php
				if (!$err) {
					echo "&lt;div>";
					$map->printGoogleJS();
					$map->showMap();
					echo "&lt;h3>". $location ." &lt;span>(". $barcount ." Bars)&lt;/span>&lt;/h3>";
				} else {
					echo "&lt;p class=\"error\">&lt;b>". $err ."&lt;/b>&lt;/p>";;
				}
				?>
			&lt;/div>
		&lt;/div>
	&lt;/div>
	&lt;/body>
&lt;/html></pre>
<p>After adding in some text and CSS and you now have a great looking web page that displays all the bars and pubs within the vicinity of the location of whoever is viewing the web page. </p>
<p><a href="http://www.nettuts.com/demos/07_mashup/DEMO/beermashup1.php">View the demo of the page as it stands now</a>. The mashup is working great now, but we have one more improvement that will make all the difference when it comes to UI.</a></p>
<h3>Step 7. Changing the Code to Allow Locations to be Input by the Visitor</h3>
<p>At this point, our page works just fine but there is one small caveat: The visitor can only view bars from his or her current location. What if the visitor wants research bars in a different town rather than the one our IP API returned for him or her? Any visitor would want the ability to specify the location to research in. </p>
<p>To allow this, we will have a simple form that will accept in a city and state from the visitor then reload the page for the given location and skip the ipLoc API call completely. We will insert this code right before our <b>&lt;div class=&#8221;mapdiv&#8221;></b> line in Step 6. </p>
<pre name="code" class="html">&lt;form method="post" id="form" action="beermashup2.php">
	&lt;span>location: (ex. New Orleans, LA)&lt;/span>
	&lt;input type="text" value="" name="loc" id="loc" />&lt;br class="clear" />
	&lt;input type="submit" id="submitted" value="SEARCH" name="submitted" />
&lt;/form></pre>
<div class="tutorial_image"><img src="http://nettuts.s3.cdn.plus.org/089_mashup/images/webform.jpg" alt="" /></div>
<p>In order to make this work, we will need to wrap the code we made in the ipLoc step (Step 3) in an if-statement that checks if the form was submitted or not. If the form *was not* submitted (which will happen each time the page is initially loaded), then it will use the ipLoc IP geolocation code. If the form *was* submitted, it will take what the user submitted and set our <strong>$location</strong> variable to that. </p>
<pre name="code" class="php">//Set Location
	if ( isset($_POST['loc']) ) {
		//via user input
		$location = $_POST['loc'];
	} else {
		//Visitor IP Address
		$ip = getenv("REMOTE_ADDR");

		//via IPLoc
		$iploc = file_get_contents("http://iploc.mwudka.com/iploc/$ip/json/");  //Format: JSON
		$ipdata = json_decode($iploc, true);

		// Error checking
		if ($ipdata['city']) {
			$city = $ipdata['city'];
			$state = $ipdata['region'];
			$location = $city .", ". $state;
		} else {
			$err = "No location data returned for your IP address: ". $ip;
		}</pre>
<h3>Step 8. Putting it all Together</h3>
<p><a href="http://www.nettuts.com/demos/07_mashup/DEMO/beermashup2.php">View the demo of the final application.</a></p>
<p>You can view the source code of the final project (which is pretty much just the steps above pushed together) and see how I ended up combining 3 separate APIs into one application. Take a stroll for yourself through the <a href="http://www.programmableweb.com/apis/directory">API directory over at ProgrammableWeb</a> and see what you can come up with on your own. Working with APIs is <a href="http://www.cagintranet.com/voice/">my new obsession</a> because it is exciting to be able to create something new and useful from someone else&#8217;s data. If this tutorial has helped you mashup a couple of APIs, post them here &#8211; I would love to see them.</p>
]]></content:encoded>
			<wfw:commentRss>http://net.tutsplus.com/tutorials/tools-and-tips/how-to-create-a-mashup-by-combining-3-different-apis/feed/</wfw:commentRss>
		<slash:comments>48</slash:comments>
		</item>
		<item>
		<title>Organize Your Team with Collabtive</title>
		<link>http://net.tutsplus.com/tutorials/tools-and-tips/organize-your-team-with-collabtive/</link>
		<comments>http://net.tutsplus.com/tutorials/tools-and-tips/organize-your-team-with-collabtive/#comments</comments>
		<pubDate>Fri, 10 Oct 2008 10:30:03 +0000</pubDate>
		<dc:creator>Thord Hedengren</dc:creator>
				<category><![CDATA[Tools & Tips]]></category>
		<category><![CDATA[collabtive]]></category>

		<guid isPermaLink="false">http://nettuts.com/?p=1072</guid>
		<description><![CDATA[<img src="http://nettuts.s3.cdn.plus.org/088_Collabtive/200x200.png" alt="Collabtive" />]]></description>
			<content:encoded><![CDATA[<p>
When you&#8217;re managing larger teams of writers, developers, artist, or whatever really, a collaboration software can come in handy. The most popular and most talked about in the blogosphere is without a doubt <a href="http://www.basecamphq.com/">Basecamp</a>, which is a hosted solution that will set you back $$ monthly. If you want to save in on that, or if you just want to have full control of your inside stuff, then open source solution <a href="http://collabtive.o-dyn.de/">Collabtive</a> is for you.
</p>
<p><span id="more-1072"></span></p>
<blockquote><p>
&#8220;Collabtive is collaborative software to get your projects done!&#8221;
</p></blockquote>
<h3>Step 1: Download and Install</h3>
<p>Collabtive is still in beta, the current version is 0.4.8, but so far I&#8217;m very impressed. It is easy to use, and the install was simple enough.</p>
<p>First of all, <a href="http://collabtive.o-dyn.de/">download Collabtive from the website</a>, and upload it to your server. I installed this for my company, and I&#8217;ll use that URL for the examples below. You&#8217;ll need PHP5, by the way, but if you don&#8217;t have that you really should be giving your host a hard time! Anyway, upload the files, and make the following writeable by the server:</p>
<ul>
<li>the <em>/templates_c</em> folder</li>
<li>the <em>/files</em> folder</li>
<li>the file <em>/config/standard/config.php</em></li>
</ul>
<p>Then create a MySQL database for your install, keep the database name, user name, and password nearby, and point your browser to where you uploaded the files, for me that was http://team.cylinderlabs.net. You want to open the install.php file, so that would be http://team.cylinderlabs.net/install.php</p>
<div class="tutorial_image"><img src="http://nettuts.s3.cdn.plus.org/088_Collabtive/install1.jpg" border="0" /></div>
<p>From here on it&#8217;s easy. Just fill out the database details (you should probably keep &#8220;localhost&#8221;, which is filled out on beforehand, unless your database is on its own server) and click the Continue button.</p>
<div class="tutorial_image"><img src="http://nettuts.s3.cdn.plus.org/088_Collabtive/install2.jpg" border="0" /></div>
<p>Now, fill out the details for the admin account. You don&#8217;t want to loose these, so make sure you remember them. Here you can also import content from Basecamp, should you be a switcher, although this is a feature I haven&#8217;t been able to try since I haven&#8217;t used the service in a long time. Did you try it? Do share your experience in the comments!</p>
<p>Anyway, click Continue when you&#8217;re done.</p>
<div class="tutorial_image"><img src="http://nettuts.s3.cdn.plus.org/088_Collabtive/install3.jpg" border="0" /></div>
<p>And you know what, you&#8217;re done! Login, and you&#8217;ll arrive at the Dashboard, looking more or less like the one above. Now, let&#8217;s take this baby for a spin, shall we?</p>
<p>But wait! There&#8217;s one more thing, not mentioned in any readme file. Change the writing permissions of <em>/config/standard/config.php</em> back to read only. You don&#8217;t want people to dig out your database details, now do you? If you&#8217;re really anal about security, you might want to fiddle with the other write settings as well.</p>
<p>Now we&#8217;re done.</p>
<h3>Step 2: Putting Collabtive to Good Use</h3>
<p>The first thing I did was to go to Administration, using the four icons in the top right, and then choose System administration. Here you can change the name of your Collabtive install, the timezone, pick a template (just one included, I&#8217;m afraid), import from Basecamp yet again, and so on.</p>
<div class="tutorial_image"><img src="http://nettuts.s3.cdn.plus.org/088_Collabtive/admin.jpg" border="0" /></div>
<p>I then went to the user administration, again, using Administration in the top right and then User administration. Adding a user is simple and straight forward, but if you want a pretty user profile page like me, you&#8217;ll have to urge your users to click the edit button. It looks really bland and boring otherwise. I like the option to download a VCF card for each user, based on the details submitted, by the way. Very corporate-ish.</p>
<div class="tutorial_image"><img src="http://nettuts.s3.cdn.plus.org/088_Collabtive/user.jpg" border="0" /></div>
<p>Since this is a collaborative software, you&#8217;ll work a lot with projects and tasks. The first thing you need to do is to create a new project. You do that in Administration, yet again, and then Project administration, where you&#8217;ll find a list of your current projects, and also an Add project button. I added a project for my Notes Blog WordPress theme, mostly to try stuff out, but also to keep track of the time spent on things.</p>
<div class="tutorial_image"><img src="http://nettuts.s3.cdn.plus.org/088_Collabtive/project.jpg" border="0" /></div>
<p>Every task belongs to a task list, and that in turn belongs to a milestone, so your next step would be to add a suitable milestone. For me, that&#8217;s an alpha version of the theme. Then you add the task list associated with the milestone, and populate it with tasks. It is all very straight forward, and you can of course appoint everything to different persons working in the system.</p>
<div class="tutorial_image"><img src="http://nettuts.s3.cdn.plus.org/088_Collabtive/task.jpg" border="0" /></div>
<p>If you&#8217;ve ever used Basecamp you probably recognize the work flow. While Collabtive is simple compared to Basecamp, at least so far, it does the basics very well. We&#8217;ll be running it in my company for now.</p>
<h3>Step 3: Cool Little Things</h3>
<p>There are some cool little things that I&#8217;d like to point out with Collabtive, the first being every date field in the system. When you click the field, a calendar just pops up, and when you&#8217;ve picked the date, it disappears. No icons or nonsense like that, just a simple and obvious functionality that I like.</p>
<p>Speaking of icons, here and there you&#8217;ll see a disk icon. Hover it to get further options for saving down the associated data, which could be your task list or whatever. Most stuff can be saved as an Excel or PDF file, which is cool. Sure, they could just have had small icons for each of these, but the hover functionality decreases clutter, even though it encumbers the functionality somewhat. Since this is something I won&#8217;t use on a daily basis, I think it is good as it is.</p>
<p>Another cool thing is the online list in the sidebar. If you&#8217;re online at the same time as another user, you can start at chat right then and there with him or her, just by clicking a speech bubble icon to the right of the username.</p>
<div class="tutorial_image"><img src="http://nettuts.s3.cdn.plus.org/088_Collabtive/chat.jpg" border="0" /></div>
<p>The Timetracker feature could prove useful as well, you access it on the various project dashboards, where you can easily add a time report for when you worked on the project. This is certainly a good thing, but as always it depends on you remembering to fill out the time tracker form each time, and to add even smaller edits to a project, otherwise it won&#8217;t be a truthful time report in the end. Still, easy to use and manage.</p>
<div class="tutorial_image"><img src="http://nettuts.s3.cdn.plus.org/088_Collabtive/timetracker.jpg" border="0" /></div>
<p>There is support for themes, and if you visit <a href="http://collabtive.o-dyn.de/forum/">the Collabtive forums</a>, you&#8217;ll find a few threads about it, but at this time the standard theme is the one you&#8217;ll build upon. Also, there&#8217;s no documentation on this, so that&#8217;s a limitation of course. That being said, just building from the standard theme should make it fairly easy to do some minor edits to fit your need, should you want to brand your install a little harder.</p>
<h3>Wrapping It Up</h3>
<p>I&#8217;m impressed by Collabtive so far. There are a few things I think it lacks, one being a choice of themes to style it. This, along with more localization files, is probably just a matter of time, since the system overall is responsive and easy to use, a true option to Basecamp for smaller organizations.</p>
<p>One thing it has to sort out, however, is a backup functionality. I want it to e-mail me database backups, and perhaps even do backups of uploaded files, so that I can restore my collaborative system should the server end up dying on me. Hopefully this is due in an upcoming version.</p>
<p><a href="http://collabtive.o-dyn.de/">Give Collabtive a go</a> if you need to manage your team, it&#8217;s worth a shot! Also, don&#8217;t forget to let us know how the Basecamp import feature works out for you.</p>
]]></content:encoded>
			<wfw:commentRss>http://net.tutsplus.com/tutorials/tools-and-tips/organize-your-team-with-collabtive/feed/</wfw:commentRss>
		<slash:comments>57</slash:comments>
		</item>
		<item>
		<title>The Best Ways to Fight Spam</title>
		<link>http://net.tutsplus.com/tutorials/tools-and-tips/the-best-ways-to-fight-spam/</link>
		<comments>http://net.tutsplus.com/tutorials/tools-and-tips/the-best-ways-to-fight-spam/#comments</comments>
		<pubDate>Mon, 06 Oct 2008 10:30:32 +0000</pubDate>
		<dc:creator>Justin Shreve</dc:creator>
				<category><![CDATA[Tools & Tips]]></category>
		<category><![CDATA[fight spam]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://nettuts.com/?p=1064</guid>
		<description><![CDATA[<img src="http://nettuts.s3.cdn.plus.org/086_FightingSpam/200x200.png" alt="Fighting Spam" />]]></description>
			<content:encoded><![CDATA[<p>
<strong>Spam is one of the major pitfalls of the social web.</strong> According to sites such as <a href="http://www.postini.com/index.php">Postini</a>, 10 out of 12 email messages are spam. As if that weren&#8217;t already enough to make you cringe, 1 in 39 emails contain a virus. Spam is penetrating into other regions of the Internet as well. The creators of the blogging software Wordpress report that nearly <a href="http://akismet.com/stats/">87% of all blog comments are also spam</a>. As messaging and communication applications proliferate throughout the web, developers and site owners have to get creative in the fight against the thousands upon thousands of unwanted messages streaming in every day. Deciding on the best method of spam prevention on your blogs, forums, or even contact forms can be difficult.  In this article we will take a look at a service called Akismet and how it can help. We will also look at why some other methods of fighting spam fail.
</p>
<p><span id="more-1064"></span></p>
<h3>Methods of Fighting Spam</h3>
<p><strong>Disallowing multiple consecutive submissions</strong>. Spammers almost always post more than one SPAM comment or message at a time.  A common method for fighting spam is to log the incoming message with the user&#8217;s IP address and a timestamp of the post. Then, when a user attempts to post multiple comments, you can check to see if the user has posted more than once within a specified window of time, for example 30 seconds, or if the current poster was also the last poster. This is not a bulletproof method because spammers can use proxies when they want to post multiple times, and robots have as much time in the world as they want to  spam your site.</p>
<p>
<div class="tutorial_image"><img src="http://nettuts.s3.cdn.plus.org/086_FightingSpam/postingtooquickly.jpg" alt="" border="0" /></div>
</p>
<p><strong>Keyword Blacklist</strong>. Another method of fighting spam is to build a blacklist of common spam keywords yourself and to disallow posts that contain the words. In its most simplest form, you can create an array of keywords and check to see if an incoming string contains them. Spammers have evolved defenses against this method by posting variations of the words. They replace letters with numbers, symbols, and other such characters to create a broad selection of keyword variations.</p>
<p><strong>CAPTCHA</strong>. CAPTCHA (Completely Automated Public Turing Test) is one of the most common spam prevention techniques on the web today.  The technique is very useful, and almost any site that allows you to register for an account or post information publicly uses CAPTCHA in one way or another. CAPTCHA tests can be audio files, but are more commonly images presenting a series of characters and numbers that you have to enter into a form. The technique is a useful tool for blocking robots that attempt to visit your site to post spam messages or create fake accounts with fake information.</p>
<p>CAPTCHA works well for its intended use, but there are minor drawbacks. A CAPTCHA requires (yet another) field for users to fill in after entering usernames, passwords, and security questions. There is understandably an annoyance factor accompanying their use.  In addition, disabled users may not be able to use the CAPTCHA field. Finally, human spammers can also still spam your site because a CAPTCHA only blocks out robot spammers.</p>
<p>
<div class="tutorial_image"><img src="http://nettuts.s3.cdn.plus.org/086_FightingSpam/captcha.jpg" alt="" border="0" /></div>
</p>
<h3>So What&#8217;s Left?</h3>
<p>Having reviewed some of the current methods and their weak points, you may be wondering what else we can do to protect our blogging applications.  I would like to introduce a new spam fighting tool from the creators of WordPress. The service is called <a href="http://akismet.com/">Akismet</a> and is described by its creators as a &#8220;&#8230; collaborative effort to make comment and trackback spam a non-issue and restore innocence to blogging, so you never have to worry about spam again.&#8221;</p>
<p>The tool can be implemented in any project as long as you have an API key, which can be used free for non-commercial use or purchased for commercial use for as little as $5 a month. There are several Akismet plugins for existing software, and these are identified later in this article. Alternatively, you can include the service in your own projects as we will demonstrate.</p>
<p>
<div class="tutorial_image"><img src="http://nettuts.s3.cdn.plus.org/086_FightingSpam/akismet.jpg" alt="" border="0" /></div>
</p>
<h3>Implementing Akismet in your Own Projects</h3>
<p>As of now the only way to receive an API key is to sign up for a free WordPress.com user account. Turn your browsers towards <a href="http://wordpress.com/signup/">http://wordpress.com/signup/</a> and fill out the normal required fields: username, password, and email as seen below and then read and agree to the <a href="http://wordpress.com/tos/">terms of service</a> agreement. Make sure that you register for a blog as you can not receive an API key without the registration. Don&#8217;t worry about this detail, because the API key won&#8217;t be tied to a specific blog. Once you have finished the registration process you should receive an email with your new API key.</p>
<p>
<div class="tutorial_image"><img src="http://nettuts.s3.cdn.plus.org/086_FightingSpam/wordpresssignup.jpg" alt="" border="0" /></div>
</p>
<p>You will now need to download and unzip <a href="http://www.achingbrain.net/files/PHP5Akismet/PHP5Akismet.0.4.zip">PHP5Akismet.0.4.zip</a> (24K) from <a href="http://www.achingbrain.net">Achingbrain</a>. Upload the single php file to an area accessible by your scripts. The other files and documentation are just for reference.</p>
<p>We will assume that you are working with an existing project. This could be anything that allows user contributions such as a forum or blog. We will also assume that the logic for creating and displaying content already exists. With that in mind, our first step is to load the file into our own project.</p>
<pre name="code" class="php">
include "path/to/file/Akismet.class.php";
</pre>
<p>Next we will need to create a new instance of the Akismet class. Using the classes constructor, we can pass our API key and the URL of the site using it. Make sure to replace the following data with your own.</p>
<pre name="code" class="php">
$akismet = new Akismet( "http://myblog.com", "API KEY HERE");
</pre>
<p>
Now the service needs the actual comment data that we want to check. In the following instance I am using some example data, but in production the comment information would derive from POST data. The Akismet service will then compare the comment information to a database of more than 7,486,928,953 spam comments and return a result if the submitted post has been identified as a spam comment.
</p>
<pre name="code" class="php">
$akismet->setCommentAuthor("Justin Shreve");
$akismet->setCommentAuthorEmail("test@test.com");
$akismet->setCommentAuthorURL("http://serenelabs.com");
$akismet->setCommentType("forums");
$akismet->setCommentContent("I really agree with what  you are saying! I can't believe I never thought of that before!");
</pre>
<p>The functions presented here are quite straightforward. The only function that requires some further explanation is the setCommentType function. This is used by Akismet to help the service identify the origin of the comment (was it posted on a public newsgroup, forum, or blog?), and you can pass any argument you want. For example, if you are using the function to spam-proof a wiki, then use wiki as the type. If you are protecting a blog, then use a blog type.</p>
<p>Now we will use a function called isCommentSpam. This is the function that actually contacts the service. The boolean function will return true if the comment is identified as spam and false if the comment is verified as legitimate.</p>
<pre name="code" class="php">
if( $akismet->isCommentSpam() )
{
	// Here we can store logic to deal with spam comments.
	// Usually we can store the comment internally for later reference just in case the service makes a mistake.
}
else
{
	// This is where you would insert the content into the database.
}
</pre>
<p>Using Akismet is as simple as these few lines of code! You have now integrated a spam-fighting service into your site. The service can be used in conjunction with the other forms of spam defense mentioned earlier. Keep in mind that Akismet is a service that grows each time you use it because the functions contribute your spam content to the database. There may be valid messages sometimes identified as spam and vice-versa. As a result, we may want to integrate a little more functionality to deal with potential misidentification.</p>
<p>If a message is wrongly identified as SPAM, then you can notify Akismet, and they will deal with it accordingly. Alternatively, you can mark a comment as SPAM if it happened to fall through the Akismet filter. When implementing the following functionality, make sure that the comment data in the variables is set in the same format as above.</p>
<p>The function</p>
<pre name="code" class="php">
$akismet->submitHam();
</pre>
<p>can be used to notify the service that the comment they reported as spam is actually ok. </p>
<p>While the function</p>
<pre name="code" class="php">
$akismet->submitSpam();
</pre>
<p>can be used to notify the service that a comment that was approved actually is a piece of spam.</p>
<h3>Other Libraries</h3>
<p>PHP5 isn&#8217;t for everyone. Akismet libraries have also been created in a slew of other languages. Below are a few of the most popular:</p>
<ul>
<li><a href="http://kemayo.wordpress.com/2005/12/02/akismet-py/">Python</a></li>
<li><a href="http://miphp.net/blog/view/php4_akismet_class">PHP4</a></li>
<li><a href="http://rubyforge.org/projects/ror-akismet/">Ruby on Rails</a></li>
<li><a href="http://www.codeplex.com/Wiki/View.aspx?ProjectName=AkismetApi">.NET 2.0</a></li>
</ul>
<p>All of these can be easily integrated into your projects in much the same way as described above.</p>
<h3>Popular implementations</h3>
<p>Don&#8217;t feel the need to roll your own software but still want to take use of Akismet? Many solutions already exist for blog, CMS, or forum software:</p>
<ul>
<li><a href="http://resources.invisionpower.com/index.php?appcomponent=downloads&#038;showfile=876">Invision Power Board</a></li>
<li><a href="http://www.eadz.co.nz/blog/article/phpbb-akismet.htm">phpBB</a></li>
<li><a href="http://drupal.org/project/akismet">Drupal</a></li>
<li><a href="http://www.vbulletin.org/forum/showthread.php?t=118421">vBulletin</a></li>
<li><a href="http://loweblog.com/freelance/article/akismet-for-expression-engine/">Expression Engine</a></li>
<li>and of course WordPress by default!</li>
</ul>
<h3>Closing</h3>
<p>I hope that this guide will serve as an introduction into some alternative forms of spam combat.  A site without SPAM not only appears more professional to users, but is also much easier to manage for administrators and moderators.</p>
]]></content:encoded>
			<wfw:commentRss>http://net.tutsplus.com/tutorials/tools-and-tips/the-best-ways-to-fight-spam/feed/</wfw:commentRss>
		<slash:comments>39</slash:comments>
		</item>
		<item>
		<title>Introduction to Adobe Air</title>
		<link>http://net.tutsplus.com/tutorials/tools-and-tips/introduction-to-adobe-air/</link>
		<comments>http://net.tutsplus.com/tutorials/tools-and-tips/introduction-to-adobe-air/#comments</comments>
		<pubDate>Thu, 02 Oct 2008 10:30:21 +0000</pubDate>
		<dc:creator>Cesare Rocchi</dc:creator>
				<category><![CDATA[Tools & Tips]]></category>
		<category><![CDATA[adobe]]></category>
		<category><![CDATA[adobe air]]></category>

		<guid isPermaLink="false">http://nettuts.com/?p=986</guid>
		<description><![CDATA[<img src="http://nettuts.s3.cdn.plus.org/083_adobeAirIntro/200x200.png" alt="Adobe Air Intro" />]]></description>
			<content:encoded><![CDATA[<p>This tutorial will introduce you to Adobe Air, a framework to build rich internet applications. This first introduction will show how to create a simple application using Html/Js technologies.<span id="more-986"></span>
</p>
<p><!--more--></p>
<h3>What is Adobe Air?</h3>
<p>Adobe Air is a framework which allows building desktop applications.<br />
	Adobe Air applications are based on two technologies: Html/Js and Flash.<br />
	Developers can choose to build desktop application via Html/Js, Flash or Flex. After a brief overview of the architecture, we will build a simple application using Html/Js.
</p>
<h3>Step 1 &#8211; Architecture of an Air application</h3>
<p>
An Air application is executed by means of a runtime component, which executes the code contained in the air file. As you can see in the figure Adobe provides the runtime component for the three mayor operative systems, Mac OS X, Windows (XP/Vista) and Linux (note: the Linux version is still in beta). The figure might lead to think that the two approaches are exclusive, either you develop in HTML/JS or Flash. Since the air runtime allows &#8220;bridging&#8221; between Javascript and ActionScript engines, you can call javascript code from an swf, manipulate HTML/DOM via ActionScript, etc.
</p>
<div class="tutorial_image"><img src="http://nettuts.s3.cdn.plus.org/083_adobeAirIntro/images/architecture.gif" border="0" /></div>
<h3>Step 2 &#8211; OS level functionalities</h3>
<p>Adobe Air runtime is not simply an integration of HTML/JS and Flash technologies. The runtime provides a set of API which allows air applications to interact with OS functionalities like:</p>
<ul>
<li/> File read and write
<li/> Native Windows/Menus creation and management
<li/> Retrieval of internet resources
	</ul>
<p>
Adobe Air includes also SQLite, a database engine to locally store and retrieve data.
</p>
<h3>Step 3 &#8211; Installation</h3>
<p>
To repeat the steps described below you need to install the runtime and the sdk (Software Development Kit), which enables you to build air applications.<br/><br />
The runtime can be downloaded from <a href="http://www.adobe.com/go/getair">http://www.adobe.com/go/getair</a>. Just run the installer and follow the instructions.<br />
The SDK can be downloaded from: <a href="http://www.adobe.com/go/getairsdk">http://www.adobe.com/go/getairsdk</a><br />
Unzip the SDK and place the folders in the location you prefer (macosx users will have to mount a .dmg image). Remember the location of the SDK, we will refer to it as <code>SDKPATH</code>.<br />
The directory of the SDK should look like this:
</p>
<div class="tutorial_image"><img src="http://nettuts.s3.cdn.plus.org/083_adobeAirIntro/images/sdkFolders.png" border="0" /></div>
<h3>Step 4 &#8211; Configuration</h3>
<p>
The SDK has to be configured, otherwise the OS will not find the commands to be executed.<br />
In fact, if you open a shell a type <code>adl</code>, your OS will say something like &#8220;command not found&#8221;. This will work only if you move to the bin directory of the SDK folder. Since we want to be able to run build and test commands from every folder we have to configure the SDK. It is important to type correctly the absolute path of the bin directory in the SDK folder.
</p>
<p>On a Mac OS X follow this procedure:</p>
<ol>
<li/>Open the Terminal (/Applications/Utilities/Terminal)
<li/>Type <code>cd</code> to be sure you are in your home folder
<li/>look for a file named <code>.profile</code>. If it does not exist create it
<li/>Look for a line similar to this: <code>export PATH=$PATH:/usr/bin</code>
<li/>add another line like this: <code>export PATH=$PATH:/airsdk/bin</code>
<li/>if the path to the air SDK contains white spaces wrap it with a double quote (e.g. &#8220;/my pathtosdk/air&#8221;)
<li/>Close and reopen the terminal. Or type <code>source .profile</code>
</ol>
<p>
On Windows follow these steps:
</p>
<ol>
<li/>Right click on My Computer, choose Properties
<li/>Select the Advanced Tab and then click the Environment Variables button
<li/>Select <code>PATH</code> from the bottom list and add the path to the sdk folder at the end, as in figure.
</ol>
<div class="tutorial_image"><img src="http://nettuts.s3.cdn.plus.org/083_adobeAirIntro/images/winSettings.png" border="0" /></div>
<p>To test whether the configuration is successful let&#8217;s open a shell and type the<br />
<code language="shell">adt</code> command.<br />
The result should be the following:
</p>
<div class="tutorial_image"><img src="http://nettuts.s3.cdn.plus.org/083_adobeAirIntro/images/testAdt.png" border="0" /></div>
<p>
This response technically means that we have provided a wrong number of parameters to the command, but it also<br />
means that the SDK has been correctly installed and configured.
</p>
<h3>Step 5 &#8211; Project creation</h3>
<p>
Let&#8217;s now create our project folder. We call it myTest and we create two files: myTest.html and myTest.xml.</p>
<p>
The xml file is the configuration file, which enables setting up the air application. Open it with your preferred editor and insert the following code.</p>
<div class="tutorial_image"><img src="http://nettuts.s3.cdn.plus.org/083_adobeAirIntro/images/xmlCode.png" border="0" /></div>
<p><br/><br/></p>
<p><!--</p>
<pre name="code" class="xml">
	<?xml version="1.0" encoding="utf-8" ?>
	<application xmlns="http://ns.adobe.com/air/application/1.0">
	    <id>com.spreadingfunkyness.myTest</id>
	    <filename>myTest</filename>
	    <name>My first Adobe Air App</name>
	    <description>An application to test Air sdk</description>
	    <version>0.1</version>

	    <initialWindow>
	        <content>myTest.html</content>

	        <systemChrome>standard</systemChrome>
<transparent>false</transparent>
	        <visible>true</visible>
	        <minimizable>true</minimizable>
	        <maximizable>true</maximizable>
	        <resizable>true</resizable>
	    </initialWindow>
	</application>
</pre>
<p>--></p>
<p>
The first line is a standard header for xml files. The second line starts the definition of our application. The <code>id</code> is the unique identifier of your application. In this case I prefixed that with my domain name. The <code>filename</code> is the name of the executable that we will generate. <code>Name</code> is the name of the application, as seen by the user. The <code>description</code> is a snippet which is shown during the installation to describe the application. <code>Version</code> indicates the version number of your app, 0.1 in our case. <br/><br />
After specifying metadata about the application we go to the definition of the graphics, enclosed in the <code><initialWindow></code> tag.
</p>
<p>
Line 10 specifies the root file, that is the file to be loaded in the air application at startup. In this case the myTest.html that we will show later. <code>Title</code> is the string that will appear in the upper part of the window. The <code>systemChrome</code> specifies whether your application has the standard chrome (the one of the hosting OS), or none. Chrome is a set of standard tools which allows manipulating a windows in a desktop environment, namely the title bar, close/resize buttons, borders and the area to grip for resizing.
</p>
<p>
The <code>background</code> of an Air application can be set to transparent, but this option is valid only if the chrome is set to none. Visible allows to decide whether you application should be displayed when launched. This is useful when the startup takes some time and you don't want to display the graphics to users.<br />
The meaning of tags <code>minimizable</code>, <code>maximizable</code> and <code>resizable</code> should be intuitive and should not need explanation.
</p>
<p>Now let's look at myTest.html which actually contains our application. </p>
<div class="tutorial_image"><img src="http://nettuts.s3.cdn.plus.org/083_adobeAirIntro/images/html1.png" border="0" /></div>
<p><!--</p>
<pre name="code" class="html">
	<html>
		<head>

		</head>
	    <body>  
<div align="center">This is my first Air application.</div>

	    </body>
	</html>
</pre>
<p>-->
<p>
As you can see it is a standard html page, with a head and a body. The head contains a title and the body has a simple div with center-aligned text.
</p>
<h3>Step 6 - Running the application</h3>
<p>
Before packing the application as a .air file we will test it to check whether it produces the expected result.<br />
The tool we will use id <code>adl</code>, which allows to run our Air applications without installation.<br />
Let's open a shell and go to the directory which contains our myTest files (both html and xml).<br />
Then type the following command:
</p>
<pre name="code">
	adl myTest.xml
</pre>
<p>
This runs the application with the chrome of the current OS. On a MacOs should look like this.
</p>
<div class="tutorial_image"><img src="http://nettuts.s3.cdn.plus.org/083_adobeAirIntro/images/myTestApplicationMac.png" border="0" alt="Your Air application running on MacOsx"/></div>
<p>
On Windows XP the application will appear like this:</p>
<div class="tutorial_image"><img src="http://nettuts.s3.cdn.plus.org/083_adobeAirIntro/images/myTestApplicationWin.png" border="0" alt="Your Air application running on Windows XP" /></div>
<p>
You might doubt that this application works just with html. Let's test javascript.<br />
We change the <code>myTest.html</code> file as follows.</p>
<div class="tutorial_image"><img src="http://nettuts.s3.cdn.plus.org/083_adobeAirIntro/images/html2.png" border="0" /></div>
<p><!--</p>
<pre name="code" class="html">
    <html>
	<head>

		<script>
			function myfunction() {
				alert("javascript is working!");
			}
		</script>
	</head>
	<body>
<div align="center">This is my first Air application.</div>

		<button type="button" onClick="myfunction()">test javascript</button>
	</body>
	</html>
</pre>
<p>--></p>
<p>
With respect to the previous version we added a script tag which contains the definition of a simple javascript function, <code>myfunction()</code>,popping up an alert (lines 4-8). We added a button to the body (line 12). The action associated with the button click is the <code>popme()</code> function. Let's save the file and run it, using the same command from the shell, <code>adl myTest.xml</code>
</p>
<p>
If we click the button we should see something like the following:
</p>
<div class="tutorial_image"><img src="http://nettuts.s3.cdn.plus.org/083_adobeAirIntro/images/myTestApplicationJS.png" border="0" alt="Javascript runnning on Air application" /></div>
<h3>Step 7 - Deploying Air application</h3>
<p>
Once your application is ready for deployment we can create the .air file, which is the distribution package for Adobe Air applications.<br />
This file, which is based on zip compression, contains all the stuff needed to install air applications.<br />
An Air application has to be signed with a certificate. For widely distributed applications it is preferable to obtain a certificate from an authority like <a href="http://www.thawte.com">thawte</a>.<br />
Our purpose is just testing, so a self signed certificate is enough. The creation of a certificate can be done via the <code>adt</code> command. Open a shell, move to the project folder, and type this command:
</p>
<pre name="code">
	adt -certificate -cn mycertificate 1024-RSA mycertificatefile.p12 mysecretpass
</pre>
<p>
<code>adt -certificate -cn</code> is simply the syntax required by the command. The following table explains the values provided to the command.
</p>
<table border="1" cellspacing="0" cellpadding="5" >
<thead>
<tr>
<td><strong>Parameter Value</strong></td>
<td><strong>Explanation</strong></td>
</tr>
</thead>
<tbody>
<tr>
<td>mycertificate</td>
<td>The name of the certificate</td>
</tr>
<tr>
<td>1024-RSA</td>
<td>The encryption key of the certificate</td>
</tr>
<tr>
<td>mycertificatefile.p12</td>
<td>The file where the certificate is stored</td>
</tr>
<tr>
<td>mysecretpass</td>
<td>The password which protects your certificate</td>
</tr>
</tbody>
</table>
<p>
If you check the project folder you'll find a new file called <code>mycertificate.p12</code> which is the self-signed certificate we right created.<br />
The project folder should now contain three files as in the figure below.
</p>
<div class="tutorial_image"><img src="http://nettuts.s3.cdn.plus.org/083_adobeAirIntro/images/cert.png" border="0" alt="Project folder with self-signed certificate" /></div>
<p>
Now we have all we need to create our .air file. We have to run a pretty long shell command. Don't panic. I'll explain every single word. First let's see it.
</p>
<p><code>adt -package -storetype pkcs12 -keystore mycertificate.p12 AIRHelloWorld.air AIRHelloWorld.xml AIRHelloWorld.html</code></p>
<p>
As above <code>adt -package</code> is the syntax of the command, <code>storetype</code> indicates the the format of the keystore. This is a pretty technical parameter. To be brief, since we generated a certificate according to the pkcs12 format we have to tell it to the compiler. Next we specify the certificate file, via the <code>-keystore</code> parameter. Finally, we provide the name of the resulting .air file, the xml file containing the application settings and the .html entry point file. When we issue this command we will be asked for the password entered during the creation of the certificate ("mysecretpass") in our case.<br />
We now have a .air file, which is the distribution format of our application. If we double click it the installation process will start.<br />
Installation goes through two simple steps as shown below.</p>
<div class="tutorial_image"><img src="http://nettuts.s3.cdn.plus.org/083_adobeAirIntro/images/installation1.png" border="0" alt="Installation - First Step" /></div>
<p>
Notice that, since we self signed the certificate, the published Identity of the application if UNKNOWN.
</p>
<div class="tutorial_image"><img src="http://nettuts.s3.cdn.plus.org/083_adobeAirIntro/images/installation2.png" border="0" alt="Installation - Second Step" /></div>
<p>
During the second step you can specify where to install the application and whether to start it when the installation is finished.</p>
<h3>Conclusion</h3>
<p>
In this tutorial we have introduced the Adobe Air framework and we have built our first Adobe Air application using Html/Js.<br />
In the next episodes we will see how to build the same application with Flex and Flash CS3.
</p>
<ul class="webroundup">
<li>Subscribe to the <a href="http://feeds.feedburner.com/nettuts" title="NETTUTS RSS Feed">NETTUTS RSS Feed</a> for more daily web development tuts and articles.</li>
</ul>
<p>
<script type="text/javascript"><!--digg_url = "post permalink (not digg url)"; // -->
</script><br />
<script src="http://digg.com/tools/diggthis.js" type="text/javascript"></script></p>
]]></content:encoded>
			<wfw:commentRss>http://net.tutsplus.com/tutorials/tools-and-tips/introduction-to-adobe-air/feed/</wfw:commentRss>
		<slash:comments>59</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic Page Served (once) in 0.310 seconds -->
