<?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>Geek Gumbo</title>
	<atom:link href="http://www.geekgumbo.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.geekgumbo.com</link>
	<description>A potpourri of Web Developmemt, Linux, and Windows tidbits and observations</description>
	<lastBuildDate>Wed, 10 Mar 2010 04:21:37 +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>PHP Passing Function Variables</title>
		<link>http://www.geekgumbo.com/2010/03/10/php-passing-function-variables/</link>
		<comments>http://www.geekgumbo.com/2010/03/10/php-passing-function-variables/#comments</comments>
		<pubDate>Wed, 10 Mar 2010 04:15:40 +0000</pubDate>
		<dc:creator>dale</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.geekgumbo.com/?p=931</guid>
		<description><![CDATA[This obviously is not a new topic.  Functions and variables have been around for as long as programming has been around, and passing variables in functions are present in all programming languages.  For the sake of completeness, since we just covered &#8220;include&#8221; and &#8220;require,&#8221;  let&#8217;s take a look at functions and variables [...]]]></description>
			<content:encoded><![CDATA[<p>This obviously is not a new topic.  Functions and variables have been around for as long as programming has been around, and passing variables in functions are present in all programming languages.  For the sake of completeness, since we just covered &#8220;include&#8221; and &#8220;require,&#8221;  let&#8217;s take a look at functions and variables maybe from a slightly different angle.</p>
<p>So let&#8217;s get started.  This metric stuff is disorienting at times.  To make things easier for folks visiting your web site, you decide to offer them an easy way to convert Celsius temperature to Fahrenheit.  Since many user&#8217;s may want to do this conversion, let&#8217;s create a function to convert Celsius to Fahrenheit.  </p>
<p>So here&#8217;s the function.  </p>
<pre class="brush:php" >

function ConvertCelsius ( $celsius_to_convert ) {

$fahrenheit = (1.8 * $celsius_to_convert ) + 32;

return $fahrenheit;

}
</pre>
<p>You drop the function in your library.php file, and your all set.  Let&#8217;s use it.  You have a map of a region on your web page that shows temperature in Celsius all over the map.  In the upper right corner you have an input named, &#8220;celsius.&#8221;  labeled &#8220;Convert Celsius to Fahrenheit.&#8221;  with a Submit button.  Yes, I know it would be nicer to click a button and convert all the readings to Fahrenheit.  I&#8217;ll leave that to you.  For this example, you type a temperature into the box and click the &#8220;Submit&#8221; button.  We&#8217;ll use a form &#8220;Post&#8221; method, and on submit send it back to your controller file.  Let&#8217;s peak into the controller.php file.</p>
<pre class="brush:php" >

/* Bring the inputted temp in from the form
and assign it a variable name.  */
$celsius = $_POST['celsius'];

/*  Bring in the function in the library.php file  */
include ("library.php");

/*  Call the function to do the conversion  */
$fahrenheit = ConvertCelsius ( $celsius ) ;
</pre>
<p>Now, we have some things to talk about.  First, you do not have to put your function in a library file, you can put it in any file, including the same file where you use it.  The function obviously needs to be declared or stated before the function is called.</p>
<p>You can pass more than one variable into a function.  Convert ($inch, $foot, $gallon, $fahrenheit); would pass four variables into the function.  However, you&#8217;re only allowed to pass one variable back from the function with the return, as in &#8220;return $fahrenheit&#8221;.  Not to worry, the one variable, can be an array or an object, which would allow you to pass more than one variable back with a return.</p>
<p>Notice that the variable, &#8220;$celsius&#8221; you passed into the function does not have to be called &#8220;$celsius_to_convert&#8221; that you have in the function.  It is converted to &#8220;$celsius_to_convert&#8221; by the function when in the function.</p>
<p>Which brings us to scope.  &#8220;$celsius_to_convert&#8221; is called a local variable.  It is valid only inside the function.  I can not use it outside the function.  The way to use the data coming back from the function is to assign it to a variable outside the function, like so: $farenheit = ConvertCelsuis ( $celsius ).  We can use $fahrenheit outside the function.  This concept of where a variable is valid is known as scope of a variable.  Let&#8217;s stop here for now.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geekgumbo.com/2010/03/10/php-passing-function-variables/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP Include and Require &#8211; Passing Variables</title>
		<link>http://www.geekgumbo.com/2010/03/07/php-include-and-require-passing-variables/</link>
		<comments>http://www.geekgumbo.com/2010/03/07/php-include-and-require-passing-variables/#comments</comments>
		<pubDate>Sun, 07 Mar 2010 15:52:22 +0000</pubDate>
		<dc:creator>dale</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.geekgumbo.com/?p=917</guid>
		<description><![CDATA[Frequently when you write a php application you have a task or functionality in your code that you will use over and over again.  For example, when verifying form inputs, you would want to make sure that a number is an integer, and eliminate all letters and decimal points.  This is handled by creating an [...]]]></description>
			<content:encoded><![CDATA[<p>Frequently when you write a php application you have a task or functionality in your code that you will use over and over again.  For example, when verifying form inputs, you would want to make sure that a number is an integer, and eliminate all letters and decimal points.  This is handled by creating an integer verification function, you might call checkint().  You usually place the checkint() function in another library file that contains all your other verification functions, maybe called verification.php.</p>
<p>The normal flow of your application runs something like this.  You get your form information from your html web page and with a &#8220;post&#8221; method, feed it back to your php controller file.  If there is an integer value in the form, you assign it to a variable, &#8220;$intvalue&#8221; for example, you want to verify the data coming back from the form is what it&#8217;s meant to be and is not corrupted, so you call your &#8220;checkint($intvalue)&#8221; function to check the &#8220;$intvalue&#8221; variable.</p>
<p>There&#8217;s only one problem, since the Internet is stateless, the controller file knows nothing about any other file, function, or variable in the system.  The controller file does not have a clue as to what &#8220;checkint($intvalue)&#8221; function means, or where it is located.  And it responds with an &#8220;undefined function&#8221; error message.</p>
<p>The above situation calls for an &#8220;include&#8221; or &#8220;require&#8221; function in your controller file.  We want to &#8220;include&#8221; or &#8220;require&#8221; the verification.php file, that has the checkint() function in it, to be placed in the controller script.  And that is what the &#8220;include&#8221; and &#8220;require&#8221; functions do.  They open the verification.php file, copy, and place its contents in the controller file.  After this operation is completed, the checkint() function is now in the controller file, and you can go ahead and use the checkint function to verify your data.</p>
<p>Here&#8217;s the syntax for ways you can include another file in your current file:</p>
<pre class="brush:php">

/* With includes, all of these are valid */
include " ../files/verification.php";
include ("C:\wamp\www\mysite\files\verification.php");
include "http://www.anothersite.com/index.html?clr=red&#038;style=xhtml";
include_once ("verification.php");

/* You can substitute require for include in all the above examples.  */

require ("verification.php");
require_once "verification.php";
</pre>
<p>You can use () or not, since most functions use (),  it is normal to use the ()&#8217;s with your includes and requires.</p>
<p>You&#8217;ll notice in line 4, I returned the variables &#8220;clr&#8221; and &#8220;style&#8221; with the include file which could have come from another server.  You can retrieve the color and style variable with a call to the php get, like so: $scrclr = $_GET['color']; and $varstyle = $_GET['style'];</p>
<p>Include and require do the same thing, the difference is if you can&#8217;t find the file with require, it will shut your application down, while with include it will throw an error message and continue with the application.  Other than that include and require are the same, and can be used interchangeably.</p>
<p>You can use include and require in conditional statements to only bring the file in if a certain condition is met, like so.  </p>
<pre class="brush:php">

if ( $layer = 12 ){
include ("../file/layer12.php");
}

/* the {} are required with an include or require  */
</pre>
<p>A require will bring in the file even if it is a false condition, while an include will not.</p>
<p>Why use include_once or require_once?  Your not allowed to declare the same variable or function twice within a script, or php will throw an error.   The error message will read something like this:</p>
<p>&#8220;Fatal error: Cannot redeclare checkint() (previously declared in :67) in c:\www\wamp\mysite\files\verificaiton.php on line 71&#8243;</p>
<p>This error can also come when an included file calls another include, and this is where problems can start that will drive you nuts.</p>
<p>If you use &#8220;include_once&#8221; or &#8220;require_once,&#8221;  php will check to see if the file has already been included, if it has it will proceed without including the file, which will prevent the above error.</p>
<p>Another error with includes is improper order.  You call the function you need before you include the file.  PHP runs scripts in order, the include needs to come first.</p>
<p>In a complex application with many files, some of my most frustrating errors have come with includes and trying to figure out why I&#8217;m getting the redeclare error message.  I&#8217;ve also had problems with include_once, and the undeclared variable error message.</p>
<p>Although the error message may tell you where the problem is, it doesn&#8217;t tell you where the original include occurred or why the function has not been declared already, which sometimes causes you to track through your system.  A patch, if you are really hung up by an error message, and are short on time, is to ditch the include and to redundantly repeat the function in the script itself, not what I call eloquent coding, but it works.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geekgumbo.com/2010/03/07/php-include-and-require-passing-variables/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Opera 10.50 released</title>
		<link>http://www.geekgumbo.com/2010/03/05/opera-10-50-released/</link>
		<comments>http://www.geekgumbo.com/2010/03/05/opera-10-50-released/#comments</comments>
		<pubDate>Fri, 05 Mar 2010 20:42:03 +0000</pubDate>
		<dc:creator>dale</dc:creator>
				<category><![CDATA[Browsers]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://www.geekgumbo.com/?p=913</guid>
		<description><![CDATA[I keep writing about the Opera browser, I can&#8217;t help myself.   Opera Software has put the Opera web browser at the forefront of web browser technology with innovative features, some of which are unique to the Opera browser.   Admittedly the browser technology crowd is an incestuous bunch, and steal ideas back and forth [...]]]></description>
			<content:encoded><![CDATA[<p>I keep writing about the Opera browser, I can&#8217;t help myself.   Opera Software has put the Opera web browser at the forefront of web browser technology with innovative features, some of which are unique to the Opera browser.   Admittedly the browser technology crowd is an incestuous bunch, and steal ideas back and forth from one another, still Opera has been doing it better, and more uniquely than any other browser for a couple of years now.   What I don&#8217;t understand is why it only has 3% of the market share, it deserves a larger share of the market.   Here&#8217;s why.</p>
<p>With this new release 10.50, Opera has introduced a new JavaScript engine, actually three new engines combined, that together, increase the speed of the browser up to seven times faster than the previous version, which was already fast.   Opera Software claims Opera 10.50 is the &#8220;Fastest Browser on Earth.&#8221;   It is.   Couple that with a perfect score of 100 on the ACID3 test, and you have a state-of-the art, W3C web compliant, lightning fast, web browser, and there&#8217;s so much more.</p>
<p><a href="http://www.geekgumbo.com/wp-content/uploads/2010/03/opera1050-2.png"><img class="aligncenter size-medium wp-image-915" title="opera1050-2" src="http://www.geekgumbo.com/wp-content/uploads/2010/03/opera1050-2-300x232.png" alt="" width="300" height="232" /></a></p>
<p>Opera has joined Cloud Computing in using additional servers on the Internet to enhance your browsing experience in three ways that currently no other browser supports.  First, we have <strong>Opera Turbo</strong>.   Opera Turbo can be used by people with slower Internet connections.  Opera turbo compresses the web page on the server to up to 80% of its original size to speed your download speed.   This will improve your browsing speed on some of the slower wifi connections in retail coffee houses also.</p>
<p>Second, we have <strong>Opera Unite</strong>. Opera Unite allows you to share music, videos and documents with friends without having to either email the content to them, or uploading the content to a server.   It sets up a virtual server between your friends over the Internet.  This means larger content files like movies can be shared with your friends easily.</p>
<p>And finally, we have <strong>Opera Link</strong>.   For those familiar with Delicious, a web service that allows you to centralize all your bookmarks and put them on the Internet, Opera goes one step further.   You set up your Link account in each of your computer browsers.   From then on Opera Link can keep your Bookmarks, Browser configuration, history, Speed Dial, Notes, and Searches synchronized with all the rest of your Opera browsers automatically.   If you set a new bookmark in your browser at work, it will automatically show up on your home browser.</p>
<p>That brings up <strong>Speed Dial</strong>, which shows you images of your favorite web pages you can click on when you open a new browser window.  Unique to Opera is <strong>Visual Tabs</strong>, pull down the menu tab bar and an image of the web pages in your tabs are shown.   For those small fonts on the web page, and for readers who can&#8217;t see the page, there is a <strong>Page Zoom</strong> icon to quickly zoom in to the web page with a simple click of the Page Zoom icon on the bottom right toolbar, that&#8217;s nice.   With <strong>Notes</strong>, you can select some text on a web page, right click, and save it to Notes.   This automatically saves the text and the web URL, for reference later.   And it&#8217;s not limited to one note, like Microsoft&#8217;s copy and paste.</p>
<p>Then we have faster browsing with a series of enhancements.  <strong>Mouse Gestures </strong>allow you to customize your mouse movement.  To give you an example, right click on your mouse, and move your mouse to the left, and you&#8217;ll go back to your previous web page, no more having to place your mouse on the &#8220;Back&#8221; icon at the top of the browser to go back one page. There&#8217;s <strong>Fast Forward</strong> to go to the next page, like the back button, this one guesses what your next page would be, and takes you to it.   No more going to the bottom of the Google page to find the next page number.  And there&#8217;s a fast back to take you to the original page of your search.   Opera will fill out the user name and password for a particular web page automatically if you like with their <strong>Password Manager</strong>.</p>
<p>You need a <strong>Dictionary</strong>, an <strong>Encyclopedia</strong>, or to <strong>Translate</strong> a word into another language, select the word, and right click, and select what you want to do.</p>
<p>If you close some of the tabs you had open and closed the wrong one by mistake, no problem, there&#8217; a <strong>Trash</strong> can icon that keeps track of tabs you closed.  You can also browse <strong>History Free</strong> if you prefer.</p>
<p>Have you ever wanted to find a particular word on a web page full of text.  One way you could do this is with Alt-F then type in the word, Opera makes this a little easier with <strong>Find in page</strong>,  just type a period with your word, and it is highlighted on the screen.</p>
<p>Windows7 and Vista introduced Widgets for little applications you wanted on your desktop.  There&#8217;s <strong>Opera Widgets</strong> that do the same thing in your browser window.</p>
<p>And now to features that I really like.   Google&#8217;s Chrome originally allowed you to type your search into the address bar.  They were the first, then Firefox followed, Opera has done them one better with a <strong>Quick Search</strong>.   You can type your search into the address bar, like with the other browsers, and in Opera you can assign a one letter url for the address bar.   Let me give you a couple of examples.   I want to search for a JavaScript book on Amazon, type &#8220;z javascript&#8221; in the address bar and you&#8217;ll go to Amazon books and the JavaScript books page pops up.   You can type &#8220;w php&#8221; and bring up the Wiki for php, or &#8220;e ipods&#8221; and bring up Ebay on the ipod page.   What&#8217;s nice is you can create your own custom key shortcuts also.   If you go to Amazon a lot this really simplifies getting to where you want to be.</p>
<p>And finally, Opera is starting to listen.  I have said many times before that if Opera would put out some decent web development tools, I would give up Firefox for web development and use Opera full time.   With this release the Alpha of <strong>Opera Dragonfly</strong> is being released.  This will be a full-featured development environment allowing you to debug JavaScript, inspect the DOM, the CSS, network traffic and data stores with built-in remote debugging for mobile devices.   To view page source, go to page-&gt;Developer&#8217;s Tools-&gt;source, or validate, or <strong>Inspect Element</strong>. You can Inspect the element on the page with a right click of the mouse.   This is an Alpha version, some of the choices are not functional yet,  as to be expected with an Alpha release, like the color picker, but Operation Dragonfly, the equivalent to Firebug on Firefox, looks like it has the potential to out do Firebug in functionality once everything gets hooked up.</p>
<p>Opera, now that you are finally moving to be a full fledged web development tools, let me help you.   Things I missed in Opera Dragonfly for Web Development, that I want.   The F12 key to bring up the application, and put it back down, quickly.   The Inspect button in Firebug that allows you to search the screen for an element with your mouse.   Yes, Dragonfly does it with the right click, Inspect Element, but its not the same, or it&#8217;s not fully functional yet.   I&#8217;d like an Aardvark plug-in  type of functionality where I don&#8217;t have to bring up Dragonfly to view the DOM element.  I want to see all the CSS affecting the page with file names, like Web Developer, View CSS, in fact the entire Firefox Web Developer plug-in would be nice.</p>
<p>Keep working!   Your doing great work.  Your web development tools aren&#8217;t quite there yet, but I see you&#8217;re actively working on them, as you get closer and closer, you may win me over for Web Development, you already have for general web browsing.  For those who have not tried Opera, I recommend you try it out, you might like it.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geekgumbo.com/2010/03/05/opera-10-50-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Resizing the background image with CSS</title>
		<link>http://www.geekgumbo.com/2010/03/03/resizing-the-background-image-with-css/</link>
		<comments>http://www.geekgumbo.com/2010/03/03/resizing-the-background-image-with-css/#comments</comments>
		<pubDate>Wed, 03 Mar 2010 19:31:11 +0000</pubDate>
		<dc:creator>dale</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[XHTML]]></category>

		<guid isPermaLink="false">http://www.geekgumbo.com/?p=895</guid>
		<description><![CDATA[With monitor resolutions getting larger and larger, and with the advent of large screen TV&#8217;s that can double as computer monitors, web developers have a dilemma.  What resolution do you use to build a web site that will look good with all these different resolutions?
It use to be that you built web sites for [...]]]></description>
			<content:encoded><![CDATA[<p>With monitor resolutions getting larger and larger, and with the advent of large screen TV&#8217;s that can double as computer monitors, web developers have a dilemma.  What resolution do you use to build a web site that will look good with all these different resolutions?</p>
<p>It use to be that you built web sites for a 800&#215;600 resolution monitor, those days are gone.  Now only about 3% of users have their monitors set at 800&#215;600.  The current sweet spot is 1024&#215;768 with 20% of the viewers using this resolution.  With more and more people moving to 1280&#215;800 at 19% and 1280&#215;1024 at 15%. The resolutions are all over the place.  At this point in time you should optimize your web site design for 1024&#215;768.  That means that those folks that are still using 800&#215;600 will have to scroll to see the screen.</p>
<p>The fact that a significant number of users not only have different resolutions, but most are greater than 1024&#215;768 has led web designers to design sites that stretch their width for different resolutions.  The CSS term for this type of layout is &#8220;liquid layout.&#8221;  The problem with liquid layouts is that if the screen stretches too wide, and text lines get longer and longer, text becomes difficult to read.  The solution for this is the &#8220;jello layout,&#8221; where the expansion of a web page is limited to a maximum width. </p>
<p>One of the solutions to the changing width is to use a consistent background color to surround your main content.  This works and it is the easy way out, the content is set to a maximum width and the background covers whatever width is left.  At higher resolutions though this looks ugly, too much background color.  The solution is to make your background more interesting with a background picture or composite image, and that&#8217;s when you run into some problems.</p>
<p>The traditional way to put a background image on your site is in the CSS file, like so: body {background-image: url(../images/myimage.jpg)}.  The only problem with doing that is that you can&#8217;t re-size the background image in CSS. To do this you have to move the image to your html file.  This allows you to style and re-size your image in the CSS file. </p>
<p>Before we get into how to do this, a word about the background image you will use.  If you expect to stretch the background image in width from one resolution to the next, you want an image that is more landscape oriented than portrait oriented.  The problem with a portrait image is if you stretch the image too much you will distort the picture, landscape images bend easier in width.  You also should scale the image to a size close to the size in width it will be at 1024&#215;768, or 1024px.  You can crop the image if it becomes too long in height. Lastly, you should worry about the image load time or the file size, and consider compressing the image to reduce the file size.</p>
<p>OK, we have the image we want for our background set up and ready to go.  How do we set the background image to re-size with changing resolutions.  First the html structure:</p>
<pre class="brush:php">

<body>
<!-- the background image -->
<div id="backimg">
  <img src="../images/myimage.jpg" alt="Background Image" />
</div>
<div id="bodywrap">
<div id="backdrop">

		<!-- your content -->
</div>
</div>

</body>
</pre>
<p>Nothing unusual here. We are inserting an image into the web page right after the body.  The tricks are in the CSS, let&#8217;s get to that&#8230;</p>
<pre class="brush:php">

* {
	margin: 0;
	padding: 0;
}

body {
	text-align: center;
}

#backimg img {
	position: absolute;
	top: 0;
	left: 0;
	width: 100%;
	z-index: 0;
} 
</pre>
<p>That&#8217;s all there is to it&#8230;well, not quite. This will anchor your image to the upper left corner as a start point. The &#8220;position: absolute;&#8221; takes the image out of other relational groupings with the rest of your web page, and is important to making this work. The width: 100%; tells the browser to stretch the image across the entire monitor window.  Well, get to the z-index in a second.</p>
<p>Well, that&#8217;s all well and good, if you change browser resolutions, you&#8217;ll see the image stretch, depending on your monitor resolution, but how does the content area fit into this set up?  Well, the &#8220;bodywrap&#8221; tags represents the content of your web page. You want that centered in your window with the background image to show on either side of your content.  It would be nice if the content would re-size with the background, and well use the same technique to do just that.  Here&#8217;s the CSS.</p>
<pre class="brush:php">
#bodywrap {
	position:absolute;
	width: 94%;
	margin-left: 3%;
	margin-right: 3%;
	margin-top: 30px;
	z-index: 20;
}
</pre>
<p>This will expand your content with a 3% border for your image to show on the edges.  Use the margin-top: 30px; if you would like to show a piece of the background image at the top of the screen.  If you&#8217;d like to have your content have a white backdrop, we need to add another div.  It would be background image, then backdrop, then bodywrap for your content, here&#8217;s the CSS section for the backdrop, like so&#8230;</p>
<pre class="brush:php">
#backdrop {
	position: absolute;
	background-color: white;
}
</pre>
<p>Here the color of your backdrop is white and we have also taken the backdrop out of the web page components layout, but it is absolutely embedded in the bodywrap.  </p>
<p>Which brings us to the z-index.  The z-index tells the browser which layer to put on top of another layer.  The higher the number, the more that content block is moved to the front of the screen.  Thus our background image is 0 and the bodywrap is in front of that image at a z-index of 20.  </p>
<p>Here&#8217;s the complete CSS file in a compressed format. Enjoy.</p>
<pre class="brush:php">

* {margin: 0; padding: 0; }
body {text-align: center; }
#backimg img {position: absolute; top: 0; left: 0; width: 100%;	z-index: 0; }
#bodywrap {position:absolute; width: 94%; margin-left: 3%; margin-right: 3%; margin-top: 30px; z-index: 20; }
#backdrop {position: absolute; background-color: white; }
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.geekgumbo.com/2010/03/03/resizing-the-background-image-with-css/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The php.ini file &#8211; Configuring Sessions in your Application</title>
		<link>http://www.geekgumbo.com/2010/03/02/php-ini-configuring-sessions-in-your-application/</link>
		<comments>http://www.geekgumbo.com/2010/03/02/php-ini-configuring-sessions-in-your-application/#comments</comments>
		<pubDate>Wed, 03 Mar 2010 02:28:54 +0000</pubDate>
		<dc:creator>dale</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.geekgumbo.com/?p=887</guid>
		<description><![CDATA[I mentioned in the last post that there are over 11 different variables in the php.ini file to use to configure how PHP uses sessions in your application.  I thought a post you could use as a reference to help you configure the session portion of your php.ini file might be helpful.
The first problem you&#8217;ll [...]]]></description>
			<content:encoded><![CDATA[<p>I mentioned in the last post that there are over 11 different variables in the php.ini file to use to configure how PHP uses sessions in your application.  I thought a post you could use as a reference to help you configure the session portion of your php.ini file might be helpful.</p>
<p>The first problem you&#8217;ll encounter though is that there is more than one php.ini file on your computer.  Hmmm&#8230;Which one do you use?  On my windows system, I did a search for all the php.ini files on my computer and came up with 23 php.ini files.  What&#8217;s going on?  As I looked over the list, I realized that most of these came from back ups of my previous development efforts.  Since I use the WAMP local development server on my windows system.  WAMP stands for Windows, Apache, MySQL, and PHP.  I limited my search on those php.ini files in the WAMP directory.  This cut the list down to two, one in the php directory and one in the apache\bin directory.  The reason for two is that the Apache php.ini file should be used when you are getting ready to deploy your system it is used for better performance and security, while the php.ini in the php directory is used during development and allows for more verbose error messages.  Since we want to configure how php handles sessions, and my applications need to deploy properly, I usually just configure the Apache php.ini file.</p>
<p>If you open the php,ini file in a text editor, you&#8217;ll find a text file that has comments, interspersed with variables starting with a semicolon. The semicolons in front of variables means ignore this variable. To make a variable active, you remove the semicolon.</p>
<p>The php.ini file is fairly long.  If you have line numbers turned on in your text editor, the end of the file comes in at about 1885 lines.  Somewhere around line 1435 will start a long list of variable starting with the word &#8220;session.&#8221; , I counted 24 specific session variables, you can configure.   I was off a bit on the number, let&#8217;s go through them.</p>
<p>The default variables, are the ones with no semicolon in front of the variable.  Most of these are standard and do not need to be changed.  For example, the WAMP default save path, stored in &#8220;<strong>session.save_path</strong>&#8221; is where all session files are stored. The default is &#8220;c:\wamp\tmp&#8221;. If you look in that directory, you&#8217;ll see past session files. These are dense text files you can view with a text editor, and this is how session information and session  variables are stored and used from page to page.</p>
<p>&#8220;<strong>session.use_cookies = 1</strong>&#8221; tells php to use cookies to store the session ID, see my previous post for a description of session ID.  If cookies are turned off on a user&#8217;s computer, the session ID is transmitted in the URL, like with a GET form method.  This make the session ID public in the URL.  You can tell php not to do this by setting &#8220;session.use_only_cookies = 1&#8243;  This is the default. Later in the php.ini file you&#8217;ll fine &#8220;<strong>session.use_trans_sid</strong>&#8221; which tells PHP to detect browsers with cookies disabled and use the GET URL.  The default here is also off or 0.</p>
<p>&#8220;<strong>session.auto_start = 0</strong>&#8221; tells php to not to start a session when the<br />
user first accesses the server.  A &#8220;1&#8242; would start a session automatically.  The default is off.  You&#8217;d think you&#8217;d want to start sessions automatically when a user goes to your web site, but I prefer not to autostart sessions, because later when we pass objects you&#8217;ll find that classes need to be defined before you can pass an object in a session.  If you autostart the session, nothing is defined before the session starts, and objects cannot be passed.  This could give you nightmares trying to figure why your application isn&#8217;t working, much more later.</p>
<p>With a lot of these variables, the default is fine.  There are a series of variables used by the setcookie funcion, which let you control the use of the cookie with sessions.  These include <strong>session.cookie_lifetime</strong>, <strong>session.cookie_path</strong>, <strong>session.cookie_domain</strong>, and <strong>session.cookie_httponly</strong>.  You can restrict cookie use to certain domains for example, the default is cookies can be used on all domains.</p>
<p>session.gc_probability, and session.gc_divisor: PHP has garbage collection it uses to clean up sessions that have expired, otherwise on a site with a lot of users accessing the site could cause a huge amount of session files to be continually generated.  The default is fine. Garbage collection does not happen automatically and needs to be incorporated into your system maintenance routines.</p>
<p>This bring us to &#8220;<strong>session.gc_maxlifetime = 1440</strong>&#8220;  This is the lifetime of your session in seconds before the file will be marked for deletion.   PHP cleans out the file as part of its garbage collection.  The default is 24 minutes.  If users are on your site longer selecting items for there shopping cart, for example, you want to make this number larger.</p>
<p>The next series of variables concern with security and using sessions as a global variable, which is bad for the application and security.  These variables,  <strong>session.bug_compat_42</strong>, <strong>session.bug_compat_warn</strong>, <strong>session.referer_check</strong>, <strong>session.entropy_length</strong>, and <strong>session.entropy_file</strong>, change from release to release in PHP as PHP gets more secure, and should not be changed.</p>
<p>Browsers cache web pages to improve performance, for security reasons you want to limit page caching with sessions, since page caching can make your session information public, you want to limit browser page caching on pages with sensitive information.  This is controlled with  &#8220;<strong>session.cache_limiter</strong>&#8221; and &#8220;<strong>session.cache_expire</strong>.&#8221;  I encourage you to use &#8220;nocache&#8221; which is the default, which will turn off page caching on pages with session information.</p>
<p>The last session variables, <strong>&#8220;session.hash_function</strong>, and <strong>session.hash_bits_per_character</strong>&#8221; concern how the session ID is generated.  The defaults settings are already robust, leave them alone.  That&#8217;s about it for configuring sessions in the php.ini file.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geekgumbo.com/2010/03/02/php-ini-configuring-sessions-in-your-application/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Increasing the Joomla 1.5 Search Component character limitation</title>
		<link>http://www.geekgumbo.com/2010/03/01/increasing-the-joomla-search-component-character-limitation/</link>
		<comments>http://www.geekgumbo.com/2010/03/01/increasing-the-joomla-search-component-character-limitation/#comments</comments>
		<pubDate>Mon, 01 Mar 2010 15:50:21 +0000</pubDate>
		<dc:creator>nic</dc:creator>
				<category><![CDATA[Joomla]]></category>

		<guid isPermaLink="false">http://www.geekgumbo.com/?p=852</guid>
		<description><![CDATA[The default character limitation for the native Joomla! Search Module is 20 characters.  Increasing this value requires a bit of Joomla! hacking, and although there are a number of resources for accomplishing this, I could not find any that pertained to the current (or even recent) Joomla 1.5 release.
NOTE:  You should not remove the maxlength [...]]]></description>
			<content:encoded><![CDATA[<p>The default character limitation for the native Joomla! Search Module is 20 characters.  Increasing this value requires a bit of Joomla! hacking, and although there are a number of resources for accomplishing this, I could not find any that pertained to the current (or even recent) Joomla 1.5 release.</p>
<p>NOTE:  You should not remove the maxlength entirely.  As long as search times are non-critical to you, and your database is not enormous, making it 50 or 100 characters should make for a more appealing search interface in most cases.</p>
<p>In order to change the search character limitation to 45, make the following changes:</p>
<p>Note: The &#8221; &#8211; -&#8221;  means delete this, and the &#8220;++&#8221; means to add this back</p>
<p>/modules/mod_search.php</p>
<pre class="brush:php">-- $maxlength		 = $width &gt; 20 ? $width : 20;
++ $maxlength		 = $width &gt; 45 ? $width : 45;
</pre>
<p>/components/com_search/views/search/tmpl/default_form.php</p>
<pre class="brush:php">--
<input id="search_searchword" class="inputbox" maxlength="20" name="searchword" size="30" type="text" value="&lt;?php echo $this-&gt;escape($this-&gt;searchword); ?&gt;" />
++
<input id="search_searchword" class="inputbox" maxlength="45" name="searchword" size="30" type="text" value="&lt;?php echo $this-&gt;escape($this-&gt;searchword); ?&gt;" />
</pre>
<p>/administrator/components/com_search/helpers/search.php</p>
<pre class="brush:php">--    // limit searchword to 20 characters
--    		if ( JString::strlen( $searchword ) &gt; 20 ) {
--   			$searchword 	= JString::substr( $searchword, 0, 20 );
++    // limit searchword to 45 characters
++    		if ( JString::strlen( $searchword ) &gt; 45 ) {
++   			$searchword 	= JString::substr( $searchword, 0, 44 );
</pre>
<p>/language/en-GB/en-GB.com_search.ini</p>
<pre class="brush:php">-- SEARCH_MESSAGE=Search term must be a minimum of 3 characters and a maximum of 20 characters.
++ SEARCH_MESSAGE=Search term must be a minimum of 3 characters and a maximum of 45 characters.
</pre>
<p>There you have it, enjoy!</p>
<p>Thanks to the following:<br />
<a href="http://forum.joomla.org/viewtopic.php?f=41&amp;t=263264">leeburstroghm</a> &#8211; for pointing out that this change requires mods to the admin component in order to function properly on the front-end.</p>
<p><a href="http://www.joomlashack.com/community/index.php?topic=9013.msg32610">m2d^</a> &#8211; for a helpful post that accomplished this update in an older version of Joomla! / the Joomla! Search Component.  It&#8217;s close, but just distinct enough to make things tricky.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geekgumbo.com/2010/03/01/increasing-the-joomla-search-component-character-limitation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ubuntu 10.04 &#8220;Lucid Lynx&#8221; is coming!</title>
		<link>http://www.geekgumbo.com/2010/02/28/ubuntu-10-4-lucid-lynx-is-coming/</link>
		<comments>http://www.geekgumbo.com/2010/02/28/ubuntu-10-4-lucid-lynx-is-coming/#comments</comments>
		<pubDate>Sun, 28 Feb 2010 19:03:31 +0000</pubDate>
		<dc:creator>dale</dc:creator>
				<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://www.geekgumbo.com/?p=863</guid>
		<description><![CDATA[The next release of Ubuntu, version 10.04, &#8220;Lucid Lynx&#8221; is set for April 29, 2010.  The Alpha 3 version is out, and there is much buzz about what to expect from the next release.
This release is set for long term support which offers bug fixes and security patches for three years for desktops and [...]]]></description>
			<content:encoded><![CDATA[<p>The next release of Ubuntu, version 10.04, &#8220;Lucid Lynx&#8221; is set for April 29, 2010.  The Alpha 3 version is out, and there is much buzz about what to expect from the next release.</p>
<p>This release is set for long term support which offers bug fixes and security patches for three years for desktops and five years for servers. Usually the six month Ubuntu releases are supported for only  18 months.</p>
<p>Something that all the Linux distros have struggled with is keeping up with video drivers.  Ubuntu has made a concerted effort to support NIVDIA drivers, even though NIVIDIA keeps its drivers proprietary.    With this release, the <a href="http://nouveau.freedesktop.org/wiki/">Nouveau</a> project  will be the standard NVIDIA project used by Ubuntu.  The Nouveau project specializes in high quality, open source drivers for NIVDIA cards. This is good news for system builders, who are major users of Ubuntu, and favor NIVDIA graphic cards. Currently, Nouveau offers full 2D support for NVIDIA cards. 3D support is not quite there yet, but there working on it.</p>
<p>Along with this, transparency in all areas of the desktop and in  applications will be supported.   GNOME 3 will be available in March, before Lucid Lynx, with additional functionality for the desktop.   What all this means is that those fancy aero screens in Vista and Windows 7 with desktop stunning images now will be possible in the Ubuntu desktop. With Gnome 3 and transparency coming to 10.4, we could be pleasantly surprised with a considerable upgrade in &#8220;eye candy&#8221; for this release.</p>
<p>New applications include easier file sharing between Windows and Ubuntu implemented with Personal File Sharing.   Gwibber will allow for easier social networking by retrieving and combining information from Facebook, Twitter, Flickr, and Digg to name a few social sites.  And there will be  support for Apples  iPhones and iTouch drag and drop in Rythmbox.</p>
<p>Much effort has been put into getting Ubuntu to boot quickly. Ten second boots has been the goal.  This new release will be close to that goal.  Boots from 10-15 seconds have been reported.  That&#8217;s incredible!  We&#8217;re getting closer and closer to &#8220;Instant On.&#8221;   Microsoft, which touted quick booting as a feature of Windows 7, takes twice as long.  A splash screen has been added to start,  so you don&#8217;t have a period of time with nothing on your monitor while booting during that 10 seconds that is.   I&#8217;m still blown away by this kind of boot time, just amazing.</p>
<p>Ubuntu is getting very close to being a better operating system environment for computer hardware and software than Microsoft Windows.  If the public becomes knowledgeable about just how good Ubuntu is, we could see a positive shift in Ubuntu&#8217;s market share.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geekgumbo.com/2010/02/28/ubuntu-10-4-lucid-lynx-is-coming/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The PHP $_SESSION array &#8211; Passing Variables</title>
		<link>http://www.geekgumbo.com/2010/02/27/the-php-_session-variable/</link>
		<comments>http://www.geekgumbo.com/2010/02/27/the-php-_session-variable/#comments</comments>
		<pubDate>Sat, 27 Feb 2010 23:40:54 +0000</pubDate>
		<dc:creator>dale</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.geekgumbo.com/?p=844</guid>
		<description><![CDATA[The problem of storing user information while the user is accessing the web site is solved with sessions in PHP.  Essentially, when the user logs into a web site and enters some information, the server assigns the user a 32 character, random, session ID which uniquely identifies the user.  It stores this ID [...]]]></description>
			<content:encoded><![CDATA[<p>The problem of storing user information while the user is accessing the web site is solved with sessions in PHP.  Essentially, when the user logs into a web site and enters some information, the server assigns the user a 32 character, random, session ID which uniquely identifies the user.  It stores this ID on the users computer as a cookie, along with time-out expiration information.  Any additional sensitive user information, like the quantity, and item number in the shopping cart, or a credit card number is stored on the server, along with that particular user&#8217;s session ID.</p>
<p>I don&#8217;t have enough space in this post to go through all the details on how sessions are configured.  The &#8220;php.ini&#8221; file currently contains 24 different session variables that can be set concerning sessions security, session expiration, where sessions will be stored on the server, what to do if the user disabled his cookies, and whether a session should be started automatically when a user arrives on a site.  I will cover these in more detail in my next post.  Usually the default configuration when you first install PHP is adequate.  For now, let&#8217;s concentrate on using session to store variables between web pages.  </p>
<p>To start a session you call session_start() at the top of the web page file, before anything else.  Since your storing the session ID in a cookie, session_start has to be called before any new line in the web page file, please see my cookies post for an explanation.  When session_start() is called PHP checks to see if a session has already been started, and if it hasn&#8217;t, it will assign that user a session ID and store it in a cookie.  It also sets up a unique global session array on the server, identified by, you guessed it, the session ID.</p>
<p>PHP keeps session variables in a $_SESSION[] array.  This array is available globally, which means it doesn&#8217;t matter which page of the web server application you go to, the information will be available, which is what we want.</p>
<p>To store information in a session that you can use in your application, or specific user information, you do the following:</p>
<pre class="brush:php" >
session_start();
$_SESSION['firstname'] = $fname ;
$_SESSION['lastname'] = $lname ;
$_SESSION['usercity'] = $city ;
$_SESSION['address'] = $addr ; 
</pre>
<p>That&#8217;s it.  You now have firstname, lastname, usercity, and address available to you on any web page in your application.  Notice that the information is stored in an associative $_SESSION array.  To retrieve this information on another page, we do the reverse, at the top of the file, like so:</p>
<pre class="brush:php" >
session_start();
$fname = $_SESSION['firstname'] ;
$lname = $_SESSION['lastname'] ;
$city = $_SESSION['usercity'] ;
$address = $_SESSION['address'] ;
</pre>
<p>We have to start the session again on the page where you want to retrieve the session information.  This will retrieve the session ID from the cookie on the user&#8217;s computer, and using that session ID, connect to the $_SESSION array for that particular user.  </p>
<p>If cookies are disabled the session ID will be retrieved from information in the web URL.  If sensitive user information is being stored, certainly an https encrypted connection should be used to prevent user information from being compromised.  </p>
<p>Session variables are common in web applications, and are used frequently, especially internally, within a web application to pass variables from one page to another. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.geekgumbo.com/2010/02/27/the-php-_session-variable/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Moving inside your Application &#8211; Session Varaibles &#8211; An introduction</title>
		<link>http://www.geekgumbo.com/2010/02/27/moving-inside-your-application-passing-varaibles-an-introduction/</link>
		<comments>http://www.geekgumbo.com/2010/02/27/moving-inside-your-application-passing-varaibles-an-introduction/#comments</comments>
		<pubDate>Sat, 27 Feb 2010 23:34:15 +0000</pubDate>
		<dc:creator>dale</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.geekgumbo.com/?p=840</guid>
		<description><![CDATA[Our focus for this series of postings has been on the problems associated with getting information from one page to another in a stateless, Internet environment, where nothing is saved from one web page to the next.   How do we pass the items you want to purchase from the form submission page to [...]]]></description>
			<content:encoded><![CDATA[<p>Our focus for this series of postings has been on the problems associated with getting information from one page to another in a stateless, Internet environment, where nothing is saved from one web page to the next.   How do we pass the items you want to purchase from the form submission page to the shopping cart web page, for example.</p>
<p>To this point, we&#8217;ve covered passing user generated information to the server with forms using GET and POST, and how to use cookies to store temporary information on the user&#8217;s computer.  These all involved, to some extent, user interaction.  </p>
<p>We now will move on to passing data, variables, around the various files in your web application.  This assumes you&#8217;ve obtained information from the user with a post, or get, or a cookie, or a call to the database, and have assigned that snippet of information to a variable name, like this:</p>
<pre class="brush:php" >

//using the form GET method
$fname = $_GET['firstname'];

// using the form POST method
$lname = $_POST['lastname'];

// using cookie information
$city = $_COOKIE['usercity'];

// using a function to call the information from the database
$addr = getaddr( $username );
</pre>
<p>We&#8217;ll focus on taking variables, in this example: $fname, $lname, $city, or $addr to the next PHP file on the server, you&#8217;ll use to either display the variable, or use the variable in your application.  Since php is a scripting, or interpretive language, when you open up a new file it stands on its own, and any data, or variables you&#8217;ll need, will have to be explicitly passed to that file.  How we do that will be the subject of the next series of posts.</p>
<p>Since most modern languages use object-oriented software, and PHP, is no exception, we will eventually get to passing entire objects to other files and ways to persist objects in your application, but let&#8217;s not get ahead of ourselves, we&#8217;ll start with sessions and passing information with a session variable.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geekgumbo.com/2010/02/27/moving-inside-your-application-passing-varaibles-an-introduction/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Opera and Firefox release new Browser Versions &#8211; a Review</title>
		<link>http://www.geekgumbo.com/2010/02/12/opera-and-firefox-release-new-browser-versions-a-review/</link>
		<comments>http://www.geekgumbo.com/2010/02/12/opera-and-firefox-release-new-browser-versions-a-review/#comments</comments>
		<pubDate>Fri, 12 Feb 2010 22:02:32 +0000</pubDate>
		<dc:creator>dale</dc:creator>
				<category><![CDATA[Browsers]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://www.geekgumbo.com/?p=828</guid>
		<description><![CDATA[Opera has just released version 10.10, today, and Firefox recently released version 3.6.  Currently of the popular browsers, Chrome is the fastest, followed very, very closely by Opera, and Safari, with Firefox coming before Internet Explorer, but way back from the rest. 
Chrome is fast, but the interface is different with its top line [...]]]></description>
			<content:encoded><![CDATA[<p>Opera has just released version 10.10, today, and Firefox recently released version 3.6.  Currently of the popular browsers, Chrome is the fastest, followed very, very closely by Opera, and Safari, with Firefox coming before Internet Explorer, but way back from the rest. </p>
<p><strong>Chrome</strong> is fast, but the interface is different with its top line tabs and Omnibox combined search and browser address window. It takes getting use to, and I have not been using it, because it was not stable initially. </p>
<p><strong>Internet Explorer</strong> is way behind in browser compatibility and speed, and is an after thought in my mind.  When and if Microsoft ever gets up to W3C standards, decides to use web standards for determining box widths instead of their proprietary method, and passes the ACID3 test, I might consider it, but not before.</p>
<p><strong>Safari</strong> is fast, and it looks nice, but they do this by pumping up the luminance or gamma of their colors from all the other web browser colors, so the browser colors look sharper.  Unfortunately, I can&#8217;t use their colors system for development when I&#8217;m building for all browsers.  I&#8217;ll leave the Safari browser to Mac Users.</p>
<p>Which brings us to Firefox and Opera.  I use <strong>Firefox</strong> about 70% of the time, mostly because of its web development plugin tools.  There are three plugins I recommend for web development: Aardvark, Firebug, and Web Developer.  I use all three.  This makes Firefox unique as no other browser has these tools. Consequently, it is my web development browser of choice.  Yes it loads slow as molasses, but everything runs fine once its up.  I had to wait until the Aardvark plugin was ready, but now I&#8217;m up and running on 3.6. </p>
<p>What&#8217;s with 3.6? Firefox claims speed improvements in page loads, and it looks like this is true, it&#8217;s much faster loading both pages and booting, but still doesn&#8217;t seem up to the other fast browsers.  Last release Firefox reached a 93 on the Acid 3 test, but rather jerkily.  It now reaches 94 smoothly, still not 100.  You now have type ahead in the address bar, which they call the &#8220;Awesome Bar.&#8221; Just start typing the site name and possible sites are gradually filtered to give you the correct URL. This is a rip off of the Chrome Omnibox, but there search capability is limited compared to Chrome.  You now have one click bookmarks by clicking the star in the &#8220;Awesome Bar&#8221; window, and there are bookmark tags, like Delicious. Type a tag in the &#8220;Awesome Bar&#8221; and all your tagged items URL populate. This does not yet synchronize with your other Firefox browsers.  They now have a Private Browsing option you can toggle. I&#8217;m skeptical of this, as Google keeps a complete record of all your browsing and your searches in its database. For looks, they have 35,000 personas which changes the look of the browser, to me this is just fluff.  </p>
<p>And now to my favorite browser, <strong>Opera</strong> with its new 10.10 release. Opera is fast, and looks great. Only about 2% of the population uses it, so there is very little problem with malware, or virus attacks. It&#8217;s safe, secure, meets W3C standards, and passes ACID 3 quickly with flying colors. It&#8217;s a great browser.  If it had the Internet tools of Firefox, I&#8217;d never look back and use Opera full time.  </p>
<p>With Version 10.10 Opera claims five things that you can only do in Opera: Application sharing of data with others, compress web pages to load pages faster for people with slow data connections, visual tabs where you see a thumbnail of the web page, in addition to the text tag of the tab like in other browsers; customize your web page thumbnails in the speed dial window, synchronize your tabs, bookmarks, and other data with your other Opera browsers over the Internet.  This is like Delicious in its synchronizing. Opera also has integrated themes for looks, and an integrated Opera mail program, although I admit, I prefer Thunderbird at the moment.</p>
<p>If you&#8217;re a die-hard Firefox user, you&#8217;ll like the improved Firefox speed and tags with the  Awesome bar.  If your not into web development, I highly recommend you download Opera and give it a test drive, check out the speed, convenient surfing tools, and overall good looks.  Change the appearance in tools->appearance, drag the tag bar down to see the visual tabs, and enjoy Opera.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geekgumbo.com/2010/02/12/opera-and-firefox-release-new-browser-versions-a-review/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
